@heroiclands/package-build 25.0.0 → 25.1.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +1 -0
  3. package/bin/content-commands.mjs +30 -96
  4. package/bin/encoding-commands.mjs +146 -0
  5. package/bin/package-build.mjs +35 -24
  6. package/config.mjs +25 -0
  7. package/convert.mjs +182 -0
  8. package/docs/api.md +144 -6
  9. package/docs/authoring/links-and-markup.md +260 -481
  10. package/docs/commands.md +110 -119
  11. package/docs/configuration.md +31 -13
  12. package/docs/content-format.md +11 -4
  13. package/docs/diagnostics.md +43 -16
  14. package/docs/encoding-core.md +193 -0
  15. package/docs/guides/book.md +2 -2
  16. package/docs/guides/module-project.md +23 -1
  17. package/docs/guides/site.md +2 -2
  18. package/docs/guides/writing-in-invented-scripts.md +458 -575
  19. package/docs/reference/format-details.md +292 -404
  20. package/docs/reference/note-types.md +83 -63
  21. package/docs/source-preview.md +8 -0
  22. package/e2e.mjs +1 -1
  23. package/engine/base-compiler.mjs +27 -9
  24. package/engine/content-charset.mjs +13 -1
  25. package/engine/content-format.yaml +6 -2
  26. package/engine/content-index.mjs +6 -2
  27. package/engine/content-links.mjs +1 -0
  28. package/engine/content-scripts.mjs +614 -459
  29. package/engine/content-scroll.mjs +4 -4
  30. package/engine/content-spans.mjs +40 -9
  31. package/engine/content-verse.mjs +1 -1
  32. package/engine/converter-data.mjs +70 -0
  33. package/engine/dictionary-rows.mjs +2 -34
  34. package/engine/encoding-integrity.mjs +94 -0
  35. package/engine/encoding-language.mjs +506 -0
  36. package/engine/encoding-lexicon.mjs +701 -0
  37. package/engine/encoding-notes.mjs +186 -0
  38. package/engine/encoding-standard.mjs +42 -0
  39. package/engine/encoding-template.mjs +370 -0
  40. package/engine/encoding-terms.mjs +178 -0
  41. package/engine/encoding.mjs +952 -0
  42. package/engine/extension-attributes.mjs +2 -0
  43. package/engine/helpers.mjs +1 -1
  44. package/engine/index.mjs +7 -0
  45. package/engine/language-terms.mjs +17 -16
  46. package/engine/{logographic.mjs → language-writings.mjs} +29 -38
  47. package/engine/markup-validation.mjs +1 -1
  48. package/engine/note-vocabulary.mjs +4 -158
  49. package/engine/pdf-render.mjs +31 -3
  50. package/engine/roman-characters.mjs +135 -16
  51. package/engine/roman-run.mjs +149 -0
  52. package/engine/roman-verse.mjs +95 -0
  53. package/engine/run-rows.mjs +29 -31
  54. package/engine/run-words.mjs +2 -2
  55. package/engine/script-emphasis-terms.mjs +3 -0
  56. package/engine/script-emphasis.mjs +3 -10
  57. package/engine/script-font-delivery.mjs +9 -12
  58. package/engine/script-fonts.mjs +2 -1
  59. package/engine/site-build.mjs +14 -5
  60. package/engine/site-preview.mjs +12 -2
  61. package/engine/sql-tables.mjs +36 -31
  62. package/engine/verse-metre.mjs +1 -1
  63. package/engine/word-forms.mjs +1 -1
  64. package/engine/word-inflections.mjs +48 -0
  65. package/engine/word-rows.mjs +1 -1
  66. package/engine/word-terms.mjs +16 -17
  67. package/package.json +11 -5
  68. package/types/config.d.mts +5 -0
  69. package/types/convert.d.mts +44 -0
  70. package/types/e2e.d.mts +1 -1
  71. package/types/engine/base-compiler.d.mts +4 -2
  72. package/types/engine/content-index.d.mts +4 -1
  73. package/types/engine/content-scripts.d.mts +103 -42
  74. package/types/engine/converter-data.d.mts +11 -0
  75. package/types/engine/dictionary-rows.d.mts +1 -25
  76. package/types/engine/encoding-integrity.d.mts +14 -0
  77. package/types/engine/encoding-language.d.mts +36 -0
  78. package/types/engine/encoding-lexicon.d.mts +259 -0
  79. package/types/engine/encoding-notes.d.mts +39 -0
  80. package/types/engine/encoding-standard.d.mts +11 -0
  81. package/types/engine/encoding-template.d.mts +44 -0
  82. package/types/engine/encoding-terms.d.mts +143 -0
  83. package/types/engine/encoding.d.mts +155 -0
  84. package/types/engine/helpers.d.mts +1 -1
  85. package/types/engine/index.d.mts +4 -0
  86. package/types/engine/language-terms.d.mts +1 -1
  87. package/types/engine/{logographic.d.mts → language-writings.d.mts} +6 -6
  88. package/types/engine/markup-validation.d.mts +1 -1
  89. package/types/engine/pdf-render.d.mts +1 -1
  90. package/types/engine/roman-characters.d.mts +2 -2
  91. package/types/engine/roman-run.d.mts +101 -0
  92. package/types/engine/roman-verse.d.mts +23 -0
  93. package/types/engine/run-rows.d.mts +13 -20
  94. package/types/engine/script-emphasis-terms.d.mts +2 -0
  95. package/types/engine/script-emphasis.d.mts +1 -1
  96. package/types/engine/script-font-delivery.d.mts +2 -3
  97. package/types/engine/script-fonts.d.mts +5 -0
  98. package/types/engine/site-preview.d.mts +1 -1
  99. package/types/engine/word-inflections.d.mts +25 -0
  100. package/engine/map-lexicon.mjs +0 -1045
  101. package/engine/text-maps.mjs +0 -654
  102. package/engine/written-in.mjs +0 -204
  103. package/types/engine/map-lexicon.d.mts +0 -330
  104. package/types/engine/text-maps.d.mts +0 -189
  105. package/types/engine/written-in.d.mts +0 -76
