@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.
- package/CHANGELOG.md +84 -0
- package/README.md +3 -2
- package/assets/preview/gitea.ini +12 -7
- package/assets/styles/content-base.css +293 -24
- package/bin/content-commands.mjs +370 -213
- package/bin/package-build-preview.mjs +2 -2
- package/bin/package-build.mjs +3 -2
- package/ci/check-banners.mjs +7 -7
- package/config.mjs +21 -6
- package/content-config.mjs +199 -80
- package/docs/api.md +110 -89
- package/docs/authoring/links-and-markup.md +469 -97
- package/docs/commands.md +259 -78
- package/docs/configuration.md +211 -103
- package/docs/content-format.md +4 -4
- package/docs/diagnostics.md +44 -2
- package/docs/getting-started.md +1 -1
- package/docs/guides/icons.md +1 -1
- package/docs/guides/module-project.md +5 -8
- package/docs/guides/release-and-deploy.md +2 -2
- package/docs/guides/site.md +112 -23
- package/docs/guides/system-project.md +1 -1
- package/docs/guides/writing-in-invented-scripts.md +1247 -0
- package/docs/index.md +1 -0
- package/docs/project-setup.md +28 -30
- package/docs/reference/format-details.md +677 -319
- package/docs/reference/note-types.md +47 -10
- package/docs/reference/theme-pages.md +178 -108
- package/docs/source-preview.md +16 -2
- package/engine/anchors.mjs +2 -2
- package/engine/asset-shipping.mjs +22 -10
- package/engine/base-compiler.mjs +62 -104
- package/engine/changelog-lint.mjs +1 -1
- package/engine/code-fences.mjs +3 -3
- package/engine/content-address.mjs +1 -1
- package/engine/content-alerts.mjs +8 -4
- package/engine/content-blocks.mjs +29 -14
- package/engine/content-embeds.mjs +1 -1
- package/engine/content-expand.mjs +376 -0
- package/engine/content-figures.mjs +18 -11
- package/engine/content-format.yaml +8 -0
- package/engine/content-glyphs.mjs +213 -0
- package/engine/content-images.mjs +6 -7
- package/engine/content-index.mjs +1 -1
- package/engine/content-links.mjs +3 -3
- package/engine/content-lint.mjs +1 -1
- package/engine/content-render.mjs +453 -0
- package/engine/content-scripts.mjs +376 -43
- package/engine/content-spans.mjs +6 -3
- package/engine/content-styles.mjs +91 -0
- package/engine/content-symbols.mjs +186 -0
- package/engine/content-verse.mjs +738 -0
- package/engine/core-report.mjs +169 -0
- package/engine/core-vocabulary.mjs +208 -0
- package/engine/dictionary-html.mjs +119 -0
- package/engine/dictionary-rows.mjs +15 -4
- package/engine/field-reference.mjs +5 -5
- package/engine/first-use.mjs +17 -27
- package/engine/frontmatter-lint.mjs +1 -1
- package/engine/heading-attributes.mjs +89 -0
- package/engine/helpers.mjs +61 -101
- package/engine/homepage.mjs +17 -29
- package/engine/html-minify.mjs +70 -0
- package/engine/index.mjs +8 -5
- package/engine/key-case-collisions.mjs +136 -0
- package/engine/language-data.mjs +203 -6
- package/engine/language-rows.mjs +8 -2
- package/engine/language-terms.mjs +186 -16
- package/engine/language-words.mjs +12 -0
- package/engine/logographic.mjs +255 -0
- package/engine/map-lexicon.mjs +262 -47
- package/engine/map-places.mjs +5 -4
- package/engine/markdown-expressions.mjs +0 -2
- package/engine/markdownlint-run.mjs +9 -3
- package/engine/markup-validation.mjs +21 -0
- package/engine/metre-declaration.mjs +134 -0
- package/engine/names.mjs +36 -9
- package/engine/note-matter.mjs +66 -0
- package/engine/note-vocabulary.mjs +187 -3
- package/engine/pdf-build.mjs +69 -133
- package/engine/pdf-render.mjs +205 -58
- package/engine/post-fields.mjs +157 -0
- package/engine/preview-index.mjs +130 -0
- package/engine/preview-source.mjs +450 -0
- package/engine/project-init.mjs +5 -12
- package/engine/prose-config.mjs +3 -3
- package/engine/read-stdin.mjs +29 -0
- package/engine/run-rows.mjs +2 -2
- package/engine/run-words.mjs +6 -112
- package/engine/script-emphasis-terms.mjs +38 -0
- package/engine/script-emphasis.mjs +295 -0
- package/engine/script-font-delivery.mjs +4 -4
- package/engine/site-build.mjs +260 -315
- package/engine/site-config.mjs +26 -238
- package/engine/site-files.mjs +175 -0
- package/engine/site-index.mjs +9 -4
- package/engine/site-preview.mjs +52 -525
- package/engine/site-render.mjs +593 -0
- package/engine/site-root.mjs +22 -13
- package/engine/site-search.mjs +161 -0
- package/engine/site-serve.mjs +273 -0
- package/engine/site-theme-banner.mjs +154 -0
- package/engine/site-theme-urls.mjs +125 -0
- package/engine/site-theme.mjs +926 -0
- package/engine/sql-tables.mjs +20 -3
- package/engine/text-maps.mjs +57 -10
- package/engine/typographer.mjs +248 -0
- package/engine/verse-metre.mjs +357 -0
- package/engine/wikilink-syntax.mjs +29 -47
- package/engine/wikilinks.mjs +758 -279
- package/engine/word-forms.mjs +364 -0
- package/engine/word-rows.mjs +12 -2
- package/engine/word-terms.mjs +38 -4
- package/manifest.mjs +3 -4
- package/package.json +11 -8
- package/{hugo-theme → site-theme}/data/banners.yaml +6 -10
- package/site-theme/layouts/base.hbs +31 -0
- package/site-theme/layouts/blog-list.hbs +30 -0
- package/site-theme/layouts/blog-post.hbs +40 -0
- package/site-theme/layouts/home.hbs +35 -0
- package/site-theme/layouts/list.hbs +20 -0
- package/site-theme/layouts/not-found.hbs +31 -0
- package/site-theme/layouts/page.hbs +7 -0
- package/site-theme/partials/copy-buttons.hbs +37 -0
- package/site-theme/partials/draft-notice.hbs +5 -0
- package/site-theme/partials/exturl.hbs +2 -0
- package/{hugo-theme/layouts/partials/footer.html → site-theme/partials/footer.hbs} +10 -7
- package/site-theme/partials/header.hbs +44 -0
- package/site-theme/partials/hero-banner.hbs +11 -0
- package/site-theme/partials/infobox-entry.hbs +2 -0
- package/site-theme/partials/infobox-section.hbs +31 -0
- package/site-theme/partials/infobox-value.hbs +2 -0
- package/site-theme/partials/infobox.hbs +18 -0
- package/site-theme/partials/list-members.hbs +9 -0
- package/site-theme/partials/nav-links.hbs +5 -0
- package/site-theme/partials/page-body.hbs +48 -0
- package/site-theme/partials/page-list.hbs +14 -0
- package/site-theme/partials/related.hbs +24 -0
- package/site-theme/partials/search-meta.hbs +6 -0
- package/site-theme/partials/search-names.hbs +2 -0
- package/site-theme/partials/search.hbs +52 -0
- package/site-theme/partials/tags.hbs +4 -0
- package/site-theme/partials/toc.hbs +7 -0
- package/{hugo-theme → site-theme}/static/css/style.css +106 -14
- package/stage.mjs +1 -2
- package/types/config.d.mts +8 -4
- package/types/content-config.d.mts +15 -15
- package/types/engine/asset-shipping.d.mts +5 -2
- package/types/engine/base-compiler.d.mts +20 -2
- package/types/engine/code-fences.d.mts +3 -3
- package/types/engine/content-address.d.mts +1 -1
- package/types/engine/content-alerts.d.mts +8 -2
- package/types/engine/content-blocks.d.mts +11 -4
- package/types/engine/content-expand.d.mts +288 -0
- package/types/engine/content-figures.d.mts +11 -3
- package/types/engine/content-glyphs.d.mts +85 -0
- package/types/engine/content-images.d.mts +6 -7
- package/types/engine/content-links.d.mts +1 -1
- package/types/engine/content-render.d.mts +199 -0
- package/types/engine/content-scripts.d.mts +70 -4
- package/types/engine/content-spans.d.mts +1 -1
- package/types/engine/content-styles.d.mts +33 -0
- package/types/engine/content-symbols.d.mts +35 -0
- package/types/engine/content-verse.d.mts +240 -0
- package/types/engine/core-report.d.mts +45 -0
- package/types/engine/core-vocabulary.d.mts +53 -0
- package/types/engine/dictionary-html.d.mts +8 -0
- package/types/engine/dictionary-rows.d.mts +10 -0
- package/types/engine/field-reference.d.mts +2 -2
- package/types/engine/heading-attributes.d.mts +20 -0
- package/types/engine/helpers.d.mts +3 -10
- package/types/engine/homepage.d.mts +11 -24
- package/types/engine/html-minify.d.mts +9 -0
- package/types/engine/index.d.mts +2 -1
- package/types/engine/key-case-collisions.d.mts +28 -0
- package/types/engine/language-data.d.mts +0 -2
- package/types/engine/language-terms.d.mts +24 -2
- package/types/engine/logographic.d.mts +45 -0
- package/types/engine/map-lexicon.d.mts +66 -13
- package/types/engine/map-places.d.mts +8 -0
- package/types/engine/markdown-expressions.d.mts +0 -2
- package/types/engine/metre-declaration.d.mts +39 -0
- package/types/engine/names.d.mts +34 -3
- package/types/engine/note-matter.d.mts +48 -0
- package/types/engine/pdf-render.d.mts +6 -2
- package/types/engine/post-fields.d.mts +44 -0
- package/types/engine/preview-index.d.mts +72 -0
- package/types/engine/preview-source.d.mts +51 -0
- package/types/engine/read-stdin.d.mts +11 -0
- package/types/engine/run-rows.d.mts +2 -2
- package/types/engine/run-words.d.mts +0 -15
- package/types/engine/script-emphasis-terms.d.mts +21 -0
- package/types/engine/script-emphasis.d.mts +84 -0
- package/types/engine/script-font-delivery.d.mts +4 -4
- package/types/engine/site-build.d.mts +71 -113
- package/types/engine/site-config.d.mts +14 -134
- package/types/engine/site-files.d.mts +73 -0
- package/types/engine/site-index.d.mts +11 -3
- package/types/engine/site-preview.d.mts +15 -19
- package/types/engine/site-render.d.mts +171 -0
- package/types/engine/site-root.d.mts +12 -4
- package/types/engine/site-search.d.mts +54 -0
- package/types/engine/site-serve.d.mts +44 -0
- package/types/engine/site-theme-banner.d.mts +51 -0
- package/types/engine/site-theme-urls.d.mts +60 -0
- package/types/engine/site-theme.d.mts +127 -0
- package/types/engine/sql-tables.d.mts +4 -1
- package/types/engine/text-maps.d.mts +17 -3
- package/types/engine/typographer.d.mts +11 -0
- package/types/engine/verse-metre.d.mts +131 -0
- package/types/engine/wikilink-syntax.d.mts +30 -48
- package/types/engine/wikilinks.d.mts +330 -14
- package/types/engine/word-forms.d.mts +83 -0
- package/types/manifest.d.mts +3 -4
- package/types/stage.d.mts +1 -2
- package/types/vendor/markdownlint.d.mts +8 -0
- package/vendor/markdownlint.mjs +20388 -0
- package/engine/content-poetry.mjs +0 -240
- package/engine/web-wikilinks.mjs +0 -594
- package/hugo-theme/layouts/404.html +0 -85
- package/hugo-theme/layouts/_default/baseof.html +0 -67
- package/hugo-theme/layouts/_default/list.html +0 -139
- package/hugo-theme/layouts/_default/single.html +0 -4
- package/hugo-theme/layouts/blog/list.html +0 -54
- package/hugo-theme/layouts/blog-post/single.html +0 -36
- package/hugo-theme/layouts/index.html +0 -75
- package/hugo-theme/layouts/partials/banner-url.html +0 -141
- package/hugo-theme/layouts/partials/cdn-url.html +0 -36
- package/hugo-theme/layouts/partials/dictionary-lists.html +0 -58
- package/hugo-theme/layouts/partials/draft-notice.html +0 -41
- package/hugo-theme/layouts/partials/draft-state.html +0 -26
- package/hugo-theme/layouts/partials/header.html +0 -35
- package/hugo-theme/layouts/partials/hero-banner.html +0 -85
- package/hugo-theme/layouts/partials/infobox/entry.html +0 -18
- package/hugo-theme/layouts/partials/infobox/items.html +0 -26
- package/hugo-theme/layouts/partials/infobox/section.html +0 -56
- package/hugo-theme/layouts/partials/infobox/value.html +0 -43
- package/hugo-theme/layouts/partials/infobox.html +0 -57
- package/hugo-theme/layouts/partials/page-body.html +0 -152
- package/hugo-theme/layouts/partials/related.html +0 -138
- package/hugo-theme/layouts/partials/search.html +0 -84
- package/hugo-theme/layouts/partials/site-url.html +0 -32
- package/hugo-theme/layouts/partials/tags.html +0 -30
- package/hugo-theme/layouts/partials/toc.html +0 -28
- package/hugo-theme/layouts/partials/warn-missing-banner.html +0 -3
- package/hugo-theme/layouts/shortcodes/cartouche.html +0 -64
- package/hugo-theme/layouts/shortcodes/exturl.html +0 -12
- package/hugo-theme/layouts/shortcodes/glyph.html +0 -43
- package/hugo-theme/layouts/shortcodes/pagelist.html +0 -63
- package/hugo-theme/theme.toml +0 -11
- package/types/engine/content-poetry.d.mts +0 -58
- package/types/engine/web-wikilinks.d.mts +0 -107
- /package/{hugo-theme → site-theme}/data/banner-kinds.yaml +0 -0
- /package/{hugo-theme → site-theme}/static/css/sohl-icons.css +0 -0
- /package/{hugo-theme → site-theme}/static/fonts/game-icons-kb.woff2 +0 -0
- /package/{hugo-theme → site-theme}/static/img/banners/takheperu-hieroglyphs.svg +0 -0
- /package/{hugo-theme → site-theme}/static/img/cartouches/takheperu.svg +0 -0
- /package/{hugo-theme → site-theme}/static/js/inline-spoilers.js +0 -0
|
@@ -492,8 +492,7 @@ The event fell on {{dateformat "vrcal" "300.25"}}.
|
|
|
492
492
|
The comparison helpers `gt`, `gte`, `lt`, and `lte` take two numbers; `eq`
|
|
493
493
|
compares two values. `and`, `or`, and `not` combine Boolean results. Nested
|
|
494
494
|
helpers use Handlebars parentheses. These expressions are replaced on web,
|
|
495
|
-
Foundry, and book pages. Code spans and fences remain literal
|
|
496
|
-
shortcodes such as `{{< glyph slug="bes" >}}`. Prefix `\{{` to show an
|
|
495
|
+
Foundry, and book pages. Code spans and fences remain literal. Prefix `\{{` to show an
|
|
497
496
|
expression literally in prose. A missing property, unresolved
|
|
498
497
|
calendar, or invalid date produces a located build error.
|
|
499
498
|
|
|
@@ -1910,7 +1909,15 @@ authored labels supply none.
|
|
|
1910
1909
|
|
|
1911
1910
|
1. A `.name` span whose whole text matches an indexed `name.full` or
|
|
1912
1911
|
`name.aliases` should be a link. Use `[[place-arden|Arden Vale]]` or
|
|
1913
|
-
`[[place-arden|]]` to introduce that note.
|
|
1912
|
+
`[[place-arden|]]` to introduce that note. A span with a `data-type`
|
|
1913
|
+
matches only notes of that type, and only notes of that subtype when it
|
|
1914
|
+
names one; an untyped span matches a note of any type. One name can
|
|
1915
|
+
belong to two things, so
|
|
1916
|
+
`[Theinuvael]{.name data-type="affiliation/lineage"}` draws no warning
|
|
1917
|
+
when _Theinuvael_ is an alias of a place note, while
|
|
1918
|
+
`[Theinuvael]{.name data-type="place"}` and `[Theinuvael]{.name}` should
|
|
1919
|
+
be links to it. The same match decides a span's identity for the rules
|
|
1920
|
+
below and for the unwritten-name advisory.
|
|
1914
1921
|
2. Mark or link each name at most once per note. An indexed full name and its
|
|
1915
1922
|
declared aliases share one identity, including across different heading
|
|
1916
1923
|
anchors. Other labels use their whole text as their identity: different
|
|
@@ -1921,10 +1928,9 @@ authored labels supply none.
|
|
|
1921
1928
|
note under any label. Possessives and regular plurals count as uses; other
|
|
1922
1929
|
indexed forms can be declared aliases.
|
|
1923
1930
|
|
|
1924
|
-
Bold is emphasis
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
receives no such advisory. Unknown bold phrases supply no names.
|
|
1931
|
+
Bold is emphasis and is never read as a name. A bold label such as
|
|
1932
|
+
`**Strength**:` is ordinary emphasis even when its text matches an indexed
|
|
1933
|
+
full name or alias, and it supplies no name occurrence or introduction.
|
|
1928
1934
|
|
|
1929
1935
|
Inline Markdown remains active inside name spans, and name spans remain
|
|
1930
1936
|
valid inside emphasis:
|
|
@@ -1968,7 +1974,8 @@ This is derived metadata, not frontmatter. Documentation mirrors and assets
|
|
|
1968
1974
|
do not duplicate a note's occurrences. The [`names` relation](#content-tables)
|
|
1969
1975
|
flattens these entries with their containing NOTE Address.
|
|
1970
1976
|
|
|
1971
|
-
Lint groups names without an indexed full-name or alias match
|
|
1977
|
+
Lint groups names without an indexed full-name or alias match, among notes
|
|
1978
|
+
of the span's type and subtype when it supplies them, by supplied
|
|
1972
1979
|
classification and lists all their source uses. It also groups conflicting
|
|
1973
1980
|
annotations of the same visible name. Untyped uses do not conflict. A bare
|
|
1974
1981
|
type and its subtype agree; different supplied types or different supplied
|
|
@@ -1978,7 +1985,7 @@ exit status. Supplied-value errors prevent publication and compilation.
|
|
|
1978
1985
|
|
|
1979
1986
|
#### Text marked with a language, a font or a map
|
|
1980
1987
|
|
|
1981
|
-
`lang=`, `font=` and `map=` on a span, a generic div or a
|
|
1988
|
+
`lang=`, `font=` and `map=` on a span, a generic div or a verse fence are read
|
|
1982
1989
|
by the build and never written through as ordinary attributes. Each is
|
|
1983
1990
|
optional, and a run inside a div or a fence inherits the keys the div or fence
|
|
1984
1991
|
states, its own keys overriding them. On a named block the three keys are
|
|
@@ -2007,7 +2014,8 @@ generic families are not checked. `input`, `layout` and `encoding` in
|
|
|
2007
2014
|
Text marked with `font=` or `map=`, or with a declared language, is plain: a
|
|
2008
2015
|
span or a verse holds no emphasis, link, image, footnote, wikilink, code or
|
|
2009
2016
|
HTML, and no span but a marked one inside a div or a fence; a div holds
|
|
2010
|
-
paragraphs and line breaks only.
|
|
2017
|
+
paragraphs and line breaks only. Text set in a face takes `*…*` and `**…**`,
|
|
2018
|
+
set by its [emphasis convention](#script-notes-and-emphasis). The text is read as written, so `[`, `]`, `"`,
|
|
2011
2019
|
`<<`, `>>`, `!` and `@#$%^&` are characters, and a bracket pair is markup only
|
|
2012
2020
|
when `(`, `{` or a second `[` makes it a link, a span or a wikilink. Text marked
|
|
2013
2021
|
with a real language's tag alone keeps its Markdown. See
|
|
@@ -2015,7 +2023,7 @@ with a real language's tag alone keeps its Markdown. See
|
|
|
2015
2023
|
|
|
2016
2024
|
Each own-note metadata record carries `runs` in source order, an empty array
|
|
2017
2025
|
when the body marks nothing. Every entry has exactly `kind` (`span`, `block` or
|
|
2018
|
-
`
|
|
2026
|
+
`verse`), `lang`, `tag`, `font`, `map`, `line` and `column`: `lang`, `font` and
|
|
2019
2027
|
`map` as written, its own or inherited, `tag` the BCP 47 tag `lang` resolves
|
|
2020
2028
|
to, each `null` when absent, and the position of the span's `[`, the div's
|
|
2021
2029
|
`:::` or the fence's opening. Every value is a string or a number and none is a
|
|
@@ -2046,12 +2054,13 @@ data:
|
|
|
2046
2054
|
- { from: y, to: "\U000F0246", before: consonant }
|
|
2047
2055
|
```
|
|
2048
2056
|
|
|
2049
|
-
| Key
|
|
2050
|
-
|
|
|
2051
|
-
| `name`
|
|
2052
|
-
| `
|
|
2053
|
-
| `
|
|
2054
|
-
| `
|
|
2057
|
+
| Key | Shape | Meaning |
|
|
2058
|
+
| ------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
2059
|
+
| `name` | string, required | What `map=` names it by: lowercase letters, digits and `-`, unique in the index |
|
|
2060
|
+
| `logographic` | `true` | The script writes meanings; see [a logographic map](#a-logographic-map) |
|
|
2061
|
+
| `vowels` | string | The characters `before: vowel` reads as vowels |
|
|
2062
|
+
| `fonts` | list of `{ font, rows? }`, required, at least one | The faces the map is drawn in, by slug, each with any rows of its own |
|
|
2063
|
+
| `rows` | list of `[from, to]` or `{ from, to, before?, at? }` | The shared rewrites, in authored order |
|
|
2055
2064
|
|
|
2056
2065
|
**A face's own rows come first.** A run in a face tries that face's `rows`,
|
|
2057
2066
|
the longest match among them, and only where none matches the shared `rows`; a
|
|
@@ -2108,6 +2117,8 @@ The map's own check reports the rest, each at its key:
|
|
|
2108
2117
|
|
|
2109
2118
|
> `` `data.map.fonts[0].font` is `mono`, a generic family; a map lists the faces it is drawn in ``
|
|
2110
2119
|
|
|
2120
|
+
> `` `data.map.rows[2]` matches `z`, a letter, and the rows of a logographic map write only the text between words ``
|
|
2121
|
+
|
|
2111
2122
|
The lint checks the listed faces against the installed `@heroiclands/fonts`,
|
|
2112
2123
|
each at the entry or the row at fault. Every listed face draws every code point
|
|
2113
2124
|
its own rows write, every code point the shared rows it can reach write (a
|
|
@@ -2184,10 +2195,13 @@ word's start:
|
|
|
2184
2195
|
lists under a `tongue` other than `translation`, or a form one rule derives from a lexicon form —
|
|
2185
2196
|
the `data.grammar.plural` plural of a noun or its own `plural`, a verb's form
|
|
2186
2197
|
with one ending of `data.grammar.verbs.persons` (in place of a closing
|
|
2187
|
-
`data.grammar.verbs.replaces` where one is stated),
|
|
2188
|
-
stating `replaces`
|
|
2198
|
+
`data.grammar.verbs.replaces` where one is stated), a suffix of `data.affixes`
|
|
2199
|
+
stating `replaces` on a word of a class its `attachesTo` names, or on any word
|
|
2200
|
+
where it names none (`vowel` takes the place of a closing `a`, `e`, `i`, `o` or
|
|
2189
2201
|
`u`, accented or not; letters take the place of those letters; a stem closing
|
|
2190
|
-
otherwise takes the suffix whole)
|
|
2202
|
+
otherwise takes the suffix whole), an agreeing form `data.grammar.agreement`
|
|
2203
|
+
gives a word of one of its `classes`, or a participle `data.grammar.participles`
|
|
2204
|
+
gives a verb (see [optional noun and verb forms](#optional-noun-and-verb-forms)). A compound not known whole is checked part by
|
|
2191
2205
|
part at its hyphens and en dashes. Any other word is an error at its first
|
|
2192
2206
|
character, once per run; see
|
|
2193
2207
|
[a mapped run's words](../authoring/links-and-markup.md#a-mapped-runs-words):
|
|
@@ -2219,6 +2233,203 @@ every word with its native form, through the same code as the build: see
|
|
|
2219
2233
|
[`transliterate`](../commands.md#package-build-transliterate-map-text) and
|
|
2220
2234
|
[`lexicon`](../commands.md#package-build-lexicon-language).
|
|
2221
2235
|
|
|
2236
|
+
#### Metres
|
|
2237
|
+
|
|
2238
|
+
A verse fence that states `scan=` is counted against a metre declared in a
|
|
2239
|
+
`doc` note's `data.metres`, each entry `{ name, beats, kind }`. `name` is
|
|
2240
|
+
lowercase letters, digits and `-`, unique in the package, and a name declared
|
|
2241
|
+
twice is an error at the second. `beats` is a whole number above zero. `kind` is
|
|
2242
|
+
`accentual`: a beat falls on a stressed syllable, and no syllable's length is
|
|
2243
|
+
counted.
|
|
2244
|
+
|
|
2245
|
+
The fence states `lang=` with a language whose `note` names a language note
|
|
2246
|
+
stating `data.sounds.stress` (see [a language's register, sounds and
|
|
2247
|
+
history](#a-languages-register-sounds-and-history)). A word has one beat on its
|
|
2248
|
+
stressed syllable when it has two or more syllables; a one-syllable word has a
|
|
2249
|
+
beat when the `class` base of its lexicon entry is `n`, `v`, `adj`, `num` or
|
|
2250
|
+
`name`, and none when it is any other base; a one-syllable word the lexicon
|
|
2251
|
+
does not hold is counted as a content word; a word whose entries differ in
|
|
2252
|
+
class is a beat that may be left out; and a word of four or more syllables
|
|
2253
|
+
whose stress is not on its first may take a second beat there. A line scans when
|
|
2254
|
+
its count can be the metre's.
|
|
2255
|
+
|
|
2256
|
+
| Finding | Severity |
|
|
2257
|
+
| ----------------------------------------------------------------------------------------------- | -------- |
|
|
2258
|
+
| A line whose beats cannot be the metre's, at the line | warning |
|
|
2259
|
+
| A `scan=` no `data.metres` entry names, at the value | error |
|
|
2260
|
+
| A `scan=` on a fence with no `lang=`, at the key | error |
|
|
2261
|
+
| A `scan=` on a fence whose language states no stress rule or names no language note, at `lang=` | error |
|
|
2262
|
+
| A `scan=` on a verse in columns, at the key | error |
|
|
2263
|
+
|
|
2264
|
+
> ``this line has 4 beats (5 with secondary beats); the metre `hexameter` has 6``
|
|
2265
|
+
|
|
2266
|
+
The count is an author-side check. The rendered fence carries `data-scan` with
|
|
2267
|
+
the metre's name and nothing a reader sees.
|
|
2268
|
+
|
|
2269
|
+
#### A logographic map
|
|
2270
|
+
|
|
2271
|
+
A map stating `logographic: true` writes meanings, so its rows spell no word.
|
|
2272
|
+
Every word of a run under it is written from the run language's lexicon, and
|
|
2273
|
+
the rows write only the text between words: whitespace, points and any other
|
|
2274
|
+
text holding no letter. A word holds at least one letter; a run of digits is
|
|
2275
|
+
text between words. A word is matched case folded, NFC, with `’` read as `'`,
|
|
2276
|
+
and written by the first of these that gives a writing:
|
|
2277
|
+
|
|
2278
|
+
1. **The entries of its form.** Each entry whose `form`, folded, is the word,
|
|
2279
|
+
and failing that each whose folded `form` with its joining hyphens taken
|
|
2280
|
+
off is the word (`Gar-` for `gar`). An entry is written by its own `native`
|
|
2281
|
+
for the map, the one for the run's face where it states one, else the one
|
|
2282
|
+
for no face; else by its `built` pieces' writings joined in order.
|
|
2283
|
+
2. **A derived form.** A noun's plural (its own `plural`, else the
|
|
2284
|
+
`data.grammar.plural` rule) and a verb's present form for one person of
|
|
2285
|
+
`data.grammar.verbs.persons` are written by the stem's entry's writing,
|
|
2286
|
+
followed by the `text` of the `data.grammar.native` entry for that ending.
|
|
2287
|
+
Other derived forms (a replacing suffix, an agreeing form, a participle)
|
|
2288
|
+
have no writing of their own here; they are coined as words, or written in
|
|
2289
|
+
signs.
|
|
2290
|
+
3. **Its hyphenated parts.** A word holding a hyphen or an en dash that the
|
|
2291
|
+
steps above do not write is written by each part in turn, each by steps 1
|
|
2292
|
+
and 2; the hyphen writes nothing.
|
|
2293
|
+
|
|
2294
|
+
A `built` piece is a word of the lexicon written exactly as the piece, else an
|
|
2295
|
+
affix of `data.affixes` whose `form` or `front` is the piece, else either one
|
|
2296
|
+
with joining hyphens taken off; a word piece is written by its own `native` or
|
|
2297
|
+
its own pieces, recursively, and an affix by its own `native`. A piece that
|
|
2298
|
+
reaches a word already being resolved has no writing.
|
|
2299
|
+
|
|
2300
|
+
**Ambiguity.** Where a step matches more than one entry and their writings are
|
|
2301
|
+
not all one text, or one has a writing and another none, the word has no
|
|
2302
|
+
writing and is an error naming every entry's gloss. A part matched that way
|
|
2303
|
+
makes the word ambiguous the same way, naming the part.
|
|
2304
|
+
|
|
2305
|
+
| Key | Shape | Meaning |
|
|
2306
|
+
| ------------------------------ | ------------------------------------------------------- | ------------------------------------------------------- |
|
|
2307
|
+
| `data.affixes[].native` | list of `{ map, font?, text }` | The affix's writing, for a `built` piece naming it |
|
|
2308
|
+
| `data.grammar.native` | list of `{ ending, map, font?, text }` | The signs a derived form takes after its stem's writing |
|
|
2309
|
+
| `data.grammar.native[].ending` | `plural`, `I`, `you`, `heShe`, `we`, `youAll` or `they` | The ending written |
|
|
2310
|
+
| `data.grammar.native[].text` | string, required, may be empty | The ending's signs; empty writes the stem alone |
|
|
2311
|
+
|
|
2312
|
+
```yaml
|
|
2313
|
+
affixes:
|
|
2314
|
+
- form: "-unet"
|
|
2315
|
+
gloss: "a thing made of"
|
|
2316
|
+
native:
|
|
2317
|
+
- { map: zethu, text: "\U0001EBC7" }
|
|
2318
|
+
grammar:
|
|
2319
|
+
plural:
|
|
2320
|
+
- { ending: "", becomes: "im" }
|
|
2321
|
+
verbs:
|
|
2322
|
+
persons: { I: en, you: et, heShe: "", we: enu, youAll: etu, they: ar }
|
|
2323
|
+
native:
|
|
2324
|
+
- { ending: plural, map: zethu, text: "\U0001EBE1" }
|
|
2325
|
+
- { ending: I, map: zethu, text: "\U0001EBDF" }
|
|
2326
|
+
```
|
|
2327
|
+
|
|
2328
|
+
A word with no writing, an ambiguous word, and a word in a run with no lexicon
|
|
2329
|
+
to write it from are each an error at the word, once per run:
|
|
2330
|
+
|
|
2331
|
+
> `` `zamlu` has no `zethu` writing in the `khel` lexicon, and its parts do not give one; state one, or write the word directly in signs ``
|
|
2332
|
+
|
|
2333
|
+
> `` `nelgir` stands for 2 words of the `khel` lexicon that the map `zethu` writes differently, “a god” and “god”; write the word directly in signs, choosing by its sense in `package-build lexicon khel --map zethu` ``
|
|
2334
|
+
|
|
2335
|
+
> `` `Gar-nelgir` is written from its part `nelgir`, which stands for 2 words of the `khel` lexicon that the map `zethu` writes differently, “a god” and “god”; write the word directly in signs, choosing by its sense in `package-build lexicon khel --map zethu` ``
|
|
2336
|
+
|
|
2337
|
+
> `` `halzi` has no `zethu` writing: the map `zethu` is logographic, and the run names no `lang=` whose lexicon writes it; mark the run with its language, or write the word directly in signs ``
|
|
2338
|
+
|
|
2339
|
+
> `` `halzi` has no `zethu` writing: the map `zethu` is logographic, and `tant` has no lexicon (`languages.tant.note`) to write it from; write the word directly in signs ``
|
|
2340
|
+
|
|
2341
|
+
Signs typed in the run hold no letter, so they are no word and pass through as
|
|
2342
|
+
typed. The face-coverage check reads the writings as it reads native forms; a
|
|
2343
|
+
word with no writing is reported by its own finding alone. The lexicon check
|
|
2344
|
+
and the register check apply to the run as to any mapped run.
|
|
2345
|
+
|
|
2346
|
+
Under a logographic map a word's `native` is its writing and is not compared
|
|
2347
|
+
with the rows. An affix's `native` and `data.grammar.native` are read only by
|
|
2348
|
+
a logographic map, so an entry naming any other map is an error, as is an
|
|
2349
|
+
ending of a person where the pattern states no `persons`. The checks of a
|
|
2350
|
+
word's `native` (an unknown map, a face the map is not for, a second entry, an
|
|
2351
|
+
undrawn code point) apply to both, a second entry being one for the same
|
|
2352
|
+
ending, map and face:
|
|
2353
|
+
|
|
2354
|
+
> `` `data.affixes[0].native[0]` names the map `roman`, which is not logographic; an affix is written by a native form only under a logographic map ``
|
|
2355
|
+
|
|
2356
|
+
> `` `data.grammar.native[0]` names the map `roman`, which is not logographic; an ending is written by a native form only under a logographic map ``
|
|
2357
|
+
|
|
2358
|
+
> `` `data.grammar.native[2]` states a second native form of the ending `plural` for the map `zethu`; the first is `data.grammar.native[1]` ``
|
|
2359
|
+
|
|
2360
|
+
> `` `data.grammar.native[3]` writes the ending `they`, and `data.grammar.verbs` states no `persons` ``
|
|
2361
|
+
|
|
2362
|
+
Affix and ending writings are not rows of the `natives` relation, which holds
|
|
2363
|
+
the words' native forms; `package-build lexicon` resolves them.
|
|
2364
|
+
|
|
2365
|
+
#### Script notes and emphasis
|
|
2366
|
+
|
|
2367
|
+
A `skill` note of `subType: script` states the faces its script is written in
|
|
2368
|
+
and how the script marks a stressed word, in `data.script`:
|
|
2369
|
+
|
|
2370
|
+
```yaml
|
|
2371
|
+
data:
|
|
2372
|
+
script:
|
|
2373
|
+
fonts: [qalezu-hand]
|
|
2374
|
+
emphasis: overline
|
|
2375
|
+
strongEmphasis: rubric
|
|
2376
|
+
```
|
|
2377
|
+
|
|
2378
|
+
- **`fonts`** lists installed faces by the slug `font=` names them by, at least
|
|
2379
|
+
one. A face belongs to one script.
|
|
2380
|
+
- **`emphasis`** is `rubric` or `overline`, and sets both `*…*` and `**…**`
|
|
2381
|
+
(or `_…_` and `__…__`) inside a run in one of the faces.
|
|
2382
|
+
- **`strongEmphasis`**, optional, is `rubric` or `overline`, and sets `**…**`
|
|
2383
|
+
alone.
|
|
2384
|
+
|
|
2385
|
+
A `skill` note of `subType: language` may state `data.emphasis`: `words`,
|
|
2386
|
+
`rubric` or `overline`. It overrides the script's convention in every run of the
|
|
2387
|
+
language. `words` means the language marks emphasis with a word, so `*…*` or
|
|
2388
|
+
`**…**` in a run of the language is an error at the emphasis.
|
|
2389
|
+
|
|
2390
|
+
Inside a run in a face, `_…_` is emphasis equal to `*…*`, and `__…__` equal to
|
|
2391
|
+
`**…**`; Markdown reads them as the same emphasis, and a formatter writes the
|
|
2392
|
+
underscore form. A strikethrough is an error.
|
|
2393
|
+
|
|
2394
|
+
A run's convention is its `lang=` language's `data.emphasis`, read through
|
|
2395
|
+
[`languages.<name>.note`](../configuration.md#languages); else the
|
|
2396
|
+
`data.script` of the script note listing its face; else none. Each convention
|
|
2397
|
+
renders as:
|
|
2398
|
+
|
|
2399
|
+
| Convention | Site and Foundry | Book |
|
|
2400
|
+
| ---------- | ---------------------------------------------------------------- | ----------------------------- |
|
|
2401
|
+
| `rubric` | `<em class="emph-rubric">` or `<strong class="emph-rubric">` | `#text(fill: book-rubric)[…]` |
|
|
2402
|
+
| `overline` | `<em class="emph-overline">` or `<strong class="emph-overline">` | `#overline[…]` |
|
|
2403
|
+
| none | `<em>` or `<strong>`, no class | the text alone |
|
|
2404
|
+
|
|
2405
|
+
Inside a face's run, the element keeps the face's Regular: `font-synthesis:
|
|
2406
|
+
none`, with no slant and no added weight. The two classes and the rubric's
|
|
2407
|
+
colour are described in [the theme](theme-pages.md#emphasis-in-a-script).
|
|
2408
|
+
|
|
2409
|
+
Each of these is an error at the key or the entry at fault:
|
|
2410
|
+
|
|
2411
|
+
> `` `data.script.emphasis` should be `rubric` or `overline`, but reads "rubrik". Did you mean "rubric"? ``
|
|
2412
|
+
|
|
2413
|
+
> `` `data.script` states a script's faces and emphasis, and this note's `subType` is not `script` ``
|
|
2414
|
+
|
|
2415
|
+
> `` `data.emphasis` states how a language marks emphasis, and this note's `subType` is not `language` ``
|
|
2416
|
+
|
|
2417
|
+
> `` `data.script.fonts` is empty; a script lists each face it is written in ``
|
|
2418
|
+
|
|
2419
|
+
> `` `data.script.fonts[0]` is `serif`, a generic family; a script lists the faces it is written in ``
|
|
2420
|
+
|
|
2421
|
+
> `` `data.script.fonts[1]` lists the font `semaron-kuriale` a second time; the first is `data.script.fonts[0]` ``
|
|
2422
|
+
|
|
2423
|
+
> `` `data.script.fonts[0]` is `semaron-kuriale`, which Skills/Scripts/Semaron_Carved.md also lists; a face belongs to one script ``
|
|
2424
|
+
|
|
2425
|
+
> `` `qalezu-hnad` is not a font: `data.script.fonts[1]` names an installed face; did you mean `qalezu-hand`? ``
|
|
2426
|
+
|
|
2427
|
+
In a run:
|
|
2428
|
+
|
|
2429
|
+
> ``text marked `lang=prv font=semaron-kuriale map=semaron` takes emphasis only as `*…*`, `_…_`, `**…**` or `__…__` ``
|
|
2430
|
+
|
|
2431
|
+
> `` `vyl` marks emphasis with a word, not a mark; write the word ``
|
|
2432
|
+
|
|
2222
2433
|
### Assets are types
|
|
2223
2434
|
|
|
2224
2435
|
`icon`, `image` and `audio` are types in the type vocabulary, and an address
|
|
@@ -3314,7 +3525,7 @@ inherited words are read through `language_lineage`.
|
|
|
3314
3525
|
**`affixes`** is one row per entry of `data.affixes` on every language note,
|
|
3315
3526
|
and **`fields`** one per entry of `data.fields`, in the order the note states
|
|
3316
3527
|
them. Each has `language` and `position` as `words` does, then every key of the
|
|
3317
|
-
entry as its own column: `form`, `zero`, `kind`, `given`, `where`, `gloss`, `attaches`, `replaces`, `lengthens`, `front`, `examples`, `barredAfter`
|
|
3528
|
+
entry as its own column: `form`, `zero`, `kind`, `given`, `where`, `gloss`, `attaches`, `replaces`, `attachesTo`, `lengthens`, `front`, `examples`, `barredAfter`
|
|
3318
3529
|
and `tones` for an affix, then `written`, its form as a table prints it (`∅` for a zero affix), `name` and `holds` for a field. A key an entry does not state is
|
|
3319
3530
|
`NULL`, `examples` is a list, and a language note tagged `gm` contributes no
|
|
3320
3531
|
row on a public surface. An affix's `tones` is the tone pattern it carries,
|
|
@@ -3338,7 +3549,7 @@ for the keys.
|
|
|
3338
3549
|
| `letters` | `data.sounds.letters` | `letters` (a list), `kind`, `like`, `place`, `tongue` (a list, `NULL` for every tongue) |
|
|
3339
3550
|
| `edges` | `data.sounds.edges` | `edge`, `sounds` (a list: `[any]` for every sound, empty for none) |
|
|
3340
3551
|
| `clusters` | `data.sounds.clusters` | No `position`: `max`, one row per language stating it |
|
|
3341
|
-
| `stress` | `data.sounds.stress` | No `position`: `
|
|
3552
|
+
| `stress` | `data.sounds.stress` | No `position`: `two`, `longer` and `mark` (`NULL` where unstated), one row per language stating it |
|
|
3342
3553
|
| `finals` | `data.sounds.finals` | `final`, `like` |
|
|
3343
3554
|
| `syllables` | `data.sounds.syllables` | No `position`, one row per language stating it: `onsets`, `codas`, `finals`, `doubled`, `vowelPairs`, `neverInitial` and `signature` (lists, `any` a list of one), `initialVowel` and `finalVowel` (`true` or `false`), and the harmony as `harmony_back`, `harmony_front`, `harmony_neutral`, `harmony_neutralAs` and `harmony_partners` (a list of `{ vowel, partner }`) |
|
|
3344
3555
|
| `joining` | `data.sounds.joining` | `first` and `second` (lists), `written`, `example` |
|
|
@@ -3398,14 +3609,14 @@ metadata supplies `names` in that package's SQL schema. Public queries exclude
|
|
|
3398
3609
|
GM-only owners; all/native contexts retain them. Only authored occurrences
|
|
3399
3610
|
contribute rows, so generated queries and sections add no further names.
|
|
3400
3611
|
|
|
3401
|
-
**`runs`** is one row per span, generic div and
|
|
3612
|
+
**`runs`** is one row per span, generic div and verse fence an authored note
|
|
3402
3613
|
body marks with `lang=`, `font=` or `map=`. Each row has these columns,
|
|
3403
3614
|
including on an empty relation:
|
|
3404
3615
|
|
|
3405
3616
|
| Column | SQL type | Meaning |
|
|
3406
3617
|
| -------- | --------- | -------------------------------------------------------------------------------------------- |
|
|
3407
3618
|
| `owner` | `VARCHAR` | Containing authored page's canonical NOTE Address, or `NULL` when the record has no Address. |
|
|
3408
|
-
| `kind` | `VARCHAR` | `span`, `block` or `
|
|
3619
|
+
| `kind` | `VARCHAR` | `span`, `block` or `verse`. |
|
|
3409
3620
|
| `lang` | `VARCHAR` | The language as written, its own or inherited, or `NULL`. |
|
|
3410
3621
|
| `tag` | `VARCHAR` | The BCP 47 tag `lang` resolves to, or `NULL` when it resolves to none. |
|
|
3411
3622
|
| `font` | `VARCHAR` | The font as written, its own or inherited, or `NULL`. |
|
|
@@ -3860,11 +4071,11 @@ The caption attaches to exactly the next supported block:
|
|
|
3860
4071
|
| Markdown table | `table` | Table |
|
|
3861
4072
|
| Image, Markdown or wikilink | `figure` | Figure |
|
|
3862
4073
|
| SQL fence, including backtick SQL | `table` | Table |
|
|
3863
|
-
|
|
|
4074
|
+
| Verse fence | `verse` | Poem |
|
|
3864
4075
|
| Any other code fence | `code` | Code |
|
|
3865
4076
|
| Paragraph, quote block or fenced div | `prose` | Prose |
|
|
3866
4077
|
|
|
3867
|
-
The optional `type` attribute overrides inference and accepts `figure`, `table`, `
|
|
4078
|
+
The optional `type` attribute overrides inference and accepts `figure`, `table`, `verse`, `code`, `prose`, and `example`. `type=example` uses **Example 1**, **Example 2**, and so on. It does not allow an unsupported target. A heading, list, thematic break, another caption or end of document after a caption is an error. Caption markers without separating spaces or caption text are errors too.
|
|
3868
4079
|
|
|
3869
4080
|
Identifiers are optional and must be unique within the note. Classes are unrestricted; `.border` uses the shared border style, while other classes can be styled by the medium. On a captioned table or SQL fence, `.full-width` sets the table across the page in a PDF book instead of in one column (`: Regional trade routes {.full-width}`); the other surfaces ignore it. Named attributes use `key=value`, with quoted values for text containing spaces. Use `#id` and `.class` rather than `id=` and `class=`; event-handler attributes are refused.
|
|
3870
4081
|
|
|
@@ -5870,235 +6081,261 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5870
6081
|
- combat
|
|
5871
6082
|
- combattechnique
|
|
5872
6083
|
|
|
5873
|
-
| `data` property | Values | Description
|
|
5874
|
-
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
5875
|
-
| `templatePriority` | `number` | Template priority, _null_ = not a template
|
|
5876
|
-
| `masteryLevel` | `number` | HM3 mastery level
|
|
5877
|
-
| `parentSkill` | `Address` | Parent skill this skill specializes
|
|
5878
|
-
| `names` | `{ pattern, given, <name>... }` | `language` only: how its speakers are named, for `package-build npc new` — see [name lists](#name-lists)
|
|
5879
|
-
| `names.pattern` | `string`, `string[]` or map of `gender` words to either, required | Placeholders such as `{given}`, `{given.male}` and `{clan}`, each naming a list, with literal text around them; a list states several forms, a map each gender's forms
|
|
5880
|
-
| `names.given` | map of `gender` words to lists of names, required | Given names by gender; `female` and `male` are required
|
|
5881
|
-
| `names.given.<name>` | `string[]` | The given names of one gender
|
|
5882
|
-
| `names.<name>` | `string[]` | A list the placeholder of the same name draws from
|
|
5883
|
-
| `family` | `Address` | `language` only: the parent language, naming a skill note with `subType: language`; this language reads the parent's words as its own — see [a language's words](#a-languages-words)
|
|
5884
|
-
| `abbreviation` | `string` | `language` only: the tag a dictionary prints for it, as `Prov.`; its full name where unstated — see [dictionaries and glossaries](#dictionaries-and-glossaries)
|
|
5885
|
-
| `
|
|
5886
|
-
| `grammar
|
|
5887
|
-
| `grammar.plural
|
|
5888
|
-
| `grammar.plural[].
|
|
5889
|
-
| `grammar.
|
|
5890
|
-
| `grammar.verbs
|
|
5891
|
-
| `grammar.verbs.
|
|
5892
|
-
| `grammar.verbs.persons
|
|
5893
|
-
| `grammar.verbs.persons.
|
|
5894
|
-
| `grammar.verbs.persons.
|
|
5895
|
-
| `grammar.verbs.persons.
|
|
5896
|
-
| `grammar.verbs.persons.
|
|
5897
|
-
| `grammar.verbs.persons.
|
|
5898
|
-
| `grammar.verbs.
|
|
5899
|
-
| `
|
|
5900
|
-
| `
|
|
5901
|
-
| `
|
|
5902
|
-
| `
|
|
5903
|
-
| `
|
|
5904
|
-
| `
|
|
5905
|
-
| `
|
|
5906
|
-
| `
|
|
5907
|
-
| `
|
|
5908
|
-
| `
|
|
5909
|
-
| `
|
|
5910
|
-
| `words
|
|
5911
|
-
| `words[].
|
|
5912
|
-
| `words[].
|
|
5913
|
-
| `words[].
|
|
5914
|
-
| `words[].
|
|
5915
|
-
| `words[].
|
|
5916
|
-
| `words[].
|
|
5917
|
-
| `words[].
|
|
5918
|
-
| `words[].
|
|
5919
|
-
| `words[].
|
|
5920
|
-
| `words[].
|
|
5921
|
-
| `words[].
|
|
5922
|
-
| `words[].
|
|
5923
|
-
| `words[].
|
|
5924
|
-
| `words[].
|
|
5925
|
-
| `
|
|
5926
|
-
| `
|
|
5927
|
-
| `
|
|
5928
|
-
| `
|
|
5929
|
-
| `
|
|
5930
|
-
| `
|
|
5931
|
-
| `
|
|
5932
|
-
| `
|
|
5933
|
-
| `affixes
|
|
5934
|
-
| `affixes[].
|
|
5935
|
-
| `affixes[].
|
|
5936
|
-
| `affixes[].
|
|
5937
|
-
| `affixes[].
|
|
5938
|
-
| `affixes[].
|
|
5939
|
-
| `
|
|
5940
|
-
| `
|
|
5941
|
-
| `
|
|
5942
|
-
| `
|
|
5943
|
-
| `
|
|
5944
|
-
| `
|
|
5945
|
-
| `
|
|
5946
|
-
| `
|
|
5947
|
-
| `
|
|
5948
|
-
| `
|
|
5949
|
-
| `
|
|
5950
|
-
| `
|
|
5951
|
-
| `
|
|
5952
|
-
| `
|
|
5953
|
-
| `
|
|
5954
|
-
| `
|
|
5955
|
-
| `
|
|
5956
|
-
| `
|
|
5957
|
-
| `
|
|
5958
|
-
| `
|
|
5959
|
-
| `
|
|
5960
|
-
| `
|
|
5961
|
-
| `
|
|
5962
|
-
| `
|
|
5963
|
-
| `
|
|
5964
|
-
| `
|
|
5965
|
-
| `
|
|
5966
|
-
| `
|
|
5967
|
-
| `
|
|
5968
|
-
| `
|
|
5969
|
-
| `
|
|
5970
|
-
| `
|
|
5971
|
-
| `
|
|
5972
|
-
| `sounds
|
|
5973
|
-
| `sounds.
|
|
5974
|
-
| `sounds.
|
|
5975
|
-
| `sounds.
|
|
5976
|
-
| `sounds.
|
|
5977
|
-
| `sounds.
|
|
5978
|
-
| `sounds.
|
|
5979
|
-
| `sounds.
|
|
5980
|
-
| `sounds.
|
|
5981
|
-
| `sounds.
|
|
5982
|
-
| `sounds.
|
|
5983
|
-
| `sounds.
|
|
5984
|
-
| `sounds.
|
|
5985
|
-
| `sounds.
|
|
5986
|
-
| `sounds.
|
|
5987
|
-
| `sounds.
|
|
5988
|
-
| `sounds.
|
|
5989
|
-
| `sounds.
|
|
5990
|
-
| `sounds.
|
|
5991
|
-
| `sounds.
|
|
5992
|
-
| `sounds.
|
|
5993
|
-
| `sounds.
|
|
5994
|
-
| `sounds.
|
|
5995
|
-
| `sounds.syllables
|
|
5996
|
-
| `sounds.syllables.
|
|
5997
|
-
| `sounds.syllables.
|
|
5998
|
-
| `sounds.syllables.
|
|
5999
|
-
| `sounds.syllables.
|
|
6000
|
-
| `sounds.
|
|
6001
|
-
| `sounds.
|
|
6002
|
-
| `sounds.
|
|
6003
|
-
| `sounds.
|
|
6004
|
-
| `sounds.
|
|
6005
|
-
| `sounds.
|
|
6006
|
-
| `sounds.
|
|
6007
|
-
| `sounds.
|
|
6008
|
-
| `sounds.
|
|
6009
|
-
| `sounds.
|
|
6010
|
-
| `sounds.
|
|
6011
|
-
| `sounds.
|
|
6012
|
-
| `sounds.
|
|
6013
|
-
| `sounds.
|
|
6014
|
-
| `sounds.
|
|
6015
|
-
| `sounds.
|
|
6016
|
-
| `sounds.
|
|
6017
|
-
| `sounds.
|
|
6018
|
-
| `sounds.
|
|
6019
|
-
| `sounds.
|
|
6020
|
-
| `sounds.
|
|
6021
|
-
| `sounds.
|
|
6022
|
-
| `sounds.
|
|
6023
|
-
| `sounds.
|
|
6024
|
-
| `sounds.
|
|
6025
|
-
| `sounds.
|
|
6026
|
-
| `sounds.
|
|
6027
|
-
| `sounds.
|
|
6028
|
-
| `sounds.
|
|
6029
|
-
| `sounds.
|
|
6030
|
-
| `sounds.
|
|
6031
|
-
| `sounds.
|
|
6032
|
-
| `sounds.
|
|
6033
|
-
| `sounds.
|
|
6034
|
-
| `
|
|
6035
|
-
| `
|
|
6036
|
-
| `
|
|
6037
|
-
| `
|
|
6038
|
-
| `
|
|
6039
|
-
| `
|
|
6040
|
-
| `
|
|
6041
|
-
| `
|
|
6042
|
-
| `
|
|
6043
|
-
| `
|
|
6044
|
-
| `
|
|
6045
|
-
| `
|
|
6046
|
-
| `
|
|
6047
|
-
| `
|
|
6048
|
-
| `
|
|
6049
|
-
| `
|
|
6050
|
-
| `
|
|
6051
|
-
| `
|
|
6052
|
-
| `
|
|
6053
|
-
| `
|
|
6054
|
-
| `
|
|
6055
|
-
| `
|
|
6056
|
-
| `
|
|
6057
|
-
| `
|
|
6058
|
-
| `
|
|
6059
|
-
| `
|
|
6060
|
-
| `
|
|
6061
|
-
| `
|
|
6062
|
-
| `
|
|
6063
|
-
| `
|
|
6064
|
-
| `
|
|
6065
|
-
| `
|
|
6066
|
-
| `
|
|
6067
|
-
| `
|
|
6068
|
-
| `
|
|
6069
|
-
| `
|
|
6070
|
-
| `
|
|
6071
|
-
| `
|
|
6072
|
-
| `
|
|
6073
|
-
| `
|
|
6074
|
-
| `
|
|
6075
|
-
| `
|
|
6076
|
-
| `
|
|
6077
|
-
| `
|
|
6078
|
-
| `
|
|
6079
|
-
| `
|
|
6080
|
-
| `
|
|
6081
|
-
| `
|
|
6082
|
-
| `
|
|
6083
|
-
| `
|
|
6084
|
-
| `
|
|
6085
|
-
| `
|
|
6086
|
-
| `naming
|
|
6087
|
-
| `naming.
|
|
6088
|
-
| `naming.
|
|
6089
|
-
| `naming.
|
|
6090
|
-
| `naming.
|
|
6091
|
-
| `naming.
|
|
6092
|
-
| `naming.
|
|
6093
|
-
| `naming.
|
|
6094
|
-
| `naming.
|
|
6095
|
-
| `naming.
|
|
6096
|
-
| `naming.
|
|
6097
|
-
| `naming.
|
|
6098
|
-
| `naming.
|
|
6099
|
-
| `naming.
|
|
6100
|
-
| `naming.
|
|
6101
|
-
| `naming.
|
|
6084
|
+
| `data` property | Values | Description |
|
|
6085
|
+
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
6086
|
+
| `templatePriority` | `number` | Template priority, _null_ = not a template |
|
|
6087
|
+
| `masteryLevel` | `number` | HM3 mastery level |
|
|
6088
|
+
| `parentSkill` | `Address` | Parent skill this skill specializes |
|
|
6089
|
+
| `names` | `{ pattern, given, <name>... }` | `language` only: how its speakers are named, for `package-build npc new` — see [name lists](#name-lists) |
|
|
6090
|
+
| `names.pattern` | `string`, `string[]` or map of `gender` words to either, required | Placeholders such as `{given}`, `{given.male}` and `{clan}`, each naming a list, with literal text around them; a list states several forms, a map each gender's forms |
|
|
6091
|
+
| `names.given` | map of `gender` words to lists of names, required | Given names by gender; `female` and `male` are required |
|
|
6092
|
+
| `names.given.<name>` | `string[]` | The given names of one gender |
|
|
6093
|
+
| `names.<name>` | `string[]` | A list the placeholder of the same name draws from |
|
|
6094
|
+
| `family` | `Address` | `language` only: the parent language, naming a skill note with `subType: language`; this language reads the parent's words as its own — see [a language's words](#a-languages-words) |
|
|
6095
|
+
| `abbreviation` | `string` | `language` only: the tag a dictionary prints for it, as `Prov.`; its full name where unstated — see [dictionaries and glossaries](#dictionaries-and-glossaries) |
|
|
6096
|
+
| `core` | `boolean` | `language` only: `true` where the language must cover the [core vocabulary](#the-core-vocabulary) |
|
|
6097
|
+
| `grammar` | `{ plural?, verbs?, agreement?, participles? }` | Optional noun plurals, one verb pattern, agreement and participles; supplied shapes only are checked |
|
|
6098
|
+
| `grammar.plural` | `{ ending, becomes }[]` | Literal suffix replacements in authored order; the first match wins |
|
|
6099
|
+
| `grammar.plural[].ending` | `string`, required, may be empty | Bare suffix to replace; empty matches every noun |
|
|
6100
|
+
| `grammar.plural[].becomes` | `string`, required, may be empty | Bare replacement; empty deletes the matching suffix |
|
|
6101
|
+
| `grammar.verbs` | `{ invariant: true }` or `{ persons: { I, you, heShe, we, youAll, they }, replaces? }` | One regular present pattern, printed once at the dictionary head |
|
|
6102
|
+
| `grammar.verbs.invariant` | `true` | Verbs do not change; excludes `persons` |
|
|
6103
|
+
| `grammar.verbs.persons` | a map of all six ending strings | Each ending is added to the citation form, or replaces its closing `replaces`; excludes `invariant` |
|
|
6104
|
+
| `grammar.verbs.persons.I` | `string`, required, may be empty | Ending for I |
|
|
6105
|
+
| `grammar.verbs.persons.you` | `string`, required, may be empty | Ending for you |
|
|
6106
|
+
| `grammar.verbs.persons.heShe` | `string`, required, may be empty | Ending for he/she |
|
|
6107
|
+
| `grammar.verbs.persons.we` | `string`, required, may be empty | Ending for we |
|
|
6108
|
+
| `grammar.verbs.persons.youAll` | `string`, required, may be empty | Ending for you all |
|
|
6109
|
+
| `grammar.verbs.persons.they` | `string`, required, may be empty | Ending for they |
|
|
6110
|
+
| `grammar.verbs.replaces` | `string`, nonempty | Closing letters each ending takes the place of; a citation form closing otherwise takes the ending whole. With `persons` only |
|
|
6111
|
+
| `grammar.agreement` | `{ classes, endings }` | Adjectives, pronouns or any other named classes agree by swapping among `endings`; see [optional noun and verb forms](#optional-noun-and-verb-forms) |
|
|
6112
|
+
| `grammar.agreement.classes` | `string[]`, required, at least one | Word class bases from the [master word classes](#word-classes), each once |
|
|
6113
|
+
| `grammar.agreement.endings` | `string[]`, required, at least two | The singular endings, one per gender; the `plural` rule gives each one's plural |
|
|
6114
|
+
| `grammar.participles` | `{ root, affixes }` | Participle suffixes on the verb root; see [optional noun and verb forms](#optional-noun-and-verb-forms) |
|
|
6115
|
+
| `grammar.participles.root` | `string[]`, required, at least one, nonempty | Infinitive endings a citation form drops to give the root; the longest that fits wins |
|
|
6116
|
+
| `grammar.participles.affixes` | `string[]`, required, at least one | Suffixes of `affixes`, by `form`, each attaching to the root as its `replaces` says |
|
|
6117
|
+
| `classModifiers` | `string[]` | `language` only: the word class modifiers the language uses, each from the [master word classes](#word-classes); empty when unstated |
|
|
6118
|
+
| `fields` | `{ name, holds }[]` | `language` only: the fields its words are grouped under |
|
|
6119
|
+
| `fields[].name` | `string`, required | The field's name, which a word's `field` names |
|
|
6120
|
+
| `fields[].holds` | `string`, required | What the field holds |
|
|
6121
|
+
| `words` | `{ form, class, field, gloss, … }[]` | `language` only: its words in authored order; its automatic dictionary sorts them alphabetically — see [a language's words](#a-languages-words) |
|
|
6122
|
+
| `words[].form` | `string`, required | The word as cited, bare: no backticks |
|
|
6123
|
+
| `words[].variants` | `string[]` | Its other forms, as a short form beside a long one; a marked use of one cites the word, and a mapped run accepts it |
|
|
6124
|
+
| `words[].name_sort` | `string` | Its sort key; the form when unstated |
|
|
6125
|
+
| `words[].class` | `string`, required | A class from the master word classes, base first: `n I f` |
|
|
6126
|
+
| `words[].plural` | `string` | Optional explicit noun plural; the dictionary uses it before the language rule |
|
|
6127
|
+
| `words[].field` | `string`, required | One of the note's `fields` names |
|
|
6128
|
+
| `words[].gloss` | `string` or `string[]`, required | The meaning, in brief; a list states one sense per entry, which a dictionary numbers |
|
|
6129
|
+
| `words[].concept` | `string` or `string[]` | The core concepts the word serves, each an `id` of a [`data.concepts`](#the-core-vocabulary) list; one id, or a list for a word that serves several |
|
|
6130
|
+
| `words[].source` | `{ kind, language?, form? }` | Where the word comes from |
|
|
6131
|
+
| `words[].source.kind` | `inherited`, `borrowed`, `kept`, `worn`, `coined`, `substrate` or `island`, required | How the word came into the language |
|
|
6132
|
+
| `words[].source.language` | `Address` | The language a `borrowed` word came from, naming a skill note with `subType: language`; required for `borrowed` |
|
|
6133
|
+
| `words[].source.form` | `string` | The form the word had in its source, bare |
|
|
6134
|
+
| `words[].built` | `string[]` | The pieces the word is built from, in order, as the note's words and affixes write them; absent for a root word |
|
|
6135
|
+
| `words[].note` | `string` | What a source says of the word beyond its pieces, as a cognate it is read with |
|
|
6136
|
+
| `words[].pronunciation` | `string` | A respelling, as `sol-MEH-reh`: letters, apostrophes and hyphens, at most one syllable in capitals |
|
|
6137
|
+
| `words[].tones` | `string` | A tone pattern, as `LHL` |
|
|
6138
|
+
| `words[].root` | `string` | A consonantal skeleton, as `d-l-k` |
|
|
6139
|
+
| `words[].frame` | `string` | The frame a root is set in, named in `sounds.frames` of the language or an ancestor |
|
|
6140
|
+
| `words[].native` | `{ map, font?, text }[]` | The word's native form under a map, stated only where the rows spell it differently — see [a map reads the dictionary first](#a-map-reads-the-dictionary-first) |
|
|
6141
|
+
| `words[].native[].map` | `string` | Required: the `data.map.name` the form is written for |
|
|
6142
|
+
| `words[].native[].font` | `string` | The one face the form is for, one the map lists; unstated, every face it lists |
|
|
6143
|
+
| `words[].native[].text` | `string` | Required: the word as the script writes it |
|
|
6144
|
+
| `affixes` | `{ form?, zero?, kind?, given?, where?, gloss, attaches?, examples?, barredAfter?, tones? }[]` | `language` only: the affixes a word's `built` pieces may name; each states a `form` or `zero: true` |
|
|
6145
|
+
| `affixes[].form` | `string` | The affix as a `built` piece names it, as `-rith`; absent on a zero affix |
|
|
6146
|
+
| `affixes[].zero` | `boolean` | The affix is written as nothing, as a case with no ending; it states no `form`, prints as `∅`, and no `built` piece names it |
|
|
6147
|
+
| `affixes[].kind` | `case`, `derivation`, `tense`, `aspect`, `mood`, `voice`, `name` or `lineage` | What it makes: a case, a derived word, a verb's tense, aspect, mood or voice, a given name's ending or a lineage name's ending |
|
|
6148
|
+
| `affixes[].given` | `man`, `woman` or `either` | Who a given name closing on it belongs to; only on an affix of kind `name` |
|
|
6149
|
+
| `affixes[].where` | `string` | Where this form stands, for an affix written two ways, as `before a stop`; everywhere where absent |
|
|
6150
|
+
| `affixes[].gloss` | `string`, required | What it means |
|
|
6151
|
+
| `affixes[].attaches` | `string` | How it attaches, as `replaces a closing vowel` |
|
|
6152
|
+
| `affixes[].examples` | `string[]` | The names it is read from |
|
|
6153
|
+
| `affixes[].barredAfter` | `string[]` | The sounds a stem may not close on to take the affix, as `[n]` |
|
|
6154
|
+
| `affixes[].tones` | `string` | The tone pattern it carries, as `L` |
|
|
6155
|
+
| `affixes[].replaces` | `string` | What it takes the place of at the close of the stem: `vowel` for any closing vowel, or the letters, as `a`; added to the whole stem where absent |
|
|
6156
|
+
| `affixes[].attachesTo` | `string[]` | The word classes it attaches to, by their base, as `[n, adj]`; every class where absent |
|
|
6157
|
+
| `affixes[].lengthens` | `boolean` | Whether the stem's last vowel lengthens before it; `false` where unstated, and never beside `replaces` |
|
|
6158
|
+
| `affixes[].front` | `string` | Its form after front vowels, where the language keeps vowel harmony, as `-ür` |
|
|
6159
|
+
| `tongues` | `{ tag, meaning, language? }[]` | `language` only: the tags a register row's `tongue` names — see [a language's register, sounds and history](#a-languages-register-sounds-and-history) |
|
|
6160
|
+
| `tongues[].tag` | `string`, required | Lowercase letters and digits, as `dunhari`, or a tag closing on `:<tongue>`, as `exonym:<tongue>`, which declares `exonym:vylari` and every tag like it |
|
|
6161
|
+
| `tongues[].meaning` | `string`, required | What a name of this tongue is |
|
|
6162
|
+
| `tongues[].language` | `Address` | The language note the tag names, where it is one |
|
|
6163
|
+
| `register` | `{ name, tongue?, kind?, built?, why? }[]` | `language` only: every name the setting gives in the language's reach; the notes carrying each are derived |
|
|
6164
|
+
| `register[].name` | `string`, required | The name, as the setting writes it |
|
|
6165
|
+
| `register[].tongue` | `string` | A tag `tongues` declares, or `translation`; a row states a `tongue`, a `kind`, or both |
|
|
6166
|
+
| `register[].kind` | `byname`, `given` or `place` | What kind of name it is, in a language that sorts its names by kind |
|
|
6167
|
+
| `register[].built` | `string[]` | The pieces the name is built from, as a word's `built` writes them |
|
|
6168
|
+
| `register[].gloss` | `string` | What the name means, where the pages give its sense |
|
|
6169
|
+
| `register[].why` | `string` | Why the name stands outside the pattern the language's names are built by |
|
|
6170
|
+
| `retired` | `{ form, instead?, why }[]` | `language` only: the forms the setting does not write |
|
|
6171
|
+
| `retired[].form` | `string`, required | The form the setting does not write |
|
|
6172
|
+
| `retired[].instead` | `string` or `string[]` | What is written in its place; absent where nothing is |
|
|
6173
|
+
| `retired[].why` | `string`, required | Why the setting does not write it |
|
|
6174
|
+
| `scope` | `{ folders?, cultures?, lore?, parents?, addresses?, paths?, types?, skip? }` | `language` only: the notes the register covers |
|
|
6175
|
+
| `scope.folders` | `Address[]` | Every note whose `packFolder` is one of these folders |
|
|
6176
|
+
| `scope.cultures` | `Address[]` | Every note whose `culture` is one of these cultures |
|
|
6177
|
+
| `scope.lore` | `Address[]` | Every note whose `lore` names one of these notes |
|
|
6178
|
+
| `scope.parents` | `Address[]` | Every note whose `parents` names one of these notes |
|
|
6179
|
+
| `scope.addresses` | `Address[]` | These notes themselves |
|
|
6180
|
+
| `scope.paths` | `string[]` | Every note whose file sits below one of these content paths, as `Regions/Aelwyth/` |
|
|
6181
|
+
| `scope.types` | `string[]` | The note types covered; a note of another type is out of scope whatever else catches it |
|
|
6182
|
+
| `scope.skip` | `Address[]` | Notes out of scope whatever else catches them |
|
|
6183
|
+
| `sounds` | `{ letters?, edges?, clusters?, stress?, finals?, syllables?, joining?, joins?, marks?, skeleton?, frames?, readPast? }` | `language` only: the letters it writes and the rules its words keep |
|
|
6184
|
+
| `sounds.letters` | `{ letters, kind, like?, place?, tongue? }[]` | The letters and the sounds they stand for |
|
|
6185
|
+
| `sounds.letters[].letters` | `string[]`, required | The letters or digraphs the row describes |
|
|
6186
|
+
| `sounds.letters[].kind` | `string`, required | What kind of sound they write, as `consonant` or `long vowel` |
|
|
6187
|
+
| `sounds.letters[].like` | `string` | What they sound like; absent where the row states only their kind and place |
|
|
6188
|
+
| `sounds.letters[].place` | `string` | Where in the mouth they are made, as `lips` or `tongue-tip` |
|
|
6189
|
+
| `sounds.letters[].tongue` | `string` or `string[]` | The tongues that write them, as tags `tongues` declares; every one where absent |
|
|
6190
|
+
| `sounds.edges` | `{ edge, sounds }[]` | The sounds that may stand at each edge of a word, one entry per edge |
|
|
6191
|
+
| `sounds.edges[].edge` | `openConsonant`, `openCluster`, `closeConsonant`, `closeCluster`, `innerCluster`, `vowelPair`, `glide` or `syllabic`, required | Which edge the sounds stand at |
|
|
6192
|
+
| `sounds.edges[].sounds` | `string[]` or `any`, required | The sounds; `any` for every one, an empty list for none |
|
|
6193
|
+
| `sounds.clusters` | `{ max, groups? }` | How many consonants may stand together |
|
|
6194
|
+
| `sounds.clusters.max` | `integer`, required | The most consonants that stand together inside a word |
|
|
6195
|
+
| `sounds.clusters.groups` | `{ what, clusters, use }[]` | The clusters that may stand inside a word, in groups; a language stating them states no `innerCluster` edge |
|
|
6196
|
+
| `sounds.clusters.groups[].what` | `string`, required | What the group's clusters are made of, as `a nasal and a fricative` |
|
|
6197
|
+
| `sounds.clusters.groups[].clusters` | `string[]`, required | The clusters, as written; no cluster stands in two groups |
|
|
6198
|
+
| `sounds.clusters.groups[].use` | `common` or `sparing`, required | How often the group's clusters stand inside a word |
|
|
6199
|
+
| `sounds.stress` | `{ two, longer, mark? }` | Where a word's stress falls, as a rule a program reads |
|
|
6200
|
+
| `sounds.stress.two` | `first` or `last`, required | The stressed syllable of a word of two syllables |
|
|
6201
|
+
| `sounds.stress.longer` | `antepenultimate`, `penultimate` or `final`, required | The stressed syllable of a word of three or more, counted from its end |
|
|
6202
|
+
| `sounds.stress.mark` | `acute`, `grave` or `circumflex` | The diacritic that marks a stress the rule would not choose; it moves the stress to the syllable it sits on |
|
|
6203
|
+
| `sounds.finals` | `{ final, like }[]` | The syllable finals, for a language whose syllables are parsed by them |
|
|
6204
|
+
| `sounds.finals[].final` | `string`, required | The final, as `ang` |
|
|
6205
|
+
| `sounds.finals[].like` | `string`, required | What it sounds like |
|
|
6206
|
+
| `sounds.syllables` | map of syllable rules | What a syllable and a word may open and close on |
|
|
6207
|
+
| `sounds.syllables.onsets` | `single` | What a syllable opens on: a single consonant |
|
|
6208
|
+
| `sounds.syllables.codas` | `string[]` or `any` | The consonants that may close a syllable |
|
|
6209
|
+
| `sounds.syllables.finals` | `string[]` or `any` | The consonants that may close a word |
|
|
6210
|
+
| `sounds.syllables.doubled` | `string[]` | The doubled consonants a word may hold; none where empty |
|
|
6211
|
+
| `sounds.syllables.vowelPairs` | `string[]` | The vowels that may stand together; none where empty |
|
|
6212
|
+
| `sounds.syllables.initialVowel` | `boolean` | Whether a word may open on a vowel |
|
|
6213
|
+
| `sounds.syllables.finalVowel` | `boolean` | Whether a word may close on a vowel; `true` where unstated |
|
|
6214
|
+
| `sounds.syllables.neverInitial` | `string[]` | The letters that never open a word |
|
|
6215
|
+
| `sounds.syllables.signature` | `string[]` | The letters that mark a word as the language's own |
|
|
6216
|
+
| `sounds.syllables.harmony` | `{ back, front, neutral?, neutralAs?, partners? }` | The vowel harmony a word keeps |
|
|
6217
|
+
| `sounds.syllables.harmony.back` | `string[]`, required | The back vowels |
|
|
6218
|
+
| `sounds.syllables.harmony.front` | `string[]`, required | The front vowels |
|
|
6219
|
+
| `sounds.syllables.harmony.neutral` | `string[]` | The vowels of neither set |
|
|
6220
|
+
| `sounds.syllables.harmony.neutralAs` | `back` or `front` | The set a word of neutral vowels alone counts as |
|
|
6221
|
+
| `sounds.syllables.harmony.partners` | map of vowels to front vowels | The front vowel each vowel turns to in an affix's front form, keyed by the vowel |
|
|
6222
|
+
| `sounds.syllables.harmony.partners.<name>` | `string` | One vowel's partner, one of the harmony's `front` vowels; the key is a vowel of the harmony |
|
|
6223
|
+
| `sounds.joining` | `{ first, second, written, example? }[]` | How two parts are written where the first closes and the second opens on the given sounds |
|
|
6224
|
+
| `sounds.joining[].first` | `string[]`, required | The sounds the first part closes on |
|
|
6225
|
+
| `sounds.joining[].second` | `string[]`, required | The sounds the second part opens on |
|
|
6226
|
+
| `sounds.joining[].written` | `string`, required | What is written where they meet, as `â`; a join closing on `+`, as `y+`, keeps both and sets it between |
|
|
6227
|
+
| `sounds.joining[].example` | `string` | A word joined so |
|
|
6228
|
+
| `sounds.joins` | `{ meeting, rule, letters?, where? }[]` | What happens where two parts of a word meet, one entry per meeting |
|
|
6229
|
+
| `sounds.joins[].meeting` | `C+C`, `V+C` or `V+V`, required | Which sounds meet: a consonant or a vowel closing the first part, then opening the second |
|
|
6230
|
+
| `sounds.joins[].rule` | `merge`, `insert`, `drop` or `double`, required | What happens: one is written, `letters` are set between, the first is lost, or the consonant is doubled |
|
|
6231
|
+
| `sounds.joins[].letters` | `string[]` | The letters `insert` sets between or `double` doubles |
|
|
6232
|
+
| `sounds.joins[].where` | `string` | Where it holds, as `between stems`; everywhere where absent |
|
|
6233
|
+
| `sounds.marks` | `{ mark, letters, kind, limit }[]` | The marks the language writes on its letters |
|
|
6234
|
+
| `sounds.marks[].mark` | `string`, required | The mark's name, as `acute` |
|
|
6235
|
+
| `sounds.marks[].letters` | `string[]`, required | The letters that carry it |
|
|
6236
|
+
| `sounds.marks[].kind` | `stress` or `length`, required | What it says of its letter |
|
|
6237
|
+
| `sounds.marks[].limit` | `one` or `any`, required | How many a word may carry |
|
|
6238
|
+
| `sounds.skeleton` | `{ second, between? }[]` | The vowel set between a root's second and third consonants |
|
|
6239
|
+
| `sounds.skeleton[].second` | `string[]` or `any`, required | The second consonants the row holds for; `any` for every other |
|
|
6240
|
+
| `sounds.skeleton[].between` | `string` | The vowel set between; nothing where absent or empty |
|
|
6241
|
+
| `sounds.frames` | `{ frame, shape, class, makes, examples? }[]` | The patterns a root is set in |
|
|
6242
|
+
| `sounds.frames[].frame` | `string`, required | The frame's name, which a word's `frame` names |
|
|
6243
|
+
| `sounds.frames[].shape` | `string`, required | The pattern, the root's consonants numbered, as `K1aK2K3` |
|
|
6244
|
+
| `sounds.frames[].class` | `string[]`, required | The classes of word it makes, each a base of the [master word classes](#word-classes) |
|
|
6245
|
+
| `sounds.frames[].makes` | `string`, required | What it makes of a root |
|
|
6246
|
+
| `sounds.frames[].examples` | map of roots to forms | The form a root takes in the frame, keyed by the root |
|
|
6247
|
+
| `sounds.frames[].examples.<name>` | `string` | One root's form, bare |
|
|
6248
|
+
| `sounds.readPast` | `{ written, readAs?, what }[]` | Marks and spellings a word is read through before the sound rules hold it |
|
|
6249
|
+
| `sounds.readPast[].written` | `string`, required | The mark or spelling the pages write |
|
|
6250
|
+
| `sounds.readPast[].readAs` | `string` | What the word is read with in its place; absent where it is read as nothing |
|
|
6251
|
+
| `sounds.readPast[].what` | `string`, required | What the mark or spelling is |
|
|
6252
|
+
| `sounds.mutations` | `{ mutation, sound, becomes, example? }[]` | The sounds a word changes where a named mutation holds, one entry per sound |
|
|
6253
|
+
| `sounds.mutations[].mutation` | `string`, required | The mutation's name, as `wearing`; its rows share it |
|
|
6254
|
+
| `sounds.mutations[].sound` | `string`, required | The sound where the mutation does not hold, as `p`; once per mutation |
|
|
6255
|
+
| `sounds.mutations[].becomes` | `string`, required | What it becomes where the mutation holds, as `v` |
|
|
6256
|
+
| `sounds.mutations[].example` | `string` | A word that shows it |
|
|
6257
|
+
| `soundChanges` | `{ name, from?, to?, steps }[]` | `language` only: named sets of ordered changes, each making one tongue's words from another's |
|
|
6258
|
+
| `soundChanges[].name` | `string`, required | The set's name, which no other set of the note shares |
|
|
6259
|
+
| `soundChanges[].from` | `Address` | The language note whose words the steps start from |
|
|
6260
|
+
| `soundChanges[].to` | `Address` | The language note whose words the steps make |
|
|
6261
|
+
| `soundChanges[].takes` | `string` | The form of the older word the steps start from, as `accusative`; its citation form where absent |
|
|
6262
|
+
| `soundChanges[].steps` | `{ step, change, where? }[]`, required | The steps, in the order they apply |
|
|
6263
|
+
| `soundChanges[].steps[].step` | `string`, required | The step's label, as `A1` or `"1"`; no label stands twice in a set |
|
|
6264
|
+
| `soundChanges[].steps[].change` | `string`, required | The change in arrow notation, as `` `ph` > `f`; `kh` > `h` ``, or the operation it names in words |
|
|
6265
|
+
| `soundChanges[].steps[].where` | `string` | Where it holds, as `word end`; everywhere where absent |
|
|
6266
|
+
| `elements` | `{ form, variants?, position?, kind?, sense, examples?, word?, joining? }[]` | `language` only: the elements its names are built from |
|
|
6267
|
+
| `elements[].form` | `string`, required | The element, as `arn-` |
|
|
6268
|
+
| `elements[].variants` | `string[]` | The element's other forms, as `aldr-` beside `ald-` |
|
|
6269
|
+
| `elements[].position` | `opening`, `closing`, `either` or `link` | Where in a name it stands |
|
|
6270
|
+
| `elements[].kind` | `byname`, `given` or `place` | The kind of name it builds, in a language that keeps one set of elements per kind; every kind where absent |
|
|
6271
|
+
| `elements[].sense` | `string`, required | What it means |
|
|
6272
|
+
| `elements[].examples` | `string[]` | The names it is read from |
|
|
6273
|
+
| `elements[].word` | `string` | The word it is the stem of, a form of `words` of the language or an ancestor |
|
|
6274
|
+
| `elements[].joining` | `string` | The element's joining form, as `-borgar`, when it qualifies another word |
|
|
6275
|
+
| `roots` | `{ root, sense, field? }[]` | `language` only: the consonantal roots its words are set from |
|
|
6276
|
+
| `roots[].root` | `string`, required | The root, as `d-l-k` |
|
|
6277
|
+
| `roots[].sense` | `string`, required | What it means |
|
|
6278
|
+
| `roots[].field` | `string` | The field it belongs to, as `stone` |
|
|
6279
|
+
| `cognates` | `{ forms, proto?, gloss }[]` | `language` only: sets of forms one older word takes in several languages, stated on the eldest |
|
|
6280
|
+
| `cognates[].forms` | map of language Addresses to forms, required | The form the set takes in each language, keyed by the language note |
|
|
6281
|
+
| `cognates[].forms.<name>` | `string` | One language's form, bare |
|
|
6282
|
+
| `cognates[].gloss` | `string`, required | What the forms mean |
|
|
6283
|
+
| `cognates[].proto` | `string` | The reconstructed form the set descends from, in no attested language; printed with an asterisk |
|
|
6284
|
+
| `callingNames` | `{ closings, minSyllables }` | `language` only: the short name a long given name is called by |
|
|
6285
|
+
| `callingNames.closings` | `{ form?, doubled?, usual }[]`, required | What a calling name closes on |
|
|
6286
|
+
| `callingNames.closings[].form` | `string` | The ending, as `-u`; a row states `form` or `doubled`, never both |
|
|
6287
|
+
| `callingNames.closings[].doubled` | `boolean` | The calling name doubles the first syllable instead of taking an ending |
|
|
6288
|
+
| `callingNames.closings[].usual` | `man`, `woman` or `either`, required | Whose name it usually makes |
|
|
6289
|
+
| `callingNames.minSyllables` | `integer`, required | The fewest syllables a given name has that the pages give a calling name |
|
|
6290
|
+
| `older` | `{ form, gloss?, layer? }[]` | `language` only: the words and names older than its rules, which no sound or name rule holds |
|
|
6291
|
+
| `older[].form` | `string`, required | The form as the setting writes it; no form stands twice |
|
|
6292
|
+
| `older[].gloss` | `string` | What it means |
|
|
6293
|
+
| `older[].layer` | `string` | The historical layer it belongs to, as `Primordial` |
|
|
6294
|
+
| `negation` | `{ particle, mutation? }` | `language` only: how a verb is negated |
|
|
6295
|
+
| `negation.particle` | `string`, required | The particle that stands before the verb, a form of `words` of the language or an ancestor |
|
|
6296
|
+
| `negation.mutation` | `string` | The mutation the negated verb takes, named in `sounds.mutations` |
|
|
6297
|
+
| `naming` | `{ shapes?, edges?, draws?, heldFrom?, nearName? }` | `language` only: the shapes, edges and sources its names keep beyond its words' rules |
|
|
6298
|
+
| `naming.shapes` | `{ of, syllables?, perVowel? }[]` | How long each class of name runs |
|
|
6299
|
+
| `naming.shapes[].of` | `name`, `given`, `clan`, `bound` or `compound`, required | The class of name; once per class |
|
|
6300
|
+
| `naming.shapes[].syllables` | `{ min, max }` | How many syllables a name of the class runs to |
|
|
6301
|
+
| `naming.shapes[].syllables.min` | `integer`, required | The fewest |
|
|
6302
|
+
| `naming.shapes[].syllables.max` | `integer`, required | The most; never below `min` |
|
|
6303
|
+
| `naming.shapes[].perVowel` | `{ min, max }` | How many consonants a name of the class carries to each vowel; a shape states this, `syllables`, or both |
|
|
6304
|
+
| `naming.shapes[].perVowel.min` | `number`, required | The fewest |
|
|
6305
|
+
| `naming.shapes[].perVowel.max` | `number`, required | The most; never below `min` |
|
|
6306
|
+
| `naming.edges` | `{ edge, sounds, vowel?, of? }[]` | The sounds a name may open and close on, where names keep edges ordinary words do not |
|
|
6307
|
+
| `naming.edges[].edge` | an `edge` of `sounds.edges`, required | Which edge of a name the sounds stand at; once per class of name |
|
|
6308
|
+
| `naming.edges[].sounds` | `string[]` or `any`, required | The sounds; `any` for every one, an empty list for none |
|
|
6309
|
+
| `naming.edges[].vowel` | `boolean` | Whether a vowel may stand at the edge too; `false` where unstated |
|
|
6310
|
+
| `naming.edges[].of` | `name`, `given`, `clan`, `bound` or `compound` | The class of name the edge holds for; `name`, every name, where absent |
|
|
6311
|
+
| `naming.draws` | `{ kind, elements }[]` | The element kinds each kind of name is built from |
|
|
6312
|
+
| `naming.draws[].kind` | `byname`, `given` or `place`, required | The kind of name; once per kind |
|
|
6313
|
+
| `naming.draws[].elements` | list of `byname`, `given` or `place`, required | The element kinds, as `elements[].kind` states them |
|
|
6314
|
+
| `naming.heldFrom` | `{ source, takes, clip?, joining?, elements? }[]` | What a place name takes first, by what the place is held from |
|
|
6315
|
+
| `naming.heldFrom[].source` | `string`, required | What the place is held from, as `a founder` |
|
|
6316
|
+
| `naming.heldFrom[].takes` | `stem`, `godName`, `givenName` or `element`, required | What stands first: a name-stem in any grade, a god's name, a founder's given name, or one of `elements` |
|
|
6317
|
+
| `naming.heldFrom[].clip` | `first` | How the name is clipped: to its first element; whole where absent. A name row only |
|
|
6318
|
+
| `naming.heldFrom[].joining` | `string[]` | The joining endings, one of which stands at the seam after the name. A name row only |
|
|
6319
|
+
| `naming.heldFrom[].elements` | `string[]` | The elements that may stand first; required on, and only on, a row that takes an `element` |
|
|
6320
|
+
| `naming.nearName` | `{ minSyllables, examples? }` | The near name a long given name carries |
|
|
6321
|
+
| `naming.nearName.minSyllables` | `integer`, required | The fewest syllables a given name has that carries a near name |
|
|
6322
|
+
| `naming.nearName.examples` | `{ near, given }[]` | Worked near names |
|
|
6323
|
+
| `naming.nearName.examples[].near` | `string`, required | The near name |
|
|
6324
|
+
| `naming.nearName.examples[].given` | `string`, required | The given name it is the near name of |
|
|
6325
|
+
| `grammar.native` | `{ ending, map, font?, text }[]` | Under a logographic map, the signs a derived form takes after its stem's writing — see [a logographic map](#a-logographic-map) |
|
|
6326
|
+
| `grammar.native[].ending` | `plural`, `I`, `you`, `heShe`, `we`, `youAll` or `they`, required | The ending written; a person only where `verbs.persons` is stated |
|
|
6327
|
+
| `grammar.native[].map` | `string`, required | The `data.map.name` of a logographic map |
|
|
6328
|
+
| `grammar.native[].font` | `string` | The one face the writing is for, one the map lists; unstated, every face it lists |
|
|
6329
|
+
| `grammar.native[].text` | `string`, required, may be empty | The ending's signs; empty writes the stem alone |
|
|
6330
|
+
| `affixes[].native` | `{ map, font?, text }[]` | The affix's writing under a logographic map, for a `built` piece naming it |
|
|
6331
|
+
| `affixes[].native[].map` | `string`, required | The `data.map.name` of a logographic map |
|
|
6332
|
+
| `affixes[].native[].font` | `string` | The one face the writing is for, one the map lists; unstated, every face it lists |
|
|
6333
|
+
| `affixes[].native[].text` | `string`, required | The affix as the script writes it |
|
|
6334
|
+
| `emphasis` | `words`, `rubric` or `overline` | `language` only: how the language marks a stressed word, over its script's; `words` makes `*…*` and `**…**` in its runs an error — see [script notes and emphasis](#script-notes-and-emphasis) |
|
|
6335
|
+
| `script` | `{ fonts, emphasis, strongEmphasis? }` | `script` only: the faces the script is written in and how it marks emphasis — see [script notes and emphasis](#script-notes-and-emphasis) |
|
|
6336
|
+
| `script.fonts` | `string[]`, required | Installed faces by the slug `font=` names them by; a face belongs to one script |
|
|
6337
|
+
| `script.emphasis` | `rubric` or `overline`, required | Sets `*…*` and `**…**` in a run in one of its faces |
|
|
6338
|
+
| `script.strongEmphasis` | `rubric` or `overline` | Sets `**…**` instead of `emphasis` |
|
|
6102
6339
|
|
|
6103
6340
|
#### A language's words
|
|
6104
6341
|
|
|
@@ -6209,6 +6446,59 @@ A language uses only its own stated grammar, including for words
|
|
|
6209
6446
|
listed from an ancestor; an inherited word retains its explicit plural.
|
|
6210
6447
|
Grammar is not inherited through `family`.
|
|
6211
6448
|
|
|
6449
|
+
**Agreement** states which word classes agree with a noun and the singular
|
|
6450
|
+
endings they agree by, one for each gender:
|
|
6451
|
+
|
|
6452
|
+
```yaml
|
|
6453
|
+
grammar:
|
|
6454
|
+
plural:
|
|
6455
|
+
- { ending: os, becomes: oi }
|
|
6456
|
+
- { ending: on, becomes: oi }
|
|
6457
|
+
- { ending: a, becomes: ai }
|
|
6458
|
+
agreement:
|
|
6459
|
+
classes: [adj, pron]
|
|
6460
|
+
endings: [os, a, on]
|
|
6461
|
+
```
|
|
6462
|
+
|
|
6463
|
+
A word whose class base is one of `classes` and whose form closes on one of
|
|
6464
|
+
`endings` (the longest that leaves a stem) also has that ending swapped for
|
|
6465
|
+
each other one, and each of those forms, and the word itself, takes the plural
|
|
6466
|
+
the `plural` rule gives. So the adjective _alathos_ gives _alatha_ and
|
|
6467
|
+
_alathon_, and the plural rule gives _alathoi_ and _alathai_. A word closing on
|
|
6468
|
+
no ending, such as _ethlen_, does not agree, and a word of another class, such
|
|
6469
|
+
as the noun _marendos_, keeps its own plural alone. `classes` names at least
|
|
6470
|
+
one base of the [master word classes](#word-classes), each once, and `endings`
|
|
6471
|
+
states at least two endings, each once. Agreement is by these endings alone:
|
|
6472
|
+
there are no cases or declensions.
|
|
6473
|
+
|
|
6474
|
+
**Participles** attach to the verb root, which is the citation form less its
|
|
6475
|
+
infinitive ending:
|
|
6476
|
+
|
|
6477
|
+
```yaml
|
|
6478
|
+
affixes:
|
|
6479
|
+
- { form: "-andar", gloss: "doing it", replaces: vowel }
|
|
6480
|
+
- { form: "-thos", gloss: "done" }
|
|
6481
|
+
grammar:
|
|
6482
|
+
participles:
|
|
6483
|
+
root: [athen, ethen]
|
|
6484
|
+
affixes: ["-andar", "-thos"]
|
|
6485
|
+
```
|
|
6486
|
+
|
|
6487
|
+
A verb closing on one of `root` (the longest that leaves a root) drops it, and
|
|
6488
|
+
each suffix of `data.affixes` that `affixes` names by its `form` attaches to
|
|
6489
|
+
what is left as its own `replaces` says, or whole where it states none: the
|
|
6490
|
+
`front` form attaches too. So _dokathen_ gives the root _dok-_, which gives
|
|
6491
|
+
_dokandar_ and _dokthos_. A participle closing on an agreement ending agrees,
|
|
6492
|
+
so _dokthos_ also gives _doktha_, _dokthon_, _dokthoi_ and _dokthai_. A verb
|
|
6493
|
+
closing on no `root` ending has no participle. `root` names at least one
|
|
6494
|
+
nonempty ending and `affixes` at least one suffix the language's `data.affixes`
|
|
6495
|
+
states; an affix it names that is a prefix, or that the language does not
|
|
6496
|
+
state, is an error at the entry.
|
|
6497
|
+
|
|
6498
|
+
Neither rule is used by the dictionary. Both are read by the
|
|
6499
|
+
[mapped-run word check](#mapping-notes), which accepts the forms they give,
|
|
6500
|
+
and `package-build lexicon --derived` lists the same forms.
|
|
6501
|
+
|
|
6212
6502
|
All grammar is optional. Only a supplied key's shape is checked: no language
|
|
6213
6503
|
must supply a pattern, no noun must supply gender or plural, and no word is
|
|
6214
6504
|
checked against a rule or required to provide an exception. There are no
|
|
@@ -6320,6 +6610,51 @@ ORDER BY position
|
|
|
6320
6610
|
```
|
|
6321
6611
|
````
|
|
6322
6612
|
|
|
6613
|
+
#### The core vocabulary
|
|
6614
|
+
|
|
6615
|
+
A setting can state the concepts every one of its languages has a word for, and
|
|
6616
|
+
measure each language against them from data. Three keys carry it:
|
|
6617
|
+
|
|
6618
|
+
| Key | On | Meaning |
|
|
6619
|
+
| ---------------------- | --------------- | -------------------------------------------------------------------------------------- |
|
|
6620
|
+
| `data.concepts` | a `doc` note | The concept list: `{ id, gloss, group }` entries, in the order the report lists them |
|
|
6621
|
+
| `data.core` | a language note | `true` where the language must cover the list; the report lists these languages |
|
|
6622
|
+
| `data.words[].concept` | a word | The id of the concept the word serves, or a list of ids for a word that serves several |
|
|
6623
|
+
|
|
6624
|
+
```yaml
|
|
6625
|
+
---
|
|
6626
|
+
shortcode: coreconcepts
|
|
6627
|
+
name: { full: Core concepts }
|
|
6628
|
+
type: doc
|
|
6629
|
+
subType: reference
|
|
6630
|
+
data:
|
|
6631
|
+
concepts:
|
|
6632
|
+
- { id: see-verb, gloss: to see, group: senses }
|
|
6633
|
+
- { id: smell-noun, gloss: "a smell; a scent", group: senses }
|
|
6634
|
+
- { id: knee, gloss: the knee, group: body }
|
|
6635
|
+
---
|
|
6636
|
+
```
|
|
6637
|
+
|
|
6638
|
+
The lint holds each to what it means, each finding located at the key at fault:
|
|
6639
|
+
|
|
6640
|
+
- a concept's `id` is lowercase letters, digits and `-`, stated once in its list
|
|
6641
|
+
and by one note of the package;
|
|
6642
|
+
- a concept's `gloss` and `group` are not blank;
|
|
6643
|
+
- `data.core` is stated on a language note only;
|
|
6644
|
+
- a word's `concept` names entries of a concept list, each once. An id no list
|
|
6645
|
+
declares is an error at the id, with the nearest declared id offered when one
|
|
6646
|
+
is near: `` `smel-noun` is not a core concept; did you mean `smell-noun`? ``.
|
|
6647
|
+
Where no note states `data.concepts`, every id is unknown, and the message
|
|
6648
|
+
says so.
|
|
6649
|
+
|
|
6650
|
+
A language reads the words of its `data.family` chain as its own, so a parent's
|
|
6651
|
+
tagged word covers the daughter's concept. `data.core` is not inherited: each
|
|
6652
|
+
language that must cover the list states it.
|
|
6653
|
+
|
|
6654
|
+
`package-build core` is the report. A concept no word serves is never a lint
|
|
6655
|
+
finding; the report lists it so the language can be filled in. See
|
|
6656
|
+
[`package-build core`](../commands.md#package-build-core).
|
|
6657
|
+
|
|
6323
6658
|
#### A language's register, sounds and history
|
|
6324
6659
|
|
|
6325
6660
|
A language note states in frontmatter every fact a check reads about its
|
|
@@ -6360,7 +6695,7 @@ data:
|
|
|
6360
6695
|
- { edge: closeCluster, sounds: [nd, rd] }
|
|
6361
6696
|
- { edge: vowelPair, sounds: [ai, au, ei] }
|
|
6362
6697
|
clusters: { max: 2 }
|
|
6363
|
-
stress: penultimate
|
|
6698
|
+
stress: { two: first, longer: penultimate, mark: acute }
|
|
6364
6699
|
syllables:
|
|
6365
6700
|
onsets: single
|
|
6366
6701
|
codas: [b, d, k, sh]
|
|
@@ -6459,8 +6794,8 @@ note of the package: `{ tag: vylari, language: skill-vylarilng }` makes
|
|
|
6459
6794
|
`exonym:vylari` read the Vylari note. That note's `data.register` must hold a
|
|
6460
6795
|
row of the same name, case folded and NFC, whose `tongue` is the tongue itself,
|
|
6461
6796
|
so a misspelt foreign name is caught where it is listed. A tongue that no entry
|
|
6462
|
-
links to a language note, or that entries link to two, is
|
|
6463
|
-
row's `tongue`; a missing name is
|
|
6797
|
+
links to a language note, or that entries link to two, is an error at the
|
|
6798
|
+
row's `tongue`; a missing name is an error at its `name`:
|
|
6464
6799
|
|
|
6465
6800
|
> `` `Dunharra` is registered as `other:vylari`, but the register of Vylari Language (skill-vylarilng) lists no `vylari` name `Dunharra`; correct the spelling, or register the name there first ``
|
|
6466
6801
|
|
|
@@ -6509,8 +6844,14 @@ rules hold it, each with what it is read as, or nothing.
|
|
|
6509
6844
|
The rest of `sounds` states what a language's own rules read, each from a
|
|
6510
6845
|
closed list where its values are words:
|
|
6511
6846
|
|
|
6512
|
-
- `stress`:
|
|
6513
|
-
`
|
|
6847
|
+
- `stress`: the rule a program reads, `{ two, longer, mark? }`. `two` is the
|
|
6848
|
+
stressed syllable of a word of two syllables, `first` or `last`; `longer` is
|
|
6849
|
+
the stressed syllable of a word of three or more, counted from its end,
|
|
6850
|
+
`antepenultimate`, `penultimate` or `final`; `mark` is the diacritic, `acute`,
|
|
6851
|
+
`grave` or `circumflex`, that marks a stress the rule would not choose and
|
|
6852
|
+
moves it to the syllable it sits on. Syllables are vowel groups, a pair listed
|
|
6853
|
+
in `syllables.vowelPairs` counting as one. A verse fence's `scan=` counts
|
|
6854
|
+
beats by this rule; see [metres](#metres).
|
|
6514
6855
|
- `finals`: the syllable finals, each with what it sounds like, for a language
|
|
6515
6856
|
whose syllables are parsed by them.
|
|
6516
6857
|
- `syllables`: what a syllable opens on (`single`, a single consonant), the
|
|
@@ -6610,49 +6951,55 @@ to take the affix.
|
|
|
6610
6951
|
|
|
6611
6952
|
**An affix states `replaces`** where it takes the place of the stem's close —
|
|
6612
6953
|
`vowel` for any closing vowel, or the letters, as `a` — and is added to the
|
|
6613
|
-
whole stem where it states none. An affix states `
|
|
6954
|
+
whole stem where it states none. An affix states `attachesTo` where it
|
|
6955
|
+
attaches to some word classes and not others, naming each by its base, as
|
|
6956
|
+
`attachesTo: [n, adj]`: a suffix stating `replaces` then derives forms of those
|
|
6957
|
+
classes' words alone, so `-andi` with `attachesTo: [n]` gives _zunelandi_ from
|
|
6958
|
+
the noun _zunel_ and nothing from a verb. Where it states none, the suffix
|
|
6959
|
+
attaches to a word of every class. An affix states `lengthens: true` where the
|
|
6614
6960
|
stem's last vowel lengthens before it, and never beside `replaces`. A language
|
|
6615
6961
|
that keeps vowel harmony gives an affix's form after front vowels in `front`.
|
|
6616
6962
|
|
|
6617
6963
|
Each finding is located at the key at fault:
|
|
6618
6964
|
|
|
6619
|
-
| Finding
|
|
6620
|
-
|
|
|
6621
|
-
| Any of these keys on a skill of another subType, at the key
|
|
6622
|
-
| An unknown, missing or wrongly shaped key in an entry
|
|
6623
|
-
| A value outside its closed list — an `edge`, an element `position` or `kind`, a register `kind`, `
|
|
6624
|
-
| A `sounds` word other than `any`, at the value
|
|
6625
|
-
| A tongue tag that is not lowercase letters and digits, at the tag
|
|
6626
|
-
| A tongue tag stated twice, at the second
|
|
6627
|
-
| A register or letter tongue `tongues` does not declare, at the tag
|
|
6628
|
-
| An edge stated twice, at the second
|
|
6629
|
-
| A sound stated twice in one mutation, at the second
|
|
6630
|
-
| A cluster stated in two groups, at the second
|
|
6631
|
-
| An `innerCluster` edge beside `clusters.groups`, at the edge
|
|
6632
|
-
| A vowel partner keyed by no vowel of the harmony, at the key, or naming no `front` vowel, at the value
|
|
6633
|
-
| A form stated twice in `older`, at the second
|
|
6634
|
-
| A negation `mutation` that `sounds.mutations` does not name, at the value
|
|
6635
|
-
| A negation `particle` or an element `word` that is no word of the language or an ancestor, at the value
|
|
6636
|
-
| An affix's `given` where its `kind` is not `name`, at the key
|
|
6637
|
-
| An affix with `zero: true` beside a `form`, at `zero`, or with neither, at the entry
|
|
6638
|
-
| A naming shape stated twice for one class of name, at the second
|
|
6639
|
-
| A naming shape with neither `syllables` nor `perVowel`, at the entry
|
|
6640
|
-
| A naming range whose `min` is above its `max`, at the range
|
|
6641
|
-
| A naming edge stated twice for one class of name, at the second
|
|
6642
|
-
| A kind of name whose draws are stated twice, at the second
|
|
6643
|
-
| A held-from row that takes an `element` and names no `elements`, at the row
|
|
6644
|
-
| `elements` on a held-from row that takes no element, or `clip` or `joining` on one that takes no name, at the key
|
|
6645
|
-
| A `scope` Address that does not resolve, or a type that is no note type
|
|
6646
|
-
| A tongue `language` or a cognate form's language that is no language note
|
|
6647
|
-
| A register row with neither a `tongue` nor a `kind`, at the row
|
|
6648
|
-
| A register row tagged `other:<tongue>` or `exonym:<tongue>` whose tongue no `data.tongues` entry links to one language note, at the tongue
|
|
6649
|
-
| A register row tagged `other:<tongue>` or `exonym:<tongue>` whose name the tongue's own register does not list under that tongue, at the name
|
|
6650
|
-
| A sound-change set's name stated twice, at the second
|
|
6651
|
-
| A step label stated twice in one set, at the second
|
|
6652
|
-
| A set's `from` or `to` that is no language note, at the value
|
|
6653
|
-
| A frame class that is no word class base, at the class
|
|
6654
|
-
| An affix
|
|
6655
|
-
|
|
|
6965
|
+
| Finding | Severity |
|
|
6966
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
|
|
6967
|
+
| Any of these keys on a skill of another subType, at the key | error |
|
|
6968
|
+
| An unknown, missing or wrongly shaped key in an entry | error |
|
|
6969
|
+
| A value outside its closed list — an `edge`, an element `position` or `kind`, a register `kind`, a stress rule's `two`, `longer` or `mark`, a join's `meeting` or `rule`, a mark's `kind` or `limit`, `onsets`, `neutralAs`, a closing's `usual`, a cluster group's `use`, an affix's `kind` or `given`, a naming class `of`, a draw's `kind` or `elements`, a held-from `takes` or `clip` — at the value | error |
|
|
6970
|
+
| A `sounds` word other than `any`, at the value | error |
|
|
6971
|
+
| A tongue tag that is not lowercase letters and digits, at the tag | error |
|
|
6972
|
+
| A tongue tag stated twice, at the second | error |
|
|
6973
|
+
| A register or letter tongue `tongues` does not declare, at the tag | error |
|
|
6974
|
+
| An edge stated twice, at the second | error |
|
|
6975
|
+
| A sound stated twice in one mutation, at the second | error |
|
|
6976
|
+
| A cluster stated in two groups, at the second | error |
|
|
6977
|
+
| An `innerCluster` edge beside `clusters.groups`, at the edge | error |
|
|
6978
|
+
| A vowel partner keyed by no vowel of the harmony, at the key, or naming no `front` vowel, at the value | error |
|
|
6979
|
+
| A form stated twice in `older`, at the second | error |
|
|
6980
|
+
| A negation `mutation` that `sounds.mutations` does not name, at the value | error |
|
|
6981
|
+
| A negation `particle` or an element `word` that is no word of the language or an ancestor, at the value | error |
|
|
6982
|
+
| An affix's `given` where its `kind` is not `name`, at the key | error |
|
|
6983
|
+
| An affix with `zero: true` beside a `form`, at `zero`, or with neither, at the entry | error |
|
|
6984
|
+
| A naming shape stated twice for one class of name, at the second | error |
|
|
6985
|
+
| A naming shape with neither `syllables` nor `perVowel`, at the entry | error |
|
|
6986
|
+
| A naming range whose `min` is above its `max`, at the range | error |
|
|
6987
|
+
| A naming edge stated twice for one class of name, at the second | error |
|
|
6988
|
+
| A kind of name whose draws are stated twice, at the second | error |
|
|
6989
|
+
| A held-from row that takes an `element` and names no `elements`, at the row | error |
|
|
6990
|
+
| `elements` on a held-from row that takes no element, or `clip` or `joining` on one that takes no name, at the key | error |
|
|
6991
|
+
| A `scope` Address that does not resolve, or a type that is no note type | error |
|
|
6992
|
+
| A tongue `language` or a cognate form's language that is no language note | error |
|
|
6993
|
+
| A register row with neither a `tongue` nor a `kind`, at the row | error |
|
|
6994
|
+
| A register row tagged `other:<tongue>` or `exonym:<tongue>` whose tongue no `data.tongues` entry links to one language note, at the tongue | error |
|
|
6995
|
+
| A register row tagged `other:<tongue>` or `exonym:<tongue>` whose name the tongue's own register does not list under that tongue, at the name | error |
|
|
6996
|
+
| A sound-change set's name stated twice, at the second | error |
|
|
6997
|
+
| A step label stated twice in one set, at the second | error |
|
|
6998
|
+
| A set's `from` or `to` that is no language note, at the value | error |
|
|
6999
|
+
| A frame class that is no word class base, at the class | error |
|
|
7000
|
+
| An affix's `attachesTo` that names no class, at the key, or a class that is no word class base or one named twice, at the class | error |
|
|
7001
|
+
| An affix stating both `replaces` and `lengthens: true`, at `lengthens` | error |
|
|
7002
|
+
| A calling-name closing with both or neither of `form` and `doubled` | error |
|
|
6656
7003
|
|
|
6657
7004
|
A fence sets each table back from its relation:
|
|
6658
7005
|
|
|
@@ -7841,25 +8188,37 @@ Content prepared to be played — a situation with its cast, places, and possibl
|
|
|
7841
8188
|
- howto: A task with an outcome, written as the steps that reach it.
|
|
7842
8189
|
- concept: An explanation of how something works and why it is shaped that way, read to understand rather than to follow.
|
|
7843
8190
|
- settingguide: A culture's guide to the setting, which names its culture in `data.culture`. It orients a reader to a setting or region, bringing its places, peoples, institutions, and daily life into one usable frame with links to detailed notes.
|
|
7844
|
-
|
|
7845
|
-
|
|
7846
|
-
|
|
|
7847
|
-
|
|
|
7848
|
-
| `
|
|
7849
|
-
| `
|
|
7850
|
-
| `
|
|
7851
|
-
| `
|
|
7852
|
-
| `
|
|
7853
|
-
| `
|
|
7854
|
-
| `
|
|
7855
|
-
| `map
|
|
7856
|
-
| `map.
|
|
7857
|
-
| `map.
|
|
7858
|
-
| `map.
|
|
7859
|
-
| `map.
|
|
7860
|
-
| `map.
|
|
7861
|
-
| `map.
|
|
7862
|
-
| `map.
|
|
8191
|
+
- post: A blog post, which states the day it was published in `data.date` and may name its writer in `data.author`. A site whose `site.feed` names a section lists its posts there, newest first, and feeds them as Atom.
|
|
8192
|
+
|
|
8193
|
+
| `data` property | Values | Description |
|
|
8194
|
+
| --------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
8195
|
+
| `culture` | `Address` | `settingguide` only, and required there: the culture the guide introduces, naming a lore note with `subType: culture` |
|
|
8196
|
+
| `concepts` | list of `{ id, gloss, group }` | A core vocabulary's concept list, any subType. See [the core vocabulary](#the-core-vocabulary) |
|
|
8197
|
+
| `date` | `YYYY-MM-DD` | `post` only, and required there: the day the post was published |
|
|
8198
|
+
| `author` | string | `post` only: who wrote the post; a post naming none carries the site's byline, the first entry of `authors` |
|
|
8199
|
+
| `concepts[].id` | string | Required: lowercase letters, digits and `-`, unique in the package |
|
|
8200
|
+
| `concepts[].gloss` | string | Required: what the concept means, in brief |
|
|
8201
|
+
| `concepts[].group` | string | Required: the group the report lists the concept under |
|
|
8202
|
+
| `map` | `{ name, vowels?, fonts, rows }` | A mapping, which text marked `map=` with its `name` is rewritten by; any subType. See [mapping notes](#mapping-notes) |
|
|
8203
|
+
| `map.name` | string | Required: what `map=` names it by, lowercase letters, digits and `-`, unique in the index |
|
|
8204
|
+
| `map.vowels` | string | The characters `before: vowel` reads as vowels |
|
|
8205
|
+
| `map.rows` | list of `[from, to]` or `{ from, to, before?, at? }` | Required: the rewrites, in authored order |
|
|
8206
|
+
| `map.rows[].from` | string of one or more characters | Required in a map row: the characters it matches |
|
|
8207
|
+
| `map.rows[].to` | string, which may be empty | Required in a map row: what it writes in their place |
|
|
8208
|
+
| `map.rows[].before` | `vowel \| consonant` | What must follow the match |
|
|
8209
|
+
| `map.rows[].at` | `start \| end` | Where the match must sit |
|
|
8210
|
+
| `map.fonts` | list of `{ font, rows? }` | Required, at least one: the faces the map is drawn in |
|
|
8211
|
+
| `map.fonts[].font` | an installed face's slug | Required: the face, as `font=` names it; not `mono`, `serif` or `sans` |
|
|
8212
|
+
| `map.fonts[].rows` | list of `[from, to]` or `{ from, to, before?, at? }` | Rows for this face alone, tried before the shared `rows` |
|
|
8213
|
+
| `map.fonts[].rows[].from` | string of one or more characters | Required in a map row: the characters it matches |
|
|
8214
|
+
| `map.fonts[].rows[].to` | string, which may be empty | Required in a map row: what it writes in their place |
|
|
8215
|
+
| `map.fonts[].rows[].before` | `vowel \| consonant` | What must follow the match |
|
|
8216
|
+
| `map.fonts[].rows[].at` | `start \| end` | Where the match must sit |
|
|
8217
|
+
| `metres` | `{ name, beats, kind }[]` | The metres a verse fence's `scan=` names; any subType. See [metres](#metres) |
|
|
8218
|
+
| `metres[].name` | string | Required: what `scan=` names it by, lowercase letters, digits and `-`, unique in the package |
|
|
8219
|
+
| `metres[].beats` | `integer`, required | The beats of one line, above zero |
|
|
8220
|
+
| `metres[].kind` | `accentual` | Required: how the beats are counted |
|
|
8221
|
+
| `map.logographic` | `true` | The script writes meanings: a run's words are written by the lexicon alone, and the rows write only the text between them |
|
|
7863
8222
|
|
|
7864
8223
|
A setting guide introduces one culture's view of the setting, so it names that
|
|
7865
8224
|
culture, and a `doc` of any other `subType` has no culture of its own to name.
|
|
@@ -7911,8 +8270,7 @@ site is its homepage and its pages, and nothing is generated between them.
|
|
|
7911
8270
|
|
|
7912
8271
|
There is no landing page and no section. A section appears in **no address**: a
|
|
7913
8272
|
page publishes at `/<package>/<type>-<shortcode>/`, which names no directory. A
|
|
7914
|
-
section is
|
|
7915
|
-
carry one.
|
|
8273
|
+
section is a content directory, and the note format does not carry one.
|
|
7916
8274
|
|
|
7917
8275
|
So a `doc`'s `subType` is a **genre** and nothing else, closed to the values
|
|
7918
8276
|
above.
|