mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-18 22:33:26 +08:00
* style: add eslint-unicorn * style: fix unicorn/no-useless-spread * style: fix unicorn/no-useless-promise-resolve-reject * style: fix unicorn/no-for-loop * fix: codeql bad HTML filtering regexp * fix: codeql incomplete replace * fix: unicorn/no-abusive-eslint-disable * style: fix unicorn/no-new-array * style: fix unicorn/no-typeof-undefined * style: fix unicorn/no-zero-fractions * style: fix unicorn/no-empty-file * style: fix unicorn/prefer-date-now * revert: auto fix unicorn/prefer-switch on lib/v2/kuaidi100/utils.js * style: fix unicorn/prefer-array-find * style: fix unicorn/prefer-array-flat * style: fix unicorn/prefer-array-flat-map * style: fix unicorn/prefer-at * style: fix unicorn/prefer-string-starts-ends-with * style: fix unicorn/prefer-includes * fix: codeql URL substring sanitization * style: fix unicorn/prefer-optional-catch-binding * style: fix unicorn/catch-error-name * style: fix unicorn/escape-case * style: fix unicorn/prefer-native-coercion-functions * style: fix unicorn/prefer-regexp-test * style: fix unicorn/require-array-join-separator * style: fix unicorn/prefer-math-trunc * style: fix unicorn/prefer-negative-index * style: fix unicorn/prefer-dom-node-dataset * style: fix unicorn/prefer-dom-node-text-content * style: fix unicorn/prefer-query-selector * style: fix unicorn/no-array-for-each * style: fix unicorn/no-negated-condition * style: fix unicorn/prefer-add-event-listener * style: fix unicorn/import-style * style: fix prefer-regex-literals * style: disable unicorn/no-useless-switch-case * style: disable unicorn/text-encoding-identifier-case * style: fix unicorn/prefer-set-has * style: fix unicorn/prefer-spread * revert: auto fix on lib/routes/universities/ynnu/edu/base64.js * style: fix unicorn/no-useless-undefined * style: fix unicorn/no-array-push-push * style: fix unicorn/no-useless-undefined again * style: fix unicorn/no-lonely-if * style: fix unicorn/prefer-reflect-apply * style: fix unicorn/switch-case-braces * style: fix unicorn/prefer-switch * style: fix unicorn/prefer-array-some * fix: deepscan UNUSED_VAR_ASSIGN * style: fix unicorn/prefer-ternary * fix: follow-up of unicorn/prefer-ternary * revert: auto fix of unicorn/prefer-string-slice for substring() * style: disable unicorn/prefer-string-slice fix: auto fix slice over deprecated substr * style: fix unicorn/throw-new-error * style: fix unicorn/filename-case * test: fix dateParser renaming * style: fix unicorn/better-regex * style: fix unicorn/prefer-string-replace-all * fix(deps): add sanitize-html * style: fix no-prototype-builtins * style: fix unicorn/consistent-destructuring * style: fix unicorn/consistent-function-scoping * style: fix unicorn/prefer-regexp-test * style: fix unicorn/prefer-logical-operator-over-ternary * style: fix unicorn/no-array-callback-reference * style: add prefer-object-has-own * style: warn unicorn/no-empty-file * style: fix unicorn/prefer-number-properties * style: fix no-useless-undefined again * style: fix unicorn/numeric-separators-style * style: disable unicorn/no-array-callback-reference false postive with cheerio
87 lines
2.9 KiB
JavaScript
87 lines
2.9 KiB
JavaScript
const date = require('./date');
|
||
const dayjs = require('dayjs');
|
||
const customParseFormat = require('dayjs/plugin/customParseFormat');
|
||
const logger = require('./logger');
|
||
const utc = require('dayjs/plugin/utc');
|
||
dayjs.extend(utc);
|
||
dayjs.extend(customParseFormat);
|
||
|
||
/**
|
||
* Convert unconventional i8n to the one supported by dayjs https://bit.ly/2psVwIJ
|
||
* @param {String} x i8n string
|
||
*/
|
||
const i8nconv = (x) => {
|
||
const c = {
|
||
'zh-hans': 'zh-cn',
|
||
'zh-chs': 'zh-cn',
|
||
'zh-sg': 'zh-cn',
|
||
'zh-hant': 'zh-hk',
|
||
'zh-cht': 'zh-hk',
|
||
'zh-mo': 'zh-hk',
|
||
};
|
||
for (const prop in c) {
|
||
if (RegExp(`^${prop}$`, 'i').test(x)) {
|
||
x = c[prop];
|
||
break;
|
||
}
|
||
}
|
||
return x;
|
||
};
|
||
|
||
/**
|
||
* A function to convert a string of time based on specified format
|
||
* @param {string} [html] A string of time to convert.
|
||
* @param {string} [customFormat=undefined] Format to parse html by dayjs.
|
||
* @param {string} [lang=en] Language (must be supported by dayjs).
|
||
* @param {int} [htmlOffset=0] UTC offset of html. It will be neglected if html contains timezone indicated by strings like "+0800".
|
||
*/
|
||
const tStringParser = (html, customFormat, lang = 'en', htmlOffset = 0) => {
|
||
lang = i8nconv(lang);
|
||
|
||
// Remove weekdays and comma from the string
|
||
// dayjs v1.8.16 is not able to parse weekdays
|
||
// https://github.com/iamkun/dayjs/blob/dev/docs/en/Plugin.md#list-of-all-available-format-tokens
|
||
// We don't remove weekdayMini since the month may contains weekdayMini, like "六" in "六月"
|
||
let removeStr = [];
|
||
if (lang !== 'en') {
|
||
try {
|
||
require(`dayjs/locale/${lang}`);
|
||
if (lang.startsWith('zh')) {
|
||
removeStr = [...removeStr, ','];
|
||
}
|
||
// Add locale
|
||
dayjs.locale(lang);
|
||
} catch {
|
||
logger.error(`Locale "${lang}" passed to dateParser is not supported by dayjs`);
|
||
return date(html);
|
||
}
|
||
}
|
||
for (const k of Object.values(dayjs.Ls)) {
|
||
for (const x of ['weekdays', 'weekdaysShort']) {
|
||
if (Object.hasOwn(k, x)) {
|
||
const a = k[x].map((z) => z);
|
||
// eslint-disable-next-line unicorn/prefer-spread
|
||
removeStr = removeStr.concat(...a);
|
||
}
|
||
}
|
||
}
|
||
removeStr = [...removeStr, ',', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
|
||
let htmlP = html;
|
||
for (const x of removeStr) {
|
||
// Order matters
|
||
htmlP = htmlP.replace(RegExp(x, 'gi'), '');
|
||
}
|
||
|
||
const d = dayjs.utc(htmlP, customFormat);
|
||
// console.log(htmlP,d)
|
||
if (d.isValid()) {
|
||
return /[+-](\d{2}:?\d{2})/.test(html) ? d.toDate().toUTCString() : d.add(htmlOffset, 'h').toDate().toUTCString();
|
||
} else {
|
||
return date(html);
|
||
}
|
||
};
|
||
|
||
tStringParser.i8nconv = i8nconv;
|
||
|
||
module.exports = tStringParser;
|