@heroiclands/package-build 25.1.0 → 25.1.2
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 +19 -0
- package/bin/content-commands.mjs +43 -6
- package/docs/api.md +7 -0
- package/docs/encoding-core.md +65 -7
- package/docs/guides/writing-in-invented-scripts.md +7 -0
- package/docs/reference/format-details.md +66 -63
- package/docs/reference/note-types.md +54 -51
- package/engine/content-alerts.mjs +2 -2
- package/engine/content-blocks.mjs +2 -2
- package/engine/content-index.mjs +23 -1
- package/engine/content-scripts.mjs +15 -6
- package/engine/content-scroll.mjs +2 -4
- package/engine/content-session.mjs +1 -0
- package/engine/content-timings.mjs +13 -1
- package/engine/content-verse.mjs +2 -2
- package/engine/dictionary-rows.mjs +14 -2
- package/engine/encoding-language.mjs +47 -20
- package/engine/encoding-lexicon.mjs +17 -3
- package/engine/encoding-template.mjs +99 -42
- package/engine/encoding-terms.mjs +42 -5
- package/engine/encoding.mjs +28 -22
- package/engine/heading-attributes.mjs +2 -5
- package/engine/language-writings.mjs +34 -1
- package/engine/markdown-blocks.mjs +58 -0
- package/package.json +1 -1
- package/types/engine/content-index.d.mts +28 -2
- package/types/engine/content-session.d.mts +1 -0
- package/types/engine/content-timings.d.mts +7 -0
- package/types/engine/encoding-lexicon.d.mts +6 -35
- package/types/engine/encoding-template.d.mts +1 -0
- package/types/engine/encoding-terms.d.mts +42 -4
- package/types/engine/encoding.d.mts +1 -1
- package/types/engine/language-writings.d.mts +3 -1
- package/types/engine/markdown-blocks.d.mts +8 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @heroiclands/package-build
|
|
2
2
|
|
|
3
|
+
## 25.1.2
|
|
4
|
+
|
|
5
|
+
**Build speed**
|
|
6
|
+
|
|
7
|
+
- Content builds and content lint run several times faster on large packages, above all when building the content index and checking text written through a language's encoding.
|
|
8
|
+
- The build log shows how long each stage of the content index takes.
|
|
9
|
+
|
|
10
|
+
## 25.1.1
|
|
11
|
+
|
|
12
|
+
**Language conversion**
|
|
13
|
+
|
|
14
|
+
- Scripts can opt into conventional spellings for unwritten vowels and shared signs without hidden recovery marks; exact conversion remains the default.
|
|
15
|
+
- Signs can vary before consonants or at word and line boundaries, and explicit word dividers can become spaces.
|
|
16
|
+
- Accent settings can explicitly allow or forbid diacritics.
|
|
17
|
+
|
|
18
|
+
**Spelling checks**
|
|
19
|
+
|
|
20
|
+
- English translations in name registers no longer trigger spelling errors for the invented language.
|
|
21
|
+
|
|
3
22
|
## 25.1.0
|
|
4
23
|
|
|
5
24
|
**Writing and conversion**
|
package/bin/content-commands.mjs
CHANGED
|
@@ -1912,6 +1912,40 @@ function linksCommand() {
|
|
|
1912
1912
|
};
|
|
1913
1913
|
}
|
|
1914
1914
|
|
|
1915
|
+
/** The stages that build the content index, in the order they run. */
|
|
1916
|
+
const INDEX_STAGES = Object.freeze([
|
|
1917
|
+
"source capture",
|
|
1918
|
+
"dependency indexes",
|
|
1919
|
+
"index read",
|
|
1920
|
+
"index notes",
|
|
1921
|
+
"index citations",
|
|
1922
|
+
"index encoding runs",
|
|
1923
|
+
"index calendars and cultures",
|
|
1924
|
+
"index lexical sections",
|
|
1925
|
+
"index order",
|
|
1926
|
+
"index derivation",
|
|
1927
|
+
"sql:all",
|
|
1928
|
+
"sql:public",
|
|
1929
|
+
"publication",
|
|
1930
|
+
"index emission",
|
|
1931
|
+
]);
|
|
1932
|
+
|
|
1933
|
+
/**
|
|
1934
|
+
* The content index's stage timings as one line, each stage's own time
|
|
1935
|
+
* excluding the stages inside it.
|
|
1936
|
+
*
|
|
1937
|
+
* @param {Record<string, number>} stages - Exclusive milliseconds by stage.
|
|
1938
|
+
* @returns {string} The line.
|
|
1939
|
+
*/
|
|
1940
|
+
function indexTimings(stages) {
|
|
1941
|
+
const shown = INDEX_STAGES.filter((name) => name in stages);
|
|
1942
|
+
const total = shown.reduce((sum, name) => sum + stages[name], 0);
|
|
1943
|
+
return (
|
|
1944
|
+
`Index timings: ${shown.map((name) => `${name} ${stages[name].toFixed(1)} ms`).join("; ")}; ` +
|
|
1945
|
+
`total ${total.toFixed(1)} ms.`
|
|
1946
|
+
);
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1915
1949
|
/**
|
|
1916
1950
|
* `package-build content-index` — emit this package's note index.
|
|
1917
1951
|
*
|
|
@@ -1961,12 +1995,14 @@ function contentIndexCommand() {
|
|
|
1961
1995
|
session.assertContext({ config, contentBase });
|
|
1962
1996
|
const publication = await session.publication();
|
|
1963
1997
|
const { file, notes, bytes, full, draft, stub, dictionary, terms } =
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1998
|
+
session.timings.sync("index emission", () =>
|
|
1999
|
+
emitContentIndex({
|
|
2000
|
+
config,
|
|
2001
|
+
publication,
|
|
2002
|
+
...(argv.root ? { contentBase: argv.root } : {}),
|
|
2003
|
+
...(argv.out ? { outDir: argv.out } : {}),
|
|
2004
|
+
}),
|
|
2005
|
+
);
|
|
1970
2006
|
log.info(
|
|
1971
2007
|
`${config.contentPackage} → ${path.relative(process.cwd(), file)} ` +
|
|
1972
2008
|
`(${notes} notes — ${full} full, ${draft} draft, ` +
|
|
@@ -1977,6 +2013,7 @@ function contentIndexCommand() {
|
|
|
1977
2013
|
`${config.contentPackage} → ${path.relative(process.cwd(), written.file)} ` +
|
|
1978
2014
|
`(${written.rows} ${relation} rows)`,
|
|
1979
2015
|
);
|
|
2016
|
+
log.info(indexTimings(session.timings.snapshot().stages));
|
|
1980
2017
|
return true;
|
|
1981
2018
|
} catch (err) {
|
|
1982
2019
|
reportContentFailure(err, argv);
|
package/docs/api.md
CHANGED
|
@@ -2799,6 +2799,13 @@ expose their schema `key`.
|
|
|
2799
2799
|
| `encodeText` | `encodeText(encoding, text, {font, verse})` | string | encoding exactly by rows and inline codes |
|
|
2800
2800
|
| `decodeText` | `decodeText(encoding, text, {font})` | string | decoding by longest output matches |
|
|
2801
2801
|
|
|
2802
|
+
Encoding rules default to exact, uniquely decodable outputs. A note may state
|
|
2803
|
+
`rules.roundTrip: canonical` to permit aliases and empty code sequences;
|
|
2804
|
+
`decodeText` then returns the authored conventional reading without restoring
|
|
2805
|
+
erased Roman characters. Contextual rules accept `before: vowel|consonant`
|
|
2806
|
+
and `at: start|end|line-start`; supplied conditions combine with AND. Accent
|
|
2807
|
+
permission blocks accept explicit Boolean values. See [Encoding text](encoding-core.md).
|
|
2808
|
+
|
|
2802
2809
|
### `engine.encodingLanguage`
|
|
2803
2810
|
|
|
2804
2811
|
Pure language-aware conversion takes a compiled encoding and optional plain
|
package/docs/encoding-core.md
CHANGED
|
@@ -48,18 +48,75 @@ second behaviour.
|
|
|
48
48
|
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
49
49
|
| `normalization` | Required `NFC`; input is normalized before matching, with original source offsets retained. |
|
|
50
50
|
| `matching` | Required `longest-first`. |
|
|
51
|
+
| `roundTrip` | Optional `exact` (default) or `canonical`; canonical permits authored aliases and empty code sequences. |
|
|
52
|
+
| `word-separators` | Optional list of source word dividers that emit shared word spaces after contextual alternatives. |
|
|
51
53
|
| `case` | `{single-letter: preserve, consonant-group: lowercase-or-initial-uppercase, other-group-cases: forbidden}`; single letters retain authored case, and groups use lowercase or an initial capital. |
|
|
52
54
|
| `stress` | `{modifier, position: after-stressed-vowel, printing: false, effect: stress-only, changes-sound: false, changes-length: false, vowel-group-position: first-vowel}`; `modifier` names a font code and acute mappings append it to the unchanged vowel. |
|
|
53
55
|
| `vowel-groups` | `{reading: established, allow-splitting: false, unrecognized-adjacent-vowels: separate, groups: [...]}`; the explicit group list determines where an acute belongs on its first vowel. |
|
|
54
|
-
| `diaeresis` | `{allowed:
|
|
55
|
-
| `grave-accent` | `{allowed:
|
|
56
|
-
| `contextual-mappings` | A list of `{match, before
|
|
56
|
+
| `diaeresis` | `{allowed: boolean}` permits or forbids explicitly mapped diaeresis characters. |
|
|
57
|
+
| `grave-accent` | `{allowed: boolean}` permits or forbids explicitly mapped grave-accent characters. |
|
|
58
|
+
| `contextual-mappings` | A list of `{match, emit, before?, at?}`; following-letter or source-position conditions precede unconditional mappings. |
|
|
57
59
|
| `y` | `{kind: consonant, sound: "y in yes", vowel-reading: false}`; y cannot also appear in `data.vowels`. |
|
|
58
60
|
|
|
61
|
+
The accent blocks accept an explicit Boolean `allowed`. False forbids that
|
|
62
|
+
accent; true permits it only where the character is accepted and mapped.
|
|
63
|
+
Omitting the block also permits such explicit mappings. Neither choice invents
|
|
64
|
+
an accent pronunciation or adds a character to the inventory.
|
|
65
|
+
|
|
66
|
+
`rules.roundTrip` is optional and defaults to `exact`. Exact mappings must be
|
|
67
|
+
uniquely decodable across adjacent mappings and spaces; ambiguous outputs and
|
|
68
|
+
empty code sequences are refused. This remains the default for Aelwythi.
|
|
69
|
+
|
|
70
|
+
An encoding whose orthography omits distinctions may explicitly state
|
|
71
|
+
`roundTrip: canonical`. Its mappings and conditional emissions may use `[]`
|
|
72
|
+
for an inherent vowel or deleted boundary marker, and different Roman sources
|
|
73
|
+
may name the same output. Decoding returns a conventional spelling. For an output it prefers the first
|
|
74
|
+
authored alias whose following-letter condition matches the decoded suffix,
|
|
75
|
+
with conditional rows before general mappings and longest complete native
|
|
76
|
+
matches first. When none applies, the first authored reading is retained:
|
|
77
|
+
an inherent vowel or deleted marker may have hidden the original condition. It does not invent characters for
|
|
78
|
+
empty outputs or store invisible metadata to restore the original spelling.
|
|
79
|
+
A language's authoritative vocabulary can recover fuller word spellings.
|
|
80
|
+
Shared word spaces remain spaces in both modes.
|
|
81
|
+
|
|
82
|
+
Contextual entries use `{match, emit, before?, at?}` and require at least one
|
|
83
|
+
condition. `before` is `vowel` or `consonant`; `at` is `start`, `end` or
|
|
84
|
+
`line-start`. `start` and `end` refer to word boundaries. A consonant is a
|
|
85
|
+
letter outside the declared `data.vowels`. Line start follows a newline or
|
|
86
|
+
verse slash and permits preceding indentation carets. Multiple conditions
|
|
87
|
+
combine with AND. Entries for the same source may use different conditions;
|
|
88
|
+
repeating the same source and condition tuple is an error. Equal-length
|
|
89
|
+
contextual matches retain authored order.
|
|
90
|
+
|
|
91
|
+
```yaml
|
|
92
|
+
rules:
|
|
93
|
+
normalization: NFC
|
|
94
|
+
matching: longest-first
|
|
95
|
+
roundTrip: canonical
|
|
96
|
+
contextual-mappings:
|
|
97
|
+
- { match: e, before: consonant, emit: [] }
|
|
98
|
+
- { match: e, at: end, emit: [] }
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Conditions govern forward matching. Inverse following-letter choices use the
|
|
102
|
+
visible decoded suffix; canonical mode keeps its authored fallback when that
|
|
103
|
+
suffix has lost an inherent vowel or marker. Position conditions govern only
|
|
104
|
+
forward matching. No mode invents deleted markers. Exact decoding retains
|
|
105
|
+
strict following-letter checks.
|
|
106
|
+
|
|
107
|
+
`rules.word-separators` lists source word dividers, such as `['-']`, that emit
|
|
108
|
+
the shared ASCII word space. Contextual rules take priority, so a canonical
|
|
109
|
+
note can emit `[]` for an edge hyphen and a word space for an internal hyphen.
|
|
110
|
+
These sources cannot also be ordinary mappings, replace shared punctuation,
|
|
111
|
+
or contain whitespace, literal markers or structural controls. Separator
|
|
112
|
+
sources participate in inferred `accepts`; no font SPACE code is invented.
|
|
113
|
+
Since a divider and an ordinary space share output, such a note selects
|
|
114
|
+
canonical round trips. Decoding keeps the shared space as a space.
|
|
115
|
+
|
|
59
116
|
A contextual match cannot contain whitespace, literal markers or forbidden
|
|
60
|
-
accents.
|
|
61
|
-
|
|
62
|
-
|
|
117
|
+
accents. Both modes enforce the same accepted characters, normalization,
|
|
118
|
+
case, stress, accent and literal-control rules. The compiler does not infer
|
|
119
|
+
linguistic vowel groups or silently add missing letter mappings.
|
|
63
120
|
|
|
64
121
|
Lint checks every authored word, variant and registered name for a language
|
|
65
122
|
with an encoding document, including unused entries. It also checks actual
|
|
@@ -110,7 +167,8 @@ fixtures, not an authored input format.
|
|
|
110
167
|
`EncodingError` and returns no partial text. `offset` is a zero-based UTF-16
|
|
111
168
|
offset into the input, suitable for composing with a Markdown offset map.
|
|
112
169
|
`line` and `column` are one-based Unicode code-point positions; schema errors
|
|
113
|
-
expose their `key`.
|
|
170
|
+
expose their `key`. Exact decoding resolves the complete unambiguous output sequence. Canonical
|
|
171
|
+
decoding selects the authored conventional reading.
|
|
114
172
|
|
|
115
173
|
`encodePieces` uses the same rules and returns `{from, to, start, end, row}`
|
|
116
174
|
records. `start` and exclusive `end` delimit original UTF-16 input, including
|
|
@@ -40,6 +40,13 @@ Language identification alone retains Roman text. `enc=` selects an encoding
|
|
|
40
40
|
document, which infers its language and font. Unknown source characters are
|
|
41
41
|
errors; a face drawing a character does not make it a spelling mapping.
|
|
42
42
|
|
|
43
|
+
An encoding uses exact round trips by default. If its script omits Roman
|
|
44
|
+
distinctions, its note can explicitly select `rules.roundTrip: canonical`.
|
|
45
|
+
Decoding then gives an authored conventional spelling; authoritative lexicon
|
|
46
|
+
entries can recover fuller word forms. The encoder adds no invisible metadata
|
|
47
|
+
to restore erased spelling. See the [canonical encoding contract](../encoding-core.md#executable-rules)
|
|
48
|
+
for aliases, inherent vowels and shared word separators.
|
|
49
|
+
|
|
43
50
|
## Language and native presentation
|
|
44
51
|
|
|
45
52
|
`enc=` names an encoding document, with `doc` as its default Address type:
|
|
@@ -8084,69 +8084,72 @@ Content prepared to be played — a situation with its cast, places, and possibl
|
|
|
8084
8084
|
- 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.
|
|
8085
8085
|
- 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.
|
|
8086
8086
|
|
|
8087
|
-
| `data` property | Values
|
|
8088
|
-
| ------------------------------------------------- |
|
|
8089
|
-
| `language` | a configured language alias
|
|
8090
|
-
| `font` | an installed font slug
|
|
8091
|
-
| `accepts` | a list of characters or ranges
|
|
8092
|
-
| `vowels` | a string
|
|
8093
|
-
| `mappings` | Roman strings to glyph codes
|
|
8094
|
-
| `rules` | the closed encoding rules vocabulary
|
|
8095
|
-
| `rules.normalization` | "NFC"
|
|
8096
|
-
| `rules.matching` | "longest-first"
|
|
8097
|
-
| `rules.
|
|
8098
|
-
| `rules.
|
|
8099
|
-
| `rules.case
|
|
8100
|
-
| `rules.case.
|
|
8101
|
-
| `rules.
|
|
8102
|
-
| `rules.
|
|
8103
|
-
| `rules.stress
|
|
8104
|
-
| `rules.stress.
|
|
8105
|
-
| `rules.stress.
|
|
8106
|
-
| `rules.stress.
|
|
8107
|
-
| `rules.stress.
|
|
8108
|
-
| `rules.stress.
|
|
8109
|
-
| `rules.
|
|
8110
|
-
| `rules.vowel-
|
|
8111
|
-
| `rules.vowel-groups
|
|
8112
|
-
| `rules.vowel-groups.
|
|
8113
|
-
| `rules.vowel-groups.
|
|
8114
|
-
| `rules.
|
|
8115
|
-
| `rules.
|
|
8116
|
-
| `rules.
|
|
8117
|
-
| `rules.
|
|
8118
|
-
| `rules.
|
|
8119
|
-
| `rules.
|
|
8120
|
-
| `rules.contextual-mappings
|
|
8121
|
-
| `rules.contextual-mappings[].
|
|
8122
|
-
| `rules.
|
|
8123
|
-
| `rules.
|
|
8124
|
-
| `rules.
|
|
8125
|
-
| `rules.y
|
|
8126
|
-
| `
|
|
8127
|
-
| `
|
|
8128
|
-
| `
|
|
8129
|
-
| `
|
|
8130
|
-
| `concepts
|
|
8131
|
-
| `
|
|
8132
|
-
| `
|
|
8133
|
-
| `
|
|
8134
|
-
| `
|
|
8135
|
-
| `
|
|
8136
|
-
| `metres
|
|
8137
|
-
| `
|
|
8138
|
-
| `
|
|
8139
|
-
| `
|
|
8140
|
-
| `sounds
|
|
8141
|
-
| `sounds.letters
|
|
8142
|
-
| `sounds.letters[].
|
|
8143
|
-
| `sounds.letters[].
|
|
8144
|
-
| `sounds.letters[].
|
|
8145
|
-
| `sounds.
|
|
8146
|
-
| `sounds.
|
|
8147
|
-
| `sounds.
|
|
8148
|
-
| `sounds.marks
|
|
8149
|
-
| `sounds.marks[].
|
|
8087
|
+
| `data` property | Values | Description |
|
|
8088
|
+
| ------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
8089
|
+
| `language` | a configured language alias | The configured language alias an encoding document writes. |
|
|
8090
|
+
| `font` | an installed font slug | The encoding's installed font, which supplies all glyph codes. |
|
|
8091
|
+
| `accepts` | a list of characters or ranges | Accepted Roman letters and additions to standard punctuation. |
|
|
8092
|
+
| `vowels` | a string | The letters a contextual vowel match reads as vowels. |
|
|
8093
|
+
| `mappings` | Roman strings to glyph codes | Roman source strings mapped to codes published by the selected font. |
|
|
8094
|
+
| `rules` | the closed encoding rules vocabulary | Executable normalization, matching, case, stress, vowel groups, accents and contextual mappings. |
|
|
8095
|
+
| `rules.normalization` | "NFC" | Required value: "NFC". |
|
|
8096
|
+
| `rules.matching` | "longest-first" | Required value: "longest-first". |
|
|
8097
|
+
| `rules.roundTrip` | a string | Exact by default; canonical permits aliases and empty code sequences and decodes an authored conventional spelling. |
|
|
8098
|
+
| `rules.word-separators` | a list of nonempty NFC source sequences | Source word dividers written as shared spaces, after contextual alternatives; cannot also be ordinary mappings or replace shared punctuation. |
|
|
8099
|
+
| `rules.case` | a map | Case handling for letters and consonant groups. |
|
|
8100
|
+
| `rules.case.single-letter` | "preserve" | Required value: "preserve". |
|
|
8101
|
+
| `rules.case.consonant-group` | "lowercase-or-initial-uppercase" | Required value: "lowercase-or-initial-uppercase". |
|
|
8102
|
+
| `rules.case.other-group-cases` | "forbidden" | Required value: "forbidden". |
|
|
8103
|
+
| `rules.stress` | a map | The font's nonprinting stress modifier after an acute vowel. |
|
|
8104
|
+
| `rules.stress.modifier` | a string | The font code for U+E0114. |
|
|
8105
|
+
| `rules.stress.position` | "after-stressed-vowel" | Required value: "after-stressed-vowel". |
|
|
8106
|
+
| `rules.stress.printing` | false | Required value: false. |
|
|
8107
|
+
| `rules.stress.effect` | "stress-only" | Required value: "stress-only". |
|
|
8108
|
+
| `rules.stress.changes-sound` | false | Required value: false. |
|
|
8109
|
+
| `rules.stress.changes-length` | false | Required value: false. |
|
|
8110
|
+
| `rules.stress.vowel-group-position` | "first-vowel" | Required value: "first-vowel". |
|
|
8111
|
+
| `rules.vowel-groups` | a map | Explicit recognized vowel groups and their acute placement. |
|
|
8112
|
+
| `rules.vowel-groups.reading` | "established" | Required value: "established". |
|
|
8113
|
+
| `rules.vowel-groups.allow-splitting` | false | Required value: false. |
|
|
8114
|
+
| `rules.vowel-groups.unrecognized-adjacent-vowels` | "separate" | Required value: "separate". |
|
|
8115
|
+
| `rules.vowel-groups.groups` | a list of vowel groups | The complete authored group inventory. |
|
|
8116
|
+
| `rules.diaeresis` | a map | Whether diaeresis mappings are allowed. |
|
|
8117
|
+
| `rules.diaeresis.allowed` | true or false | False forbids the accent; true permits explicitly mapped and accepted characters. |
|
|
8118
|
+
| `rules.grave-accent` | a map | Whether grave-accent mappings are allowed. |
|
|
8119
|
+
| `rules.grave-accent.allowed` | true or false | False forbids the accent; true permits explicitly mapped and accepted characters. |
|
|
8120
|
+
| `rules.contextual-mappings` | a list of conditional mappings | Alternatives conditioned on the following letter or source position, applied before unconditional mappings. |
|
|
8121
|
+
| `rules.contextual-mappings[].match` | a string | The source sequence. |
|
|
8122
|
+
| `rules.contextual-mappings[].before` | a string | Match before a declared vowel or another letter. |
|
|
8123
|
+
| `rules.contextual-mappings[].at` | a string | Match at word start, word end or line start. |
|
|
8124
|
+
| `rules.contextual-mappings[].emit` | a glyph code or list of codes (empty only with canonical round trips) | The font codes written by this alternative. |
|
|
8125
|
+
| `rules.y` | a map | The consonant reading of y. |
|
|
8126
|
+
| `rules.y.kind` | "consonant" | Required value: "consonant". |
|
|
8127
|
+
| `rules.y.sound` | "y in yes" | Required value: "y in yes". |
|
|
8128
|
+
| `rules.y.vowel-reading` | false | Required value: false. |
|
|
8129
|
+
| `culture` | `Address` | `settingguide` only, and required there: the culture the guide introduces, naming a lore note with `subType: culture` |
|
|
8130
|
+
| `concepts` | list of `{ id, gloss, group }` | A core vocabulary's concept list, any subType. See [the core vocabulary](#the-core-vocabulary) |
|
|
8131
|
+
| `date` | `YYYY-MM-DD` | `post` only, and required there: the day the post was published |
|
|
8132
|
+
| `author` | string | `post` only: who wrote the post; a post naming none carries the site's byline, the first entry of `authors` |
|
|
8133
|
+
| `concepts[].id` | string | Required: lowercase letters, digits and `-`, unique in the package |
|
|
8134
|
+
| `concepts[].gloss` | string | Required: what the concept means, in brief |
|
|
8135
|
+
| `concepts[].group` | string | Required: the group the report lists the concept under |
|
|
8136
|
+
| `metres` | `{ name, beats, kind }[]` | The metres a verse fence's `scan=` names; any subType. See [metres](#metres) |
|
|
8137
|
+
| `metres[].name` | string | Required: what `scan=` names it by, lowercase letters, digits and `-`, unique in the package |
|
|
8138
|
+
| `metres[].beats` | `integer`, required | The beats of one line, above zero |
|
|
8139
|
+
| `metres[].kind` | `accentual` | Required: how the beats are counted |
|
|
8140
|
+
| `sounds` | `{ letters?, marks? }` | A spelling guide's letters and marks, for every tongue of the setting; any subType. See [a spelling guide's sounds](#a-spelling-guides-sounds) |
|
|
8141
|
+
| `sounds.letters` | `{ letters, kind, like?, place?, ipa?, tongue? }[]` | The letters, each row's keys as a language note's `sounds.letters` |
|
|
8142
|
+
| `sounds.letters[].letters` | `string[]`, required | The letters or digraphs the row describes |
|
|
8143
|
+
| `sounds.letters[].kind` | `string`, required | What kind of sound they write, as `consonant` or `vowel pair` |
|
|
8144
|
+
| `sounds.letters[].like` | `string` | What they sound like |
|
|
8145
|
+
| `sounds.letters[].place` | `string` | Where in the mouth they are made |
|
|
8146
|
+
| `sounds.letters[].ipa` | `string` | The sounds they write, in the International Phonetic Alphabet |
|
|
8147
|
+
| `sounds.letters[].tongue` | an Address, or a list of them | The language notes that write the letters; every tongue where absent |
|
|
8148
|
+
| `sounds.marks` | `{ mark, letters, kind, limit }[]` | The marks written on the letters, each row's keys as a language note's `sounds.marks` |
|
|
8149
|
+
| `sounds.marks[].mark` | `string`, required | The mark's name, as `acute` |
|
|
8150
|
+
| `sounds.marks[].letters` | `string[]`, required | The letters that carry it |
|
|
8151
|
+
| `sounds.marks[].kind` | `stress`, `length` or `apart`, required | What it says of its letter |
|
|
8152
|
+
| `sounds.marks[].limit` | `one` or `any`, required | How many a word may carry |
|
|
8150
8153
|
|
|
8151
8154
|
A setting guide introduces one culture's view of the setting, so it names that
|
|
8152
8155
|
culture, and a `doc` of any other `subType` has no culture of its own to name.
|