Skip to content

Instantly share code, notes, and snippets.

@sebilasse
Created October 22, 2025 01:30
Show Gist options
  • Save sebilasse/38e26767a6637fb68d34524609695d98 to your computer and use it in GitHub Desktop.
Save sebilasse/38e26767a6637fb68d34524609695d98 to your computer and use it in GitHub Desktop.
further local infos for IntlToActivityPub
// languages which Intl does not support have an own module not covered here, set customExtended = {}:
import { customExtended } from './optionalExtended.ts';
const op = (w) => w.replace(/^[(]/, '(?:');
const rd = (fn) => (r, w, i, a) => (i > 19 ? [...r, w, ...a.slice(1, 10).map((w1) => fn(w, w1))] : [...r, w]);
const r = (a, mapFn) => new RegExp(`\\b(?:${(mapFn ? a.map(mapFn) : a).join('\\b|')})`, 'gi');
const esPt = [
'(nullo?|zero)', '(uno|uma?)', '(doi?s|duas)', '(tr[eê]s)', '([qc]uatro)', '(cinco)', '(seis)', '(si?ete)',
'(ocho|oito)', '(nueve|nove)', '(di?ez)', '(once)', '(doce)', '(tre[cz]e)', '(cator[cz]e)',
'(quin[cz]e)', '(dieciséis|dezesseis|dezasseis)', '(diecisiete|dezessete|dezassete)',
'(dieciocho|dezoito)', '(diecinueve|dezenove|dezanove)', '(ve?inte)', '(tre?inta)'
]
const esPtO = [
'(nullo?|zero)', '(primeir[oa])', '(second[oa]|segund[oa])', '(terz[oa]|terceir[oa])', '(quart[oa])', '(quint[oa])',
'(se[sx]t[oa])', '(s[eé]tt?im[oa])', '(o[it]tav[oa])', '(non[oa])', '(d[eé]cim[oa])',
'(und[eé]cim[oa]|décimo primeir[oa])', '(duo?d[eé]cim[oa]|décimo segund[oa])',
'(tred[eé]cim[oa]|décimo terceir[oa])', '(quattordicesim[oa]|décimo quart[oa])',
'(quindicesim[oa]|décimo quint[oa])', '(sedicesim[oa]|décimo sext[oa])',
'(diciassettesim[oa]|décimo sétim[oa])', '(diciottesim[oa]|décimo oitav[oa])',
'(diciannovesim[oa]|décimo non[oa])'
];
const cardinal = {
en: [
'(null|zero)', '(a|one)', '(two)', '(three)', '(four)', '(fi(?:ve|f))', '(six)', '(seven)',
'(eight)', '(nine?)', '(ten)', '(eleven)', '(twelve)', '(thirteen)', '(fourteen)', '(fifteen)',
'(sixteen)', '(seventeen)', '(eighteen)', '(nineteen)', '(twent(?:y|ie))', '(thirt(?:y|ie))'
],
de: [
'(null)', '((?:ais|ein)(?:em|en|er|s|e)?)', '(zwei|zwai|zwo)', '(drei|drüü|dry)', '(vier|viär)',
'(fünf|fuenf|foif)', '(sechs|sech)', '(sieben|sibe)', '(acht|achter)', '(neun|nüün)', '(zehn|zä)',
'(elf|elve?)', '(zwölf|zwoelf)', '(dreizehn|drüüzä)', '(vierzehn|viärzä)', '(fünfzehn|foifzä)',
'(sechs?zehn|sechszä)', '(siebzehn|sibezä)', '(achtzehn|achtzä)', '(neunzehn|nüünzä)',
'(zwanzigs?|zwänzgs?)', '(drei(?:ss|ß)igs?|dryssgs?)'
],
fr: [
'(null?|z[eéè]ro|zénith)', '(une?)', '(deux)', '(trois)', '(quatre)', '(cinq)', '(six)', '(sept)',
'(huit)', '(neuf)', '(dix)', '(onze)', '(douze)', '(treize)', '(quatorze)', '(quinze)',
'(seize)', '(dix-sept)', '(dix-huit)', '(dix-neuf)', '(vingt(?: |$))', '(trente(?: |$))'
],
it: [
'(null?|z[eéè]ro)', '(uno?)', '(due)', '(tre)', '(quattro)', '(cinque)', '(sei)', '(sette)',
'(otto)', '(nove)', '(dieci)', '(undici)', '(dodici)', '(tredici)', '(quattordici)', '(quindici)',
'(sedici)', '(diciassette)', '(diciotto)', '(diciannove)', '(venti)', '(trente)'
],
es: esPt,
pt: esPt,
ru: [
'(ноль|нуль|зеро)', '(один|o-din)', '(два|двое|dva)', '(три|tri)', '(четыре|che-TY-rye)',
"(пять|pyat')", "(шесть|shest')", "(семь|sem')", "(восемь|vo-sem')",
"(девять|dye-vyat')", "(десять|dye-syat')", "(одиннадцать|o-di-NA-tsy-t')",
"(двенадцать|dve-NA-tsy-t')", "(тринадцать|tri-NA-tsy-t')", "(четырнадцать|che-TYR-na-tsy-t')",
"(пятнадцать|pyat-NA-tsy-t')", "(шестнадцать|shes-NA-tsy-t')", "(семнадцать|sem-NA-tsy-t')",
"(восемнадцать|vo-sim-NA-tsy-t')", "(девятнадцать|dye-vyat-NA-tsy-t)", "(двадцать|dvád-tsat')",
"(тридцать|trí-d-tsat')"
],
ja: [
'(零|rei|zero)', '(一|ichi)', '(二|ni)', '(三|san)', '(四|yon|shi)', '(五|go)', '(六|roku)',
'(七|nana|shichi)', '(八|hachi)', '(九|kyuu|ku)', '(十|juu)', '(十一)', '(十二)', '(十三)', '(十四)',
'(十五)', '(十六)', '(十七)', '(十八)', '(十九)', '(二十)', '(二一)', '(二二)', '(二三)', '(二四)',
'(二五)', '(二六)', '(二七)', '(二八)', '(二九)', '(三十)', '(三一)'
],
ko: [
'(0)', '(하나|hana)', '(둘|dul)', '(셋|set)', '(넷|net)', '(다섯|daseot)', '(여섯|yeoseot)', '(일곱|ilgop)',
'(여덟|yeodeol)', '(아홉|ahop)', '(열|yeol)', '(열하나|yeol-hana)', '(열둘|yeol-dul)', '(열셋|yeol-set)',
'(열넷|yeol-net)', '(열다섯|yeol-daseot)', '(열여섯|yeol-yeoseot)', '(열일곱|yeol-ilgop)',
'(열여덟|yeol-yeodeol)', '(열아홉|yeol-ahop)', '(스물|seumul)', '(스물한)', '(스물두)', '(스물셋)',
'(스물넷)', '(스물다섯)', '(스물여섯)', '(스물일곱)', '(스물열넷)', '(스물다섯)', '(스물여섯)',
'(서른|seoreun)', '(서른하나|삼십일)'
],
zh: [
'(〇|零|líng)', '(一|壹)', '(二|貳)', '(三|叁)', '(四|肆)', '(五|伍)', '(六|陸)', '(七|柒)', '(八|捌)', '(九|玖)',
'(十|拾)', '(十一|拾壹)', '(十二|拾貳)', '(十三|拾叁)', '(十四|拾肆)', '(十五|拾伍)', '(十六|拾陸)',
'(十七|拾柒)', '(十八|拾捌)', '(十九|拾玖)', '(二十|貳拾|廿)', '(二十一|貳拾壹)', '(二十二|貳拾貳)',
'(二十三|貳拾叁)', '(二十四|貳拾肆)', '(二十五|貳拾伍)', '(二十六|貳拾陸)', '(二十七|貳拾柒)',
'(二十八|貳拾捌)', '(二十九|貳拾玖)', '(三十|叁拾|卅)', '(三十一|叁拾壹)'
]
};
const ordinal = {
it: [
'(null|zero)', '(primo)', '(secondo)', '(terzo)', '(quarto)', '(quinto)', '(sesto)', '(settimo)', '(ottavo)',
'(nono)', '(decimo)', '(undicesimo)', '(dodicesimo)', '(tredicesimo)', '(quattordicesimo)',
'(quindicesimo)', '(sedicesimo)', '(diciassettesimo)', '(diciottesimo)', '(diciannovesimo)',
'(ventesimo)', '(ventunesimo)', '(ventiduesimo)', '(ventitreesimo)', '(ventiquattresimo)',
'(venticinquesimo)', '(ventiseiesimo)', '(ventisettesimo)', '(ventottesimo)','(ventinovesimo)',
'(trentesimo)', '(trentunesimo)'
],
es: [...esPtO, ...[
'esimo', 'unesimo', 'iduesimo', 'itreesimo', 'iquattresimo',
'icinquesimo', 'iseiesimo', 'isettesimo', 'ottesimo', 'inovesimo'
].map((s) => `(vent${s})`), 'trentesimo', 'trentunesimo'
],
pt: [...esPtO, 'vigésimo',
...esPtO.slice(1,10).map((s) => `(vigésimo ${s.slice(1)}`), 'trigésimo', 'trigésimo primeiro'
],
ru: [
'(ноль|нуль|зеро)', '(пе́рвый|pervyj)', '(второ́й|vtoroj)', '(тре́тий|tretij)', '(четвёртый|četvërtyj)',
"(пя́тый|pjat'yj)", '(шесто́й|šestoj)', "(седьмо́й|sed'moj)", "(восьмо́й|vos'moj)",
'(девя́тый|devjatyj)', '(деся́тый|desjatyj)', '(оди́ннадцатый|odinnadcatyj)', '(двена́дцатый|dvenadcatyj)',
'(трина́дцатый|trinadcatyj)', '(четы́рнадцатый|četyrnadcatyj)', '(пятна́дцатый|pjatnadcatyj)',
'(шестна́дцатый|šestnadcatyj)', '(семна́дцатый|semnadcatyj)', '(восемна́дцатый|vosemnadcatyj)',
'(девятна́дцатый|devjatnadcatyj)', '(двадца́тый|dvadcatyj)', "(два́дцать пе́рвый|dvadcat' pervyj)",
"(два́дцать второ́й|dvadcat' vtoroj)", "(два́дцать тре́тий|dvadcat' tretij)",
"(два́дцать четвёртый|dvadcat' četvërtyj)", "(два́дцать пя́тый|dvadcat' pjatyj)",
"(два́дцать шесто́й|dvadcat' šestoj)", "(два́дцать седьмо́й|dvadcat' sed'moj)",
"(два́дцать восьмо́й|dvadcat' vos'emoj)", "(два́дцать девя́тый|dvadcat' devjatyj)", '(тридцатый|тридцатилетний)', '(тридцать первый)'
],
ja: [
'(ゼロ|第0)', '(一つ目|hitotsume|一番目|ichibanme|第1)', '(二つ目|futatsume|二番目|nibanme|第2)',
'(三番目|sanbanme|三つ目|mittsume|第3)', '(四番目|yonbanme|四つ目|yottsume|第4)',
'(五番目|gobanme|五つ目|itsutsume|第5)', '(六番目|rokubanme|六つ目|muttsume|第6)',
'(七番目|nanabanme|七つ目|nanatsume|第7)', '(八番目|hachibanme|八つ目|yattsume|第8)',
'(九番目|kyūbanme|九つ目|kokonotsume|第9)', '(十番目|jūbanme|第10)', '(十一番目|jū ichi banme|第11)',
'(十二番目|jū ni banme|第12)', '(十三番目|jū san banme|第13)', '(十四番目|jū yon banme|第14)',
'(十五番目|jū go banme|第15)', '(十六番目|jū roku banme|第16)', '(十七番目|jū nana banme|第17)',
'(十八番目|jū hachi banme|第18)', '(十九番目|jū kyū banme|第19)', '(二十番目|ni-jū banme|第20)',
'(二十一|二十一番目|21番目の?)', '(二十二番目の?|22番目)', '(二十三番目の?|23番目)',
'(二十四番目の?||24番目の?)', '(二十五番目の?|25番目の?)', '(二十六番目の?|26番目の?)',
'(二十七番目の?|27番目の?)', '(二十八番目の?|28番目の?)', '(二十九番目の?|29番目の?)', '(三十番目|san-jū banme|第30)',
'(三十一番目の?|31番目の?)'
],
zh: [
'(〇|零|líng)', '(第一)', '(第二)', '(第三)', '(第四)', '(第五)', '(第六)', '(第七)', '(第八)',
'(第九)', '(第十)', '(第十一)', '(第十二)', '(第十三)', '(第十四)', '(第十五)', '(第十六)', '(第十七)',
'(第十八)', '(第十九)', '(第二十)', '(第二十一)', '(第二十二)', '(第二十三)', '(第二十四)', '(第二十五)',
'(第二十六)', '(第二十七)', '(第二十八)', '(第二十九)', '(第三十)', '(第三十一)'
]
}
const wdEachStd = { weekdayEachSuffix: 's' }
const en = {
timeShift: '(recently|not long ago|(?:just )?(?:a )moments? ago)|(currently|n(?:ow)?)|'+
'(soon|right|in a second|in a minute|shortly)|(afterwards|later)',
dayShift: '((?:the day )?before yes[.]?(?:terday)?)|(yes[.]?terday)|(t[.]?od[.]?ay)|(tom[.]?orrow)|'+
'((?:the day )?after tom[.]?(?:orrow)?)',
// morning, forenoon, noon, afternoon, evening, night, midnight
// _8, _10, _12, _15, _19, _22, _0 */
dayPeriodCasual: '(?:(?:at\\b)|(?:in (?:the)?\\b))?\\s?(?:mornings?|early(?: day)?)|'+
'((?:(?:at\\b)|(?:in (?:the)?\\b))?\\s?late morning|mid-morning|forenoon)|'+
'((?:at )?noon|meridie|lunch(?: break)?|[sS]iesta)|((?:(?:at\\b)|(?:in (?:the)?\\b))?\\s?afternoons?)|'+
'((?:(?:at\\b)|(?:in (?:the)?\\b))?\\s?evenings?)|(nights?)|((?:at )?midnight)',
// daily, nightly, weekly, biweekly, monthly, bimonthly, yearly, annual, biannual
cadence: '(daily)|(nightly)|(weekly)|(biweekly)|(monthly)|(bimonthly)|(quarterly|by quarter)'+
'(yearly|annual)|(bi(?:yearly|annual))',
within: '\\bin|of\\b', each: '\\b(?:at )?(?:each|every|any)|(?:always(?: at)?)\\b', to: '\\bto|until|till?\\b',
or: '\\b(?:else|or|along with)( also)?\\b', and: '\\b(?:plus|in addition to|as well as|together with|and)( also)?\\b',
past: '\\b(?:[pl]ast|prev(?:ious)?)s?\\b', next: '\\bnext?s?\\b',
few: '\\ba few(?: of)?|few', couple: '\\ba couple(?: of)?|couple|some', several: '\\bseveral|more',
add: '\\b\\+|from|hence|aft(?:er)?\\b', substract: '\\b\\-|ago|bef(?:ore)?\\b',
half: '\\bhalf(?: to)?\\b', addHalf: '\\bhalf past|and(?: a)? half\\b',
yearBC: '\\s?(?:(?:b[.]?\\s?efore?(?:[cd]| [cd]))|bce|ce)[.]?',
yearAD: '\\s?(?:(?:a[.]?\\s?nno?(?:d| d))|anno(?: domini)?)[.]?',
timeMSubAdd: "(?:at\\s)?((?:\\d\\d?)|[a-züßö]{3,16})\\s?(?:mn[.]?|min(?:[.]?ute)?s?\\s)?(?:(to)|(past))\\s?"+
"((?:\\d\\d?)|[a-z]{3,6})(?: o['‘]clock| of the clock| oh| h[.]?)?",
timeQuarterPrefix: '(?<add15>(?:a\\s)?quarter past)|(?<sub15>(?:a\\s)?quarter to)|'+
'(?<add30>(?:a\\s)?half past)|(?<sub30>(?:a\\s)?half to)',
concatTime: "(?:\\s?(?:o['‘]clock|of the clock|oh|and|h[.]?))",
concatPrefix: '\\b\\W?\\s?(?:at|o[fhn]|the|in)\\s?\\b',
cardinal: cardinal.en.reduce(rd((w, w1) => `(${op(w)}[-]?${op(w1)})`), []), ...wdEachStd
};
const ptEs = {
timeShift: '(reci?entemente|(?:há|hace)? pou?co(?: tiempo)?|(?:há|hace)? un (?:rato|momento))|'+
'(a[gh]ora|(?:en este |no |neste )?(?:momento|instante)|ac?tualmente)|'+
'(enseguida|pronto|inmediatamente|em breve)|(después|depois|más tarde)',
dayShift: '(ante(?:ayer|ontem))|(ayer|ontem)|(ho[jy]e)|(mañana|amanhã)|((?:pasado|depois de) mañana|amanhã)',
dayPeriodCasual: '(mañanas|manhãs)|((?:(?:pela |de )manhã)|por la mañana)|(med?io[-]?(?:d[ií]as?))|'+
'((?:à |por la )?tardes?)|(por la tarde|ao fim da tarde|por la noche|à tardinha)|'+
'((?:[aà] )última hora|muy de noche|(?:[aà] )?noites?|noches?)|(med?ia[-]?(?:noite|noche))',
cadence: '(diari(?:o|amente))|(noc?turn(?:o|amente))|(semanal(?:o|amente))|(quin[cz]enal(?:o|amente))|'+
'(mensu?al(?:o|amente))|(bimensu?al(?:o|amente))|(trimestral(?:mente)?)|(anual(?:o|amente))|(bianual(?:o|amente)|semestralmente)',
within: '\\be[nm]\\b', each: '\\btodos l?[ao]s|cadas?|si?empre(?: l?[ao]s)?\\b', to: '\\baté|hasta(?: el)?\\b',
or: '\\bou?\\b', and: '\\bplus|[ye]\\b',
past: '\\bpasad[ao]|anterior|últim[ao]\\b', next: '\\bpróxim[ao]\\b',
few: '\\bpou?c[ao]s?|men[ao]s?', couple: '\\bun[ao]s|alg[uú][mn]a?s', several: '\\bv[aá]ri[ao]s|divers[ao]s?',
add: '\\b\\+|después|após|a partir\\b', substract: '\\b\\-|(?:desde )?hace|há|desde\\b',
half: '\\bmed?io\\b', addHalf: '\\b1[/]2|[ye] med?io\\b',
yearBC: '\\s?(?:antes de Cristo|a[.]C[.]|ante christum)',
yearAD: '\\s?(?:después de Cristo|d[.]C[.]|anno(?: domini)?)',
/*timeMSubAdd: "(?:at\\s)?((?:\\d\\d?)|[a-züßö]{3,16})\\s?(?:mn[.]?|min(?:[.]?ute)?s?\\s)?(?:(to)|(past))\\s?"+
"((?:\\d\\d?)|[a-z]{3,6})(?: o['‘]clock| of the clock| oh| h[.]?)?",
um 20 vor drei = a las tres menos veinte
The Spanish language also has an established convention for days of the week using one letter.
These are: L – lunes (Monday); M – martes (Tuesday); X – miércoles (Wednesday);
J – jueves (Thursday); V – viernes (Friday), S – sábado (Saturday); and D – domingo (Sunday).
*/
timeQuarterSuffix: '(?<add15>(?:[ey]) (?:um )?[cq]uarto)|(?<sub15>menos (?:um )?[cq]uarto)|'+
'(?<add30>[ey] med?ia)|(?<sub30>menos med?ia)',
concatTime: "(?:\\s?(?:[ey]|horas|(?:en )?punto|h[.]?))",
concatPrefix: '\\b\\W?\\s?(?:des?|e[lmn]|[aà]s?||l[ao]s?)\\s?\\b',
}
const CASUAL = {
keys: [
'timeShift','dayShift','dayPeriodCasual','cadence','within','to','or','and',
/*'each','few','couple','several','half','addHalf','yearBC','yearAD'*/
],
en: {
monthDigit: { sept: 8 },
regex: {}
},
de: {
monthDigit: { 'jänner': 0, janner: 0, feber: 1, maerz: 2, mrz: 2, sept: 8 },
unit: { y: 'J', d: 'T'},
regex: {}
},
r: {
// TODO not
// this diese?[mnrs] esta...
// cardinalSuffix = 'th|nd|rd|er?|te|-?й|ro|do|[.˚]';
en,
de: {
timeShift: '(kürzlich|neulich|unlängst|vorhin|(?:gerade |so)?eben)|(jetzt|momentan|i[nm] (?:diesem )?Moment)|'+
'(gleich|bald|sofort|in Kürze|umgehend)|(nachher|später)',
dayShift: '(vorgestern)|(ges[.]?tern)|(heute?|heuer|heit|hüt)|(morgen?|moin|moorn)|((?:ü|ue)ber(?:morgen?|moin|moorn))',
// morning, forenoon, noon, afternoon, evening, night, midnight
dayPeriodCasual: '((?:(?:am )?(Morgen|morgendlich))|(vormittags?)|'+
'(Mittag|mittäglich|meridie|(?:zur )?Mittagszeit|(?:in der )?Mittagspause|[sS]iesta)|([nN]achmittags?)|((?:am )?Abends?)|'+
'((?:in der )?Nachts?|nächtlich)|((?:um |zur? )?Mitternacht|Geisterstunde))',
// daily, nightly, weekly, biweekly, monthly, bimonthly, quaterly, yearly, annual, biannual
cadence: '(täglich)|(nächtlich)|(wöchentlich)|((?:(?:2|zwei)[-]?wöchentlich)|alle (?:2|zwei) Wochen)|'+
'(monatlich|jeden Monat)|((?:(?:2|zwei)[-]?monatlich)|alle (?:2|zwei) Monate)|(quartalsweise|jedes Quartal)|'+
'(jährlich|jedes Jahr)|((?:(?:2|zwei)[-]?jährlich)|alle (?:2|zwei) Jahre)',
within: '\\bi[nm]\\b', each: '\\b(?:an )?(?:jede[mnrs]?)|(?:immer(?: a[mn])?)\\b', to: '\\bbis( zum?)?\\b',
or: '\\boder\\b', and: '\\b(?:plus|und|als auch)\\b',
past: '\\b(?:letzte[mnrs]?)|(?:vorige[mnrs]?)\\b', next: '\\bnächste[mnrs]?\\b',
few: '\\bwenig(?:e(?:[mnrs])?)', couple: '\\beinig(?:e(?:[mnrs])?)', several: '\\b(?:ein paar)|mehrer(?:e(?:[mnrs])?)',
add: '\\b\\+|nach|in|ab jetzt\\b', substract: '\\b\\-|(?:(zu)?vor)|seit\\b',
half: '\\b(?:hoib|halb)(?:e(?:[mnrs])?)\\b', addHalf: '\\b1[/]2|einhalb|(?:th?alb)\\b',
yearBC: '\\s?(?:(?:vor|(?:v|a)[.]?)\\s(?:Ch?r?[.]?(?:istus)?)|ante christum)',
yearAD: '\\s?(?:(?:nach|n[.]?)\\s(?:Ch?r?[.]?(?:istus)?)|anno(?: domini)?)',
timeMSubAdd: '(?:um\\s)?((?:,\\d,\\d?)|[a-züßö]{4,16}),\\s?(?:mn[.]?|(?:min[.]?(?:ute)?n?),\\s)?'+
'(?:(vor)|(nach))\\s?((?:,\\d,\\d?)|[a-zöü]{4,6})(?: ?uhr)?',
timeQuarterPrefix: '(?<add15>viertel(?: nach))|(?<sub15>viertel vor|dreiviertel)|'+
'(?<add30>(?:hoib|halb) nach)|(?<sub30>hoib|halb)',
concatTime: '(\\s?(?:uhr|h[.]?)?(?: und)?\\s?)',
concatPrefix: '\\b\\W?\\s?(?:am|an|ab|um|den|der|des|i[nm])\\s?\\b',
cardinal: cardinal.de.reduce(rd((w, w1) => `(${op(w1)}und${op(w)})`), []), ...wdEachStd
},
fr: { // TODO past next can be suffix
timeShift: '(récemment|il y a peu|tout à l\'heure)|(maintenant|en (?:ce )?moment|cette moment|actuellement|immédiament)|'+
'(tout à l\'heure|bientôt|tout (?:de )?suite)|(après|plus tard)',
dayShift: '(avant-hier)|(hier)|(aujourd\'hui)|(demain)|(après-demain)',
dayPeriodCasual: '(matins)|(matinées)|(midis)|(après-midis)|(soirs)|(nuits)|(minuit)',
cadence: '(quotidien)|(nocturne)|(hebdomadaire)|(bihebdomadaire)|(mensuel)|(bimensuel)|(trimestriel)|(annuel)|(biannuel)',
within: '\\bà|en\\b', each: '\\bchaque|toujours(?: l[ae])?\\b', to: '\\bjusqu\'à|jusqu\'en|jusque\\b',
or: '\\bou\\b', and: '\\bet\\b',
past: '\\bdernier|dernière\\b', next: '\\bprochaine?|précédente?\\b',
few: '\\bpeu|quelques?|moins?(?: de)?', couple: '\\bun couple', several: '\\bplusieurs?|plus de',
add: '\\b\\+|après|à partir de maintenant\\b', substract: '\\b\\-|il y a|depuis\\b',
half: '\\bdemi[-]\\b', addHalf: '\\b1[/]2|(?:et )?demie\\b',
yearBC: '\\s?(?:avant Jésus[- ]?(?:Christ)?|ante christum)',
yearAD: '\\s?(?:après Jésus[- ]?(?:Christ)?|anno(?: domini)?)',
/* timeMSubAdd: "", um 20 vor drei = à trois heures moins vingt */
timeQuarterSuffix: '(?<add15>et quart)|(?<sub15>moins (?:le )?quart)|(?<add30>et demie)|(?<sub30>moins (?:le )?demie)',
concatTime: "(?:\\s?(?:heures?|et|h[.]?))",
concatPrefix: '\\b\\W?\\s?(?:dans|des|l[ae]s?|[ei][nm])\\s?\\b',
//(?: |$)
cardinal: cardinal.fr.reduce(rd((w, w1) => { return `(${op(w.replace('(?: |$)', ''))}[- ](?:et[- ])?${op(w1)})`}), []),
...wdEachStd
},
es: {
...ptEs, cardinal: cardinal.es.reduce(rd((w, w1) => `(${op(w1)}(?: [ye] )?\\s?${op(w)})`), []), ...wdEachStd
},
pt: {
...ptEs, cardinal: cardinal.pt.reduce(rd((w, w1) => `(${op(w1)}(?: [ye] )?\\s?${op(w)})`), []), ...wdEachStd
},
it: {
// (?:un )?quarto)|? (?:un )?quarto)|?<sub15>
timeShift: '(recentemente|di recente|poco(?: tempo)? fa|proprio ora)|(ora|al momento|in questo momento)|'+
'(tra poco|presto|subito)|(dopo|più tardi)',
dayShift: '((?:l\')?altro ieri)|(ieri)|(oggi)|(domani|dmn[.]?)|(dopodomani)',
dayPeriodCasual: '(mattine)|(mattinate)|(mezzogiorni)|(pomeriggi)|(sere)|(notti)|(mezzanotte)',
cadence: '(giornaliero)|(notturno)|(settimanale)|(bisettimanale)|(mensile)|(bimestrale)|(trimestrale)|'+
'(annuale)|(biennale|semestrale)',
within: '\\ba|in\\b', each: '\\bogni|sempre(?: la)\\b', to: '\\bfino(?: a)?\\b',
or: '\\bo\\b', and: '\\bplus|e\\b',
past: '\\bscors[ao]|(?:l\')?ultimo|precedente\\b', next: '\\bprossim[ao]\\b',
few: '\\bpoch[ei]|poc[ao]', couple: '\\bqualche|alcune', several: '\\bdivers[eio]|alcuni',
add: '\\b\\+|dopo|da adesso\\b', substract: '\\b\\-|[fd]a\\b',
half: '\\bmezzo\\b', addHalf: '\\b1[/]2|e mezzo\\b',
yearBC: '\\s?(?:prima(?: di) Cristo|a[.]C[.]|ante christum)',
yearAD: '\\s?(?:dopo(?: di) Cristo|d[.]C[.]|anno(?: domini)?)',
/* timeMSubAdd: "", um 20 vor drei = alle due meno venti */
timeQuarterSuffix: '(?<add15>(?:e )?(?:un )?quarto)|(?<sub15>meno (?:un )?quarto)|'+
'(?<add30>(?:e )? mezza)|(?<sub30>meno mezza)',
concatTime: "(?:\\s?(?:in punto|e|h[.]?))",
concatPrefix: '\\b\\W?\\s?(?:e[lmn]|tra||d[ao]s?|al?)\\s?\\b',
cardinal: cardinal.it.reduce(rd((w, w1) => `(${op(w1)}\\s?${op(w)})`), []), ...wdEachStd
},
ru: {
timeShift: '(недавно|только что)|(сейчас|(?:в данный |в этот )?момент)|(сразу|скоро|немедленно)|(после|позже)',
dayShift: '(позавчера)|(вчера)|(сегодня)|(завтра)|(послезавтра)',
dayPeriodCasual: '(утром)|(до полудня)|(в полдень)|(днем)|(вечером)|(ночью)|(полночь)',
cadence: '(ежедневно)|(ежедневно)|(еженедельно)|(два раза в неделю)|'+
'(ежемесячно)|(два раза в месяц)|(ежеквартально)|(ежегодно)|(два раза в год)',
within: '\\bв\\b', each: '\\bкаждый|каждое|каждую|всегда по\\b', to: '\\bдо\\b',
or: '\\bили\\b', and: '\\bplus|и\\b',
past: '\\bпрошлую|прошлый|последнее\\b', next: '\\bследующий|следующую\\b',
few: '\\bнесколько|меньшее|немного', couple: '\\bнекоторое', several: '\\bнескольких',
add: '\\b\\+|через|с этого момента\\b', substract: '\\b\\-|назад\\b',
half: '\\bполовине|полдня|полгода\\b', addHalf: '\\b1[/]2|с половиной\\b',
/* timeMSubAdd: "", um 20 vor drei = за 20 минут до трех */
timeQuarterPrefix: '(?<add15>четверть)|(?<sub15>четверть до)|(?<add30>до пол)|(?<sub30>пол)',
concatTime: "(?:\\s?(?:в|за|до|часа|h[.]?))",
concatPrefix: '\\b\\W?\\s?(?:в|i[nm])\\s?\\b',
cardinal: cardinal.ru.reduce(rd((w, w1) => `(${op(w)}[-]?${op(w1)})`), []), ...wdEachStd
},
// TODO :
ja: {
...en,
timeShift: '(最近|つい先日|ついさっき|さっき|ちょうど今)|(今|現在|この瞬間)|(すぐに|まもなく|すぐに)|(後で|後ほど)',
dayShift: '(一昨日|一昨日の前日)|(昨日|きのう)|(本日|今日|ほんじつ|きょう)|(明日|あした)|(あさって|明後日)',
dayPeriodCasual: '(朝)|(午前中)|(昼)|(午後)|(夕方)|(夜)|(真夜中)',
cadence: '(毎日)|(毎晩)|(毎週)|(隔週)|(毎月)|(隔月)|(四半期ごと)|(毎年)|(半年ごと)',
cardinal: cardinal.ja, ...wdEachStd
},
ko: {
...en,
timeShift: '(최근에|얼마 전에|얼마 전|방금 전에|방금)|(지금|현재|이 순간)|(곧|곧바로|즉시)|(나중에|나중)',
dayShift: '(그저께|엊그제)|(어제)|(오늘)|(내일)|(모레)',
dayPeriodCasual: '(아침)|(오전)|(점심)|(오후)|(저녁)|(밤)|(한밤중)',
cadence: '(매일)|(매일 밤)|(매주)|(격주)|(매월)|(2개월마다)|(분기별)|(매년)|(반년마다)',
cardinal: cardinal.ko, ...wdEachStd
},
zh: {
...en,
cardinal: cardinal.zh, ...wdEachStd
}
},
fn: {
}
};
/*
ja
こんや|今夜 Heute Abend
けさ|今朝 Heute Morgen
zh
if (text == "今夜" || text == "今夕" || text == "今晩") {
components.imply("hour", 22);
components.assign("meridiem", Meridiem.PM);
} else if (text.match("今朝")) {
components.imply("hour", 6);
components.assign("meridiem", Meridiem.AM);
}
const PATTERN =
/(?:(?:([同今本])|((昭和|平成|令和)?([0-90-9]{1,4}|元)))年\s*)?([0-90-9]{1,2})月\s*([0-90-9]{1,2})日/i;
const SPECIAL_YEAR_GROUP = 1;
const TYPICAL_YEAR_GROUP = 2;
const ERA_GROUP = 3;
const YEAR_NUMBER_GROUP = 4;
const MONTH_GROUP = 5;
const DAY_GROUP = 6;
*/
// TODO ordinal
const [enO, deS, frO, koO] = [
{1: '(first|1st)', 2: '(second|2nd)', 3: '(third|3rd)'},
`(?:[mnrs])?)`,
{1: '(premier|première?)', 2: '(deuxième|seconde)', 4: '(quartième)' },
{1: '(첫 번째|cheot beonjjae)', 2: '(두 번째|du beonjjae)', 3: '(세 번째|se beonjjae)'}
];
/** */
const baseKeys = ['monthDigit', 'unit', 'regex'];
for (const l in CASUAL.r) {
if (!CASUAL[l]) { CASUAL[l] = {regex: {}}; }
//CASUAL[l].regex.cardinal = r(CASUAL.r[l].cardinal);
}
/*
for (const l in cardinal) {
if (!CASUAL[l]) { CASUAL[l] = {regex: {}}; }
baseKeys.forEach((k) => { if (!CASUAL[l][k]) { CASUAL[l][k] = {}; } });
CASUAL[l].regex.cardinal = r(cardinal[l]);
}
*/
// ordinals …
CASUAL.en.regex.ordinal = r(cardinal.en, (s,i) => (enO[i] || `(${(i>20&&i<24)
? `${op(cardinal.en[20])}[-]?${op(enO[i-20])}`
: (i>30&&i<34 ? `${op(cardinal.en[30])}[-]?${op(enO[i-30])}` : op(s+'th'))}|${i}th)`));
CASUAL.de.regex.ordinal = r(cardinal.de, (s,i) => (i===1
? `(erste${deS}`
: `((?:${(i>9 ? s : s.replace('drei|','drit|').replace('sieben|','siebe?n?|')).slice(1)}te${deS}`));
CASUAL.fr.regex.ordinal = r(cardinal.fr, (s,i) => (frO[i] ||
`${s.replace(/f$/, 'v').replace(/e$/, '').replace(/^vingt/, 'ving?t')+'ième'}`));
CASUAL.ko.regex.ordinal = r(cardinal.ko, (s,i) =>
(koO[i] || `(${s.replace(/[()]/g, '').split('|').map((s2) => `${s2}번째`).join('|')})`));
/* Sino-Korean :
Alternatively, for more formal or written contexts, the prefix 제 (je) is used with Sino-Korean numbers (e.g., 제 일 장 for "Chapter 1").
*/
CASUAL.it.regex.ordinal = r(ordinal.it);
CASUAL.pt.regex.ordinal = r(ordinal.pt);
CASUAL.es.regex.ordinal = r(ordinal.es);
CASUAL.ru.regex.ordinal = r(ordinal.ru);
CASUAL.ja.regex.ordinal = r(ordinal.ja);
CASUAL.zh.regex.ordinal = r(ordinal.zh);
for (const l in CASUAL) {
if (CASUAL[l]?.regex?.ordinal) { CASUAL.r[l].ordinal = CASUAL[l].regex.ordinal.source; }
}
export const dateCasual = CASUAL;
//console.log(CASUAL.r.fr.cardinal, CASUAL.r.fr.ordinal);
/*console.log(CASUAL.de.regex.ordinal);*/
/*
export const extend = {
en: {
regexPattern: {
time: /((?:(?:at|from)\s)?(2[0-3]|[01][0-9]|[0-9]\b)(?:\s?(?:o['‘]clock|of the clock|oh|h[.]?))(?: and)?\s?([0-5][0-9]|[0-9]\b)(?: (?:mn[.]?|min(?:[.]?ute)?s?)(?: and)?\s?)?([0-5][0-9]|[0-9]\b)?(?:\s(?:sec[.]?(?:ond)?s?))?\s?(?:o['‘]clock|of the clock|oh|h[.]?)?|(?:(?:(?:at|from)\s)(2[0-3]|[01][0-9]|[0-9]\b)[.,:]?\s?([0-5][0-9]|[0-9]\b)?(?:\s?(?:o['‘]clock|of the clock|oh|h[.]?)?)))/i,
timeMSubAdd: /(?:at\s)?((?:\d\d?)|[a-züßö]{3,16})\s?(?:mn[.]?|min(?:[.]?ute)?s?\s)?(?:(to)|(past))\s?((?:\d\d?)|[a-z]{3,6})(?: o['‘]clock| of the clock| oh| h[.]?)?/i,
timeHalfSubAdd: /(?:at\s)?half(?:( to )|( past ))((?:\d\d?)|[a-z]{3,6})(?: o['‘]clock| of the clock| oh| h[.]?)?/i,
timeQSub: /(?:at\s)?(a\s)?quarter to ((?:\d\d?)|[a-z]{3,6})/i, timeQAdd: /(?:at\s)?(a\s)?quarter past ((?:\d\d?)|[a-z]{3,6})/i,
// _8, _10, _12, _15, _19, _22, _0
dayPeriodExt: /\b((?:(?:at\b)|(?:in (?:the)?\b))?\s?(mornings?|early day)|(late morning|forenoon)|(noon|meridie|lunch(?: break)?|[sS]iesta)|(afternoons?)|(evenings?)|(night|nightly)|(midnight))/
// cadence the daily / nightly / weekly / biweekly / monthly / bimonthly / yearly / annual / biannual... event / festival / fair / party...
// alternate
// The abbreviation QOD or QAD (from Latin mean Quaque Alternis Die") means 'every other day' or 'every two days'.
}
},
//
de: { // Todo: vor 2 Wochen = 2 Wochen vorher/zuvor
regexPattern: {
time: /((?:(?:um|ab)\s)?(2[0-3]|[01][0-9]|[0-9]\b)(?:\s?(?:uhr|h[.]?)(?: und)?\s?)?([0-5][0-9]|[0-9]\b)(?: (?:mn[.]?|(?:min[.]?(?:ute)?n?))?)?(?: und )?([0-5][0-9]|[0-9]\b)?(?:\s(?:sek[.]?(?:unde)?n?))?|(?:(?:(?:um|ab)\s)(2[0-3]|[01][0-9]|[0-9]\b)[.,:]?\s?([0-5][0-9]|[0-9]\b)?(?:\s?(?:uhr|h[.]?)?)))/i,
timeMSubAdd: /(?:um\s)?((?:\d\d?)|[a-züßö]{4,16})\s?(?:mn[.]?|(?:min[.]?(?:ute)?n?)\s)?(?:(vor)|(nach))\s?((?:\d\d?)|[a-zöü]{4,6})(?: ?uhr)?/i,
timeHalfSubAdd: /(?:um\s)?(?:hoib|halb)(?:( )|( nach ))((?:\d\d?)|[a-zöü]{4,6})/i,
timeQSub: /(?:um\s)?viertel vor ((?:\d\d?)|[a-zöü]{4,6})/i,
timeQAdd: /(?:um\s)?(?:(?:viertel nach )|(?:drei)?viertel )((?:\d\d?)|[a-zöü]{4,6})/i,
dayPeriodExt: /((?:am )?(Morgen|morgendlich)|(Vormittag|vormittags)|(Mittag|mittäglich|meridie|(?:zur )?Mittagszeit|(?:in der )?Mittagspause|[sS]iesta)|([nN]achmittags?)|(Abend)|((?:in der )?Nacht|nächtlich)|((?:um |zur? )?Mitternacht|Geisterstunde))/
}
}
}
*/
// TODO optional:
//for (const k in customExtended) { customExtended[k] = {...base[k], ...customExtended[k]}; }
export const custom = { ...customExtended };
// <-- optional
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment