mirror of
https://github.com/MrUnknownDE/VRCX.git
synced 2026-04-24 09:13:50 +02:00
303 lines
8.3 KiB
JavaScript
303 lines
8.3 KiB
JavaScript
let echarts = null;
|
||
|
||
const _utils = {
|
||
removeFromArray(array, item) {
|
||
var { length } = array;
|
||
for (var i = 0; i < length; ++i) {
|
||
if (array[i] === item) {
|
||
array.splice(i, 1);
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
},
|
||
arraysMatch(a, b) {
|
||
if (!Array.isArray(a) || !Array.isArray(b)) {
|
||
return false;
|
||
}
|
||
return (
|
||
a.length === b.length &&
|
||
a.every(
|
||
(element, index) =>
|
||
JSON.stringify(element) === JSON.stringify(b[index])
|
||
)
|
||
);
|
||
},
|
||
moveArrayItem(array, fromIndex, toIndex) {
|
||
if (!Array.isArray(array) || fromIndex === toIndex) {
|
||
return;
|
||
}
|
||
if (fromIndex < 0 || fromIndex >= array.length) {
|
||
return;
|
||
}
|
||
if (toIndex < 0 || toIndex >= array.length) {
|
||
return;
|
||
}
|
||
const item = array[fromIndex];
|
||
array.splice(fromIndex, 1);
|
||
array.splice(toIndex, 0, item);
|
||
},
|
||
escapeTag(tag) {
|
||
var s = String(tag);
|
||
return s.replace(/["&'<>]/g, (c) => `&#${c.charCodeAt(0)};`);
|
||
},
|
||
escapeTagRecursive(obj) {
|
||
if (typeof obj === 'string') {
|
||
return this.escapeTag(obj);
|
||
}
|
||
if (typeof obj === 'object') {
|
||
for (var key in obj) {
|
||
obj[key] = this.escapeTagRecursive(obj[key]);
|
||
}
|
||
}
|
||
return obj;
|
||
},
|
||
timeToText(sec, isNeedSeconds = false) {
|
||
let n = Number(sec);
|
||
if (isNaN(n)) {
|
||
return this.escapeTag(sec);
|
||
}
|
||
n = Math.floor(n / 1000);
|
||
const arr = [];
|
||
if (n < 0) {
|
||
n = -n;
|
||
}
|
||
if (n >= 86400) {
|
||
arr.push(`${Math.floor(n / 86400)}d`);
|
||
n %= 86400;
|
||
}
|
||
if (n >= 3600) {
|
||
arr.push(`${Math.floor(n / 3600)}h`);
|
||
n %= 3600;
|
||
}
|
||
if (n >= 60) {
|
||
arr.push(`${Math.floor(n / 60)}m`);
|
||
n %= 60;
|
||
}
|
||
if (isNeedSeconds || (arr.length === 0 && n < 60)) {
|
||
arr.push(`${n}s`);
|
||
}
|
||
return arr.join(' ');
|
||
},
|
||
textToHex(text) {
|
||
var s = String(text);
|
||
return s
|
||
.split('')
|
||
.map((c) => c.charCodeAt(0).toString(16))
|
||
.join(' ');
|
||
},
|
||
commaNumber(num) {
|
||
if (!num) {
|
||
return '0';
|
||
}
|
||
var s = String(Number(num));
|
||
return s.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,');
|
||
},
|
||
buildTreeData(json) {
|
||
var node = [];
|
||
for (var key in json) {
|
||
if (key[0] === '$') {
|
||
continue;
|
||
}
|
||
var value = json[key];
|
||
if (Array.isArray(value) && value.length === 0) {
|
||
node.push({
|
||
key,
|
||
value: '[]'
|
||
});
|
||
} else if (
|
||
value === Object(value) &&
|
||
Object.keys(value).length === 0
|
||
) {
|
||
node.push({
|
||
key,
|
||
value: '{}'
|
||
});
|
||
} else if (Array.isArray(value)) {
|
||
node.push({
|
||
children: value.map((val, idx) => {
|
||
if (val === Object(val)) {
|
||
return {
|
||
children: this.buildTreeData(val),
|
||
key: idx
|
||
};
|
||
}
|
||
return {
|
||
key: idx,
|
||
value: val
|
||
};
|
||
}),
|
||
key
|
||
});
|
||
} else if (value === Object(value)) {
|
||
node.push({
|
||
children: this.buildTreeData(value),
|
||
key
|
||
});
|
||
} else {
|
||
node.push({
|
||
key,
|
||
value: String(value)
|
||
});
|
||
}
|
||
}
|
||
node.sort(function (a, b) {
|
||
var A = String(a.key).toUpperCase();
|
||
var B = String(b.key).toUpperCase();
|
||
if (A < B) {
|
||
return -1;
|
||
}
|
||
if (A > B) {
|
||
return 1;
|
||
}
|
||
return 0;
|
||
});
|
||
return node;
|
||
},
|
||
// descending
|
||
compareByCreatedAt(a, b) {
|
||
if (
|
||
typeof a.created_at !== 'string' ||
|
||
typeof b.created_at !== 'string'
|
||
) {
|
||
return 0;
|
||
}
|
||
var A = a.created_at.toUpperCase();
|
||
var B = b.created_at.toUpperCase();
|
||
if (A < B) {
|
||
return 1;
|
||
}
|
||
if (A > B) {
|
||
return -1;
|
||
}
|
||
return 0;
|
||
},
|
||
// lazy load echarts
|
||
loadEcharts() {
|
||
if (echarts) {
|
||
return Promise.resolve(echarts);
|
||
}
|
||
return import('echarts').then((module) => {
|
||
echarts = module;
|
||
return echarts;
|
||
});
|
||
},
|
||
// CJK character in Japanese, Korean, Chinese are different
|
||
// so change font-family order when users change language to display CJK character correctly
|
||
changeCJKorder(lang) {
|
||
const otherFonts = window
|
||
.getComputedStyle(document.body)
|
||
.fontFamily.split(',')
|
||
.filter((item) => !item.includes('Noto Sans'))
|
||
.join(', ');
|
||
const notoSans = 'Noto Sans';
|
||
|
||
const fontFamilies = {
|
||
ja_JP: ['JP', 'KR', 'TC', 'SC'],
|
||
ko: ['KR', 'JP', 'TC', 'SC'],
|
||
zh_TW: ['TC', 'JP', 'KR', 'SC'],
|
||
zh_CN: ['SC', 'JP', 'KR', 'TC']
|
||
};
|
||
|
||
if (fontFamilies[lang]) {
|
||
const CJKFamily = fontFamilies[lang]
|
||
.map((item) => `${notoSans} ${item}`)
|
||
.join(', ');
|
||
document.body.style.fontFamily = `${CJKFamily}, ${otherFonts}`;
|
||
}
|
||
},
|
||
localeIncludes(str, search, comparer) {
|
||
// These checks are stolen from https://stackoverflow.com/a/69623589/11030436
|
||
if (search === '') {
|
||
return true;
|
||
} else if (!str || !search) {
|
||
return false;
|
||
}
|
||
const strObj = String(str);
|
||
const searchObj = String(search);
|
||
|
||
if (strObj.length === 0) {
|
||
return false;
|
||
}
|
||
|
||
if (searchObj.length > strObj.length) {
|
||
return false;
|
||
}
|
||
|
||
// Now simply loop through each substring and compare them
|
||
for (let i = 0; i < str.length - searchObj.length + 1; i++) {
|
||
const substr = strObj.substring(i, i + searchObj.length);
|
||
if (comparer.compare(substr, searchObj) === 0) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
},
|
||
compareByName(a, b) {
|
||
if (typeof a.name !== 'string' || typeof b.name !== 'string') {
|
||
return 0;
|
||
}
|
||
return a.name.localeCompare(b.name);
|
||
},
|
||
replaceBioSymbols(text) {
|
||
if (!text) {
|
||
return '';
|
||
}
|
||
var symbolList = {
|
||
'@': '@',
|
||
'#': '#',
|
||
$: '$',
|
||
'%': '%',
|
||
'&': '&',
|
||
'=': '=',
|
||
'+': '+',
|
||
'/': '⁄',
|
||
'\\': '\',
|
||
';': ';',
|
||
':': '˸',
|
||
',': '‚',
|
||
'?': '?',
|
||
'!': 'ǃ',
|
||
'"': '"',
|
||
'<': '≺',
|
||
'>': '≻',
|
||
'.': '․',
|
||
'^': '^',
|
||
'{': '{',
|
||
'}': '}',
|
||
'[': '[',
|
||
']': ']',
|
||
'(': '(',
|
||
')': ')',
|
||
'|': '|',
|
||
'*': '∗'
|
||
};
|
||
var newText = text;
|
||
for (var key in symbolList) {
|
||
var regex = new RegExp(symbolList[key], 'g');
|
||
newText = newText.replace(regex, key);
|
||
}
|
||
return newText.replace(/ {1,}/g, ' ').trimRight();
|
||
},
|
||
// descending
|
||
compareByUpdatedAt(a, b) {
|
||
if (
|
||
typeof a.updated_at !== 'string' ||
|
||
typeof b.updated_at !== 'string'
|
||
) {
|
||
return 0;
|
||
}
|
||
var A = a.updated_at.toUpperCase();
|
||
var B = b.updated_at.toUpperCase();
|
||
if (A < B) {
|
||
return 1;
|
||
}
|
||
if (A > B) {
|
||
return -1;
|
||
}
|
||
return 0;
|
||
}
|
||
};
|
||
|
||
export default _utils;
|