@heroiclands/package-build 23.12.8 → 24.0.0

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 (258) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +3 -2
  3. package/assets/preview/gitea.ini +12 -7
  4. package/assets/styles/content-base.css +293 -24
  5. package/bin/content-commands.mjs +370 -213
  6. package/bin/package-build-preview.mjs +2 -2
  7. package/bin/package-build.mjs +3 -2
  8. package/ci/check-banners.mjs +7 -7
  9. package/config.mjs +21 -6
  10. package/content-config.mjs +199 -80
  11. package/docs/api.md +110 -89
  12. package/docs/authoring/links-and-markup.md +469 -97
  13. package/docs/commands.md +259 -78
  14. package/docs/configuration.md +211 -103
  15. package/docs/content-format.md +4 -4
  16. package/docs/diagnostics.md +44 -2
  17. package/docs/getting-started.md +1 -1
  18. package/docs/guides/icons.md +1 -1
  19. package/docs/guides/module-project.md +5 -8
  20. package/docs/guides/release-and-deploy.md +2 -2
  21. package/docs/guides/site.md +112 -23
  22. package/docs/guides/system-project.md +1 -1
  23. package/docs/guides/writing-in-invented-scripts.md +1247 -0
  24. package/docs/index.md +1 -0
  25. package/docs/project-setup.md +28 -30
  26. package/docs/reference/format-details.md +677 -319
  27. package/docs/reference/note-types.md +47 -10
  28. package/docs/reference/theme-pages.md +178 -108
  29. package/docs/source-preview.md +16 -2
  30. package/engine/anchors.mjs +2 -2
  31. package/engine/asset-shipping.mjs +22 -10
  32. package/engine/base-compiler.mjs +62 -104
  33. package/engine/changelog-lint.mjs +1 -1
  34. package/engine/code-fences.mjs +3 -3
  35. package/engine/content-address.mjs +1 -1
  36. package/engine/content-alerts.mjs +8 -4
  37. package/engine/content-blocks.mjs +29 -14
  38. package/engine/content-embeds.mjs +1 -1
  39. package/engine/content-expand.mjs +376 -0
  40. package/engine/content-figures.mjs +18 -11
  41. package/engine/content-format.yaml +8 -0
  42. package/engine/content-glyphs.mjs +213 -0
  43. package/engine/content-images.mjs +6 -7
  44. package/engine/content-index.mjs +1 -1
  45. package/engine/content-links.mjs +3 -3
  46. package/engine/content-lint.mjs +1 -1
  47. package/engine/content-render.mjs +453 -0
  48. package/engine/content-scripts.mjs +376 -43
  49. package/engine/content-spans.mjs +6 -3
  50. package/engine/content-styles.mjs +91 -0
  51. package/engine/content-symbols.mjs +186 -0
  52. package/engine/content-verse.mjs +738 -0
  53. package/engine/core-report.mjs +169 -0
  54. package/engine/core-vocabulary.mjs +208 -0
  55. package/engine/dictionary-html.mjs +119 -0
  56. package/engine/dictionary-rows.mjs +15 -4
  57. package/engine/field-reference.mjs +5 -5
  58. package/engine/first-use.mjs +17 -27
  59. package/engine/frontmatter-lint.mjs +1 -1
  60. package/engine/heading-attributes.mjs +89 -0
  61. package/engine/helpers.mjs +61 -101
  62. package/engine/homepage.mjs +17 -29
  63. package/engine/html-minify.mjs +70 -0
  64. package/engine/index.mjs +8 -5
  65. package/engine/key-case-collisions.mjs +136 -0
  66. package/engine/language-data.mjs +203 -6
  67. package/engine/language-rows.mjs +8 -2
  68. package/engine/language-terms.mjs +186 -16
  69. package/engine/language-words.mjs +12 -0
  70. package/engine/logographic.mjs +255 -0
  71. package/engine/map-lexicon.mjs +262 -47
  72. package/engine/map-places.mjs +5 -4
  73. package/engine/markdown-expressions.mjs +0 -2
  74. package/engine/markdownlint-run.mjs +9 -3
  75. package/engine/markup-validation.mjs +21 -0
  76. package/engine/metre-declaration.mjs +134 -0
  77. package/engine/names.mjs +36 -9
  78. package/engine/note-matter.mjs +66 -0
  79. package/engine/note-vocabulary.mjs +187 -3
  80. package/engine/pdf-build.mjs +69 -133
  81. package/engine/pdf-render.mjs +205 -58
  82. package/engine/post-fields.mjs +157 -0
  83. package/engine/preview-index.mjs +130 -0
  84. package/engine/preview-source.mjs +450 -0
  85. package/engine/project-init.mjs +5 -12
  86. package/engine/prose-config.mjs +3 -3
  87. package/engine/read-stdin.mjs +29 -0
  88. package/engine/run-rows.mjs +2 -2
  89. package/engine/run-words.mjs +6 -112
  90. package/engine/script-emphasis-terms.mjs +38 -0
  91. package/engine/script-emphasis.mjs +295 -0
  92. package/engine/script-font-delivery.mjs +4 -4
  93. package/engine/site-build.mjs +260 -315
  94. package/engine/site-config.mjs +26 -238
  95. package/engine/site-files.mjs +175 -0
  96. package/engine/site-index.mjs +9 -4
  97. package/engine/site-preview.mjs +52 -525
  98. package/engine/site-render.mjs +593 -0
  99. package/engine/site-root.mjs +22 -13
  100. package/engine/site-search.mjs +161 -0
  101. package/engine/site-serve.mjs +273 -0
  102. package/engine/site-theme-banner.mjs +154 -0
  103. package/engine/site-theme-urls.mjs +125 -0
  104. package/engine/site-theme.mjs +926 -0
  105. package/engine/sql-tables.mjs +20 -3
  106. package/engine/text-maps.mjs +57 -10
  107. package/engine/typographer.mjs +248 -0
  108. package/engine/verse-metre.mjs +357 -0
  109. package/engine/wikilink-syntax.mjs +29 -47
  110. package/engine/wikilinks.mjs +758 -279
  111. package/engine/word-forms.mjs +364 -0
  112. package/engine/word-rows.mjs +12 -2
  113. package/engine/word-terms.mjs +38 -4
  114. package/manifest.mjs +3 -4
  115. package/package.json +11 -8
  116. package/{hugo-theme → site-theme}/data/banners.yaml +6 -10
  117. package/site-theme/layouts/base.hbs +31 -0
  118. package/site-theme/layouts/blog-list.hbs +30 -0
  119. package/site-theme/layouts/blog-post.hbs +40 -0
  120. package/site-theme/layouts/home.hbs +35 -0
  121. package/site-theme/layouts/list.hbs +20 -0
  122. package/site-theme/layouts/not-found.hbs +31 -0
  123. package/site-theme/layouts/page.hbs +7 -0
  124. package/site-theme/partials/copy-buttons.hbs +37 -0
  125. package/site-theme/partials/draft-notice.hbs +5 -0
  126. package/site-theme/partials/exturl.hbs +2 -0
  127. package/{hugo-theme/layouts/partials/footer.html → site-theme/partials/footer.hbs} +10 -7
  128. package/site-theme/partials/header.hbs +44 -0
  129. package/site-theme/partials/hero-banner.hbs +11 -0
  130. package/site-theme/partials/infobox-entry.hbs +2 -0
  131. package/site-theme/partials/infobox-section.hbs +31 -0
  132. package/site-theme/partials/infobox-value.hbs +2 -0
  133. package/site-theme/partials/infobox.hbs +18 -0
  134. package/site-theme/partials/list-members.hbs +9 -0
  135. package/site-theme/partials/nav-links.hbs +5 -0
  136. package/site-theme/partials/page-body.hbs +48 -0
  137. package/site-theme/partials/page-list.hbs +14 -0
  138. package/site-theme/partials/related.hbs +24 -0
  139. package/site-theme/partials/search-meta.hbs +6 -0
  140. package/site-theme/partials/search-names.hbs +2 -0
  141. package/site-theme/partials/search.hbs +52 -0
  142. package/site-theme/partials/tags.hbs +4 -0
  143. package/site-theme/partials/toc.hbs +7 -0
  144. package/{hugo-theme → site-theme}/static/css/style.css +106 -14
  145. package/stage.mjs +1 -2
  146. package/types/config.d.mts +8 -4
  147. package/types/content-config.d.mts +15 -15
  148. package/types/engine/asset-shipping.d.mts +5 -2
  149. package/types/engine/base-compiler.d.mts +20 -2
  150. package/types/engine/code-fences.d.mts +3 -3
  151. package/types/engine/content-address.d.mts +1 -1
  152. package/types/engine/content-alerts.d.mts +8 -2
  153. package/types/engine/content-blocks.d.mts +11 -4
  154. package/types/engine/content-expand.d.mts +288 -0
  155. package/types/engine/content-figures.d.mts +11 -3
  156. package/types/engine/content-glyphs.d.mts +85 -0
  157. package/types/engine/content-images.d.mts +6 -7
  158. package/types/engine/content-links.d.mts +1 -1
  159. package/types/engine/content-render.d.mts +199 -0
  160. package/types/engine/content-scripts.d.mts +70 -4
  161. package/types/engine/content-spans.d.mts +1 -1
  162. package/types/engine/content-styles.d.mts +33 -0
  163. package/types/engine/content-symbols.d.mts +35 -0
  164. package/types/engine/content-verse.d.mts +240 -0
  165. package/types/engine/core-report.d.mts +45 -0
  166. package/types/engine/core-vocabulary.d.mts +53 -0
  167. package/types/engine/dictionary-html.d.mts +8 -0
  168. package/types/engine/dictionary-rows.d.mts +10 -0
  169. package/types/engine/field-reference.d.mts +2 -2
  170. package/types/engine/heading-attributes.d.mts +20 -0
  171. package/types/engine/helpers.d.mts +3 -10
  172. package/types/engine/homepage.d.mts +11 -24
  173. package/types/engine/html-minify.d.mts +9 -0
  174. package/types/engine/index.d.mts +2 -1
  175. package/types/engine/key-case-collisions.d.mts +28 -0
  176. package/types/engine/language-data.d.mts +0 -2
  177. package/types/engine/language-terms.d.mts +24 -2
  178. package/types/engine/logographic.d.mts +45 -0
  179. package/types/engine/map-lexicon.d.mts +66 -13
  180. package/types/engine/map-places.d.mts +8 -0
  181. package/types/engine/markdown-expressions.d.mts +0 -2
  182. package/types/engine/metre-declaration.d.mts +39 -0
  183. package/types/engine/names.d.mts +34 -3
  184. package/types/engine/note-matter.d.mts +48 -0
  185. package/types/engine/pdf-render.d.mts +6 -2
  186. package/types/engine/post-fields.d.mts +44 -0
  187. package/types/engine/preview-index.d.mts +72 -0
  188. package/types/engine/preview-source.d.mts +51 -0
  189. package/types/engine/read-stdin.d.mts +11 -0
  190. package/types/engine/run-rows.d.mts +2 -2
  191. package/types/engine/run-words.d.mts +0 -15
  192. package/types/engine/script-emphasis-terms.d.mts +21 -0
  193. package/types/engine/script-emphasis.d.mts +84 -0
  194. package/types/engine/script-font-delivery.d.mts +4 -4
  195. package/types/engine/site-build.d.mts +71 -113
  196. package/types/engine/site-config.d.mts +14 -134
  197. package/types/engine/site-files.d.mts +73 -0
  198. package/types/engine/site-index.d.mts +11 -3
  199. package/types/engine/site-preview.d.mts +15 -19
  200. package/types/engine/site-render.d.mts +171 -0
  201. package/types/engine/site-root.d.mts +12 -4
  202. package/types/engine/site-search.d.mts +54 -0
  203. package/types/engine/site-serve.d.mts +44 -0
  204. package/types/engine/site-theme-banner.d.mts +51 -0
  205. package/types/engine/site-theme-urls.d.mts +60 -0
  206. package/types/engine/site-theme.d.mts +127 -0
  207. package/types/engine/sql-tables.d.mts +4 -1
  208. package/types/engine/text-maps.d.mts +17 -3
  209. package/types/engine/typographer.d.mts +11 -0
  210. package/types/engine/verse-metre.d.mts +131 -0
  211. package/types/engine/wikilink-syntax.d.mts +30 -48
  212. package/types/engine/wikilinks.d.mts +330 -14
  213. package/types/engine/word-forms.d.mts +83 -0
  214. package/types/manifest.d.mts +3 -4
  215. package/types/stage.d.mts +1 -2
  216. package/types/vendor/markdownlint.d.mts +8 -0
  217. package/vendor/markdownlint.mjs +20388 -0
  218. package/engine/content-poetry.mjs +0 -240
  219. package/engine/web-wikilinks.mjs +0 -594
  220. package/hugo-theme/layouts/404.html +0 -85
  221. package/hugo-theme/layouts/_default/baseof.html +0 -67
  222. package/hugo-theme/layouts/_default/list.html +0 -139
  223. package/hugo-theme/layouts/_default/single.html +0 -4
  224. package/hugo-theme/layouts/blog/list.html +0 -54
  225. package/hugo-theme/layouts/blog-post/single.html +0 -36
  226. package/hugo-theme/layouts/index.html +0 -75
  227. package/hugo-theme/layouts/partials/banner-url.html +0 -141
  228. package/hugo-theme/layouts/partials/cdn-url.html +0 -36
  229. package/hugo-theme/layouts/partials/dictionary-lists.html +0 -58
  230. package/hugo-theme/layouts/partials/draft-notice.html +0 -41
  231. package/hugo-theme/layouts/partials/draft-state.html +0 -26
  232. package/hugo-theme/layouts/partials/header.html +0 -35
  233. package/hugo-theme/layouts/partials/hero-banner.html +0 -85
  234. package/hugo-theme/layouts/partials/infobox/entry.html +0 -18
  235. package/hugo-theme/layouts/partials/infobox/items.html +0 -26
  236. package/hugo-theme/layouts/partials/infobox/section.html +0 -56
  237. package/hugo-theme/layouts/partials/infobox/value.html +0 -43
  238. package/hugo-theme/layouts/partials/infobox.html +0 -57
  239. package/hugo-theme/layouts/partials/page-body.html +0 -152
  240. package/hugo-theme/layouts/partials/related.html +0 -138
  241. package/hugo-theme/layouts/partials/search.html +0 -84
  242. package/hugo-theme/layouts/partials/site-url.html +0 -32
  243. package/hugo-theme/layouts/partials/tags.html +0 -30
  244. package/hugo-theme/layouts/partials/toc.html +0 -28
  245. package/hugo-theme/layouts/partials/warn-missing-banner.html +0 -3
  246. package/hugo-theme/layouts/shortcodes/cartouche.html +0 -64
  247. package/hugo-theme/layouts/shortcodes/exturl.html +0 -12
  248. package/hugo-theme/layouts/shortcodes/glyph.html +0 -43
  249. package/hugo-theme/layouts/shortcodes/pagelist.html +0 -63
  250. package/hugo-theme/theme.toml +0 -11
  251. package/types/engine/content-poetry.d.mts +0 -58
  252. package/types/engine/web-wikilinks.d.mts +0 -107
  253. /package/{hugo-theme → site-theme}/data/banner-kinds.yaml +0 -0
  254. /package/{hugo-theme → site-theme}/static/css/sohl-icons.css +0 -0
  255. /package/{hugo-theme → site-theme}/static/fonts/game-icons-kb.woff2 +0 -0
  256. /package/{hugo-theme → site-theme}/static/img/banners/takheperu-hieroglyphs.svg +0 -0
  257. /package/{hugo-theme → site-theme}/static/img/cartouches/takheperu.svg +0 -0
  258. /package/{hugo-theme → site-theme}/static/js/inline-spoilers.js +0 -0
