beygla
Version:
<h1 align="center"> Beygla </h1>
258 lines (250 loc) • 21 kB
JavaScript
;
const NO_DECLENSION = "0;,,,";
const NO_DECLENSION_MARKER = "~";
const isChar = (c) => c === "-" || c.toLowerCase() !== c.toUpperCase();
const validTerminator = (c) => ["!", "_"].indexOf(c) !== -1;
function deserializeTrie(str) {
let i = 0;
const char = () => str.substr(i, 1);
const next = () => i++;
function deserializeLeaf() {
function returnValue(c, value) {
if (!validTerminator(c))
throw new Error("INV_TER: " + c);
return [{ value, children: {} }, c === "!"];
}
const firstChar = char();
if (firstChar === NO_DECLENSION_MARKER) {
next(); // Move beyond terminator
return returnValue(firstChar, NO_DECLENSION);
}
const parts = [];
for (let i = 0;; i++) {
let part = "";
let c = char();
while (isChar(c)) {
part += c;
next();
c = char();
}
// 'c' is terminator or separator
parts.push(part);
next(); // Move beyond terminator or separator
if (i === 3) {
return returnValue(c, parts.join(","));
}
// 'c' should be terminator
if (c !== ",")
throw new Error("INV_SEP: " + c);
}
}
function deserializeKey() {
let key = "";
let c = char();
while (isChar(c)) {
key += c;
next();
c = char();
}
if (c !== ":")
throw new Error("INV_COL: " + c);
next(); // Move past ':' to value
return key;
}
function deserializeObject() {
next(); // Move to first property
const children = {};
while (true) {
const key = deserializeKey();
const [child, done] = deserialize();
children[key] = child;
if (!done)
continue;
const c = char(); // Should be terminator
next(); // Move past terminator
if (!validTerminator(c))
throw new Error("INV_TER: " + c);
return [{ value: "", children }, c === "!"];
}
}
function deserialize() {
const c = char();
if (c === "{") {
return deserializeObject();
}
return deserializeLeaf();
}
return deserialize()[0];
}
function extractDeclension(trie, name) {
let node = trie;
for (const char of name.split("").reverse()) {
const next = node.children[char];
if (next) {
if (next.value) {
// We've reached a leaf node, return the value
return next.value;
}
// Non-leaf node. Keep traversing the trie
node = next;
continue;
}
// If there is no next node for the current character, and the
// current node is not a leaf node, we are either:
//
// 1. at a dead end
// 2. the next node is a "union leaf node"
//
// If 'node.children' looks like so:
//
// {
// abc: { ... },
// d: { ... },
// }
//
// Then 'abc' is an example of a union leaf node. If 'char' is
// one of the characters that comprises the key, then the union
// leaf node contains the value we're looking for.
//
for (const key of Object.keys(node.children)) {
for (let i = 0; i < key.length; i++) {
if (key.substr(i, 1) === char) {
return node.children[key].value;
}
}
}
// We are at a dead end.
break;
}
return null;
}
var serializedInput = "{l:{e:{s:{u:{dfgjklrstð:,,i,s_n:,,jum,ja!_adglrs:,,i,s!_S:,,i,s!_l:{ó:{h:{r:{a:{t:{f:l,,,s_su:l,,i,s!_ð:{a:{gt:l,,i,s_n:l,,,s!_iíú:l,,i,s_r:l,,,s!_dgjlní:l,,i,s_p:l,,,s!_eiuÁáóö:l,,i,s!_g:{ru:l,,,s_n:l,,i,s!_d:{n:{aó:l,,i,s_i:l,,,s!_dl:l,,i,s!_a:{n:l,,,s_lrð:l,,i,s!_k:{iy:l,,i,s_s:l,,,s!_ð:{iou:l,,i,s_ó:l,,,s!_n:{ó:{G:l,,,s_N:l,,i,s!_aefnxyæí:l,,i,s_u:l,,,s!_i:{np:l,,i,s_l:ihóll,ahól,ahóli,ahóls!_u:{dl:l,,,s_jsð:l,,i,s!_l:{e:{M:l,,i,s_S:l,,,s!!_fpstxáóý:l,,i,s_b:l,,,s!_H:l,,i,s!_o:{v:{h:{s:{or:l,,i,s_f:l,,,s!_airu:l,,,s!_H:l,,,s!!_ö:{j:öll,öll,öllum,alla_HhÞ:öll,öll,öll,allar!_a:{Hfj:,,i,s_ð:all,al,li,als!_e:,,i,s_u:ull,ul,li,uls_áí:l,,,s_i:ill,il,li,ils_æ:l,,i,s!_x:{ö:öxl,öxl,öxl,axlar_Ö:Öxl,Öxl,Öxl,Axlar!_fgiuó:,,i,s_sáæ:,,,ar!_t:{u:{a:{r:{b:{a:{l:{elæóú:,,,ar_k:abraut,ubraut,ubraut,ubrautar!_dgjkmnprstvxðó:,,,ar!_giklnrsuáæð:,,,ar!_B:,,,ar!_Ll:,,,ar!!_o:{kr:,,i,s_K:,,um,a!_l:{o:,,i,s_u:,,,ar!_t:{é:{t:{s:{rsu:,,,ar_a:angastétt,öngustétt,öngustétt,öngustéttar!!_r:,,,ar!_ó:,,,ar!_s:{u:{a:{n:{a:{n:,,um,a_m:,,,ar!_r:,,,ar!_N:,,i,s!!_ö:öst,öst,öst,astar_i:,,,ar!_ó:{m:{a:{dj:,,i,s_gr:,,um,a!_r:,,i,s!_Bb:,,,ar_j:,,i,s!_i:{f:{a:angafit,öngufit,öngufit,öngufitjar_r:,,,jar!_F:,,,jar_e:,,,ar!_f:{l:,,,ar_o:,,um,a!_ö:öt,öt,öt,atar_e:,,i,s_k:,,,ar!_r:{u:{l:{l:{ö:{v:{i:{ð:ivöllur,avöll,avelli,avallar_r:öllur,öll,elli,allar!_agrstð:öllur,öll,elli,allar!_V:öllur,öll,elli,allar!_ei:ur,ur,um,na_ao:ur,,i,s!_a:{d:{i:{g:{n:{E:ur,,,s_a:idalur,adal,adal,adals!!_r:{gó:idalur,adal,adal,adals_m:ur,,,s!_knvð:ur,,,s_lmptó:idalur,adal,adal,adals_ý:idalur,jadal,jadal,jadals!_afgklmnrstuyð:ur,,,s!_D:ur,,,s!_e:{m:{i:{knð:ur,,,s_á:imelur,amel,amel,amels!_aru:ur,,,s!_M:ur,,,s!_y:ur,,,s_ö:jölur,jöl,ili,jalar_kú:ur,ur,um,na!_d:{n:{u:{l:{i:{klnpð:ur,,i,ar_r:ilundur,alund,alundi,alundar!_arsuáæ:ur,,i,ar!_L:ur,,i,ar!_a:{s:{arsuð:ur,,i,s_i:isandur,asand,asandi,asands!_Sr:ur,,i,s!_i:{r:ur,ur,um,a_Tt:ur,,i,s!!_l:{e:{f:ur,,i,ar_K:ur,ur,um,na!_ö:jöldur,jöld,ildi,jaldar!!_k:{æ:{l:{i:{ð:{i:{e:{r:ilækur,alæk,alæk,alækjar_V:ur,,,jar!!_u:ilækur,alæk,alæk,alækjar_í:ur,,,jar!_mnpr:ilækur,alæk,alæk,alækjar_k:ur,,,jar!_adrsuy:ur,,,jar!_L:ur,,,jar!_a:{dflnrsð:ur,ur,ri,urs_b:ur,,,s!_k:{e:{t:{s:{i:{n:{r:istekkur,astekk,astekk,astekkjar_y:ur,,,jar!_r:ur,,,jar!_agrstuó:ur,,,jar!_S:ur,,,jar!_r:ur,ur,um,na_b:ur,,,jar!_a:ur,,,s_ö:ökkur,ökk,ekki,akkar!_ú:{DHjn:ur,,,s_l:ur,ur,um,a!_ó:{r:{k:{asu:ur,,,s_r:ur,,i,s!_K:ur,,,s!!_A:ur,ur,ri,urs_ns:ur,,i,s_u:ur,,,s_í:ur,ur,um,a!_g:{n:{a:{pr:ur,,i,s_v:ur,,,s!_i:{r:{B:ur,ur,um,na_H:ur,,,s!_nt:ur,,i,s!_æ:ur,,i,s_e:ur,,,s_u:ur,ur,um,na!_i:{e:{t:{i:{knð:ur,,,s_r:iteigur,ateig,ateig,ateigs!_afglnrsuáð:ur,,,s!_v:ur,,,s_T:ur,,i,s!_V:,,,s!_u:{a:{Hbh:ur,,,s_B:ur,,i,s!_Bb:ur,,i,s!_ó:{k:{s:{almrsuð:ur,,i,ar_i:iskógur,askóg,askógi,askógar!_S:ur,,i,ar!!_o:{v:{arstu:ur,,i,s_i:ivogur,avog,avogi,avogs!_V:ur,,i,s!_e:ur,,i,ar_lrí:ur,,,s_Öö:ur,ur,ri,urs_g:ur,,,jar!_n:{n:ur,,i,s_ð:ur,ur,um,a!_ð:{r:{a:{g:{i:{ln:igarður,agarð,agarði,agarðs_k:ur,,i,s!_aflmnrstéð:ur,,i,s!_G:ur,,i,s!_ö:{j:jörður,jörð,irði,jarðar_V:örður,örð,erði,arðar!_o:{N:,,,_p:ur,,i,s!!_a:{t:{s:{ailrsu:ur,,,ar_p:ikaupstaður,akaupstað,akaupstað,akaupstaðar!_S:ur,,,ar!!_i:{v:ur,,,ar_e:ur,ur,ri,urs_r:ur,ur,um,na!_ú:ur,,,s_ó:ur,ur,ri,urs_u:,,,!_t:{t:{e:{l:{k:{i:{k:ur,,i,s_t:iklettur,aklett,akletti,akletts!_aru:ur,,i,s!_Kb:ur,,i,s!!_é:ur,,i,ar_ö:öttur,ött,etti,attar!_s:{u:{A:,,,_a:ur,ur,ri,urs!_e:{H:ur,,i,s_V:,,,!_i:ur,,i,s!_ó:{f:ótur,ót,æti,ótar_j:ur,,i,s!_á:{l:{l:{a:ur,ur,rum,ra_e:ur,ur,ri,urs!_m:ur,ur,ri,urs!_L:ur,ur,rum,ra!_ú:{r:{H:ur,,i,s_t:ur,,,s!!_knr:ur,,i,s_l:öltur,ölt,elti,altar_i:ur,,,s_ö:ötur,ötur,ötum,atna_e:ur,ur,ri,urs!_p:{ú:{n:{dru:ur,,i,s_i:inúpur,anúp,anúpi,anúps!_N:ur,,i,s!_pr:ur,,i,s_ý:ur,ur,um,a!_m:{m:{a:{v:{h:{i:{n:{ey:ur,,i,s_æ:ihvammur,ahvamm,ahvammi,ahvamms!_kð:ur,,i,s_lr:ihvammur,ahvamm,ahvammi,ahvamms!_agnrtuáæð:ur,,i,s!_H:ur,,i,s!!!_ilru:ur,,i,s!_f:{ú:{j:ur,ur,ri,urs_k:ur,,,s_Þ:ur,ur,um,na!_r:{u:ur,,i,s_o:ur,ur,um,a!_lá:ur,,i,s!_b:{m:{a:ur,,i,s_ö:ömbur,ömbur,ömbur,ambrar!!_jr:ur,ur,um,a!_ó:{k:,,,s_j:isjór,asjó,asjó,asjós!_a:{r:{k:Akrar,Akra,Ökrum,Akra_m:amrar,amra,ömrum,amra_yý:ar,ar,um,a_gu:ar,a,um,a!_l:{l:{e:ar,a,um,a_a:allar,alla,öllum,alla!_ð:{uö:ar,a,um,a_a:aðlar,aðla,öðlum,aðla!_epÁáó:ar,a,um,a_a:alar,ala,ölum,ala_s:ar,ar,um,a_g:aglar,agla,öglum,agla!_g:{ó:{k:{s:{filmnrsuáéðó:ar,a,um,a_a:askógar,askóga,iskógum,askóga!_S:ar,a,um,a!!_u:{a:{Hh:ar,a,um,a_Ll:ar,ar,um,a!_B:ar,a,um,a!_n:angar,anga,öngum,anga_io:ar,a,um,a_a:agar,aga,ögum,aga_á:ar,ar,um,a!_m:{a:{h:{agknrstðú:ar,ar,ri,ars_i:ihamar,ahamar,ahamri,ahamars!_H:ar,ar,ri,ars!_iu:ar,a,um,a_r:armar,arma,örmum,arma_l:,,i,s_m:ammar,amma,ömmum,amma!_ð:{r:{a:arðar,arða,örðum,arða_e:,,i,s!_í:{l:ar,ar,um,a_V:,,i,s!_a:ar,ar,ri,ars!_n:{i:{e:{t:{s:ar,a,um,a_S:,,i,s!_l:,,i,s!!_nt:ar,a,um,a!_d:{n:{ei:ar,a,um,a_a:andar,anda,öndum,anda!_d:ar,a,um,a!_k:{k:{a:akkar,akka,ökkum,akka_e:ar,a,um,a!_iuóú:ar,a,um,a!_p:{a:apar,apa,öpum,apa_ú:ar,a,um,a_m:ampar,ampa,ömpum,ampa!_fjí:ar,ar,um,a_stó:ar,a,um,a_i:iar,iar,um,ia!_i:{ð:{a:{lr:aðir,aðir,öðum,aða_t:aðir,aði,öðum,aða!_r:{a:arðir,arðir,örðum,arða_U:ir,ir,um,a!_æú:ir,ir,um,a_í:r,,,s!_l:{l:{e:{Vv:ellir,elli,öllum,alla_Hh:r,,,s!!_a:alir,ali,ölum,ala_g:aglir,aglir,öglum,agla!_n:{nðú:ir,ir,um,a_gy:r,,,s_f:afnir,afnir,öfnum,afna_r:arnir,arnir,örnum,arna!_g:{r:ir,ir,um,a_g:ir,i,jum,ja!_t:{a:atir,atir,ötum,ata_e:etir,eti,ötum,ata_fu:ir,ir,um,a_s:ir,i,um,a!_s:{lp:ir,ir,um,a_á:ir,i,um,a_y:r,,,s!_f:{u:ir,ir,um,a_a:afir,afir,öfum,afa!_kæ:ir,i,jum,ja_d:ir,ir,um,a_r:arir,arir,örum,ara_p:appir,appir,öppum,appa!_æ:{b:{i:{r:{g:ibær,abæ,abæ,abæjar_ð:r,,,jar!_ltv:ibær,abæ,abæ,abæjar_s:r,,,jar_ý:ibær,jabæ,jabæ,jabæjar!_aklmnrsuÁáð:r,,,jar!_B:r,,,jar!_ö:{v:{a:{l:{á:ör,ör,ör,arar_t:avör,uvör,uvör,uvarar!_knstð:ör,ör,ör,arar!_rsu:ör,ör,ör,arar!_j:ör,ör,ör,arar!_e:{k:{s:{alruð:,,i,s_í:,,jum,ja!_Si:,,i,s!_v:{r:{a:,,i,s_á:,,um,a!_h:,,,s_agl:,,i,s!!_r:{a:,,i,s_ö:örr,örr,erri,arrar!_á:,,,ar_y:,,um,a!_a:{t:{a:{g:{a:{n:{fráó:ata,ötu,ötu,ötu_æ:agata,ugötu,ugötu,ugötu!_t:{t:{a:attagata,öttugötu,öttugötu,öttugötu_e:ata,ötu,ötu,ötu!_lsó:ata,ötu,ötu,ötu!_dfgjklmprsvxð:ata,ötu,ötu,ötu!_dlnrsuðó:ata,ötu,ötu,ötu!_GJ:ata,ötu,ötu,ötu!_s:{ein:a,u,u,u_Y:,,,!_ertúý:a,u,u,u!_k:{k:{e:{r:{b:{a:{r:{ð:a,u,u,u_g:agrabrekka,ögrubrekku,ögrubrekku,ögrubrekku_ó:abrekka,ubrekku,ubrekku,ubrekku!_g:{n:angabrekka,öngubrekku,öngubrekku,öngubrekku_u:a,u,u,u!_fjklmnstáíð:a,u,u,u!_dfgilnrsuáð:a,u,u,u!_B:a,u,u,u!!_a:akka,ökku,ökku,ökku!_ú:a,u,u,u!_ð:{í:{s:{a:{dgjklmptðó:a,u,u,u_r:agrasíða,ögrusíðu,ögrusíðu,ögrusíðu!_irsuá:a,u,u,u!_S:a,u,u,u!_a:{l:aða,öðu,öðu,öðu_t:,,,!_i:{r:{k:{s:askriða,uskriðu,uskriðu,uskriðu_S:a,u,u,u!!!_r:arða,örðu,örðu,örðu_Igu:a,u,u,u!_d:{l:{A:Alda,Öldu,Öldu,Öldu_a:alda,öldu,öldu,öldu_ei:a,u,u,u!_n:a,u,u,u!_r:{ð:{i:a,u,u,u_ey:,,,!_t:{iou:a,u,u,u_Ys:,,,!_a:{j:{f:{a:{g:{n:angafjara,öngufjöru,öngufjöru,öngufjöru_a:ara,öru,öru,öru!_t:ara,öru,öru,öru!_rsu:ara,öru,öru,öru!!!_gikmó:a,u,u,u_fn:,,,!_g:{n:{u:{t:{a:{t:{t:attatunga,öttutungu,öttutungu,öttutungu_aú:a,u,u,u_s:atunga,utungu,utungu,utungu!_n:{æ:atunga,utungu,utungu,utungu_i:a,u,u,u!_dgjklmprsvx:a,u,u,u!_lnrsuð:a,u,u,u!_Tbl:a,u,u,u!_i:a,u,u,u!_iu:a,u,u,u_a:aga,ögu,ögu,ögu!_l:{m:{a:,,,_e:a,u,u,u!_f:{ií:a,u,u,u_a:afla,öflu,öflu,öflu!_gklruyæóú:a,u,u,u_e:,,,!_f:{r:{o:{t:{a:{ð:atorfa,utorfu,utorfu,utorfu_n:a,u,u,u!_r:a,u,u,u!!!_ú:{þ:{lr:a,u,u,u_a:aþúfa,uþúfu,uþúfu,uþúfu!_Þ:a,u,u,u!!_n:{n:{e:a,u,u,u_i:,,,!_r:a,u,u,u_í:angalína,öngulínu,öngulínu,öngulínu_a:ana,önu,önu,önu!_bjmpsí:a,u,u,u!_d:{n:{i:{l:{a:{fgklmnprstxð:,,,ar_á:alind,ulind,ulind,ulindar_d:aldalind,öldulind,öldulind,öldulindar!_gru:,,,ar!_L:,,,ar!_u:{r:,,,ar_Ss:,,i,s!_ö:{r:{t:{s:{a:{frð:önd,önd,önd,andar_n:aströnd,uströnd,uströnd,ustrandar!_frstá:önd,önd,önd,andar!_S:önd,önd,önd,andar!!_Ll:önd,önd,öndum,anda_R:önd,önd,önd,andar!_a:,,i,s!_l:,,,ar!_i:{t:{i:{v:i,a,a,a_e:,,,s!_æ:,,,s_lsyú:i,a,a,a!_d:{n:{e:{l:{ú:i,a,a,a_ý:,,,s!_ars:i,a,a,a!_a:i,a,a,a_iy:,,,s!_dl:i,a,a,a!_k:{k:{a:{b:{i:{ð:{i:ibakki,abakka,abakka,abakka_í:i,a,a,a!_ntá:ibakki,abakka,abakka,abakka_r:i,a,a,a!_adglnrstuáæð:i,a,a,a!_Bl:i,a,a,a!!_i:{r:{k:{að:i,a,a,a_i:ikriki,akrika,akrika,akrika!_K:i,a,a,a!!_au:i,a,a,a_rí:,,,s!_r:{ý:{m:{a:{t:{fs:i,i,i,ar_o:amýri,umýri,umýri,umýrar!_ð:{i:amýri,umýri,umýri,umýrar_u:i,i,i,ar!_r:{g:agramýri,ögrumýri,ögrumýri,ögrumýrar_e:i,i,i,ar!_g:{n:angamýri,öngumýri,öngumýri,öngumýrar_á:amýri,umýri,umýri,umýrar!_bdfjknsx:i,i,i,ar!_firsu:i,i,i,ar!_M:i,i,i,ar!_y:i,i,i,ar_iáó:i,a,a,a_fmrtð:,,,_æ:,,,s!_ð:{r:{e:,,,s_a:i,a,a,a!_i:{e:i,i,i,ar_E:,,,s_l:i,a,a,a!_yý:,,,_f:i,a,a,a_æ:,,,s!_l:{l:{a:{j:{h:{i:{r:{g:i,a,a,a_ó:ihjalli,ahjalla,ahjalla,ahjalla!_lntð:ihjalli,ahjalla,ahjalla,ahjalla_g:i,a,a,a!_arsu:i,a,a,a!_BH:i,a,a,a_b:ibjalli,abjalla,abjalla,abjalla!_hk:i,a,a,a!!_mæý:,,,s_aostáóú:i,a,a,a!_p:{a:i,a,a,a_r:,,,s!_g:{n:{a:{t:{i:{k:i,a,a,a_g:itangi,atanga,atanga,atanga!_adnrsu:i,a,a,a!_Tf:i,a,a,a!_Ee:,,,s!_ag:i,a,a,a_r:,,,s!_m:{i:{r:{afgrsu:i,a,a,a_i:irimi,arima,arima,arima!_Rk:i,a,a,a!_l:i,a,a,a_y:,,,s!_f:{r:{e:,,,s_ö:i,a,a,a!_æ:i,i,um,a_o:i,a,a,a!_n:{n:,,,s_ru:i,a,a,a!_jsóú:i,a,a,a!_n:{r:{ö:örn,örn,örn,arnar_o:,,i,s!_ú:{t:{f:{o:,,um,a_iu:,,i,s!_g:{n:,,i,s_i:,,um,a!_aiklmnprsuáæð:,,i,s!_r:{b:{l:{ae:,,,ar_ó:,u,u,ar!_anrsu:,,,ar!_B:,,,ar!_T:,,i,s!_u:{jk:,,,ar_a:,,i,s!_t:{ao:,,i,s_ö:ötn,ötn,ötnum,atna!_f:{ö:öfn,öfn,öfn,afnar_a:,,i,s!_n:{i:{k:{a:{t:attakinn,öttukinn,öttukinn,öttukinnar_r:agrakinn,ögrukinn,ögrukinn,ögrukinnar_ná:akinn,ukinn,ukinn,ukinnar_d:aldakinn,öldukinn,öldukinn,öldukinnar!_irs:,,,ar!_e:n,,i,s_K:,,,ar!_ö:önn,önn,önn,annar_u:,,i,s_a:,,,s!_i:{e:,,,ar_V:,,,jar!_g:{o:,,i,s_Ö:Ögn,Ögn,Ögn,Agnar!_oí:,,,ar_eó:,,i,s_y:,,,jar_ö:ön,ön,ön,anar!_k:{í:{v:{a:{l:{t:{A:,,,ur_i:avík,uvík,uvík,uvíkur!_bfgláæ:,,,ur!_r:{g:agravík,ögruvík,ögruvík,ögruvíkur_emt:,,,ur_ó:avík,uvík,uvík,uvíkur!_fgjkmnpstð:,,,ur!_dgilrstuyÁáð:,,,ur!_V:,,,ur!_r:{ö:{m:{a:{nð:amörk,umörk,umörk,umarkar_jlr:örk,örk,örk,arkar!_inrsuð:örk,örk,örk,arkar!_Mj:örk,örk,örk,arkar!_ae:,,i,s_Ö:Örk,Örk,Örk,Arkar!_i:{l:,,i,s_E:,,,ur!_a:,,i,s_á:,,,ar!_ð:{í:{l:{h:{a:{n:{intÁáú:,,,ar_æ:ahlíð,uhlíð,uhlíð,uhlíðar!_t:{r:artahlíð,örtuhlíð,örtuhlíð,örtuhlíðar_fst:,,,ar!_g:{gilouó:,,,ar_n:angahlíð,önguhlíð,önguhlíð,önguhlíðar_á:ahlíð,uhlíð,uhlíð,uhlíðar!_r:{g:agrahlíð,ögruhlíð,ögruhlíð,ögruhlíðar_emá:,,,ar!_djklmpsvð:,,,ar_áó:ahlíð,uhlíð,uhlíð,uhlíðar!_gilrstuá:,,,ar!_H:,,,ar!!_ö:{r:{t:{a:{g:{o:öð,öð,öð,aðar_n:angatröð,öngutröð,öngutröð,öngutraðar!_dfklntx:öð,öð,öð,aðar!_flrsuá:öð,öð,öð,aðar!_T:öð,öð,öð,aðar!_l:öð,öð,öðum,aða_t:,,,var!_i:{e:{k:,,i,s_lnr:,,,ar!_l:,,,ar_m:,,um,a!_r:{ao:,,i,s_ö:örð,örð,örðum,arða_u:,,,ar!_ó:{l:,,,ar_t:,,i,s!_gæú:,,,ar_a:,,i,s_u:uð,uð,ði,uðs!_s:{ú:{h:{r:{u:{t:{s:{u:,,i,s_e:,,um,a!_e:,,i,s!_k:,,um,a_ð:,,i,s!_a:{r:{y:,,um,a_ý:,,i,s!_d:{n:{u:{mr:,,um,a_l:,,i,s!_e:,,i,s!!_ð:{ií:,,um,a_a:,,i,s!_gnt:,,i,s_jl:,,um,a!!_s:{d:{n:,,um,a_r:,,i,s!_l:{aá:,,i,s_eó:,,um,a!_fknrstð:,,i,s_m:,,um,a!_a:{fgnr:,,i,s_ð:,,um,a!_g:{eru:,,um,a_in:,,i,s!_u:{l:{u:,,i,s_m:,,um,a!_k:,,um,a_m:,,i,s!_l:{a:,,um,a_ó:,,i,s!_ð:{i:,,um,a_ruó:,,i,s!_i:{r:,,um,a_ð:,,i,s!_t:{s:{e:,,i,s_u:,,um,a!!_bkmný:,,i,s!_H:,,i,s!_ó:{j:{Kf:,,,ar_F:,,um,a!_anrsu:,,i,s!_á:{i:{t:{s:{f:iás,aás,aás,aáss_ð:iás,iás,aás,iáss!!_knð:,,,s_á:iás,uás,uás,uáss_g:angiás,önguás,önguás,önguáss!_Babdfgklnrstuð:,,,s!_s:{o:{f:{i:{gt:,,i,_r:ifoss,afoss,afossi,afoss!_alrx:,,i,!_Fr:,,i,!!_eÓ:,,i,s_uÁ:,,,s_l:,,i,_i:,,,ar!_f:{i:{Rlr:,,i,s_e:,,,ar!_ö:{n:{r:öf,öf,öf,afar_a:anöf,unöf,unöf,unafar!_Nr:öf,öf,öf,afar!_l:{á:,,,ar_o:,,i,s!_eor:,,i,s_uíó:,,,ar!_g:{r:{o:{b:{a:{n:{fru:,,,ar_æ:aborg,uborg,uborg,uborgar!_r:{fmð:,,,ar_ó:aborg,uborg,uborg,uborgar!_djltxð:,,,ar!_gilmnrsuæý:,,,ar!_t:,,i,s_B:,,,ar!_ö:{j:{b:{n:örg,örgu,örgu,argar_atá:örg,örg,örgum,arga!_B:örg,örgu,örgu,argar!!_ae:,,i,s!_n:{i:,,i,s_ö:öng,öng,öng,angar!_u:{a:{l:{s:{l:,u,u,ar_enpt:,,,ar!_a:,,,ar_ð:,u,u,ar!_L:,,,ar!!_á:,,,ar_a:,,i,s_g:,,,jar!_ú:{r:,,,ar_b:,,i,s!_p:{eó:,,i,s_p:öpp,öpp,öpp,appar_í:,,,ur_s:Ösp,Ösp,Ösp,Aspar!_á:{l:{b:,,,ar_eilá:,,,r!_adfgijkmnprstð:,,,r!_y:,,,jar_Á:,,,r_u:,,,_m:öm,öm,öm,amar!!";
// We can't hard-code this to something like "@@input@@" because
// rollup considers that to be dead code and eliminates it.
//
// Anyway, this will be replaced with a constant in builds.
var mode = "addresses"; // Set to either 'names' or 'addresses' in builds
const trie = deserializeTrie(serializedInput);
const casesIs = ["nf", "þf", "þgf", "ef"];
const casesEn = ["nom", "acc", "dat", "gen"];
function getCaseIndex(caseStr) {
const indexIs = casesIs.indexOf(caseStr);
if (indexIs !== -1)
return indexIs;
const indexEn = casesEn.indexOf(caseStr);
if (indexEn !== -1)
return indexEn;
return 0; // Fall back to 0 if an invalid case was provided
}
function declineName(name, declension, caseStr) {
const appendices = declension.split(",");
const subtraction = appendices[0].length;
const caseIndex = getCaseIndex(caseStr);
// Should not happen, but prefer being safe
if (!Number.isFinite(subtraction) || appendices.length !== 4)
return name;
const root = name.substr(0, name.length - subtraction);
return root + appendices[caseIndex];
}
let predicate;
function setPredicate(pred) {
predicate = pred;
}
function applyCaseToName(caseStr, name) {
if (mode === "names") {
const namesThatEndWithSon = ["Samson", "Jason"];
const endsWithSon = namesThatEndWithSon.indexOf(name) !== -1;
if (!endsWithSon) {
for (const [ending, declension] of [
["son", "on,on,yni,onar"],
["dóttir", "ir,ur,ur,ur"],
["bur", ",,i,s"],
]) {
if (!name.endsWith(ending))
continue;
name = name.split(ending)[0];
return name + declineName(ending, declension, caseStr);
}
}
}
const declension = getDeclensionForName(name);
if (declension && (!predicate || predicate(name)))
name = declineName(name, declension, caseStr);
return name;
}
/**
* Applies a case to a source name provided in the nominative
* case (nefnifall).
*
* @example
* ```tsx
* applyCase("ef", "Jóhann");
* //=> "Jóhannesar"
*
* applyCase("þgf", "Helga Fríða Smáradóttir");
* //=> "Helgu Fríðu Smáradóttur"
* ```
*
* The name provided must be an Icelandic name in the nominative case
* (nefnifall). Otherwise, an unexpected output is likely.
*
* The supported cases are:
*
* - Nominative `nom` (nefnifall `nf` in Icelandic)
* - Accusative `acc` (þolfall `þf` in Icelandic)
* - Dative `dat` (þágufall `þgf` in Icelandic)
* - Genitive `gen` (eignarfall `ef` in Icelandic)
*
* Note that superfluous whitespace is not retained:
*
* @example
* ```tsx
* applyCase("þf", " \n Hildigerður Oddný\tPatreksdóttir \n\n");
* //=> "Hildigerði Oddnýju Patreksdóttur"
* ```
*
* @param name - An Icelandic name in the nominative case (nefnifall)
* @param caseStr - The case to apply to the name to, e.g. `þf`
*/
function applyCase(caseStr, name) {
return name
.split(/\s+/)
.filter(Boolean)
.map((name) => {
if (mode === "names")
return applyCaseToName(caseStr, name);
return name
.split("-")
.map((name) => applyCaseToName(caseStr, name))
.join("-");
})
.join(" ");
}
function getDeclensionForName(name) {
if (name.split(/\s+/).length > 1)
throw new Error("Name must not include whitespace");
const declension = extractDeclension(trie, name);
if (declension) {
// Ensure that the declension applies to the name. This guard is useful when
// the subtraction is longer than the path to the declension.
//
// For example, consider this:
//
// {
// "path": "ya",
// "children": {},
// "keys": ["Tanya"],
// "value": "4;anya,önyu,önyu,önyu"
// }
//
// The name 'Maya' matches this path, but applying the declension erases the
// entire name.
const appendices = declension.split(",");
if (!name.endsWith(appendices[0]))
return null;
}
return declension;
}
exports.applyCase = applyCase;
exports.getDeclensionForName = getDeclensionForName;
exports.setPredicate = setPredicate;