@heroiclands/package-build 25.0.0 → 25.1.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 +14 -0
- package/README.md +1 -0
- package/bin/content-commands.mjs +30 -96
- package/bin/encoding-commands.mjs +146 -0
- package/bin/package-build.mjs +35 -24
- package/config.mjs +25 -0
- package/convert.mjs +182 -0
- package/docs/api.md +137 -6
- package/docs/authoring/links-and-markup.md +260 -481
- package/docs/commands.md +110 -119
- package/docs/configuration.md +31 -13
- package/docs/content-format.md +11 -4
- package/docs/diagnostics.md +43 -16
- package/docs/encoding-core.md +135 -0
- package/docs/guides/book.md +2 -2
- package/docs/guides/module-project.md +23 -1
- package/docs/guides/site.md +2 -2
- package/docs/guides/writing-in-invented-scripts.md +450 -574
- package/docs/reference/format-details.md +289 -404
- package/docs/reference/note-types.md +80 -63
- package/docs/source-preview.md +8 -0
- package/e2e.mjs +1 -1
- package/engine/base-compiler.mjs +27 -9
- package/engine/content-charset.mjs +13 -1
- package/engine/content-format.yaml +6 -2
- package/engine/content-index.mjs +6 -2
- package/engine/content-links.mjs +1 -0
- package/engine/content-scripts.mjs +614 -459
- package/engine/content-scroll.mjs +4 -4
- package/engine/content-spans.mjs +40 -9
- package/engine/content-verse.mjs +1 -1
- package/engine/converter-data.mjs +70 -0
- package/engine/dictionary-rows.mjs +2 -34
- package/engine/encoding-integrity.mjs +94 -0
- package/engine/encoding-language.mjs +506 -0
- package/engine/encoding-lexicon.mjs +699 -0
- package/engine/encoding-notes.mjs +186 -0
- package/engine/encoding-standard.mjs +42 -0
- package/engine/encoding-template.mjs +313 -0
- package/engine/encoding-terms.mjs +141 -0
- package/engine/encoding.mjs +946 -0
- package/engine/extension-attributes.mjs +2 -0
- package/engine/helpers.mjs +1 -1
- package/engine/index.mjs +7 -0
- package/engine/language-terms.mjs +17 -16
- package/engine/{logographic.mjs → language-writings.mjs} +29 -38
- package/engine/markup-validation.mjs +1 -1
- package/engine/note-vocabulary.mjs +4 -158
- package/engine/pdf-render.mjs +31 -3
- package/engine/roman-characters.mjs +135 -16
- package/engine/roman-run.mjs +149 -0
- package/engine/roman-verse.mjs +95 -0
- package/engine/run-rows.mjs +29 -31
- package/engine/run-words.mjs +2 -2
- package/engine/script-emphasis-terms.mjs +3 -0
- package/engine/script-emphasis.mjs +3 -10
- package/engine/script-font-delivery.mjs +9 -12
- package/engine/script-fonts.mjs +2 -1
- package/engine/site-build.mjs +14 -5
- package/engine/site-preview.mjs +12 -2
- package/engine/sql-tables.mjs +36 -31
- package/engine/verse-metre.mjs +1 -1
- package/engine/word-forms.mjs +1 -1
- package/engine/word-inflections.mjs +48 -0
- package/engine/word-rows.mjs +1 -1
- package/engine/word-terms.mjs +16 -17
- package/package.json +11 -5
- package/types/config.d.mts +5 -0
- package/types/convert.d.mts +44 -0
- package/types/e2e.d.mts +1 -1
- package/types/engine/base-compiler.d.mts +4 -2
- package/types/engine/content-index.d.mts +4 -1
- package/types/engine/content-scripts.d.mts +103 -42
- package/types/engine/converter-data.d.mts +11 -0
- package/types/engine/dictionary-rows.d.mts +1 -25
- package/types/engine/encoding-integrity.d.mts +14 -0
- package/types/engine/encoding-language.d.mts +36 -0
- package/types/engine/encoding-lexicon.d.mts +259 -0
- package/types/engine/encoding-notes.d.mts +39 -0
- package/types/engine/encoding-standard.d.mts +11 -0
- package/types/engine/encoding-template.d.mts +43 -0
- package/types/engine/encoding-terms.d.mts +105 -0
- package/types/engine/encoding.d.mts +155 -0
- package/types/engine/helpers.d.mts +1 -1
- package/types/engine/index.d.mts +4 -0
- package/types/engine/language-terms.d.mts +1 -1
- package/types/engine/{logographic.d.mts → language-writings.d.mts} +6 -6
- package/types/engine/markup-validation.d.mts +1 -1
- package/types/engine/pdf-render.d.mts +1 -1
- package/types/engine/roman-characters.d.mts +2 -2
- package/types/engine/roman-run.d.mts +101 -0
- package/types/engine/roman-verse.d.mts +23 -0
- package/types/engine/run-rows.d.mts +13 -20
- package/types/engine/script-emphasis-terms.d.mts +2 -0
- package/types/engine/script-emphasis.d.mts +1 -1
- package/types/engine/script-font-delivery.d.mts +2 -3
- package/types/engine/script-fonts.d.mts +5 -0
- package/types/engine/site-preview.d.mts +1 -1
- package/types/engine/word-inflections.d.mts +25 -0
- package/engine/map-lexicon.mjs +0 -1045
- package/engine/text-maps.mjs +0 -654
- package/engine/written-in.mjs +0 -204
- package/types/engine/map-lexicon.d.mts +0 -330
- package/types/engine/text-maps.d.mts +0 -189
- package/types/engine/written-in.d.mts +0 -76
|
@@ -12,9 +12,9 @@ reads as the language, text that is drawn in the language's own letters, and a
|
|
|
12
12
|
way to keep both honest. This guide explains how the toolchain does that, from
|
|
13
13
|
the model underneath to every finding it can report, for human authors and for
|
|
14
14
|
agents. The reference pages state each rule exactly: [links and
|
|
15
|
-
markup](../authoring/links-and-markup.md#marking-language-font-and-
|
|
16
|
-
[format details](../reference/format-details.md#text-marked-with-a-language-
|
|
17
|
-
[commands](../commands.md#package-build-
|
|
15
|
+
markup](../authoring/links-and-markup.md#marking-language-font-and-encoding),
|
|
16
|
+
[format details](../reference/format-details.md#text-marked-with-a-language-font-or-encoding),
|
|
17
|
+
[commands](../commands.md#package-build-encode-text),
|
|
18
18
|
[configuration](../configuration.md#languages) and
|
|
19
19
|
[diagnostics](../diagnostics.md). This guide ties them into one account and
|
|
20
20
|
works one example through from start to finish.
|
|
@@ -24,461 +24,182 @@ Semaron script. The lexicon and the notes in them are the guide's own sample.
|
|
|
24
24
|
|
|
25
25
|
## The model
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
know nor care.
|
|
32
|
-
2. **A font draws glyphs for code points.** A code point a font lacks draws a
|
|
33
|
-
box, so the build refuses it before a box reaches a reader. A font states no
|
|
34
|
-
sounds and no spelling, just as a Unicode block chart states none.
|
|
35
|
-
3. **Each script has code points of its own,** as Runic and Ogham have their
|
|
36
|
-
own Unicode blocks. Semaron's `a` is not U+0061. Every face of one script
|
|
37
|
-
draws the same code points, so changing the face changes only the look. The
|
|
38
|
-
left-to-right scripts sit in plane 15, the Supplementary Private Use Area-A
|
|
39
|
-
(Semaron from U+F0200). The right-to-left scripts sit in unassigned code
|
|
40
|
-
points of plane 1 whose default direction is right to left, so their text
|
|
41
|
-
runs right to left in any editor, browser or typesetter with no control
|
|
42
|
-
characters.
|
|
43
|
-
4. **Sounds and spelling belong to the language.** A script is not a language:
|
|
44
|
-
several languages are written in one script, as many Earth languages share
|
|
45
|
-
the Latin alphabet. A mapping therefore belongs to a script and serves every
|
|
46
|
-
language written in it. What differs between languages is their dictionaries.
|
|
47
|
-
5. **Language and presentation are separate.** `lang=` identifies the
|
|
48
|
-
language, retaining the authored Roman spelling and the surrounding prose
|
|
49
|
-
font. Language and vocabulary checks still apply.
|
|
50
|
-
6. **`.nativefont` requests native presentation.** It requires an explicit
|
|
51
|
-
`lang=` on that same span, div or fence, then selects the language's
|
|
52
|
-
configured native map and font. Each marked child makes its own choice;
|
|
53
|
-
native presentation is not inherited by a language-only child.
|
|
54
|
-
7. **`font=` and `map=` override independently.** A native run takes any
|
|
55
|
-
missing half from the language's `data.writtenIn`; if neither the run nor
|
|
56
|
-
its language provides a font, the build reports the needed `font=` override.
|
|
57
|
-
When the language supplies no map, native code points can be typed directly.
|
|
58
|
-
A native font or map without `.nativefont` is an error. Ordinary Roman
|
|
59
|
-
`font=mono`, `serif` and `sans` remain available without native opt-in.
|
|
60
|
-
8. **Native mapping uses the dictionary first.** A word the dictionary does
|
|
61
|
-
not write is spelled by the mapping's rows. Every word must belong to the
|
|
62
|
-
language where its configured note supplies a dictionary.
|
|
63
|
-
|
|
64
|
-
A script that writes meanings rather than sounds is **logographic**. It has no
|
|
65
|
-
sound rules, so every word is written from the dictionary and never guessed;
|
|
66
|
-
see [logographic scripts](#logographic-scripts).
|
|
67
|
-
|
|
68
|
-
One code path serves the build and its users. `package-build transliterate`
|
|
69
|
-
converts a passage exactly as the build does, and `package-build lexicon` lists
|
|
70
|
-
every word of a language with its native form; see
|
|
71
|
-
[the commands](#the-commands).
|
|
72
|
-
|
|
73
|
-
The pipeline for one marked run reads left to right:
|
|
74
|
-
|
|
75
|
-
| Stage | Reads | Reports |
|
|
76
|
-
| ------------- | ------------------------------------ | ------------------------------------------ |
|
|
77
|
-
| Keys | `lang=`, `font=`, `map=` | an unknown language, font or map |
|
|
78
|
-
| Dictionary | the language's `data.words[].native` | a native form the rows cannot capitalise |
|
|
79
|
-
| Rows | the mapping's `data.map.rows` | nothing: a character with no row passes on |
|
|
80
|
-
| Lexicon check | the language's words and register | a word the language does not hold |
|
|
81
|
-
| Face coverage | the face's `fonts.json` code points | a character the face does not draw |
|
|
82
|
-
| Element | the face, the tag and the direction | nothing |
|
|
27
|
+
A language defines its words, meanings and pronunciation. An encoding defines
|
|
28
|
+
which source sequences write which characters. A face draws those characters.
|
|
29
|
+
Keeping these facts in their owning sources gives each passage one consistent
|
|
30
|
+
conversion on the site, in Foundry and in the book.
|
|
83
31
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
|
90
|
-
| ---------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
91
|
-
| `[Daimela, helthos.]{lang=vyl}` | Vylari in authored Roman spelling and the page's font, with language validation. |
|
|
92
|
-
| `[Zaron lonak]{lang=vyl .nativefont}` | Vylari mapped and drawn with its configured native defaults. |
|
|
93
|
-
| `[Zaron lonak]{lang=vyl .nativefont font=semaron-kuriale map=semaron}` | Native Vylari with both defaults explicitly overridden. |
|
|
94
|
-
| `[ad astra]{lang=la font=serif}` | A real language's BCP 47 tag, in the reader's serif. |
|
|
95
|
-
| `::: {lang=vyl .nativefont}` … `:::` | Native presentation for a passage's unmarked paragraphs. |
|
|
96
|
-
| a `verse` fence opened with `{lang=vyl .nativefont}` | Native presentation for a poem's unmarked lines. |
|
|
97
|
-
|
|
98
|
-
The class is explicit on each construct. `[Zaron]{.nativefont}` is an error
|
|
99
|
-
even inside a passage marked `lang=vyl`: add `lang=vyl` to that span. A native
|
|
100
|
-
font such as `font=semaron-kuriale`, or any `map=`, requires `.nativefont`.
|
|
101
|
-
Generic Roman `font=serif`, `sans` and `mono` do not.
|
|
102
|
-
|
|
103
|
-
**`lang=`** is read in this order. First a short name declared in the
|
|
104
|
-
configuration's `languages`; then a BCP 47 language tag for a real language
|
|
105
|
-
(`la`, `grc`, `en-GB`), checked for its form alone. A declared name wins over a
|
|
106
|
-
tag spelled the same way. A well-formed tag one edit from a declared name draws
|
|
107
|
-
a warning that names the declared one, since `vly` is a valid tag for another
|
|
108
|
-
language than `vyl`.
|
|
109
|
-
|
|
110
|
-
**`font=`** is a face of `@heroiclands/fonts`, named by its class without
|
|
111
|
-
`hl-` (`hl-semaron-kuriale` is `font=semaron-kuriale`), or one of the generic
|
|
112
|
-
families `mono`, `serif` and `sans`. A package that sets text in a face adds the
|
|
113
|
-
fonts to its own development dependencies:
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
npm install --save-dev @heroiclands/fonts
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
The installed package's `fonts.json` lists every face and every code point it
|
|
120
|
-
draws, which is the list to write a mapping from. This prints Semaron Kuriale's:
|
|
32
|
+
| Fact | Source | Selection |
|
|
33
|
+
| -------------------------- | ----------------------------------------- | ------------------------------ |
|
|
34
|
+
| Language and vocabulary | Configuration and language note | `lang=` |
|
|
35
|
+
| Authored lexical spelling | Word, affix or grammatical `native` entry | Encoding and optional face |
|
|
36
|
+
| Encoding rows and controls | Encoding document frontmatter | `enc=` document Address |
|
|
37
|
+
| Font face | Installed `fonts.json` | `font=` or the encoding's font |
|
|
121
38
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
Each line is a code point, its kind (`letter`, `digraph`, `numeral`, `point`, `mark`
|
|
128
|
-
or `sign`), the glyph's name and the character's name; the glyph named `a` is the
|
|
129
|
-
letter that writes the sound `a`, and `a.long` the long vowel. Those names are
|
|
130
|
-
what a mapping's rows are written from.
|
|
131
|
-
|
|
132
|
-
On the site `serif` and `mono` are the site's own body and code faces and
|
|
133
|
-
`sans` is the reader's sans-serif; in Foundry they are the reader's generic
|
|
134
|
-
families; in a book they are the book's own serif, sans and mono. The generic
|
|
135
|
-
families are not checked for coverage.
|
|
39
|
+
Language identification alone retains Roman text. `enc=` selects an encoding
|
|
40
|
+
document, which infers its language and font. Unknown source characters are
|
|
41
|
+
errors; a face drawing a character does not make it a spelling mapping.
|
|
136
42
|
|
|
137
|
-
|
|
138
|
-
rewrites the run before anything else; a run's `font=` is then one of the faces
|
|
139
|
-
the mapping lists.
|
|
140
|
-
|
|
141
|
-
The `languages` block of `package-build.config.yaml` declares the short names:
|
|
142
|
-
|
|
143
|
-
```yaml
|
|
144
|
-
languages:
|
|
145
|
-
vyl: { tag: art-x-vyl, note: skill-vylarilng }
|
|
146
|
-
khel: { tag: art-x-khel, note: skill-khelathlng }
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
A name is lowercase letters, digits and hyphens, starting with a letter. `tag`
|
|
150
|
-
is a BCP 47 tag; a constructed language takes `art-x-<name>`. `note` is the
|
|
151
|
-
address of the language's `skill` note of `subType: language`, whose
|
|
152
|
-
`data.words` is the dictionary and whose `data.register` is the names register.
|
|
153
|
-
Without `note`, `lang=` only tags: there is no dictionary and no lexicon check.
|
|
154
|
-
`package-build lint` checks at the key that `note` names a language note.
|
|
155
|
-
|
|
156
|
-
**A language names its script.** Most tongues are written in one script, so the
|
|
157
|
-
language note says which, as one map and one face:
|
|
158
|
-
|
|
159
|
-
```yaml
|
|
160
|
-
data:
|
|
161
|
-
roman: "ABDEFGHIKLMNOPRSTUVWYZabdefghiklmnoprstuvwyzÁÉÍÓÚÝáéíóúýËëÀà0123456789."
|
|
162
|
-
writtenIn: { map: semaron, font: semaron-kuriale }
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
A language-only run stays Roman: `[Zaron lonak]{lang=vyl}`. Add
|
|
166
|
-
`.nativefont` to select both defaults:
|
|
167
|
-
|
|
168
|
-
```markdown
|
|
169
|
-
[Zaron lonak]{lang=vyl .nativefont}
|
|
170
|
-
[Zaron lonak]{lang=vyl .nativefont font=semaron-kuriale map=semaron}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Those two spans display the same native text. `font=` replaces only the font;
|
|
174
|
-
`map=` replaces only the map. A missing font default produces an error naming the
|
|
175
|
-
needed `font=` override, and incompatible map/font pairs are errors. A map
|
|
176
|
-
is optional when the language supplies none; directly typed signs then
|
|
177
|
-
reach the selected font unchanged. The build does
|
|
178
|
-
not discard a default to make an override fit. This applies to spans, divs,
|
|
179
|
-
verse fences, scroll fences and standalone wikilinks. The language note's
|
|
180
|
-
keys are checked at their values:
|
|
181
|
-
|
|
182
|
-
> `` `data.writtenIn.map` is `semoran`, which no mapping note's `data.map.name` declares; did you mean `semaron`? ``
|
|
183
|
-
|
|
184
|
-
> `` `data.writtenIn.font` is `teng-chou`, which the map `semaron` is not drawn in; it is drawn in `semaron-kuriale` ``
|
|
185
|
-
|
|
186
|
-
**Unmarked text follows its passage; marked children choose their own
|
|
187
|
-
presentation.** A language-only child stays Roman, even in the same language
|
|
188
|
-
as its native parent:
|
|
189
|
-
|
|
190
|
-
```markdown
|
|
191
|
-
::: {lang=vyl .nativefont}
|
|
192
|
-
Zaron lonak, [Zaron lonak]{lang=vyl}, lokamen zaron.
|
|
193
|
-
[Gar-Anlagh]{lang=khel .nativefont font=qalezu-hand map=qalezu}
|
|
194
|
-
:::
|
|
195
|
-
```
|
|
43
|
+
## Language and native presentation
|
|
196
44
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
its
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
the parent's explicit map and font are not copied into the child.
|
|
45
|
+
`enc=` names an encoding document, with `doc` as its default Address type:
|
|
46
|
+
`[say.]{enc=aelwsemaronenc}` selects `doc-aelwsemaronenc`. That document supplies
|
|
47
|
+
its configured `language` and single `font`; an explicit `lang=` must identify
|
|
48
|
+
the same language, and an explicit `font=` must be that font. Another face is
|
|
49
|
+
a separate encoding document.
|
|
203
50
|
|
|
204
|
-
|
|
205
|
-
|
|
51
|
+
`enc=default` leaves Roman text as written and is the default when no encoding
|
|
52
|
+
is selected. `lang=` still identifies the text and selects its language's
|
|
53
|
+
vocabulary; `font=mono`, `serif`, `sans` or an installed font selects its face
|
|
54
|
+
without encoding it. Language identification does not select an encoding.
|
|
206
55
|
|
|
207
56
|
```markdown
|
|
208
|
-
[
|
|
209
|
-
[
|
|
57
|
+
[say.]{enc=aelwsemaronenc}
|
|
58
|
+
[say.]{enc=doc-aelwsemaronenc lang=aelw font=semaron-kuriale}
|
|
59
|
+
[say.]{lang=aelw enc=default}
|
|
210
60
|
```
|
|
211
61
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
**What a run may hold.** A marked span or verse line is plain text: no
|
|
218
|
-
emphasis (other than the stars a face's run takes, see [emphasis in a
|
|
219
|
-
script](#emphasis-in-a-script)), link, image, footnote, wikilink, code or HTML.
|
|
220
|
-
A standalone resolved reference may carry the language and native class, as
|
|
221
|
-
above; only its label is set. A marked div holds paragraphs and line breaks only. The text is read as written,
|
|
222
|
-
so `[`, `]`, `"`, `<<`, `>>`, `!` and `@ # $ % ^ &` are characters; a bracket
|
|
223
|
-
pair is markup only when `(` makes a link, `{` a span or a second `[` a
|
|
224
|
-
wikilink, and an unbalanced bracket takes a backslash, `\[`. A code fence is
|
|
225
|
-
verbatim: `[…]{…}` inside it stays literal text. Text marked with a real
|
|
226
|
-
language's tag alone keeps its Markdown when that language is English; a span
|
|
227
|
-
with a non-English effective language cannot contain actual bold or italic
|
|
228
|
-
markup, even when the language is real.
|
|
62
|
+
Class-only emphasis and name children belong to the parent's complete logical
|
|
63
|
+
text; encoding preserves their rendered wrappers. A child with its own run
|
|
64
|
+
keys makes a separate presentation choice. `enc=default` inside an encoded
|
|
65
|
+
parent keeps the inherited language but does not inherit its inferred script
|
|
66
|
+
face. An explicitly authored font remains a font choice.
|
|
229
67
|
|
|
230
|
-
|
|
231
|
-
|
|
68
|
+
A name's braces use the shared name controls. Resolved references encode only
|
|
69
|
+
their visible labels, retaining URLs and presentation cues. These keys apply
|
|
70
|
+
to spans, divs, verse fences and scroll fences. A scroll's selected font must
|
|
71
|
+
belong to a script whose note declares `direction: vertical-rl`.
|
|
232
72
|
|
|
233
|
-
## Roman
|
|
73
|
+
## Roman source and literal characters
|
|
234
74
|
|
|
235
|
-
Language-only text retains
|
|
75
|
+
Language-only text retains the exact spelling and surrounding prose font:
|
|
236
76
|
|
|
237
77
|
```markdown
|
|
238
|
-
[Zaron lonak]{lang=vyl}
|
|
78
|
+
[Zaron lonak]{lang=vyl enc=default}
|
|
239
79
|
[Zaron lonak]{lang=vyl font=serif}
|
|
240
80
|
```
|
|
241
81
|
|
|
242
|
-
The
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
conditions optional. `from` is one or more characters; `to` is any number of
|
|
325
|
-
them, none included. A mapping that drops a language's vowels writes `[a, ""]`.
|
|
326
|
-
`rows` is a list, never a keyed map, so `A` and `a` are two rows.
|
|
327
|
-
|
|
328
|
-
**How a mapping reads text.**
|
|
329
|
-
|
|
330
|
-
- **The longest match wins.** In the note above `th` is one letter, and `t` and
|
|
331
|
-
`h` are read only where `th` does not match. Among rows of one length, a row
|
|
332
|
-
whose condition holds comes before a row with none, and otherwise the earlier
|
|
333
|
-
row wins.
|
|
334
|
-
- **A row whose condition fails is skipped.** `before: vowel` holds when the next
|
|
335
|
-
character is one of `vowels`; `before: consonant` when it is any other
|
|
336
|
-
letter; neither holds at the end of the text. `at: start` holds at the first
|
|
337
|
-
character of the run or after white space or punctuation; `at: end` holds at
|
|
338
|
-
the last character or before white space or punctuation. In the note above,
|
|
339
|
-
`y` is the consonant letter before a vowel and the vowel `i` elsewhere.
|
|
340
|
-
- **Capitals and marks need rows of their own.** A row matches the character as
|
|
341
|
-
written, so `L` and `l` are two rows, and a script with no capitals gives both
|
|
342
|
-
the same code point. A period is a character too and needs its own row.
|
|
343
|
-
A language's `data.roman` decides which source characters may appear.
|
|
344
|
-
- **A character no row matches passes through unchanged,** and the face-coverage
|
|
345
|
-
check then reports it. A mapping for a face that draws nothing on roman code
|
|
346
|
-
points lists every letter the spelling uses.
|
|
347
|
-
|
|
348
|
-
**Fonts.** `fonts` lists each face the mapping may be used with, as a list of
|
|
349
|
-
`{ font, rows }`. A face may carry rows of its own, which a run in that face
|
|
350
|
-
tries first (longest match among them) before the shared rows. That is the way
|
|
351
|
-
to write a sound differently in a variant face. The generic families `mono`,
|
|
352
|
-
`serif` and `sans` are not listed. The lint checks that every listed face draws
|
|
353
|
-
every code point that its own rows, the shared rows it can reach and the
|
|
354
|
-
lexicons' native forms for it write.
|
|
355
|
-
|
|
356
|
-
**Code points above U+FFFF in YAML.** A double-quoted YAML string writes a
|
|
357
|
-
code point by its escape, and the left-to-right scripts sit in plane 15, so
|
|
358
|
-
they take the eight-digit `\U`: `"\U000F0230"` is U+F0230, and the four-digit
|
|
359
|
-
`\u` reaches only code points up to U+FFFF. Both forms mean the same thing.
|
|
360
|
-
`package-build format --write` (Prettier) rewrites such an escape into the
|
|
361
|
-
character itself, so a mapping note on disk usually holds the raw Private Use
|
|
362
|
-
characters, as the note above does. Those read only in one of the fonts
|
|
363
|
-
package's faces or its editor fonts, and elsewhere show as boxes. The
|
|
364
|
-
convention is a trailing comment, `# U+F0230`, on every row, which keeps the
|
|
365
|
-
note readable in any editor and survives formatting. A row that writes several
|
|
366
|
-
code points lists them all in its comment.
|
|
367
|
-
|
|
368
|
-
**Where the checks sit.** Every key is checked at its own line and column:
|
|
369
|
-
|
|
370
|
-
> `` `data.map.name` is `Vyl_Semaron`; a map's name is lowercase letters, digits and `-` ``
|
|
371
|
-
|
|
372
|
-
> `` `data.map.rows[4]` has `before: consonant`, and the map states no `vowels` to read it by ``
|
|
373
|
-
|
|
374
|
-
> `` `data.map.rows[1]` has an empty `from`; a row matches one or more characters ``
|
|
375
|
-
|
|
376
|
-
> `` `data.map.fonts` is empty; a map lists each face it is drawn in ``
|
|
377
|
-
|
|
378
|
-
> `` `data.map.rows[5]` writes U+F0239, which the font `semaron-kuriale`, listed in `data.map.fonts`, does not draw ``
|
|
379
|
-
|
|
380
|
-
A row with a fault is left out of the map and the rest apply.
|
|
381
|
-
|
|
382
|
-
## How a mapping treats punctuation
|
|
383
|
-
|
|
384
|
-
The language note's `data.roman` lists its exact permitted Roman source
|
|
385
|
-
characters. Include capitals, accents, digits and punctuation explicitly;
|
|
386
|
-
`package-build lint` checks them before mapping. A map cannot admit a character
|
|
387
|
-
that the language's inventory excludes. There are no automatic punctuation
|
|
388
|
-
substitutions.
|
|
389
|
-
|
|
390
|
-
The toolchain is used with one convention for marks: **mood, questions and
|
|
391
|
-
quotation are carried by words, not marks,** unless a language's note rules
|
|
392
|
-
otherwise. A mapping therefore lists the marks its script has and nothing more.
|
|
393
|
-
In the sample, only a period writes the script's pause point:
|
|
394
|
-
|
|
395
|
-
```yaml
|
|
396
|
-
- [".", "\U000F0268"] # U+F0268
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
(Formatting rewrites the escapes, as above.) A character with no row passes
|
|
400
|
-
through unchanged, and the face does not draw it, so a question mark in a
|
|
401
|
-
mapped run is an error that names the mark and the mapping:
|
|
402
|
-
|
|
403
|
-
> `` `?` (U+003F) is not drawn by the font `semaron-kuriale`, and the map `semaron` has no row for it ``
|
|
404
|
-
|
|
405
|
-
The remedy is to write the question or the quotation in words, as the language
|
|
406
|
-
does, and leave the mark out of the run. A language whose note permits a mark
|
|
407
|
-
includes it in `data.roman`; its script needs a row for that mark as well.
|
|
408
|
-
Vylari permits period alone as punctuation. Its lexical catch is written with
|
|
409
|
-
a grave-accented vowel, as in `kàralzon`, and that vowel needs its own mapping
|
|
410
|
-
row; an apostrophe is not another spelling of it.
|
|
82
|
+
The language note's `data.roman` lists additions to the shared standard:
|
|
83
|
+
letters in their accepted cases, accented letters, catch signs and digits.
|
|
84
|
+
List each character once in NFC spelling. Standard punctuation and whitespace
|
|
85
|
+
are supplied automatically. A language that lists uppercase letters accepts
|
|
86
|
+
them; the build changes no authored case.
|
|
87
|
+
|
|
88
|
+
The terminals are `.` for a statement, `?` for a question, `‼` for an imperative
|
|
89
|
+
and `!` for an exclamation. None is required. A comma pauses within a sentence;
|
|
90
|
+
use it instead of `;` or `:`, and use a period between complete sentences.
|
|
91
|
+
Quotation pairs alternate `«…»`, `‹…›`, then `«…»` at successive depths.
|
|
92
|
+
English double quotes, `<<` and `>>` are findings. A closing quote is not a
|
|
93
|
+
terminal for the enclosing sentence.
|
|
94
|
+
|
|
95
|
+
An em dash interrupts a sentence. An ellipsis at a sentence's start resumes
|
|
96
|
+
one; later it abandons one. An interruption or abandonment takes an immediate
|
|
97
|
+
terminal unless it ends the run. Write `…`, not three periods. Markdown
|
|
98
|
+
escapes are removed before encoding, and diagnostics retain the source position.
|
|
99
|
+
|
|
100
|
+
Every `Zs` space separator and U+0009 through U+000D count as whitespace. A run
|
|
101
|
+
of them is one word separator, which the encoding writes by its own rule.
|
|
102
|
+
Newlines in prose are whitespace. In a verse fence, line endings supply line
|
|
103
|
+
boundaries, blank lines supply stanza boundaries, and `--- {.canto}` on its
|
|
104
|
+
own line supplies a canto boundary. Do not type a verse slash `/` inside the
|
|
105
|
+
fence; an inline quotation of verse may use it. Verse indentation is layout,
|
|
106
|
+
not a punctuation character added to the encoded words.
|
|
107
|
+
|
|
108
|
+
A `.name` child in a language run reaches the encoding with standard `{…}`
|
|
109
|
+
name boundaries. An `.emph` child contributes the same letters with emphasis
|
|
110
|
+
presentation. Both inherit the surrounding native writing when they state no
|
|
111
|
+
run keys.
|
|
112
|
+
|
|
113
|
+
Write an exact native character through codage, such as `⟦U+F0230⟧`, or a name
|
|
114
|
+
that the chosen encoding defines. Literal codes are immutable; ordinary letter
|
|
115
|
+
and punctuation rules do not reinterpret their contents. A setting-script
|
|
116
|
+
character pasted directly into a configured language run is a finding. The
|
|
117
|
+
same restriction applies to a face that can draw it.
|
|
118
|
+
|
|
119
|
+
A `!` touching the `[` of another span is Markdown image syntax. Separate the
|
|
120
|
+
terminal from the following span, or escape the terminal.
|
|
121
|
+
|
|
122
|
+
## Encodings
|
|
123
|
+
|
|
124
|
+
An encoding is a `doc` note. Its `data.language` is a configured language
|
|
125
|
+
alias, `data.font` is one installed font slug, and `data.mappings` maps Roman
|
|
126
|
+
strings to a font glyph code or a sequence of codes. `data.rules` holds the
|
|
127
|
+
closed executable rules. Optional `data.accepts` states accepted characters
|
|
128
|
+
or ranges and `data.vowels` states contextual vowels. The note body explains
|
|
129
|
+
the spelling to a reader.
|
|
130
|
+
|
|
131
|
+
The font supplies each glyph's `code` beside its `codepoint` in `fonts.json`.
|
|
132
|
+
Codes belong to the selected font; the note never repeats a code table.
|
|
133
|
+
Unknown fields, glyph codes, languages and fonts are positioned findings.
|
|
134
|
+
An encoding's output must decode unambiguously, including across adjacent
|
|
135
|
+
mappings and spaces. The compiler refuses indistinguishable spellings rather
|
|
136
|
+
than choosing a guessed reading. See [the executable rules](../encoding-core.md).
|
|
137
|
+
|
|
138
|
+
Mappings match longest first; contextual before-vowel rules precede their
|
|
139
|
+
unconditional alternatives. A case rule may allow lowercase and initial-capital
|
|
140
|
+
groups while refusing other mixed or uppercase group spellings. Encoding keeps
|
|
141
|
+
authored case and never rewrites a word's Roman spelling.
|
|
142
|
+
|
|
143
|
+
Outside literal markers, a run of Unicode Zs characters or U+0009 through
|
|
144
|
+
U+000D writes one space. Other whitespace needs an explicit mapping. Standard
|
|
145
|
+
Roman punctuation, verse and name controls are inherited from the shared
|
|
146
|
+
standard; an explicit mapping can give a standard source its font glyph.
|
|
147
|
+
|
|
148
|
+
### Literal codes
|
|
149
|
+
|
|
150
|
+
Inside an encoded run, `⟦…⟧` writes the selected font's glyph codes or exact
|
|
151
|
+
Unicode scalars: `[⟦MAN⟧]{enc=khelzethuenc}` where `MAN` is defined, and
|
|
152
|
+
`[⟦U+00E1⟧]{enc=vylsemaronenc}` for an exact character. A Unicode code takes four to
|
|
153
|
+
six uppercase hexadecimal digits, U+0000 through U+10FFFF excluding
|
|
154
|
+
surrogates. Codes come only from the font; Unicode database
|
|
155
|
+
names are not inferred. Whitespace between codes writes nothing. Nested or
|
|
156
|
+
unmatched markers, unknown codes and standard marks absent from the font
|
|
157
|
+
code table are errors. Without an encoding, a literal marker is a finding.
|
|
158
|
+
|
|
159
|
+
Each outer marker writes its own invisible control. Payload occurrences of
|
|
160
|
+
those controls or the literal escape are quoted with U+E0115. Decoding
|
|
161
|
+
unquotes the payload before reading code rows and uses `U+XXXX` for scalars
|
|
162
|
+
with no code name. Variation selectors U+E0100 through U+E01EF are valid
|
|
163
|
+
encoded characters and carry distinctions the visible font does not draw.
|
|
411
164
|
|
|
412
165
|
## The dictionary first
|
|
413
166
|
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
language's
|
|
417
|
-
|
|
418
|
-
**How a run is split into words.** A word is a run of letters, combining marks
|
|
419
|
-
and digits, with an apostrophe (`'` or `’`), a hyphen or an en dash joining two
|
|
420
|
-
such runs into one word. `k'aralzon` is one word and `zaron-lonak` is one word
|
|
421
|
-
for lookup. Everything between words is spelled by the rows.
|
|
422
|
-
|
|
423
|
-
**How a word is written.** The word is looked up as written, and then in
|
|
424
|
-
lowercase. A word that states a `native` form for the run's mapping (for the
|
|
425
|
-
run's face where an entry names one, else the one for no face) is written by it
|
|
426
|
-
whole. Every other word, with every derived form of an exception word, is
|
|
427
|
-
spelled by the rows. There are no stem-level exceptions: the plural of an
|
|
428
|
-
exception word is another word, and the rows spell it.
|
|
429
|
-
|
|
430
|
-
**A native form states only an exception.** `native` is a list of
|
|
431
|
-
`{ map, font, text }` on a word:
|
|
167
|
+
A language's configured note supplies `data.words`, including the nearest
|
|
168
|
+
complete inherited definition from its `data.family` chain. Grammar and names
|
|
169
|
+
remain the current language's own. Native entries use `{enc, font?, text}`.
|
|
432
170
|
|
|
433
171
|
```yaml
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
172
|
+
words:
|
|
173
|
+
- form: zaron
|
|
174
|
+
class: n
|
|
175
|
+
field: Law
|
|
176
|
+
gloss: an oath
|
|
177
|
+
native:
|
|
178
|
+
- { enc: vylsemaronenc, text: "\U000F024F\U000F0230\U000F023F\U000F023C" }
|
|
440
179
|
```
|
|
441
180
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
> `` `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 ``
|
|
447
|
-
|
|
448
|
-
so a dictionary holds its exceptions and nothing else. The other checks of a
|
|
449
|
-
native form (an unknown map, a face the map is not for, a second form for one
|
|
450
|
-
map, a character the face does not draw) report at the entry:
|
|
451
|
-
|
|
452
|
-
> `` `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`? ``
|
|
453
|
-
|
|
454
|
-
> `` `data.words[0].native[2]` states a second native form for the map `semaron`; the first is `data.words[0].native[0]` ``
|
|
455
|
-
|
|
456
|
-
> `` `data.words[0].native[0]` holds U+F024F, which the font `semaron-kuriale`, listed in the map `semaron`, does not draw ``
|
|
457
|
-
|
|
458
|
-
**Capitals.** A capitalised word that is found only in lowercase takes its
|
|
459
|
-
capital from the rows: the rows spell the first sound as written and in
|
|
460
|
-
lowercase, and where the native form begins with the lowercase spelling, that
|
|
461
|
-
beginning is replaced by the capital. A native form that does not begin the way
|
|
462
|
-
the rows begin the word cannot be capitalised, and the capitalised word is an
|
|
463
|
-
error at its place in the run:
|
|
181
|
+
Every encoding tries the word's own writing, then complete native parts,
|
|
182
|
+
affixes and explicitly named grammatical endings, then its rows. A face-specific
|
|
183
|
+
entry takes precedence. A native entry repeating what all applicable rows give
|
|
184
|
+
is redundant and is reported at that entry.
|
|
464
185
|
|
|
465
|
-
|
|
186
|
+
Exact case and exact variants are tried before folded lookup. A lowercase
|
|
187
|
+
native exception can take an initial capital where the rows identify its first
|
|
188
|
+
sound in both cases and its native text begins with the lowercase result.
|
|
189
|
+
That prefix is replaced by the capital result. An ambiguous or uninferable
|
|
190
|
+
capital needs an explicitly authored case-specific entry. Explicit entries
|
|
191
|
+
retain authority; their pronunciation or glyph choices are not inferred.
|
|
466
192
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
> `` `zaron` is written U+F024F by the lexicon of `vyl` for the map `semaron`, which the font `semaron-kuriale` does not draw ``
|
|
473
|
-
|
|
474
|
-
A native run whose explicit `lang=` is a bare BCP 47 tag, and a declared
|
|
475
|
-
language with no `note` are spelled by the rows alone.
|
|
193
|
+
A derived form uses a native grammatical ending only when the complete stem
|
|
194
|
+
and ending writings exist. Otherwise the rows spell the complete form. Missing
|
|
195
|
+
parts never invent signs. A bare encoding without a language uses its rows and
|
|
196
|
+
inline codes alone.
|
|
476
197
|
|
|
477
198
|
## The checks
|
|
478
199
|
|
|
479
200
|
A run with `lang=`, whose language has a `note`, is checked word by
|
|
480
201
|
word. This applies to Roman language-only runs and native runs alike;
|
|
481
|
-
|
|
202
|
+
Encoding selection does not turn vocabulary checks off. The comparison is case folded and NFC, with `’` read as `'`. A word passes
|
|
482
203
|
when it is any of these:
|
|
483
204
|
|
|
484
205
|
1. **A lexicon word:** a `data.words[].form` of the language. A form listed in a
|
|
@@ -541,25 +262,24 @@ Bare `other`, `kept`, `ancient` and `translation` rows are not checked.
|
|
|
541
262
|
noun stated with its own plural and the plural the rule gives both pass, and no
|
|
542
263
|
check asks that a word takes the right ending.
|
|
543
264
|
|
|
544
|
-
**
|
|
545
|
-
reports once per run, at the start of the matched `from`:
|
|
265
|
+
**Encoding coverage** refuses an unknown character at its source position:
|
|
546
266
|
|
|
547
|
-
> ``
|
|
267
|
+
> ``"x" (U+0078) is not in the `semaron` encoding``
|
|
548
268
|
|
|
549
269
|
and a row that writes a code point the face lacks reports where it is applied:
|
|
550
270
|
|
|
551
|
-
> `` `ch`
|
|
271
|
+
> `` `ch` encodes to U+F0299 in `semaron`, which the font `semaron-kuriale` does not draw ``
|
|
552
272
|
|
|
553
273
|
**Keys that name nothing.** A key that names nothing is the one finding, and
|
|
554
274
|
the run is not then checked against a face or a lexicon it cannot reach.
|
|
555
275
|
|
|
556
276
|
> `` `semaron-kurial` is not a font: `font=` names an installed face, or `mono`, `serif` or `sans`; did you mean `semaron-kuriale`? ``
|
|
557
277
|
|
|
558
|
-
> `` `semron` is not
|
|
278
|
+
> `` `semron` is not an encoding document ``
|
|
559
279
|
|
|
560
280
|
> `` `q` is not a declared language (`languages` in package-build.config.yaml) or a BCP 47 tag ``
|
|
561
281
|
|
|
562
|
-
> `` `thuravark-carved` is not a font of
|
|
282
|
+
> `` `thuravark-carved` is not a font of encoding `semaron`; it is for `semaron-kuriale` ``
|
|
563
283
|
|
|
564
284
|
> `` `semaron-kuriale` is not a font: `font=` names `mono`, `serif` or `sans`, or a face of @heroiclands/fonts, which this package has not installed ``
|
|
565
285
|
|
|
@@ -622,7 +342,7 @@ With the note above, a run accepts:
|
|
|
622
342
|
|
|
623
343
|
A near miss such as _alathe_ is still an unknown word. To see every form the
|
|
624
344
|
rules give, each beside the word it comes from, run
|
|
625
|
-
`package-build lexicon vyl --
|
|
345
|
+
`package-build lexicon vyl --enc vylsemaronenc --derived`.
|
|
626
346
|
|
|
627
347
|
The keys are checked where they sit:
|
|
628
348
|
|
|
@@ -636,100 +356,71 @@ The keys are checked where they sit:
|
|
|
636
356
|
|
|
637
357
|
> `` `data.affixes[1].attachesTo[0]` is `verb`, which is not a word class; did you mean `v`? ``
|
|
638
358
|
|
|
639
|
-
##
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
A word is written by the first of these that gives a writing, matched case
|
|
649
|
-
folded because the script has no capitals:
|
|
650
|
-
|
|
651
|
-
1. **Its own `native` entry** for the map (the run's face where an entry names
|
|
652
|
-
one, else the one for no face), or the entry of a set compound written its
|
|
653
|
-
own way.
|
|
654
|
-
2. **Its parts, joined.** The roots of the entry's `built` list in order; each
|
|
655
|
-
piece is a lexicon word or an affix of `data.affixes` with a `native` entry of
|
|
656
|
-
its own, resolved the same way down. A noun's plural and a verb's present
|
|
657
|
-
forms are the stem's writing followed by the ending's, which
|
|
658
|
-
`data.grammar.native` states once per ending: `plural`, or one of the persons
|
|
659
|
-
`I`, `you`, `heShe`, `we`, `youAll` and `they`.
|
|
660
|
-
3. **Its hyphenated parts,** each by these same steps, so `Gar-halzunet` is
|
|
661
|
-
`Gar-`'s writing followed by `halzunet`'s.
|
|
662
|
-
4. **Otherwise an error** at the word.
|
|
663
|
-
|
|
664
|
-
Forms outside the parts rule (a suffix that replaces a vowel, an agreeing form,
|
|
665
|
-
a participle) have no writing of their own. They are coined as lexicon words
|
|
666
|
-
with a writing, or written in signs.
|
|
359
|
+
## Native spellings and parts
|
|
360
|
+
|
|
361
|
+
Every encoding uses the same order for a language word: its own `native`
|
|
362
|
+
entry for that encoding and face; otherwise the writings of all its parts;
|
|
363
|
+
otherwise the encoding's rows. A face-specific entry precedes an entry for no
|
|
364
|
+
face. Exact lexical forms precede folded lookup, so separately authored
|
|
365
|
+
capitalized spellings keep their own native text. A flat variant is a lexical
|
|
366
|
+
form; it does not assign a grammatical role by itself.
|
|
667
367
|
|
|
668
368
|
```yaml
|
|
669
|
-
affixes:
|
|
670
|
-
- form: "-unet"
|
|
671
|
-
gloss: "a thing made of"
|
|
672
|
-
native:
|
|
673
|
-
- { map: zethu, text: "" }
|
|
674
|
-
grammar:
|
|
675
|
-
plural:
|
|
676
|
-
- { ending: "", becomes: "im" }
|
|
677
|
-
native:
|
|
678
|
-
- { ending: plural, map: zethu, text: "" }
|
|
679
369
|
words:
|
|
680
370
|
- form: halzi
|
|
681
371
|
class: n
|
|
682
|
-
field: The body
|
|
683
372
|
gloss: heart
|
|
373
|
+
field: Words
|
|
684
374
|
native:
|
|
685
|
-
- {
|
|
375
|
+
- { enc: zethu, text: "\U0001EABB" }
|
|
686
376
|
- form: halzunet
|
|
687
377
|
class: n
|
|
688
|
-
field: The body
|
|
689
378
|
gloss: the account
|
|
379
|
+
field: Words
|
|
690
380
|
built: [halzi, -unet]
|
|
381
|
+
affixes:
|
|
382
|
+
- form: -unet
|
|
383
|
+
gloss: a thing made of
|
|
384
|
+
native:
|
|
385
|
+
- { enc: zethu, text: "\U0001EBC7" }
|
|
691
386
|
```
|
|
692
387
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
writing
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
> `` `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` ``
|
|
723
|
-
|
|
724
|
-
> `` `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 ``
|
|
725
|
-
|
|
726
|
-
> `` `data.grammar.native[3]` writes the ending `they`, and `data.grammar.verbs` states no `persons` ``
|
|
388
|
+
A built part is an exact word or affix, then the same form with joining
|
|
389
|
+
hyphens removed. Parts can themselves be built. A plural or present form can
|
|
390
|
+
use the stem's writing followed by its explicitly named ending from
|
|
391
|
+
`grammar.native`, whose entries use `{ending, enc, font?, text}`. These
|
|
392
|
+
writings work under every encoding. Missing parts do not invent signs, and
|
|
393
|
+
recursive parts terminate without a writing. Entries with genuinely different
|
|
394
|
+
writings remain an ambiguity naming every matching gloss.
|
|
395
|
+
|
|
396
|
+
An encoding accepting no letters, such as `zethu` or `chalish-pilam`, needs a
|
|
397
|
+
lexical writing or literal codes for a word. The refusal names the word,
|
|
398
|
+
language and encoding and points to that word.
|
|
399
|
+
|
|
400
|
+
### Reading script text
|
|
401
|
+
|
|
402
|
+
Without a language, decoding is exactly the encoding's longest-output match.
|
|
403
|
+
With a language, explicit native and composed writings are tried first,
|
|
404
|
+
longest first; a shared writing uses the first listed sense. Literal marker
|
|
405
|
+
spans decode through their inline codes. Unknown unmarked signs in a script
|
|
406
|
+
accepting no letters become `⟦codes⟧` with a finding.
|
|
407
|
+
|
|
408
|
+
For an unmarked word, the lexicon can recover its unwritten sounds from the
|
|
409
|
+
plain decoded skeleton. A unique skeleton gives its form; a shared skeleton
|
|
410
|
+
gives the first authored form. Each word's citation precedes its variants and derived forms, before the next word's citation. Registered names retain their authored order. Complete names are matched longest first across word separators and receive one pair of braces. A known ordinary word keeps its encoded case without a false unknown-word finding. An unknown skeleton keeps the
|
|
411
|
+
plain decoding and produces a located finding. This is decided per word: a
|
|
412
|
+
passage can mix typed words with encoded words. A word carrying any invisible
|
|
413
|
+
mark keeps exact decoding without skeleton recovery; an explicit authored
|
|
414
|
+
native exception still has precedence. Stress marks are preserved by exact
|
|
415
|
+
rows. Names are represented with braces according to the language's rules.
|
|
727
416
|
|
|
728
417
|
## Emphasis in a script
|
|
729
418
|
|
|
730
|
-
Inside a run
|
|
731
|
-
|
|
732
|
-
the
|
|
419
|
+
Inside a language run, mark a stressed word as `[word]{.emph}`. The span
|
|
420
|
+
inherits its surrounding language, face and encoding, so its letters follow
|
|
421
|
+
the same writing rules as the rest of the run. In English, `.emph` equals
|
|
422
|
+
`*…*`, and `.strong` equals `**…**`. Non-English spans refuse `.strong` and
|
|
423
|
+
Markdown emphasis. The build sets `.emph` by the language's or script's convention:
|
|
733
424
|
|
|
734
425
|
| Convention | Site and Foundry | Book |
|
|
735
426
|
| ---------- | -------------------------------------------------- | --------------------- |
|
|
@@ -752,12 +443,11 @@ data:
|
|
|
752
443
|
script:
|
|
753
444
|
fonts: [semaron-kuriale]
|
|
754
445
|
emphasis: rubric
|
|
755
|
-
strongEmphasis: overline
|
|
756
446
|
```
|
|
757
447
|
|
|
758
448
|
`fonts` lists the faces of the script (a face belongs to one script),
|
|
759
|
-
`emphasis` sets
|
|
760
|
-
|
|
449
|
+
`emphasis` sets `.emph` and accepted English emphasis. A tongue that states
|
|
450
|
+
nothing takes its script's convention.
|
|
761
451
|
|
|
762
452
|
**Non-English spans do not take Markdown emphasis.** Bold and italic markup in
|
|
763
453
|
a span with an effective non-English language is an error, whether it has a
|
|
@@ -766,13 +456,12 @@ English (`en`) and English BCP 47 tags remain eligible. Escaped literal
|
|
|
766
456
|
delimiters are not emphasis. This restriction applies throughout the note.
|
|
767
457
|
|
|
768
458
|
`data.emphasis: words` also makes emphasis an error: it says the language marks
|
|
769
|
-
stress with a word, so stars in its runs are refused:
|
|
459
|
+
stress with a word, so `.emph` and stars in its runs are refused:
|
|
770
460
|
|
|
771
461
|
> `` `ban` marks emphasis with a word, not a mark; write the word ``
|
|
772
462
|
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
crosses the star is not matched.
|
|
463
|
+
A strikethrough is an error in a face. Mark a whole stressed word: a mark
|
|
464
|
+
inside a word splits the text, so a row or lexicon word crossing it cannot match.
|
|
776
465
|
|
|
777
466
|
**The `--rubric` token.** The theme's `--rubric` is a warm red for its dark
|
|
778
467
|
ground, and the book prints its own. A rubric carries emphasis by colour alone,
|
|
@@ -798,7 +487,7 @@ the contents of a fence byte for byte, which is why a poem is a fence and not
|
|
|
798
487
|
paragraphs: indentation, line breaks and spans survive formatting untouched.
|
|
799
488
|
|
|
800
489
|
````markdown
|
|
801
|
-
```verse {lang=vyl font=semaron-kuriale
|
|
490
|
+
```verse {lang=vyl font=semaron-kuriale enc=vylsemaronenc}
|
|
802
491
|
Lokazor lonak.
|
|
803
492
|
lokamen zaron.
|
|
804
493
|
```
|
|
@@ -822,20 +511,20 @@ fills it, and the last row begins a new stanza:
|
|
|
822
511
|
|
|
823
512
|
````markdown
|
|
824
513
|
```verse {numstep=1 lang=vyl cols=3}
|
|
825
|
-
1 [Lokazor lonak zaron.]{lang=vyl
|
|
514
|
+
1 [Lokazor lonak zaron.]{lang=vyl enc=vylsemaronenc}
|
|
826
515
|
3 [He walks the oath road.]{lang=en}
|
|
827
|
-
3 [Lokazor lonak zaron.]{lang=vyl}
|
|
516
|
+
3 [Lokazor lonak zaron.]{lang=vyl enc=default}
|
|
828
517
|
|
|
829
|
-
1 [Lokamen lonak zaron.]{lang=vyl
|
|
518
|
+
1 [Lokamen lonak zaron.]{lang=vyl enc=vylsemaronenc}
|
|
830
519
|
2 [Nothing to say]{lang=en}
|
|
831
520
|
3 [I walk the oath road.]{lang=en}
|
|
832
|
-
3 [Lokamen lonak zaron.]{lang=vyl}
|
|
521
|
+
3 [Lokamen lonak zaron.]{lang=vyl enc=default}
|
|
833
522
|
|
|
834
523
|
***
|
|
835
524
|
|
|
836
|
-
1 [alathos lokazor.]{lang=vyl
|
|
525
|
+
1 [alathos lokazor.]{lang=vyl enc=vylsemaronenc}
|
|
837
526
|
3 [That one walks.]{lang=en}
|
|
838
|
-
3 [alathos lokazor.]{lang=vyl}
|
|
527
|
+
3 [alathos lokazor.]{lang=vyl enc=default}
|
|
839
528
|
```
|
|
840
529
|
````
|
|
841
530
|
|
|
@@ -941,7 +630,7 @@ paragraphs, and each paragraph starts at the top of a fresh column. `rows=`
|
|
|
941
630
|
sets the characters in a column and `cols=` the columns in a panel:
|
|
942
631
|
|
|
943
632
|
````markdown
|
|
944
|
-
```scroll {rows=25 cols=12 lang=tsu
|
|
633
|
+
```scroll {rows=25 cols=12 lang=tsu enc=tsutengchouenc}
|
|
945
634
|
chen teng chou hing
|
|
946
635
|
tan tsou dou rou
|
|
947
636
|
|
|
@@ -949,8 +638,8 @@ gen chei chou tsuen
|
|
|
949
638
|
```
|
|
950
639
|
````
|
|
951
640
|
|
|
952
|
-
|
|
953
|
-
|
|
641
|
+
The Tantsou encoding document names its language and the `teng-chou` font;
|
|
642
|
+
its Address selects both. A language-only scroll keeps Roman text.
|
|
954
643
|
|
|
955
644
|
The site, the preview and Foundry set it in columns, in a panel that scrolls
|
|
956
645
|
sideways from the right. The book draws it as panel images from the face's
|
|
@@ -1010,38 +699,35 @@ package's own output: the site copies `fonts.css`, the WOFF2 files and the
|
|
|
1010
699
|
licence to `fonts/heroiclands/<version>/` beside the pages and links them from
|
|
1011
700
|
every page; Foundry stages the same files; the book adds the TrueType files to
|
|
1012
701
|
the typesetter's font search path. A package that has not installed the fonts, or
|
|
1013
|
-
whose notes
|
|
702
|
+
whose notes select no native face, ships none of it.
|
|
1014
703
|
|
|
1015
704
|
## The commands
|
|
1016
705
|
|
|
1017
|
-
`package-build
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
```
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
706
|
+
`package-build encode --enc <name|file> [--in|-i <file>] [--out|-o <file>] [text..]`
|
|
707
|
+
encodes one string argument or the UTF-8 file named by `--in`; `--in -` reads
|
|
708
|
+
standard input. `package-build decode` takes the same options and reads code
|
|
709
|
+
points back through the encoding. An encoding is a document Address, with `doc` as the default type.
|
|
710
|
+
These commands apply the bare encoding. The [browser conversion API](../api.md#browser-conversion)
|
|
711
|
+
uses the same implementation with a language's vocabulary and lexical recovery.
|
|
712
|
+
|
|
713
|
+
```sh
|
|
714
|
+
package-build encode --enc vylsemaronenc "zaron lonak"
|
|
715
|
+
package-build encode --enc khelqalezuenc --in roman.txt --out native.txt
|
|
716
|
+
package-build decode --enc khelqalezuenc --in native.txt --out roman.txt
|
|
717
|
+
package-build encode --enc khelzethuenc "⟦MAN⟧"
|
|
1029
718
|
```
|
|
1030
719
|
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
`
|
|
1035
|
-
lists every word of the language with its native form under the map, or under
|
|
1036
|
-
the language's `writtenIn` script when `--map` is left out, tab-separated: the form,
|
|
1037
|
-
the native form, `exception` or `rows`, the class and the gloss. `--derived`
|
|
720
|
+
`package-build lexicon <language> [--enc <name>] [--font <slug>] [--derived] [--json]`
|
|
721
|
+
lists every word of the language with its native form under the encoding, or under
|
|
722
|
+
the explicitly selected encoding document, tab-separated: the form,
|
|
723
|
+
the native form, `own`, `parts`, `rows` or `none`, the class and the gloss. `--derived`
|
|
1038
724
|
adds the forms the language's rules derive, each with the word it comes from,
|
|
1039
|
-
`--json` prints an array instead, and
|
|
725
|
+
`--json` prints an array instead, and the third column
|
|
1040
726
|
is `own`, `parts`, `none` or `ambiguous`.
|
|
1041
727
|
|
|
1042
728
|
```console
|
|
1043
|
-
$ package-build lexicon vyl --
|
|
1044
|
-
zaron
|
|
729
|
+
$ package-build lexicon vyl --enc vylsemaronenc | cut -f1,3-
|
|
730
|
+
zaron own n an oath
|
|
1045
731
|
lonak rows n a road
|
|
1046
732
|
lokathen rows v to walk
|
|
1047
733
|
alathos rows pron he, that one
|
|
@@ -1055,8 +741,8 @@ thiruthrimar rows n a sworn witness
|
|
|
1055
741
|
|
|
1056
742
|
This builds a small package from nothing: a language, a script, a couplet and a
|
|
1057
743
|
poem. It is the guide's own test: every file below is written into a project and
|
|
1058
|
-
linted, and the findings printed are the ones the lint reports. The
|
|
1059
|
-
|
|
744
|
+
linted, and the findings printed are the ones the lint reports. The sample selects the
|
|
745
|
+
installed Semaron encoding.
|
|
1060
746
|
|
|
1061
747
|
Install the fonts, then write the configuration. A package that declares
|
|
1062
748
|
dependencies in its configuration fetches their indexes with
|
|
@@ -1120,8 +806,7 @@ name: { full: Vylari Language }
|
|
|
1120
806
|
type: skill
|
|
1121
807
|
subType: language
|
|
1122
808
|
data:
|
|
1123
|
-
roman: "ABDEFGHIKLMNOPRSTUVWYZabdefghiklmnoprstuvwyzÁÉÍÓÚÝáéíóúýËëÀà0123456789
|
|
1124
|
-
writtenIn: { map: semaron, font: semaron-kuriale }
|
|
809
|
+
roman: "ABDEFGHIKLMNOPRSTUVWYZabdefghiklmnoprstuvwyzÁÉÍÓÚÝáéíóúýËëÀà0123456789"
|
|
1125
810
|
core: true
|
|
1126
811
|
fields:
|
|
1127
812
|
- { name: Law, holds: "Oaths, seals and roads." }
|
|
@@ -1159,7 +844,7 @@ data:
|
|
|
1159
844
|
gloss: an oath
|
|
1160
845
|
concept: oath-noun
|
|
1161
846
|
native:
|
|
1162
|
-
- {
|
|
847
|
+
- { enc: vylsemaronenc, text: "" }
|
|
1163
848
|
- { form: lonak, class: n, field: Law, gloss: a road, concept: road-noun }
|
|
1164
849
|
- { form: lokathen, class: v, field: Law, gloss: to walk, concept: walk-verb }
|
|
1165
850
|
- { form: alathos, class: pron, field: Law, gloss: "he, that one" }
|
|
@@ -1169,6 +854,196 @@ The imperial tongue of the sample setting, written in the Semaron script and
|
|
|
1169
854
|
read aloud at its court. The lexicon here is a small sample made for the guide.
|
|
1170
855
|
```
|
|
1171
856
|
|
|
857
|
+
**`assets/content/Docs/Vylari_Encoding.md`**
|
|
858
|
+
|
|
859
|
+
```markdown
|
|
860
|
+
---
|
|
861
|
+
type: doc
|
|
862
|
+
subType: reference
|
|
863
|
+
shortcode: vylsemaronenc
|
|
864
|
+
name:
|
|
865
|
+
full: Vylari in Semaron
|
|
866
|
+
data:
|
|
867
|
+
language: vyl
|
|
868
|
+
font: semaron-kuriale
|
|
869
|
+
accepts:
|
|
870
|
+
- a-z
|
|
871
|
+
- A-Z
|
|
872
|
+
- 0-9
|
|
873
|
+
- "'"
|
|
874
|
+
- "-"
|
|
875
|
+
- "`"
|
|
876
|
+
- Á
|
|
877
|
+
- É
|
|
878
|
+
- Í
|
|
879
|
+
- Ó
|
|
880
|
+
- Ú
|
|
881
|
+
- á
|
|
882
|
+
- é
|
|
883
|
+
- í
|
|
884
|
+
- ó
|
|
885
|
+
- ú
|
|
886
|
+
- ’
|
|
887
|
+
vowels: aeiouAEIOUáéíóúÁÉÍÓÚ
|
|
888
|
+
mappings:
|
|
889
|
+
"0": DIGIT_ZERO
|
|
890
|
+
"1": DIGIT_ONE
|
|
891
|
+
"2": DIGIT_TWO
|
|
892
|
+
"3": DIGIT_THREE
|
|
893
|
+
"4": DIGIT_FOUR
|
|
894
|
+
"5": DIGIT_FIVE
|
|
895
|
+
"6": DIGIT_SIX
|
|
896
|
+
"7": DIGIT_SEVEN
|
|
897
|
+
"8": DIGIT_EIGHT
|
|
898
|
+
"9": DIGIT_NINE
|
|
899
|
+
a: ANKRON_MIN
|
|
900
|
+
A: ANKRON_MAJ
|
|
901
|
+
e: ELZA_MIN
|
|
902
|
+
E: ELZA_MAJ
|
|
903
|
+
i: ILTHERA_MIN
|
|
904
|
+
I: ILTHERA_MAJ
|
|
905
|
+
o: ORNETHE_MIN
|
|
906
|
+
O: ORNETHE_MAJ
|
|
907
|
+
u: ULMERA_MIN
|
|
908
|
+
U: ULMERA_MAJ
|
|
909
|
+
b: BRUTHEKA_MIN
|
|
910
|
+
B: BRUTHEKA_MAJ
|
|
911
|
+
d: DEKAZU_MIN
|
|
912
|
+
D: DEKAZU_MAJ
|
|
913
|
+
f: FUNELA_MIN
|
|
914
|
+
F: FUNELA_MAJ
|
|
915
|
+
g: GULMOS_MIN
|
|
916
|
+
G: GULMOS_MAJ
|
|
917
|
+
h: HARLEN_MIN
|
|
918
|
+
H: HARLEN_MAJ
|
|
919
|
+
j: JA_MIN
|
|
920
|
+
J: JA_MAJ
|
|
921
|
+
k: KALPEZA_MIN
|
|
922
|
+
K: KALPEZA_MAJ
|
|
923
|
+
l: LIZELA_MIN
|
|
924
|
+
L: LIZELA_MAJ
|
|
925
|
+
m: MEZARA_MIN
|
|
926
|
+
M: MEZARA_MAJ
|
|
927
|
+
n: NELAMIS_MIN
|
|
928
|
+
N: NELAMIS_MAJ
|
|
929
|
+
p: POZERA_MIN
|
|
930
|
+
P: POZERA_MAJ
|
|
931
|
+
q: QORETHA_MIN
|
|
932
|
+
Q: QORETHA_MAJ
|
|
933
|
+
r: RONETHOS_MIN
|
|
934
|
+
R: RONETHOS_MAJ
|
|
935
|
+
s: SIRETHA_MIN
|
|
936
|
+
S: SIRETHA_MAJ
|
|
937
|
+
t: TALOTHOS_MIN
|
|
938
|
+
T: TALOTHOS_MAJ
|
|
939
|
+
v: VARTHOS_MIN
|
|
940
|
+
V: VARTHOS_MAJ
|
|
941
|
+
w: WA_MIN
|
|
942
|
+
W: WA_MAJ
|
|
943
|
+
y: YALZEMIS_MIN
|
|
944
|
+
Y: YALZEMIS_MAJ
|
|
945
|
+
z: ZARGON_MIN
|
|
946
|
+
Z: ZARGON_MAJ
|
|
947
|
+
ch: CHEROLA_MIN
|
|
948
|
+
Ch: CHEROLA_MAJ
|
|
949
|
+
sh: SHELMORA_MIN
|
|
950
|
+
Sh: SHELMORA_MAJ
|
|
951
|
+
th: THOLERA_MIN
|
|
952
|
+
Th: THOLERA_MAJ
|
|
953
|
+
dh: DHANETHE_MIN
|
|
954
|
+
Dh: DHANETHE_MAJ
|
|
955
|
+
kh: KHORVENA_MIN
|
|
956
|
+
Kh: KHORVENA_MAJ
|
|
957
|
+
gh: GHORMAS_MIN
|
|
958
|
+
Gh: GHORMAS_MAJ
|
|
959
|
+
zh: ZHAREVA_MIN
|
|
960
|
+
Zh: ZHAREVA_MAJ
|
|
961
|
+
ts: TSALEMA_MIN
|
|
962
|
+
Ts: TSALEMA_MAJ
|
|
963
|
+
ng: ENGARIS_MIN
|
|
964
|
+
Ng: ENGARIS_MAJ
|
|
965
|
+
.: POINT
|
|
966
|
+
á:
|
|
967
|
+
- ANKRON_MIN
|
|
968
|
+
- STRESS
|
|
969
|
+
é:
|
|
970
|
+
- ELZA_MIN
|
|
971
|
+
- STRESS
|
|
972
|
+
í:
|
|
973
|
+
- ILTHERA_MIN
|
|
974
|
+
- STRESS
|
|
975
|
+
ó:
|
|
976
|
+
- ORNETHE_MIN
|
|
977
|
+
- STRESS
|
|
978
|
+
ú:
|
|
979
|
+
- ULMERA_MIN
|
|
980
|
+
- STRESS
|
|
981
|
+
Á:
|
|
982
|
+
- ANKRON_MAJ
|
|
983
|
+
- STRESS
|
|
984
|
+
É:
|
|
985
|
+
- ELZA_MAJ
|
|
986
|
+
- STRESS
|
|
987
|
+
Í:
|
|
988
|
+
- ILTHERA_MAJ
|
|
989
|
+
- STRESS
|
|
990
|
+
Ó:
|
|
991
|
+
- ORNETHE_MAJ
|
|
992
|
+
- STRESS
|
|
993
|
+
Ú:
|
|
994
|
+
- ULMERA_MAJ
|
|
995
|
+
- STRESS
|
|
996
|
+
rules:
|
|
997
|
+
normalization: NFC
|
|
998
|
+
matching: longest-first
|
|
999
|
+
case:
|
|
1000
|
+
single-letter: preserve
|
|
1001
|
+
consonant-group: lowercase-or-initial-uppercase
|
|
1002
|
+
other-group-cases: forbidden
|
|
1003
|
+
stress:
|
|
1004
|
+
modifier: STRESS
|
|
1005
|
+
position: after-stressed-vowel
|
|
1006
|
+
printing: false
|
|
1007
|
+
effect: stress-only
|
|
1008
|
+
changes-sound: false
|
|
1009
|
+
changes-length: false
|
|
1010
|
+
vowel-group-position: first-vowel
|
|
1011
|
+
vowel-groups:
|
|
1012
|
+
reading: established
|
|
1013
|
+
allow-splitting: false
|
|
1014
|
+
unrecognized-adjacent-vowels: separate
|
|
1015
|
+
groups:
|
|
1016
|
+
- ai
|
|
1017
|
+
- au
|
|
1018
|
+
- ei
|
|
1019
|
+
- oi
|
|
1020
|
+
- ou
|
|
1021
|
+
- ae
|
|
1022
|
+
- ie
|
|
1023
|
+
- uo
|
|
1024
|
+
- aa
|
|
1025
|
+
- ii
|
|
1026
|
+
- uu
|
|
1027
|
+
diaeresis:
|
|
1028
|
+
allowed: false
|
|
1029
|
+
contextual-mappings:
|
|
1030
|
+
- match: ny
|
|
1031
|
+
before: vowel
|
|
1032
|
+
emit: NYELIS_MIN
|
|
1033
|
+
- match: Ny
|
|
1034
|
+
before: vowel
|
|
1035
|
+
emit: NYELIS_MAJ
|
|
1036
|
+
y:
|
|
1037
|
+
kind: consonant
|
|
1038
|
+
sound: y in yes
|
|
1039
|
+
vowel-reading: false
|
|
1040
|
+
grave-accent:
|
|
1041
|
+
allowed: false
|
|
1042
|
+
---
|
|
1043
|
+
|
|
1044
|
+
These mappings write the sample vocabulary in Semaron Kuriale. They preserve its letter case and use the font's published glyph codes. Contextual groups take their stated before-vowel spelling, and stress is retained after the accented vowel so that the written distinction can be read back exactly.
|
|
1045
|
+
```
|
|
1046
|
+
|
|
1172
1047
|
A note with a run. The couplet uses a word the lexicon does not hold:
|
|
1173
1048
|
|
|
1174
1049
|
**`assets/content/Lore/Oath_Road.md`**
|
|
@@ -1184,7 +1059,7 @@ The lintel over the door of the oath road is cut with a couplet, and the
|
|
|
1184
1059
|
stonecutter set the couplet in the script of the court, so that every traveller
|
|
1185
1060
|
could read it as the court reads it.
|
|
1186
1061
|
|
|
1187
|
-
[Lokazor lonak thiruthrimar. lokamen zaron.]{lang=vyl font=semaron-kuriale
|
|
1062
|
+
[Lokazor lonak thiruthrimar. lokamen zaron.]{lang=vyl font=semaron-kuriale enc=vylsemaronenc}
|
|
1188
1063
|
```
|
|
1189
1064
|
|
|
1190
1065
|
Linting reports the unknown word, at its first character:
|
|
@@ -1205,8 +1080,7 @@ name: { full: Vylari Language }
|
|
|
1205
1080
|
type: skill
|
|
1206
1081
|
subType: language
|
|
1207
1082
|
data:
|
|
1208
|
-
roman: "ABDEFGHIKLMNOPRSTUVWYZabdefghiklmnoprstuvwyzÁÉÍÓÚÝáéíóúýËëÀà0123456789
|
|
1209
|
-
writtenIn: { map: semaron, font: semaron-kuriale }
|
|
1083
|
+
roman: "ABDEFGHIKLMNOPRSTUVWYZabdefghiklmnoprstuvwyzÁÉÍÓÚÝáéíóúýËëÀà0123456789"
|
|
1210
1084
|
core: true
|
|
1211
1085
|
fields:
|
|
1212
1086
|
- { name: Law, holds: "Oaths, seals and roads." }
|
|
@@ -1244,7 +1118,7 @@ data:
|
|
|
1244
1118
|
gloss: an oath
|
|
1245
1119
|
concept: oath-noun
|
|
1246
1120
|
native:
|
|
1247
|
-
- {
|
|
1121
|
+
- { enc: vylsemaronenc, text: "" }
|
|
1248
1122
|
- { form: lonak, class: n, field: Law, gloss: a road, concept: road-noun }
|
|
1249
1123
|
- { form: lokathen, class: v, field: Law, gloss: to walk, concept: walk-verb }
|
|
1250
1124
|
- { form: alathos, class: pron, field: Law, gloss: "he, that one" }
|
|
@@ -1255,14 +1129,16 @@ The imperial tongue of the sample setting, written in the Semaron script and
|
|
|
1255
1129
|
read aloud at its court. The lexicon here is a small sample made for the guide.
|
|
1256
1130
|
```
|
|
1257
1131
|
|
|
1258
|
-
The lint is now clean, and the conversion can be read. `package-build
|
|
1259
|
-
|
|
1132
|
+
The lint is now clean, and the conversion can be read. `package-build encode`
|
|
1133
|
+
checks a passage through the encoding's rows:
|
|
1260
1134
|
|
|
1261
|
-
```
|
|
1262
|
-
|
|
1263
|
-
U+F020A U+F023D U+F0239 U+F0230 U+F0246 U+F023D U+F023F U+0020 U+F023A U+F023D U+F023C U+F0230 U+F0239 U+F0268 U+0020 U+F023A U+F023D U+F0239 U+F0230 U+F023B U+F0233 U+F023C U+0020 U+F0246 U+F0248 U+F023F U+F023D U+F023C U+F0268
|
|
1135
|
+
```sh
|
|
1136
|
+
package-build encode --enc vylsemaronenc "Lokazor lonak. lokamen zaron."
|
|
1264
1137
|
```
|
|
1265
1138
|
|
|
1139
|
+
The build also applies the language's recorded native writings when setting
|
|
1140
|
+
its runs.
|
|
1141
|
+
|
|
1266
1142
|
The site sets the run as
|
|
1267
1143
|
|
|
1268
1144
|
```html
|
|
@@ -1293,20 +1169,20 @@ beside its translation, and the second keeps the metre that the court keeps, so
|
|
|
1293
1169
|
that a line with the wrong count is reported to the author who wrote it.
|
|
1294
1170
|
|
|
1295
1171
|
```verse {numstep=1 lang=vyl cols=3}
|
|
1296
|
-
1 [Lokazor lonak zaron.]{lang=vyl
|
|
1172
|
+
1 [Lokazor lonak zaron.]{lang=vyl enc=vylsemaronenc}
|
|
1297
1173
|
3 [He walks the oath road.]{lang=en}
|
|
1298
|
-
3 [Lokazor lonak zaron.]{lang=vyl}
|
|
1174
|
+
3 [Lokazor lonak zaron.]{lang=vyl enc=default}
|
|
1299
1175
|
|
|
1300
|
-
1 [Lokamen lonak zaron.]{lang=vyl
|
|
1176
|
+
1 [Lokamen lonak zaron.]{lang=vyl enc=vylsemaronenc}
|
|
1301
1177
|
2 [Nothing to say]{lang=en}
|
|
1302
1178
|
3 [I walk the oath road.]{lang=en}
|
|
1303
|
-
3 [Lokamen lonak zaron.]{lang=vyl}
|
|
1179
|
+
3 [Lokamen lonak zaron.]{lang=vyl enc=default}
|
|
1304
1180
|
|
|
1305
1181
|
***
|
|
1306
1182
|
|
|
1307
|
-
1 [alathos lokazor.]{lang=vyl
|
|
1183
|
+
1 [alathos lokazor.]{lang=vyl enc=vylsemaronenc}
|
|
1308
1184
|
3 [That one walks.]{lang=en}
|
|
1309
|
-
3 [alathos lokazor.]{lang=vyl}
|
|
1185
|
+
3 [alathos lokazor.]{lang=vyl enc=default}
|
|
1310
1186
|
```
|
|
1311
1187
|
|
|
1312
1188
|
```verse {lang=vyl scan=trimeter}
|
|
@@ -1349,7 +1225,7 @@ The door is marked with the same words as the lintel. Although Semaron's
|
|
|
1349
1225
|
convention is rubric, this Vylari span uses no Markdown emphasis: spans with a
|
|
1350
1226
|
non-English language cannot contain bold or italic markup.
|
|
1351
1227
|
|
|
1352
|
-
[Lokazor lonak. zaron.]{lang=vyl font=semaron-kuriale
|
|
1228
|
+
[Lokazor lonak. zaron.]{lang=vyl font=semaron-kuriale enc=vylsemaronenc}
|
|
1353
1229
|
```
|
|
1354
1230
|
|
|
1355
1231
|
Finally, the core report lists what the language still lacks:
|
|
@@ -1362,6 +1238,6 @@ Vylari Language (skill-vylarilng): 1 of 4 core concepts have no word
|
|
|
1362
1238
|
```
|
|
1363
1239
|
|
|
1364
1240
|
Everything in this package comes from the guide. A new script follows the same
|
|
1365
|
-
steps:
|
|
1241
|
+
steps: an encoding document for its language and font, `languages` entries for the languages
|
|
1366
1242
|
written in it, a language note with the dictionary, and runs marked with the
|
|
1367
1243
|
language key and native presentation class.
|