@@ -463,11 +463,12 @@ These fields are accepted by every note type. A field's value can still be irrel
463
463
  | `data.names` | a language's name lists | How this language's speakers are named, for `package-build npc new`: `pattern` builds a name from placeholders such as "{given} {clan}" and literal text, `given` maps a gender to a list of given names, `female` and `male` required, and every other key is a list of names a placeholder of the same name draws from. A language skill note only. See [name lists](format-details.md#name-lists). |
464
464
  | `data.family` | an Address | The parent language, as a language skill note: this language reads the parent's words, and its parents' in turn, as its own. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
465
465
  | `data.abbreviation` | a string, such as `Prov.` | The tag a dictionary prints for the language, beside an entry's class and in an etymology, as `Prov.`; the language's full name where unstated. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
466
+ | `data.core` | `true` or `false` | Whether the language must cover the core vocabulary: `true` lists it in the `package-build core` report. A language skill note only. See [the core vocabulary](format-details.md#the-core-vocabulary). |
466
467
  | `data.classModifiers` | list of word class modifiers | The class modifiers the language uses, from the master word classes. A word's class may carry only these. Empty when unstated. A language skill note only. |
467
468
  | `data.fields` | list of `{ name, holds }` | The fields the language's words are grouped under. A language skill note only. |
468
469
  | `data.words` | list of `{ form, class, field, gloss, … }` | The words this language states, one map each, in authored order; its automatic dictionary sorts them alphabetically. A language skill note only. See [a language's words](format-details.md#a-languages-words). |
469
470
  | `data.affixes` | list of `{ form, gloss, attaches?, examples? }` | The affixes a word's `built` pieces may name, each with its gloss. A language skill note only. |
470
- | `data.grammar` | a map — `{ plural?, verbs? }` | Optional noun plurals and one verb pattern for dictionary presentation. Only the shape of supplied keys is checked; no word must follow or state a rule. A language skill note only. |
471
+ | `data.grammar` | a map — `{ plural?, verbs?, agreement?, participles?, native? }` | Optional noun plurals, one verb pattern, agreement, participles and the endings' logographic writings, for dictionary presentation, the mapped-run word check and logographic maps. Only the shape of supplied keys is checked; no word must follow or state a rule. A language skill note only. |
471
472
  | `data.tongues` | list of `{ tag, meaning, language? }` | The tags a register row's `tongue` may name, each with what it means. A language skill note only. |
472
473
  | `data.register` | list of `{ name, tongue?, kind?, built?, gloss?, why? }` | Every name the setting gives in the language's reach, with its tongue and pieces; the notes carrying each name are derived. A language skill note only. |
473
474
  | `data.retired` | list of `{ form, instead?, why }` | The forms the setting does not write, and why. A language skill note only. |
@@ -481,6 +482,8 @@ These fields are accepted by every note type. A field's value can still be irrel
481
482
  | `data.older` | list of `{ form, gloss?, layer? }` | The words and names older than the language's rules, which no sound or name rule holds. A language skill note only. |
482
483
  | `data.negation` | a map — `{ particle, mutation? }` | How a verb is negated. A language skill note only. |
483
484
  | `data.naming` | a map — `{ shapes?, edges?, draws?, heldFrom?, nearName? }` | The shapes, edges and sources the language's names keep beyond its words' rules. A language skill note only. |
485
+ | `data.emphasis` | `words`, `rubric` or `overline` | How the language marks a stressed word, over its script's `emphasis`: `rubric` or `overline` sets `*…*` and `**…**` so in a run of the language, and `words` marks it with a word, so either is a finding. Only a skill of `subType: language` states it. |
486
+ | `data.script` | a map — `{ fonts, emphasis, strongEmphasis? }` | A script note's faces and how it marks emphasis. Only a skill of `subType: script` states it. |
484
487
 
485
488
  **Inner keys** — a key a field's value does not declare is an error at its own line and column.
486
489
 
@@ -491,12 +494,13 @@ These fields are accepted by every note type. A field's value can still be irrel
491
494
  | `data.fields[].name` | a string | yes | The field's name, which a word's `field` names. |
492
495
  | `data.fields[].holds` | a string | yes | What the field holds. |
493
496
  | `data.words[].form` | the word as cited, bare | yes | The word as cited, with no backticks. |
494
- | `data.words[].variants` | a list of forms | no | The word's other forms, such as a long form beside a short one; a marked use of one cites the word. |
497
+ | `data.words[].variants` | a list of forms | no | The word's other forms, such as a long form beside a short one; a marked use of one cites the word, and a mapped run accepts it and the forms the language's rules derive from it. |
495
498
  | `data.words[].name_sort` | a string | no | The sort key; the form when unstated. |
496
499
  | `data.words[].class` | a word class, base first, such as `n I f` | yes | A class from the master word classes: a base, then the modifiers the language declares in `classModifiers`. |
497
500
  | `data.words[].plural` | a string | no | The noun's explicit plural, where it differs from the language's optional plural rule. A dictionary uses this form before the rule; no rule agreement is checked. |
498
501
  | `data.words[].field` | one of the language's `fields` names | yes | The field tag beside the dictionary entry, named in the language's `fields`. |
499
502
  | `data.words[].gloss` | a string, or a list of senses | yes | The meaning, in brief; a list states one sense per entry, which a dictionary numbers. |
503
+ | `data.words[].concept` | a core concept's id, or a list of them | no | The core concepts the word serves, each an `id` of a `data.concepts` list. The core report counts the word toward them. |
500
504
  | `data.words[].source` | a map — `{ kind, language?, form? }` | no | Where the word comes from. |
501
505
  | `data.words[].source.kind` | one of inherited, borrowed, kept, worn, coined, substrate, island | yes | How the word came into the tongue. |
502
506
  | `data.words[].source.language` | a language skill Address | no | The tongue the word was borrowed from; required for `borrowed`. |
@@ -507,10 +511,10 @@ These fields are accepted by every note type. A field's value can still be irrel
507
511
  | `data.words[].tones` | a string | no | A tone pattern, such as `LHL`. |
508
512
  | `data.words[].root` | a string | no | A consonantal skeleton, such as `d-l-k`. |
509
513
  | `data.words[].frame` | a frame of the language's `sounds.frames` | no | The frame a root is set in, named in the language's `sounds.frames`. |
510
- | `data.words[].native` | a list of `{ map, font?, text }` | no | The word's native form under a map, stated only where the map's rows spell it differently. Its derived forms are spelled by the rows. |
514
+ | `data.words[].native` | a list of `{ map, font?, text }` | no | The word's native form under a map. Under a map that spells by its rows it is stated only where the rows spell the word differently, and the word's derived forms are spelled by the rows; under a logographic map it is the word's writing, which its derived forms and the words built on it are written from. |
511
515
  | `data.words[].native[].map` | a mapping note's `data.map.name` | yes | The map the native form is written for. |
512
516
  | `data.words[].native[].font` | a face the map lists | no | The one face the native form is for; unstated, it is for every face the map lists, and a form stated for a face wins over it there. |
513
- | `data.words[].native[].text` | the word in the script, as the map's characters | yes | The word as the script writes it, where the map's rows would write it otherwise. |
517
+ | `data.words[].native[].text` | the word in the script, as the map's characters | yes | The word as the script writes it, where the map's rows would write it otherwise, or as a logographic map writes it. |
514
518
  | `data.affixes[].form` | the affix as written, such as `-rith` | no | The affix as a word's `built` names it; absent on a zero affix. |
515
519
  | `data.affixes[].zero` | `true` | no | The affix is written as nothing, such as a case with no ending; it states no `form`, prints as `∅`, and no `built` piece names it. |
516
520
  | `data.affixes[].kind` | one of case, derivation, tense, aspect, mood, voice, name, lineage | no | What the affix makes. |
@@ -519,11 +523,16 @@ These fields are accepted by every note type. A field's value can still be irrel
519
523
  | `data.affixes[].gloss` | a string | yes | What the affix means. |
520
524
  | `data.affixes[].attaches` | a string | no | How it attaches, in words, such as `replaces a closing vowel`. |
521
525
  | `data.affixes[].replaces` | `vowel`, or the letters, such as `a` | no | What it takes the place of at the close of the stem: `vowel` for any closing vowel, or the letters it replaces; added to the whole stem where absent. |
526
+ | `data.affixes[].attachesTo` | a list of word classes, such as `[n, adj]` | no | The word classes it attaches to, by their base; every class where absent. A suffix stating `replaces` derives forms of these classes' words alone. |
522
527
  | `data.affixes[].lengthens` | `true` or `false` | no | Whether the stem's last vowel lengthens before the affix; `false` where unstated. An affix that `replaces` the stem's close does not also lengthen it. |
523
528
  | `data.affixes[].front` | the affix as written, such as `-ür` | no | Its form after front vowels, where the language keeps vowel harmony. |
524
529
  | `data.affixes[].examples` | a list of strings | no | The names the affix is read from. |
525
530
  | `data.affixes[].barredAfter` | a list of sounds | no | The sounds a stem may not close on to take the affix. |
526
531
  | `data.affixes[].tones` | a tone pattern, such as `L` | no | The tone pattern the affix carries, written as a word's `tones` is. |
532
+ | `data.affixes[].native` | a list of `{ map, font?, text }` | no | The affix's writing under a logographic map, which a word whose `built` names the affix is written with. |
533
+ | `data.affixes[].native[].map` | a mapping note's `data.map.name` | yes | The map the native form is written for. |
534
+ | `data.affixes[].native[].font` | a face the map lists | no | The one face the native form is for; unstated, it is for every face the map lists, and a form stated for a face wins over it there. |
535
+ | `data.affixes[].native[].text` | the word in the script, as the map's characters | yes | The word as the script writes it, where the map's rows would write it otherwise, or as a logographic map writes it. |
527
536
  | `data.grammar.plural` | list of `{ ending, becomes }` | no | Default noun plurals, replacing the first matching literal ending in authored order. A word's explicit plural wins; no word is checked against this rule. |
528
537
  | `data.grammar.plural[].ending` | a literal ending string, which may be empty | yes | The bare suffix replaced by this rule; empty matches every noun. |
529
538
  | `data.grammar.plural[].becomes` | a literal ending string, which may be empty | yes | The bare replacement; empty removes the matching suffix. |
@@ -537,6 +546,17 @@ These fields are accepted by every note type. A field's value can still be irrel
537
546
  | `data.grammar.verbs.persons.youAll` | an ending string, empty for unchanged | yes | The ending for you all, added to the citation form or in place of its closing `replaces`. |
538
547
  | `data.grammar.verbs.persons.they` | an ending string, empty for unchanged | yes | The ending for they, added to the citation form or in place of its closing `replaces`. |
539
548
  | `data.grammar.verbs.replaces` | the closing letters every ending takes the place of | no | Letters a citation form closes on, swapped for each `persons` ending: with `then`, `lokathen` and `zor` give `lokazor`. A citation form closing otherwise takes the ending whole. With `persons` only. |
549
+ | `data.grammar.agreement` | a map — `{ classes, endings }` | no | How words of the named classes agree with a noun: a word closing on one of the `endings` also takes each other one, and each form takes the `plural` rule. Read by the mapped-run word check. |
550
+ | `data.grammar.agreement.classes` | a list of word class bases, such as `[adj, pron]` | yes | The word classes that agree, each a base of the master word classes. |
551
+ | `data.grammar.agreement.endings` | a list of at least two literal endings, such as `[os, a, on]` | yes | The singular endings an agreeing word swaps among, one for each gender; the `plural` rule gives each one's plural. A word closing on none does not agree. |
552
+ | `data.grammar.participles` | a map — `{ root, affixes }` | no | Participles on the verb root: a verb closing on a `root` ending drops it, and each named suffix attaches to what is left; a participle closing on an `agreement` ending agrees. Read by the mapped-run word check. |
553
+ | `data.grammar.participles.root` | a list of closing letters, such as `[athen, ethen]` | yes | The infinitive endings a verb's citation form drops to give its root, the longest that matches first. A verb closing on none has no participle. |
554
+ | `data.grammar.participles.affixes` | a list of suffixes of `data.affixes`, such as `[-andar, -thos]` | yes | The participle suffixes, each attaching to the root as its own `replaces` says: `vowel` or letters take the place of the root's close, and none adds it whole. |
555
+ | `data.grammar.native` | a list of `{ ending, map, font?, text }` | no | Under a logographic map, the signs a noun's plural or a verb's present form is written with after its stem's writing, one entry per ending, map and face. |
556
+ | `data.grammar.native[].ending` | one of plural, I, you, heShe, we, youAll, they | yes | The ending written: `plural` for a noun's plural, or a person of `verbs.persons` for a verb's present form. |
557
+ | `data.grammar.native[].map` | a logographic mapping note's `data.map.name` | yes | The logographic map the ending is written for. |
558
+ | `data.grammar.native[].font` | a face the map lists | no | The one face the writing is for; unstated, it is for every face the map lists, and a writing stated for a face wins over it there. |
559
+ | `data.grammar.native[].text` | the ending in the script, as the map's characters; empty writes the stem alone | yes | The signs written after the stem's writing. |
540
560
  | `data.tongues[].tag` | a tag such as `dunhari`, or `exonym:<tongue>` | yes | The tag a register row's `tongue` names: lowercase letters and digits, or a tag closing on `:<tongue>`, which declares one tag per tongue named after the colon. |
541
561
  | `data.tongues[].meaning` | a string | yes | What a name of this tongue is. |
542
562
  | `data.tongues[].language` | a language skill Address | no | The language note the tag names, where it is one. |
@@ -572,7 +592,10 @@ These fields are accepted by every note type. A field's value can still be irrel
572
592
  | `data.sounds.clusters.groups[].what` | a string, such as `a nasal and a fricative` | yes | What the clusters of the group are made of. |
573
593
  | `data.sounds.clusters.groups[].clusters` | a list of clusters | yes | The clusters, as written; a digraph counts as one consonant. |
574
594
  | `data.sounds.clusters.groups[].use` | one of common, sparing | yes | How often the group's clusters stand inside a word. |
575
- | `data.sounds.stress` | one of first syllable, penultimate or final, by weight, as marked | no | Where a word's stress falls. |
595
+ | `data.sounds.stress` | a map — `{ two, longer, mark? }` | no | Where a word's stress falls, as a rule a program reads. |
596
+ | `data.sounds.stress.two` | one of first, last | yes | The stressed syllable of a word of two syllables. |
597
+ | `data.sounds.stress.longer` | one of antepenultimate, penultimate, final | yes | The stressed syllable of a word of three or more, counted from its end. |
598
+ | `data.sounds.stress.mark` | one of acute, grave, circumflex | no | The diacritic that marks a stress the rule would not choose; it moves the stress to the syllable it sits on. |
576
599
  | `data.sounds.finals` | list of `{ final, like }` | no | The syllable finals, for a language whose syllables are parsed by them. |
577
600
  | `data.sounds.finals[].final` | a final as written, such as `ang` | yes | The final. |
578
601
  | `data.sounds.finals[].like` | a string | yes | What it sounds like. |
@@ -684,6 +707,9 @@ These fields are accepted by every note type. A field's value can still be irrel
684
707
  | `data.naming.nearName.examples` | list of `{ near, given }` | no | Worked near names, each beside its given name. |
685
708
  | `data.naming.nearName.examples[].near` | a near name, such as `Anlâ` | yes | The near name. |
686
709
  | `data.naming.nearName.examples[].given` | a given name | yes | The given name it is the near name of. |
710
+ | `data.script.fonts` | list of installed faces' slugs | yes | The faces the script is written in, by the slug `font=` names them by. A face belongs to one script. |
711
+ | `data.script.emphasis` | `rubric` or `overline` | yes | How the script marks a stressed word: `rubric` sets it in red, `overline` draws a line above it. It sets `*…*` and `**…**` inside a run in one of its faces, unless the run's language states its own `emphasis`. |
712
+ | `data.script.strongEmphasis` | `rubric` or `overline` | no | The convention `**…**` takes instead of `emphasis`'s. |
687
713
 
688
714
  **System mappings**
689
715
 
@@ -965,18 +991,26 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
965
991
 
966
992
  ### doc
967
993
 
968
- **Subtypes:** `rules`, `userguide`, `reference`, `howto`, `concept`, `settingguide`.
994
+ **Subtypes:** `rules`, `userguide`, `reference`, `howto`, `concept`, `settingguide`, `post`.
969
995
 
970
- | Field | Shape | Meaning |
971
- | -------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
972
- | `data.culture` | an Address | The culture a setting guide introduces, as a culture lore note. Required on `settingguide`; no other subType states it. |
973
- | `data.map` | a map — `{ name, vowels?, fonts, rows }` | A mapping, which text marked `map=` with its `name` is rewritten by before it is set. See [mapping notes](format-details.md#mapping-notes). |
996
+ | Field | Shape | Meaning |
997
+ | --------------- | ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
998
+ | `data.concepts` | list of `{ id, gloss, group }` | The concepts of a core vocabulary, in the order the report lists them. See [the core vocabulary](format-details.md#the-core-vocabulary). |
999
+ | `data.date` | string | The day a post was published, as `YYYY-MM-DD`. Required on a `post`; no other subType states it. Posts are listed and fed newest first by it. |
1000
+ | `data.author` | string | Who wrote a post, as the byline prints them. A post that names none carries the site's byline, the first entry of `authors`; no other subType states it. |
1001
+ | `data.culture` | an Address | The culture a setting guide introduces, as a culture lore note. Required on `settingguide`; no other subType states it. |
1002
+ | `data.map` | a map — `{ name, logographic?, vowels?, fonts, rows }` | A mapping, which text marked `map=` with its `name` is rewritten by before it is set. See [mapping notes](format-details.md#mapping-notes). |
1003
+ | `data.metres` | list of `{ name, beats, kind }` | The metres a verse fence's `scan=` names. A fence that states one is warned at each line that cannot have its beats. See [metres](../authoring/links-and-markup.md#metre). |
974
1004
 
975
1005
  **Inner keys** — a key a field's value does not declare is an error at its own line and column.
976
1006
 
977
1007
  | Key | Shape | Required | Meaning |
978
1008
  | -------------------------------- | ---------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1009
+ | `data.concepts[].id` | lowercase letters, digits and `-` | yes | The concept's id, which a word's `concept` names. Unique in the package. |
1010
+ | `data.concepts[].gloss` | a short gloss, such as `a smell; a scent` | yes | What the concept means, in brief. |
1011
+ | `data.concepts[].group` | a group name, such as `senses` | yes | The group the report lists the concept under. |
979
1012
  | `data.map.name` | string | yes | What `map=` names the map by: lowercase letters, digits and `-`, unique in the package. |
1013
+ | `data.map.logographic` | `true` | no | The script writes meanings: a mapped run's words are written by the language's lexicon alone, and the rows write only the text between them. |
980
1014
  | `data.map.vowels` | string | no | The characters a row's `before: vowel` reads as vowels; any other letter is a consonant. |
981
1015
  | `data.map.rows` | list of `[from, to]` or `{ from, to, before?, at? }` | yes | The rewrites, each `[from, to]` or `{ from, to, before?, at? }`: `before` is `vowel` or `consonant`, `at` is `start` or `end`. The longest `from` wins, and a character no row matches passes through. |
982
1016
  | `data.map.rows[].from` | a string of one or more characters | yes | The one or more characters the row matches. |
@@ -990,6 +1024,9 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
990
1024
  | `data.map.fonts[].rows[].to` | a string, which may be empty | yes | What the row writes in their place; empty to drop them. |
991
1025
  | `data.map.fonts[].rows[].before` | string | no | `vowel` or `consonant`: what must follow the match for the row to apply. |
992
1026
  | `data.map.fonts[].rows[].at` | string | no | `start` or `end`: where the match must sit for the row to apply. |
1027
+ | `data.metres[].name` | string | yes | What a verse fence's `scan=` names the metre by: lowercase letters, digits and `-`, unique in the package. |
1028
+ | `data.metres[].beats` | a whole number above zero | yes | The beats of one line. |
1029
+ | `data.metres[].kind` | one of accentual | yes | How the beats are counted: `accentual`, one beat for each stressed syllable the language's stress rule and the beat convention give. |
993
1030
 
994
1031
  ### macro
995
1032