enketo-transformer
Version:
Library that transforms ODK-compliant XForms into a format that Enketo can consume
1 lines • 4.04 kB
Source Map (JSON)
{"version":3,"file":"language.cjs","sources":["../../src/language.ts"],"sourcesContent":["import tags from 'language-tags';\nimport stringDirection from 'string-direction';\n\nimport type { Tag, Subtag } from 'language-tags';\n\n/** @package */\nexport class Language {\n constructor(\n readonly sourceLanguage: string,\n readonly description: string,\n readonly tag: string,\n readonly directionality: string\n ) {}\n}\n\n/**\n * @package\n *\n * Parses a language string into a {@link Language}. Guesses missing properties.\n * TODO: this should be refactored (more than it has been since this comment was\n * initially written).\n *\n * @see\n * {http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry}\n */\nexport const parseLanguage = (\n sourceLanguage: string,\n sample: string\n): Language => {\n const directionality = getDirectionality(sample);\n\n let description = sourceLanguage.trim();\n let tag = description;\n\n const parts = sourceLanguage.match(/^([^(]+)\\((.*)\\)\\s*$/);\n\n if (parts && parts.length >= 2) {\n return new Language(\n sourceLanguage,\n parts[1].trim(),\n parts[2].trim(),\n directionality\n );\n }\n // First check whether `sourceLanguage` is a known IANA subtag like 'en' or 'en-GB'\n const languageFromTag = getLanguageFromSubtag(sourceLanguage.split('-')[0]);\n\n if (languageFromTag == null) {\n const language = getLanguageFromDescription(description);\n\n if (typeof language === 'object' && language.data.subtag != null) {\n tag = language.data.subtag;\n }\n } else {\n description = languageFromTag.descriptions()[0];\n }\n\n return new Language(sourceLanguage, description, tag, directionality);\n};\n\n/**\n * Performs IANA search to find language object with provided description.\n */\nconst getLanguageFromDescription = (description: string) =>\n description.trim() === ''\n ? ''\n : tags.search(description).find(isLanguage) ?? '';\n\n/**\n * Performs IANA search to find language object with provided subtag.\n */\nconst getLanguageFromSubtag = (subtag: string) =>\n subtag.trim() === '' ? null : tags.subtags(subtag).find(isLanguage) ?? null;\n\nconst isLanguage = (object: Tag | Subtag) => object.data.type === 'language';\n\nenum Directionality {\n /**\n * @default (?)\n * @see {@link getDirectionality}\n */\n LTR = 'ltr',\n RTL = 'rtl',\n}\n\n/**\n * Obtains the directionality of a text sample.\n *\n * TODO: According to the prior JSDoc, the default is supposed to be\n * {@link Directionality.LTR}, but the logic suggests the opposite.\n */\nconst getDirectionality = (sample: string) => {\n const direction = stringDirection.getDirection(sample);\n\n if (direction !== Directionality.LTR) {\n return Directionality.RTL;\n }\n\n return direction;\n};\n"],"names":[],"mappings":";;;;AAMO,MAAM,SAAS;AAAA,EAClB,YACa,gBACA,aACA,KACA,gBACX;AAJW,SAAA,iBAAA;AACA,SAAA,cAAA;AACA,SAAA,MAAA;AACA,SAAA,iBAAA;AAAA,EACV;AACP;AAYa,MAAA,gBAAgB,CACzB,gBACA,WACW;AACL,QAAA,iBAAiB,kBAAkB,MAAM;AAE3C,MAAA,cAAc,eAAe;AACjC,MAAI,MAAM;AAEJ,QAAA,QAAQ,eAAe,MAAM,sBAAsB;AAErD,MAAA,SAAS,MAAM,UAAU,GAAG;AAC5B,WAAO,IAAI;AAAA,MACP;AAAA,MACA,MAAM,CAAC,EAAE,KAAK;AAAA,MACd,MAAM,CAAC,EAAE,KAAK;AAAA,MACd;AAAA,IAAA;AAAA,EAER;AAEA,QAAM,kBAAkB,sBAAsB,eAAe,MAAM,GAAG,EAAE,CAAC,CAAC;AAE1E,MAAI,mBAAmB,MAAM;AACnB,UAAA,WAAW,2BAA2B,WAAW;AAEvD,QAAI,OAAO,aAAa,YAAY,SAAS,KAAK,UAAU,MAAM;AAC9D,YAAM,SAAS,KAAK;AAAA,IACxB;AAAA,EAAA,OACG;AACW,kBAAA,gBAAgB,aAAa,EAAE,CAAC;AAAA,EAClD;AAEA,SAAO,IAAI,SAAS,gBAAgB,aAAa,KAAK,cAAc;AACxE;AAKA,MAAM,6BAA6B,CAAC,gBAChC,YAAY,WAAW,KACjB,KACA,KAAK,OAAO,WAAW,EAAE,KAAK,UAAU,KAAK;AAKvD,MAAM,wBAAwB,CAAC,WAC3B,OAAO,WAAW,KAAK,OAAO,KAAK,QAAQ,MAAM,EAAE,KAAK,UAAU,KAAK;AAE3E,MAAM,aAAa,CAAC,WAAyB,OAAO,KAAK,SAAS;AAiBlE,MAAM,oBAAoB,CAAC,WAAmB;AACpC,QAAA,YAAY,gBAAgB,aAAa,MAAM;AAErD,MAAI,cAAc,OAAoB;AAC3B,WAAA;AAAA,EACX;AAEO,SAAA;AACX;;;"}