Created
October 22, 2025 01:30
-
-
Save sebilasse/38e26767a6637fb68d34524609695d98 to your computer and use it in GitHub Desktop.
further local infos for IntlToActivityPub
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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