@heroiclands/package-build 23.12.6 → 23.12.8
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 +18 -0
- package/assets/styles/content-base.css +25 -0
- package/bin/content-commands.mjs +264 -3
- package/bin/package-build.mjs +25 -0
- package/content-config.mjs +72 -0
- package/docs/api.md +10 -9
- package/docs/authoring/assets.md +1 -1
- package/docs/authoring/links-and-markup.md +439 -47
- package/docs/commands.md +137 -3
- package/docs/configuration.md +73 -3
- package/docs/content-format.md +3 -1
- package/docs/guides/book.md +11 -0
- package/docs/guides/module-project.md +16 -0
- package/docs/guides/site.md +19 -0
- package/docs/reference/format-details.md +378 -6
- package/docs/reference/note-types.md +36 -11
- package/e2e.mjs +1 -1
- package/engine/asset-shipping.mjs +22 -8
- package/engine/base-compiler.mjs +2 -0
- package/engine/bundles.mjs +7 -2
- package/engine/compile-corpus.mjs +3 -1
- package/engine/content-charset.mjs +21 -2
- package/engine/content-format.yaml +1 -0
- package/engine/content-index.mjs +12 -0
- package/engine/content-poetry.mjs +22 -4
- package/engine/content-scripts.mjs +1219 -0
- package/engine/content-session.mjs +2 -0
- package/engine/data-keys.mjs +5 -1
- package/engine/dictionary-layout.mjs +18 -12
- package/engine/dictionary-rows.mjs +11 -2
- package/engine/helpers.mjs +8 -2
- package/engine/index-records.mjs +1 -0
- package/engine/journals.mjs +14 -3
- package/engine/language-data.mjs +137 -1
- package/engine/language-tag.mjs +103 -0
- package/engine/language-terms.mjs +16 -4
- package/engine/map-lexicon.mjs +762 -0
- package/engine/markup-validation.mjs +17 -3
- package/engine/names.mjs +1 -1
- package/engine/note-vocabulary.mjs +113 -0
- package/engine/pdf-build.mjs +28 -10
- package/engine/pdf-render.mjs +116 -11
- package/engine/run-rows.mjs +119 -0
- package/engine/run-words.mjs +266 -0
- package/engine/scenes.mjs +1 -0
- package/engine/script-font-delivery.mjs +321 -0
- package/engine/script-fonts.mjs +172 -0
- package/engine/site-build.mjs +10 -3
- package/engine/site-config.mjs +5 -0
- package/engine/site-root.mjs +19 -5
- package/engine/sql-tables.mjs +111 -1
- package/engine/text-maps.mjs +607 -0
- package/engine/verb-pattern.mjs +99 -0
- package/engine/word-pattern.mjs +27 -0
- package/engine/word-rows.mjs +8 -2
- package/engine/word-terms.mjs +44 -0
- package/hugo-theme/layouts/_default/baseof.html +3 -0
- package/hugo-theme/static/css/style.css +10 -0
- package/manifest.mjs +9 -1
- package/package.json +2 -2
- package/types/content-config.d.mts +26 -0
- package/types/e2e.d.mts +2 -2
- package/types/engine/address-fields.d.mts +1 -1
- package/types/engine/address-values.d.mts +1 -1
- package/types/engine/asset-shipping.d.mts +5 -0
- package/types/engine/compile-corpus.d.mts +2 -1
- package/types/engine/content-format-check.d.mts +1 -1
- package/types/engine/content-index.d.mts +11 -3
- package/types/engine/content-poetry.d.mts +7 -0
- package/types/engine/content-scripts.d.mts +226 -0
- package/types/engine/data-keys.d.mts +2 -2
- package/types/engine/dictionary-rows.d.mts +15 -0
- package/types/engine/helpers.d.mts +5 -1
- package/types/engine/journals.d.mts +7 -2
- package/types/engine/language-data.d.mts +2 -0
- package/types/engine/language-tag.d.mts +8 -0
- package/types/engine/language-terms.d.mts +2 -1
- package/types/engine/map-lexicon.d.mts +274 -0
- package/types/engine/markup-validation.d.mts +7 -2
- package/types/engine/note-vocabulary.d.mts +1 -1
- package/types/engine/pdf-build.d.mts +26 -3
- package/types/engine/pdf-coverage.d.mts +1 -1
- package/types/engine/pdf-render.d.mts +17 -2
- package/types/engine/run-rows.d.mts +89 -0
- package/types/engine/run-words.d.mts +86 -0
- package/types/engine/script-font-delivery.d.mts +134 -0
- package/types/engine/script-fonts.d.mts +168 -0
- package/types/engine/site-build.d.mts +2 -1
- package/types/engine/site-root.d.mts +11 -3
- package/types/engine/text-maps.d.mts +175 -0
- package/types/engine/verb-pattern.d.mts +65 -0
- package/types/engine/word-pattern.d.mts +13 -0
- package/types/engine/word-terms.d.mts +6 -0
- package/types/release.d.mts +1 -1
|
@@ -1976,6 +1976,249 @@ subtypes conflict. One package advisory contains both groups and is located
|
|
|
1976
1976
|
at the earliest reported use. Advisory findings preserve a successful lint
|
|
1977
1977
|
exit status. Supplied-value errors prevent publication and compilation.
|
|
1978
1978
|
|
|
1979
|
+
#### Text marked with a language, a font or a map
|
|
1980
|
+
|
|
1981
|
+
`lang=`, `font=` and `map=` on a span, a generic div or a poetry fence are read
|
|
1982
|
+
by the build and never written through as ordinary attributes. Each is
|
|
1983
|
+
optional, and a run inside a div or a fence inherits the keys the div or fence
|
|
1984
|
+
states, its own keys overriding them. On a named block the three keys are
|
|
1985
|
+
errors.
|
|
1986
|
+
|
|
1987
|
+
- **`lang=`** is a name declared in [`languages`](../configuration.md#languages),
|
|
1988
|
+
and otherwise a BCP 47 tag checked for its form alone. It gives the language
|
|
1989
|
+
tag and changes nothing else.
|
|
1990
|
+
- **`font=`** is a face of the installed `@heroiclands/fonts`, named by its
|
|
1991
|
+
`fonts.json` class without `hl-`, or `mono`, `serif` or `sans`.
|
|
1992
|
+
- **`map=`** is the `data.map.name` of a [mapping note](#mapping-notes). The
|
|
1993
|
+
text is rewritten by the map before it is set; without `map=` it is set as
|
|
1994
|
+
typed. With `font=`, the face is one the map lists in `fonts`, and its own
|
|
1995
|
+
rows come first.
|
|
1996
|
+
- **`lang=` with `map=`** reads the language's lexicon first, when
|
|
1997
|
+
[`languages.<name>.note`](../configuration.md#languages) names its language
|
|
1998
|
+
note: see [a map reads the dictionary first](#a-map-reads-the-dictionary-first).
|
|
1999
|
+
|
|
2000
|
+
**A face draws the code points its `fonts.json` entry lists in `codepoints`,
|
|
2001
|
+
and whitespace.** After the map, any other character in a run set in a face is
|
|
2002
|
+
an error, located at the source character it came from; through a map, at the
|
|
2003
|
+
start of the matched `from`. Each character is reported once per run. The
|
|
2004
|
+
generic families are not checked. `input`, `layout` and `encoding` in
|
|
2005
|
+
`fonts.json` are not read.
|
|
2006
|
+
|
|
2007
|
+
Text marked with `font=` or `map=`, or with a declared language, is plain: a
|
|
2008
|
+
span or a verse holds no emphasis, link, image, footnote, wikilink, code or
|
|
2009
|
+
HTML, and no span but a marked one inside a div or a fence; a div holds
|
|
2010
|
+
paragraphs and line breaks only. The text is read as written, so `[`, `]`, `"`,
|
|
2011
|
+
`<<`, `>>`, `!` and `@#$%^&` are characters, and a bracket pair is markup only
|
|
2012
|
+
when `(`, `{` or a second `[` makes it a link, a span or a wikilink. Text marked
|
|
2013
|
+
with a real language's tag alone keeps its Markdown. See
|
|
2014
|
+
[marking language, font and mapping](../authoring/links-and-markup.md#marking-language-font-and-mapping).
|
|
2015
|
+
|
|
2016
|
+
Each own-note metadata record carries `runs` in source order, an empty array
|
|
2017
|
+
when the body marks nothing. Every entry has exactly `kind` (`span`, `block` or
|
|
2018
|
+
`poetry`), `lang`, `tag`, `font`, `map`, `line` and `column`: `lang`, `font` and
|
|
2019
|
+
`map` as written, its own or inherited, `tag` the BCP 47 tag `lang` resolves
|
|
2020
|
+
to, each `null` when absent, and the position of the span's `[`, the div's
|
|
2021
|
+
`:::` or the fence's opening. Every value is a string or a number and none is a
|
|
2022
|
+
key, so tags that differ only in case are separate values. This is derived
|
|
2023
|
+
metadata, not frontmatter. The [`runs` relation](#content-tables) flattens
|
|
2024
|
+
these entries with their containing NOTE Address.
|
|
2025
|
+
|
|
2026
|
+
#### Mapping notes
|
|
2027
|
+
|
|
2028
|
+
A `doc` note's `data.map` is a mapping: rows that rewrite sequences of
|
|
2029
|
+
characters into characters, which a run marked `map=` with its `name` is
|
|
2030
|
+
rewritten by before it is set. A mapping belongs to a script, and serves every
|
|
2031
|
+
language written in it.
|
|
2032
|
+
|
|
2033
|
+
```yaml
|
|
2034
|
+
data:
|
|
2035
|
+
map:
|
|
2036
|
+
name: semaron
|
|
2037
|
+
vowels: "aeiouAEIOU"
|
|
2038
|
+
fonts:
|
|
2039
|
+
- font: semaron-kuriale
|
|
2040
|
+
- font: semaron-carved
|
|
2041
|
+
rows:
|
|
2042
|
+
- [th, "\U000F0251"]
|
|
2043
|
+
rows:
|
|
2044
|
+
- [a, "\U000F0230"]
|
|
2045
|
+
- [th, "\U000F0250"]
|
|
2046
|
+
- { from: y, to: "\U000F0246", before: consonant }
|
|
2047
|
+
```
|
|
2048
|
+
|
|
2049
|
+
| Key | Shape | Meaning |
|
|
2050
|
+
| -------- | ---------------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
2051
|
+
| `name` | string, required | What `map=` names it by: lowercase letters, digits and `-`, unique in the index |
|
|
2052
|
+
| `vowels` | string | The characters `before: vowel` reads as vowels |
|
|
2053
|
+
| `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 |
|
|
2054
|
+
| `rows` | list of `[from, to]` or `{ from, to, before?, at? }` | The shared rewrites, in authored order |
|
|
2055
|
+
|
|
2056
|
+
**A face's own rows come first.** A run in a face tries that face's `rows`,
|
|
2057
|
+
the longest match among them, and only where none matches the shared `rows`; a
|
|
2058
|
+
face listed with no `rows` uses the shared rows alone, and a run with no
|
|
2059
|
+
`font=` uses them too. Rows take the same shapes and conditions in both places,
|
|
2060
|
+
and `vowels` serves them all. A run whose `font=` is not one of the map's
|
|
2061
|
+
`fonts` is an error at its `map=`:
|
|
2062
|
+
|
|
2063
|
+
> `` `thuravark-carved` is not a font of the map `semaron`; it is for `semaron-kuriale` and `semaron-carved` ``
|
|
2064
|
+
|
|
2065
|
+
A row's `from` is one or more characters and its `to` any number, none
|
|
2066
|
+
included, each a whole code point; a code point above U+FFFF is written in YAML
|
|
2067
|
+
with the eight-digit escape, as `"\U000F0200"`. The longest match wins; among rows of one length, a row with a
|
|
2068
|
+
condition that holds comes before a row with none, and otherwise the earlier
|
|
2069
|
+
row wins. A row whose condition fails is skipped, and a character no row
|
|
2070
|
+
matches passes through unchanged.
|
|
2071
|
+
|
|
2072
|
+
| Condition | Holds when |
|
|
2073
|
+
| ------------------- | ---------------------------------------------------------------------------- |
|
|
2074
|
+
| `before: vowel` | the next character is one of `vowels` |
|
|
2075
|
+
| `before: consonant` | the next character is any other letter |
|
|
2076
|
+
| `at: start` | the match is the run's first character, or follows whitespace or punctuation |
|
|
2077
|
+
| `at: end` | the match ends the run, or is followed by whitespace or punctuation |
|
|
2078
|
+
|
|
2079
|
+
Neither `before` condition holds at the end of the text. The note's body is
|
|
2080
|
+
for a reader: nothing reads it. Each row is a row of the
|
|
2081
|
+
[`maps` relation](#content-tables), never a struct key, so `A` and `a` are two
|
|
2082
|
+
rows; a face's own rows carry its slug in `font`.
|
|
2083
|
+
|
|
2084
|
+
The data-key check holds every key of `data.map` and of each row to the table
|
|
2085
|
+
under [`type: doc`](#type-doc), at its own line and column:
|
|
2086
|
+
|
|
2087
|
+
> `` `data.map.rows[2]` should be `[from, to]` or `{ from, to, before?, at? }`, but reads "a" ``
|
|
2088
|
+
|
|
2089
|
+
> `` `data.map.rows[3]` must state `to` — a string, which may be empty ``
|
|
2090
|
+
|
|
2091
|
+
> `` "when" is not a key of `data.map.rows[5]`; it takes only `from`, `to`, `before`, `at` ``
|
|
2092
|
+
|
|
2093
|
+
> `` `data.map.rows[6].before` should be `vowel` or `consonant`, but reads "liquid" ``
|
|
2094
|
+
|
|
2095
|
+
The map's own check reports the rest, each at its key:
|
|
2096
|
+
|
|
2097
|
+
> `` `data.map.name` is `Vyl_Semaron`; a map's name is lowercase letters, digits and `-` ``
|
|
2098
|
+
|
|
2099
|
+
> `` `data.map.name` is `vyl-semaron`, which Lore/Other.md also declares; a map's name is unique ``
|
|
2100
|
+
|
|
2101
|
+
> `` `data.map.rows[0]` is a list, and a row written as a list is two strings, `[from, to]` ``
|
|
2102
|
+
|
|
2103
|
+
> `` `data.map.rows[1]` has an empty `from`; a row matches one or more characters ``
|
|
2104
|
+
|
|
2105
|
+
> `` `data.map.rows[4]` has `before: consonant`, and the map states no `vowels` to read it by ``
|
|
2106
|
+
|
|
2107
|
+
> `` `data.map.fonts` is empty; a map lists each face it is drawn in ``
|
|
2108
|
+
|
|
2109
|
+
> `` `data.map.fonts[0].font` is `mono`, a generic family; a map lists the faces it is drawn in ``
|
|
2110
|
+
|
|
2111
|
+
The lint checks the listed faces against the installed `@heroiclands/fonts`,
|
|
2112
|
+
each at the entry or the row at fault. Every listed face draws every code point
|
|
2113
|
+
its own rows write, every code point the shared rows it can reach write (a
|
|
2114
|
+
shared row is out of a face's reach where a plain row of the face's own matches
|
|
2115
|
+
the start of its `from`), and every code point of the native forms that apply
|
|
2116
|
+
to it:
|
|
2117
|
+
|
|
2118
|
+
> `` `semaron-kurale` is not a font: `data.map.fonts[1].font` names an installed face; did you mean `semaron-kuriale`? ``
|
|
2119
|
+
|
|
2120
|
+
> `` `data.map.fonts[2]` lists the font `semaron-kuriale` a second time; the first is `data.map.fonts[0]` ``
|
|
2121
|
+
|
|
2122
|
+
> `` `data.map.fonts[1].rows[0]` writes U+F0251, which the font `semaron-carved` does not draw ``
|
|
2123
|
+
|
|
2124
|
+
> `` `data.map.rows[5]` writes U+F0239, which the font `semaron-kuriale`, listed in `data.map.fonts`, does not draw ``
|
|
2125
|
+
|
|
2126
|
+
A row with a fault is left out of the map; the rest apply.
|
|
2127
|
+
|
|
2128
|
+
#### A map reads the dictionary first
|
|
2129
|
+
|
|
2130
|
+
The sound rules belong to the script, and the exceptions to the language. A
|
|
2131
|
+
word of a [language's words](#a-languages-words) states a `native` form for a
|
|
2132
|
+
map only where the map's rows would spell it differently:
|
|
2133
|
+
|
|
2134
|
+
```yaml
|
|
2135
|
+
words:
|
|
2136
|
+
- form: zaron
|
|
2137
|
+
class: n
|
|
2138
|
+
field: "Law, the court and the written act"
|
|
2139
|
+
gloss: an oath
|
|
2140
|
+
native:
|
|
2141
|
+
- { map: semaron, text: "\U000F024F\U000F0230\U000F023F\U000F023C" }
|
|
2142
|
+
- { map: semaron, font: semaron-carved, text: "\U000F024F\U000F0230\U000F023C" }
|
|
2143
|
+
```
|
|
2144
|
+
|
|
2145
|
+
| Key | Shape | Meaning |
|
|
2146
|
+
| ------ | ---------------- | -------------------------------------------------------------------------------------------- |
|
|
2147
|
+
| `map` | string, required | The `data.map.name` the native form is written for |
|
|
2148
|
+
| `font` | string | The one face it is for; unstated, every face the map lists, and a face's own form wins there |
|
|
2149
|
+
| `text` | string, required | The word as the script writes it, in the map's characters |
|
|
2150
|
+
|
|
2151
|
+
A run marked `lang=` with a declared language whose
|
|
2152
|
+
[`note`](../configuration.md#languages) names its language note, and `map=`,
|
|
2153
|
+
is written word by word:
|
|
2154
|
+
|
|
2155
|
+
1. **A word** is a maximal run of letters, combining marks and digits, an
|
|
2156
|
+
apostrophe (`'` or `’`), a hyphen or an en dash joining two such runs into
|
|
2157
|
+
one word. Everything between words is spelled by the rows.
|
|
2158
|
+
2. **The word is looked up** as written, and then in lowercase. A word found is
|
|
2159
|
+
written by its native form for the run's map in the run's face, else by its
|
|
2160
|
+
native form for the map with no `font`, as one piece.
|
|
2161
|
+
3. **A word found only in lowercase and written with a capital** takes its
|
|
2162
|
+
capital from the rows: the rows map the word's first sound as written and in
|
|
2163
|
+
lowercase, and where the native form begins with what the lowercase gives,
|
|
2164
|
+
that beginning is replaced by what the capital gives. A native form that
|
|
2165
|
+
does not begin as the rows begin the word cannot be capitalised by them, and
|
|
2166
|
+
the word is an error at its place in the run. The remedy is to state the
|
|
2167
|
+
capitalised word as a word of its own with its native form, which the
|
|
2168
|
+
lookup as written finds first.
|
|
2169
|
+
4. **Every other word is spelled by the rows**, its derived forms included: a
|
|
2170
|
+
plural or a verb ending of an exception word is a different word, and the
|
|
2171
|
+
rows spell it.
|
|
2172
|
+
|
|
2173
|
+
A run with `map=` and no `lang=`, a `lang=` that is a bare BCP 47 tag, and a
|
|
2174
|
+
declared language with no `note` are spelled by the rows alone. A character the
|
|
2175
|
+
face does not draw inside a word written by its native form is an error at the
|
|
2176
|
+
word's start:
|
|
2177
|
+
|
|
2178
|
+
> `` `Orlan` is capitalised, and the native form the lexicon of `vyl` states for `orlan` under the map `semaron` does not begin as the rows spell its first letter, so the rows cannot capitalise it; state `Orlan` as a word of its own with its native form ``
|
|
2179
|
+
|
|
2180
|
+
> `` `zaron` is written U+F024F by the lexicon of `vyl` for the map `semaron`, which the font `semaron-kuriale` does not draw ``
|
|
2181
|
+
|
|
2182
|
+
**Every word of such a run is a word of the language**, case folded: a
|
|
2183
|
+
`data.words[].form`, a word of a name the language note's own `data.register`
|
|
2184
|
+
lists under a `tongue` other than `translation`, or a form one rule derives from a lexicon form —
|
|
2185
|
+
the `data.grammar.plural` plural of a noun or its own `plural`, a verb's form
|
|
2186
|
+
with one ending of `data.grammar.verbs.persons` (in place of a closing
|
|
2187
|
+
`data.grammar.verbs.replaces` where one is stated), or a suffix of `data.affixes`
|
|
2188
|
+
stating `replaces` (`vowel` takes the place of a closing `a`, `e`, `i`, `o` or
|
|
2189
|
+
`u`, accented or not; letters take the place of those letters; a stem closing
|
|
2190
|
+
otherwise takes the suffix whole). A compound not known whole is checked part by
|
|
2191
|
+
part at its hyphens and en dashes. Any other word is an error at its first
|
|
2192
|
+
character, once per run; see
|
|
2193
|
+
[a mapped run's words](../authoring/links-and-markup.md#a-mapped-runs-words):
|
|
2194
|
+
|
|
2195
|
+
> `` `thiruthrimar` is not a word of the `vyl` lexicon, a registered name, or a regular form of one; coin it in the lexicon (or register the name) first ``
|
|
2196
|
+
|
|
2197
|
+
Each native form is a row of the [`natives` relation](#content-tables), never a
|
|
2198
|
+
struct key, so forms that differ only in case are two rows. The data-key check
|
|
2199
|
+
holds each entry to its three keys; the lint checks the rest, each at the entry
|
|
2200
|
+
or the key at fault:
|
|
2201
|
+
|
|
2202
|
+
> `` `data.words[0].native[0].map` is `semron`, which is not a map: a native form names the `data.map.name` of a mapping note; did you mean `semaron`? ``
|
|
2203
|
+
|
|
2204
|
+
> `` `data.words[0].native[1].font` is `thuravark-carved`, which is not a font of the map `semaron`; it is for `semaron-kuriale` and `semaron-carved` ``
|
|
2205
|
+
|
|
2206
|
+
> `` `data.words[0].native[2]` states a second native form for the map `semaron`; the first is `data.words[0].native[0]` ``
|
|
2207
|
+
|
|
2208
|
+
> `` `data.words[0].native[0]` states what the rows already give: the map `semaron` spells `zaron` so in the font `semaron-kuriale`; a native form is stated only where the rows spell the word differently ``
|
|
2209
|
+
|
|
2210
|
+
> `` `data.words[0].native[0]` holds U+F024F, which the font `semaron-kuriale`, listed in the map `semaron`, does not draw ``
|
|
2211
|
+
|
|
2212
|
+
The "states what the rows already give" finding compares a native form stated
|
|
2213
|
+
for a face with that face's rows, and one stated for no face with every listed
|
|
2214
|
+
face's rows: it is redundant only where every face's rows give it. This is what
|
|
2215
|
+
keeps a lexicon to its exceptions.
|
|
2216
|
+
|
|
2217
|
+
`package-build transliterate` maps a passage, and `package-build lexicon` lists
|
|
2218
|
+
every word with its native form, through the same code as the build: see
|
|
2219
|
+
[`transliterate`](../commands.md#package-build-transliterate-map-text) and
|
|
2220
|
+
[`lexicon`](../commands.md#package-build-lexicon-language).
|
|
2221
|
+
|
|
1979
2222
|
### Assets are types
|
|
1980
2223
|
|
|
1981
2224
|
`icon`, `image` and `audio` are types in the type vocabulary, and an address
|
|
@@ -2250,6 +2493,12 @@ layout serves Foundry (`modules/thalorna/images/thorn.webp`), the website's CDN
|
|
|
2250
2493
|
(`<cdn base>/thalorna/images/thorn.webp`), and every location a world copies
|
|
2251
2494
|
the pictures to.
|
|
2252
2495
|
|
|
2496
|
+
**A row's files are kept.** Staging the pictures writes them beside whatever a
|
|
2497
|
+
`packageBuild.assets` row copied under `icons/` or `images/`, such as a
|
|
2498
|
+
subdirectory of other art, and removes none of it. A picture whose flat path is
|
|
2499
|
+
already a file a row staged is an error, and the row's file stays. Clearing an
|
|
2500
|
+
earlier build's pictures is the stage reset's work.
|
|
2501
|
+
|
|
2253
2502
|
**The package's asset set**, `asset-sets/default.json` under the package
|
|
2254
2503
|
root, lists what it ships. The name is fixed, so a world always finds the
|
|
2255
2504
|
package's own set there:
|
|
@@ -3149,6 +3398,69 @@ metadata supplies `names` in that package's SQL schema. Public queries exclude
|
|
|
3149
3398
|
GM-only owners; all/native contexts retain them. Only authored occurrences
|
|
3150
3399
|
contribute rows, so generated queries and sections add no further names.
|
|
3151
3400
|
|
|
3401
|
+
**`runs`** is one row per span, generic div and poetry fence an authored note
|
|
3402
|
+
body marks with `lang=`, `font=` or `map=`. Each row has these columns,
|
|
3403
|
+
including on an empty relation:
|
|
3404
|
+
|
|
3405
|
+
| Column | SQL type | Meaning |
|
|
3406
|
+
| -------- | --------- | -------------------------------------------------------------------------------------------- |
|
|
3407
|
+
| `owner` | `VARCHAR` | Containing authored page's canonical NOTE Address, or `NULL` when the record has no Address. |
|
|
3408
|
+
| `kind` | `VARCHAR` | `span`, `block` or `poetry`. |
|
|
3409
|
+
| `lang` | `VARCHAR` | The language as written, its own or inherited, or `NULL`. |
|
|
3410
|
+
| `tag` | `VARCHAR` | The BCP 47 tag `lang` resolves to, or `NULL` when it resolves to none. |
|
|
3411
|
+
| `font` | `VARCHAR` | The font as written, its own or inherited, or `NULL`. |
|
|
3412
|
+
| `map` | `VARCHAR` | The map as written, its own or inherited, or `NULL`. |
|
|
3413
|
+
| `line` | `BIGINT` | Original 1-based source line of the span's `[`, the div's `:::` or the fence's opening. |
|
|
3414
|
+
| `column` | `BIGINT` | Original 1-based UTF-16 source column there. |
|
|
3415
|
+
|
|
3416
|
+
```sql
|
|
3417
|
+
SELECT owner, kind, tag, line, "column"
|
|
3418
|
+
FROM runs
|
|
3419
|
+
WHERE font = 'semaron-kuriale'
|
|
3420
|
+
ORDER BY owner, line, "column"
|
|
3421
|
+
```
|
|
3422
|
+
|
|
3423
|
+
**`maps`** is one row per well-formed row of a [mapping note](#mapping-notes)'s
|
|
3424
|
+
`data.map.rows` and of each face's own `rows`. Each row has these columns,
|
|
3425
|
+
including on an empty relation:
|
|
3426
|
+
|
|
3427
|
+
| Column | SQL type | Meaning |
|
|
3428
|
+
| -------- | --------- | ----------------------------------------------------------- |
|
|
3429
|
+
| `owner` | `VARCHAR` | The mapping note's canonical NOTE Address. |
|
|
3430
|
+
| `name` | `VARCHAR` | The map's `name`. |
|
|
3431
|
+
| `font` | `VARCHAR` | The face whose own row it is; `NULL` for a shared row. |
|
|
3432
|
+
| `row` | `BIGINT` | The row's 1-based place in its `rows`. |
|
|
3433
|
+
| `from` | `VARCHAR` | The characters it matches. |
|
|
3434
|
+
| `to` | `VARCHAR` | What it writes; empty for a row that drops what it matches. |
|
|
3435
|
+
| `before` | `VARCHAR` | `vowel`, `consonant` or `NULL`. |
|
|
3436
|
+
| `at` | `VARCHAR` | `start`, `end` or `NULL`. |
|
|
3437
|
+
|
|
3438
|
+
`from`, `to` and `at` are SQL keywords, so a query quotes them:
|
|
3439
|
+
|
|
3440
|
+
```sql
|
|
3441
|
+
SELECT "row", "from", "to", before FROM maps WHERE name = 'vyl-semaron' ORDER BY "row"
|
|
3442
|
+
```
|
|
3443
|
+
|
|
3444
|
+
**`natives`** is one row per entry of a word's `native` on every
|
|
3445
|
+
[language note](#a-map-reads-the-dictionary-first). Each row has these columns,
|
|
3446
|
+
including on an empty relation:
|
|
3447
|
+
|
|
3448
|
+
| Column | SQL type | Meaning |
|
|
3449
|
+
| ---------- | --------- | ---------------------------------------------------------------- |
|
|
3450
|
+
| `language` | `VARCHAR` | The language note's Address, as `words.language` holds it. |
|
|
3451
|
+
| `word` | `BIGINT` | The word's place in `data.words`, from `0`, as `words.position`. |
|
|
3452
|
+
| `form` | `VARCHAR` | The word's `form`. |
|
|
3453
|
+
| `native` | `BIGINT` | The entry's place in the word's `native`, from `0`. |
|
|
3454
|
+
| `map` | `VARCHAR` | The map the form is written for. |
|
|
3455
|
+
| `font` | `VARCHAR` | The one face it is for; `NULL` for every face the map lists. |
|
|
3456
|
+
| `text` | `VARCHAR` | The word as the script writes it; a value, so case is kept. |
|
|
3457
|
+
|
|
3458
|
+
The native form of a word with no entry is computed on demand, by the map's
|
|
3459
|
+
rows: `package-build lexicon` lists every word with it.
|
|
3460
|
+
|
|
3461
|
+
Declared dependency metadata supplies `runs`, `maps` and `natives` in that
|
|
3462
|
+
package's SQL schema, and public queries exclude GM-only owners, as for `names`.
|
|
3463
|
+
|
|
3152
3464
|
**`language_lineage`** is one row per language note and each language it
|
|
3153
3465
|
inherits words from through [`data.family`](#a-languages-words): `language`,
|
|
3154
3466
|
`ancestor` and `depth`, with the language itself at depth `0`, its parent at
|
|
@@ -5574,15 +5886,16 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5574
5886
|
| `grammar.plural` | `{ ending, becomes }[]` | Literal suffix replacements in authored order; the first match wins |
|
|
5575
5887
|
| `grammar.plural[].ending` | `string`, required, may be empty | Bare suffix to replace; empty matches every noun |
|
|
5576
5888
|
| `grammar.plural[].becomes` | `string`, required, may be empty | Bare replacement; empty deletes the matching suffix |
|
|
5577
|
-
| `grammar.verbs` | `{ invariant: true }` or `{ persons: { I, you, heShe, we, youAll, they } }`
|
|
5889
|
+
| `grammar.verbs` | `{ invariant: true }` or `{ persons: { I, you, heShe, we, youAll, they }, replaces? }` | One regular present pattern, printed once at the dictionary head |
|
|
5578
5890
|
| `grammar.verbs.invariant` | `true` | Verbs do not change; excludes `persons` |
|
|
5579
|
-
| `grammar.verbs.persons` | a map of all six ending strings | Each ending is added to the citation form
|
|
5891
|
+
| `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` |
|
|
5580
5892
|
| `grammar.verbs.persons.I` | `string`, required, may be empty | Ending for I |
|
|
5581
5893
|
| `grammar.verbs.persons.you` | `string`, required, may be empty | Ending for you |
|
|
5582
5894
|
| `grammar.verbs.persons.heShe` | `string`, required, may be empty | Ending for he/she |
|
|
5583
5895
|
| `grammar.verbs.persons.we` | `string`, required, may be empty | Ending for we |
|
|
5584
5896
|
| `grammar.verbs.persons.youAll` | `string`, required, may be empty | Ending for you all |
|
|
5585
5897
|
| `grammar.verbs.persons.they` | `string`, required, may be empty | Ending for they |
|
|
5898
|
+
| `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 |
|
|
5586
5899
|
| `classModifiers` | `string[]` | `language` only: the word class modifiers the language uses, each from the [master word classes](#word-classes); empty when unstated |
|
|
5587
5900
|
| `fields` | `{ name, holds }[]` | `language` only: the fields its words are grouped under |
|
|
5588
5901
|
| `fields[].name` | `string`, required | The field's name, which a word's `field` names |
|
|
@@ -5605,6 +5918,10 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5605
5918
|
| `words[].tones` | `string` | A tone pattern, as `LHL` |
|
|
5606
5919
|
| `words[].root` | `string` | A consonantal skeleton, as `d-l-k` |
|
|
5607
5920
|
| `words[].frame` | `string` | The frame a root is set in, named in `sounds.frames` of the language or an ancestor |
|
|
5921
|
+
| `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) |
|
|
5922
|
+
| `words[].native[].map` | `string` | Required: the `data.map.name` the form is written for |
|
|
5923
|
+
| `words[].native[].font` | `string` | The one face the form is for, one the map lists; unstated, every face it lists |
|
|
5924
|
+
| `words[].native[].text` | `string` | Required: the word as the script writes it |
|
|
5608
5925
|
| `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` |
|
|
5609
5926
|
| `affixes[].form` | `string` | The affix as a `built` piece names it, as `-rith`; absent on a zero affix |
|
|
5610
5927
|
| `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 |
|
|
@@ -5864,7 +6181,27 @@ The raw `words` relation retains only the authored `plural`; the
|
|
|
5864
6181
|
the `persons` map shown above. A supplied `persons` map has all six string
|
|
5865
6182
|
endings, each added to the citation form; `""` leaves that form unchanged.
|
|
5866
6183
|
The dictionary prints the pattern once in a small table before its letter
|
|
5867
|
-
headings
|
|
6184
|
+
headings, headed "Ending added to citation form".
|
|
6185
|
+
|
|
6186
|
+
Where the present endings take the place of the citation form's closing
|
|
6187
|
+
letters, the pattern states them as `replaces`:
|
|
6188
|
+
|
|
6189
|
+
```yaml
|
|
6190
|
+
grammar:
|
|
6191
|
+
verbs:
|
|
6192
|
+
replaces: then
|
|
6193
|
+
persons: { I: men, you: zen, heShe: zor, we: mar, youAll: zar, they: zoi }
|
|
6194
|
+
```
|
|
6195
|
+
|
|
6196
|
+
A form is then the citation form with its closing `then` swapped for the
|
|
6197
|
+
ending: `lokathen` gives `lokamen`, `lokazor` and the rest, and an empty
|
|
6198
|
+
ending drops the `then`. A citation form that does not close on `replaces`
|
|
6199
|
+
takes the ending whole, as a suffix does when its `replaces` does not match,
|
|
6200
|
+
so `varos` gives `varoszor`. It is not a finding, because no word is checked
|
|
6201
|
+
against a grammar rule. The
|
|
6202
|
+
dictionary's table is then headed "Ending in place of a closing -then", and
|
|
6203
|
+
an empty ending prints as "-then dropped". `replaces` is a literal, nonempty
|
|
6204
|
+
string, and only accompanies `persons`. A custom dictionary's default or `key=true` prints that table even
|
|
5868
6205
|
when no abbreviation key is needed. `key=false` fragments omit both the key
|
|
5869
6206
|
and table; `key=only` prints the abbreviation key alone. Separate results
|
|
5870
6207
|
with their heads enabled each print their own tables.
|
|
@@ -6115,6 +6452,24 @@ affiliation in `scope` having it as a rank or office title, and every anchor of
|
|
|
6115
6452
|
a note in `scope` having it as its name. A folder note carries no name, and a
|
|
6116
6453
|
language that states no `scope` reads every note of the package.
|
|
6117
6454
|
|
|
6455
|
+
**A row tagged `other:<tongue>` or `exonym:<tongue>` names a name of that
|
|
6456
|
+
tongue's own register.** The tongue names the language note that a
|
|
6457
|
+
`data.tongues` entry tagged with it names by its `language`, in any language
|
|
6458
|
+
note of the package: `{ tag: vylari, language: skill-vylarilng }` makes
|
|
6459
|
+
`exonym:vylari` read the Vylari note. That note's `data.register` must hold a
|
|
6460
|
+
row of the same name, case folded and NFC, whose `tongue` is the tongue itself,
|
|
6461
|
+
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 a warning at the
|
|
6463
|
+
row's `tongue`; a missing name is a warning at its `name`:
|
|
6464
|
+
|
|
6465
|
+
> `` `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
|
+
|
|
6467
|
+
> `` the tongue `nordmal` in `exonym:nordmal` names no language note: no language note's `data.tongues` tags `nordmal` with a `language` ``
|
|
6468
|
+
|
|
6469
|
+
Bare `other`, which names no tongue, and every other tag are not checked. A
|
|
6470
|
+
language note of another package is not read, since its register does not
|
|
6471
|
+
reach the package's index.
|
|
6472
|
+
|
|
6118
6473
|
**`retired` lists the forms the setting does not write**, each with what is
|
|
6119
6474
|
written in its place, one form or several, and why. A form nothing replaces
|
|
6120
6475
|
states no `instead`.
|
|
@@ -6290,6 +6645,8 @@ Each finding is located at the key at fault:
|
|
|
6290
6645
|
| A `scope` Address that does not resolve, or a type that is no note type | error |
|
|
6291
6646
|
| A tongue `language` or a cognate form's language that is no language note | error |
|
|
6292
6647
|
| A register row with neither a `tongue` nor a `kind`, at the row | error |
|
|
6648
|
+
| A register row tagged `other:<tongue>` or `exonym:<tongue>` whose tongue no `data.tongues` entry links to one language note, at the tongue | warning |
|
|
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 | warning |
|
|
6293
6650
|
| A sound-change set's name stated twice, at the second | error |
|
|
6294
6651
|
| A step label stated twice in one set, at the second | error |
|
|
6295
6652
|
| A set's `from` or `to` that is no language note, at the value | error |
|
|
@@ -7485,9 +7842,24 @@ Content prepared to be played — a situation with its cast, places, and possibl
|
|
|
7485
7842
|
- concept: An explanation of how something works and why it is shaped that way, read to understand rather than to follow.
|
|
7486
7843
|
- 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.
|
|
7487
7844
|
|
|
7488
|
-
| `data` property
|
|
7489
|
-
|
|
|
7490
|
-
| `culture`
|
|
7845
|
+
| `data` property | Values | Description |
|
|
7846
|
+
| --------------------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
|
7847
|
+
| `culture` | `Address` | `settingguide` only, and required there: the culture the guide introduces, naming a lore note with `subType: culture` |
|
|
7848
|
+
| `map` | `{ name, vowels?, fonts, rows }` | A mapping, which text marked `map=` with its `name` is rewritten by; any subType. See [mapping notes](#mapping-notes) |
|
|
7849
|
+
| `map.name` | string | Required: what `map=` names it by, lowercase letters, digits and `-`, unique in the index |
|
|
7850
|
+
| `map.vowels` | string | The characters `before: vowel` reads as vowels |
|
|
7851
|
+
| `map.rows` | list of `[from, to]` or `{ from, to, before?, at? }` | Required: the rewrites, in authored order |
|
|
7852
|
+
| `map.rows[].from` | string of one or more characters | Required in a map row: the characters it matches |
|
|
7853
|
+
| `map.rows[].to` | string, which may be empty | Required in a map row: what it writes in their place |
|
|
7854
|
+
| `map.rows[].before` | `vowel \| consonant` | What must follow the match |
|
|
7855
|
+
| `map.rows[].at` | `start \| end` | Where the match must sit |
|
|
7856
|
+
| `map.fonts` | list of `{ font, rows? }` | Required, at least one: the faces the map is drawn in |
|
|
7857
|
+
| `map.fonts[].font` | an installed face's slug | Required: the face, as `font=` names it; not `mono`, `serif` or `sans` |
|
|
7858
|
+
| `map.fonts[].rows` | list of `[from, to]` or `{ from, to, before?, at? }` | Rows for this face alone, tried before the shared `rows` |
|
|
7859
|
+
| `map.fonts[].rows[].from` | string of one or more characters | Required in a map row: the characters it matches |
|
|
7860
|
+
| `map.fonts[].rows[].to` | string, which may be empty | Required in a map row: what it writes in their place |
|
|
7861
|
+
| `map.fonts[].rows[].before` | `vowel \| consonant` | What must follow the match |
|
|
7862
|
+
| `map.fonts[].rows[].at` | `start \| end` | Where the match must sit |
|
|
7491
7863
|
|
|
7492
7864
|
A setting guide introduces one culture's view of the setting, so it names that
|
|
7493
7865
|
culture, and a `doc` of any other `subType` has no culture of its own to name.
|
|
@@ -507,6 +507,10 @@ These fields are accepted by every note type. A field's value can still be irrel
|
|
|
507
507
|
| `data.words[].tones` | a string | no | A tone pattern, such as `LHL`. |
|
|
508
508
|
| `data.words[].root` | a string | no | A consonantal skeleton, such as `d-l-k`. |
|
|
509
509
|
| `data.words[].frame` | a frame of the language's `sounds.frames` | no | The frame a root is set in, named in the language's `sounds.frames`. |
|
|
510
|
+
| `data.words[].native` | a list of `{ map, font?, text }` | no | The word's native form under a map, stated only where the map's rows spell it differently. Its derived forms are spelled by the rows. |
|
|
511
|
+
| `data.words[].native[].map` | a mapping note's `data.map.name` | yes | The map the native form is written for. |
|
|
512
|
+
| `data.words[].native[].font` | a face the map lists | no | The one face the native form is for; unstated, it is for every face the map lists, and a form stated for a face wins over it there. |
|
|
513
|
+
| `data.words[].native[].text` | the word in the script, as the map's characters | yes | The word as the script writes it, where the map's rows would write it otherwise. |
|
|
510
514
|
| `data.affixes[].form` | the affix as written, such as `-rith` | no | The affix as a word's `built` names it; absent on a zero affix. |
|
|
511
515
|
| `data.affixes[].zero` | `true` | no | The affix is written as nothing, such as a case with no ending; it states no `form`, prints as `∅`, and no `built` piece names it. |
|
|
512
516
|
| `data.affixes[].kind` | one of case, derivation, tense, aspect, mood, voice, name, lineage | no | What the affix makes. |
|
|
@@ -523,15 +527,16 @@ These fields are accepted by every note type. A field's value can still be irrel
|
|
|
523
527
|
| `data.grammar.plural` | list of `{ ending, becomes }` | no | Default noun plurals, replacing the first matching literal ending in authored order. A word's explicit plural wins; no word is checked against this rule. |
|
|
524
528
|
| `data.grammar.plural[].ending` | a literal ending string, which may be empty | yes | The bare suffix replaced by this rule; empty matches every noun. |
|
|
525
529
|
| `data.grammar.plural[].becomes` | a literal ending string, which may be empty | yes | The bare replacement; empty removes the matching suffix. |
|
|
526
|
-
| `data.grammar.verbs` | a map — `{ invariant: true }` or `{ persons: { I, you, heShe, we, youAll, they } }`
|
|
530
|
+
| `data.grammar.verbs` | a map — `{ invariant: true }` or `{ persons: { I, you, heShe, we, youAll, they }, replaces? }` | no | One optional regular present pattern, printed once at the dictionary head. |
|
|
527
531
|
| `data.grammar.verbs.invariant` | true, as the alternative to persons | no | True where verbs keep the citation form for every person; excludes `persons`. |
|
|
528
|
-
| `data.grammar.verbs.persons` | a map — `{ I, you, heShe, we, youAll, they }` of ending strings | no | All six present endings, each added to the citation form
|
|
529
|
-
| `data.grammar.verbs.persons.I` | an ending string, empty for unchanged | yes | The ending added to the citation form
|
|
530
|
-
| `data.grammar.verbs.persons.you` | an ending string, empty for unchanged | yes | The ending added to the citation form
|
|
531
|
-
| `data.grammar.verbs.persons.heShe` | an ending string, empty for unchanged | yes | The ending added to the citation form
|
|
532
|
-
| `data.grammar.verbs.persons.we` | an ending string, empty for unchanged | yes | The ending added to the citation form
|
|
533
|
-
| `data.grammar.verbs.persons.youAll` | an ending string, empty for unchanged | yes | The ending added to the citation form
|
|
534
|
-
| `data.grammar.verbs.persons.they` | an ending string, empty for unchanged | yes | The ending added to the citation form
|
|
532
|
+
| `data.grammar.verbs.persons` | a map — `{ I, you, heShe, we, youAll, they }` of ending strings | no | All six present endings, each added to the citation form or in place of its closing `replaces`; excludes `invariant`. |
|
|
533
|
+
| `data.grammar.verbs.persons.I` | an ending string, empty for unchanged | yes | The ending for I, added to the citation form or in place of its closing `replaces`. |
|
|
534
|
+
| `data.grammar.verbs.persons.you` | an ending string, empty for unchanged | yes | The ending for you, added to the citation form or in place of its closing `replaces`. |
|
|
535
|
+
| `data.grammar.verbs.persons.heShe` | an ending string, empty for unchanged | yes | The ending for he/she, added to the citation form or in place of its closing `replaces`. |
|
|
536
|
+
| `data.grammar.verbs.persons.we` | an ending string, empty for unchanged | yes | The ending for we, added to the citation form or in place of its closing `replaces`. |
|
|
537
|
+
| `data.grammar.verbs.persons.youAll` | an ending string, empty for unchanged | yes | The ending for you all, added to the citation form or in place of its closing `replaces`. |
|
|
538
|
+
| `data.grammar.verbs.persons.they` | an ending string, empty for unchanged | yes | The ending for they, added to the citation form or in place of its closing `replaces`. |
|
|
539
|
+
| `data.grammar.verbs.replaces` | the closing letters every ending takes the place of | no | Letters a citation form closes on, swapped for each `persons` ending: with `then`, `lokathen` and `zor` give `lokazor`. A citation form closing otherwise takes the ending whole. With `persons` only. |
|
|
535
540
|
| `data.tongues[].tag` | a tag such as `dunhari`, or `exonym:<tongue>` | yes | The tag a register row's `tongue` names: lowercase letters and digits, or a tag closing on `:<tongue>`, which declares one tag per tongue named after the colon. |
|
|
536
541
|
| `data.tongues[].meaning` | a string | yes | What a name of this tongue is. |
|
|
537
542
|
| `data.tongues[].language` | a language skill Address | no | The language note the tag names, where it is one. |
|
|
@@ -962,9 +967,29 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
|
|
|
962
967
|
|
|
963
968
|
**Subtypes:** `rules`, `userguide`, `reference`, `howto`, `concept`, `settingguide`.
|
|
964
969
|
|
|
965
|
-
| Field | Shape
|
|
966
|
-
| -------------- |
|
|
967
|
-
| `data.culture` | an Address
|
|
970
|
+
| Field | Shape | Meaning |
|
|
971
|
+
| -------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
972
|
+
| `data.culture` | an Address | The culture a setting guide introduces, as a culture lore note. Required on `settingguide`; no other subType states it. |
|
|
973
|
+
| `data.map` | a map — `{ name, vowels?, fonts, rows }` | A mapping, which text marked `map=` with its `name` is rewritten by before it is set. See [mapping notes](format-details.md#mapping-notes). |
|
|
974
|
+
|
|
975
|
+
**Inner keys** — a key a field's value does not declare is an error at its own line and column.
|
|
976
|
+
|
|
977
|
+
| Key | Shape | Required | Meaning |
|
|
978
|
+
| -------------------------------- | ---------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
979
|
+
| `data.map.name` | string | yes | What `map=` names the map by: lowercase letters, digits and `-`, unique in the package. |
|
|
980
|
+
| `data.map.vowels` | string | no | The characters a row's `before: vowel` reads as vowels; any other letter is a consonant. |
|
|
981
|
+
| `data.map.rows` | list of `[from, to]` or `{ from, to, before?, at? }` | yes | The rewrites, each `[from, to]` or `{ from, to, before?, at? }`: `before` is `vowel` or `consonant`, `at` is `start` or `end`. The longest `from` wins, and a character no row matches passes through. |
|
|
982
|
+
| `data.map.rows[].from` | a string of one or more characters | yes | The one or more characters the row matches. |
|
|
983
|
+
| `data.map.rows[].to` | a string, which may be empty | yes | What the row writes in their place; empty to drop them. |
|
|
984
|
+
| `data.map.rows[].before` | string | no | `vowel` or `consonant`: what must follow the match for the row to apply. |
|
|
985
|
+
| `data.map.rows[].at` | string | no | `start` or `end`: where the match must sit for the row to apply. |
|
|
986
|
+
| `data.map.fonts` | list of `{ font, rows? }` | yes | The faces the map is drawn in, at least one, each with any rows of its own. A run in another face is refused, and each face must draw every character its rows and the lexicon's native forms write. |
|
|
987
|
+
| `data.map.fonts[].font` | an installed face's slug | yes | A face the map is drawn in, by the slug `font=` names it by. |
|
|
988
|
+
| `data.map.fonts[].rows` | list of `[from, to]` or `{ from, to, before?, at? }` | no | Rows for this face alone, tried before the shared `rows`; the same shapes and conditions. |
|
|
989
|
+
| `data.map.fonts[].rows[].from` | a string of one or more characters | yes | The one or more characters the row matches. |
|
|
990
|
+
| `data.map.fonts[].rows[].to` | a string, which may be empty | yes | What the row writes in their place; empty to drop them. |
|
|
991
|
+
| `data.map.fonts[].rows[].before` | string | no | `vowel` or `consonant`: what must follow the match for the row to apply. |
|
|
992
|
+
| `data.map.fonts[].rows[].at` | string | no | `start` or `end`: where the match must sit for the row to apply. |
|
|
968
993
|
|
|
969
994
|
### macro
|
|
970
995
|
|
package/e2e.mjs
CHANGED
|
@@ -799,7 +799,7 @@ export function suiteExecutables(command) {
|
|
|
799
799
|
}
|
|
800
800
|
|
|
801
801
|
/** The Chrome for Testing build shared by local and CI Cypress runs. */
|
|
802
|
-
export const CHROME_BUILD_ID = "
|
|
802
|
+
export const CHROME_BUILD_ID = "158.0.8110.0";
|
|
803
803
|
|
|
804
804
|
/**
|
|
805
805
|
* The browser cache survives reseeding and container teardown.
|