@@ -1,37 +1,43 @@
1
1
  /**
2
- * The context a resolved configuration gives, and the maps an index holds.
2
+ * The context a resolved configuration gives, and the encodings an index holds.
3
3
  *
4
- * @param {{languages?: object, rootDir?: string}|undefined} config - The
4
+ * @param {{languages?: object, rootDir?: string, contentPackage?:string, paths?:{content?:string}}|undefined} config - The
5
5
  * resolved configuration.
6
6
  * @param {Iterable<Record<string, any>>} [records] - The content index's
7
- * records, whose mapping notes give the maps. Without them no map is known.
7
+ * records, whose language notes supply lexical writings and script choices.
8
8
  * @returns {RunContext} Its languages, the faces installed where it sits, and
9
- * the maps. A fonts package that cannot be read gives no faces; a run naming
9
+ * the encodings. A fonts package that cannot be read gives no faces; a run naming
10
10
  * one is reported.
11
11
  */
12
12
  export function runContext(config: {
13
13
  languages?: object;
14
14
  rootDir?: string;
15
+ contentPackage?: string;
16
+ paths?: {
17
+ content?: string;
18
+ };
15
19
  } | undefined, records?: Iterable<Record<string, any>>): RunContext;
16
20
  /**
17
21
  * Find the spans, divs and verse fences marked with `lang=`, `font=` or
18
- * `map=`, and every fault in their markup and their text.
22
+ * `enc=`, and every fault in their markup and their text.
19
23
  *
20
24
  * @param {string} source - Authored Markdown: a note body, or a whole file
21
25
  * whose frontmatter is blanked.
22
26
  * @param {RunContext} [ctx] - The configured languages, the installed faces
23
- * and the maps. Without them every `lang=` must be a tag, every face and
24
- * map is unknown, and only `mono`, `serif` and `sans` are fonts.
27
+ * and the encodings. Without them every `lang=` must be a tag, every face and
28
+ * enc is unknown, and only `mono`, `serif` and `sans` are fonts.
25
29
  * @param {import("./content-session.mjs").ContentSyntax} [syntax] - Session
26
30
  * scanner projections, so the source's spans and blocks are scanned once.
27
- * @returns {{runs: Run[], errors: Array<{line: number, column: number, message: string}>, warnings: Array<{line: number, column: number, message: string}>}}
31
+ * @returns {{runs: Run[], errors: Array<{file?: string, line: number, column: number, message: string}>, warnings: Array<{line: number, column: number, message: string}>}}
28
32
  * The runs in source order, and each finding at its 1-based position. A
29
33
  * warning is a `lang=` read as a tag that sits within one edit of a
30
- * declared name.
34
+ * declared name. Diagnostic columns count Unicode code points; each run's
35
+ * source offsets and column remain UTF-16 units.
31
36
  */
