@hawkeyexl/manni 4.11.0 → 4.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{batch-UAULUMGH.js → batch-KMGZMIAQ.js} +20 -19
- package/dist/build-NO4AWCYG.js +36 -0
- package/dist/calibrate-XQUG5XAK.js +41 -0
- package/dist/capture-5XE3ZMXK.js +38 -0
- package/dist/{check-YEOYBFST.js → check-HTNPLWOV.js} +19 -18
- package/dist/check-RJ45IBA6.js +34 -0
- package/dist/{check-VELUQAUW.js → check-W24BQNCT.js} +35 -34
- package/dist/{check-VELUQAUW.js.map → check-W24BQNCT.js.map} +1 -1
- package/dist/check-WFXSXICD.js +30 -0
- package/dist/{chunk-IGSHYP74.js → chunk-23P7KMJM.js} +4 -4
- package/dist/{chunk-HA6MQMOY.js → chunk-24J7TYPU.js} +6 -6
- package/dist/{chunk-PCS4VJBV.js → chunk-37QJLVS3.js} +9 -9
- package/dist/{chunk-4CK6ZSOK.js → chunk-3P6KCU36.js} +3 -3
- package/dist/{chunk-54F74XR3.js → chunk-5JBVFWVP.js} +19 -19
- package/dist/{chunk-B7XYNRJQ.js → chunk-6KIYVVKL.js} +2 -2
- package/dist/{chunk-J6IDQGJL.js → chunk-6TVH4FI7.js} +469 -85
- package/dist/chunk-6TVH4FI7.js.map +1 -0
- package/dist/{chunk-GDVZ5VII.js → chunk-7A452BPZ.js} +4 -4
- package/dist/{chunk-M42DZCOU.js → chunk-7FCLXEAQ.js} +2 -2
- package/dist/{chunk-2MJ62AYQ.js → chunk-7MCQHTQ5.js} +4 -3
- package/dist/chunk-7MCQHTQ5.js.map +1 -0
- package/dist/{chunk-LBSCW232.js → chunk-7NXPQKSB.js} +7 -7
- package/dist/{chunk-OPXWPJDA.js → chunk-A3TEDWBZ.js} +14 -14
- package/dist/{chunk-BBT6AVUG.js → chunk-BHHXU2D2.js} +2 -2
- package/dist/{chunk-D4N2V43Z.js → chunk-CEI2J42X.js} +13 -7
- package/dist/chunk-CEI2J42X.js.map +1 -0
- package/dist/{chunk-FQXWVS6J.js → chunk-CMMBWHT2.js} +9 -9
- package/dist/{chunk-EIFCP6CZ.js → chunk-CO47QJKZ.js} +2 -2
- package/dist/{chunk-2DRHT73U.js → chunk-CVZMKWZ5.js} +913 -1398
- package/dist/chunk-CVZMKWZ5.js.map +1 -0
- package/dist/{chunk-ADMEPUBT.js → chunk-CXWTNT2O.js} +3 -3
- package/dist/{chunk-LKP7QDFN.js → chunk-DAQTRAP5.js} +4 -4
- package/dist/chunk-DSWKBZWW.js +16 -0
- package/dist/chunk-DSWKBZWW.js.map +1 -0
- package/dist/{chunk-PWBH7DCQ.js → chunk-EESH6COU.js} +4 -4
- package/dist/{chunk-JPQDNYXH.js → chunk-EM67O2ET.js} +8 -2
- package/dist/chunk-EM67O2ET.js.map +1 -0
- package/dist/{chunk-HQR2ZBHW.js → chunk-I2XQRRP7.js} +36 -7
- package/dist/chunk-I2XQRRP7.js.map +1 -0
- package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
- package/dist/{chunk-2IR4T5PO.js → chunk-JJ4RSDSY.js} +2 -2
- package/dist/chunk-KCB5JCK4.js +2272 -0
- package/dist/chunk-KCB5JCK4.js.map +1 -0
- package/dist/{chunk-VSEBFHAY.js → chunk-KFKL4VTL.js} +11369 -10218
- package/dist/chunk-KFKL4VTL.js.map +1 -0
- package/dist/{chunk-PCQ7ELJH.js → chunk-L2TD7DZB.js} +109 -5
- package/dist/chunk-L2TD7DZB.js.map +1 -0
- package/dist/{chunk-WDWXAYVH.js → chunk-L3RLGGRK.js} +4 -4
- package/dist/{chunk-T7JAOYE5.js → chunk-L75CAZG4.js} +6 -6
- package/dist/{chunk-U7CTFN2J.js → chunk-MYRPMSOX.js} +7 -7
- package/dist/{chunk-Y6DOMTQD.js → chunk-NCF5NQV5.js} +27 -27
- package/dist/chunk-NCF5NQV5.js.map +1 -0
- package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
- package/dist/{chunk-FUCPZVRY.js → chunk-OEN6FBUW.js} +2 -2
- package/dist/{chunk-FBMZJEB3.js → chunk-OKMTUAWO.js} +4 -4
- package/dist/{chunk-QLWC7MKD.js → chunk-OTJOBZJ5.js} +135 -135
- package/dist/chunk-OTJOBZJ5.js.map +1 -0
- package/dist/{chunk-R4WXQIOZ.js → chunk-PCEM5FOZ.js} +3 -3
- package/dist/{chunk-4D5IZSXM.js → chunk-PXNCRGUL.js} +3 -3
- package/dist/chunk-Q2QC5AZB.js +1868 -0
- package/dist/chunk-Q2QC5AZB.js.map +1 -0
- package/dist/{chunk-ODRPL3WB.js → chunk-Q3ODX5PF.js} +2 -2
- package/dist/{chunk-KGEQJ5CC.js → chunk-RRFFUWDL.js} +8 -8
- package/dist/{chunk-NSBXVPZL.js → chunk-S3XUYW5K.js} +17 -17
- package/dist/{chunk-LPIF5LIE.js → chunk-SAU2WQFC.js} +2 -2
- package/dist/{chunk-MSRU4D4P.js → chunk-SFLICIQV.js} +2 -2
- package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
- package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
- package/dist/chunk-VM7VAFJW.js.map +1 -0
- package/dist/{chunk-6HWBRZIN.js → chunk-VQYGLU4C.js} +252 -193
- package/dist/chunk-VQYGLU4C.js.map +1 -0
- package/dist/{chunk-2IAZEB45.js → chunk-WGMFDG6U.js} +229 -821
- package/dist/chunk-WGMFDG6U.js.map +1 -0
- package/dist/{chunk-GV56WGL2.js → chunk-WO4JYWZK.js} +1036 -883
- package/dist/chunk-WO4JYWZK.js.map +1 -0
- package/dist/chunk-XYRUDFKS.js +685 -0
- package/dist/chunk-XYRUDFKS.js.map +1 -0
- package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
- package/dist/chunk-YUTVAMWW.js +2 -0
- package/dist/{chunk-RLT5SEML.js → chunk-Z5MZCCTT.js} +6 -6
- package/dist/{chunk-BKVHX6FU.js → chunk-ZIRBFXDW.js} +5 -10
- package/dist/chunk-ZIRBFXDW.js.map +1 -0
- package/dist/{cli-O4ABTN4Z.js → cli-236TGVJG.js} +31 -30
- package/dist/{cli-O4ABTN4Z.js.map → cli-236TGVJG.js.map} +1 -1
- package/dist/{cli-3BTCK4AB.js → cli-3FAPJBEY.js} +27 -26
- package/dist/{cli-3BTCK4AB.js.map → cli-3FAPJBEY.js.map} +1 -1
- package/dist/{cli-JJMOVIKS.js → cli-BS43EVCD.js} +14 -14
- package/dist/{cli-RORDPAPE.js → cli-CMR4FYF6.js} +59 -38
- package/dist/cli-CMR4FYF6.js.map +1 -0
- package/dist/{cli-ONTC5PKT.js → cli-FX53PBQ3.js} +9 -9
- package/dist/{cli-6KZTHWGP.js → cli-IQNJLKSN.js} +37 -36
- package/dist/{cli-6KZTHWGP.js.map → cli-IQNJLKSN.js.map} +1 -1
- package/dist/{cli-4MF37HAQ.js → cli-KOMXVPXX.js} +26 -25
- package/dist/{cli-4MF37HAQ.js.map → cli-KOMXVPXX.js.map} +1 -1
- package/dist/{cli-I62SRH3R.js → cli-NGL63E53.js} +14 -13
- package/dist/{cli-DRMZBZLB.js → cli-QPGS2MR5.js} +43 -42
- package/dist/{cli-DRMZBZLB.js.map → cli-QPGS2MR5.js.map} +1 -1
- package/dist/{cli-VID7PJS3.js → cli-RKQX4TI3.js} +23 -22
- package/dist/{cli-VID7PJS3.js.map → cli-RKQX4TI3.js.map} +1 -1
- package/dist/{cli-VUKMWSSF.js → cli-WNEI5L7P.js} +4 -4
- package/dist/cli.js +19 -13
- package/dist/cli.js.map +1 -1
- package/dist/{config-XDA42RJL.js → config-JJW75SBX.js} +5 -5
- package/dist/docmeta.js +13 -12
- package/dist/docmeta.js.map +1 -1
- package/dist/github-4UR67MEN.js +35 -0
- package/dist/github-UPGKMVVF.js +30 -0
- package/dist/graph/runtime.d.ts +4 -1
- package/dist/graph/runtime.js +20 -9
- package/dist/graph/runtime.js.map +1 -1
- package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
- package/dist/index.d.ts +192 -26
- package/dist/index.js +129 -124
- package/dist/index.js.map +1 -1
- package/dist/{json-BXY44ED7.js → json-DQIELR36.js} +18 -17
- package/dist/labels-XSTJJMSG.js +73 -0
- package/dist/labels-XSTJJMSG.js.map +1 -0
- package/dist/lint-BLBGGOYM.js +34 -0
- package/dist/list-B3RRRWFQ.js +32 -0
- package/dist/list-ZFRT3JQH.js +35 -0
- package/dist/{page-EV7OUBAU.js → page-5ISEVJR5.js} +18 -16
- package/dist/{prepare-JHJDJB6I.js → prepare-KFXXG2CJ.js} +22 -21
- package/dist/{prepare-JHJDJB6I.js.map → prepare-KFXXG2CJ.js.map} +1 -1
- package/dist/{pretty-Q5Y2PA64.js → pretty-Y7CGQLAF.js} +18 -17
- package/dist/{pretty-SCRK66M5.js → pretty-ZISH3Q4F.js} +18 -17
- package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
- package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
- package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
- package/dist/{reporters-A5ADKDYR.js → reporters-4STXJJE2.js} +16 -15
- package/dist/{reporters-RBYTASMI.js → reporters-74B4U2GZ.js} +7 -7
- package/dist/run-DVGTKM52.js +37 -0
- package/dist/{term-CQAGNG3Q.js → term-PLJEYJQV.js} +981 -141
- package/dist/term-PLJEYJQV.js.map +1 -0
- package/dist/validate-CJNFQHMD.js +19 -0
- package/package.json +3 -2
- package/plugin/manni/.claude-plugin/plugin.json +1 -1
- package/shapes/graph/shapes-1.1.0.ttl +785 -0
- package/dist/build-QSPNK5AL.js +0 -35
- package/dist/calibrate-KXN4URPM.js +0 -40
- package/dist/capture-JHTSUPUC.js +0 -37
- package/dist/check-MDGXEUWL.js +0 -20
- package/dist/check-WOQRKNZK.js +0 -29
- package/dist/chunk-2DRHT73U.js.map +0 -1
- package/dist/chunk-2IAZEB45.js.map +0 -1
- package/dist/chunk-2MJ62AYQ.js.map +0 -1
- package/dist/chunk-4VBSTXN6.js +0 -392
- package/dist/chunk-4VBSTXN6.js.map +0 -1
- package/dist/chunk-6HWBRZIN.js.map +0 -1
- package/dist/chunk-BKVHX6FU.js.map +0 -1
- package/dist/chunk-D4N2V43Z.js.map +0 -1
- package/dist/chunk-EFW7CAG4.js +0 -387
- package/dist/chunk-EFW7CAG4.js.map +0 -1
- package/dist/chunk-GV56WGL2.js.map +0 -1
- package/dist/chunk-HQR2ZBHW.js.map +0 -1
- package/dist/chunk-J6IDQGJL.js.map +0 -1
- package/dist/chunk-JPQDNYXH.js.map +0 -1
- package/dist/chunk-JROBZ7JA.js +0 -818
- package/dist/chunk-JROBZ7JA.js.map +0 -1
- package/dist/chunk-PCQ7ELJH.js.map +0 -1
- package/dist/chunk-QCHVR4ZM.js.map +0 -1
- package/dist/chunk-QLWC7MKD.js.map +0 -1
- package/dist/chunk-TU2WUBVZ.js +0 -2
- package/dist/chunk-VSEBFHAY.js.map +0 -1
- package/dist/chunk-Y6DOMTQD.js.map +0 -1
- package/dist/cli-RORDPAPE.js.map +0 -1
- package/dist/github-RY3FRA6P.js +0 -29
- package/dist/github-YKQSH7FS.js +0 -34
- package/dist/lint-YJ2L22BW.js +0 -33
- package/dist/list-NSG24VVX.js +0 -31
- package/dist/list-V6EGCSHX.js +0 -34
- package/dist/run-BUE2DDXN.js +0 -36
- package/dist/term-CQAGNG3Q.js.map +0 -1
- package/dist/validate-ZBW44RHT.js +0 -18
- /package/dist/{batch-UAULUMGH.js.map → batch-KMGZMIAQ.js.map} +0 -0
- /package/dist/{build-QSPNK5AL.js.map → build-NO4AWCYG.js.map} +0 -0
- /package/dist/{calibrate-KXN4URPM.js.map → calibrate-XQUG5XAK.js.map} +0 -0
- /package/dist/{capture-JHTSUPUC.js.map → capture-5XE3ZMXK.js.map} +0 -0
- /package/dist/{check-MDGXEUWL.js.map → check-HTNPLWOV.js.map} +0 -0
- /package/dist/{check-WOQRKNZK.js.map → check-RJ45IBA6.js.map} +0 -0
- /package/dist/{check-YEOYBFST.js.map → check-WFXSXICD.js.map} +0 -0
- /package/dist/{chunk-IGSHYP74.js.map → chunk-23P7KMJM.js.map} +0 -0
- /package/dist/{chunk-HA6MQMOY.js.map → chunk-24J7TYPU.js.map} +0 -0
- /package/dist/{chunk-PCS4VJBV.js.map → chunk-37QJLVS3.js.map} +0 -0
- /package/dist/{chunk-4CK6ZSOK.js.map → chunk-3P6KCU36.js.map} +0 -0
- /package/dist/{chunk-54F74XR3.js.map → chunk-5JBVFWVP.js.map} +0 -0
- /package/dist/{chunk-B7XYNRJQ.js.map → chunk-6KIYVVKL.js.map} +0 -0
- /package/dist/{chunk-GDVZ5VII.js.map → chunk-7A452BPZ.js.map} +0 -0
- /package/dist/{chunk-M42DZCOU.js.map → chunk-7FCLXEAQ.js.map} +0 -0
- /package/dist/{chunk-LBSCW232.js.map → chunk-7NXPQKSB.js.map} +0 -0
- /package/dist/{chunk-OPXWPJDA.js.map → chunk-A3TEDWBZ.js.map} +0 -0
- /package/dist/{chunk-BBT6AVUG.js.map → chunk-BHHXU2D2.js.map} +0 -0
- /package/dist/{chunk-FQXWVS6J.js.map → chunk-CMMBWHT2.js.map} +0 -0
- /package/dist/{chunk-EIFCP6CZ.js.map → chunk-CO47QJKZ.js.map} +0 -0
- /package/dist/{chunk-ADMEPUBT.js.map → chunk-CXWTNT2O.js.map} +0 -0
- /package/dist/{chunk-LKP7QDFN.js.map → chunk-DAQTRAP5.js.map} +0 -0
- /package/dist/{chunk-PWBH7DCQ.js.map → chunk-EESH6COU.js.map} +0 -0
- /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
- /package/dist/{chunk-2IR4T5PO.js.map → chunk-JJ4RSDSY.js.map} +0 -0
- /package/dist/{chunk-WDWXAYVH.js.map → chunk-L3RLGGRK.js.map} +0 -0
- /package/dist/{chunk-T7JAOYE5.js.map → chunk-L75CAZG4.js.map} +0 -0
- /package/dist/{chunk-U7CTFN2J.js.map → chunk-MYRPMSOX.js.map} +0 -0
- /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
- /package/dist/{chunk-FUCPZVRY.js.map → chunk-OEN6FBUW.js.map} +0 -0
- /package/dist/{chunk-FBMZJEB3.js.map → chunk-OKMTUAWO.js.map} +0 -0
- /package/dist/{chunk-R4WXQIOZ.js.map → chunk-PCEM5FOZ.js.map} +0 -0
- /package/dist/{chunk-4D5IZSXM.js.map → chunk-PXNCRGUL.js.map} +0 -0
- /package/dist/{chunk-ODRPL3WB.js.map → chunk-Q3ODX5PF.js.map} +0 -0
- /package/dist/{chunk-KGEQJ5CC.js.map → chunk-RRFFUWDL.js.map} +0 -0
- /package/dist/{chunk-NSBXVPZL.js.map → chunk-S3XUYW5K.js.map} +0 -0
- /package/dist/{chunk-LPIF5LIE.js.map → chunk-SAU2WQFC.js.map} +0 -0
- /package/dist/{chunk-MSRU4D4P.js.map → chunk-SFLICIQV.js.map} +0 -0
- /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
- /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
- /package/dist/{chunk-TU2WUBVZ.js.map → chunk-YUTVAMWW.js.map} +0 -0
- /package/dist/{chunk-RLT5SEML.js.map → chunk-Z5MZCCTT.js.map} +0 -0
- /package/dist/{cli-JJMOVIKS.js.map → cli-BS43EVCD.js.map} +0 -0
- /package/dist/{cli-ONTC5PKT.js.map → cli-FX53PBQ3.js.map} +0 -0
- /package/dist/{cli-I62SRH3R.js.map → cli-NGL63E53.js.map} +0 -0
- /package/dist/{cli-VUKMWSSF.js.map → cli-WNEI5L7P.js.map} +0 -0
- /package/dist/{config-XDA42RJL.js.map → config-JJW75SBX.js.map} +0 -0
- /package/dist/{github-RY3FRA6P.js.map → github-4UR67MEN.js.map} +0 -0
- /package/dist/{github-YKQSH7FS.js.map → github-UPGKMVVF.js.map} +0 -0
- /package/dist/{host-6GURH5HE.js.map → host-YSTYO5DX.js.map} +0 -0
- /package/dist/{json-BXY44ED7.js.map → json-DQIELR36.js.map} +0 -0
- /package/dist/{lint-YJ2L22BW.js.map → lint-BLBGGOYM.js.map} +0 -0
- /package/dist/{list-NSG24VVX.js.map → list-B3RRRWFQ.js.map} +0 -0
- /package/dist/{list-V6EGCSHX.js.map → list-ZFRT3JQH.js.map} +0 -0
- /package/dist/{page-EV7OUBAU.js.map → page-5ISEVJR5.js.map} +0 -0
- /package/dist/{pretty-Q5Y2PA64.js.map → pretty-Y7CGQLAF.js.map} +0 -0
- /package/dist/{pretty-SCRK66M5.js.map → pretty-ZISH3Q4F.js.map} +0 -0
- /package/dist/{provider-527CO4DM.js.map → provider-LBX4IXGX.js.map} +0 -0
- /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
- /package/dist/{reporters-A5ADKDYR.js.map → reporters-26H3N2KW.js.map} +0 -0
- /package/dist/{reporters-M6LJ2IYU.js.map → reporters-4STXJJE2.js.map} +0 -0
- /package/dist/{reporters-RBYTASMI.js.map → reporters-74B4U2GZ.js.map} +0 -0
- /package/dist/{run-BUE2DDXN.js.map → run-DVGTKM52.js.map} +0 -0
- /package/dist/{validate-ZBW44RHT.js.map → validate-CJNFQHMD.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/term/errors.ts","../src/term/types.ts","../src/term/core/config.ts","../src/term/core/writers/render-util.ts","../src/term/commands/run.ts","../src/term/core/load-set.ts","../src/term/core/writers/markup.ts","../src/term/core/writers/entries.ts","../src/term/core/id.ts","../src/term/core/readers/normalize.ts","../src/term/core/readers/splice.ts","../src/term/core/readers/xml.ts","../src/term/core/readers/dita.ts","../src/term/core/readers/docbook.ts","../src/term/core/readers/html.ts","../src/term/core/readers/manifest.ts","../src/term/core/readers/page.ts","../src/term/core/readers/skos.ts","../src/term/core/readers/tbx.ts","../src/term/core/writers/merge.ts","../src/term/core/readers/tbx-model.ts","../src/term/core/readers/structured.ts","../src/term/core/readers/body.ts","../src/term/core/readers/asciidoc-glossary.ts","../src/term/core/readers/markdown-deflist.ts","../src/term/core/readers/rst-glossary.ts","../src/term/core/readers/text.ts","../src/term/core/readers/index.ts"],"sourcesContent":["import { ToolError } from \"../shared/errors.js\";\n\n/** An operational or usage error in the term tool: exit 2. */\nexport class TermError extends ToolError {\n constructor(message: string) {\n super(message);\n this.name = \"TermError\";\n }\n}\n","/**\n * The term tool's contract (proposal 0052). Every reader produces a `Term`,\n * every writer consumes one, and `check` and `lint` work on a `TermSet`. So a\n * new construct is one reader and one writer, and nothing after reading\n * changes, the same rule `MetadataExtractor` keeps for metadata.\n *\n * A term's record keeps the vocabulary's own kebab-case spelling\n * (`alt-labels`, `scope-note`), because it is the same record a page carries\n * and the one `term list -f json` prints. docevals keeps its eval entries in\n * frontmatter spelling for the same reason.\n */\nimport type { CollectionConfig } from \"../shared/collections.js\";\nimport type { ConfigFile } from \"../shared/config-file.js\";\nimport type { Severity } from \"../shared/severity.js\";\nimport type { ToolsConfig } from \"../shared/tools.js\";\n\n// ---------------------------------------------------------------------------\n// The record\n\n/**\n * The root fields of `manni:terminology:1.2.0`: the ten 1.0.0 fields in the\n * order the reference lists them, then `notation` and the five match keys\n * (proposal 0086), then the TBX data categories (proposal 0084), then the\n * three blocks.\n */\nexport const TERM_FIELDS = [\n \"label\",\n \"definition\",\n \"abstract\",\n \"alt-labels\",\n \"hidden-labels\",\n \"broader\",\n \"narrower\",\n \"related-terms\",\n \"see\",\n \"scope-note\",\n \"notation\",\n \"exact-matches\",\n \"close-matches\",\n \"broad-matches\",\n \"narrow-matches\",\n \"related-matches\",\n \"subject-field\",\n \"contexts\",\n \"notes\",\n \"sources\",\n \"customer-subsets\",\n \"project-subsets\",\n \"cross-references\",\n \"external-cross-references\",\n \"graphics\",\n \"transactions\",\n \"tbx-elements\",\n \"concept-entry\",\n \"designations\",\n \"tbx-markup\",\n] as const;\nexport type TermField = (typeof TERM_FIELDS)[number];\n\n/** The fields that hold a list of labels. The vocabulary accepts a string or a list; a reader always yields a list. */\nexport const TERM_LIST_FIELDS = [\n \"alt-labels\",\n \"hidden-labels\",\n \"broader\",\n \"narrower\",\n \"related-terms\",\n] as const satisfies readonly TermField[];\nexport type TermListField = (typeof TERM_LIST_FIELDS)[number];\n\n/**\n * The mapping fields, in the order a finding names them: each holds the IRIs\n * of concepts in other vocabularies. The vocabulary accepts an IRI or a list;\n * a reader always yields a list.\n */\nexport const TERM_MATCH_FIELDS = [\n \"exact-matches\",\n \"close-matches\",\n \"broad-matches\",\n \"narrow-matches\",\n \"related-matches\",\n] as const satisfies readonly TermField[];\nexport type TermMatchField = (typeof TERM_MATCH_FIELDS)[number];\n\n/**\n * The aux fields: valid at the root (language level), in `concept-entry`\n * (concept level) and in a `designations` item (term level). The level of a\n * value is where it sits.\n */\nexport const TERM_AUX_FIELDS = [\n \"definition\",\n \"subject-field\",\n \"contexts\",\n \"notes\",\n \"sources\",\n \"customer-subsets\",\n \"project-subsets\",\n \"cross-references\",\n \"external-cross-references\",\n \"graphics\",\n \"transactions\",\n \"tbx-elements\",\n] as const satisfies readonly TermField[];\nexport type TermAuxField = (typeof TERM_AUX_FIELDS)[number];\n\n/** The term-level keys, valid only in a `designations` item, beside its `term`. Each holds one string. */\nexport const TERM_DESIGNATION_FIELDS = [\n \"administrative-status\",\n \"part-of-speech\",\n \"grammatical-gender\",\n \"grammatical-number\",\n \"term-type\",\n \"term-location\",\n \"geographical-usage\",\n \"register\",\n \"reading\",\n \"reading-note\",\n] as const;\nexport type TermDesignationField = (typeof TERM_DESIGNATION_FIELDS)[number];\n\n/** A `cross-references`, `external-cross-references` or `graphics` item. A bare string reads as its target. */\nexport interface TermLink {\n target: string;\n text?: string;\n}\n\n/** A `transactions` item. `date` is kept as written. */\nexport interface TermTransaction {\n type: string;\n date?: string;\n responsibility?: string;\n}\n\n/** The aux fields, as every level holds them. A list field is a non-empty list, or absent. */\nexport interface TermAuxRecord {\n definition?: string;\n \"subject-field\"?: string;\n contexts?: string[];\n notes?: string[];\n sources?: string[];\n \"customer-subsets\"?: string[];\n \"project-subsets\"?: string[];\n \"cross-references\"?: TermLink[];\n \"external-cross-references\"?: TermLink[];\n graphics?: TermLink[];\n transactions?: TermTransaction[];\n /** Elements no named field maps, as XML strings in source order. */\n \"tbx-elements\"?: string[];\n}\n\n/** A `designations` item: one of the term's labels, with what is said about that designation alone. */\nexport interface TermDesignation extends TermAuxRecord {\n /** The label, alt-label or hidden-label the item describes. */\n term: string;\n \"administrative-status\"?: string;\n \"part-of-speech\"?: string;\n \"grammatical-gender\"?: string;\n \"grammatical-number\"?: string;\n \"term-type\"?: string;\n \"term-location\"?: string;\n \"geographical-usage\"?: string;\n register?: string;\n reading?: string;\n \"reading-note\"?: string;\n /** Notes for the translator. A list, and term level only: TBX-Linguist makes it a termNote. */\n \"transfer-comments\"?: string[];\n}\n\n/**\n * One term's fields, as the vocabulary names them.\n *\n * Normalized by every reader: a list field is a non-empty array of non-empty\n * strings, or absent. A string field is a non-empty string, or absent. An\n * empty value is never carried, so two sets read from different constructs\n * compare equal when they say the same thing. `definition` is required by the\n * vocabulary but absent here when a construct cannot hold one: an HTML `<dfn>`\n * names a term without defining it.\n */\nexport interface TermRecord extends TermAuxRecord {\n label: string;\n abstract?: string;\n \"alt-labels\"?: string[];\n \"hidden-labels\"?: string[];\n broader?: string[];\n narrower?: string[];\n \"related-terms\"?: string[];\n see?: string;\n \"scope-note\"?: string;\n /** A code that identifies the concept in another system. */\n notation?: string;\n \"exact-matches\"?: string[];\n \"close-matches\"?: string[];\n \"broad-matches\"?: string[];\n \"narrow-matches\"?: string[];\n \"related-matches\"?: string[];\n /** Concept level: what every language's term of this id says. */\n \"concept-entry\"?: TermAuxRecord;\n /** Per-designation detail, in source order. */\n designations?: TermDesignation[];\n /** The marked-up form of any value whose text it matches, as inline XML. */\n \"tbx-markup\"?: string[];\n}\n\n/** Every construct a term is read from. Each has exactly one reader. */\nexport const TERM_CONSTRUCTS = [\n /** The metadata channel of a one-term file, in any of the six formats. */\n \"page\",\n /** A YAML or JSON file listed under `term.manifests`. */\n \"manifest\",\n \"dita-glossentry\",\n \"dita-glossgroup\",\n \"docbook-glossary\",\n \"html-dl\",\n \"html-dfn\",\n /** Markdown and MDX. */\n \"markdown-deflist\",\n \"asciidoc-glossary\",\n \"rst-glossary\",\n /** One `termEntry` (TBX v2) or `conceptEntry` (TBX v3): a term per language it holds. */\n \"tbx-entry\",\n /** One `skos:Concept` in Turtle or JSON-LD: a term per language its `skos:prefLabel` holds. */\n \"skos\",\n] as const;\nexport type TermConstruct = (typeof TERM_CONSTRUCTS)[number];\n\n/** Where a term was read from, precisely enough to report on it and to write it back. */\nexport interface TermLocation {\n /** The file as the user would name it: posix, relative to where it was resolved. `<stdin>` for stdin. */\n file: string;\n /** Absolute path. Absent for stdin, which has nowhere to write back to. */\n path?: string;\n construct: TermConstruct;\n /** 1-based line the entry starts on. */\n line: number;\n /**\n * 1-based line of each field the reader could place. A lint finding sits on\n * its field's line; a field with no entry here sits on `line`.\n */\n fieldLines: Partial<Record<TermField, number>>;\n /**\n * The entry's UTF-16 offsets in the file's content, `[start, end)`, for a\n * body construct that is written back in place. Absent for `page` and\n * `manifest`, which are written through their own channel.\n */\n span?: { start: number; end: number };\n}\n\nexport interface Term {\n /**\n * The term's identity: the record's `id` where it has one, else the\n * construct's own identifier (`<dt id>`, `xml:id`, a DITA topic `@id`), else\n * the GitHub slug of `label`.\n */\n id: string;\n record: TermRecord;\n /** `language` from the file's metadata, or from a manifest entry, when it carries one. */\n language?: string;\n location: TermLocation;\n}\n\n// ---------------------------------------------------------------------------\n// Reading\n\n/** One loaded file, as every reader sees it. */\nexport interface TermInput {\n content: string;\n /** As `TermLocation.file`. */\n file: string;\n /** As `TermLocation.path`. */\n path?: string;\n /** The extractor that read the file (`markdown`, `mdx`, `asciidoc`, `rst`, `html`, `xml`), or `manifest`, `tbx` or `skos`. */\n format: string;\n /** The file's extracted metadata. `{}` for a manifest, which has none. */\n metadata: Record<string, unknown>;\n /** The extractor's JSON-Pointer line lookup for `metadata`. */\n lineFor: (pointer: string) => number | undefined;\n}\n\nexport interface TermReadResult {\n terms: Term[];\n /**\n * An entry the reader skipped, and why, said once per entry: a `<dt>` with no\n * term text, a glossentry with no `<glossterm>`. Reported as a notice, not a\n * finding, because no rule governs a construct manni could not read.\n */\n notices: string[];\n}\n\n/**\n * The read seam for one construct, and its in-place write where it has one.\n * Writability is derived from `apply` being present, as it is for an extractor.\n */\nexport interface TermReader {\n construct: TermConstruct;\n /** What `term formats` prints for it: `page`, `definition list`, `DITA glossentry`. */\n label: string;\n /** The `TermInput.format` values this construct appears in. */\n formats: readonly string[];\n /**\n * Every entry this construct holds in one file. `{ terms: [], notices: [] }`\n * when the file holds none, which is most files: the loader offers every file\n * of a matching format to every reader. Throws `TermError` only for a file\n * the construct claims and cannot parse.\n */\n read(this: void, input: TermInput): TermReadResult;\n /**\n * Rewrite this construct's entries in `input.content` from `terms`, which are\n * the terms this reader read from the same file, possibly edited. Returns the\n * new content. Absent for a construct that is not written in place. A\n * construct that writes a value once for terms that each carry it pushes\n * onto `conflicts` every field the terms disagree on, keeping the first's.\n */\n apply?(this: void, input: TermInput, terms: readonly Term[], conflicts?: MergeConflict[]): string;\n}\n\n// ---------------------------------------------------------------------------\n// Writing\n\n/** Every `term write -f` value. */\nexport const TERM_WRITE_FORMATS = [\n \"markdown\",\n \"mdx\",\n \"asciidoc\",\n \"rst\",\n \"html\",\n \"dita\",\n \"docbook\",\n \"tbx\",\n \"tbx3\",\n \"skos\",\n \"skos-ttl\",\n \"csv\",\n \"json\",\n \"vale\",\n] as const;\nexport type TermWriteFormat = (typeof TERM_WRITE_FORMATS)[number];\n\n/** The path decides the shape: a directory gets one file per term, a file gets every term. */\nexport type TermShape = \"file\" | \"directory\";\n\nexport interface TermTarget {\n /** Absolute. */\n path: string;\n shape: TermShape;\n}\n\nexport interface TermRenderContext {\n /**\n * The files already under the target, absolute path to content. A writer that\n * owns a directory reads it: the Vale writer finds its own marked files to\n * remove, and refuses to replace a file it did not write.\n */\n existing: ReadonlyMap<string, string>;\n}\n\nexport interface RenderedFile {\n /** Absolute. */\n path: string;\n content: string;\n}\n\nexport interface DroppedField {\n id: string;\n field: TermField;\n}\n\n/** A field the terms sharing an id disagree on, where a render that joins them on id kept the first term's value. */\nexport interface MergeConflict {\n id: string;\n /** The record key, dotted below the root: `broader`, `concept-entry.subject-field`. */\n field: string;\n}\n\n/** A term a construct holding one language left out, with its own language. */\nexport interface OtherLanguageTerm {\n id: string;\n language: string;\n}\n\nexport interface TermRender {\n files: RenderedFile[];\n /** Absolute paths the render owns and no longer produces. */\n removals: string[];\n /** Fields the target construct cannot hold, per term written. */\n dropped: DroppedField[];\n /**\n * Ids of the terms left out, in set order, because the target construct's\n * reader could not read them back: a definition list entry with no\n * definition. `[]` when every term was written.\n */\n skipped: string[];\n /**\n * Set when the target construct holds one language and the set holds more:\n * the language written, the first term's, and the terms left out, in set\n * order.\n */\n otherLanguages?: { written: string; terms: OtherLanguageTerm[] };\n /** Set when a render joins terms on id and they disagree on a field the joined entry holds once. */\n conflicts?: MergeConflict[];\n /**\n * The TBX files, as their terms name them, whose header the render did not\n * carry. Set by a TBX render; for any other, every TBX file a term came\n * from.\n */\n droppedHeaders?: string[];\n}\n\n/**\n * The render seam for one `-f` value. Pure: it computes files and never touches\n * the disk, so `--dry-run` and `--check` run the same code as a write.\n */\nexport interface TermWriter {\n format: TermWriteFormat;\n /** The shapes this format is written in. `tbx` is a file only; `vale` is a directory only. */\n shapes: readonly TermShape[];\n /** The fields a render in `shape` keeps. Everything else lands in `dropped`. */\n holds(this: void, shape: TermShape): readonly TermField[];\n /** Throws `TermError` for a target it refuses, such as a Vale style it did not write. */\n render(this: void, terms: readonly Term[], target: TermTarget, context: TermRenderContext): TermRender;\n}\n\n// ---------------------------------------------------------------------------\n// The set\n\n/** A page's claim that it is about a term: one value of `concepts:` or `graph.concepts`. */\nexport interface TermReference {\n file: string;\n line?: number;\n label: string;\n /** The field it was read from, dotted. `concepts` when absent. */\n field?: string;\n /** The page's `language`, which a label resolves in first. */\n language?: string;\n}\n\n/** A page's `graph:` block, as far as the concept hierarchy reads it. */\nexport interface TermBlock {\n file: string;\n /** The line of `graph:`. */\n line?: number;\n language?: string;\n /** The block's `label`: the concept the page is about. */\n label: string;\n /** One per value of `broader`, `narrower` and `related-concepts`, on its field's line. */\n edges: { field: \"broader\" | \"narrower\" | \"related-concepts\"; value: string; line?: number }[];\n /** The block's `alt-labels`, when it has any. */\n altLabels?: string[];\n /** The block's `definition`, when it has one. */\n definition?: string;\n}\n\nexport interface TermSet {\n terms: Term[];\n /** Every `concepts:` and `graph.concepts` value in every file the run loaded. */\n references: TermReference[];\n /** Every labelled `graph:` block in every file the run loaded. */\n blocks: TermBlock[];\n /** Every `keywords:` value on every page the run loaded but a term page, `field` `keywords`. */\n keywords?: TermReference[];\n /** Readers' notices, in load order. */\n notices: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Findings\n\n/** Every rule `term check` reports, stated once. The default severities derive from this order. */\nexport const TERM_RULES = [\n \"undefined-term\",\n \"duplicate-id\",\n \"label-collision\",\n \"alt-label-collision\",\n \"label-overlap\",\n \"dangling-reference\",\n \"broader-cycle\",\n \"see-not-empty\",\n \"missing-definition\",\n \"conflicting-matches\",\n \"asymmetric-hierarchy\",\n \"asymmetric-related\",\n \"related-in-hierarchy\",\n \"alt-label-reference\",\n \"ambiguous-alt-label\",\n \"deprecated-label\",\n \"abstract-too-long\",\n \"unused-term\",\n \"hierarchy-outside-termbase\",\n \"related-siblings\",\n \"orphan-term\",\n \"keyword-candidate\",\n] as const;\nexport type TermRule = (typeof TERM_RULES)[number];\n\n/** A rule's level: the family scale plus `off`, which drops the rule's findings. */\nexport type TermSeverity = Severity | \"off\";\n\n/** Vale's own severity scale, kept beside the family's on a lint finding. */\nexport type ValeSeverity = \"error\" | \"warning\" | \"suggestion\";\n\nexport interface TermFinding {\n /** `manni:term/<rule>` from `check`; `manni:term/prose/<Style.Rule>` from `lint`. */\n ruleId: string;\n severity: Severity;\n message: string;\n file: string;\n line?: number;\n /** The entry the finding is about, when it is about one. */\n id?: string;\n /** Set on a `check` finding. */\n rule?: TermRule;\n /** Set on a `lint` finding: the tool that raised it. */\n tool?: \"vale\";\n /** Set on a `lint` finding: the tool's own rule name, `Direct.Length`. */\n check?: string;\n /** Set on a `lint` finding: the tool's own severity, before the fold. */\n toolSeverity?: ValeSeverity;\n /**\n * The field the finding concerns: on a `lint` finding, the field the prose\n * came from; on a `check` finding, the field that breaks the rule. Absent\n * for a finding about a whole entry (`duplicate-id`, `unused-term`) or about\n * a page (`undefined-term`).\n */\n field?: TermField;\n}\n\n// ---------------------------------------------------------------------------\n// Config\n\n/** The `term:` section. Every key is optional; a docset with none needs no section. */\nexport interface TermConfig {\n manifests?: string[];\n abstractMaxLength?: number;\n baseline?: string;\n severity?: Partial<Record<TermRule, TermSeverity>>;\n allowEmpty?: boolean;\n respectGitignore?: boolean;\n /** `term.provider`: the provider `term fill` drafts with. */\n provider?: string;\n /** `term.model`. */\n model?: string;\n fill?: TermFillConfig;\n}\n\n/** `term.fill`. */\nexport interface TermFillConfig {\n /** Where new term pages go, as written: resolved from the config directory. */\n out?: string;\n confidenceThreshold?: number;\n /** Inference calls per run; `null` is unbounded. */\n maxTurns?: number | null;\n cacheDir?: string;\n crawl?: { minPages?: number };\n}\n\nexport interface LoadedTermConfig {\n config: TermConfig;\n path: string;\n dir: string;\n /** The file as the user would name it, for messages. */\n source: string;\n collections: CollectionConfig[];\n tools: ToolsConfig;\n}\n\n/** One `term.manifests` entry. */\nexport interface TermManifest {\n /** Absolute, resolved against the config directory. */\n path: string;\n /** As the config spells it, for messages. */\n written: string;\n}\n\n/** What every command core resolves before touching a file. */\nexport interface TermRun {\n config: TermConfig | null;\n /** The positional inputs, or the selected collections' `paths:` in declaration order. */\n inputs: string[];\n /** Directory `inputs` resolve from: cwd for positional inputs, the config directory for collections. */\n base: string;\n collections: CollectionConfig[];\n fromCollections: boolean;\n /** The `term.manifests` files, in the order the config lists them. */\n manifests: TermManifest[];\n /** The family `tools:`. `{}` when no config governs the run. */\n tools: ToolsConfig;\n configDir?: string;\n configPath?: string;\n configSource?: string;\n configFile?: ConfigFile;\n}\n","/**\n * The `term:` section of manni.config.yaml, and the run resolution every\n * command shares (proposal 0052). It follows cite's rules: positional inputs\n * resolve from cwd, a collection's `paths` and `term.manifests` from the config\n * directory. Unknown keys, rules or levels are errors that name what is\n * supported and never echo a value.\n *\n * Two things a reader might look for here are not `term:` keys. The document\n * set is the family `collections:` (proposal 0041). Vale's config path is the\n * family `tools.vale.config`, because Vale is not the term tool's alone.\n * Both are refused by name under `term:`, so the mistake says where the\n * setting went rather than calling it a typo.\n */\nimport { resolve } from \"node:path\";\nimport { selectCollections } from \"../../shared/collections.js\";\nimport {\n findConfigFile,\n readConfigFile,\n type ConfigFile,\n type ConfigFileOptions,\n} from \"../../shared/config-file.js\";\nimport { SEVERITIES } from \"../../shared/severity.js\";\nimport { TermError } from \"../errors.js\";\nimport {\n TERM_RULES,\n type LoadedTermConfig,\n type TermConfig,\n type TermFillConfig,\n type TermRule,\n type TermRun,\n type TermSeverity,\n} from \"../types.js\";\n\nexport const TERM_SECTION = \"term\";\n\nexport const DEFAULT_TERM_BASELINE_PATH = \".manni-term-baseline.json\";\n\nexport const DEFAULT_ABSTRACT_MAX_LENGTH = 60;\n\n/** The keys `term:` accepts, in the order the reference table lists them. */\nconst CONFIG_KEYS: readonly (keyof TermConfig)[] = [\n \"manifests\",\n \"abstractMaxLength\",\n \"baseline\",\n \"severity\",\n \"allowEmpty\",\n \"respectGitignore\",\n \"provider\",\n \"model\",\n \"fill\",\n];\n\n/** The keys `term.fill` accepts, and `term.fill.crawl`. */\nconst FILL_KEYS: readonly string[] = [\"out\", \"confidenceThreshold\", \"maxTurns\", \"cacheDir\", \"crawl\"];\nconst CRAWL_KEYS: readonly string[] = [\"minPages\"];\n\n/** `term.fill` when a key is unset. */\nexport const DEFAULT_FILL_CONFIDENCE = 0.7;\nexport const DEFAULT_FILL_CACHE_DIR = \".manni/term/cache\";\nexport const DEFAULT_CRAWL_MIN_PAGES = 2;\n\n/** Keys that belong to the family, refused by name with where they live. */\nconst COLLECTION_KEYS: readonly string[] = [\"paths\", \"exclude\"];\nconst TOOL_KEYS: readonly string[] = [\"vale\"];\n\n/** The family scale, least severe first as the reference spells it, then `off`. */\nconst SEVERITY_LEVELS: readonly TermSeverity[] = [...SEVERITIES, \"off\"];\n\nconst CONFIG_FILE: ConfigFileOptions = {\n section: TERM_SECTION,\n legacyNames: [],\n toError: (message) => new TermError(message),\n};\n\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isLevel(value: unknown): value is TermSeverity {\n return typeof value === \"string\" && (SEVERITY_LEVELS as readonly string[]).includes(value);\n}\n\nfunction isTermRule(value: string): value is TermRule {\n return (TERM_RULES as readonly string[]).includes(value);\n}\n\nfunction rejectUnknownKeys(\n obj: Record<string, unknown>,\n allowed: readonly string[],\n where: string,\n source: string,\n): void {\n for (const key of Object.keys(obj)) {\n if (!allowed.includes(key)) {\n throw new TermError(\n `Unknown key \"${key}\" under ${where}: in ${source}. Supported keys: ${allowed.join(\", \")}.`,\n );\n }\n }\n}\n\n/**\n * Every type error names the key and the type it wanted, and nothing else. A\n * value can be a secret pasted under the wrong key, and quoting it would put it\n * in a CI log.\n */\nfunction wrongType(key: string, expected: string, source: string): TermError {\n return new TermError(`term.${key} in ${source} must be ${expected}.`);\n}\n\nfunction asBoolean(value: unknown, key: string, source: string): boolean {\n if (typeof value !== \"boolean\") throw wrongType(key, \"a boolean\", source);\n return value;\n}\n\nfunction asString(value: unknown, key: string, source: string): string {\n if (typeof value !== \"string\") throw wrongType(key, \"a string\", source);\n return value;\n}\n\nfunction asStringList(value: unknown, key: string, source: string): string[] {\n if (\n !Array.isArray(value) ||\n !value.every((item): item is string => typeof item === \"string\" && item.trim() !== \"\")\n ) {\n throw wrongType(key, \"a list of non-empty strings\", source);\n }\n return value;\n}\n\nfunction asNonNegativeInteger(value: unknown, key: string, source: string): number {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 0) {\n throw wrongType(key, \"a non-negative integer\", source);\n }\n return value;\n}\n\nfunction parseFill(value: unknown, source: string): TermFillConfig {\n if (!isMapping(value)) throw wrongType(\"fill\", \"a mapping\", source);\n rejectUnknownKeys(value, FILL_KEYS, \"term.fill\", source);\n const fill: TermFillConfig = {};\n if (value.out !== undefined) fill.out = asString(value.out, \"fill.out\", source);\n if (value.cacheDir !== undefined) fill.cacheDir = asString(value.cacheDir, \"fill.cacheDir\", source);\n const threshold = value.confidenceThreshold;\n if (threshold !== undefined) {\n if (typeof threshold !== \"number\" || !(threshold >= 0 && threshold <= 1)) {\n throw wrongType(\"fill.confidenceThreshold\", \"a number from 0 to 1\", source);\n }\n fill.confidenceThreshold = threshold;\n }\n const turns = value.maxTurns;\n if (turns !== undefined) {\n if (turns !== null && (typeof turns !== \"number\" || !Number.isInteger(turns) || turns < 1)) {\n throw wrongType(\"fill.maxTurns\", \"a positive integer or null\", source);\n }\n fill.maxTurns = turns;\n }\n if (value.crawl !== undefined) {\n if (!isMapping(value.crawl)) throw wrongType(\"fill.crawl\", \"a mapping\", source);\n rejectUnknownKeys(value.crawl, CRAWL_KEYS, \"term.fill.crawl\", source);\n const minPages = value.crawl.minPages;\n fill.crawl = {};\n if (minPages !== undefined) {\n if (typeof minPages !== \"number\" || !Number.isInteger(minPages) || minPages < 1) {\n throw wrongType(\"fill.crawl.minPages\", \"a positive integer\", source);\n }\n fill.crawl.minPages = minPages;\n }\n }\n return fill;\n}\n\nfunction parseSeverity(value: unknown, source: string): Partial<Record<TermRule, TermSeverity>> {\n if (!isMapping(value)) throw wrongType(\"severity\", \"a mapping\", source);\n rejectUnknownKeys(value, TERM_RULES, \"term.severity\", source);\n const severity: Partial<Record<TermRule, TermSeverity>> = {};\n for (const [rule, level] of Object.entries(value)) {\n if (!isTermRule(rule)) continue;\n if (!isLevel(level)) {\n // A level is not a secret, so a string one is quoted back: `eror` reads\n // as the typo it is. Anything else is described without its value.\n const quoted = typeof level === \"string\" ? ` \"${level}\"` : \"\";\n throw new TermError(\n `${source}: term.severity.${rule}${quoted} is not a level. Expected ${SEVERITY_LEVELS.join(\" | \")}.`,\n );\n }\n severity[rule] = level;\n }\n return severity;\n}\n\n/**\n * Validate the `term:` slice of a family file. `raw` is `null` for an empty\n * section, which is the same as no keys at all.\n */\nexport function parseTermConfig(raw: unknown, source: string): TermConfig {\n if (raw == null) return {};\n if (!isMapping(raw)) {\n throw new TermError(`term: in ${source} must be a mapping.`);\n }\n // Before the unknown-key check, which would call a family setting a typo.\n for (const key of COLLECTION_KEYS) {\n if (Object.hasOwn(raw, key)) {\n throw new TermError(\n `${source}: term does not carry \"${key}\". Name a collection under collections:.`,\n );\n }\n }\n for (const key of TOOL_KEYS) {\n if (Object.hasOwn(raw, key)) {\n throw new TermError(\n `${source}: term does not carry \"${key}\". Vale's settings live under tools.${key}.`,\n );\n }\n }\n rejectUnknownKeys(raw, CONFIG_KEYS, \"term\", source);\n\n const config: TermConfig = {};\n if (raw.manifests !== undefined) config.manifests = asStringList(raw.manifests, \"manifests\", source);\n if (raw.abstractMaxLength !== undefined) {\n config.abstractMaxLength = asNonNegativeInteger(raw.abstractMaxLength, \"abstractMaxLength\", source);\n }\n if (raw.baseline !== undefined) config.baseline = asString(raw.baseline, \"baseline\", source);\n if (raw.severity !== undefined) config.severity = parseSeverity(raw.severity, source);\n if (raw.allowEmpty !== undefined) config.allowEmpty = asBoolean(raw.allowEmpty, \"allowEmpty\", source);\n if (raw.respectGitignore !== undefined) {\n config.respectGitignore = asBoolean(raw.respectGitignore, \"respectGitignore\", source);\n }\n if (raw.provider !== undefined) config.provider = asString(raw.provider, \"provider\", source);\n if (raw.model !== undefined) config.model = asString(raw.model, \"model\", source);\n if (raw.fill !== undefined) config.fill = parseFill(raw.fill, source);\n return config;\n}\n\n/** The family file, found by discovery or named with `-c`, before its `term:` slice is parsed. */\nexport function readTermConfigFile(\n explicitPath: string | undefined,\n cwd: string,\n): Promise<ConfigFile | null> {\n return explicitPath\n ? readConfigFile(explicitPath, cwd, CONFIG_FILE)\n : findConfigFile(cwd, CONFIG_FILE);\n}\n\nfunction toLoaded(file: ConfigFile): LoadedTermConfig {\n return {\n config: parseTermConfig(file.value, file.source),\n path: file.path,\n dir: file.dir,\n source: file.source,\n collections: file.collections,\n tools: file.tools,\n };\n}\n\n/** Load the config from an explicit path, or by discovery. `null` when discovery finds nothing. */\nexport async function loadTermConfig(\n explicitPath?: string,\n cwd: string = process.cwd(),\n): Promise<LoadedTermConfig | null> {\n const file = await readTermConfigFile(explicitPath, cwd);\n return file === null ? null : toLoaded(file);\n}\n\nexport interface TermRunOptions {\n cwd: string;\n /** `-c/--config`. */\n configPath?: string;\n /** Skip discovery and run on the built-in defaults. */\n noConfig?: boolean;\n /** Positional inputs; empty means fall back to the selected collections' `paths:`. */\n inputs: string[];\n /** `--collection <name>`, repeatable. Empty means every declared collection. */\n collection?: string[];\n onConfigLoaded?: (info: { path: string; dir: string }) => void;\n}\n\n/** The stdin token, repeated so this module does not depend on the file loader. */\nconst STDIN = \"-\";\n\n/**\n * Settle what every command core needs before it touches a file: which config\n * governs the run, what to resolve and from where, the manifests, and the\n * family's tools.\n */\nexport async function resolveTermRun(opts: TermRunOptions): Promise<TermRun> {\n const cwd = resolve(opts.cwd);\n\n // The same two sentences meta, a11y and cite use. Stdin is one more input\n // rather than a path, so it rides beside the flag.\n const wanted = opts.collection ?? [];\n if (wanted.length > 0 && opts.inputs.some((input) => input !== STDIN)) {\n throw new TermError(\n \"--collection selects a configured collection; it cannot be combined with paths.\",\n );\n }\n\n const file = opts.noConfig ? null : await readTermConfigFile(opts.configPath, cwd);\n const loaded = file === null ? null : toLoaded(file);\n if (wanted.length > 0 && loaded === null) {\n throw new TermError(\"--collection needs a config file to select from.\");\n }\n if (loaded) opts.onConfigLoaded?.({ path: loaded.path, dir: loaded.dir });\n\n const collections = loaded\n ? selectCollections(loaded.collections, wanted, loaded.source, (message) => new TermError(message))\n : [];\n\n const fromCollections = opts.inputs.length === 0;\n const inputs = fromCollections ? collections.flatMap((c) => c.paths) : opts.inputs;\n const base = fromCollections && inputs.length > 0 && loaded ? loaded.dir : cwd;\n\n const manifests = loaded\n ? (loaded.config.manifests ?? []).map((written) => ({ path: resolve(loaded.dir, written), written }))\n : [];\n\n return {\n config: loaded ? loaded.config : null,\n inputs,\n base,\n collections,\n fromCollections,\n manifests,\n tools: loaded ? loaded.tools : {},\n ...(loaded ? { configDir: loaded.dir, configPath: loaded.path, configSource: loaded.source } : {}),\n ...(file === null ? {} : { configFile: file }),\n };\n}\n","/** What every interchange writer shares: the dropped-field report and the shape guard. */\nimport { TermError } from \"../../errors.js\";\nimport {\n TERM_FIELDS,\n type DroppedField,\n type Term,\n type TermField,\n type TermShape,\n type TermTarget,\n type TermWriteFormat,\n} from \"../../types.js\";\n\n/** The language a term without one is written as. */\nexport const DEFAULT_LANGUAGE = \"en\";\n\n/** A term's language as written, or the default. */\nexport function languageOf(term: Term): string {\n return term.language ?? DEFAULT_LANGUAGE;\n}\n\n/** A term's language as it is compared: ignoring case. */\nexport function languageKey(term: Term): string {\n return languageOf(term).toLowerCase();\n}\n\n/** Whether the set holds terms in more than one language. */\nexport function isMultilingual(terms: readonly Term[]): boolean {\n return new Set(terms.map(languageKey)).size > 1;\n}\n\n/** One entry per term per field the term carries and `held` does not include, in term then field order. */\nexport function droppedFields(terms: readonly Term[], held: readonly TermField[]): DroppedField[] {\n const dropped: DroppedField[] = [];\n for (const term of terms) {\n for (const field of TERM_FIELDS) {\n if (term.record[field] !== undefined && !held.includes(field)) dropped.push({ id: term.id, field });\n }\n }\n return dropped;\n}\n\n/** Throws when a writer is asked for a shape it does not render. The command checks `shapes` first; this is the backstop. */\nexport function requireShape(format: TermWriteFormat, target: TermTarget, shape: TermShape): void {\n if (target.shape === shape) return;\n throw new TermError(\n shape === \"file\"\n ? `-f ${format} writes one file, not a directory. Pass -o <file>.`\n : `-f ${format} writes a styles directory, not a file. Pass -o <styles directory>.`,\n );\n}\n","/**\n * What every `manni term` command core shares: resolve the run, load the set,\n * and say the readers' notices. Kept free of commander and of stdout, so a core\n * is called directly by its tests; the CLI reads stdin once and hands it in.\n */\nimport { existsSync } from \"node:fs\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { valeConfigPath } from \"../../shared/tools.js\";\nimport { resolveTermRun } from \"../core/config.js\";\nimport { loadTermSet } from \"../core/load-set.js\";\nimport { TermError } from \"../errors.js\";\nimport type { TermInput, TermReader, TermRun, TermSet } from \"../types.js\";\n\n/** The inputs and flags `list`, `get`, `check`, `lint` and `write` share. */\nexport interface TermCommandOptions {\n /** Default `process.cwd()`. */\n cwd?: string;\n /** Positional `[paths...]`; `-` is stdin. Empty falls back to the collections. */\n inputs: string[];\n /** Stdin's content, read once by the CLI when `-` is among the inputs. */\n stdin?: string;\n /** `--as <format>`. */\n as?: string;\n /** `--exclude <glob>`, repeatable. */\n exclude?: string[];\n /** `--ext <list>`, already split. */\n exts?: string[];\n /** `--allow-empty`. */\n allowEmpty?: boolean;\n /** `--no-gitignore`. */\n noGitignore?: boolean;\n /** `--collection <name>`, repeatable. */\n collection?: string[];\n /** `-c, --config <path>`. */\n configPath?: string;\n /** Readers' notices and the loader's. */\n onNotice?: (message: string) => void;\n /** The readers to offer files to. Tests hand in their own. */\n readers?: readonly TermReader[];\n /** Every page the run extracted, as it was read. */\n onPage?: (input: TermInput) => void;\n}\n\nexport interface LoadedTerms {\n cwd: string;\n run: TermRun;\n set: TermSet;\n}\n\nexport async function loadTerms(opts: TermCommandOptions): Promise<LoadedTerms> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const run = await resolveTermRun({\n cwd,\n inputs: opts.inputs,\n ...(opts.configPath === undefined ? {} : { configPath: opts.configPath }),\n ...(opts.collection === undefined ? {} : { collection: opts.collection }),\n });\n const set = await loadSet(run, opts);\n return { cwd, run, set };\n}\n\n/** Load the set a resolved run names, and say the readers' notices. */\nexport async function loadSet(run: TermRun, opts: TermCommandOptions): Promise<TermSet> {\n // A collection's `exclude:` shapes the collection, so it applies when the\n // inputs came from the collections and never to a path the operator typed.\n const exclude = [\n ...new Set([\n ...(opts.exclude ?? []),\n ...(run.fromCollections ? run.collections.flatMap((c) => c.exclude) : []),\n ]),\n ];\n const set = await loadTermSet({\n run,\n exclude,\n ...(opts.exts === undefined ? {} : { exts: opts.exts }),\n ...(opts.allowEmpty === true ? { allowEmpty: true } : {}),\n ...(opts.noGitignore === true ? { noGitignore: true } : {}),\n ...(opts.stdin === undefined ? {} : { stdin: opts.stdin }),\n ...(opts.as === undefined ? {} : { as: opts.as }),\n ...(opts.onNotice === undefined ? {} : { onNotice: opts.onNotice }),\n ...(opts.readers === undefined ? {} : { readers: opts.readers }),\n ...(opts.onPage === undefined ? {} : { onPage: opts.onPage }),\n });\n for (const message of set.notices) opts.onNotice?.(message);\n return set;\n}\n\n/**\n * `value` when it is one of `allowed`, else the family's unknown-format\n * refusal, naming every value in declaration order.\n */\nexport function formatChoice<T extends string>(value: string, allowed: readonly T[]): T {\n const found = allowed.find((candidate) => candidate === value);\n if (found === undefined) {\n throw new TermError(`unknown format \"${value}\". Expected ${allowed.join(\" | \")}.`);\n }\n return found;\n}\n\n/** A path as a person standing in `cwd` would type it: relative, posix. An already-relative label is kept. */\nexport function displayPath(path: string, cwd: string): string {\n if (!isAbsolute(path)) return path;\n const rel = relative(cwd, path);\n return (rel === \"\" ? \".\" : rel).replaceAll(\"\\\\\", \"/\");\n}\n\n/**\n * Vale's config file for the run, absolute, or `undefined` when none is set\n * and Vale finds its own. A configured file that is not there is refused here,\n * before Vale reads it as a different complaint.\n */\nexport function valeConfigFor(run: TermRun): string | undefined {\n if (run.configDir === undefined) return undefined;\n const path = valeConfigPath(run.tools, run.configDir);\n if (path !== undefined && !existsSync(path)) {\n const source = run.configSource ?? \"manni.config.yaml\";\n throw new TermError(`${source}: tools.vale.config \"${run.tools.vale?.config ?? path}\" does not exist.`);\n }\n return path;\n}\n\n/** `1 term`, `2 terms`. */\nexport function plural(n: number, one: string, many = `${one}s`): string {\n return `${String(n)} ${n === 1 ? one : many}`;\n}\n","/**\n * Load a term set: resolve the run's files, extract each one's metadata with\n * meta's extractor, and offer it to every reader of its format. Every command\n * that reads terms goes through here, so a construct added as a reader is read\n * by `list`, `get`, `check`, `lint` and `write` at once.\n *\n * Every loaded file contributes its references too, term file or not: a\n * guide's `concepts:` is what `undefined-term` and `unused-term` are about.\n * Its `graph:` block joins the hierarchy `broader-cycle` reads (proposal 0086).\n *\n * A `.ttl` or `.jsonld` file is SKOS when it is named or listed under\n * `term.manifests`, and never when a walk passes it: the graph's own output is\n * Turtle, and walking it would read the graph back into the termbase.\n *\n * A file that cannot be read or parsed is an error, not a skip. A term set that\n * quietly lost a file would pass `check` on what was left, and report the\n * missing terms as undefined on pages that spell them correctly.\n */\nimport { readFile } from \"node:fs/promises\";\nimport { extname, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { DataFactory, Writer, type Quad } from \"n3\";\nimport {\n STDIN_LABEL,\n STDIN_TOKEN,\n assertNonEmpty,\n extractorByName,\n extractorForExtension,\n gitignoreOptions,\n resolveTargetSet,\n supportedExtensions,\n} from \"../../meta/internal.js\";\nimport { errorMessage } from \"../../shared/errors.js\";\nimport { CONCEPT_FIELDS, type FieldPath, fieldPointer, valueAt } from \"../../shared/reference-fields.js\";\nimport { TermError } from \"../errors.js\";\nimport type { TermBlock, TermInput, TermReader, TermReference, TermRun, TermSet } from \"../types.js\";\nimport { TERM_READERS, readersForFormat } from \"./readers/index.js\";\n\n/** The `TermInput.format` a manifest is offered as. */\nexport const MANIFEST_FORMAT = \"manifest\";\n\n/** The extensions a file named on the command line is read as a manifest by. */\nconst MANIFEST_EXTENSIONS: ReadonlySet<string> = new Set([\".yaml\", \".yml\", \".json\"]);\n\n/** The `TermInput.format` a TBX file is offered as, and the `--as` value that reads stdin as one. */\nexport const TBX_FORMAT = \"tbx\";\n\n/** The extension a TBX file is read by, named or walked. It is the term loader's, not an extractor's. */\nconst TBX_EXTENSION = \".tbx\";\n\n/** A TBX file carries no page metadata either; its reader parses the content itself. */\nexport function tbxInput(content: string, file: string, path?: string): TermInput {\n return { content, file, ...(path === undefined ? {} : { path }), format: TBX_FORMAT, metadata: {}, lineFor: () => undefined };\n}\n\n/** The `TermInput.format` a SKOS file is offered as, and the `--as` value that reads stdin as one. */\nexport const SKOS_FORMAT = \"skos\";\n\n/** The extensions a named or listed file is read as SKOS by. A walk never keeps them. */\nconst SKOS_EXTENSIONS: ReadonlySet<string> = new Set([\".ttl\", \".jsonld\"]);\n\nfunction isSkos(file: string): boolean {\n return SKOS_EXTENSIONS.has(extname(file).toLowerCase());\n}\n\n/** One quad of `jsonld`'s RDF dataset, as far as it is read here. */\ninterface JsonLdTerm {\n termType: string;\n value: string;\n language?: string;\n datatype?: { value: string };\n}\n\nconst XSD_STRING = \"http://www.w3.org/2001/XMLSchema#string\";\n\n/**\n * JSON-LD as N-Quads, which the SKOS reader parses as it parses Turtle. A\n * remote `@context` is refused, not fetched: reading a termbase never\n * touches the network.\n */\nasync function jsonLdToNQuads(\n content: string,\n file: string,\n path: string | undefined,\n parsed?: unknown,\n): Promise<string> {\n let document: unknown = parsed;\n if (document === undefined) {\n try {\n document = JSON.parse(content);\n } catch (error) {\n throw new TermError(`${file}: could not be read as SKOS: ${errorMessage(error)}`);\n }\n }\n const { default: jsonld } = await import(\"jsonld\");\n let remote: string | undefined;\n let dataset: { subject: JsonLdTerm; predicate: JsonLdTerm; object: JsonLdTerm }[];\n try {\n dataset = (await jsonld.toRDF(document as Parameters<typeof jsonld.toRDF>[0], {\n base: pathToFileURL(path ?? resolve(file)).href,\n documentLoader: (url: string) => {\n remote = url;\n return Promise.reject(new Error(`${url} is not fetched`));\n },\n })) as unknown as typeof dataset;\n } catch (error) {\n if (remote !== undefined) {\n throw new TermError(\n `${file}: names the remote @context ${remote}, which is not fetched. Inline the context to read it.`,\n );\n }\n throw new TermError(`${file}: could not be read as SKOS: ${errorMessage(error)}`);\n }\n const node = (t: JsonLdTerm) =>\n t.termType === \"BlankNode\" ? DataFactory.blankNode(t.value.replace(/^_:/, \"\")) : DataFactory.namedNode(t.value);\n const literal = (t: JsonLdTerm) =>\n DataFactory.literal(\n t.value,\n t.language !== undefined && t.language !== \"\" ? t.language : DataFactory.namedNode(t.datatype?.value ?? XSD_STRING),\n );\n // Every quad lands in the default graph: SKOS vocabularies keep their\n // concepts there, and a named graph's name carries no term field.\n const quads: Quad[] = dataset.map((q) =>\n DataFactory.quad(\n node(q.subject),\n DataFactory.namedNode(q.predicate.value),\n q.object.termType === \"Literal\" ? literal(q.object) : node(q.object),\n ),\n );\n return new Writer({ format: \"N-Quads\" }).quadsToString(quads);\n}\n\n/** The parsed JSON, or `undefined` when the text is not JSON. Parsed once, and reused. */\nfunction parseJson(content: string): unknown {\n try {\n return JSON.parse(content) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/**\n * A SKOS file as the reader takes it: Turtle as written, JSON-LD expanded to\n * N-Quads first. `.jsonld` is JSON-LD and `.ttl` is Turtle; stdin, which has\n * no extension, is JSON-LD when it parses as JSON. A first byte alone cannot\n * tell them apart, because Turtle may open a blank node with `[`.\n */\nexport async function skosInput(content: string, file: string, path?: string): Promise<TermInput> {\n const ext = extname(file).toLowerCase();\n const parsed = ext === \".ttl\" ? undefined : parseJson(content);\n const jsonLd = ext === \".jsonld\" || parsed !== undefined;\n return {\n content: jsonLd ? await jsonLdToNQuads(content, file, path, parsed) : content,\n file,\n ...(path === undefined ? {} : { path }),\n format: SKOS_FORMAT,\n metadata: {},\n lineFor: () => undefined,\n };\n}\n\n/** What a directory or glob walk keeps when `--ext` is not given: every extractor's extensions, and TBX. */\nfunction defaultExtensions(): string[] {\n return [...supportedExtensions(), TBX_EXTENSION];\n}\n\n/** A manifest carries no page metadata; its reader parses the content itself. */\nfunction manifestInput(content: string, file: string, path: string): TermInput {\n return { content, file, path, format: MANIFEST_FORMAT, metadata: {}, lineFor: () => undefined };\n}\n\nexport interface LoadTermSetOptions {\n run: TermRun;\n /** Stdin's content, when `-` is among the run's inputs. */\n stdin?: string;\n /** `--as <format>`, which stdin needs. */\n as?: string;\n /** `--exclude <glob>`, repeatable. */\n exclude?: string[];\n /** `--ext <list>`: the extensions a directory or glob walk keeps. */\n exts?: string[];\n /** `--allow-empty`: wins over `term.allowEmpty`. */\n allowEmpty?: boolean;\n /** `--no-gitignore`. */\n noGitignore?: boolean;\n onNotice?: (message: string) => void;\n /** The readers to offer files to. Tests hand in their own. */\n readers?: readonly TermReader[];\n /** Every page the run extracted, term page or not, as it was read. */\n onPage?: (input: TermInput) => void;\n}\n\n/** One value or a list of them, as `concepts:` is spelled. Anything else contributes nothing. */\nfunction labelsOf(value: unknown): string[] {\n if (typeof value === \"string\") return value.trim() === \"\" ? [] : [value];\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\" && item.trim() !== \"\");\n }\n return [];\n}\n\n/** The page's `language`, which its names resolve in first. */\nfunction languageOf(input: TermInput): { language?: string } {\n const language = input.metadata[\"language\"];\n return typeof language === \"string\" && language !== \"\" ? { language } : {};\n}\n\nfunction lineAt(input: TermInput, path: FieldPath): { line?: number } {\n const line = input.lineFor(fieldPointer(path));\n return line === undefined ? {} : { line };\n}\n\nfunction referencesOf(input: TermInput): TermReference[] {\n const references: TermReference[] = [];\n for (const path of CONCEPT_FIELDS) {\n for (const label of labelsOf(valueAt(input.metadata, path))) {\n references.push({\n file: input.file,\n label,\n ...lineAt(input, path),\n ...(path.length > 1 ? { field: path.join(\".\") } : {}),\n ...languageOf(input),\n });\n }\n }\n return references;\n}\n\nconst BLOCK_HIERARCHY_FIELDS = [\"broader\", \"narrower\", \"related-concepts\"] as const;\n\n/** The page's `graph:` block, when it has a label: the concept it is about, and that concept's place in the hierarchy. */\nfunction blocksOf(input: TermInput): TermBlock[] {\n const label = valueAt(input.metadata, [\"graph\", \"label\"]);\n if (typeof label !== \"string\" || label.trim() === \"\") return [];\n const edges = BLOCK_HIERARCHY_FIELDS.flatMap((field) =>\n labelsOf(valueAt(input.metadata, [\"graph\", field])).map((value) => ({\n field,\n value,\n ...lineAt(input, [\"graph\", field]),\n })),\n );\n const altLabels = labelsOf(valueAt(input.metadata, [\"graph\", \"alt-labels\"]));\n const definition = valueAt(input.metadata, [\"graph\", \"definition\"]);\n return [\n {\n file: input.file,\n ...lineAt(input, [\"graph\"]),\n ...languageOf(input),\n label,\n edges,\n ...(altLabels.length > 0 ? { altLabels } : {}),\n ...(typeof definition === \"string\" && definition.trim() !== \"\" ? { definition } : {}),\n },\n ];\n}\n\n/** A page's free `keywords:`, which `keyword-candidate` reads. A term page's are about the term, so it has none. */\nfunction keywordsOf(input: TermInput): TermReference[] {\n const type = input.metadata[\"type\"];\n if (type === \"term\" || type === \"term-set\") return [];\n return labelsOf(input.metadata[\"keywords\"]).map((label) => ({\n file: input.file,\n ...lineAt(input, [\"keywords\"]),\n label,\n field: \"keywords\",\n ...languageOf(input),\n }));\n}\n\n/** What every page contributes beside its terms: its references, its graph block and its keywords. */\nfunction pageFacts(input: TermInput, set: TermSet, onPage?: (input: TermInput) => void): void {\n set.references.push(...referencesOf(input));\n set.blocks.push(...blocksOf(input));\n (set.keywords ??= []).push(...keywordsOf(input));\n onPage?.(input);\n}\n\nfunction read(input: TermInput, readers: readonly TermReader[], set: TermSet): void {\n for (const reader of readersForFormat(input.format, readers)) {\n const result = reader.read(input);\n set.terms.push(...result.terms);\n set.notices.push(...result.notices);\n }\n}\n\nexport function extractInput(\n content: string,\n file: string,\n path: string | undefined,\n format: string,\n): TermInput {\n const extractor = extractorByName(format);\n if (extractor === undefined) {\n throw new TermError(`${file}: no reader for format \"${format}\".`);\n }\n let extracted;\n try {\n extracted = extractor.extract(content, path ?? file);\n } catch (error) {\n throw new TermError(`${file}: could not be read as ${format}: ${errorMessage(error)}`);\n }\n return {\n content,\n file,\n ...(path === undefined ? {} : { path }),\n format: extractor.name,\n metadata: extracted.data,\n lineFor: extracted.lineFor,\n };\n}\n\nasync function readInput(path: string, file: string): Promise<string> {\n try {\n return await readFile(path, \"utf8\");\n } catch (error) {\n throw new TermError(`${file}: could not be read: ${errorMessage(error)}`);\n }\n}\n\nexport async function loadTermSet(opts: LoadTermSetOptions): Promise<TermSet> {\n const { run } = opts;\n const readers = opts.readers ?? TERM_READERS;\n const exclude = opts.exclude ?? [];\n const allowEmpty = opts.allowEmpty ?? run.config?.allowEmpty === true;\n\n const usingStdin = run.inputs.includes(STDIN_TOKEN);\n const inputs = run.inputs.filter((input) => input !== STDIN_TOKEN);\n if (usingStdin && (opts.as === undefined || opts.as === \"\")) {\n throw new TermError(\"reading stdin needs --as <format>.\");\n }\n if (inputs.length === 0 && !usingStdin && run.manifests.length === 0) {\n throw new TermError(\n \"No files to read. Pass paths/globs, or declare a collection under `collections:` in manni.config.yaml.\",\n );\n }\n\n const set: TermSet = { terms: [], references: [], blocks: [], keywords: [], notices: [] };\n\n if (inputs.length > 0) {\n const { files, gitignoreSkipped, named } = await resolveTargetSet({\n inputs,\n cwd: run.base,\n exclude,\n exts: opts.exts ?? defaultExtensions(),\n allowEmpty,\n ...gitignoreOptions({\n ...(opts.noGitignore === true ? { flag: false } : {}),\n ...(run.config?.respectGitignore === undefined\n ? {}\n : { configured: run.config.respectGitignore }),\n ...(opts.onNotice ? { onNotice: opts.onNotice } : {}),\n }),\n });\n assertNonEmpty({\n files,\n inputs,\n usingStdin,\n allowEmpty,\n exclude,\n ...(opts.exts === undefined ? {} : { exts: opts.exts }),\n gitignoreSkipped,\n action: \"read\",\n });\n\n const namedFiles = new Set(named);\n for (const file of files) {\n const path = resolve(run.base, file);\n // A manifest is read when it is named, never when a walk passes it: a\n // directory of pages can hold YAML and JSON that are not terms at all.\n if (namedFiles.has(file) && MANIFEST_EXTENSIONS.has(extname(file).toLowerCase())) {\n read(manifestInput(await readInput(path, file), file, path), readers, set);\n continue;\n }\n if (namedFiles.has(file) && isSkos(file)) {\n read(await skosInput(await readInput(path, file), file, path), readers, set);\n continue;\n }\n if (extname(file).toLowerCase() === TBX_EXTENSION) {\n read(tbxInput(await readInput(path, file), file, path), readers, set);\n continue;\n }\n const extractor = extractorForExtension(extname(file));\n // A file the walk returned always has a known extension; a path typed\n // with another one is refused here rather than read as nothing.\n if (extractor === undefined) {\n throw new TermError(`${file}: no reader for its extension. Pass --as <format> through stdin to read it.`);\n }\n const input = extractInput(await readInput(path, file), file, path, extractor.name);\n pageFacts(input, set, opts.onPage);\n read(input, readers, set);\n }\n }\n\n if (usingStdin && opts.as?.toLowerCase() === SKOS_FORMAT) {\n read(await skosInput(opts.stdin ?? \"\", STDIN_LABEL), readers, set);\n } else if (usingStdin && opts.as !== undefined) {\n const input =\n opts.as.toLowerCase() === TBX_FORMAT\n ? tbxInput(opts.stdin ?? \"\", STDIN_LABEL)\n : extractInput(opts.stdin ?? \"\", STDIN_LABEL, undefined, opts.as);\n pageFacts(input, set, opts.onPage);\n read(input, readers, set);\n }\n\n for (const { path, written } of run.manifests) {\n let content: string;\n try {\n content = await readFile(path, \"utf8\");\n } catch {\n const source = run.configSource ?? \"manni.config.yaml\";\n throw new TermError(`${source}: term.manifests \"${written}\" does not exist.`);\n }\n if (isSkos(path)) {\n read(await skosInput(content, path, path), readers, set);\n continue;\n }\n const isTbx = extname(path).toLowerCase() === TBX_EXTENSION;\n read(isTbx ? tbxInput(content, path, path) : manifestInput(content, path, path), readers, set);\n }\n\n if (set.terms.length === 0 && !allowEmpty) {\n throw new TermError(\n \"no terms found. A term is a page declaring type: term, or an entry in a file declaring type: term-set.\",\n );\n }\n return set;\n}\n","/**\n * The small pieces every document writer and every in-place write shares:\n * escaping, a definition's paragraphs, the acronym test, and indentation.\n */\nimport type { Term } from \"../../types.js\";\n\nexport function xmlText(value: string): string {\n return value.replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\n\nexport function xmlAttribute(value: string): string {\n return xmlText(value).replaceAll('\"', \""\");\n}\n\n/**\n * A definition's paragraphs, each as its lines: paragraphs split on blank\n * lines, each line trimmed, empty lines and paragraphs dropped. Every body\n * reader reads a definition back the same way, joining a paragraph's lines\n * with one space.\n */\nexport function paragraphsOf(definition: string | undefined): string[][] {\n if (definition === undefined) return [];\n return definition\n .split(/\\r?\\n[ \\t]*\\r?\\n/)\n .map((paragraph) =>\n paragraph\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line !== \"\"),\n )\n .filter((lines) => lines.length > 0);\n}\n\n/** A paragraph as one line, for markup whose readers collapse whitespace anyway. */\nexport function paragraphText(lines: readonly string[]): string {\n return lines.join(\" \");\n}\n\n/** Whether an alt-label is written as an acronym: it has letters, and none of them is lowercase. */\nexport function isAcronym(label: string): boolean {\n return /\\p{L}/u.test(label) && !/\\p{Ll}/u.test(label);\n}\n\n/** The language every term carries, when they all carry the same one. A file holds one language. */\nexport function sharedLanguage(terms: readonly Term[]): string | undefined {\n const [first] = terms;\n const language = first?.language;\n if (language === undefined) return undefined;\n return terms.every((t) => t.language === language) ? language : undefined;\n}\n\n/**\n * `text`, whose lines are at indentation zero, placed at `indent`: the first\n * line as is (it lands where the old entry started), every later non-empty\n * line prefixed, and lines joined with `eol`.\n */\nexport function reindent(text: string, indent: string, eol: string): string {\n return text\n .split(\"\\n\")\n .map((line, i) => (i === 0 || line === \"\" ? line : `${indent}${line}`))\n .join(eol);\n}\n\n/** Lines as a file: `\\n`-joined with one trailing newline. */\nexport function fileOf(lines: readonly string[]): string {\n return lines.map((line) => `${line}\\n`).join(\"\");\n}\n","/**\n * One entry of each many-per-file construct, as text. The document writers\n * assemble files from these, and each construct's reader splices the same\n * text back in place, so an entry a render wrote and an entry an in-place\n * write replaced are byte for byte the same.\n *\n * Each returns the entry's lines at indentation zero, `\\n`-joined, with no\n * trailing newline. The caller indents and terminates.\n */\nimport type { Term, TermField, TermRecord } from \"../../types.js\";\nimport { isAcronym, paragraphText, paragraphsOf, xmlAttribute, xmlText } from \"./markup.js\";\n\n/** What a definition list, `[glossary]` list, `.. glossary::` or `<dl>` can say. */\nexport const LIST_HOLDS: readonly TermField[] = [\"label\", \"definition\", \"alt-labels\"];\n/** What a DITA glossentry can say. */\nexport const DITA_HOLDS: readonly TermField[] = [\"label\", \"definition\", \"alt-labels\", \"scope-note\"];\n/** What a DocBook glossentry can say. */\nexport const DOCBOOK_HOLDS: readonly TermField[] = [\"label\", \"definition\", \"alt-labels\", \"see\", \"related-terms\"];\n\nfunction labelsOf(record: TermRecord): string[] {\n return [record.label, ...(record[\"alt-labels\"] ?? [])];\n}\n\n/**\n * A Markdown Extra definition list entry: the label and each alt-label on a\n * line, then `: ` and the definition, continuation lines and later\n * paragraphs indented four spaces. A term with no definition gets a bare `:`,\n * which the reader skips with a notice, so the file writer leaves such a term\n * out.\n */\nexport function markdownEntry(record: TermRecord): string {\n const lines = labelsOf(record);\n const paragraphs = paragraphsOf(record.definition);\n if (paragraphs.length === 0) return [...lines, \":\"].join(\"\\n\");\n paragraphs.forEach((paragraph, p) => {\n if (p > 0) lines.push(\"\");\n paragraph.forEach((line, i) => {\n lines.push(p === 0 && i === 0 ? `: ${line}` : ` ${line}`);\n });\n });\n return lines.join(\"\\n\");\n}\n\n/**\n * An AsciiDoc labelled list entry: each term as `term::`, the definition's\n * first line after the last term's `::`, and each later paragraph after a `+`\n * continuation line.\n */\nexport function asciidocEntry(record: TermRecord): string {\n const labels = labelsOf(record);\n const paragraphs = paragraphsOf(record.definition);\n const lines = labels.map((label) => `${label}::`);\n paragraphs.forEach((paragraph, p) => {\n if (p > 0) lines.push(\"+\");\n paragraph.forEach((line, i) => {\n if (p === 0 && i === 0) lines[lines.length - 1] = `${lines[lines.length - 1] ?? \"\"} ${line}`;\n else lines.push(line);\n });\n });\n return lines.join(\"\\n\");\n}\n\n/** A `.. glossary::` entry: the terms on their own lines, the definition indented three spaces. */\nexport function rstEntry(record: TermRecord): string {\n const lines = labelsOf(record);\n paragraphsOf(record.definition).forEach((paragraph, p) => {\n if (p > 0) lines.push(\"\");\n for (const line of paragraph) lines.push(` ${line}`);\n });\n return lines.join(\"\\n\");\n}\n\n/** The `<dd>` or `<glossdef>` body: one paragraph inline, several as `<p>`s. */\nfunction blockDefinition(open: string, close: string, paragraph: string, definition: string | undefined): string[] {\n const paragraphs = paragraphsOf(definition);\n const [only] = paragraphs;\n if (only === undefined) return [];\n if (paragraphs.length === 1) return [`${open}${xmlText(paragraphText(only))}${close}`];\n return [\n open,\n ...paragraphs.map((lines) => ` <${paragraph}>${xmlText(paragraphText(lines))}</${paragraph}>`),\n close,\n ];\n}\n\n/** An HTML `<dt>` per term, the first carrying the id, then a `<dd>` when there is a definition. */\nexport function htmlDlEntry(term: Term): string {\n const [label, ...alts] = labelsOf(term.record);\n return [\n `<dt id=\"${xmlAttribute(term.id)}\">${xmlText(label ?? \"\")}</dt>`,\n ...alts.map((alt) => `<dt>${xmlText(alt)}</dt>`),\n ...blockDefinition(\"<dd>\", \"</dd>\", \"p\", term.record.definition),\n ].join(\"\\n\");\n}\n\n/**\n * A DITA 2.0 `<glossentry>`: glossterm, glossdef, then a glossBody holding the\n * scope note as glossUsage and one glossAlt per alt-label. `language` is set as\n * `xml:lang` where the entry is the file's root, which is where a reader looks.\n */\nexport function ditaEntry(term: Term, language?: string): string {\n const { record } = term;\n const alts = record[\"alt-labels\"] ?? [];\n const scopeNote = record[\"scope-note\"];\n const lang = language === undefined ? \"\" : ` xml:lang=\"${xmlAttribute(language)}\"`;\n const body =\n scopeNote === undefined && alts.length === 0\n ? []\n : [\n \" <glossBody>\",\n ...(scopeNote === undefined ? [] : [` <glossUsage>${xmlText(scopeNote)}</glossUsage>`]),\n ...alts.flatMap((alt) => {\n const element = isAcronym(alt) ? \"glossAcronym\" : \"glossSynonym\";\n return [\" <glossAlt>\", ` <${element}>${xmlText(alt)}</${element}>`, \" </glossAlt>\"];\n }),\n \" </glossBody>\",\n ];\n return [\n `<glossentry id=\"${xmlAttribute(term.id)}\"${lang}>`,\n ` <glossterm>${xmlText(record.label)}</glossterm>`,\n ...blockDefinition(\"<glossdef>\", \"</glossdef>\", \"p\", record.definition).map((line) => ` ${line}`),\n ...body,\n \"</glossentry>\",\n ].join(\"\\n\");\n}\n\n/**\n * A DocBook `<glossentry>`: the label as glossterm, each alt-label as an\n * acronym when it is all caps and a glossterm otherwise, the definition as\n * paras with a glossseealso per related term, then a glosssee.\n */\nexport function docbookEntry(term: Term): string {\n const { record } = term;\n const related = record[\"related-terms\"] ?? [];\n const paragraphs = paragraphsOf(record.definition);\n const glossdef =\n paragraphs.length === 0 && related.length === 0\n ? []\n : [\n \" <glossdef>\",\n ...paragraphs.map((lines) => ` <para>${xmlText(paragraphText(lines))}</para>`),\n ...related.map((target) => ` <glossseealso>${xmlText(target)}</glossseealso>`),\n \" </glossdef>\",\n ];\n return [\n `<glossentry xml:id=\"${xmlAttribute(term.id)}\">`,\n ` <glossterm>${xmlText(record.label)}</glossterm>`,\n ...(record[\"alt-labels\"] ?? []).map((alt) =>\n isAcronym(alt) ? ` <acronym>${xmlText(alt)}</acronym>` : ` <glossterm>${xmlText(alt)}</glossterm>`,\n ),\n ...glossdef,\n ...(record.see === undefined ? [] : [` <glosssee>${xmlText(record.see)}</glosssee>`]),\n \"</glossentry>\",\n ].join(\"\\n\");\n}\n","/**\n * A term's identity when its record carries no `id` and its construct no\n * identifier of its own: the GitHub slug of its preferred label. The slug is\n * `github-slugger`'s, which is the one graph mints concept IRIs with, so a term\n * and its graph concept agree on a name without either carrying one.\n */\nimport { slug } from \"github-slugger\";\n\n/** The slug of `label`, trimmed first: a stray space is not part of a name. */\nexport function slugOf(label: string): string {\n return slug(label.trim());\n}\n","/**\n * The one normalization every reader applies to what it read, so that two\n * sets saying the same thing in different constructs compare equal (see\n * `TermRecord`). Also the pieces every reader shares: the id rule, the\n * skipped-entry notice, and the empty result.\n */\nimport { slugOf } from \"../id.js\";\nimport {\n TERM_AUX_FIELDS,\n TERM_DESIGNATION_FIELDS,\n TERM_FIELDS,\n TERM_LIST_FIELDS,\n TERM_MATCH_FIELDS,\n type Term,\n type TermAuxField,\n type TermAuxRecord,\n type TermDesignation,\n type TermField,\n type TermInput,\n type TermLink,\n type TermListField,\n type TermMatchField,\n type TermLocation,\n type TermReadResult,\n type TermRecord,\n type TermTransaction,\n} from \"../../types.js\";\n\n/** A reader's answer for a file that holds none of its entries. */\nexport function nothing(): TermReadResult {\n return { terms: [], notices: [] };\n}\n\n/**\n * A scalar as a non-empty trimmed string, or `undefined`. A number counts,\n * because YAML and the attribute channels type `id: 42` as one.\n */\nexport function textOf(value: unknown): string | undefined {\n let text: string;\n if (typeof value === \"string\") text = value;\n else if (typeof value === \"number\" && Number.isFinite(value)) text = String(value);\n else return undefined;\n const trimmed = text.trim();\n return trimmed === \"\" ? undefined : trimmed;\n}\n\n/** A string or a list of them as a non-empty list of non-empty trimmed strings, or `undefined`. */\nexport function listOf(value: unknown): string[] | undefined {\n const items = Array.isArray(value) ? (value as unknown[]) : [value];\n const list = items.map(textOf).filter((item): item is string => item !== undefined);\n return list.length === 0 ? undefined : list;\n}\n\n/** Runs of whitespace, line breaks included, as one space: markup's text as a reader sees it. */\nexport function collapse(text: string): string {\n return text.replace(/\\s+/g, \" \").trim();\n}\n\nfunction isListField(field: TermField): field is TermListField {\n return (TERM_LIST_FIELDS as readonly TermField[]).includes(field);\n}\n\n/** A field normalized as a list of text: the label lists, the match lists and `tbx-markup`. */\nfunction isListOfText(field: TermField): field is TermListField | TermMatchField | \"tbx-markup\" {\n return isListField(field) || field === \"tbx-markup\" || (TERM_MATCH_FIELDS as readonly TermField[]).includes(field);\n}\n\nfunction isAuxField(field: TermField): field is TermAuxField {\n return (TERM_AUX_FIELDS as readonly TermField[]).includes(field);\n}\n\n/** A YAML or JSON mapping: an object that is neither a list nor a date. */\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\n/** A list's items, or a single value as the one item of its own list. */\nfunction itemsOf(value: unknown): unknown[] {\n return Array.isArray(value) ? (value as unknown[]) : [value];\n}\n\n/**\n * A value `recordOf` left out of a record, and why. The reader that holds the\n * value's line turns each into a notice with `issueNotice`, so a malformed\n * value is reported rather than lost.\n */\nexport interface RecordIssue {\n /** JSON-Pointer segments from the record's root to the value. */\n path: (string | number)[];\n /** What was left out: `see`, `subject-field in concept-entry`, `designations item \"PAL\"`. */\n what: string;\n /** Why, as a sentence with no full stop. */\n why: string;\n}\n\n/** `/designations/0/term` for `[\"designations\", 0, \"term\"]`. */\nexport function pointerOf(path: readonly (string | number)[]): string {\n return path.map((segment) => `/${String(segment).replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\")}`).join(\"\");\n}\n\n/** The notice for one `RecordIssue`, on the line the reader found for it. */\nexport function issueNotice(input: TermInput, line: number, label: string, issue: RecordIssue): string {\n return `${input.file}:${line}: ignored ${issue.what} on \"${label}\": ${issue.why}.`;\n}\n\n/** Where a nested value sits, as an issue names it: `\"\"` at the root, ` in concept-entry` below it. */\ntype Where = string;\n\n/**\n * A one-value field as text. A value that is present but is not text (a list,\n * a mapping, a boolean) is left out and reported. An empty string is text with\n * nothing in it and is simply absent, as `TermRecord` defines.\n */\nfunction oneValue(\n value: unknown,\n key: string,\n path: (string | number)[],\n where: Where,\n issues: RecordIssue[] | undefined,\n): string | undefined {\n const text = textOf(value);\n if (text !== undefined || value === undefined || value === null || typeof value === \"string\") return text;\n const article = /^[aeiou]/.test(key) ? \"an\" : \"a\";\n const holds = Array.isArray(value)\n ? \"holds one value, not a list\"\n : typeof value === \"object\"\n ? \"holds text, not a mapping\"\n : \"holds text\";\n issues?.push({ path, what: `${key}${where}`, why: `${article} ${key} ${holds}` });\n return undefined;\n}\n\n/** A YAML timestamp as the text it was written as, when a parser made it a `Date`. */\nfunction dateText(value: unknown): string | undefined {\n if (!(value instanceof Date) || Number.isNaN(value.getTime())) return textOf(value);\n const iso = value.toISOString();\n return iso.endsWith(\"T00:00:00.000Z\") ? iso.slice(0, 10) : iso;\n}\n\n/**\n * The items of a mapping-list field, each built by `build` or reported with\n * `why`. A null or empty item is nothing, as an empty label is; any other item\n * `build` refuses is reported.\n */\nfunction mappedItems<T>(\n value: unknown,\n key: string,\n path: (string | number)[],\n where: Where,\n issues: RecordIssue[] | undefined,\n why: string,\n build: (item: unknown) => T | undefined,\n): T[] | undefined {\n if (value === undefined || value === null) return undefined;\n const list: T[] = [];\n itemsOf(value).forEach((item, i) => {\n const built = build(item);\n if (built !== undefined) list.push(built);\n else if (item !== null && item !== undefined && typeof item !== \"string\") {\n issues?.push({ path: Array.isArray(value) ? [...path, i] : path, what: `${key} item${where}`, why });\n }\n });\n return list.length === 0 ? undefined : list;\n}\n\nfunction linkOf(item: unknown): TermLink | undefined {\n const bare = textOf(item);\n if (bare !== undefined) return { target: bare };\n if (!isMapping(item)) return undefined;\n const target = textOf(item[\"target\"]);\n if (target === undefined) return undefined;\n const text = textOf(item[\"text\"]);\n return text === undefined ? { target } : { target, text };\n}\n\nfunction transactionOf(item: unknown): TermTransaction | undefined {\n if (!isMapping(item)) return undefined;\n const type = textOf(item[\"type\"]);\n if (type === undefined) return undefined;\n const transaction: TermTransaction = { type };\n const date = dateText(item[\"date\"]);\n if (date !== undefined) transaction.date = date;\n const responsibility = textOf(item[\"responsibility\"]);\n if (responsibility !== undefined) transaction.responsibility = responsibility;\n return transaction;\n}\n\n/** Set one aux field on `target` from its raw value, normalized, at any level. */\nfunction setAux(\n target: TermAuxRecord,\n field: TermAuxField,\n value: unknown,\n path: (string | number)[],\n where: Where,\n issues: RecordIssue[] | undefined,\n): void {\n switch (field) {\n case \"definition\":\n case \"subject-field\": {\n const text = oneValue(value, field, path, where, issues);\n if (text !== undefined) target[field] = text;\n return;\n }\n case \"cross-references\":\n case \"external-cross-references\":\n case \"graphics\": {\n const why = `a ${field} item is text or a mapping with a target`;\n const links = mappedItems(value, field, path, where, issues, why, linkOf);\n if (links !== undefined) target[field] = links;\n return;\n }\n case \"transactions\": {\n const why = \"a transactions item is a mapping with a type\";\n const transactions = mappedItems(value, field, path, where, issues, why, transactionOf);\n if (transactions !== undefined) target[field] = transactions;\n return;\n }\n default: {\n const list = listOf(value);\n if (list !== undefined) target[field] = list;\n }\n }\n}\n\nfunction conceptEntryOf(value: unknown, issues: RecordIssue[] | undefined): TermAuxRecord | undefined {\n if (value === undefined || value === null) return undefined;\n if (!isMapping(value)) {\n issues?.push({ path: [\"concept-entry\"], what: \"concept-entry\", why: \"a concept-entry holds a mapping of fields\" });\n return undefined;\n }\n const entry: TermAuxRecord = {};\n for (const field of TERM_AUX_FIELDS) {\n setAux(entry, field, value[field], [\"concept-entry\", field], \" in concept-entry\", issues);\n }\n return Object.keys(entry).length === 0 ? undefined : entry;\n}\n\n/**\n * The `designations` items, each naming one of `names`. An item that names\n * none of them describes no designation this term has, and is reported.\n */\nfunction designationsOf(\n value: unknown,\n names: readonly string[],\n issues: RecordIssue[] | undefined,\n): TermDesignation[] | undefined {\n if (value === undefined || value === null) return undefined;\n const list: TermDesignation[] = [];\n itemsOf(value).forEach((item, i) => {\n const path: (string | number)[] = Array.isArray(value) ? [\"designations\", i] : [\"designations\"];\n const term = isMapping(item) ? textOf(item[\"term\"]) : undefined;\n if (!isMapping(item) || term === undefined) {\n issues?.push({ path, what: \"designations item\", why: \"a designations item is a mapping with a term\" });\n return;\n }\n if (!names.includes(term)) {\n issues?.push({ path, what: `designations item \"${term}\"`, why: \"it names no label, alt-label or hidden-label\" });\n return;\n }\n const where = ` in designations item \"${term}\"`;\n const designation: TermDesignation = { term };\n for (const key of TERM_DESIGNATION_FIELDS) {\n const text = oneValue(item[key], key, [...path, key], where, issues);\n if (text !== undefined) designation[key] = text;\n }\n const comments = listOf(item[\"transfer-comments\"]);\n if (comments !== undefined) designation[\"transfer-comments\"] = comments;\n for (const field of TERM_AUX_FIELDS) setAux(designation, field, item[field], [...path, field], where, issues);\n list.push(designation);\n });\n return list.length === 0 ? undefined : list;\n}\n\n/**\n * The record for raw field values, normalized, or `undefined` when there is no\n * label to make one. Keys the vocabulary does not name are ignored, at every\n * level. A value present in a shape its field cannot hold is left out and,\n * when `issues` is given, reported there.\n */\nexport function recordOf(raw: Partial<Record<TermField, unknown>>, issues?: RecordIssue[]): TermRecord | undefined {\n const label = textOf(raw.label);\n if (label === undefined) return undefined;\n const record: TermRecord = { label };\n for (const field of TERM_FIELDS) {\n const value = raw[field];\n if (field === \"label\") continue;\n if (isListOfText(field)) {\n const list = listOf(value);\n if (list !== undefined) record[field] = list;\n } else if (isAuxField(field)) {\n setAux(record, field, value, [field], \"\", issues);\n } else if (field === \"concept-entry\") {\n const entry = conceptEntryOf(value, issues);\n if (entry !== undefined) record[field] = entry;\n } else if (field === \"designations\") {\n // The label fields precede `designations` in TERM_FIELDS, so they are already normalized.\n const names = [label, ...(record[\"alt-labels\"] ?? []), ...(record[\"hidden-labels\"] ?? [])];\n const designations = designationsOf(value, names, issues);\n if (designations !== undefined) record[field] = designations;\n } else {\n const text = oneValue(value, field, [field], \"\", issues);\n if (text !== undefined) record[field] = text;\n }\n }\n return record;\n}\n\n/** The field lines worth keeping: those of fields the record actually carries. */\nexport function linesFor(\n record: TermRecord,\n lines: Partial<Record<TermField, number | undefined>>,\n): Partial<Record<TermField, number>> {\n const kept: Partial<Record<TermField, number>> = {};\n for (const field of TERM_FIELDS) {\n const line = lines[field];\n if (line !== undefined && record[field] !== undefined) kept[field] = line;\n }\n return kept;\n}\n\n/** The record's id, else the construct's own identifier, else the label's slug. */\nexport function idFor(record: TermRecord, recordId: unknown, constructId?: unknown): string {\n return textOf(recordId) ?? textOf(constructId) ?? slugOf(record.label);\n}\n\n/**\n * `language` from the file's metadata, when it carries one. An XML file says\n * it with `xml:lang` on its root, which is where DITA and DocBook put it.\n */\nexport function languageOf(input: TermInput): string | undefined {\n return textOf(input.metadata[\"language\"]) ?? textOf(input.metadata[\"xml:lang\"]);\n}\n\n/** Whether the file's metadata channel declares `type: <type>`. */\nexport function declares(input: TermInput, type: string): boolean {\n const value = input.metadata[\"type\"];\n return typeof value === \"string\" && value.trim() === type;\n}\n\n/** The notice for an entry with no term text. */\nexport function skipped(input: TermInput, line: number, label: string): string {\n return `${input.file}:${line}: skipped a ${label} entry with no term.`;\n}\n\nexport interface EntryParts {\n record: TermRecord;\n /** The entry's own `language`, which a manifest entry may carry. The file's applies otherwise. */\n language?: unknown;\n recordId?: unknown;\n constructId?: unknown;\n construct: TermLocation[\"construct\"];\n line: number;\n lines: Partial<Record<TermField, number | undefined>>;\n span?: { start: number; end: number };\n}\n\n/** A `Term` assembled from what a reader read, with the id, language and location rules applied. */\nexport function termOf(input: TermInput, parts: EntryParts): Term {\n const language = textOf(parts.language) ?? languageOf(input);\n const location: TermLocation = {\n file: input.file,\n ...(input.path === undefined ? {} : { path: input.path }),\n construct: parts.construct,\n line: parts.line,\n fieldLines: linesFor(parts.record, parts.lines),\n ...(parts.span === undefined ? {} : { span: parts.span }),\n };\n return {\n id: idFor(parts.record, parts.recordId, parts.constructId),\n record: parts.record,\n ...(language === undefined ? {} : { language }),\n location,\n };\n}\n","/**\n * The in-place write every body construct shares. The file is read again, and\n * an entry is rewritten only where the record it was handed differs from what\n * the file says, in a field the construct can hold. The rewrite replaces the\n * entry's span with the same text a render writes for it, indented where the\n * old entry sat and in the file's own line endings. So a write of unchanged\n * terms returns the file exactly as it was.\n */\nimport { TermError } from \"../../errors.js\";\nimport type { Term, TermField, TermInput, TermReadResult, TermRecord } from \"../../types.js\";\nimport { reindent } from \"../writers/markup.js\";\n\nexport interface EntryWrite {\n /** The fields the construct holds: a difference anywhere else is not written. */\n holds: readonly TermField[];\n /** Whether the construct holds the id, so a changed id is a change. */\n id: boolean;\n /** The entry's text at indentation zero, `\\n`-joined. */\n serialize: (term: Term, input: TermInput) => string;\n}\n\nfunction sameValue(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n/** Whether two records say the same thing in `fields`. */\nexport function sameFields(a: TermRecord, b: TermRecord, fields: readonly TermField[]): boolean {\n return fields.every((field) => sameValue(a[field], b[field]));\n}\n\n/** The file's line ending: CRLF when it has one, else LF. */\nexport function lineEnding(content: string): string {\n return content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n}\n\n/** The whitespace that opens the line `offset` sits on. */\nexport function indentAt(content: string, offset: number): string {\n const lineStart = content.lastIndexOf(\"\\n\", offset - 1) + 1;\n return /^[ \\t]*/.exec(content.slice(lineStart, offset))?.[0] ?? \"\";\n}\n\nexport function applyEntries(\n input: TermInput,\n read: (input: TermInput) => TermReadResult,\n terms: readonly Term[],\n write: EntryWrite,\n): string {\n const { content } = input;\n const current = read(input).terms;\n const eol = lineEnding(content);\n const edits: { start: number; end: number; text: string }[] = [];\n\n for (const term of terms) {\n const span = term.location.span;\n if (span === undefined) {\n throw new TermError(\n `${input.file}: term \"${term.id}\" cannot be written in place, because its entry has no position in the file.`,\n );\n }\n const found = current.find((t) => t.location.span?.start === span.start && t.location.span.end === span.end);\n if (found === undefined) {\n throw new TermError(\n `${input.file}: term \"${term.id}\" does not match an entry in the file. Read the file again before writing it.`,\n );\n }\n if (sameFields(found.record, term.record, write.holds) && (!write.id || found.id === term.id)) continue;\n const text = reindent(write.serialize(term, input), indentAt(content, span.start), eol);\n edits.push({ start: span.start, end: span.end, text });\n }\n\n let next = content;\n for (const edit of [...edits].sort((a, b) => b.start - a.start)) {\n next = next.slice(0, edit.start) + edit.text + next.slice(edit.end);\n }\n return next;\n}\n","/**\n * The XML parse the DITA and DocBook readers share: one parse per input,\n * element lookup by local name, and an element's span in the file's content.\n *\n * meta's XML read model sits behind the sibling-tool wall, so the few pieces\n * needed here are restated rather than imported. The parser is the same one\n * (`@xmldom/xmldom`), with the same tolerance for DTD-declared entities, so a\n * file meta extracted is a file this parses.\n */\nimport { DOMParser, type Element } from \"@xmldom/xmldom\";\nimport type { TermInput } from \"../../types.js\";\nimport { collapse } from \"./normalize.js\";\n\nexport type XmlElement = Element;\n\nexport interface ParsedXml {\n root: XmlElement;\n /** The content parsed: `input.content` minus a leading BOM. */\n body: string;\n /** How far `body` is shifted from `input.content`: 1 when a BOM was stripped. */\n shift: number;\n /** Offsets at which each 1-based line of `body` begins, counted as xmldom counts them. */\n starts: number[];\n}\n\nconst cache = new WeakMap<TermInput, ParsedXml | null>();\n\n/** The six break forms xmldom folds to LF before counting lines. */\nconst LINE_BREAK = /\\r\\n|\\r|\\n|\\u0085|\\u2028|\\u2029/g;\n\nexport function lineStarts(source: string): number[] {\n const starts = [0];\n for (const match of source.matchAll(LINE_BREAK)) starts.push(match.index + match[0].length);\n return starts;\n}\n\n/**\n * The input's XML, or `null` for a file that does not parse or has no root.\n * The loader has already extracted the file with meta's XML extractor, which\n * refuses a malformed one, so `null` here means \"not a document this reader\n * can hold entries in\", never a quiet skip of a broken file.\n */\nexport function parseXml(input: TermInput): ParsedXml | null {\n const cached = cache.get(input);\n if (cached !== undefined) return cached;\n const shift = input.content.charCodeAt(0) === 0xfeff ? 1 : 0;\n const body = input.content.slice(shift);\n const errors: string[] = [];\n let parsed: ParsedXml | null = null;\n try {\n const doc = new DOMParser({\n onError: (level, message) => {\n if (level !== \"error\" && level !== \"fatalError\") return;\n if (/entity not found/i.test(message)) return;\n errors.push(message);\n },\n }).parseFromString(body, \"text/xml\");\n const root = doc.documentElement;\n if (errors.length === 0 && root !== null) parsed = { root, body, shift, starts: lineStarts(body) };\n } catch {\n parsed = null;\n }\n cache.set(input, parsed);\n return parsed;\n}\n\n/** An element's local name, lowercased: DocBook 5 is namespaced, DocBook 4 and DITA are not. */\nexport function nameOf(el: XmlElement): string {\n return (el.localName ?? el.nodeName).toLowerCase();\n}\n\n/** The element children of `el`, optionally only those named `name` (lowercase). */\nexport function childrenOf(el: XmlElement, name?: string): XmlElement[] {\n const out: XmlElement[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children.item(i);\n if (child !== null && (name === undefined || nameOf(child) === name)) out.push(child);\n }\n return out;\n}\n\n/** Every descendant of `el` named `name` (lowercase), in document order. */\nexport function descendantsOf(el: XmlElement, name: string): XmlElement[] {\n const out: XmlElement[] = [];\n const walk = (parent: XmlElement): void => {\n for (const child of childrenOf(parent)) {\n if (nameOf(child) === name) out.push(child);\n walk(child);\n }\n };\n walk(el);\n return out;\n}\n\n/** An element's text, whitespace collapsed. */\nexport function textOfElement(el: XmlElement): string {\n return collapse(el.textContent ?? \"\");\n}\n\n/** The 1-based line an element starts on. */\nexport function lineOfElement(el: XmlElement): number {\n return el.lineNumber ?? 1;\n}\n\n/**\n * The offset just past the end of the markup construct starting at `from`\n * (a comment, CDATA section, processing instruction or declaration), or\n * `undefined` when `from` starts none of them.\n */\nfunction skipOpaque(body: string, from: number): number | undefined {\n const opaque: [string, string][] = [\n [\"<!--\", \"-->\"],\n [\"<![CDATA[\", \"]]>\"],\n [\"<?\", \"?>\"],\n [\"<!\", \">\"],\n ];\n for (const [open, close] of opaque) {\n if (body.startsWith(open, from)) {\n const end = body.indexOf(close, from + open.length);\n return end === -1 ? body.length : end + close.length;\n }\n }\n return undefined;\n}\n\n/** The offset past a tag's closing `>`, honouring quoted attribute values, and whether it self-closed. */\nexport function tagEnd(body: string, from: number): { end: number; selfClosing: boolean } | undefined {\n let quote: string | undefined;\n for (let i = from + 1; i < body.length; i++) {\n const ch = body[i];\n if (quote !== undefined) {\n if (ch === quote) quote = undefined;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (ch === \">\") {\n return { end: i + 1, selfClosing: body[i - 1] === \"/\" };\n }\n }\n return undefined;\n}\n\nfunction namedAt(body: string, at: number, name: string): boolean {\n if (!body.startsWith(name, at)) return false;\n const after = body[at + name.length];\n return after === undefined || /[\\s/>]/.test(after);\n}\n\n/**\n * An element's `[start, end)` offsets in `input.content`. xmldom reports only\n * where an element starts, so the end is found by scanning forward for the\n * close tag that balances it, skipping comments, CDATA and processing\n * instructions.\n */\nexport function spanOfElement(xml: ParsedXml, el: XmlElement): { start: number; end: number } | undefined {\n const lineStart = xml.starts[(el.lineNumber ?? 1) - 1];\n if (lineStart === undefined) return undefined;\n const start = lineStart + (el.columnNumber ?? 1) - 1;\n const { body } = xml;\n if (body[start] !== \"<\") return undefined;\n const name = el.nodeName;\n const open = tagEnd(body, start);\n if (open === undefined) return undefined;\n if (open.selfClosing) return { start: start + xml.shift, end: open.end + xml.shift };\n\n let depth = 1;\n let i = open.end;\n while (i < body.length) {\n const lt = body.indexOf(\"<\", i);\n if (lt === -1) return undefined;\n const skipTo = skipOpaque(body, lt);\n if (skipTo !== undefined) {\n i = skipTo;\n continue;\n }\n const tag = tagEnd(body, lt);\n if (tag === undefined) return undefined;\n if (body[lt + 1] === \"/\" && namedAt(body, lt + 2, name)) {\n depth -= 1;\n if (depth === 0) return { start: start + xml.shift, end: tag.end + xml.shift };\n } else if (namedAt(body, lt + 1, name) && !tag.selfClosing) {\n depth += 1;\n }\n i = tag.end;\n }\n return undefined;\n}\n","/**\n * DITA 2.0 glossary topics. A `<glossentry>` is a topic, so a file whose root\n * is one holds one term; a `<glossgroup>` holds a term per glossentry inside\n * it. Both are self-declaring, so neither needs `type: term`.\n *\n * Only elements that survive in DITA 2.0 are read. `<glossdef>` is the\n * definition: DITA specializes it from `<abstract>`, but it is where a DITA\n * author writes what the term means, and mapping it anywhere else would drop\n * every definition from a round trip through DITA (proposal 0052 § 4).\n */\nimport type { Term, TermField, TermInput, TermReader, TermReadResult } from \"../../types.js\";\nimport { DITA_HOLDS, ditaEntry } from \"../writers/entries.js\";\nimport { nothing, recordOf, skipped, termOf, textOf } from \"./normalize.js\";\nimport { applyEntries } from \"./splice.js\";\nimport {\n childrenOf,\n descendantsOf,\n lineOfElement,\n nameOf,\n parseXml,\n spanOfElement,\n textOfElement,\n type ParsedXml,\n type XmlElement,\n} from \"./xml.js\";\n\ntype Construct = \"dita-glossentry\" | \"dita-glossgroup\";\n\n/** A glossdef's prose: its `<p>`s with a blank line between, or its text when it has none. */\nfunction definitionOf(glossdef: XmlElement): string {\n const paragraphs = childrenOf(glossdef, \"p\");\n if (paragraphs.length === 0) return textOfElement(glossdef);\n return paragraphs\n .map(textOfElement)\n .filter((text) => text !== \"\")\n .join(\"\\n\\n\");\n}\n\nfunction readEntry(\n input: TermInput,\n xml: ParsedXml,\n entry: XmlElement,\n construct: Construct,\n label: string,\n): Term | string {\n const raw: Partial<Record<TermField, unknown>> = {};\n const lines: Partial<Record<TermField, number | undefined>> = {};\n const [glossterm] = childrenOf(entry, \"glossterm\");\n if (glossterm !== undefined) {\n raw.label = textOfElement(glossterm);\n lines.label = lineOfElement(glossterm);\n }\n const [glossdef] = childrenOf(entry, \"glossdef\");\n if (glossdef !== undefined) {\n raw.definition = definitionOf(glossdef);\n lines.definition = lineOfElement(glossdef);\n }\n const alts: string[] = [];\n for (const body of childrenOf(entry, \"glossbody\")) {\n const [usage] = childrenOf(body, \"glossusage\");\n if (usage !== undefined && raw[\"scope-note\"] === undefined) {\n raw[\"scope-note\"] = textOfElement(usage);\n lines[\"scope-note\"] = lineOfElement(usage);\n }\n for (const alt of childrenOf(body, \"glossalt\")) {\n for (const form of childrenOf(alt)) {\n const name = nameOf(form);\n if (name !== \"glosssynonym\" && name !== \"glossacronym\") continue;\n alts.push(textOfElement(form));\n lines[\"alt-labels\"] ??= lineOfElement(form);\n }\n }\n }\n raw[\"alt-labels\"] = alts;\n\n const line = lineOfElement(entry);\n const record = recordOf(raw);\n if (record === undefined) return skipped(input, line, label);\n const span = spanOfElement(xml, entry);\n return termOf(input, {\n record,\n constructId: entry.getAttribute(\"id\"),\n construct,\n line,\n lines,\n ...(span === undefined ? {} : { span }),\n });\n}\n\nfunction collect(\n input: TermInput,\n xml: ParsedXml,\n entries: readonly XmlElement[],\n construct: Construct,\n label: string,\n): TermReadResult {\n const result = nothing();\n for (const entry of entries) {\n const read = readEntry(input, xml, entry, construct, label);\n if (typeof read === \"string\") result.notices.push(read);\n else result.terms.push(read);\n }\n return result;\n}\n\nconst GLOSSENTRY_LABEL = \"DITA glossentry\";\nconst GLOSSGROUP_LABEL = \"DITA glossgroup\";\n\nfunction readGlossentry(input: TermInput): TermReadResult {\n const xml = parseXml(input);\n if (xml === null || nameOf(xml.root) !== \"glossentry\") return nothing();\n return collect(input, xml, [xml.root], \"dita-glossentry\", GLOSSENTRY_LABEL);\n}\n\nfunction readGlossgroup(input: TermInput): TermReadResult {\n const xml = parseXml(input);\n if (xml === null || nameOf(xml.root) !== \"glossgroup\") return nothing();\n // A glossgroup may nest glossgroups; every glossentry inside is a term.\n return collect(input, xml, descendantsOf(xml.root, \"glossentry\"), \"dita-glossgroup\", GLOSSGROUP_LABEL);\n}\n\nexport const ditaGlossentryReader: TermReader = {\n construct: \"dita-glossentry\",\n label: GLOSSENTRY_LABEL,\n formats: [\"xml\"],\n read: readGlossentry,\n // The glossentry is the file's root, so the file's `xml:lang` sits on it and\n // is written again when the entry is.\n apply: (input, terms) =>\n applyEntries(input, readGlossentry, terms, {\n holds: DITA_HOLDS,\n id: true,\n serialize: (term, file) => ditaEntry(term, textOf(file.metadata[\"xml:lang\"]) === undefined ? undefined : term.language),\n }),\n};\n\nexport const ditaGlossgroupReader: TermReader = {\n construct: \"dita-glossgroup\",\n label: GLOSSGROUP_LABEL,\n formats: [\"xml\"],\n read: readGlossgroup,\n apply: (input, terms) =>\n applyEntries(input, readGlossgroup, terms, { holds: DITA_HOLDS, id: true, serialize: (term) => ditaEntry(term) }),\n};\n","/**\n * DocBook's `<glossary>`, in DocBook 5's namespace or DocBook 4's none. It is\n * self-declaring, so any file holding one is read, and every `<glossentry>`\n * under it, `<glossdiv>`s included, is a term.\n *\n * Where an entry names several terms, the first `<glossterm>` is the label and\n * a later one, or an `<acronym>`, is an alt-label (proposal 0052 § 4).\n */\nimport type { TermField, TermInput, TermReader, TermReadResult } from \"../../types.js\";\nimport { DOCBOOK_HOLDS, docbookEntry } from \"../writers/entries.js\";\nimport { nothing, recordOf, skipped, termOf, textOf } from \"./normalize.js\";\nimport { applyEntries } from \"./splice.js\";\nimport {\n childrenOf,\n descendantsOf,\n lineOfElement,\n nameOf,\n parseXml,\n spanOfElement,\n textOfElement,\n type XmlElement,\n} from \"./xml.js\";\n\nconst LABEL = \"DocBook glossary\";\n\n/** A cross-reference's target as written: its text, else its `otherterm` idref. */\nfunction referenceOf(el: XmlElement): string | undefined {\n return textOf(textOfElement(el)) ?? textOf(el.getAttribute(\"otherterm\"));\n}\n\n/** A glossdef's prose: each paragraph's text, a blank line between, cross-references left out. */\nfunction definitionOf(glossdef: XmlElement): string {\n const children = childrenOf(glossdef);\n const blocks = children.filter((child) => nameOf(child) !== \"glossseealso\");\n // Only cross-references: a glossdef with no prose of its own.\n if (blocks.length === 0) return children.length === 0 ? textOfElement(glossdef) : \"\";\n return blocks\n .map(textOfElement)\n .filter((text) => text !== \"\")\n .join(\"\\n\\n\");\n}\n\nfunction read(input: TermInput): TermReadResult {\n const xml = parseXml(input);\n if (xml === null) return nothing();\n const glossaries = nameOf(xml.root) === \"glossary\" ? [xml.root] : descendantsOf(xml.root, \"glossary\");\n if (glossaries.length === 0) return nothing();\n\n const seen = new Set<XmlElement>();\n const result = nothing();\n for (const glossary of glossaries) {\n for (const entry of descendantsOf(glossary, \"glossentry\")) {\n if (seen.has(entry)) continue;\n seen.add(entry);\n\n const raw: Partial<Record<TermField, unknown>> = {};\n const lines: Partial<Record<TermField, number | undefined>> = {};\n const alts: string[] = [];\n const definitions: string[] = [];\n const related: string[] = [];\n for (const child of childrenOf(entry)) {\n const name = nameOf(child);\n if (name === \"glossterm\" && raw.label === undefined) {\n raw.label = textOfElement(child);\n lines.label = lineOfElement(child);\n } else if (name === \"glossterm\" || name === \"acronym\") {\n alts.push(textOfElement(child));\n lines[\"alt-labels\"] ??= lineOfElement(child);\n } else if (name === \"glossdef\") {\n definitions.push(definitionOf(child));\n lines.definition ??= lineOfElement(child);\n for (const seeAlso of childrenOf(child, \"glossseealso\")) {\n const target = referenceOf(seeAlso);\n if (target !== undefined) related.push(target);\n lines[\"related-terms\"] ??= lineOfElement(seeAlso);\n }\n } else if (name === \"glosssee\" && raw.see === undefined) {\n raw.see = referenceOf(child);\n lines.see = lineOfElement(child);\n }\n }\n raw[\"alt-labels\"] = alts;\n raw.definition = definitions.filter((text) => text !== \"\").join(\"\\n\\n\");\n raw[\"related-terms\"] = related;\n\n const line = lineOfElement(entry);\n const record = recordOf(raw);\n if (record === undefined) {\n result.notices.push(skipped(input, line, LABEL));\n continue;\n }\n const span = spanOfElement(xml, entry);\n result.terms.push(\n termOf(input, {\n record,\n constructId: entry.getAttribute(\"xml:id\"),\n construct: \"docbook-glossary\",\n line,\n lines,\n ...(span === undefined ? {} : { span }),\n }),\n );\n }\n }\n return result;\n}\n\nexport const docbookGlossaryReader: TermReader = {\n construct: \"docbook-glossary\",\n label: LABEL,\n formats: [\"xml\"],\n read,\n apply: (input, terms) => applyEntries(input, read, terms, { holds: DOCBOOK_HOLDS, id: true, serialize: docbookEntry }),\n};\n","/**\n * HTML's two term constructs, `<dl>` and `<dfn>`. Neither says it is a\n * glossary, so both are read only where the page's metadata declares\n * `type: term-set` (proposal 0052 § 3).\n *\n * parse5 is the parser meta's HTML extractor uses; its location info gives\n * each element's offsets and line directly.\n */\nimport { parse, type DefaultTreeAdapterMap } from \"parse5\";\nimport type { Term, TermField, TermInput, TermReader, TermReadResult } from \"../../types.js\";\nimport { LIST_HOLDS, htmlDlEntry } from \"../writers/entries.js\";\nimport { collapse, declares, nothing, recordOf, skipped, termOf, textOf } from \"./normalize.js\";\nimport { applyEntries } from \"./splice.js\";\n\ntype Element = DefaultTreeAdapterMap[\"element\"];\ntype ChildNode = DefaultTreeAdapterMap[\"childNode\"];\ntype ParentNode = DefaultTreeAdapterMap[\"parentNode\"];\n\ninterface ParsedHtml {\n root: DefaultTreeAdapterMap[\"document\"];\n /** 1 when a leading BOM was stripped before parsing, so offsets map back onto `input.content`. */\n shift: number;\n}\n\nconst cache = new WeakMap<TermInput, ParsedHtml>();\n\nfunction parseHtml(input: TermInput): ParsedHtml {\n const cached = cache.get(input);\n if (cached !== undefined) return cached;\n // A BOM before `<html>` puts parse5 into a mode with no source locations for\n // the document's structure; meta's reader strips it for the same reason.\n const shift = input.content.charCodeAt(0) === 0xfeff ? 1 : 0;\n const parsed = { root: parse(input.content.slice(shift), { sourceCodeLocationInfo: true }), shift };\n cache.set(input, parsed);\n return parsed;\n}\n\nfunction isElement(node: ChildNode): node is Element {\n return \"tagName\" in node;\n}\n\nfunction childElements(node: ParentNode): Element[] {\n return node.childNodes.filter(isElement);\n}\n\nfunction elementsNamed(node: ParentNode, name: string): Element[] {\n const out: Element[] = [];\n const walk = (parent: ParentNode): void => {\n for (const child of childElements(parent)) {\n if (child.tagName === name) out.push(child);\n walk(child);\n }\n };\n walk(node);\n return out;\n}\n\nfunction rawText(node: ParentNode): string {\n let text = \"\";\n for (const child of node.childNodes) {\n if (child.nodeName === \"#text\" && \"value\" in child) text += child.value;\n else if (isElement(child)) text += rawText(child);\n }\n return text;\n}\n\nfunction textOfNode(node: ParentNode): string {\n return collapse(rawText(node));\n}\n\nfunction attr(el: Element, name: string): string | undefined {\n return el.attrs.find((a) => a.name === name)?.value;\n}\n\nfunction lineOf(el: Element): number {\n return el.sourceCodeLocation?.startLine ?? 1;\n}\n\nfunction spanOf(parsed: ParsedHtml, first: Element, last: Element): { start: number; end: number } | undefined {\n const start = first.sourceCodeLocation?.startOffset;\n const end = last.sourceCodeLocation?.endOffset;\n if (start === undefined || end === undefined) return undefined;\n return { start: start + parsed.shift, end: end + parsed.shift };\n}\n\n/** A `<dd>`'s definition: its paragraphs with a blank line between, or its text when it has none. */\nfunction definitionOf(dd: Element): string {\n const paragraphs = childElements(dd).filter((child) => child.tagName === \"p\");\n if (paragraphs.length === 0) return textOfNode(dd);\n return paragraphs\n .map(textOfNode)\n .filter((text) => text !== \"\")\n .join(\"\\n\\n\");\n}\n\n/** A `<dl>`'s `<dt>` and `<dd>` children, looking through the `<div>` wrappers HTML allows. */\nfunction listItems(dl: Element): Element[] {\n return childElements(dl).flatMap((child) => (child.tagName === \"div\" ? childElements(child) : [child]));\n}\n\nconst DL_LABEL = \"dl\";\n\nfunction readDl(input: TermInput): TermReadResult {\n if (!declares(input, \"term-set\")) return nothing();\n const parsed = parseHtml(input);\n const result = nothing();\n\n for (const dl of elementsNamed(parsed.root, \"dl\")) {\n const items = listItems(dl).filter((item) => item.tagName === \"dt\" || item.tagName === \"dd\");\n let i = 0;\n while (i < items.length) {\n const dts: Element[] = [];\n const dds: Element[] = [];\n for (let item = items[i]; item?.tagName === \"dt\"; item = items[++i]) dts.push(item);\n for (let item = items[i]; item?.tagName === \"dd\"; item = items[++i]) dds.push(item);\n const first = dts[0] ?? dds[0];\n const last = dds[dds.length - 1] ?? dts[dts.length - 1];\n if (first === undefined || last === undefined) break;\n\n const named = dts.filter((dt) => textOfNode(dt) !== \"\");\n const [labelDt, ...altDts] = named;\n const [dd] = dds;\n const raw: Partial<Record<TermField, unknown>> = {\n label: labelDt === undefined ? undefined : textOfNode(labelDt),\n \"alt-labels\": altDts.map(textOfNode),\n definition: dd === undefined ? undefined : definitionOf(dd),\n };\n const lines: Partial<Record<TermField, number | undefined>> = {\n label: labelDt === undefined ? undefined : lineOf(labelDt),\n \"alt-labels\": altDts[0] === undefined ? undefined : lineOf(altDts[0]),\n definition: dd === undefined ? undefined : lineOf(dd),\n };\n const line = lineOf(first);\n const record = recordOf(raw);\n if (record === undefined) {\n result.notices.push(skipped(input, line, DL_LABEL));\n continue;\n }\n const span = spanOf(parsed, first, last);\n const constructId = dts.map((dt) => textOf(attr(dt, \"id\"))).find((id) => id !== undefined);\n result.terms.push(\n termOf(input, {\n record,\n constructId,\n construct: \"html-dl\",\n line,\n lines,\n ...(span === undefined ? {} : { span }),\n }),\n );\n }\n }\n return result;\n}\n\nconst DFN_LABEL = \"dfn\";\n\n/** Whether `el` sits in a `<dt>`, where the `<dl>` reader already reads its term. */\nfunction insideDt(el: Element): boolean {\n let parent = el.parentNode;\n while (parent !== null && \"tagName\" in parent) {\n if (parent.tagName === \"dt\") return true;\n parent = parent.parentNode;\n }\n return false;\n}\n\n/**\n * The HTML spec's rule for the term a `<dfn>` defines: its `title`, else the\n * `title` of an `<abbr>` that is its only content, else its text. Where the\n * label came from an `<abbr>`, the abbreviation is an alt-label.\n */\nfunction dfnFields(dfn: Element): { label?: string; alt?: string } {\n const title = textOf(attr(dfn, \"title\"));\n if (title !== undefined) return { label: title };\n const content = dfn.childNodes.filter((child) =>\n child.nodeName === \"#text\" && \"value\" in child ? child.value.trim() !== \"\" : isElement(child),\n );\n const [only] = content;\n if (content.length === 1 && only !== undefined && isElement(only) && only.tagName === \"abbr\") {\n const abbrTitle = textOf(attr(only, \"title\"));\n if (abbrTitle !== undefined) return { label: abbrTitle, alt: textOfNode(only) };\n }\n return { label: textOfNode(dfn) };\n}\n\nfunction readDfn(input: TermInput): TermReadResult {\n if (!declares(input, \"term-set\")) return nothing();\n const parsed = parseHtml(input);\n const result = nothing();\n for (const dfn of elementsNamed(parsed.root, \"dfn\")) {\n if (insideDt(dfn)) continue;\n const { label, alt } = dfnFields(dfn);\n const line = lineOf(dfn);\n const record = recordOf({ label, \"alt-labels\": alt });\n if (record === undefined) {\n result.notices.push(skipped(input, line, DFN_LABEL));\n continue;\n }\n const span = spanOf(parsed, dfn, dfn);\n const term: Term = termOf(input, {\n record,\n constructId: attr(dfn, \"id\"),\n construct: \"html-dfn\",\n line,\n lines: { label: line, \"alt-labels\": line },\n ...(span === undefined ? {} : { span }),\n });\n result.terms.push(term);\n }\n return result;\n}\n\nexport const htmlDlReader: TermReader = {\n construct: \"html-dl\",\n label: DL_LABEL,\n formats: [\"html\"],\n read: readDl,\n apply: (input, terms) => applyEntries(input, readDl, terms, { holds: LIST_HOLDS, id: true, serialize: htmlDlEntry }),\n};\n\nexport const htmlDfnReader: TermReader = {\n construct: \"html-dfn\",\n label: DFN_LABEL,\n formats: [\"html\"],\n read: readDfn,\n};\n","/**\n * A term manifest: a YAML or JSON mapping of id to entry, for terms held\n * outside any document. Each entry is the terminology fields with no\n * envelope, plus the entry's own `language` when it has one. The line of each\n * entry and each field is kept, so a finding names the entry's own line\n * (proposal 0052, after 0037's sidecar).\n *\n * A write edits the entries it was handed in place: YAML through the `yaml`\n * Document API, so comments, key order and other entries survive; JSON by\n * rewriting the file with two-space indentation. An entry the file lacks is\n * appended, and an entry the file holds but the write was not handed is left\n * alone, because removing a term is not a write-back.\n */\nimport { isMap, isNode, isScalar, isSeq, LineCounter, parseDocument, stringify as stringifyYaml, type Node, type YAMLMap } from \"yaml\";\nimport { errorMessage } from \"../../../shared/errors.js\";\nimport { TermError } from \"../../errors.js\";\nimport {\n TERM_FIELDS,\n type Term,\n type TermField,\n type TermInput,\n type TermReader,\n type TermReadResult,\n type TermRecord,\n} from \"../../types.js\";\nimport { issueNotice, recordOf, skipped, textOf, termOf, type RecordIssue } from \"./normalize.js\";\n\nconst LABEL = \"manifest\";\nconst FIELDS: ReadonlySet<string> = new Set(TERM_FIELDS);\n\nfunction isField(key: string): key is TermField {\n return FIELDS.has(key);\n}\n\n/** What an entry holds: core's `language`, then the terminology fields. */\ntype EntryKey = \"language\" | TermField;\nconst ENTRY_KEYS: readonly EntryKey[] = [\"language\", ...TERM_FIELDS];\n\nfunction isEntryKey(key: string): key is EntryKey {\n return key === \"language\" || isField(key);\n}\n\nfunction read(input: TermInput): TermReadResult {\n if ((input.path ?? input.file).toLowerCase().endsWith(\".json\")) {\n try {\n JSON.parse(input.content);\n } catch (error) {\n throw new TermError(`${input.file}: could not be parsed as JSON: ${errorMessage(error)}`);\n }\n }\n\n const lineCounter = new LineCounter();\n const doc = parseDocument(input.content, { lineCounter, prettyErrors: false });\n const [firstError] = doc.errors;\n if (firstError !== undefined) {\n throw new TermError(`${input.file}: could not be parsed as YAML: ${firstError.message}`);\n }\n const lineOf = (node: Node | null | undefined): number | undefined => {\n const range = node?.range;\n return range === undefined || range === null ? undefined : lineCounter.linePos(range[0]).line;\n };\n\n const root = doc.contents;\n // An empty file holds no entries; it is not a malformed one.\n if (root === null) return { terms: [], notices: [] };\n if (!isMap(root)) {\n throw new TermError(`${input.file}: a term manifest is a mapping of id to entry.`);\n }\n\n const terms: Term[] = [];\n const notices: string[] = [];\n for (const pair of root.items) {\n const keyNode = isScalar(pair.key) ? pair.key : undefined;\n const id = textOf(keyNode?.value);\n const line = lineOf(keyNode) ?? 1;\n if (id === undefined) {\n throw new TermError(`${input.file}:${line}: an entry's key is its id, and must be a non-empty string.`);\n }\n const value = pair.value;\n if (!isMap(value)) {\n throw new TermError(`${input.file}:${line}: entry \"${id}\" is not a mapping of fields.`);\n }\n const raw: Partial<Record<TermField, unknown>> = {};\n const lines: Partial<Record<TermField, number | undefined>> = {};\n for (const field of value.items) {\n const fieldKey = isScalar(field.key) ? field.key : undefined;\n const name = fieldKey?.value;\n if (typeof name !== \"string\" || !isField(name)) continue;\n const fieldValue: unknown = field.value;\n raw[name] = isNode(fieldValue) ? fieldValue.toJSON() : fieldValue;\n lines[name] = lineOf(fieldKey);\n }\n const issues: RecordIssue[] = [];\n const record = recordOf(raw, issues);\n if (record === undefined) {\n notices.push(skipped(input, line, LABEL));\n continue;\n }\n for (const issue of issues) {\n // A nested value's own line; a top-level field's is its key's.\n const nested = issue.path.length > 1 ? value.getIn(issue.path, true) : undefined;\n const [top] = issue.path;\n const topLine = typeof top === \"string\" && isField(top) ? lines[top] : undefined;\n notices.push(issueNotice(input, (isNode(nested) ? lineOf(nested) : undefined) ?? topLine ?? line, record.label, issue));\n }\n const language: unknown = value.get(\"language\");\n terms.push(termOf(input, { record, recordId: id, construct: \"manifest\", line, lines, language }));\n }\n return { terms, notices };\n}\n\n/** What a term says under each entry key: its language and its record's fields. */\nfunction entryValues(language: string | undefined, record: Partial<TermRecord>): Partial<Record<EntryKey, unknown>> {\n return { ...record, ...(language === undefined ? {} : { language }) };\n}\n\n/** A term as a manifest entry: its language, then its fields in the vocabulary's order. */\nfunction entryOf(term: Term): Record<string, unknown> {\n const values = entryValues(term.language, term.record);\n const entry: Record<string, unknown> = {};\n for (const key of ENTRY_KEYS) {\n const value = values[key];\n if (value !== undefined) entry[key] = value;\n }\n return entry;\n}\n\n/** What an entry currently holds, as a reader normalizes it; no fields when it has no label. */\nfunction currentValues(value: unknown): Partial<Record<EntryKey, unknown>> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n const entry = value as Record<string, unknown>;\n const raw: Partial<Record<TermField, unknown>> = {};\n for (const field of TERM_FIELDS) raw[field] = entry[field];\n return entryValues(textOf(entry[\"language\"]), recordOf(raw) ?? {});\n}\n\n/** The keys whose value differs between what the file holds and what the term says. */\nfunction changedKeys(current: Partial<Record<EntryKey, unknown>>, term: Term): EntryKey[] {\n const next = entryValues(term.language, term.record);\n return ENTRY_KEYS.filter((key) => JSON.stringify(current[key]) !== JSON.stringify(next[key]));\n}\n\nfunction applyJson(input: TermInput, terms: readonly Term[]): string {\n let data: unknown;\n try {\n data = JSON.parse(input.content);\n } catch (error) {\n throw new TermError(`${input.file}: could not be parsed as JSON: ${errorMessage(error)}`);\n }\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) {\n throw new TermError(`${input.file}: a term manifest is a mapping of id to entry.`);\n }\n const root = data as Record<string, unknown>;\n let changed = false;\n for (const term of terms) {\n const existing = root[term.id];\n if (typeof existing !== \"object\" || existing === null || Array.isArray(existing)) {\n if (existing !== undefined) {\n throw new TermError(`${input.file}: entry \"${term.id}\" is not a mapping of fields.`);\n }\n root[term.id] = entryOf(term);\n changed = true;\n continue;\n }\n const entry = existing as Record<string, unknown>;\n const keys = changedKeys(currentValues(entry), term);\n if (keys.length === 0) continue;\n const values = entryValues(term.language, term.record);\n // Rebuilt rather than mutated, so a field keeps its place and a removed one is simply not copied.\n const next: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entry)) {\n if (!isEntryKey(key) || !keys.includes(key)) next[key] = value;\n else if (values[key] !== undefined) next[key] = values[key];\n }\n for (const key of keys) {\n if (values[key] !== undefined && !(key in next)) next[key] = values[key];\n }\n root[term.id] = next;\n changed = true;\n }\n if (!changed) return input.content;\n const text = `${JSON.stringify(root, null, 2)}\\n`;\n return input.content.includes(\"\\r\\n\") ? text.replaceAll(\"\\n\", \"\\r\\n\") : text;\n}\n\n/** Each top-level entry's `[start, end)` in the text it was parsed from: its key through its value. */\nfunction entryRanges(root: YAMLMap): Map<string, { start: number; end: number }> {\n const ranges = new Map<string, { start: number; end: number }>();\n for (const pair of root.items) {\n if (!isScalar(pair.key)) continue;\n const id = textOf(pair.key.value);\n const start = pair.key.range?.[0];\n const end = isNode(pair.value) ? pair.value.range?.[1] : pair.key.range?.[1];\n if (id !== undefined && start !== undefined && end !== undefined) ranges.set(id, { start, end });\n }\n return ranges;\n}\n\n/** Edit the keys of `entry` that differ from `term`. Returns whether anything changed. */\nfunction editEntry(doc: ReturnType<typeof parseDocument>, entry: YAMLMap, term: Term): boolean {\n const keys = changedKeys(currentValues(entry.toJSON()), term);\n const values = entryValues(term.language, term.record);\n for (const key of keys) {\n const value = values[key];\n if (value === undefined) {\n entry.delete(key);\n } else if (Array.isArray(value)) {\n // A list keeps the style it was written in.\n const previous = entry.get(key, true);\n const node = doc.createNode(value);\n node.flow = isSeq(previous) && previous.flow === true;\n entry.set(key, node);\n } else if (typeof value === \"object\" && value !== null) {\n entry.set(key, doc.createNode(value));\n } else {\n // A scalar set in place keeps its quoting and its comments.\n entry.set(key, value);\n }\n }\n return keys.length > 0;\n}\n\n/**\n * The document is edited through the Document API and stringified, and only\n * the entries that changed are taken from that text: every other byte of the\n * file stays as it was written, since stringifying reflows what it did not\n * touch (flow-list spacing, comment spacing).\n */\nfunction applyYaml(input: TermInput, terms: readonly Term[]): string {\n const { content } = input;\n const doc = parseDocument(content, { prettyErrors: false });\n const [firstError] = doc.errors;\n if (firstError !== undefined) {\n throw new TermError(`${input.file}: could not be parsed as YAML: ${firstError.message}`);\n }\n const eol = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const root = doc.contents;\n if (root === null) {\n // An empty manifest: every entry is new, and there is nothing to keep.\n if (terms.length === 0) return content;\n const entries = Object.fromEntries(terms.map((term) => [term.id, entryOf(term)]));\n return stringifyYaml(entries, { lineWidth: 0 }).replaceAll(\"\\n\", eol);\n }\n if (!isMap(root)) {\n throw new TermError(`${input.file}: a term manifest is a mapping of id to entry.`);\n }\n const wholeFile = root.flow === true;\n const before = entryRanges(root);\n\n const changed: string[] = [];\n const added: string[] = [];\n for (const term of terms) {\n const pair = root.items.find((item) => isScalar(item.key) && textOf(item.key.value) === term.id);\n if (pair === undefined) {\n root.add(doc.createPair(term.id, entryOf(term)));\n added.push(term.id);\n continue;\n }\n if (!isMap(pair.value)) {\n throw new TermError(`${input.file}: entry \"${term.id}\" is not a mapping of fields.`);\n }\n if (editEntry(doc, pair.value, term)) changed.push(term.id);\n }\n if (changed.length === 0 && added.length === 0) return content;\n\n const text = doc.toString({ lineWidth: 0 });\n if (wholeFile) return text.replaceAll(\"\\n\", eol);\n\n const written = parseDocument(text).contents;\n const after = isMap(written) ? entryRanges(written) : new Map<string, { start: number; end: number }>();\n const entryText = (id: string): string => {\n const range = after.get(id);\n if (range === undefined) throw new TermError(`${input.file}: could not write entry \"${id}\".`);\n return text.slice(range.start, range.end).replaceAll(\"\\n\", eol);\n };\n\n let next = content;\n const edits = changed\n .map((id) => ({ id, range: before.get(id) }))\n .sort((a, b) => (b.range?.start ?? 0) - (a.range?.start ?? 0));\n for (const { id, range } of edits) {\n if (range === undefined) throw new TermError(`${input.file}: could not write entry \"${id}\".`);\n next = next.slice(0, range.start) + entryText(id) + next.slice(range.end);\n }\n if (added.length > 0) {\n if (next !== \"\" && !next.endsWith(\"\\n\")) next += eol;\n next += added.map((id) => `${entryText(id)}${eol}`).join(\"\");\n }\n return next;\n}\n\nfunction isJson(input: TermInput): boolean {\n return (input.path ?? input.file).toLowerCase().endsWith(\".json\");\n}\n\nexport const manifestReader: TermReader = {\n construct: \"manifest\",\n label: LABEL,\n formats: [\"manifest\"],\n read,\n apply: (input, terms) => (isJson(input) ? applyJson(input, terms) : applyYaml(input, terms)),\n};\n","/**\n * A term page: one term per file, its record in the file's metadata channel.\n * Every extractor already reads that channel, so this reader works in every\n * format meta reads, and is told apart from any other page by `type: term`.\n *\n * It writes back through the same extractor: a field that changed is set, a\n * field that became absent is removed, and nothing outside the terminology\n * fields is touched.\n */\nimport { extractorByName } from \"../../../meta/internal.js\";\nimport { errorMessage } from \"../../../shared/errors.js\";\nimport { TermError } from \"../../errors.js\";\nimport {\n TERM_FIELDS,\n type Term,\n type TermField,\n type TermInput,\n type TermReader,\n type TermReadResult,\n} from \"../../types.js\";\nimport {\n declares,\n issueNotice,\n nothing,\n pointerOf,\n recordOf,\n skipped,\n termOf,\n type RecordIssue,\n} from \"./normalize.js\";\nimport { sameFields } from \"./splice.js\";\n\nconst LABEL = \"page\";\n\nfunction read(input: TermInput): TermReadResult {\n if (!declares(input, \"term\")) return nothing();\n const raw: Partial<Record<TermField, unknown>> = {};\n const lines: Partial<Record<TermField, number | undefined>> = {};\n for (const field of TERM_FIELDS) {\n raw[field] = input.metadata[field];\n lines[field] = input.lineFor(`/${field}`);\n }\n const issues: RecordIssue[] = [];\n const record = recordOf(raw, issues);\n if (record === undefined) return { terms: [], notices: [skipped(input, 1, LABEL)] };\n return {\n terms: [termOf(input, { record, recordId: input.metadata[\"id\"], construct: \"page\", line: 1, lines })],\n notices: issues.map((issue) => issueNotice(input, input.lineFor(pointerOf(issue.path)) ?? 1, record.label, issue)),\n };\n}\n\nfunction apply(input: TermInput, terms: readonly Term[]): string {\n const [term] = terms;\n if (term === undefined) return input.content;\n const [current] = read(input).terms;\n if (current === undefined) {\n throw new TermError(`${input.file}: is not a term page any more. Read the file again before writing it.`);\n }\n\n const patch: Record<string, unknown> = {};\n const deletions: TermField[] = [];\n for (const field of TERM_FIELDS) {\n if (sameFields(current.record, term.record, [field])) continue;\n const value = term.record[field];\n if (value === undefined) deletions.push(field);\n else patch[field] = value;\n }\n if (Object.keys(patch).length === 0 && deletions.length === 0) return input.content;\n\n const extractor = extractorByName(input.format);\n if (extractor?.apply === undefined) {\n throw new TermError(`${input.file}: manni cannot write ${input.format} metadata.`);\n }\n const filePath = input.path ?? input.file;\n let next: string;\n try {\n next = extractor.apply(input.content, patch, { deletions, filePath });\n } catch (error) {\n throw new TermError(`${input.file}: ${errorMessage(error)}`);\n }\n // A writer that cannot remove a key ignores the request; say so rather than\n // report a write that left the field in place.\n const written = extractor.extract(next, filePath).data;\n for (const field of deletions) {\n if (written[field] !== undefined) {\n throw new TermError(`${input.file}: could not remove ${field} from its ${input.format} metadata. Remove it by hand.`);\n }\n }\n return next;\n}\n\nexport const pageReader: TermReader = {\n construct: \"page\",\n label: LABEL,\n formats: [\"markdown\", \"mdx\", \"asciidoc\", \"rst\", \"html\", \"xml\"],\n read,\n apply,\n};\n","/**\n * SKOS concept schemes (proposal 0086 § 5): each `skos:Concept` is a term\n * per language its `skos:prefLabel` holds, all sharing the id the concept's\n * IRI ends in, so the languages join on `id` as TBX's do (proposal 0084).\n *\n * The loader hands this reader Turtle, or N-Quads it expanded from JSON-LD,\n * so one parse covers both. A value no term field holds is not dropped\n * quietly: the reader counts it and says so once per file.\n *\n * RDF is a set of triples, so the order a file lists its concepts in says\n * nothing. Terms come out sorted by id, and a concept's languages sorted by\n * tag, so a Turtle file and its JSON-LD twin read the same.\n */\nimport { Parser, type Quad, type Term as RdfTerm } from \"n3\";\nimport { errorMessage } from \"../../../shared/errors.js\";\nimport { TermError } from \"../../errors.js\";\nimport type { Term, TermField, TermInput, TermReader, TermReadResult } from \"../../types.js\";\nimport { recordOf, termOf } from \"./normalize.js\";\n\nexport const SKOS = \"http://www.w3.org/2004/02/skos/core#\";\nconst RDF_TYPE = \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\";\nconst CONCEPT = `${SKOS}Concept`;\n\n/**\n * How a property's values sit in a term. `text` and `texts` are literals per\n * language, one value or a list; `concepts` and `iris` are IRIs the concept\n * holds in every language, as a target's id or as written; `code` is one\n * literal the concept holds in every language.\n */\nexport type SkosKind = \"text\" | \"texts\" | \"concepts\" | \"iris\" | \"code\";\n\n/** Every SKOS property a term field holds, in the order a concept is written. */\nexport const SKOS_PROPERTIES: readonly { property: string; field: TermField; kind: SkosKind }[] = [\n { property: \"prefLabel\", field: \"label\", kind: \"text\" },\n { property: \"altLabel\", field: \"alt-labels\", kind: \"texts\" },\n { property: \"hiddenLabel\", field: \"hidden-labels\", kind: \"texts\" },\n { property: \"definition\", field: \"definition\", kind: \"text\" },\n { property: \"scopeNote\", field: \"scope-note\", kind: \"text\" },\n { property: \"notation\", field: \"notation\", kind: \"code\" },\n { property: \"broader\", field: \"broader\", kind: \"concepts\" },\n { property: \"narrower\", field: \"narrower\", kind: \"concepts\" },\n { property: \"related\", field: \"related-terms\", kind: \"concepts\" },\n { property: \"exactMatch\", field: \"exact-matches\", kind: \"iris\" },\n { property: \"closeMatch\", field: \"close-matches\", kind: \"iris\" },\n { property: \"broadMatch\", field: \"broad-matches\", kind: \"iris\" },\n { property: \"narrowMatch\", field: \"narrow-matches\", kind: \"iris\" },\n { property: \"relatedMatch\", field: \"related-matches\", kind: \"iris\" },\n { property: \"note\", field: \"notes\", kind: \"texts\" },\n { property: \"example\", field: \"contexts\", kind: \"texts\" },\n];\n\nconst BY_IRI = new Map(SKOS_PROPERTIES.map((p) => [`${SKOS}${p.property}`, p]));\n\n/** Read for what it says about the scheme, which no term holds, so never reported. */\nconst UNDERSTOOD: ReadonlySet<string> = new Set([RDF_TYPE, `${SKOS}inScheme`, `${SKOS}topConceptOf`]);\n\n/** The prefixes a notice spells a property with. */\nconst PREFIXES: readonly [string, string][] = [\n [\"skos\", SKOS],\n [\"rdf\", \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"],\n [\"rdfs\", \"http://www.w3.org/2000/01/rdf-schema#\"],\n [\"dcterms\", \"http://purl.org/dc/terms/\"],\n [\"owl\", \"http://www.w3.org/2002/07/owl#\"],\n];\n\nconst LABEL = \"SKOS concept\";\n\nfunction nameOf(iri: string): string {\n for (const [prefix, namespace] of PREFIXES) {\n if (iri.startsWith(namespace)) return `${prefix}:${iri.slice(namespace.length)}`;\n }\n return `<${iri}>`;\n}\n\n/** What an IRI ends in, after its last `#` or `/`, percent-decoded. `undefined` when that is empty. */\nexport function localName(iri: string): string | undefined {\n const tail = iri.slice(Math.max(iri.lastIndexOf(\"#\"), iri.lastIndexOf(\"/\")) + 1);\n if (tail === \"\") return undefined;\n try {\n return decodeURIComponent(tail);\n } catch {\n return tail;\n }\n}\n\n/** Values a file held that no term does, counted per reason in the order first met. */\nclass Unread {\n private readonly counts = new Map<string, number>();\n add(reason: string): void {\n this.counts.set(reason, (this.counts.get(reason) ?? 0) + 1);\n }\n notices(file: string): string[] {\n return [...this.counts].map(\n ([reason, n]) => `${file}: ${reason}, so ${n === 1 ? \"1 value was\" : `${String(n)} values were`} not read.`,\n );\n }\n}\n\nfunction parse(input: TermInput): Quad[] {\n try {\n return new Parser().parse(input.content);\n } catch (error) {\n throw new TermError(`${input.file}: could not be read as SKOS: ${errorMessage(error)}`);\n }\n}\n\n/** A concept's quads, as one entry per concept, in the order first met. */\nfunction concepts(quads: readonly Quad[]): Map<string, { subject: RdfTerm; quads: Quad[] }> {\n const typed = new Set(\n quads.filter((q) => q.predicate.value === RDF_TYPE && q.object.value === CONCEPT).map((q) => q.subject.id),\n );\n const found = new Map<string, { subject: RdfTerm; quads: Quad[] }>();\n for (const quad of quads) {\n if (!typed.has(quad.subject.id)) continue;\n const entry = found.get(quad.subject.id) ?? { subject: quad.subject, quads: [] };\n entry.quads.push(quad);\n found.set(quad.subject.id, entry);\n }\n return found;\n}\n\ntype Raw = Partial<Record<TermField, string | string[]>>;\n\nfunction append(raw: Raw, field: TermField, value: string): void {\n const current = raw[field];\n raw[field] = Array.isArray(current) ? [...current, value] : [value];\n}\n\nfunction readConcept(\n input: TermInput,\n subject: RdfTerm,\n quads: readonly Quad[],\n unread: Unread,\n notices: string[],\n): Term[] {\n const id = subject.termType === \"NamedNode\" ? localName(subject.value) : undefined;\n const name = id ?? subject.value;\n const languages = new Map<string, Raw>();\n for (const quad of quads) {\n if (quad.predicate.value === `${SKOS}prefLabel` && quad.object.termType === \"Literal\") {\n languages.set(quad.object.language, languages.get(quad.object.language) ?? {});\n }\n }\n if (languages.size === 0) {\n notices.push(`${input.file}: skipped SKOS concept \"${name}\", which has no skos:prefLabel.`);\n return [];\n }\n\n const shared: Raw = {};\n for (const { predicate, object } of quads) {\n if (UNDERSTOOD.has(predicate.value)) continue;\n const property = BY_IRI.get(predicate.value);\n const spelled = nameOf(predicate.value);\n if (property === undefined) {\n unread.add(`${spelled} is not a term field`);\n continue;\n }\n if (property.kind === \"concepts\" || property.kind === \"iris\") {\n if (object.termType === \"Literal\") {\n unread.add(`${spelled} on \"${name}\" is not an IRI`);\n continue;\n }\n const value = property.kind === \"concepts\" ? (localName(object.value) ?? object.value) : object.value;\n append(shared, property.field, value);\n continue;\n }\n if (object.termType !== \"Literal\") {\n unread.add(`${spelled} on \"${name}\" is not text`);\n continue;\n }\n if (property.kind === \"code\") {\n if (shared[property.field] === undefined) shared[property.field] = object.value;\n else unread.add(`\"${name}\" holds one ${spelled}`);\n continue;\n }\n const language = object.language;\n const raw = languages.get(language);\n if (raw === undefined) {\n unread.add(language === \"\" ? `\"${name}\" has no untagged skos:prefLabel` : `\"${name}\" has no skos:prefLabel in ${language}`);\n continue;\n }\n if (property.kind === \"texts\") {\n append(raw, property.field, object.value);\n } else if (raw[property.field] === undefined) {\n raw[property.field] = object.value;\n } else {\n unread.add(`\"${name}\" holds one ${spelled} per language`);\n }\n }\n\n const terms: Term[] = [];\n for (const language of [...languages.keys()].sort()) {\n const record = recordOf({ ...languages.get(language), ...shared });\n if (record === undefined) continue;\n // ponytail: no line per triple from n3, so every term sits on line 1; track token lines if findings need them.\n terms.push(\n termOf(input, { record, recordId: id, construct: \"skos\", line: 1, lines: {}, language: language === \"\" ? undefined : language }),\n );\n }\n return terms;\n}\n\nfunction read(input: TermInput): TermReadResult {\n const unread = new Unread();\n const notices: string[] = [];\n const entries = [...concepts(parse(input)).values()].map(({ subject, quads }) => ({\n subject: subject.value,\n terms: readConcept(input, subject, quads, unread, notices),\n }));\n entries.sort((a, b) => {\n const [x, y] = [a.terms[0]?.id ?? \"\", b.terms[0]?.id ?? \"\"];\n return x === y ? (a.subject < b.subject ? -1 : 1) : x < y ? -1 : 1;\n });\n return { terms: entries.flatMap((entry) => entry.terms), notices: [...notices, ...unread.notices(input.file)] };\n}\n\nexport const skosReader: TermReader = {\n construct: \"skos\",\n label: LABEL,\n formats: [\"skos\"],\n read,\n};\n","/**\n * TBX termbases (proposal 0084): one reader for v2 (`<martif>`) and v3\n * (`<tbx>`), DCA and DCT style, the version told by the root element. Each\n * entry yields a term per language, all sharing the entry's id, so a\n * German and an English designation of one concept are siblings joined on\n * `id`.\n *\n * A category is read into its named field only when `tbx-model.ts` writes it\n * back as it was. Anything else, a vendor category, an extra attribute, a\n * second definition, rides along whole in `tbx-elements` at its level. The\n * header is not part of any term: an in-place write never touches it.\n */\nimport { isDeepStrictEqual } from \"node:util\";\nimport { DOMParser, type Element } from \"@xmldom/xmldom\";\nimport { TermError } from \"../../errors.js\";\nimport {\n TERM_AUX_FIELDS,\n TERM_FIELDS,\n type MergeConflict,\n type Term,\n type TermAuxField,\n type TermAuxRecord,\n type TermDesignation,\n type TermField,\n type TermInput,\n type TermLink,\n type TermReader,\n type TermReadResult,\n type TermTransaction,\n} from \"../../types.js\";\nimport { slugOf } from \"../id.js\";\nimport { reindent } from \"../writers/markup.js\";\nimport { mergeFirst } from \"../writers/merge.js\";\nimport { languageKey } from \"../writers/render-util.js\";\nimport { nothing, recordOf, skipped, termOf, textOf } from \"./normalize.js\";\nimport { indentAt, lineEnding, sameFields } from \"./splice.js\";\nimport {\n TBX_CATEGORIES,\n TBX_LINK_FIELDS,\n TBX_MODULE_NAMESPACES,\n TBX_NO_STATUS,\n TBX_STATUS_VALUES,\n TBX_TERM_NOTES,\n TBX_TEXT_FIELDS,\n TBX_V3_NAMESPACE,\n escapeAttribute,\n isTermNoteItem,\n lf,\n markupText,\n rememberTbxSource,\n tbxEntryLines,\n tbxSourceOf,\n type TbxCategory,\n type TbxCategoryName,\n type TbxDesignationShape,\n type TbxDocument,\n type TbxEntryShape,\n type TbxModule,\n type TbxStatus,\n} from \"./tbx-model.js\";\nimport { childrenOf, lineOfElement, lineStarts, spanOfElement, tagEnd, type ParsedXml } from \"./xml.js\";\n\nconst LABEL = \"TBX entry\";\n\ninterface Doc {\n input: TermInput;\n xml: ParsedXml;\n document: TbxDocument;\n /** The structural namespace: TBX v3's, or none for v2. */\n ns: string;\n}\n\nconst parsed = new WeakMap<TermInput, Doc>();\n\nfunction parseTbx(input: TermInput): Doc {\n const cached = parsed.get(input);\n if (cached !== undefined) return cached;\n const shift = input.content.charCodeAt(0) === 0xfeff ? 1 : 0;\n const body = input.content.slice(shift);\n const errors: string[] = [];\n let root: Element | null = null;\n try {\n root = new DOMParser({\n onError: (level, message) => {\n if (level !== \"error\" && level !== \"fatalError\") return;\n // A DTD-declared entity is not damage: no DTD is ever loaded (see xml.ts).\n if (/entity not found/i.test(message)) return;\n errors.push(message);\n },\n }).parseFromString(body, \"text/xml\").documentElement;\n } catch (error) {\n if (errors.length === 0) errors.push(error instanceof Error ? error.message : String(error));\n }\n const failure = errors[0] ?? (root === null ? \"no root element\" : undefined);\n if (failure !== undefined || root === null) {\n throw new TermError(`${input.file}: could not be read as tbx: Invalid XML: ${failure ?? \"no root element\"}`);\n }\n const local = root.localName ?? root.nodeName;\n if (local !== \"martif\" && local !== \"tbx\") {\n throw new TermError(`${input.file}: is not TBX: its root element is <${root.nodeName}>, not <martif> or <tbx>.`);\n }\n const version = local === \"martif\" ? 2 : 3;\n const prefixes: Record<TbxModule, string> = { min: \"min\", basic: \"basic\", lng: \"lng\" };\n for (let i = 0; i < root.attributes.length; i++) {\n const attribute = root.attributes.item(i);\n if (attribute === null || !attribute.name.startsWith(\"xmlns:\")) continue;\n for (const module of Object.keys(TBX_MODULE_NAMESPACES) as TbxModule[]) {\n if (TBX_MODULE_NAMESPACES[module] === attribute.value) prefixes[module] = attribute.name.slice(\"xmlns:\".length);\n }\n }\n const xml: ParsedXml = { root, body, shift, starts: lineStarts(body) };\n const doc: Doc = {\n input,\n xml,\n ns: root.namespaceURI ?? \"\",\n document: {\n content: input.content,\n version,\n style: version === 3 && root.getAttribute(\"style\") === \"dct\" ? \"dct\" : \"dca\",\n prefixes,\n },\n };\n const bodyEl = structuralChildren(doc, root, \"text\").flatMap((text) => structuralChildren(doc, text, \"body\"))[0];\n if (bodyEl !== undefined) {\n const inner = innerSpan(doc, bodyEl);\n if (inner !== undefined) doc.document.body = inner;\n }\n const headerEl = structuralChildren(doc, root, version === 3 ? \"tbxHeader\" : \"martifHeader\")[0];\n const header = headerEl === undefined ? undefined : innerSpan(doc, headerEl);\n if (header !== undefined) doc.document.header = header;\n const backEl = structuralChildren(doc, root, \"text\").flatMap((text) => structuralChildren(doc, text, \"back\"))[0];\n const back = backEl === undefined ? undefined : innerSpan(doc, backEl);\n if (back !== undefined) doc.document.back = back;\n parsed.set(input, doc);\n return doc;\n}\n\n// ---------------------------------------------------------------------------\n// Elements\n\nfunction isStructural(doc: Doc, el: Element, local: string): boolean {\n return el.localName === local && (el.namespaceURI ?? \"\") === doc.ns;\n}\n\nfunction structuralChildren(doc: Doc, el: Element, local: string): Element[] {\n return childrenOf(el).filter((child) => isStructural(doc, child, local));\n}\n\n/** Whether every attribute but namespace declarations is one of `allowed`. */\nfunction onlyAttributes(el: Element, allowed: readonly string[]): boolean {\n for (let i = 0; i < el.attributes.length; i++) {\n const name = el.attributes.item(i)?.name;\n if (name === undefined || name === \"xmlns\" || name.startsWith(\"xmlns:\")) continue;\n if (!allowed.includes(name)) return false;\n }\n return true;\n}\n\n/** An element's attributes but those in `own`, which manni writes itself, as XML in source order: ` id=\"t1\"`. */\nfunction attributesOf(el: Element, own: readonly string[] = []): string {\n let out = \"\";\n for (let i = 0; i < el.attributes.length; i++) {\n const attribute = el.attributes.item(i);\n if (attribute !== null && !own.includes(attribute.name)) out += ` ${attribute.name}=\"${escapeAttribute(attribute.value)}\"`;\n }\n return out;\n}\n\n/** The category an element spells in the file's style, or `undefined`. */\nfunction categoryOf(doc: Doc, el: Element): TbxCategory | undefined {\n const dct = doc.document.style === \"dct\";\n for (const cat of Object.values(TBX_CATEGORIES)) {\n if (dct) {\n if (el.localName === cat.name && el.namespaceURI === TBX_MODULE_NAMESPACES[cat.module]) return cat;\n } else if (isStructural(doc, el, cat.element) && el.getAttribute(\"type\") === cat.name) {\n return cat;\n }\n }\n return undefined;\n}\n\n/** The attributes a category element carries in canonical form. */\nfunction categoryAttributes(doc: Doc, cat: TbxCategory): string[] {\n const linked = cat.element === \"ref\" || cat.element === \"xref\";\n return [...(doc.document.style === \"dct\" ? [] : [\"type\"]), ...(linked ? [\"target\"] : [])];\n}\n\nfunction innerSpan(doc: Doc, el: Element): { start: number; end: number } | undefined {\n const span = spanOfElement(doc.xml, el);\n if (span === undefined) return undefined;\n const open = tagEnd(doc.xml.body, span.start - doc.xml.shift);\n if (open === undefined) return undefined;\n const start = open.end + doc.xml.shift;\n if (open.selfClosing) return { start, end: start };\n return { start, end: doc.input.content.lastIndexOf(\"</\", span.end - 1) };\n}\n\ninterface Value {\n text: string;\n /** The value's inner XML, when it holds markup or a comment. */\n markup?: string;\n}\n\n/**\n * An `&` that starts neither a predefined entity nor a character reference:\n * a DTD-declared entity, which xmldom leaves as literal text since no DTD is\n * loaded. Escaping that text would write `&name;`.\n */\nconst DTD_ENTITY = /&(?!(?:amp|lt|gt|quot|apos);|#)/;\n\n/**\n * An element's content as a value, or `undefined` when it is empty or its\n * markup would not write back. A value holding a DTD entity reference is\n * `undefined`, so its element rides along whole in `tbx-elements`, unless\n * `entities` is set: then the reference is kept as markup and written back as\n * it was. The term text sets it, since a designation needs its term.\n */\nfunction valueOf(doc: Doc, el: Element, allowMarkup = true, entities = false): Value | undefined {\n const text = lf(el.textContent ?? \"\").trim();\n if (text === \"\") return undefined;\n const inner = innerSpan(doc, el);\n const source = inner === undefined ? undefined : lf(doc.input.content.slice(inner.start, inner.end)).trim();\n const entity = source !== undefined && DTD_ENTITY.test(source);\n if (entity && !entities) return undefined;\n let marked = entity;\n for (let i = 0; i < el.childNodes.length; i++) {\n const type = el.childNodes.item(i)?.nodeType;\n if (type === 1 || type === 7 || type === 8) marked = true;\n }\n if (!marked) return { text };\n if (!allowMarkup || source === undefined) return undefined;\n return markupText(source) === text ? { text, markup: source } : undefined;\n}\n\n/** A category element's value, when the element is in canonical form. */\nfunction categoryValue(doc: Doc, el: Element, name: TbxCategoryName, allowMarkup = true): Value | undefined {\n const cat = TBX_CATEGORIES[name];\n if (categoryOf(doc, el) !== cat || !onlyAttributes(el, categoryAttributes(doc, cat))) return undefined;\n return valueOf(doc, el, allowMarkup);\n}\n\nfunction plainValue(doc: Doc, el: Element, local: string, allowMarkup = true): Value | undefined {\n if (!isStructural(doc, el, local) || !onlyAttributes(el, [])) return undefined;\n return valueOf(doc, el, allowMarkup);\n}\n\n/** The element as a `tbx-elements` item: its source text, LF, dedented, with the namespaces it needs declared. */\nfunction itemOf(doc: Doc, el: Element): string {\n const { content } = doc.input;\n const span = spanOfElement(doc.xml, el);\n if (span === undefined) return `<${el.nodeName}/>`;\n const indent = indentAt(content, span.start);\n const lines = lf(content.slice(span.start, span.end)).split(\"\\n\");\n const text = lines.map((line, i) => (i > 0 && line.startsWith(indent) ? line.slice(indent.length) : line)).join(\"\\n\");\n const declarations = namespacesNeeded(doc, el)\n .map(([prefix, uri]) => ` ${prefix === \"\" ? \"xmlns\" : `xmlns:${prefix}`}=\"${uri.replaceAll('\"', \""\")}\"`)\n .join(\"\");\n const nameEnd = 1 + el.nodeName.length;\n return `${text.slice(0, nameEnd)}${declarations}${text.slice(nameEnd)}`;\n}\n\n/** The prefixes an element's subtree uses and does not declare, with their in-scope namespaces. The TBX v3 namespace is never one. */\nfunction namespacesNeeded(doc: Doc, el: Element): [string, string][] {\n const used = new Set<string>();\n const declared = new Set<string>();\n const walk = (node: Element): void => {\n if (node.prefix !== null && node.prefix !== \"\") used.add(node.prefix);\n for (let i = 0; i < node.attributes.length; i++) {\n const name = node.attributes.item(i)?.name ?? \"\";\n if (name === \"xmlns\") declared.add(\"\");\n else if (name.startsWith(\"xmlns:\")) declared.add(name.slice(\"xmlns:\".length));\n else if (name.includes(\":\")) used.add(name.slice(0, name.indexOf(\":\")));\n }\n for (const child of childrenOf(node)) walk(child);\n };\n walk(el);\n if ((el.prefix ?? \"\") === \"\" && (el.namespaceURI ?? \"\") !== doc.ns && el.namespaceURI !== TBX_V3_NAMESPACE) {\n used.add(\"\");\n }\n const out: [string, string][] = [];\n for (const prefix of used) {\n if (prefix === \"xml\" || declared.has(prefix)) continue;\n const uri = el.lookupNamespaceURI(prefix === \"\" ? null : prefix);\n if (uri !== null && uri !== \"\" && uri !== TBX_V3_NAMESPACE) out.push([prefix, uri]);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Levels\n\ntype Level = \"concept\" | \"language\" | \"term\";\n\n/** What one level reads into: its aux record (a designation at term level) and the markup of its values. */\ninterface LevelRead {\n aux: TermDesignation;\n markup: string[];\n /** Whether a value writes back as it was read. A child holding one that does not goes whole into `tbx-elements`. */\n fits?: (value: Value) => boolean;\n}\n\nfunction push<K extends keyof TermAuxRecord>(aux: TermAuxRecord, field: K, item: NonNullable<TermAuxRecord[K]>[number]): void {\n const list = (aux[field] ?? []) as unknown[];\n list.push(item);\n Object.assign(aux, { [field]: list });\n}\n\n/** A descripGrp holding one definition, then its sources, then its notes: the canonical grouped definition. */\nfunction definitionGroup(doc: Doc, el: Element): { definition: Value; sources: Value[]; notes: Value[] } | undefined {\n if (!isStructural(doc, el, \"descripGrp\") || !onlyAttributes(el, [])) return undefined;\n const [first, ...rest] = childrenOf(el);\n if (first === undefined || rest.length === 0) return undefined;\n const definition = categoryValue(doc, first, \"definition\");\n if (definition === undefined) return undefined;\n const sources: Value[] = [];\n const notes: Value[] = [];\n for (const child of rest) {\n const source = notes.length === 0 ? categoryValue(doc, child, \"source\") : undefined;\n const note = source === undefined ? plainValue(doc, child, \"note\") : undefined;\n if (source !== undefined) sources.push(source);\n else if (note !== undefined) notes.push(note);\n else return undefined;\n }\n return { definition, sources, notes };\n}\n\nfunction linkOf(doc: Doc, el: Element, name: TbxCategoryName): { link: TermLink; value?: Value } | undefined {\n const cat = TBX_CATEGORIES[name];\n if (categoryOf(doc, el) !== cat || !onlyAttributes(el, categoryAttributes(doc, cat))) return undefined;\n const target = el.getAttribute(\"target\");\n if (target === null || target === \"\" || target !== target.trim()) return undefined;\n if (lf(el.textContent ?? \"\").trim() === \"\") return { link: { target } };\n const value = valueOf(doc, el);\n if (value === undefined) return undefined;\n return { link: { target, text: value.text }, value };\n}\n\n/** A transacGrp of a transaction type, then its responsibility, then its date. */\nfunction transactionOf(doc: Doc, el: Element): TermTransaction | undefined {\n if (!isStructural(doc, el, \"transacGrp\") || !onlyAttributes(el, [])) return undefined;\n const children = childrenOf(el);\n const [first] = children;\n const type = first === undefined ? undefined : categoryValue(doc, first, \"transactionType\", false);\n if (type === undefined) return undefined;\n const transaction: TermTransaction = { type: type.text };\n let i = 1;\n const next = children[i];\n const responsibility = next === undefined ? undefined : categoryValue(doc, next, \"responsibility\", false);\n if (responsibility !== undefined) {\n transaction.responsibility = responsibility.text;\n i += 1;\n }\n const last = children[i];\n const date = last === undefined ? undefined : plainValue(doc, last, \"date\", false);\n if (date !== undefined) {\n transaction.date = date.text;\n i += 1;\n }\n return i === children.length ? transaction : undefined;\n}\n\n/** An adminGrp of a reading and its reading note. */\nfunction readingGroup(doc: Doc, el: Element): { reading: Value; note: Value } | undefined {\n if (!isStructural(doc, el, \"adminGrp\") || !onlyAttributes(el, [])) return undefined;\n const children = childrenOf(el);\n const [first, second] = children;\n if (children.length !== 2 || first === undefined || second === undefined) return undefined;\n const reading = categoryValue(doc, first, \"reading\", false);\n const note = categoryValue(doc, second, \"readingNote\");\n return reading === undefined || note === undefined ? undefined : { reading, note };\n}\n\n/** A record status for a termNote value, or `undefined` when the canonical form would write it differently. */\nfunction statusOf(text: string): string | undefined {\n for (const [status, value] of Object.entries(TBX_STATUS_VALUES)) if (value === text) return status;\n return text in TBX_STATUS_VALUES || text === TBX_NO_STATUS ? undefined : text;\n}\n\n/**\n * Read one level's children into `read`. A child the canonical form would not\n * write back as it is goes whole into `tbx-elements`, in source order.\n */\nfunction readLevel(doc: Doc, children: readonly Element[], level: Level, read: LevelRead): void {\n let { aux } = read;\n const items: string[] = [];\n // The values the child being read maps, each of which `read.fits` must accept.\n const seen: Value[] = [];\n const keep = (value: Value): string => {\n seen.push(value);\n if (value.markup !== undefined) read.markup.push(value.markup);\n return value.text;\n };\n // The level's definition, plain or grouped. With one, the level's sources\n // and notes are written in its group, so a loose one would not write back.\n const definitionEl = children.find(\n (child) => categoryValue(doc, child, \"definition\") !== undefined || definitionGroup(doc, child) !== undefined,\n );\n\n const mapped = (child: Element): boolean => {\n // The child's category, found once: every test below compares against it.\n const cat = categoryOf(doc, child);\n const is = (name: TbxCategoryName): boolean => cat === TBX_CATEGORIES[name];\n if (child === definitionEl) {\n const group = definitionGroup(doc, child);\n const plain = categoryValue(doc, child, \"definition\");\n const definition = group?.definition ?? plain;\n if (definition === undefined) return false;\n aux.definition = keep(definition);\n for (const source of group?.sources ?? []) push(aux, \"sources\", keep(source));\n for (const note of group?.notes ?? []) push(aux, \"notes\", keep(note));\n return true;\n }\n if (definitionEl !== undefined && (is(\"source\") || isStructural(doc, child, \"note\"))) return false;\n if (isStructural(doc, child, \"note\")) {\n const note = plainValue(doc, child, \"note\");\n if (note === undefined) return false;\n push(aux, \"notes\", keep(note));\n return true;\n }\n if (isStructural(doc, child, \"transacGrp\")) {\n const transaction = transactionOf(doc, child);\n if (transaction === undefined) return false;\n for (const text of [transaction.type, transaction.responsibility, transaction.date]) if (text !== undefined) keep({ text });\n push(aux, \"transactions\", transaction);\n return true;\n }\n if (level === \"term\" && isStructural(doc, child, \"adminGrp\")) {\n const group = readingGroup(doc, child);\n if (group === undefined || aux.reading !== undefined) return false;\n aux.reading = keep(group.reading);\n aux[\"reading-note\"] = keep(group.note);\n return true;\n }\n for (const [field, name] of TBX_TEXT_FIELDS) {\n if (!is(name)) continue;\n const value = categoryValue(doc, child, name);\n if (value === undefined) return false;\n if (field === \"subject-field\") {\n if (aux[\"subject-field\"] !== undefined) return false;\n aux[\"subject-field\"] = keep(value);\n } else {\n push(aux, field, keep(value));\n }\n return true;\n }\n for (const [field, name] of TBX_LINK_FIELDS) {\n if (!is(name)) continue;\n const link = linkOf(doc, child, name);\n if (link === undefined) return false;\n if (link.value !== undefined) keep(link.value);\n push(aux, field, link.link);\n return true;\n }\n if (level !== \"term\") return false;\n if (is(\"reading\")) {\n const reading = categoryValue(doc, child, \"reading\", false);\n if (reading === undefined || aux.reading !== undefined) return false;\n aux.reading = keep(reading);\n return true;\n }\n if (is(\"transferComment\")) {\n const comment = categoryValue(doc, child, \"transferComment\");\n if (comment === undefined || aux[\"transfer-comments\"] !== undefined) return false;\n aux[\"transfer-comments\"] = [keep(comment)];\n return true;\n }\n for (const [field, name] of TBX_TERM_NOTES) {\n if (!is(name)) continue;\n const value = categoryValue(doc, child, name, field !== \"administrative-status\");\n if (value === undefined || aux[field] !== undefined) return false;\n if (field === \"administrative-status\") {\n const status = statusOf(value.text);\n if (status === undefined) return false;\n keep(value);\n aux[field] = status;\n } else {\n aux[field] = keep(value);\n }\n return true;\n }\n return false;\n };\n\n for (const child of children) {\n const saved = read.fits === undefined ? undefined : { aux: structuredClone(aux), markup: read.markup.length };\n seen.length = 0;\n if (mapped(child) && (read.fits === undefined || seen.every(read.fits))) continue;\n if (saved !== undefined) {\n aux = read.aux = saved.aux;\n read.markup.length = saved.markup;\n }\n items.push(itemOf(doc, child));\n }\n // A term's termNotes precede its other children in TBX, and the canonical\n // form writes them there, so they lead its items whatever the source did.\n const ordered = level === \"term\" ? [...items.filter(isTermNoteItem), ...items.filter((i) => !isTermNoteItem(i))] : items;\n if (ordered.length > 0) aux[\"tbx-elements\"] = ordered;\n}\n\n// ---------------------------------------------------------------------------\n// Entries\n\ninterface DesignationRead {\n designation: TermDesignation;\n /** The term text as read, with its markup when it has some. */\n term: Value;\n markup: string[];\n /** The status as read: a record status, a value as written, or `none`. */\n status: string;\n line: number;\n shape: TbxDesignationShape;\n}\n\n/** A tig, ntig or termSec, or `undefined` when it holds no term. */\nfunction readDesignation(doc: Doc, el: Element, fits?: (value: Value) => boolean): DesignationRead | undefined {\n let children = childrenOf(el);\n let group: Element | undefined;\n if (isStructural(doc, el, \"ntig\")) {\n [group] = structuralChildren(doc, el, \"termGrp\");\n if (group === undefined) return undefined;\n children = [...childrenOf(group), ...children.filter((child) => child !== group)];\n }\n const termEl = children.find((child) => isStructural(doc, child, \"term\"));\n const term = termEl === undefined ? undefined : valueOf(doc, termEl, true, true);\n const text = termEl === undefined ? undefined : textOf(lf(termEl.textContent ?? \"\"));\n if (termEl === undefined || text === undefined) return undefined;\n const read: LevelRead = { aux: { term: text }, markup: term?.markup === undefined ? [] : [term.markup], ...(fits === undefined ? {} : { fits }) };\n readLevel(\n doc,\n children.filter((child) => child !== termEl),\n \"term\",\n read,\n );\n const { \"administrative-status\": status, ...designation } = read.aux;\n const shape: TbxDesignationShape = {\n term: text,\n attributes: attributesOf(el),\n termAttributes: attributesOf(termEl),\n ...(group === undefined ? {} : { group: attributesOf(group) }),\n };\n return {\n designation,\n term: term ?? { text },\n markup: read.markup,\n status: status ?? TBX_NO_STATUS,\n line: lineOfElement(termEl),\n shape,\n };\n}\n\n/** The label fields and designations for one language's designations, by the status rules of proposal 0084. */\nfunction labelsOf(read: readonly DesignationRead[]): {\n label: string;\n alts: string[];\n hiddens: string[];\n designations: TermDesignation[] | undefined;\n} {\n const preferred = read.findIndex((d) => d.status === \"preferred\");\n const labelAt = preferred === -1 ? 0 : preferred;\n const alts: string[] = [];\n const hiddens: string[] = [];\n const order: number[] = [];\n const altOrder: number[] = [];\n const hiddenOrder: number[] = [];\n const designations = read.map((d, i): TermDesignation => {\n const { status } = d;\n let kind: \"label\" | TbxStatus;\n if (i === labelAt) kind = \"label\";\n else if (status === \"deprecated\" || status === \"superseded\") kind = \"deprecated\";\n else kind = \"admitted\";\n if (kind === \"admitted\") {\n alts.push(d.designation.term);\n altOrder.push(i);\n } else if (kind === \"deprecated\") {\n hiddens.push(d.designation.term);\n hiddenOrder.push(i);\n }\n const implied = kind === \"label\" ? \"preferred\" : kind;\n return status === implied ? d.designation : { ...d.designation, \"administrative-status\": status };\n });\n order.push(labelAt, ...altOrder, ...hiddenOrder);\n const reordered = order.some((at, i) => at !== i);\n const detailed = designations.some((d) => Object.keys(d).length > 1);\n return {\n label: read[labelAt]?.designation.term ?? \"\",\n alts,\n hiddens,\n designations: reordered || detailed ? designations : undefined,\n };\n}\n\ntype Fits = (value: Value) => boolean;\n\n/** An entry's levels as read: its concept level, then each language section with its designations. */\ninterface EntryParts {\n concept: LevelRead;\n languages: { el: Element; designations: DesignationRead[]; language: LevelRead }[];\n}\n\nfunction readParts(doc: Doc, entry: Element, fits?: { concept: Fits; languages: readonly Fits[] }): EntryParts {\n const languageTag = doc.document.version === 3 ? \"langSec\" : \"langSet\";\n const designationTags = doc.document.version === 3 ? [\"termSec\"] : [\"tig\", \"ntig\"];\n const children = childrenOf(entry);\n const concept: LevelRead = { aux: { term: \"\" }, markup: [], ...(fits === undefined ? {} : { fits: fits.concept }) };\n readLevel(\n doc,\n children.filter((child) => !isStructural(doc, child, languageTag)),\n \"concept\",\n concept,\n );\n const languages = children\n .filter((child) => isStructural(doc, child, languageTag))\n .map((el, i) => {\n const at = fits?.languages[i];\n const designations: DesignationRead[] = [];\n const others: Element[] = [];\n for (const child of childrenOf(el)) {\n const isDesignation = designationTags.some((tag) => isStructural(doc, child, tag));\n const designation = isDesignation ? readDesignation(doc, child, at) : undefined;\n if (designation !== undefined) designations.push(designation);\n else others.push(child);\n }\n const language: LevelRead = { aux: { term: \"\" }, markup: [], ...(at === undefined ? {} : { fits: at }) };\n if (designations.length > 0) readLevel(doc, others, \"language\", language);\n return { el, designations, language };\n });\n return { concept, languages };\n}\n\n/** The `tbx-markup` of one language's term: its concept level's, its own, then its designations'. */\nfunction markupOf(concept: LevelRead, language: EntryParts[\"languages\"][number]): string[] {\n return [...new Set([...concept.markup, ...language.language.markup, ...language.designations.flatMap((d) => d.markup)])];\n}\n\n/**\n * Which values write back as they were read. The writer gives a value the\n * first `tbx-markup` item of its term whose text it is, so a value fits when\n * that item is its own markup, or there is none and it has none. A term\n * cannot move, so a value sharing a term's text fits only with the term's\n * markup. `undefined` when the entry holds no markup, and every value fits.\n * The concept level is written with whichever term leads the entry, so it\n * is held to every language's markup and terms.\n */\nfunction fitsOf(parts: EntryParts): { concept: Fits; languages: Fits[] } | undefined {\n const pools = parts.languages.map((language) => markupOf(parts.concept, language));\n if (pools.every((pool) => pool.length === 0)) return undefined;\n const fits =\n (pool: readonly string[], terms: readonly Value[]): Fits =>\n (value) =>\n pool.find((item) => markupText(item) === value.text) === value.markup &&\n terms.every((term) => term.text !== value.text || term.markup === value.markup);\n return {\n concept: fits(\n [...new Set(pools.flat())],\n parts.languages.flatMap((language) => language.designations.map((d) => d.term)),\n ),\n languages: parts.languages.map((language, i) => fits(pools[i] ?? [], language.designations.map((d) => d.term))),\n };\n}\n\nfunction readEntry(doc: Doc, entry: Element, result: TermReadResult): void {\n const { input } = doc;\n // Read once to learn the entry's markup, then again holding every value to it.\n const first = readParts(doc, entry);\n const fits = fitsOf(first);\n const parts = fits === undefined ? first : readParts(doc, entry, fits);\n const { concept } = parts;\n const { term: _none, ...conceptAux } = concept.aux;\n const span = spanOfElement(doc.xml, entry);\n const rootLanguage = doc.xml.root.getAttribute(\"xml:lang\");\n const read: Term[] = [];\n let entryId = textOf(entry.getAttribute(\"id\"));\n const shape: TbxEntryShape = { attributes: attributesOf(entry, [\"id\"]), languages: [] };\n\n for (const part of parts.languages) {\n const { el: langEl, designations } = part;\n if (designations.length === 0) {\n result.notices.push(skipped(input, lineOfElement(langEl), \"TBX\"));\n (shape.unread ??= []).push(itemOf(doc, langEl));\n continue;\n }\n const { term: _term, ...languageAux } = part.language.aux;\n const labels = labelsOf(designations);\n const markup = markupOf(concept, part);\n const raw: Partial<Record<TermField, unknown>> = {\n ...languageAux,\n label: labels.label,\n \"alt-labels\": labels.alts,\n \"hidden-labels\": labels.hiddens,\n ...(Object.keys(conceptAux).length === 0 ? {} : { \"concept-entry\": structuredClone(conceptAux) }),\n ...(labels.designations === undefined ? {} : { designations: labels.designations }),\n ...(markup.length === 0 ? {} : { \"tbx-markup\": markup }),\n };\n const record = recordOf(raw);\n if (record === undefined) continue;\n entryId ??= slugOf(record.label);\n const term = termOf(input, {\n record,\n language: langEl.getAttribute(\"xml:lang\") ?? rootLanguage,\n constructId: entryId,\n construct: \"tbx-entry\",\n line: lineOfElement(langEl),\n lines: { label: designations[0]?.line },\n ...(span === undefined ? {} : { span }),\n });\n if (span !== undefined) rememberTbxSource(term, { document: doc.document, span, shape });\n shape.languages.push({\n language: term.language,\n attributes: attributesOf(langEl, [\"xml:lang\"]),\n designations: designations.map((d) => d.shape),\n });\n read.push(term);\n }\n result.terms.push(...read);\n}\n\nfunction readTbx(input: TermInput): TermReadResult {\n const doc = parseTbx(input);\n const result = nothing();\n const body = doc.document.body;\n if (body === undefined) return result;\n const entryTag = doc.document.version === 3 ? \"conceptEntry\" : \"termEntry\";\n for (const text of structuralChildren(doc, doc.xml.root, \"text\")) {\n for (const bodyEl of structuralChildren(doc, text, \"body\")) {\n for (const entry of structuralChildren(doc, bodyEl, entryTag)) readEntry(doc, entry, result);\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// In place\n\nfunction sameTerm(a: Term, b: Term): boolean {\n return a.id === b.id && a.language === b.language && sameFields(a.record, b.record, TERM_FIELDS);\n}\n\n/**\n * Rewrite the entries whose terms changed, each as a whole in canonical form,\n * indented where it sat and in the file's line endings. An entry none of\n * whose terms changed keeps its bytes, and so does the header.\n */\nfunction applyTbx(input: TermInput, terms: readonly Term[], conflicts?: MergeConflict[]): string {\n const spliced = spliceEntries(input, terms, false);\n conflicts?.push(...spliced.conflicts);\n return spliced.content;\n}\n\n/**\n * The TBX document the terms were all read from, written with the terms as\n * they are now (a same-source export): unchanged entries and everything\n * outside them keep their bytes, a changed entry is written canonically in\n * the document's version and style, and an entry none of whose terms is\n * given is left out. Where an entry's terms disagree on an edit to its\n * `concept-entry`, the first term's is kept and reported.\n */\nexport function exportTbxSource(\n document: TbxDocument,\n file: string,\n terms: readonly Term[],\n): { content: string; conflicts: MergeConflict[] } {\n const input: TermInput = { content: document.content, file, format: \"tbx\", metadata: {}, lineFor: () => undefined };\n return spliceEntries(input, terms, true);\n}\n\n/** `content` without `[start, end)`, and without the line it sat on when nothing else is on it. */\nfunction removeSpan(content: string, start: number, end: number): string {\n const lineStart = content.lastIndexOf(\"\\n\", start - 1) + 1;\n const after = /^[ \\t]*(\\r?\\n|$)/.exec(content.slice(end))?.[0];\n if (!/^[ \\t]*$/.test(content.slice(lineStart, start)) || after === undefined) {\n return content.slice(0, start) + content.slice(end);\n }\n return content.slice(0, lineStart) + content.slice(end + after.length);\n}\n\n/**\n * The entries of `input` with `terms` written over them. In place, an entry\n * given no terms, or only some of its languages, keeps the rest as read; an\n * export writes exactly the terms given.\n */\nfunction spliceEntries(\n input: TermInput,\n terms: readonly Term[],\n exporting: boolean,\n): { content: string; conflicts: MergeConflict[] } {\n const doc = parseTbx(input);\n const { content } = input;\n const groups = new Map<number, { end: number; current: Term[]; next: Term[] }>();\n for (const term of readTbx(input).terms) {\n const span = term.location.span;\n if (span === undefined) continue;\n const group = groups.get(span.start) ?? { end: span.end, current: [], next: [] };\n group.current.push(term);\n groups.set(span.start, group);\n }\n for (const term of terms) {\n const span = term.location.span;\n if (span === undefined) {\n throw new TermError(\n `${input.file}: term \"${term.id}\" cannot be written in place, because its entry has no position in the file.`,\n );\n }\n const group = groups.get(span.start);\n if (group?.end !== span.end) {\n throw new TermError(\n `${input.file}: term \"${term.id}\" does not match an entry in the file. Read the file again before writing it.`,\n );\n }\n group.next.push(term);\n }\n\n const eol = lineEnding(content);\n let next = content;\n const conflicts: MergeConflict[] = [];\n for (const [start, group] of [...groups.entries()].sort((a, b) => b[0] - a[0])) {\n if (group.next.length === 0) {\n if (exporting) next = removeSpan(next, start, group.end);\n continue;\n }\n const written =\n exporting || group.next.length >= group.current.length ? group.next : merge(group.current, group.next);\n const unchanged = written.length === group.current.length && written.every((t, i) => {\n const was = group.current[i];\n return was !== undefined && sameTerm(was, t);\n });\n if (unchanged) continue;\n // At the file's own version, each element keeps the attributes and ntig it was read with.\n const shape = group.current[0] === undefined ? undefined : tbxSourceOf(group.current[0])?.shape;\n const edited = withEditedConcept(written, group.current);\n conflicts.push(...edited.conflicts);\n const lines = tbxEntryLines(edited.terms, doc.document, shape);\n const text = reindent(lines.join(\"\\n\"), indentAt(content, start), eol);\n next = next.slice(0, start) + text + next.slice(group.end);\n }\n return { content: next, conflicts };\n}\n\n/**\n * The entry writes one `concept-entry`, its first term's. Every term of the\n * entry is read with the same one, so a field where a term differs from it as\n * read holds that term's edit, and the first term carries it. Where terms\n * edit one field to different values, the first edit wins and the field is\n * reported, as `mergeFirst` does for a render.\n */\nfunction withEditedConcept(\n written: readonly Term[],\n current: readonly Term[],\n): { terms: readonly Term[]; conflicts: MergeConflict[] } {\n const [head, ...rest] = written;\n if (head === undefined) return { terms: written, conflicts: [] };\n const read = current[0]?.record[\"concept-entry\"] ?? {};\n const concepts = written.map((t) => t.record[\"concept-entry\"] ?? {});\n const edits = (concept: TermAuxRecord): TermAuxField[] =>\n TERM_AUX_FIELDS.filter((field) => !isDeepStrictEqual(concept[field], read[field]));\n // An edit is wrapped, so one that removes a field is still a value to merge.\n const { conflicts } = mergeFirst(\n head.id,\n concepts.map((c) => Object.fromEntries(edits(c).map((field) => [field, { value: c[field] }]))),\n \"concept-entry.\",\n );\n const concept: TermAuxRecord = {};\n for (const field of TERM_AUX_FIELDS) {\n copyField(concept, concepts.find((c) => edits(c).includes(field)) ?? read, field);\n }\n const { \"concept-entry\": _old, ...record } = head.record;\n const joined = Object.keys(concept).length === 0 ? record : { ...record, \"concept-entry\": concept };\n return { terms: [{ ...head, record: joined }, ...rest], conflicts };\n}\n\nfunction copyField<K extends TermAuxField>(to: Pick<TermAuxRecord, K>, from: TermAuxRecord, field: K): void {\n const value = from[field];\n if (value !== undefined) to[field] = value;\n}\n\n/** The entry's terms with each one the caller handed in, matched on language, in place of the one read. */\nfunction merge(current: readonly Term[], given: readonly Term[]): Term[] {\n const left = [...given];\n return current.map((term) => {\n const at = left.findIndex((t) => languageKey(t) === languageKey(term));\n return at === -1 ? term : (left.splice(at, 1)[0] ?? term);\n });\n}\n\nexport const tbxEntryReader: TermReader = {\n construct: \"tbx-entry\",\n label: LABEL,\n formats: [\"tbx\"],\n read: readTbx,\n apply: applyTbx,\n};\n","/**\n * Joining a multilingual set on `id` (proposal 0084): one term per language,\n * and what a render that writes one entry per id does with the values the\n * entry holds once. The merge goes field by field, an absent value says\n * nothing, and the first term in set order wins. Every field where a later\n * term disagrees is a `MergeConflict`, which the write report prints.\n */\nimport { isDeepStrictEqual } from \"node:util\";\nimport type { MergeConflict, Term } from \"../../types.js\";\n\n/** The terms grouped by id, groups in order of first appearance, each in set order. */\nexport function conceptGroups(terms: readonly Term[]): Term[][] {\n const groups = new Map<string, Term[]>();\n for (const term of terms) {\n const group = groups.get(term.id);\n if (group === undefined) groups.set(term.id, [term]);\n else group.push(term);\n }\n return [...groups.values()];\n}\n\n/**\n * `values` merged field by field: each key takes its first defined value. A\n * key where a later value differs is reported as a conflict on `id`, its\n * field spelled `prefix` + key (`concept-entry.` + `subject-field`), in the\n * order the merged keys first appear.\n */\nexport function mergeFirst<T extends object>(\n id: string,\n values: readonly (T | undefined)[],\n prefix = \"\",\n): { merged: Partial<T>; conflicts: MergeConflict[] } {\n const merged: Record<string, unknown> = {};\n const conflicted = new Set<string>();\n for (const value of values) {\n if (value === undefined) continue;\n for (const [key, field] of Object.entries(value)) {\n if (field === undefined) continue;\n if (!(key in merged)) merged[key] = field;\n else if (!isDeepStrictEqual(merged[key], field)) conflicted.add(key);\n }\n }\n return {\n merged: merged as Partial<T>,\n conflicts: Object.keys(merged)\n .filter((key) => conflicted.has(key))\n .map((key) => ({ id, field: `${prefix}${key}` })),\n };\n}\n","/**\n * TBX's canonical form (proposal 0084): how a term set's entries are written\n * as TBX v2 or v3, DCA or DCT. The reader keeps an element in a named field\n * only when this form writes it back unchanged, ignoring whitespace and\n * attribute order, so this module is the reader's fidelity rule and the\n * writers' serializer at once.\n *\n * Within a level the order is fixed: the named fields in the order below, then\n * `tbx-elements` in source order. A level's children (a language, a term)\n * follow, as TBX's content model puts them. A definition that shares its level\n * with sources or notes is written in one `descripGrp` with them.\n */\nimport { DOMParser } from \"@xmldom/xmldom\";\nimport type {\n Term,\n TermAuxRecord,\n TermDesignation,\n TermDesignationField,\n TermLink,\n TermLocation,\n TermRecord,\n} from \"../../types.js\";\nimport { xmlAttribute as escapeAttribute, xmlText as escapeText } from \"../writers/markup.js\";\nimport { DEFAULT_LANGUAGE, languageKey } from \"../writers/render-util.js\";\n\nexport { escapeAttribute, escapeText };\n\nexport type TbxVersion = 2 | 3;\nexport type TbxStyle = \"dca\" | \"dct\";\n/** The TBX v3 data-category modules, each a namespace in DCT style. */\nexport type TbxModule = \"min\" | \"basic\" | \"lng\";\n\n/** The structural namespace of TBX v3. v2 has none. */\nexport const TBX_V3_NAMESPACE = \"urn:iso:std:iso:30042:ed-2\";\n\n/** Each module's DCT namespace, from the LTAC module definitions. */\nexport const TBX_MODULE_NAMESPACES: Readonly<Record<TbxModule, string>> = {\n min: \"http://www.tbxinfo.net/ns/min\",\n basic: \"http://www.tbxinfo.net/ns/basic\",\n lng: \"http://www.tbxinfo.net/ns/linguist\",\n};\n\n/** What a serializer needs to know about the file it writes into. */\nexport interface TbxFormat {\n version: TbxVersion;\n style: TbxStyle;\n /** The prefix each module is declared with, in DCT style. Defaults to the module's name. */\n prefixes?: Partial<Record<TbxModule, string>>;\n}\n\n/** A TBX file as read: its text, its form, and where its entries sit. */\nexport interface TbxDocument extends TbxFormat {\n /** The file's content, exactly as read. */\n content: string;\n prefixes: Record<TbxModule, string>;\n /** The UTF-16 offsets of `<body>`'s content in `content`, `[start, end)`: between its tags. */\n body?: { start: number; end: number };\n /** The offsets of the header's content (`martifHeader` or `tbxHeader`), between its tags. */\n header?: { start: number; end: number };\n /** The offsets of `<back>`'s content, between its tags. */\n back?: { start: number; end: number };\n}\n\n/**\n * An entry's structure as read, which a rewrite at the same version keeps:\n * each structural element's attributes but those manni writes itself, as XML\n * in source order (` id=\"t1\"`), and whether a designation was an ntig.\n */\nexport interface TbxEntryShape {\n /** The entry's attributes but `id`. */\n attributes: string;\n languages: TbxLanguageShape[];\n /** The language sections that hold no term, as items: no term carries them, so a rewrite writes them back after the rest. */\n unread?: string[];\n}\n\nexport interface TbxLanguageShape {\n /** The language its term was read with. */\n language: string | undefined;\n /** Its attributes but `xml:lang`. */\n attributes: string;\n designations: TbxDesignationShape[];\n}\n\nexport interface TbxDesignationShape {\n /** The designation's text, as its term reads. */\n term: string;\n /** The tig's, ntig's or termSec's attributes. */\n attributes: string;\n /** The `term` element's attributes. */\n termAttributes: string;\n /** The `termGrp`'s attributes, for an ntig. */\n group?: string;\n}\n\n/** Where one term's entry sits. Every term of an entry shares the span. */\nexport interface TbxEntrySource {\n document: TbxDocument;\n span: { start: number; end: number };\n shape?: TbxEntryShape;\n}\n\n/**\n * Keyed by location, which an edit of a term's record carries over\n * (`{ ...term, record }`), so an edited term still finds its source.\n */\nconst sources = new WeakMap<TermLocation, TbxEntrySource>();\n\nexport function rememberTbxSource(term: Term, source: TbxEntrySource): void {\n sources.set(term.location, source);\n}\n\n/** The TBX file and entry a term was read from, or `undefined` for a term read from anything else. */\nexport function tbxSourceOf(term: Term): TbxEntrySource | undefined {\n return sources.get(term.location);\n}\n\n// ---------------------------------------------------------------------------\n// Data categories\n\n/** The DCA element a category is spelled with: `<descrip type=\"definition\">`. */\nexport type TbxElement = \"descrip\" | \"admin\" | \"adminNote\" | \"termNote\" | \"ref\" | \"xref\" | \"transac\" | \"transacNote\";\n\nexport interface TbxCategory {\n /** The data category, which is the DCA `type` and the DCT local name. */\n name: string;\n element: TbxElement;\n module: TbxModule;\n}\n\nfunction category(name: string, element: TbxElement, module: TbxModule): TbxCategory {\n return { name, element, module };\n}\n\n/** Every TBX-Basic and TBX-Linguist category, by name, with its element type as the module files give it. */\nexport const TBX_CATEGORIES = {\n definition: category(\"definition\", \"descrip\", \"basic\"),\n subjectField: category(\"subjectField\", \"descrip\", \"min\"),\n context: category(\"context\", \"descrip\", \"basic\"),\n source: category(\"source\", \"admin\", \"basic\"),\n customerSubset: category(\"customerSubset\", \"admin\", \"min\"),\n projectSubset: category(\"projectSubset\", \"admin\", \"basic\"),\n crossReference: category(\"crossReference\", \"ref\", \"basic\"),\n externalCrossReference: category(\"externalCrossReference\", \"xref\", \"min\"),\n xGraphic: category(\"xGraphic\", \"xref\", \"basic\"),\n transactionType: category(\"transactionType\", \"transac\", \"basic\"),\n responsibility: category(\"responsibility\", \"transacNote\", \"basic\"),\n administrativeStatus: category(\"administrativeStatus\", \"termNote\", \"min\"),\n partOfSpeech: category(\"partOfSpeech\", \"termNote\", \"min\"),\n grammaticalGender: category(\"grammaticalGender\", \"termNote\", \"basic\"),\n grammaticalNumber: category(\"grammaticalNumber\", \"termNote\", \"lng\"),\n termType: category(\"termType\", \"termNote\", \"basic\"),\n termLocation: category(\"termLocation\", \"termNote\", \"basic\"),\n geographicalUsage: category(\"geographicalUsage\", \"termNote\", \"basic\"),\n register: category(\"register\", \"termNote\", \"lng\"),\n transferComment: category(\"transferComment\", \"termNote\", \"lng\"),\n reading: category(\"reading\", \"admin\", \"lng\"),\n readingNote: category(\"readingNote\", \"adminNote\", \"lng\"),\n} as const satisfies Record<string, TbxCategory>;\nexport type TbxCategoryName = keyof typeof TBX_CATEGORIES;\n\n/** The text aux fields after `definition`, in canonical order. `sources` is written here only when no definition groups it. */\nexport const TBX_TEXT_FIELDS = [\n [\"subject-field\", \"subjectField\"],\n [\"contexts\", \"context\"],\n [\"sources\", \"source\"],\n [\"customer-subsets\", \"customerSubset\"],\n [\"project-subsets\", \"projectSubset\"],\n] as const satisfies readonly (readonly [keyof TermAuxRecord, TbxCategoryName])[];\n\nexport const TBX_LINK_FIELDS = [\n [\"cross-references\", \"crossReference\"],\n [\"external-cross-references\", \"externalCrossReference\"],\n [\"graphics\", \"xGraphic\"],\n] as const satisfies readonly (readonly [keyof TermAuxRecord, TbxCategoryName])[];\n\n/** The termNotes of a designation, in canonical order. `transfer-comments` is a termNote in TBX-Linguist. */\nexport const TBX_TERM_NOTES = [\n [\"administrative-status\", \"administrativeStatus\"],\n [\"part-of-speech\", \"partOfSpeech\"],\n [\"grammatical-gender\", \"grammaticalGender\"],\n [\"grammatical-number\", \"grammaticalNumber\"],\n [\"term-type\", \"termType\"],\n [\"term-location\", \"termLocation\"],\n [\"geographical-usage\", \"geographicalUsage\"],\n [\"register\", \"register\"],\n] as const satisfies readonly (readonly [TermDesignationField, TbxCategoryName])[];\n\n/** `administrative-status` as the record spells it, and the TBX picklist value it stands for. */\nexport const TBX_STATUS_VALUES = {\n preferred: \"preferredTerm-admn-sts\",\n admitted: \"admittedTerm-admn-sts\",\n deprecated: \"deprecatedTerm-admn-sts\",\n superseded: \"supersededTerm-admn-sts\",\n} as const;\nexport type TbxStatus = keyof typeof TBX_STATUS_VALUES;\n\n/** The record's word for a designation with no administrative status. */\nexport const TBX_NO_STATUS = \"none\";\n\n// ---------------------------------------------------------------------------\n// Values\n\n/** Line breaks as LF, the form every value and item is kept in. */\nexport function lf(text: string): string {\n return text.replace(/\\r\\n?/g, \"\\n\");\n}\n\n// ponytail: unbounded, one entry per distinct piece of markup. Fine for a\n// short-lived CLI process; bound it with an LRU if a long-lived host uses the library.\nconst markupTexts = new Map<string, string | undefined>();\n\n/** The text a piece of inline XML reads as, trimmed, or `undefined` when it does not parse. */\nexport function markupText(markup: string): string | undefined {\n if (markupTexts.has(markup)) return markupTexts.get(markup);\n let text: string | undefined;\n try {\n const errors: string[] = [];\n const doc = new DOMParser({\n onError: (level, message) => {\n // A DTD-declared entity reads as its literal text, as the reader reads it.\n if ((level === \"error\" || level === \"fatalError\") && !/entity not found/i.test(message)) errors.push(message);\n },\n }).parseFromString(`<x>${markup}</x>`, \"text/xml\");\n const root = doc.documentElement;\n text = errors.length > 0 || root === null ? undefined : lf(root.textContent ?? \"\").trim();\n } catch {\n text = undefined;\n }\n markupTexts.set(markup, text);\n return text;\n}\n\n/** A value as element content: the first `tbx-markup` item whose text it is, else the value escaped. */\nexport function valueXml(value: string, markup: readonly string[]): string {\n return markup.find((item) => markupText(item) === value) ?? escapeText(value);\n}\n\n// ---------------------------------------------------------------------------\n// The serializer\n\ninterface Context {\n format: TbxFormat;\n markup: readonly string[];\n}\n\nfunction prefixOf(format: TbxFormat, module: TbxModule): string {\n return format.prefixes?.[module] ?? module;\n}\n\n/** One category element, in the file's style. An empty value with a target self-closes. */\nfunction categoryXml(name: TbxCategoryName, value: string, ctx: Context, target?: string): string {\n const cat = TBX_CATEGORIES[name];\n const dct = ctx.format.style === \"dct\";\n const tag = dct ? `${prefixOf(ctx.format, cat.module)}:${cat.name}` : cat.element;\n const attributes = `${dct ? \"\" : ` type=\"${cat.name}\"`}${target === undefined ? \"\" : ` target=\"${escapeAttribute(target)}\"`}`;\n if (value === \"\") return `<${tag}${attributes}/>`;\n return `<${tag}${attributes}>${valueXml(value, ctx.markup)}</${tag}>`;\n}\n\nfunction plainXml(tag: string, value: string, ctx: Context, attributes = \"\"): string {\n return `<${tag}${attributes}>${valueXml(value, ctx.markup)}</${tag}>`;\n}\n\n/**\n * Each of `wanted` with the `pool` item it takes: the first unmatched one\n * `same` accepts, else, for one left over, the next unmatched one in order,\n * so a renamed designation keeps its element. `undefined` once the pool runs out.\n */\nfunction pair<T, S>(wanted: readonly T[], pool: readonly S[], same: (w: T, s: S) => boolean): (S | undefined)[] {\n const used = new Set<number>();\n const found = wanted.map((w) => {\n const at = pool.findIndex((s, i) => !used.has(i) && same(w, s));\n if (at === -1) return undefined;\n used.add(at);\n return pool[at];\n });\n const left = pool.filter((_, i) => !used.has(i));\n return found.map((s) => s ?? left.shift());\n}\n\nfunction linkXml(name: TbxCategoryName, link: TermLink, ctx: Context): string {\n return categoryXml(name, link.text ?? \"\", ctx, link.target);\n}\n\n/** Each line of a block one level (two spaces) deeper. A multi-line item moves as a whole. */\nfunction nest(lines: readonly string[]): string[] {\n return lines.map((line) => ` ${line.replaceAll(\"\\n\", \"\\n \")}`);\n}\n\n/** A termNote's opening tag: DCA's `<termNote`, or a DCT termNote category under any prefix (`<min:partOfSpeech`). */\nconst TERM_NOTE_ITEM = new RegExp(\n `^<(?:termNote(?:Grp)?|[\\\\w.-]+:(?:${Object.values(TBX_CATEGORIES)\n .filter((cat) => cat.element === \"termNote\")\n .map((cat) => cat.name)\n .join(\"|\")}))[\\\\s>/]`,\n);\n\n/** Whether a `tbx-elements` item is a termNote, which TBX places before a term's other children. */\nexport function isTermNoteItem(item: string): boolean {\n return TERM_NOTE_ITEM.test(item);\n}\n\n/** A level's aux fields, in canonical order, then its `tbx-elements`. */\nfunction auxLines(aux: TermAuxRecord, ctx: Context, extra: readonly string[] = []): string[] {\n const lines: string[] = [];\n const grouped = aux.definition !== undefined && (aux.sources !== undefined || aux.notes !== undefined);\n if (aux.definition !== undefined) {\n const definition = categoryXml(\"definition\", aux.definition, ctx);\n if (grouped) {\n lines.push(\n \"<descripGrp>\",\n ...nest([\n definition,\n ...(aux.sources ?? []).map((s) => categoryXml(\"source\", s, ctx)),\n ...(aux.notes ?? []).map((n) => plainXml(\"note\", n, ctx)),\n ]),\n \"</descripGrp>\",\n );\n } else {\n lines.push(definition);\n }\n }\n for (const [field, name] of TBX_TEXT_FIELDS) {\n if (field === \"sources\" && grouped) continue;\n const value = aux[field];\n for (const item of typeof value === \"string\" ? [value] : (value ?? [])) lines.push(categoryXml(name, item, ctx));\n }\n if (!grouped) for (const note of aux.notes ?? []) lines.push(plainXml(\"note\", note, ctx));\n for (const [field, name] of TBX_LINK_FIELDS) {\n for (const link of aux[field] ?? []) lines.push(linkXml(name, link, ctx));\n }\n for (const transaction of aux.transactions ?? []) {\n lines.push(\n \"<transacGrp>\",\n ...nest([\n categoryXml(\"transactionType\", transaction.type, ctx),\n ...(transaction.responsibility === undefined\n ? []\n : [categoryXml(\"responsibility\", transaction.responsibility, ctx)]),\n ...(transaction.date === undefined ? [] : [plainXml(\"date\", transaction.date, ctx)]),\n ]),\n \"</transacGrp>\",\n );\n }\n lines.push(...extra);\n return lines;\n}\n\n/** A designation as written: its item, and the status its label kind gives it when the item names none. */\nexport interface ResolvedDesignation {\n designation: TermDesignation;\n /** The record's `administrative-status`: the item's own, else the kind's. */\n status: string;\n}\n\n/**\n * Every designation of a term, in the order an entry writes them: the\n * `designations` items in their order, then each label they leave unnamed in\n * label, alt-label, hidden-label order. A label is preferred, an alt-label\n * admitted and a hidden-label deprecated unless its item says otherwise.\n */\nexport function resolveDesignations(record: TermRecord): ResolvedDesignation[] {\n const pool: { term: string; status: TbxStatus; used: boolean }[] = [\n { term: record.label, status: \"preferred\", used: false },\n ...(record[\"alt-labels\"] ?? []).map((term) => ({ term, status: \"admitted\" as const, used: false })),\n ...(record[\"hidden-labels\"] ?? []).map((term) => ({ term, status: \"deprecated\" as const, used: false })),\n ];\n const out: ResolvedDesignation[] = [];\n for (const designation of record.designations ?? []) {\n const slot = pool.find((entry) => !entry.used && entry.term === designation.term);\n if (slot !== undefined) slot.used = true;\n out.push({ designation, status: designation[\"administrative-status\"] ?? slot?.status ?? \"admitted\" });\n }\n for (const slot of pool) if (!slot.used) out.push({ designation: { term: slot.term }, status: slot.status });\n return out;\n}\n\n/** The TBX value of a record status, or `undefined` for one that writes no element. */\nexport function statusValue(status: string): string | undefined {\n if (status === TBX_NO_STATUS) return undefined;\n return status in TBX_STATUS_VALUES ? TBX_STATUS_VALUES[status as TbxStatus] : status;\n}\n\nfunction designationLines(\n { designation, status }: ResolvedDesignation,\n ctx: Context,\n shape: TbxDesignationShape | undefined,\n): string[] {\n const group = shape?.group;\n const tag = group !== undefined ? \"ntig\" : ctx.format.version === 3 ? \"termSec\" : \"tig\";\n const notes: string[] = [];\n for (const [field, name] of TBX_TERM_NOTES) {\n const value = field === \"administrative-status\" ? statusValue(status) : designation[field];\n if (value !== undefined) notes.push(categoryXml(name, value, ctx));\n }\n for (const comment of designation[\"transfer-comments\"] ?? []) notes.push(categoryXml(\"transferComment\", comment, ctx));\n const items = designation[\"tbx-elements\"] ?? [];\n const reading: string[] = [];\n if (designation.reading !== undefined) {\n const admin = categoryXml(\"reading\", designation.reading, ctx);\n if (designation[\"reading-note\"] === undefined) reading.push(admin);\n else reading.push(\"<adminGrp>\", ...nest([admin, categoryXml(\"readingNote\", designation[\"reading-note\"], ctx)]), \"</adminGrp>\");\n }\n const { \"tbx-elements\": _items, ...aux } = designation;\n const head = [plainXml(\"term\", designation.term, ctx, shape?.termAttributes), ...notes, ...items.filter(isTermNoteItem)];\n const rest = auxLines(aux, ctx, [...reading, ...items.filter((item) => !isTermNoteItem(item))]);\n // An ntig groups its term and termNotes in a termGrp, and the rest follows it.\n const body = group === undefined ? [...head, ...rest] : [`<termGrp${group}>`, ...nest(head), \"</termGrp>\", ...rest];\n return [`<${tag}${shape?.attributes ?? \"\"}>`, ...nest(body), `</${tag}>`];\n}\n\nfunction languageLines(term: Term, ctx: Context, shape: TbxLanguageShape | undefined): string[] {\n const tag = ctx.format.version === 3 ? \"langSec\" : \"langSet\";\n const { record } = term;\n const aux: TermAuxRecord = {};\n for (const field of [\n \"definition\",\n \"subject-field\",\n \"contexts\",\n \"notes\",\n \"sources\",\n \"customer-subsets\",\n \"project-subsets\",\n \"cross-references\",\n \"external-cross-references\",\n \"graphics\",\n \"transactions\",\n ] as const) {\n const value = record[field];\n if (value !== undefined) Object.assign(aux, { [field]: value });\n }\n const designations = resolveDesignations(record);\n const shapes = pair(designations, shape?.designations ?? [], (d, s) => d.designation.term === s.term);\n return [\n `<${tag} xml:lang=\"${escapeAttribute(term.language ?? DEFAULT_LANGUAGE)}\"${shape?.attributes ?? \"\"}>`,\n ...nest([\n ...auxLines(aux, ctx, record[\"tbx-elements\"] ?? []),\n ...designations.flatMap((d, i) => designationLines(d, ctx, shapes[i])),\n ]),\n `</${tag}>`,\n ];\n}\n\n/**\n * One entry, at indentation zero: a `termEntry` (v2) or `conceptEntry` (v3)\n * with the first term's id and `concept-entry`, and one language per term.\n * Lines may hold a multi-line `tbx-elements` item; join them with `\\n`.\n * Given the `shape` of the entry as read, which only a rewrite at its own\n * version passes, each language and designation paired with one as read\n * keeps that element's form; one with no pair is canonical.\n */\nexport function tbxEntryLines(terms: readonly Term[], format: TbxFormat, shape?: TbxEntryShape): string[] {\n const [head] = terms;\n if (head === undefined) return [];\n const tag = format.version === 3 ? \"conceptEntry\" : \"termEntry\";\n const concept = head.record[\"concept-entry\"] ?? {};\n const { \"tbx-elements\": conceptItems, ...conceptAux } = concept;\n const languages = pair(\n terms,\n shape?.languages ?? [],\n (t, s) => languageKey(t) === (s.language ?? DEFAULT_LANGUAGE).toLowerCase(),\n );\n return [\n `<${tag} id=\"${escapeAttribute(head.id)}\"${shape?.attributes ?? \"\"}>`,\n ...nest([\n ...auxLines(conceptAux, { format, markup: head.record[\"tbx-markup\"] ?? [] }, conceptItems ?? []),\n ...terms.flatMap((term, i) =>\n languageLines(term, { format, markup: term.record[\"tbx-markup\"] ?? [] }, languages[i]),\n ),\n ...(shape?.unread ?? []),\n ]),\n `</${tag}>`,\n ];\n}\n","/**\n * Readers for constructs whose parser gives structure directly: page\n * metadata through meta's extractors, manifests, DITA, DocBook, HTML, TBX and SKOS.\n */\nimport type { TermReader } from \"../../types.js\";\nimport { ditaGlossentryReader, ditaGlossgroupReader } from \"./dita.js\";\nimport { docbookGlossaryReader } from \"./docbook.js\";\nimport { htmlDfnReader, htmlDlReader } from \"./html.js\";\nimport { manifestReader } from \"./manifest.js\";\nimport { pageReader } from \"./page.js\";\nimport { skosReader } from \"./skos.js\";\nimport { tbxEntryReader } from \"./tbx.js\";\n\nexport const STRUCTURED_READERS: readonly TermReader[] = [\n pageReader,\n manifestReader,\n ditaGlossentryReader,\n ditaGlossgroupReader,\n docbookGlossaryReader,\n htmlDlReader,\n htmlDfnReader,\n tbxEntryReader,\n skosReader,\n];\n","/**\n * What the body readers share: the body as lines, with the ones inside fenced\n * code marked, and the one way an entry becomes a `Term`.\n *\n * The body starts after a leading fenced metadata block (`---`, `+++`, `;;;`),\n * found the way the extractors find it. A native header (an AsciiDoc\n * attribute block, an rST docinfo field list) is read from the top, because\n * no construct read here can be mistaken for one.\n */\nimport { locateFrontmatter } from \"../../../meta/index.js\";\nimport { codeEndAt, codeRegions } from \"../../../shared/code-regions.js\";\nimport type { Term, TermConstruct, TermField, TermInput, TermRecord } from \"../../types.js\";\nimport { slugOf } from \"../id.js\";\n\nexport interface BodyLine {\n /** The line without its terminator or a trailing CR. */\n text: string;\n /** Offset of the line's first character in the file's content. */\n start: number;\n /** Offset just past the line's text, before any CR or LF. */\n end: number;\n /** 1-based file line. */\n line: number;\n /** Whether the line sits in fenced code. */\n code: boolean;\n}\n\n/** Offset of the line's first non-blank character: where an entry that starts on it begins. */\nexport function textStart(line: BodyLine): number {\n return line.start + (line.text.length - line.text.trimStart().length);\n}\n\nexport function isBlank(line: BodyLine): boolean {\n return line.text.trim() === \"\";\n}\n\n/** The index of the first line at or after `from` that is not blank prose (the length when none). */\nexport function nextNonBlank(lines: readonly BodyLine[], from: number): number {\n let k = from;\n for (let line = lines[k]; line !== undefined && !line.code && isBlank(line); line = lines[k]) k++;\n return k;\n}\n\n/** The file's body, line by line. */\nexport function bodyLines(input: TermInput): BodyLine[] {\n const { content } = input;\n const bodyStart = locateFrontmatter(content)?.closeEnd ?? 0;\n const body = content.slice(bodyStart);\n const code = codeRegions(body, input.format, { spans: false });\n let line = 1;\n for (let i = 0; i < bodyStart; i++) {\n if (content.charCodeAt(i) === 10) line++;\n }\n const out: BodyLine[] = [];\n let pos = bodyStart;\n while (pos < content.length) {\n const nl = content.indexOf(\"\\n\", pos);\n const stop = nl === -1 ? content.length : nl;\n const end = stop > pos && content.charCodeAt(stop - 1) === 13 ? stop - 1 : stop;\n out.push({\n text: content.slice(pos, end),\n start: pos,\n end,\n line,\n code: codeEndAt(code, pos - bodyStart) !== undefined,\n });\n line++;\n pos = stop + 1;\n }\n return out;\n}\n\n/**\n * A definition's text: each line trimmed, the lines of a paragraph joined with\n * one space, paragraphs separated by one blank line. Undefined when nothing is\n * left.\n */\nexport function definitionText(paragraphs: readonly (readonly string[])[]): string | undefined {\n const text = paragraphs\n .map((lines) =>\n lines\n .map((l) => l.trim())\n .filter((l) => l !== \"\")\n .join(\" \"),\n )\n .filter((p) => p !== \"\")\n .join(\"\\n\\n\");\n return text === \"\" ? undefined : text;\n}\n\nexport interface EntryLabel {\n text: string;\n line: number;\n}\n\nexport interface Entry {\n /** The terms in source order; the first is the label. At least one, each non-empty. */\n labels: readonly EntryLabel[];\n definition: string;\n definitionLine: number;\n start: number;\n end: number;\n}\n\n/** A read entry as a `Term`. */\nexport function termOf(input: TermInput, construct: TermConstruct, entry: Entry): Term {\n const [first, ...rest] = entry.labels;\n const label = first?.text.trim() ?? \"\";\n const record: TermRecord = { label };\n const fieldLines: Partial<Record<TermField, number>> = { label: first?.line ?? entry.definitionLine };\n const alts = rest.map((l) => l.text.trim()).filter((t) => t !== \"\");\n const [firstAlt] = rest;\n if (alts.length > 0 && firstAlt !== undefined) {\n record[\"alt-labels\"] = alts;\n fieldLines[\"alt-labels\"] = firstAlt.line;\n }\n record.definition = entry.definition;\n fieldLines.definition = entry.definitionLine;\n const language = input.metadata[\"language\"];\n return {\n id: slugOf(label),\n record,\n ...(typeof language === \"string\" && language.trim() !== \"\" ? { language: language.trim() } : {}),\n location: {\n file: input.file,\n ...(input.path === undefined ? {} : { path: input.path }),\n construct,\n line: first?.line ?? entry.definitionLine,\n fieldLines,\n span: { start: entry.start, end: entry.end },\n },\n };\n}\n\n/** The notice for an entry a reader could not read. */\nexport function skippedNotice(\n input: TermInput,\n line: number,\n label: string,\n missing: \"term\" | \"definition\",\n): string {\n return `${input.file}:${String(line)}: skipped a ${label} entry with no ${missing}.`;\n}\n","/**\n * AsciiDoc glossary lists: a labelled list under a `[glossary]` block\n * attribute line, which says what it is, so no metadata declaration is needed.\n *\n * [glossary]\n * mud:: wet, cold dirt\n * jam::\n * sweet, sticky mess\n * command-line interface::\n * CLI:: a program you drive\n * +\n * A `+` line starts another paragraph of the same definition.\n *\n * A block title (`.Terms`) and blank lines may sit between the attribute and\n * the list. Terms stacked on adjacent lines share the definition below the\n * last of them; the first is the label and the rest are alt-labels. The\n * definition is the text after `::` and the non-blank lines directly below.\n * The list ends at a blank line followed by anything but another item, and at\n * a section title, a block attribute or title line, a delimited block, or code.\n */\nimport type { Term, TermInput, TermReadResult, TermReader } from \"../../types.js\";\nimport { LIST_HOLDS, asciidocEntry } from \"../writers/entries.js\";\nimport { applyEntries } from \"./splice.js\";\nimport {\n bodyLines,\n definitionText,\n isBlank,\n nextNonBlank,\n skippedNotice,\n termOf,\n textStart,\n type BodyLine,\n} from \"./body.js\";\n\nconst LABEL = \"[glossary] list\";\nconst ATTRIBUTE = /^\\[glossary\\][ \\t]*$/;\n/** `term::` or `term:: definition`. A term ending in `:` is a deeper `:::` level, not this list's. */\nconst ITEM = /^[ \\t]*(.*?[^:\\s])::(?:[ \\t]+(.*))?$/;\nconst BLOCK_TITLE = /^\\.[^.\\s]/;\n/** Lines that end the list outright: a section title, an attribute line, a delimiter. */\nconst LIST_END = /^(?:=+[ \\t]|\\[.*\\][ \\t]*$|(?:-{4,}|={4,}|\\*{4,}|\\.{4,}|_{4,}|\\+{4,}|\\|===)[ \\t]*$)/;\n\ninterface Open {\n labels: BodyLine[];\n definitionLine: number;\n paragraphs: string[][];\n last: BodyLine;\n}\n\nfunction item(line: BodyLine): { term: string; text: string | undefined } | undefined {\n const match = ITEM.exec(line.text);\n const term = match?.[1];\n if (match === null || term === undefined) return undefined;\n const text = match[2]?.trim();\n return { term, text: text === \"\" ? undefined : text };\n}\n\nfunction read(input: TermInput): TermReadResult {\n const terms: Term[] = [];\n const notices: string[] = [];\n const lines = bodyLines(input);\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n i++;\n if (line === undefined || line.code || !ATTRIBUTE.test(line.text)) continue;\n // Blank lines and a block title may sit between the attribute and its list.\n let start = i;\n for (let l = lines[start]; l !== undefined && !l.code && (isBlank(l) || BLOCK_TITLE.test(l.text)); l = lines[start]) {\n start++;\n }\n const first = lines[start];\n if (first === undefined || first.code || item(first) === undefined) continue;\n i = readList(input, lines, start, terms, notices);\n }\n return { terms, notices };\n}\n\n/** Read the list starting at index `at`, an item. Returns the index just past it. */\nfunction readList(\n input: TermInput,\n lines: readonly BodyLine[],\n at: number,\n terms: Term[],\n notices: string[],\n): number {\n let pending: BodyLine[] = [];\n let open: Open | undefined;\n\n const close = (): void => {\n if (open !== undefined) {\n const text = definitionText(open.paragraphs);\n const [firstLabel] = open.labels;\n if (text !== undefined && firstLabel !== undefined) {\n terms.push(\n termOf(input, \"asciidoc-glossary\", {\n labels: open.labels.map((l) => ({ text: itemTerm(l), line: l.line })),\n definition: text,\n definitionLine: open.definitionLine,\n start: textStart(firstLabel),\n end: open.last.end,\n }),\n );\n } else if (firstLabel !== undefined) {\n notices.push(skippedNotice(input, firstLabel.line, LABEL, \"definition\"));\n }\n open = undefined;\n }\n const [firstPending] = pending;\n if (firstPending !== undefined) {\n notices.push(skippedNotice(input, firstPending.line, LABEL, \"definition\"));\n pending = [];\n }\n };\n\n let i = at;\n for (;;) {\n const line = lines[i];\n if (line === undefined || line.code) break;\n\n if (isBlank(line)) {\n close();\n const k = nextNonBlank(lines, i);\n const next = lines[k];\n if (next === undefined || next.code || item(next) === undefined) break;\n i = k;\n continue;\n }\n\n const entry = item(line);\n if (entry !== undefined) {\n if (open !== undefined) close();\n pending.push(line);\n if (entry.text !== undefined) {\n open = { labels: pending, definitionLine: line.line, paragraphs: [[entry.text]], last: line };\n pending = [];\n }\n i++;\n continue;\n }\n\n if (line.text.trim() === \"+\" && open !== undefined) {\n open.paragraphs.push([]);\n i++;\n continue;\n }\n if (LIST_END.test(line.text) || BLOCK_TITLE.test(line.text)) break;\n\n if (open !== undefined) {\n open.paragraphs.at(-1)?.push(line.text);\n open.last = line;\n } else if (pending.length > 0) {\n open = { labels: pending, definitionLine: line.line, paragraphs: [[line.text]], last: line };\n pending = [];\n } else {\n break;\n }\n i++;\n }\n close();\n return i;\n}\n\nfunction itemTerm(line: BodyLine): string {\n return item(line)?.term ?? line.text;\n}\n\nexport const asciidocGlossaryReader: TermReader = {\n construct: \"asciidoc-glossary\",\n label: LABEL,\n formats: [\"asciidoc\"],\n read,\n apply: (input, terms) =>\n applyEntries(input, read, terms, { holds: LIST_HOLDS, id: false, serialize: (term) => asciidocEntry(term.record) }),\n};\n","/**\n * Markdown and MDX definition lists, in PHP Markdown Extra's syntax:\n *\n * Term\n * Another term\n * : The definition, whose continuation lines\n * are indented by four spaces or a tab.\n *\n * A blank line and an indented line start a second paragraph.\n *\n * A definition list does not say what it is, so it is read only in a file\n * whose metadata declares `type: term-set`. The term lines sit directly above\n * the first `:` line; the first is the label and the rest are alt-labels. An\n * unindented line directly below a definition line continues it, as Markdown\n * Extra's lazy continuation does. A second `:` definition, directly below or\n * after a blank line, is kept out of the record and said as a notice.\n */\nimport type { Term, TermInput, TermReadResult, TermReader } from \"../../types.js\";\nimport { LIST_HOLDS, markdownEntry } from \"../writers/entries.js\";\nimport { applyEntries } from \"./splice.js\";\nimport {\n bodyLines,\n definitionText,\n isBlank,\n nextNonBlank,\n skippedNotice,\n termOf,\n textStart,\n type BodyLine,\n} from \"./body.js\";\n\nconst LABEL = \"definition list\";\n/** A definition line: `:` then one or more spaces or tabs and the text, or a bare `:`. */\nconst DEFINITION = /^:(?:[ \\t]+(.*))?$/;\nconst INDENTED = /^(?: {4}|\\t)/;\nconst HEADING = /^#{1,6}(?:[ \\t]|$)/;\n\ninterface Definition {\n line: number;\n paragraphs: string[][];\n}\n\nfunction definitionStart(line: BodyLine | undefined): string | undefined {\n if (line === undefined || line.code) return undefined;\n const match = DEFINITION.exec(line.text);\n return match === null ? undefined : (match[1] ?? \"\");\n}\n\nfunction read(input: TermInput): TermReadResult {\n const terms: Term[] = [];\n const notices: string[] = [];\n if (input.metadata[\"type\"] !== \"term-set\") return { terms, notices };\n\n const lines = bodyLines(input);\n let i = 0;\n while (i < lines.length) {\n const first = lines[i];\n if (first === undefined) break;\n if (first.code || isBlank(first)) {\n i++;\n continue;\n }\n\n // A run of term lines, then a definition line directly below them.\n const labels: BodyLine[] = [];\n let j = i;\n for (;;) {\n const line = lines[j];\n if (line === undefined || line.code || isBlank(line) || definitionStart(line) !== undefined) break;\n labels.push(line);\n j++;\n }\n const opener = definitionStart(lines[j]);\n if (opener === undefined) {\n // A paragraph, not an entry: skip to its end.\n i = j === i ? i + 1 : j;\n continue;\n }\n if (labels.length === 0 || labels.some((l) => HEADING.test(l.text))) {\n const orphan = lines[j];\n if (orphan !== undefined) notices.push(skippedNotice(input, orphan.line, LABEL, \"term\"));\n i = readDefinitions(lines, j, []);\n continue;\n }\n\n const definitions: Definition[] = [];\n i = readDefinitions(lines, j, definitions);\n const firstLabel = labels[0];\n const [kept] = definitions;\n if (firstLabel === undefined || kept === undefined) continue;\n const text = definitionText(kept.paragraphs);\n if (text === undefined) {\n notices.push(skippedNotice(input, firstLabel.line, LABEL, \"definition\"));\n continue;\n }\n for (const extra of definitions.slice(1)) {\n notices.push(\n `${input.file}:${String(extra.line)}: kept the first of ${String(definitions.length)} definitions for \"${firstLabel.text.trim()}\".`,\n );\n }\n const last = lastContentLine(lines, i);\n terms.push(\n termOf(input, \"markdown-deflist\", {\n labels: labels.map((l) => ({ text: l.text, line: l.line })),\n definition: text,\n definitionLine: kept.line,\n start: textStart(firstLabel),\n end: last?.end ?? firstLabel.end,\n }),\n );\n }\n return { terms, notices };\n}\n\n/** The last non-blank line before index `stop`. */\nfunction lastContentLine(lines: readonly BodyLine[], stop: number): BodyLine | undefined {\n for (let k = stop - 1; k >= 0; k--) {\n const line = lines[k];\n if (line !== undefined && !isBlank(line)) return line;\n }\n return undefined;\n}\n\n/**\n * Read the definitions starting at index `at`, which is a definition line,\n * into `out`. Returns the index just past the last line they cover.\n */\nfunction readDefinitions(lines: readonly BodyLine[], at: number, out: Definition[]): number {\n let i = at;\n for (;;) {\n const opener = lines[i];\n const text = definitionStart(opener);\n if (opener === undefined || text === undefined) return i;\n const definition: Definition = { line: opener.line, paragraphs: [[text]] };\n out.push(definition);\n i++;\n for (;;) {\n const line = lines[i];\n if (line === undefined || line.code) return i;\n if (definitionStart(line) !== undefined) break;\n if (!isBlank(line)) {\n // Indented or lazy, a line directly below belongs to the paragraph.\n definition.paragraphs.at(-1)?.push(line.text.replace(INDENTED, \"\"));\n i++;\n continue;\n }\n // A blank line: what follows decides.\n const k = nextNonBlank(lines, i);\n const next = lines[k];\n if (next === undefined || next.code) return i;\n if (definitionStart(next) !== undefined) {\n i = k;\n break;\n }\n if (!INDENTED.test(next.text)) return i;\n definition.paragraphs.push([]);\n i = k;\n }\n }\n}\n\nexport const markdownDeflistReader: TermReader = {\n construct: \"markdown-deflist\",\n label: LABEL,\n formats: [\"markdown\", \"mdx\"],\n read,\n apply: (input, terms) =>\n applyEntries(input, read, terms, { holds: LIST_HOLDS, id: false, serialize: (term) => markdownEntry(term.record) }),\n};\n","/**\n * reStructuredText glossaries: the Sphinx `.. glossary::` directive, which says\n * what it is, so no metadata declaration is needed.\n *\n * .. glossary::\n * :sorted:\n *\n * source directory\n * source dir\n * The directory that holds sources.\n *\n * A blank line starts another paragraph.\n *\n * Option lines directly below the directive are skipped. The first content\n * line sets the base indentation: a line there is a term, a line indented\n * further is definition, and a blank line may sit between the two. Terms on\n * adjacent lines share the definition below them; the first is the label and the rest are alt-labels. A term's\n * classifier (`term : index key`) is not part of the label. The directive ends\n * where indentation returns to or below its own.\n *\n * rST has no fences, so code is found here: the body of a `code-block`,\n * `code` or `sourcecode` directive, and the literal block after a paragraph\n * ending in `::`, are never read.\n */\nimport type { Term, TermInput, TermReadResult, TermReader } from \"../../types.js\";\nimport { LIST_HOLDS, rstEntry } from \"../writers/entries.js\";\nimport { applyEntries } from \"./splice.js\";\nimport { bodyLines, definitionText, isBlank, skippedNotice, termOf, textStart, type BodyLine } from \"./body.js\";\n\nconst LABEL = \".. glossary::\";\nconst DIRECTIVE = /^[ \\t]*\\.\\.[ \\t]+glossary::[ \\t]*$/;\nconst CODE_DIRECTIVE = /^[ \\t]*\\.\\.[ \\t]+(?:code-block|code|sourcecode)::/;\nconst EXPLICIT_MARKUP = /^[ \\t]*\\.\\.(?:[ \\t]|$)/;\nconst OPTION = /^[ \\t]*:[^:\\s][^:]*:(?:[ \\t].*)?$/;\nconst CLASSIFIER = /[ \\t]+:[ \\t]+/;\n\n/** Indentation width, with a tab advancing to the next multiple of 8 as rST reads it. */\nfunction indentOf(text: string): number {\n let width = 0;\n for (const ch of text) {\n if (ch === \" \") width++;\n else if (ch === \"\\t\") width += 8 - (width % 8);\n else break;\n }\n return width;\n}\n\n/** Whether a line introduces an indented block that is code. */\nfunction opensLiteral(line: BodyLine): boolean {\n if (CODE_DIRECTIVE.test(line.text)) return true;\n return !EXPLICIT_MARKUP.test(line.text) && line.text.trimEnd().endsWith(\"::\");\n}\n\nfunction read(input: TermInput): TermReadResult {\n const terms: Term[] = [];\n const notices: string[] = [];\n const lines = bodyLines(input);\n\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if (line === undefined) break;\n if (isBlank(line)) {\n i++;\n continue;\n }\n if (DIRECTIVE.test(line.text)) {\n i = readGlossary(input, lines, i, terms, notices);\n continue;\n }\n i = opensLiteral(line) ? blockEnd(lines, i + 1, indentOf(line.text)) : i + 1;\n }\n return { terms, notices };\n}\n\n/**\n * The index of the first non-blank line at or after `from` indented `indent`\n * or less: where a block opened at that indentation ends.\n */\nfunction blockEnd(lines: readonly BodyLine[], from: number, indent: number): number {\n let k = from;\n for (let l = lines[k]; l !== undefined && (isBlank(l) || indentOf(l.text) > indent); l = lines[k]) k++;\n return k;\n}\n\ninterface Definition {\n line: number;\n paragraphs: string[][];\n last: BodyLine;\n gap: boolean;\n}\n\n/** Read the glossary whose directive is at index `at`. Returns the index just past it. */\nfunction readGlossary(\n input: TermInput,\n lines: readonly BodyLine[],\n at: number,\n terms: Term[],\n notices: string[],\n): number {\n const directive = lines[at];\n if (directive === undefined) return at + 1;\n const end = blockEnd(lines, at + 1, indentOf(directive.text));\n\n let i = at + 1;\n for (let l = lines[i]; i < end && l !== undefined && !isBlank(l) && OPTION.test(l.text); l = lines[i]) i++;\n\n let base: number | undefined;\n let labels: BodyLine[] = [];\n let definition: Definition | undefined;\n let orphan = false;\n\n const close = (): void => {\n const [first] = labels;\n if (first !== undefined) {\n const text = definition === undefined ? undefined : definitionText(definition.paragraphs);\n if (definition !== undefined && text !== undefined) {\n terms.push(\n termOf(input, \"rst-glossary\", {\n labels: labels.map((l) => ({ text: termText(l), line: l.line })),\n definition: text,\n definitionLine: definition.line,\n start: textStart(first),\n end: definition.last.end,\n }),\n );\n } else {\n notices.push(skippedNotice(input, first.line, LABEL, \"definition\"));\n }\n }\n labels = [];\n definition = undefined;\n };\n\n let blank = false;\n for (; i < end; i++) {\n const line = lines[i];\n if (line === undefined) break;\n if (isBlank(line)) {\n if (definition !== undefined) definition.gap = true;\n blank = true;\n continue;\n }\n const indent = indentOf(line.text);\n base ??= indent;\n if (indent <= base) {\n // A term after a definition, or after a blank line below terms that\n // never got one, starts a new entry.\n if (definition !== undefined || blank) close();\n orphan = false;\n blank = false;\n labels.push(line);\n continue;\n }\n blank = false;\n if (definition !== undefined) {\n if (definition.gap) {\n definition.paragraphs.push([]);\n definition.gap = false;\n }\n definition.paragraphs.at(-1)?.push(line.text);\n definition.last = line;\n } else if (labels.length > 0) {\n definition = { line: line.line, paragraphs: [[line.text]], last: line, gap: false };\n } else if (!orphan) {\n notices.push(skippedNotice(input, line.line, LABEL, \"term\"));\n orphan = true;\n }\n }\n close();\n return end;\n}\n\n/** A term line's label: trimmed, without a classifier. */\nfunction termText(line: BodyLine): string {\n const text = line.text.trim();\n const match = CLASSIFIER.exec(text);\n return match === null ? text : text.slice(0, match.index);\n}\n\nexport const rstGlossaryReader: TermReader = {\n construct: \"rst-glossary\",\n label: LABEL,\n formats: [\"rst\"],\n read,\n apply: (input, terms) =>\n applyEntries(input, read, terms, { holds: LIST_HOLDS, id: false, serialize: (term) => rstEntry(term.record) }),\n};\n","/**\n * Readers for term lists held in a text format's body: Markdown and MDX\n * definition lists, AsciiDoc `[glossary]`, and reStructuredText `.. glossary::`.\n */\nimport type { TermReader } from \"../../types.js\";\nimport { asciidocGlossaryReader } from \"./asciidoc-glossary.js\";\nimport { markdownDeflistReader } from \"./markdown-deflist.js\";\nimport { rstGlossaryReader } from \"./rst-glossary.js\";\n\nexport const TEXT_READERS: readonly TermReader[] = [\n markdownDeflistReader,\n asciidocGlossaryReader,\n rstGlossaryReader,\n];\n","/**\n * Every term reader, in the order `term formats` lists them. Split across two\n * files by how a construct is parsed, so the two groups change independently.\n */\nimport type { TermConstruct, TermReader } from \"../../types.js\";\nimport { STRUCTURED_READERS } from \"./structured.js\";\nimport { TEXT_READERS } from \"./text.js\";\n\nexport const TERM_READERS: readonly TermReader[] = [...STRUCTURED_READERS, ...TEXT_READERS];\n\n/** The readers offered a file of `format`. */\nexport function readersForFormat(\n format: string,\n readers: readonly TermReader[] = TERM_READERS,\n): TermReader[] {\n return readers.filter((reader) => reader.formats.includes(format));\n}\n\n/** The one reader for a construct, which is the one that writes it back in place. */\nexport function readerForConstruct(\n construct: TermConstruct,\n readers: readonly TermReader[] = TERM_READERS,\n): TermReader | undefined {\n return readers.find((reader) => reader.construct === construct);\n}\n"],"mappings":"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","names":["item","resolve","resolve","item","isMapping","languageOf","read","parsed","read","definitionOf","cache","parsed","definitionOf","item","LABEL","read","lineOf","pair","item","LABEL","read","LABEL","nameOf","parse","read","isDeepStrictEqual","DOMParser","DOMParser","DOMParser","item","LABEL","DOMParser","item","sources","linkOf","transactionOf","read","labelsOf","readEntry","concepts","concept","isDeepStrictEqual","termOf","LABEL","read","termOf","LABEL","read","termOf","LABEL","read","termOf","parsed","resolve","labelsOf","item","languageOf","read","resolve"]}
|