32
37
  export function scanRuns(source: string, ctx?: RunContext, syntax?: import("./content-session.mjs").ContentSyntax): {
33
38
  runs: Run[];
34
39
  errors: Array<{
40
+ file?: string;
35
41
  line: number;
36
42
  column: number;
37
43
  message: string;
@@ -43,13 +49,13 @@ export function scanRuns(source: string, ctx?: RunContext, syntax?: import("./co
43
49
  }>;
44
50
  };
45
51
  /**
46
- * Rewrite text marked with `lang=`, `font=` and `map=` into the plain span,
52
+ * Rewrite text marked with `lang=`, `font=` and `enc=` into the plain span,
47
53
  * div and verse grammar the rest of each chain renders, one line for one line.
48
54
  *
49
55
  * - **Numbered verse prefixes and indentation markers** stay outside run text.
50
56
  * Each authored run chooses its own language and presentation; physical
51
57
  * lines and source positions remain unchanged.
52
- * - **The map, if any, is applied first.** Characters Markdown would read are
58
+ * - **The enc, if any, is applied first.** Characters Markdown would read are
53
59
  * then backslash-escaped, so they reach every later pass as characters.
54
60
  * - **Emphasis in a face** becomes an `<em>` or a `<strong>` carrying its
55
61
  * convention's class, or no class where none is stated. The book reads
@@ -63,19 +69,19 @@ export function scanRuns(source: string, ctx?: RunContext, syntax?: import("./co
63
69
  * mark, `<bdo>` or `<bdi>` is ever written: the code points carry their own
64
70
  * direction.
65
71
  * - **A scroll fence's body** is rewritten to one line per paragraph, its
66
- * lines joined by what the map writes for a space, and left unescaped,
72
+ * lines joined by what the enc writes for a space, and left unescaped,
67
73
  * since the body is raw. Its layout, each character with the source text it
68
74
  * was written from, is returned for the book, which draws it.
69
75
  *
70
76
  * A run with a finding is left as written; {@link scanRuns} reports it.
71
77
  *
72
78
  * @param {string} source - Authored Markdown: a note body.
73
- * @param {RunContext} [ctx] - The configured languages, faces and maps.
79
+ * @param {RunContext} [ctx] - The configured languages, faces and encodings.
74
80
  * @param {import("./content-session.mjs").ContentSyntax} [syntax] - Session
75
81
  * scanner projections.
76
82
  * @param {{target?: "site"|"foundry"|"book"}} [options] - The target the
77
83
  * Markdown is rendered for; only `site` writes the search marker.
78
- * @returns {{markdown: string, errors: Array<{line: number, column: number, message: string}>, scrolls: Map<string, import("./content-scroll.mjs").ScrollLayout>}}
84
+ * @returns {{markdown: string, errors: Array<{file?: string, line: number, column: number, message: string}>, scrolls: Map<string, import("./content-scroll.mjs").ScrollLayout>}}
79
85
  * The rewritten Markdown, the findings of {@link scanRuns}, and each
80
86
  * rewritten scroll fence's layout, by its rewritten body.
81
87
  */
@@ -84,6 +90,7 @@ export function renderRuns(source: string, ctx?: RunContext, syntax?: import("./
84
90
  }): {
85
91
  markdown: string;
86
92
  errors: Array<{
93
+ file?: string;
87
94
  line: number;
88
95
  column: number;
89
96
  message: string;
@@ -92,8 +99,6 @@ export function renderRuns(source: string, ctx?: RunContext, syntax?: import("./
92
99
  };
93
100
  /** The keys this module reads, which no construct passes through as written. */
94
101
  export const RUN_KEYS: readonly string[];
95
- /** Explicit opt-in to native-script presentation on this construct. */
96
- export const NATIVEFONT_CLASS: "nativefont";
97
102
  /** The generic families `font=` may name, each with the class that sets it. */
98
103
  export const GENERIC_FONTS: Readonly<{
99
104
  mono: "font-mono";
@@ -155,14 +160,14 @@ export type RunDetail = {
155
160
  */
156
161
  generic: string | undefined;
157
162
  /**
158
- * - Its map.
163
+ * - Its enc.
159
164
  */
160
- textMap: import("./text-maps.mjs").TextMap | undefined;
165
+ encoding: ReturnType<typeof import("./encoding.mjs").compileEncoding> | undefined;
161
166
  /**
162
- * - Its map,
167
+ * - Its enc,
163
168
  * face and lexicon, which its text is set by.
164
169
  */
165
- mapping: import("./map-lexicon.mjs").Mapping | undefined;
170
+ selection: ReturnType<typeof encodingFor> | undefined;
166
171
  /**
167
172
  * - The marked spans inside it.
168
173
  */
@@ -196,6 +201,16 @@ export type RunDetail = {
196
201
  * - The emphasis it holds, by absolute offset.
197
202
  */
198
203
  emphasis: Delimiter[];
204
+ /**
205
+ * - Its inline source structure permits Roman
206
+ * inventory validation, independently of encoding and face resolution.
207
+ */
208
+ checkRoman?: boolean | undefined;
209
+ /**
210
+ * - Its selection and source structure permit
211
+ * native encoding and output glyph validation.
212
+ */
213
+ checkText?: boolean | undefined;
199
214
  /**
200
215
  * - A scroll fence whose opening has a finding,
201
216
  * which is left as written.
@@ -206,6 +221,10 @@ export type RunDetail = {
206
221
  * What a run is checked against.
207
222
  */
208
223
  export type RunContext = {
224
+ /**
225
+ * - The citing content package.
226
+ */
227
+ contentPackage?: string | undefined;
209
228
  /**
210
229
  * - The
211
230
  * configured languages.
@@ -221,25 +240,73 @@ export type RunContext = {
221
240
  faces?: ReadonlyMap<string, import("./script-fonts.mjs").Face> | undefined;
222
241
  /**
223
242
  * -
224
- * The mapping notes' maps by name, from
225
- * {@link module :engine/text-maps.mapsFromRecords}.
243
+ * The compiled encoding documents, keyed by canonical and local Addresses.
244
+ */
245
+ encodings?: ReadonlyMap<string, Readonly<{
246
+ name: any;
247
+ language?: any;
248
+ font?: any;
249
+ template?: Readonly<{
250
+ normalization: "NFC";
251
+ vowelGroups: any;
252
+ maxVowelGroup: number;
253
+ stress: "󠄔" | undefined;
254
+ diaeresis: boolean;
255
+ grave: boolean;
256
+ }> | undefined;
257
+ fonts: readonly any[];
258
+ separator: any;
259
+ separatorRow: {
260
+ from: string;
261
+ to: any;
262
+ key: string;
263
+ };
264
+ vowels: Set<any>;
265
+ accepted: Set<any>;
266
+ controls: any;
267
+ groupCase: any;
268
+ roundTrip: any;
269
+ shared: {
270
+ rows: any;
271
+ index: Map<any, any>;
272
+ readings: Map<any, any>;
273
+ };
274
+ faces: Map<any, any>;
275
+ codes: {
276
+ rows: any;
277
+ index: Map<any, any>;
278
+ readings: Map<any, any>;
279
+ };
280
+ }>> | undefined;
281
+ /**
282
+ * - Encoding-document or font-code findings.
226
283
  */
227
- maps?: ReadonlyMap<string, import("./text-maps.mjs").TextMap> | undefined;
284
+ encodingFindings?: readonly {
285
+ file?: string;
286
+ line?: number;
287
+ column?: number;
288
+ message: string;
289
+ }[] | undefined;
228
290
  /**
229
- * -
230
- * The script each configured language's note names, by language name, from
231
- * {@link module :engine/written-in.writtenInOf}.
291
+ * - Serialized encoding documents and their selected font codes.
232
292
  */
233
- writtenIn?: ReadonlyMap<string, import("./written-in.mjs").WrittenIn> | undefined;
293
+ encodingDefinitions?: ReadonlyMap<string, {
294
+ data: object;
295
+ codes: Record<string, string>;
296
+ }> | undefined;
297
+ /**
298
+ * - The configured language notes.
299
+ */
300
+ languageRecords?: ReadonlyMap<string, Record<string, any>> | undefined;
234
301
  /**
235
302
  * -
236
303
  * Each configured language's lexicon by name, from
237
- * {@link module :engine/map-lexicon.lexiconsFromRecords}.
304
+ * {@link module :engine/encoding-lexicon.lexiconsFromRecords}.
238
305
  */
239
- lexicons?: ReadonlyMap<string, import("./map-lexicon.mjs").Lexicon> | undefined;
306
+ lexicons?: ReadonlyMap<string, import("./encoding-lexicon.mjs").Lexicon> | undefined;
240
307
  /**
241
308
  * -
242
- * What each configured language's mapped runs are checked against, from
309
+ * What each configured language's encoded runs are checked against, from
243
310
  * {@link module :engine/run-words.wordBooksFromRecords}.
244
311
  */
245
312
  wordBooks?: ReadonlyMap<string, import("./run-words.mjs").WordBook> | undefined;
@@ -279,11 +346,9 @@ export type RunContext = {
279
346
  directions?: ReadonlyMap<string, "vertical-rl"> | undefined;
280
347
  };
281
348
  /**
282
- * One span, div, verse fence or scroll fence carrying `lang=`, `font=` or
283
- * `map=`. Its `lang`, `font` and `map` are the ones it is set with: its own,
284
- * else inherited language or an ordinary prose family. Native map/face
285
- * defaults are selected only by this construct's explicit `.nativefont`
286
- * opt-in; marked children make their own presentation choice.
349
+ * One span, div, verse fence or scroll fence carrying run attributes.
350
+ * Values combine explicit choices, class-only inheritance, encoding-document
351
+ * language/font defaults and the Roman default encoding.
287
352
  */
288
353
  export type Run = {
289
354
  /**
@@ -304,9 +369,9 @@ export type Run = {
304
369
  */
305
370
  font: string | undefined;
306
371
  /**
307
- * - The map as written.
372
+ * - The resolved document Address, or default for Roman text.
308
373
  */
309
- map: string | undefined;
374
+ enc: string | undefined;
310
375
  /**
311
376
  * - 1-based line of the construct's opening.
312
377
  */
@@ -325,9 +390,5 @@ export type Run = {
325
390
  * fence's 0-based closing line.
326
391
  */
327
392
  end: number;
328
- /**
329
- * - True only for an explicit native opt-in
330
- * with its own language; retained by index records for deferred defaults.
331
- */
332
- nativefont?: boolean | undefined;
333
393
  };
394
+ import { encodingFor } from "./encoding-lexicon.mjs";
@@ -0,0 +1,11 @@
1
+ /** Return only the published definitions and lexical inputs the converter reads. */
2
+ export function buildConverterData(config: any, records: any): import("../convert.mjs").ConverterData;
3
+ /** Write opted-in converter inputs during the package's manifest build. */
4
+ export function writeConverterData({ config, packageBuild, records }: {
5
+ config: any;
6
+ packageBuild: any;
7
+ records: any;
8
+ }): {
9
+ path: string;
10
+ data: import("../convert.mjs").ConverterData;
11
+ } | undefined;
@@ -1,28 +1,3 @@
1
- /**
2
- * A noun's stated plural, or the first literal ending replacement that fits.
3
- *
4
- * @param {{form: string, class?: unknown, plural?: unknown}} word - A word of
5
- * `data.words`.
6
- * @param {Record<string, any>|undefined} grammar - Its language's
7
- * `data.grammar`.
8
- * @returns {string|null} The plural, or `null` for a word that is no noun or
9
- * that no rule fits.
10
- */
11
- export function pluralOf(word: {
12
- form: string;
13
- class?: unknown;
14
- plural?: unknown;
15
- }, grammar: Record<string, any> | undefined): string | null;
16
- /**
17
- * The plural a language's `data.grammar.plural` rule gives a form: the first
18
- * literal ending replacement that fits, whatever the form's class.
19
- *
20
- * @param {string} form - The form.
21
- * @param {Record<string, any>|undefined} grammar - Its language's
22
- * `data.grammar`.
23
- * @returns {string|null} The plural, or `null` where no rule fits.
24
- */
25
- export function pluralByRule(form: string, grammar: Record<string, any> | undefined): string | null;
26
1
  /**
27
2
  * The stable prose anchor of a word in one language's dictionary. The exact
28
3
  * language and NFC form identify it, including case and accents.
@@ -71,3 +46,4 @@ export const DICTIONARY_COLUMNS: readonly string[];
71
46
  export const TERM_COLUMNS: readonly string[];
72
47
  /** The keys of a word's `etymology`, in order. */
73
48
  export const ETYMOLOGY_KEYS: readonly string[];
49
+ export { pluralOf, pluralByRule } from "./word-inflections.mjs";
@@ -0,0 +1,14 @@
1
+ /** Prove ordinary output tokens uniquely decodable without adding invisible metadata. */
2
+ /**
3
+ * Check codeword integrity with a trie and finite Sardinas–Patterson residuals.
4
+ * Source-equivalent compositions are redundant rules, not distinct spellings.
5
+ * @param {Array<{from:string,to:string,key:string,before?:string,at?:string}>} rows - Validated ordinary rows.
6
+ * @param {(key:string,message:string)=>never} fault - Positioned schema-error constructor.
7
+ */
8
+ export function assertUniqueOutputs(rows: Array<{
9
+ from: string;
10
+ to: string;
11
+ key: string;
12
+ before?: string;
13
+ at?: string;
14
+ }>, fault: (key: string, message: string) => never): void;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Encode using the lexicon's own and composed writings before the encoding rows.
3
+ * @param {ReturnType<import("./encoding.mjs").compileEncoding>} enc
4
+ * @param {string} text
5
+ * @param {{font?:string,verse?:boolean,lexicon?:{language:string,data:Record<string,any>}}} [options]
6
+ * @returns {{text:string,pieces:object[],findings:object[]}}
7
+ */
8
+ export function encodeWithLanguage(enc: ReturnType<typeof import("./encoding.mjs").compileEncoding>, text: string, options?: {
9
+ font?: string;
10
+ verse?: boolean;
11
+ lexicon?: {
12
+ language: string;
13
+ data: Record<string, any>;
14
+ };
15
+ }): {
16
+ text: string;
17
+ pieces: object[];
18
+ findings: object[];
19
+ };
20
+ /**
21
+ * Decode with explicit writings first and recover unmarked words from the lexicon.
22
+ * @param {ReturnType<import("./encoding.mjs").compileEncoding>} enc
23
+ * @param {string} text
24
+ * @param {{font?:string,lexicon?:{language:string,data:Record<string,any>}}} [options]
25
+ * @returns {{text:string,findings:object[]}}
26
+ */
27
+ export function decodeWithLanguage(enc: ReturnType<typeof import("./encoding.mjs").compileEncoding>, text: string, options?: {
28
+ font?: string;
29
+ lexicon?: {
30
+ language: string;
31
+ data: Record<string, any>;
32
+ };
33
+ }): {
34
+ text: string;
35
+ findings: object[];
36
+ };
@@ -0,0 +1,259 @@
1
+ /**
2
+ * Each configured language's lexicon, read from the language note its `note`
3
+ * names and its family chain. The nearest exact NFC form supplies the whole
4
+ * word; grammar, registers and other settings remain the daughter's own.
5
+ * A language with no `note`, or one naming no language note, has none.
6
+ *
7
+ * @param {Iterable<Record<string, any>>|undefined} records - Index records.
8
+ * @param {{languages?: Readonly<Record<string, {tag: string, note?: string}>>, contentPackage?: string}} config -
9
+ * The resolved configuration.
10
+ * @returns {Map<string, Lexicon>} The lexicons by language name.
11
+ */
12
+ export function lexiconsFromRecords(records: Iterable<Record<string, any>> | undefined, config?: {
13
+ languages?: Readonly<Record<string, {
14
+ tag: string;
15
+ note?: string;
16
+ }>>;
17
+ contentPackage?: string;
18
+ }): Map<string, Lexicon>;
19
+ /**
20
+ * The language note each configured language's `note` names, by language
21
+ * name. A language with no `note`, or one naming no language note, is absent.
22
+ *
23
+ * @param {Iterable<Record<string, any>>|undefined} records - Index records.
24
+ * @param {{languages?: Readonly<Record<string, {tag: string, note?: string}>>, contentPackage?: string}} config -
25
+ * The resolved configuration.
26
+ * @returns {Map<string, Record<string, any>>} The records.
27
+ */
28
+ export function languageRecordsByName(records: Iterable<Record<string, any>> | undefined, { languages, contentPackage }?: {
29
+ languages?: Readonly<Record<string, {
30
+ tag: string;
31
+ note?: string;
32
+ }>>;
33
+ contentPackage?: string;
34
+ }): Map<string, Record<string, any>>;
35
+ /**
36
+ * Each `languages.<name>.note` that names no language note, at its key.
37
+ *
38
+ * @param {{languages?: Readonly<Record<string, {tag: string, note?: string}>>, contentPackage?: string, configFile?: string, configText?: string}} config -
39
+ * The resolved configuration, and where it was read from.
40
+ * @param {Iterable<Record<string, any>>} records - Index records.
41
+ * @returns {object[]} The findings.
42
+ */
43
+ export function languageNoteFindings(config: {
44
+ languages?: Readonly<Record<string, {
45
+ tag: string;
46
+ note?: string;
47
+ }>>;
48
+ contentPackage?: string;
49
+ configFile?: string;
50
+ configText?: string;
51
+ }, records: Iterable<Record<string, any>>): object[];
52
+ /**
53
+ * One row per native form of a language note's word, for the `natives`
54
+ * relation: a text is a value of a row, never a struct key, so forms that
55
+ * differ only in case stay apart.
56
+ *
57
+ * @param {Iterable<Record<string, any>>} records - Index records.
58
+ * @returns {Array<Record<string, string|number|null>>} The rows; `word` is the
59
+ * word's 0-based place in `data.words`, `native` the form's in its `native`.
60
+ */
61
+ export function nativeRows(records: Iterable<Record<string, any>>): Array<Record<string, string | number | null>>;
62
+ /** Project only conversion-readable language data to a JSON-safe object. */
63
+ export function serializeLexicon(lexicon: any): {
64
+ language: any;
65
+ data: {
66
+ grammar?: {
67
+ [k: string]: any;
68
+ } | undefined;
69
+ words: {
70
+ [k: string]: any;
71
+ }[];
72
+ affixes: {
73
+ [k: string]: any;
74
+ }[];
75
+ register: {
76
+ [k: string]: any;
77
+ }[];
78
+ };
79
+ } | undefined;
80
+ /**
81
+ * Resolve encoding, face and optional language input without loading files.
82
+ *
83
+ * @param {import("./content-scripts.mjs").RunContext} ctx - Installed encodings,
84
+ * document aliases and lexicons prepared by the caller.
85
+ * @param {object} [options] - Explicit selections; an omitted encoding is the Roman default.
86
+ * @param {string} [options.enc] - Encoding document Address.
87
+ * @param {string} [options.font] - The encoding document's font.
88
+ * @param {string} [options.lang] - Configured language whose lexicon to use.
89
+ */
90
+ export function encodingFor(ctx: import("./content-scripts.mjs").RunContext, { enc, font, lang }?: {
91
+ enc?: string | undefined;
92
+ font?: string | undefined;
93
+ lang?: string | undefined;
94
+ }): {
95
+ encoding: Readonly<{
96
+ name: any;
97
+ language?: any;
98
+ font?: any;
99
+ template?: Readonly<{
100
+ normalization: "NFC";
101
+ vowelGroups: any;
102
+ maxVowelGroup: number;
103
+ stress: "󠄔" | undefined;
104
+ diaeresis: boolean;
105
+ grave: boolean;
106
+ }> | undefined;
107
+ fonts: readonly any[];
108
+ separator: any;
109
+ separatorRow: {
110
+ from: string;
111
+ to: any;
112
+ key: string;
113
+ };
114
+ vowels: Set<any>;
115
+ accepted: Set<any>;
116
+ controls: any;
117
+ groupCase: any;
118
+ roundTrip: any;
119
+ shared: {
120
+ rows: any;
121
+ index: Map<any, any>;
122
+ readings: Map<any, any>;
123
+ };
124
+ faces: Map<any, any>;
125
+ codes: {
126
+ rows: any;
127
+ index: Map<any, any>;
128
+ readings: Map<any, any>;
129
+ };
130
+ }>;
131
+ font: any;
132
+ lexicon: {
133
+ language: any;
134
+ data: {
135
+ grammar?: {
136
+ [k: string]: any;
137
+ } | undefined;
138
+ words: {
139
+ [k: string]: any;
140
+ }[];
141
+ affixes: {
142
+ [k: string]: any;
143
+ }[];
144
+ register: {
145
+ [k: string]: any;
146
+ }[];
147
+ };
148
+ } | undefined;
149
+ } | undefined;
150
+ /** Why a face is incompatible with the selected encoding. */
151
+ export function fontProblem(encoding: any, font: any): string | undefined;
152
+ /** List authored and optionally derived forms with their selected native writings. */
153
+ export function lexiconEntries(ctx: any, { lang, enc, font, derived }: {
154
+ lang: any;
155
+ enc: any;
156
+ font: any;
157
+ derived?: boolean | undefined;
158
+ }): {
159
+ about: string;
160
+ problem: string;
161
+ entries?: undefined;
162
+ } | {
163
+ entries: {
164
+ from?: any;
165
+ ambiguous?: boolean | undefined;
166
+ form: any;
167
+ native: string;
168
+ class: any;
169
+ gloss: any;
170
+ source: string;
171
+ exception: boolean;
172
+ }[];
173
+ about?: undefined;
174
+ problem?: undefined;
175
+ };
176
+ /** Validate word, affix and grammar-ending native entries against installed encodings. */
177
+ export function checkLexiconNatives(note: any, ctx: any): any[];
178
+ /** Validate every authored word and name against its language's encoding documents.
179
+ * @param {{fm:Record<string,any>,file:string,raw?:string}} note - The source language note.
180
+ * @param {import("./content-scripts.mjs").RunContext} ctx - Compiled documents and language identities.
181
+ * @returns {object[]} Positioned orthography findings, independent of lexical native overrides.
182
+ */
183
+ export function checkEncodingLexicon(note: {
184
+ fm: Record<string, any>;
185
+ file: string;
186
+ raw?: string;
187
+ }, ctx: import("./content-scripts.mjs").RunContext): object[];
188
+ /** Every column of the `natives` relation, in order. */
189
+ export const NATIVE_COLUMNS: readonly string[];
190
+ /**
191
+ * One native form, read.
192
+ */
193
+ export type NativeForm = {
194
+ /**
195
+ * - The encoding it is written for.
196
+ */
197
+ enc: string;
198
+ /**
199
+ * - The one face it is for.
200
+ */
201
+ font: string | undefined;
202
+ /**
203
+ * - The word in the script.
204
+ */
205
+ text: string;
206
+ };
207
+ /**
208
+ * One word of a lexicon.
209
+ */
210
+ export type LexiconWord = {
211
+ /**
212
+ * - The word as cited.
213
+ */
214
+ form: string;
215
+ /**
216
+ * - Its class.
217
+ */
218
+ class: string | null;
219
+ /**
220
+ * - Its senses, joined by `; `.
221
+ */
222
+ gloss: string | null;
223
+ /**
224
+ * - Its native forms.
225
+ */
226
+ natives: readonly NativeForm[];
227
+ };
228
+ /**
229
+ * A language's lexicon.
230
+ */
231
+ export type Lexicon = {
232
+ /**
233
+ * - The language's configured name.
234
+ */
235
+ language: string;
236
+ /**
237
+ * - Its words, in `data.words` order.
238
+ */
239
+ words: readonly LexiconWord[];
240
+ /**
241
+ * - The native
242
+ * forms by the word's form, NFC; the first word of a form keeps it.
243
+ */
244
+ byForm: ReadonlyMap<string, readonly NativeForm[]>;
245
+ /**
246
+ * - The
247
+ * forms the language's rules derive from its words, folded, as the mapped-run
248
+ * word check accepts them (see {@link module :engine/word-forms.derivedForms}).
249
+ */
250
+ derived: ReadonlyArray<{
251
+ form: string;
252
+ from: LexiconWord;
253
+ }>;
254
+ /**
255
+ * - The language note's `data`, which a
256
+ * encoding writes words from.
257
+ */
258
+ data: Record<string, any>;
259
+ };
@@ -0,0 +1,39 @@
1
+ /** Complete an encoding reference with the document type and citing package.
2
+ * @param {unknown} value - Authored encoding Address or default.
3
+ * @param {string} [contentPackage] - The citing note's package.
4
+ * @returns {string|undefined} Canonical Address, default, or an invalid reference.
5
+ */
6
+ export function encodingAddress(value: unknown, contentPackage?: string): string | undefined;
7
+ /** The executable fields a document owns, excluding ordinary document metadata.
8
+ * @param {Record<string, any>} data - Authored document data.
9
+ * @returns {Record<string, any>} Only the compiler's fields.
10
+ */
11
+ export function encodingData(data: Record<string, any>): Record<string, any>;
12
+ /** Read this selected face's published glyph codes, with no external code tables.
13
+ * @param {import("./script-fonts.mjs").ScriptFonts|undefined} fonts - Consumer fonts.
14
+ * @param {string} font - The selected face's slug.
15
+ * @returns {Record<string,string>} Code-to-Unicode mapping for this font only.
16
+ */
17
+ export function fontCodes(fonts: import("./script-fonts.mjs").ScriptFonts | undefined, font: string): Record<string, string>;
18
+ /** Compile each encoding document once and resolve references by document Address.
19
+ * @param {Iterable<Record<string, any>>} records - Content index records.
20
+ * @param {{languages?: Record<string, any>, contentPackage?: string, rootDir?: string, paths?: {content?: string}}} [config] - Consumer context.
21
+ * @param {import("./script-fonts.mjs").ScriptFonts} [fonts] - Installed glyph metadata.
22
+ * @returns {{encodings: Map<string, ReturnType<typeof compileEncoding>>, definitions: Map<string,{data:Record<string,any>,codes:Record<string,string>}>, findings:object[]}} Runtime and serializable document inputs.
23
+ */
24
+ export function encodingsFromRecords(records: Iterable<Record<string, any>>, config?: {
25
+ languages?: Record<string, any>;
26
+ contentPackage?: string;
27
+ rootDir?: string;
28
+ paths?: {
29
+ content?: string;
30
+ };
31
+ }, fonts?: import("./script-fonts.mjs").ScriptFonts): {
32
+ encodings: Map<string, ReturnType<typeof compileEncoding>>;
33
+ definitions: Map<string, {
34
+ data: Record<string, any>;
35
+ codes: Record<string, string>;
36
+ }>;
37
+ findings: object[];
38
+ };
39
+ import { compileEncoding } from "./encoding.mjs";
@@ -0,0 +1,11 @@
1
+ /** Shared Roman punctuation and invisible structural controls for every encoding. */
2
+ export const STANDARD_ROWS: readonly Readonly<unknown>[];
3
+ /** Controls belong to the engine and never come from font encoding files. */
4
+ export const STANDARD_CONTROLS: Readonly<{
5
+ verseStanza: "󠄍";
6
+ verseCanto: "󠄎";
7
+ wordSeparator: " ";
8
+ literalOpen: "󠄒";
9
+ literalClose: "󠄓";
10
+ literalEscape: "󠄕";
11
+ }>;