@heroiclands/package-build 23.6.0 → 23.7.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 +42 -0
- package/docs/authoring/links-and-markup.md +266 -20
- package/docs/content-format.md +1 -1
- package/docs/reference/format-details.md +526 -70
- package/docs/reference/note-types.md +152 -38
- package/engine/content-format.yaml +10 -0
- package/engine/content-index.mjs +21 -14
- package/engine/dictionary-layout.mjs +9 -3
- package/engine/dictionary-rows.mjs +15 -25
- package/engine/index-records.mjs +1 -0
- package/engine/language-data.mjs +378 -0
- package/engine/language-rows.mjs +761 -0
- package/engine/language-terms.mjs +1203 -0
- package/engine/language-words.mjs +57 -9
- package/engine/note-addresses.mjs +38 -4
- package/engine/note-vocabulary.mjs +9 -2
- package/engine/pack-config.mjs +6 -1
- package/engine/sql-tables.mjs +71 -7
- package/engine/word-citations.mjs +206 -0
- package/engine/word-classes.mjs +1 -1
- package/engine/word-rows.mjs +193 -34
- package/engine/word-terms.mjs +83 -11
- package/package.json +1 -1
- package/types/engine/dictionary-layout.d.mts +7 -0
- package/types/engine/language-data.d.mts +22 -0
- package/types/engine/language-rows.d.mts +227 -0
- package/types/engine/language-terms.d.mts +265 -0
- package/types/engine/note-addresses.d.mts +8 -10
- package/types/engine/sql-tables.d.mts +2 -1
- package/types/engine/word-citations.d.mts +43 -0
- package/types/engine/word-rows.d.mts +78 -7
- package/types/engine/word-terms.d.mts +20 -0
|
@@ -2814,19 +2814,76 @@ public surface.
|
|
|
2814
2814
|
[language note](#a-languages-words), stubs included — in the order the note
|
|
2815
2815
|
states them:
|
|
2816
2816
|
|
|
2817
|
-
| Column | What it holds
|
|
2818
|
-
| --------------------------- |
|
|
2819
|
-
| `language` | The Address of the language note the word is written on, as another note names it: `thalorna-note-skill-provnzlng`.
|
|
2820
|
-
| `position` | Its place in the note's `data.words`, from `0`. `ORDER BY position` is the note's own order.
|
|
2821
|
-
| `form`, `class`, `gloss`, … | Every key of a word, each its own column under its own name. `name_sort` reads as the form where the word states none.
|
|
2822
|
-
| `built_text` | The `built` pieces joined with `+`, as `wulf- + -rith`; `NULL` for a root word.
|
|
2823
|
-
| `built_parts` | The pieces as a list of `{ form, gloss }`, each glossed from a word or affix of the same language, with a `NULL` gloss where none is.
|
|
2817
|
+
| Column | What it holds |
|
|
2818
|
+
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
2819
|
+
| `language` | The Address of the language note the word is written on, as another note names it: `thalorna-note-skill-provnzlng`. |
|
|
2820
|
+
| `position` | Its place in the note's `data.words`, from `0`. `ORDER BY position` is the note's own order. |
|
|
2821
|
+
| `form`, `class`, `gloss`, … | Every key of a word, each its own column under its own name. `name_sort` reads as the form where the word states none. |
|
|
2822
|
+
| `built_text` | The `built` pieces joined with `+`, as `wulf- + -rith`; `NULL` for a root word. |
|
|
2823
|
+
| `built_parts` | The pieces as a list of `{ form, gloss }`, each glossed from a word or affix of the same language, with a `NULL` gloss where none is. |
|
|
2824
|
+
| `senses` | The word's senses as a list, one per entry of a `gloss` list, or the one `gloss` states; `gloss` itself reads as the senses joined by `; `. |
|
|
2825
|
+
| `attested` | The Addresses of the notes whose prose cites the word, derived as [a language's words](#a-languages-words) says; `NULL` where none does. |
|
|
2824
2826
|
|
|
2825
2827
|
A key no word writes is still a column, `NULL` in every row, and a word of a
|
|
2826
|
-
language note tagged `gm` contributes no row on a public surface
|
|
2828
|
+
language note tagged `gm` contributes no row on a public surface, nor does a
|
|
2829
|
+
`gm` note among a word's `attested`. A row holds
|
|
2827
2830
|
the words its own note states, and nothing more: a daughter language's
|
|
2828
2831
|
inherited words are read through `language_lineage`.
|
|
2829
2832
|
|
|
2833
|
+
**`affixes`** is one row per entry of `data.affixes` on every language note,
|
|
2834
|
+
and **`fields`** one per entry of `data.fields`, in the order the note states
|
|
2835
|
+
them. Each has `language` and `position` as `words` does, then every key of the
|
|
2836
|
+
entry as its own column: `form`, `gloss`, `attaches`, `replaces`, `lengthens`, `front`, `examples`
|
|
2837
|
+
and `tones` for an affix, `name` and `holds` for a field. A key an entry does not state is
|
|
2838
|
+
`NULL`, `examples` is a list, and a language note tagged `gm` contributes no
|
|
2839
|
+
row on a public surface. An affix's `tones` is the tone pattern it carries,
|
|
2840
|
+
written as a word's `tones` is; it is a key of its own and is never read out of
|
|
2841
|
+
`attaches`.
|
|
2842
|
+
|
|
2843
|
+
**A language's register, sounds, history and names are each a relation**, one
|
|
2844
|
+
row per entry of the key it is read from, in the order the note states them,
|
|
2845
|
+
each with `language` (the language note's Address) and, for a list, `position`,
|
|
2846
|
+
then every key of the entry as its own column. A key an entry does not state is
|
|
2847
|
+
`NULL`, and a language note tagged `gm` contributes no row on a public surface.
|
|
2848
|
+
See [a language's register, sounds and history](#a-languages-register-sounds-and-history)
|
|
2849
|
+
for the keys.
|
|
2850
|
+
|
|
2851
|
+
| Relation | Read from | Columns beyond `language` and `position` |
|
|
2852
|
+
| --------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
2853
|
+
| `register` | `data.register` | `name`, `tongue`, `kind`, `why`, `built` (a list), `built_text` (the pieces joined with `+`), and `notes`: every note of the package carrying the name, derived from the index, `NULL` where none does |
|
|
2854
|
+
| `tongues` | `data.tongues` | `tag`, `meaning`, and `tongue_language`, the tongue's `language` |
|
|
2855
|
+
| `retired` | `data.retired` | `form`, `instead` (always a list, `NULL` where nothing is written instead), `why` |
|
|
2856
|
+
| `scope` | `data.scope` | No `position`: `kind`, the key the value is under (`folders`, `cultures`, `lore`, `parents`, `addresses`, `paths`, `types` or `skip`), and `value`, an Address in its canonical form or a path or a type |
|
|
2857
|
+
| `letters` | `data.sounds.letters` | `letters` (a list), `kind`, `like`, `tongue` (a list, `NULL` for every tongue) |
|
|
2858
|
+
| `edges` | `data.sounds.edges` | `edge`, `sounds` (a list: `[any]` for every sound, empty for none) |
|
|
2859
|
+
| `clusters` | `data.sounds.clusters` | No `position`: `max`, one row per language stating it |
|
|
2860
|
+
| `stress` | `data.sounds.stress` | No `position`: `stress`, one row per language stating it |
|
|
2861
|
+
| `finals` | `data.sounds.finals` | `final`, `like` |
|
|
2862
|
+
| `syllables` | `data.sounds.syllables` | No `position`, one row per language stating it: `onsets`, `codas`, `finals`, `doubled`, `vowelPairs`, `neverInitial` and `signature` (lists, `any` a list of one), `initialVowel` and `finalVowel` (`true` or `false`), and the harmony as `harmony_back`, `harmony_front`, `harmony_neutral` and `harmony_neutralAs` |
|
|
2863
|
+
| `joining` | `data.sounds.joining` | `first` and `second` (lists), `written`, `example` |
|
|
2864
|
+
| `joins` | `data.sounds.joins` | `meeting`, `rule`, `letters` (a list), `where` |
|
|
2865
|
+
| `marks` | `data.sounds.marks` | `mark`, `letters` (a list), `kind`, `limit` |
|
|
2866
|
+
| `skeleton` | `data.sounds.skeleton` | `second` (a list, `[any]` for every other), `between` |
|
|
2867
|
+
| `frames` | `data.sounds.frames` | `frame`, `shape`, `class` (a list), `makes`, `examples` (a list of `{ root, form }`) |
|
|
2868
|
+
| `read_past` | `data.sounds.readPast` | `written`, `readAs`, `what` |
|
|
2869
|
+
| `sound_changes` | `data.soundChanges` | One row per step: `position` (the set's), `name`, `from_language`, `to_language`, `step_position` (the step's in its set), `step`, `change`, `where` |
|
|
2870
|
+
| `elements` | `data.elements` | `form`, `variants` (a list), `element_position` (the element's `position`), `sense`, `examples` (a list) |
|
|
2871
|
+
| `roots` | `data.roots` | `root`, `sense`, `field` |
|
|
2872
|
+
| `cognates` | `data.cognates` | One row per form of a set: `position` (the set's), `gloss`, `proto`, `form_language` (the form's language note), `form` |
|
|
2873
|
+
| `calling_names` | `data.callingNames` | One row per closing: `form`, `doubled` (`true` or `false`), `usual`, and the language's `min_syllables` |
|
|
2874
|
+
|
|
2875
|
+
A register name is carried by a note in the language's `data.scope` — any
|
|
2876
|
+
note of the package, for a language stating no scope — that has it as its full name, an alias,
|
|
2877
|
+
or any other part of its `name`, by an affiliation that has it as a rank or an
|
|
2878
|
+
office title, and by an anchor that has it as its name, which the row cites as
|
|
2879
|
+
`note#anchor`; a folder note carries no name. `where`, `like`, `limit` and
|
|
2880
|
+
`between` are SQL keywords, so a query names those columns in double quotes,
|
|
2881
|
+
`"where"`, `"like"`, `"limit"` and `"between"`. A frame's form for one root is
|
|
2882
|
+
`list_filter(examples, e -> e.root = 'd-l-k')[1].form`. A cognate table is the forms of each set pivoted on
|
|
2883
|
+
`form_language`:
|
|
2884
|
+
`max(form) FILTER (WHERE form_language = 'thalorna-note-skill-helonclng') AS "Helonic"`,
|
|
2885
|
+
grouped by `position` and `gloss`.
|
|
2886
|
+
|
|
2830
2887
|
**`language_lineage`** is one row per language note and each language it
|
|
2831
2888
|
inherits words from through [`data.family`](#a-languages-words): `language`,
|
|
2832
2889
|
`ancestor` and `depth`, with the language itself at depth `0`, its parent at
|
|
@@ -3143,10 +3200,12 @@ value containing spaces with double quotes and escape an internal quote as
|
|
|
3143
3200
|
`\"`. Boolean values are exactly `true` or `false`; other spellings are
|
|
3144
3201
|
errors. Duplicate and unknown attributes are errors.
|
|
3145
3202
|
|
|
3146
|
-
| Attribute | What it does
|
|
3147
|
-
| ------------------------------------------- |
|
|
3148
|
-
| `allow-empty=true` | Permits a query selecting no rows. Default `false`.
|
|
3149
|
-
| `section-level=1` through `section-level=6` | Sets the heading level for `_section`. Default `2`.
|
|
3203
|
+
| Attribute | What it does |
|
|
3204
|
+
| ------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
|
|
3205
|
+
| `allow-empty=true` | Permits a query selecting no rows. Default `false`. |
|
|
3206
|
+
| `section-level=1` through `section-level=6` | Sets the heading level for `_section`. Default `2`. |
|
|
3207
|
+
| `key=false` | Leaves the key out of a dictionary or a glossary. Default `true`. Refused on a table, as `key=true` is. |
|
|
3208
|
+
| `key=only` | Prints a dictionary's or a glossary's key for its rows, and no letter heading or entry. Refused on a table. |
|
|
3150
3209
|
|
|
3151
3210
|
##### Page lists
|
|
3152
3211
|
|
|
@@ -5202,43 +5261,159 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5202
5261
|
- combat
|
|
5203
5262
|
- combattechnique
|
|
5204
5263
|
|
|
5205
|
-
| `data` property
|
|
5206
|
-
|
|
|
5207
|
-
| `templatePriority`
|
|
5208
|
-
| `masteryLevel`
|
|
5209
|
-
| `parentSkill`
|
|
5210
|
-
| `names`
|
|
5211
|
-
| `names.pattern`
|
|
5212
|
-
| `names.given`
|
|
5213
|
-
| `names.given.<name>`
|
|
5214
|
-
| `names.<name>`
|
|
5215
|
-
| `family`
|
|
5216
|
-
| `abbreviation`
|
|
5217
|
-
| `classModifiers`
|
|
5218
|
-
| `fields`
|
|
5219
|
-
| `fields[].name`
|
|
5220
|
-
| `fields[].holds`
|
|
5221
|
-
| `words`
|
|
5222
|
-
| `words[].form`
|
|
5223
|
-
| `words[].
|
|
5224
|
-
| `words[].
|
|
5225
|
-
| `words[].
|
|
5226
|
-
| `words[].
|
|
5227
|
-
| `words[].
|
|
5228
|
-
| `words[].source
|
|
5229
|
-
| `words[].source.
|
|
5230
|
-
| `words[].source.
|
|
5231
|
-
| `words[].
|
|
5232
|
-
| `words[].
|
|
5233
|
-
| `words[].
|
|
5234
|
-
| `words[].
|
|
5235
|
-
| `words[].
|
|
5236
|
-
| `words[].
|
|
5237
|
-
| `
|
|
5238
|
-
| `affixes[]
|
|
5239
|
-
| `affixes[].
|
|
5240
|
-
| `affixes[].
|
|
5241
|
-
| `affixes[].
|
|
5264
|
+
| `data` property | Values | Description |
|
|
5265
|
+
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
5266
|
+
| `templatePriority` | `number` | Template priority, _null_ = not a template |
|
|
5267
|
+
| `masteryLevel` | `number` | HM3 mastery level |
|
|
5268
|
+
| `parentSkill` | `Address` | Parent skill this skill specializes |
|
|
5269
|
+
| `names` | `{ pattern, given, <name>... }` | `language` only: how its speakers are named, for `package-build npc new` — see [name lists](#name-lists) |
|
|
5270
|
+
| `names.pattern` | `string`, `string[]` or map of `gender` words to either, required | Placeholders such as `{given}`, `{given.male}` and `{clan}`, each naming a list, with literal text around them; a list states several forms, a map each gender's forms |
|
|
5271
|
+
| `names.given` | map of `gender` words to lists of names, required | Given names by gender; `female` and `male` are required |
|
|
5272
|
+
| `names.given.<name>` | `string[]` | The given names of one gender |
|
|
5273
|
+
| `names.<name>` | `string[]` | A list the placeholder of the same name draws from |
|
|
5274
|
+
| `family` | `Address` | `language` only: the parent language, naming a skill note with `subType: language`; this language reads the parent's words as its own — see [a language's words](#a-languages-words) |
|
|
5275
|
+
| `abbreviation` | `string` | `language` only: the tag a dictionary prints for it, as `Prov.`; its full name where unstated — see [dictionaries and glossaries](#dictionaries-and-glossaries) |
|
|
5276
|
+
| `classModifiers` | `string[]` | `language` only: the word class modifiers the language uses, each from the [master word classes](#word-classes); empty when unstated |
|
|
5277
|
+
| `fields` | `{ name, holds }[]` | `language` only: the fields its words are grouped under |
|
|
5278
|
+
| `fields[].name` | `string`, required | The field's name, which a word's `field` names |
|
|
5279
|
+
| `fields[].holds` | `string`, required | What the field holds |
|
|
5280
|
+
| `words` | `{ form, class, field, gloss, … }[]` | `language` only: its words, one map each, in the order they print — see [a language's words](#a-languages-words) |
|
|
5281
|
+
| `words[].form` | `string`, required | The word as cited, bare: no backticks |
|
|
5282
|
+
| `words[].variants` | `string[]` | Its other forms, as a short form beside a long one; a marked use of one cites the word |
|
|
5283
|
+
| `words[].name_sort` | `string` | Its sort key; the form when unstated |
|
|
5284
|
+
| `words[].class` | `string`, required | A class from the master word classes, base first: `n I f` |
|
|
5285
|
+
| `words[].field` | `string`, required | One of the note's `fields` names |
|
|
5286
|
+
| `words[].gloss` | `string` or `string[]`, required | The meaning, in brief; a list states one sense per entry, which a dictionary numbers |
|
|
5287
|
+
| `words[].source` | `{ kind, language?, form? }` | Where the word comes from |
|
|
5288
|
+
| `words[].source.kind` | `inherited`, `borrowed`, `kept`, `worn`, `coined`, `substrate` or `island`, required | How the word came into the language |
|
|
5289
|
+
| `words[].source.language` | `Address` | The language a `borrowed` word came from, naming a skill note with `subType: language`; required for `borrowed` |
|
|
5290
|
+
| `words[].source.form` | `string` | The form the word had in its source, bare |
|
|
5291
|
+
| `words[].built` | `string[]` | The pieces the word is built from, in order, as the note's words and affixes write them; absent for a root word |
|
|
5292
|
+
| `words[].note` | `string` | What a source says of the word beyond its pieces, as a cognate it is read with |
|
|
5293
|
+
| `words[].pronunciation` | `string` | A respelling, as `sol-MEH-reh`: letters, apostrophes and hyphens, at most one syllable in capitals |
|
|
5294
|
+
| `words[].tones` | `string` | A tone pattern, as `LHL` |
|
|
5295
|
+
| `words[].root` | `string` | A consonantal skeleton, as `d-l-k` |
|
|
5296
|
+
| `words[].frame` | `string` | The frame a root is set in, named in `sounds.frames` of the language or an ancestor |
|
|
5297
|
+
| `affixes` | `{ form, gloss, attaches?, examples?, tones? }[]` | `language` only: the affixes a word's `built` pieces may name |
|
|
5298
|
+
| `affixes[].form` | `string`, required | The affix as a `built` piece names it, as `-rith` |
|
|
5299
|
+
| `affixes[].gloss` | `string`, required | What it means |
|
|
5300
|
+
| `affixes[].attaches` | `string` | How it attaches, as `replaces a closing vowel` |
|
|
5301
|
+
| `affixes[].examples` | `string[]` | The names it is read from |
|
|
5302
|
+
| `affixes[].tones` | `string` | The tone pattern it carries, as `L` |
|
|
5303
|
+
| `affixes[].replaces` | `string` | What it takes the place of at the close of the stem: `vowel` for any closing vowel, or the letters, as `a`; added to the whole stem where absent |
|
|
5304
|
+
| `affixes[].lengthens` | `boolean` | Whether the stem's last vowel lengthens before it; `false` where unstated, and never beside `replaces` |
|
|
5305
|
+
| `affixes[].front` | `string` | Its form after front vowels, where the language keeps vowel harmony, as `-ür` |
|
|
5306
|
+
| `tongues` | `{ tag, meaning, language? }[]` | `language` only: the tags a register row's `tongue` names — see [a language's register, sounds and history](#a-languages-register-sounds-and-history) |
|
|
5307
|
+
| `tongues[].tag` | `string`, required | Lowercase letters and digits, as `dunhari`, or a tag closing on `:<tongue>`, as `exonym:<tongue>`, which declares `exonym:vylari` and every tag like it |
|
|
5308
|
+
| `tongues[].meaning` | `string`, required | What a name of this tongue is |
|
|
5309
|
+
| `tongues[].language` | `Address` | The language note the tag names, where it is one |
|
|
5310
|
+
| `register` | `{ name, tongue?, kind?, built?, why? }[]` | `language` only: every name the setting gives in the language's reach; the notes carrying each are derived |
|
|
5311
|
+
| `register[].name` | `string`, required | The name, as the setting writes it |
|
|
5312
|
+
| `register[].tongue` | `string` | A tag `tongues` declares, or `translation`; a row states a `tongue`, a `kind`, or both |
|
|
5313
|
+
| `register[].kind` | `byname`, `given` or `place` | What kind of name it is, in a language that sorts its names by kind |
|
|
5314
|
+
| `register[].built` | `string[]` | The pieces the name is built from, as a word's `built` writes them |
|
|
5315
|
+
| `register[].why` | `string` | Why the name stands outside the pattern the language's names are built by |
|
|
5316
|
+
| `retired` | `{ form, instead?, why }[]` | `language` only: the forms the setting does not write |
|
|
5317
|
+
| `retired[].form` | `string`, required | The form the setting does not write |
|
|
5318
|
+
| `retired[].instead` | `string` or `string[]` | What is written in its place; absent where nothing is |
|
|
5319
|
+
| `retired[].why` | `string`, required | Why the setting does not write it |
|
|
5320
|
+
| `scope` | `{ folders?, cultures?, lore?, parents?, addresses?, paths?, types?, skip? }` | `language` only: the notes the register covers |
|
|
5321
|
+
| `scope.folders` | `Address[]` | Every note whose `packFolder` is one of these folders |
|
|
5322
|
+
| `scope.cultures` | `Address[]` | Every note whose `culture` is one of these cultures |
|
|
5323
|
+
| `scope.lore` | `Address[]` | Every note whose `lore` names one of these notes |
|
|
5324
|
+
| `scope.parents` | `Address[]` | Every note whose `parents` names one of these notes |
|
|
5325
|
+
| `scope.addresses` | `Address[]` | These notes themselves |
|
|
5326
|
+
| `scope.paths` | `string[]` | Every note whose file sits below one of these content paths, as `Regions/Aelwyth/` |
|
|
5327
|
+
| `scope.types` | `string[]` | The note types covered; a note of another type is out of scope whatever else catches it |
|
|
5328
|
+
| `scope.skip` | `Address[]` | Notes out of scope whatever else catches them |
|
|
5329
|
+
| `sounds` | `{ letters?, edges?, clusters?, stress?, finals?, syllables?, joining?, joins?, marks?, skeleton?, frames?, readPast? }` | `language` only: the letters it writes and the rules its words keep |
|
|
5330
|
+
| `sounds.letters` | `{ letters, kind, like, tongue? }[]` | The letters and the sounds they stand for |
|
|
5331
|
+
| `sounds.letters[].letters` | `string[]`, required | The letters or digraphs the row describes |
|
|
5332
|
+
| `sounds.letters[].kind` | `string`, required | What kind of sound they write, as `consonant` or `long vowel` |
|
|
5333
|
+
| `sounds.letters[].like` | `string`, required | What they sound like |
|
|
5334
|
+
| `sounds.letters[].tongue` | `string` or `string[]` | The tongues that write them, as tags `tongues` declares; every one where absent |
|
|
5335
|
+
| `sounds.edges` | `{ edge, sounds }[]` | The sounds that may stand at each edge of a word, one entry per edge |
|
|
5336
|
+
| `sounds.edges[].edge` | `openConsonant`, `openCluster`, `closeConsonant`, `closeCluster`, `innerCluster`, `vowelPair`, `glide` or `syllabic`, required | Which edge the sounds stand at |
|
|
5337
|
+
| `sounds.edges[].sounds` | `string[]` or `any`, required | The sounds; `any` for every one, an empty list for none |
|
|
5338
|
+
| `sounds.clusters` | `{ max }` | How many consonants may stand together |
|
|
5339
|
+
| `sounds.clusters.max` | `integer`, required | The most consonants that stand together inside a word |
|
|
5340
|
+
| `sounds.stress` | `first syllable`, `penultimate or final`, `by weight` or `as marked` | Where a word's stress falls |
|
|
5341
|
+
| `sounds.finals` | `{ final, like }[]` | The syllable finals, for a language whose syllables are parsed by them |
|
|
5342
|
+
| `sounds.finals[].final` | `string`, required | The final, as `ang` |
|
|
5343
|
+
| `sounds.finals[].like` | `string`, required | What it sounds like |
|
|
5344
|
+
| `sounds.syllables` | map of syllable rules | What a syllable and a word may open and close on |
|
|
5345
|
+
| `sounds.syllables.onsets` | `single` | What a syllable opens on: a single consonant |
|
|
5346
|
+
| `sounds.syllables.codas` | `string[]` or `any` | The consonants that may close a syllable |
|
|
5347
|
+
| `sounds.syllables.finals` | `string[]` or `any` | The consonants that may close a word |
|
|
5348
|
+
| `sounds.syllables.doubled` | `string[]` | The doubled consonants a word may hold; none where empty |
|
|
5349
|
+
| `sounds.syllables.vowelPairs` | `string[]` | The vowels that may stand together; none where empty |
|
|
5350
|
+
| `sounds.syllables.initialVowel` | `boolean` | Whether a word may open on a vowel |
|
|
5351
|
+
| `sounds.syllables.finalVowel` | `boolean` | Whether a word may close on a vowel; `true` where unstated |
|
|
5352
|
+
| `sounds.syllables.neverInitial` | `string[]` | The letters that never open a word |
|
|
5353
|
+
| `sounds.syllables.signature` | `string[]` | The letters that mark a word as the language's own |
|
|
5354
|
+
| `sounds.syllables.harmony` | `{ back, front, neutral?, neutralAs? }` | The vowel harmony a word keeps |
|
|
5355
|
+
| `sounds.syllables.harmony.back` | `string[]`, required | The back vowels |
|
|
5356
|
+
| `sounds.syllables.harmony.front` | `string[]`, required | The front vowels |
|
|
5357
|
+
| `sounds.syllables.harmony.neutral` | `string[]` | The vowels of neither set |
|
|
5358
|
+
| `sounds.syllables.harmony.neutralAs` | `back` or `front` | The set a word of neutral vowels alone counts as |
|
|
5359
|
+
| `sounds.joining` | `{ first, second, written, example? }[]` | How two parts are written where the first closes and the second opens on the given sounds |
|
|
5360
|
+
| `sounds.joining[].first` | `string[]`, required | The sounds the first part closes on |
|
|
5361
|
+
| `sounds.joining[].second` | `string[]`, required | The sounds the second part opens on |
|
|
5362
|
+
| `sounds.joining[].written` | `string`, required | What is written where they meet, as `â`; a join closing on `+`, as `y+`, keeps both and sets it between |
|
|
5363
|
+
| `sounds.joining[].example` | `string` | A word joined so |
|
|
5364
|
+
| `sounds.joins` | `{ meeting, rule, letters?, where? }[]` | What happens where two parts of a word meet, one entry per meeting |
|
|
5365
|
+
| `sounds.joins[].meeting` | `C+C`, `V+C` or `V+V`, required | Which sounds meet: a consonant or a vowel closing the first part, then opening the second |
|
|
5366
|
+
| `sounds.joins[].rule` | `merge`, `insert`, `drop` or `double`, required | What happens: one is written, `letters` are set between, the first is lost, or the consonant is doubled |
|
|
5367
|
+
| `sounds.joins[].letters` | `string[]` | The letters `insert` sets between or `double` doubles |
|
|
5368
|
+
| `sounds.joins[].where` | `string` | Where it holds, as `between stems`; everywhere where absent |
|
|
5369
|
+
| `sounds.marks` | `{ mark, letters, kind, limit }[]` | The marks the language writes on its letters |
|
|
5370
|
+
| `sounds.marks[].mark` | `string`, required | The mark's name, as `acute` |
|
|
5371
|
+
| `sounds.marks[].letters` | `string[]`, required | The letters that carry it |
|
|
5372
|
+
| `sounds.marks[].kind` | `stress` or `length`, required | What it says of its letter |
|
|
5373
|
+
| `sounds.marks[].limit` | `one` or `any`, required | How many a word may carry |
|
|
5374
|
+
| `sounds.skeleton` | `{ second, between? }[]` | The vowel set between a root's second and third consonants |
|
|
5375
|
+
| `sounds.skeleton[].second` | `string[]` or `any`, required | The second consonants the row holds for; `any` for every other |
|
|
5376
|
+
| `sounds.skeleton[].between` | `string` | The vowel set between; nothing where absent or empty |
|
|
5377
|
+
| `sounds.frames` | `{ frame, shape, class, makes, examples? }[]` | The patterns a root is set in |
|
|
5378
|
+
| `sounds.frames[].frame` | `string`, required | The frame's name, which a word's `frame` names |
|
|
5379
|
+
| `sounds.frames[].shape` | `string`, required | The pattern, the root's consonants numbered, as `K1aK2K3` |
|
|
5380
|
+
| `sounds.frames[].class` | `string[]`, required | The classes of word it makes, each a base of the [master word classes](#word-classes) |
|
|
5381
|
+
| `sounds.frames[].makes` | `string`, required | What it makes of a root |
|
|
5382
|
+
| `sounds.frames[].examples` | map of roots to forms | The form a root takes in the frame, keyed by the root |
|
|
5383
|
+
| `sounds.frames[].examples.<name>` | `string` | One root's form, bare |
|
|
5384
|
+
| `sounds.readPast` | `{ written, readAs?, what }[]` | Marks and spellings a word is read through before the sound rules hold it |
|
|
5385
|
+
| `sounds.readPast[].written` | `string`, required | The mark or spelling the pages write |
|
|
5386
|
+
| `sounds.readPast[].readAs` | `string` | What the word is read with in its place; absent where it is read as nothing |
|
|
5387
|
+
| `sounds.readPast[].what` | `string`, required | What the mark or spelling is |
|
|
5388
|
+
| `soundChanges` | `{ name, from?, to?, steps }[]` | `language` only: named sets of ordered changes, each making one tongue's words from another's |
|
|
5389
|
+
| `soundChanges[].name` | `string`, required | The set's name, which no other set of the note shares |
|
|
5390
|
+
| `soundChanges[].from` | `Address` | The language note whose words the steps start from |
|
|
5391
|
+
| `soundChanges[].to` | `Address` | The language note whose words the steps make |
|
|
5392
|
+
| `soundChanges[].steps` | `{ step, change, where? }[]`, required | The steps, in the order they apply |
|
|
5393
|
+
| `soundChanges[].steps[].step` | `string`, required | The step's label, as `A1` or `"1"`; no label stands twice in a set |
|
|
5394
|
+
| `soundChanges[].steps[].change` | `string`, required | The change in arrow notation, as `` `ph` > `f`; `kh` > `h` ``, or the operation it names in words |
|
|
5395
|
+
| `soundChanges[].steps[].where` | `string` | Where it holds, as `word end`; everywhere where absent |
|
|
5396
|
+
| `elements` | `{ form, variants?, position?, sense, examples? }[]` | `language` only: the elements its names are built from |
|
|
5397
|
+
| `elements[].form` | `string`, required | The element, as `arn-` |
|
|
5398
|
+
| `elements[].variants` | `string[]` | The element's other forms, as `aldr-` beside `ald-` |
|
|
5399
|
+
| `elements[].position` | `opening`, `closing`, `either` or `link` | Where in a name it stands |
|
|
5400
|
+
| `elements[].sense` | `string`, required | What it means |
|
|
5401
|
+
| `elements[].examples` | `string[]` | The names it is read from |
|
|
5402
|
+
| `roots` | `{ root, sense, field? }[]` | `language` only: the consonantal roots its words are set from |
|
|
5403
|
+
| `roots[].root` | `string`, required | The root, as `d-l-k` |
|
|
5404
|
+
| `roots[].sense` | `string`, required | What it means |
|
|
5405
|
+
| `roots[].field` | `string` | The field it belongs to, as `stone` |
|
|
5406
|
+
| `cognates` | `{ forms, proto?, gloss }[]` | `language` only: sets of forms one older word takes in several languages, stated on the eldest |
|
|
5407
|
+
| `cognates[].forms` | map of language Addresses to forms, required | The form the set takes in each language, keyed by the language note |
|
|
5408
|
+
| `cognates[].forms.<name>` | `string` | One language's form, bare |
|
|
5409
|
+
| `cognates[].gloss` | `string`, required | What the forms mean |
|
|
5410
|
+
| `cognates[].proto` | `string` | The reconstructed form the set descends from, in no attested language; printed with an asterisk |
|
|
5411
|
+
| `callingNames` | `{ closings, minSyllables }` | `language` only: the short name a long given name is called by |
|
|
5412
|
+
| `callingNames.closings` | `{ form?, doubled?, usual }[]`, required | What a calling name closes on |
|
|
5413
|
+
| `callingNames.closings[].form` | `string` | The ending, as `-u`; a row states `form` or `doubled`, never both |
|
|
5414
|
+
| `callingNames.closings[].doubled` | `boolean` | The calling name doubles the first syllable instead of taking an ending |
|
|
5415
|
+
| `callingNames.closings[].usual` | `man`, `woman` or `either`, required | Whose name it usually makes |
|
|
5416
|
+
| `callingNames.minSyllables` | `integer`, required | The fewest syllables a given name has that the pages give a calling name |
|
|
5242
5417
|
|
|
5243
5418
|
#### A language's words
|
|
5244
5419
|
|
|
@@ -5266,14 +5441,15 @@ data:
|
|
|
5266
5441
|
field: Love and its conduct,
|
|
5267
5442
|
gloss: "longing; the ache for a person, a place or a time that is gone",
|
|
5268
5443
|
source: { kind: borrowed, language: skill-elvndrlng, form: sólmerë },
|
|
5269
|
-
attested: [lore-lastshrine],
|
|
5270
5444
|
}
|
|
5271
5445
|
- {
|
|
5272
5446
|
form: amère,
|
|
5447
|
+
variants: [amèra],
|
|
5273
5448
|
class: n f,
|
|
5274
5449
|
field: Love and its conduct,
|
|
5275
|
-
gloss: "a beloved",
|
|
5450
|
+
gloss: ["a beloved", "a sweetheart, in the songs"],
|
|
5276
5451
|
built: [am-, -ère],
|
|
5452
|
+
note: "read with the Élavendri amarë in the older songs",
|
|
5277
5453
|
}
|
|
5278
5454
|
---
|
|
5279
5455
|
```
|
|
@@ -5296,6 +5472,27 @@ italics and its own asterisk.
|
|
|
5296
5472
|
the same language writes it, stems included. A piece written with different
|
|
5297
5473
|
joining hyphens still matches (`am-` finds the word `am`).
|
|
5298
5474
|
|
|
5475
|
+
**A gloss is one sense or a list of them.** A list states one sense per entry,
|
|
5476
|
+
and a dictionary numbers them: `zethu` glossed `[writing, a scribe]` prints
|
|
5477
|
+
**1** Writing. **2** A scribe. A list states at least one sense. `variants`
|
|
5478
|
+
names a word's other forms, as a short form beside its long one, and `note`
|
|
5479
|
+
says what a source says of the word beyond its pieces.
|
|
5480
|
+
|
|
5481
|
+
**A word's citations are derived from the prose of the package's notes.** A
|
|
5482
|
+
note cites a word when its body marks the word in italics, `_amère_` or
|
|
5483
|
+
`*amère*`: an italic span holding text alone, no link and no code, whose text
|
|
5484
|
+
is the word's form or one of its `variants`, compared with diacritics taken off
|
|
5485
|
+
and case folded, so `_Amere_` cites `amère` too. A note also cites a word its
|
|
5486
|
+
frontmatter names whole, under the same folding: a full name or an alias that
|
|
5487
|
+
spells the word, or an affiliation's rank or office title that does. An italic
|
|
5488
|
+
span or a name that spells no word cites nothing, and neither does a word
|
|
5489
|
+
found only inside a longer name. A language note never cites its own words,
|
|
5490
|
+
and its body cites none of the words it describes. The index records each
|
|
5491
|
+
word's citing notes by Address, and the `attested` column of the `words`
|
|
5492
|
+
relation and the `usage` of a dictionary entry read them, so a note is listed
|
|
5493
|
+
beside a word by marking the word where it uses it, or by bearing it as a name
|
|
5494
|
+
or a title, and by nothing else.
|
|
5495
|
+
|
|
5299
5496
|
**A daughter language names its parent in `data.family`**, and reads the
|
|
5300
5497
|
parent's words as its own, and the parent's parent's in turn. The words a
|
|
5301
5498
|
family shares sit on the parent's note once; each daughter states only its own:
|
|
@@ -5321,22 +5518,24 @@ that does is a cycle, and an error on every note in it.
|
|
|
5321
5518
|
|
|
5322
5519
|
Each finding is located at the key at fault:
|
|
5323
5520
|
|
|
5324
|
-
| Finding
|
|
5325
|
-
|
|
|
5326
|
-
| A word key or `data.family` on a skill of another subType, at the key
|
|
5327
|
-
| A `data.family` naming no language note, at the value
|
|
5328
|
-
| A `data.family` chain that returns to its start, at the value
|
|
5329
|
-
| An unknown, missing or wrongly shaped key in an entry
|
|
5330
|
-
| A class whose base or modifier is not in the master set
|
|
5331
|
-
| A modifier `data.classModifiers` does not declare
|
|
5332
|
-
| A declared modifier no word uses, at the modifier
|
|
5333
|
-
| A `field` not among `data.fields`
|
|
5334
|
-
| A `borrowed` source with no `language`
|
|
5335
|
-
| A form standing twice in one language, at the second
|
|
5336
|
-
|
|
|
5337
|
-
| A language Address
|
|
5338
|
-
| A
|
|
5339
|
-
| A
|
|
5521
|
+
| Finding | Severity |
|
|
5522
|
+
| ---------------------------------------------------------------------- | -------- |
|
|
5523
|
+
| A word key or `data.family` on a skill of another subType, at the key | error |
|
|
5524
|
+
| A `data.family` naming no language note, at the value | error |
|
|
5525
|
+
| A `data.family` chain that returns to its start, at the value | error |
|
|
5526
|
+
| An unknown, missing or wrongly shaped key in an entry | error |
|
|
5527
|
+
| A class whose base or modifier is not in the master set | error |
|
|
5528
|
+
| A modifier `data.classModifiers` does not declare | error |
|
|
5529
|
+
| A declared modifier no word uses, at the modifier | warning |
|
|
5530
|
+
| A `field` not among `data.fields` | error |
|
|
5531
|
+
| A `borrowed` source with no `language` | error |
|
|
5532
|
+
| A form standing twice in one language, at the second | error |
|
|
5533
|
+
| A `gloss` list with no sense | error |
|
|
5534
|
+
| A language Address that does not resolve | error |
|
|
5535
|
+
| A language Address naming something other than a language skill | error |
|
|
5536
|
+
| A pronunciation that is not a respelling | error |
|
|
5537
|
+
| A `frame` that no `sounds.frames` of the language or an ancestor names | error |
|
|
5538
|
+
| A `built` piece no word or affix of the language glosses | warning |
|
|
5340
5539
|
|
|
5341
5540
|
The `words` relation holds one row per word — see
|
|
5342
5541
|
[Content tables](#content-tables) — and a table of them is an `sql` fence over
|
|
@@ -5363,6 +5562,263 @@ ORDER BY position
|
|
|
5363
5562
|
```
|
|
5364
5563
|
````
|
|
5365
5564
|
|
|
5565
|
+
#### A language's register, sounds and history
|
|
5566
|
+
|
|
5567
|
+
A language note states in frontmatter every fact a check reads about its
|
|
5568
|
+
names, its sounds and its history, beside its words, and each is a relation an
|
|
5569
|
+
`sql` fence sets back on the page. All of it is optional, and all of it is
|
|
5570
|
+
stated only on a language note:
|
|
5571
|
+
|
|
5572
|
+
```yaml
|
|
5573
|
+
---
|
|
5574
|
+
shortcode: dunharlng
|
|
5575
|
+
name: { full: Dunhari Language }
|
|
5576
|
+
type: skill
|
|
5577
|
+
subType: language
|
|
5578
|
+
data:
|
|
5579
|
+
tongues:
|
|
5580
|
+
- { tag: dunhari, meaning: a Dunhari name, language: skill-dunharlng }
|
|
5581
|
+
- { tag: sovidur, meaning: "a Sovidur name, carried by a wanderer" }
|
|
5582
|
+
- { tag: "exonym:<tongue>", meaning: "a name another people gives, in the tongue named" }
|
|
5583
|
+
register:
|
|
5584
|
+
- { name: Belgogâr, tongue: dunhari, built: [belg-, -ogâr] }
|
|
5585
|
+
- { name: Bondsman, tongue: translation }
|
|
5586
|
+
- { name: Dunhara, tongue: "exonym:vylari" }
|
|
5587
|
+
- { name: Aldous, kind: given, why: "a short name no element builds" }
|
|
5588
|
+
retired:
|
|
5589
|
+
- { form: Qadi, instead: Vazhmadêr, why: "an Earth word, the judge of a city" }
|
|
5590
|
+
- { form: Khalid, instead: [Kheldûn, Bezdûn], why: "an Earth given name" }
|
|
5591
|
+
scope:
|
|
5592
|
+
folders: [dunhara, amradad]
|
|
5593
|
+
cultures: [dunhariclt]
|
|
5594
|
+
parents: [dunharargn]
|
|
5595
|
+
addresses: [lore-dunhariclt, affiliation-kngdmmrdd]
|
|
5596
|
+
sounds:
|
|
5597
|
+
letters:
|
|
5598
|
+
- { letters: [kh, gh], kind: consonant, like: "a rasp at the back of the throat" }
|
|
5599
|
+
- { letters: [â, ê, î, ô, û], kind: long vowel, like: "father, fête, machine, note, boot" }
|
|
5600
|
+
edges:
|
|
5601
|
+
- { edge: closeConsonant, sounds: [n, r, d, z, sh, kh] }
|
|
5602
|
+
- { edge: closeCluster, sounds: [nd, rd] }
|
|
5603
|
+
- { edge: vowelPair, sounds: [ai, au, ei] }
|
|
5604
|
+
clusters: { max: 2 }
|
|
5605
|
+
stress: penultimate or final
|
|
5606
|
+
syllables:
|
|
5607
|
+
onsets: single
|
|
5608
|
+
codas: [b, d, k, sh]
|
|
5609
|
+
finals: any
|
|
5610
|
+
vowelPairs: [aa, ee]
|
|
5611
|
+
initialVowel: true
|
|
5612
|
+
harmony: { back: [a, o, u], front: [e, ö, ü], neutral: [i], neutralAs: front }
|
|
5613
|
+
joining:
|
|
5614
|
+
- { first: [a, â], second: [a, â], written: â, example: "méga + andáhr = mégândáhr" }
|
|
5615
|
+
joins:
|
|
5616
|
+
- { meeting: V+V, rule: insert, letters: [y] }
|
|
5617
|
+
marks:
|
|
5618
|
+
- { mark: acute, letters: [á, é, í], kind: stress, limit: one }
|
|
5619
|
+
skeleton:
|
|
5620
|
+
- { second: [l, r, m, n, s] }
|
|
5621
|
+
- { second: any, between: a }
|
|
5622
|
+
frames:
|
|
5623
|
+
- {
|
|
5624
|
+
frame: bare,
|
|
5625
|
+
shape: K1aK2K3,
|
|
5626
|
+
class: [n],
|
|
5627
|
+
makes: the thing itself,
|
|
5628
|
+
examples: { d-l-k: dalk },
|
|
5629
|
+
}
|
|
5630
|
+
readPast:
|
|
5631
|
+
- { written: á, readAs: a, what: "the acute, a stress mark" }
|
|
5632
|
+
soundChanges:
|
|
5633
|
+
- name: From Helonic to Byzarian
|
|
5634
|
+
from: skill-helonclng
|
|
5635
|
+
to: skill-byzarnlng
|
|
5636
|
+
steps:
|
|
5637
|
+
- { step: "1", change: "`th` > `t`", where: anywhere }
|
|
5638
|
+
- { step: "2", change: "`dh` > `d`", where: anywhere }
|
|
5639
|
+
elements:
|
|
5640
|
+
- { form: ald-, variants: [aldr-, aldar-], position: opening, sense: an age }
|
|
5641
|
+
- { form: arn-, position: opening, sense: an eagle, examples: [Arnthúl, Arnhelm] }
|
|
5642
|
+
roots:
|
|
5643
|
+
- { root: d-l-k, sense: "stone; to cut stone", field: stone }
|
|
5644
|
+
cognates:
|
|
5645
|
+
- { forms: { skill-dunharlng: zevr, skill-sowideslng: zever }, proto: zevrâ, gloss: wind }
|
|
5646
|
+
callingNames:
|
|
5647
|
+
minSyllables: 4
|
|
5648
|
+
closings:
|
|
5649
|
+
- { form: -u, usual: man }
|
|
5650
|
+
- { doubled: true, usual: either }
|
|
5651
|
+
---
|
|
5652
|
+
```
|
|
5653
|
+
|
|
5654
|
+
**`tongues` declares the tags a register row may name**, each with what a
|
|
5655
|
+
name of it is, and `language` where the tag is a language of its own. A tag is
|
|
5656
|
+
lowercase letters and digits, or closes on `:<tongue>` to declare a family:
|
|
5657
|
+
`exonym:<tongue>` declares `exonym:vylari`, `exonym:khazari` and every tag like
|
|
5658
|
+
them. `translation`, a name given in the language of the pages, is accepted
|
|
5659
|
+
everywhere without being declared.
|
|
5660
|
+
|
|
5661
|
+
**`register` lists every name the setting gives in the language's reach**,
|
|
5662
|
+
with its tongue, its kind (`byname`, `given` or `place`) in a language that
|
|
5663
|
+
sorts its names so, or both, and, for a name built from the language's words
|
|
5664
|
+
and affixes, its pieces as a word's `built` writes them; `why` says why a name
|
|
5665
|
+
stands outside the pattern. Which notes carry a name is not
|
|
5666
|
+
written: the `register` relation derives it from the index — every note in
|
|
5667
|
+
`scope` having it as its full name, an alias or a part of its name, every
|
|
5668
|
+
affiliation in `scope` having it as a rank or office title, and every anchor of
|
|
5669
|
+
a note in `scope` having it as its name. A folder note carries no name, and a
|
|
5670
|
+
language that states no `scope` reads every note of the package.
|
|
5671
|
+
|
|
5672
|
+
**`retired` lists the forms the setting does not write**, each with what is
|
|
5673
|
+
written in its place, one form or several, and why. A form nothing replaces
|
|
5674
|
+
states no `instead`.
|
|
5675
|
+
|
|
5676
|
+
**`scope` names the notes the register covers.** A note is in scope when one
|
|
5677
|
+
of `folders`, `cultures`, `lore`, `parents`, `addresses` or `paths` catches it,
|
|
5678
|
+
unless `types` is stated and leaves its type out, or `skip` names it.
|
|
5679
|
+
|
|
5680
|
+
**`sounds` states the letters and the rules a word keeps.** `letters` gives
|
|
5681
|
+
each letter or group of letters, the kind of sound it writes, what it sounds
|
|
5682
|
+
like and, in a language whose tongues write differently, the tongues that
|
|
5683
|
+
write it. `edges` gives the sounds that may stand at each edge of a word, one
|
|
5684
|
+
entry per edge, the edge from a closed list:
|
|
5685
|
+
|
|
5686
|
+
| `edge` | The sounds that… |
|
|
5687
|
+
| ---------------- | ---------------------------------------------------- |
|
|
5688
|
+
| `openConsonant` | may open a word alone, where not every consonant may |
|
|
5689
|
+
| `openCluster` | may open a word together |
|
|
5690
|
+
| `closeConsonant` | may close a word |
|
|
5691
|
+
| `closeCluster` | may close a word together |
|
|
5692
|
+
| `innerCluster` | may stand together inside a word |
|
|
5693
|
+
| `vowelPair` | are vowels that may stand together |
|
|
5694
|
+
| `glide` | are glides that may follow a consonant |
|
|
5695
|
+
| `syllabic` | are consonants that may carry a syllable |
|
|
5696
|
+
|
|
5697
|
+
`sounds: any` stands for every sound, and `sounds: []` for none.
|
|
5698
|
+
`clusters.max` is the most consonants that stand together inside a word.
|
|
5699
|
+
`readPast` lists the marks and spellings a word is read through before the
|
|
5700
|
+
rules hold it, each with what it is read as, or nothing.
|
|
5701
|
+
|
|
5702
|
+
The rest of `sounds` states what a language's own rules read, each from a
|
|
5703
|
+
closed list where its values are words:
|
|
5704
|
+
|
|
5705
|
+
- `stress`: `first syllable`, `penultimate or final`, `by weight` or
|
|
5706
|
+
`as marked`.
|
|
5707
|
+
- `finals`: the syllable finals, each with what it sounds like, for a language
|
|
5708
|
+
whose syllables are parsed by them.
|
|
5709
|
+
- `syllables`: what a syllable opens on (`single`, a single consonant), the
|
|
5710
|
+
`codas` that close a syllable and the `finals` that close a word (a list, or
|
|
5711
|
+
`any`), the `doubled` consonants and `vowelPairs` a word may hold (none where
|
|
5712
|
+
empty), whether a word may open or close on a vowel, the letters that never
|
|
5713
|
+
open one, the `signature` letters, and the vowel `harmony`: its `back`,
|
|
5714
|
+
`front` and `neutral` vowels and the set a word of neutral vowels alone
|
|
5715
|
+
counts as.
|
|
5716
|
+
- `joining`: how two parts are written where the first closes and the second
|
|
5717
|
+
opens on the given sounds — the one sound that stands for both, or a join
|
|
5718
|
+
closing on `+` set between them.
|
|
5719
|
+
- `joins`: what happens where a consonant or a vowel meets another (`C+C`,
|
|
5720
|
+
`V+C`, `V+V`): `merge`, `insert` the `letters` between, `drop` the first, or
|
|
5721
|
+
`double` the consonant, everywhere or `where` stated.
|
|
5722
|
+
- `marks`: the marks written on letters, each saying `stress` or `length`, and
|
|
5723
|
+
whether a word carries `one` at most or `any`.
|
|
5724
|
+
- `skeleton`: the vowel set between a root's second and third consonants, by
|
|
5725
|
+
the second consonant; nothing where none is stated.
|
|
5726
|
+
- `frames`: the patterns a root is set in, each with its shape, the word
|
|
5727
|
+
classes it makes, what it makes, and the form each root takes in it.
|
|
5728
|
+
|
|
5729
|
+
**`soundChanges` lists named sets of ordered changes**, each making one
|
|
5730
|
+
tongue's words from another's: the set's `name`, unique in the note, the
|
|
5731
|
+
language notes it leads `from` and `to` where they are notes, and its `steps`
|
|
5732
|
+
in the order they apply — each a `step` label, unique in its set, the `change`
|
|
5733
|
+
in arrow notation (`` `sources` > `targets` `` rules separated by `;`, or an
|
|
5734
|
+
operation named in words) and `where` it holds. A step is a string, so a
|
|
5735
|
+
numbered step is written `"1"`. Two sets may number their steps alike, as a
|
|
5736
|
+
parent's changes to each daughter do.
|
|
5737
|
+
|
|
5738
|
+
**`elements` lists what the language's names are built from**: each element's
|
|
5739
|
+
form and its other forms, where in a name it stands (`opening`, `closing`,
|
|
5740
|
+
`either` or `link`), its sense and the names it is read from. An element that is also a word stays a
|
|
5741
|
+
word.
|
|
5742
|
+
|
|
5743
|
+
**`roots` lists consonantal roots**, each with its sense and the field it
|
|
5744
|
+
belongs to. **`cognates`** lists, on the eldest language of a set, the form one
|
|
5745
|
+
older word takes in each language, keyed by the language note, what they mean
|
|
5746
|
+
and, where it is reconstructed, the `proto` form they descend from, which a
|
|
5747
|
+
fence prints with an asterisk. A form whose language is no language note is a
|
|
5748
|
+
finding.
|
|
5749
|
+
|
|
5750
|
+
**`callingNames` states the short name a long given name is called by**: its
|
|
5751
|
+
`closings`, each an ending (`form`) or the first syllable doubled
|
|
5752
|
+
(`doubled: true`), with whose name it usually makes (`man`, `woman` or
|
|
5753
|
+
`either`), and `minSyllables`, the fewest syllables a given name has that the
|
|
5754
|
+
pages give a calling name.
|
|
5755
|
+
|
|
5756
|
+
**An affix states `replaces`** where it takes the place of the stem's close —
|
|
5757
|
+
`vowel` for any closing vowel, or the letters, as `a` — and is added to the
|
|
5758
|
+
whole stem where it states none. An affix states `lengthens: true` where the
|
|
5759
|
+
stem's last vowel lengthens before it, and never beside `replaces`. A language
|
|
5760
|
+
that keeps vowel harmony gives an affix's form after front vowels in `front`.
|
|
5761
|
+
|
|
5762
|
+
Each finding is located at the key at fault:
|
|
5763
|
+
|
|
5764
|
+
| Finding | Severity |
|
|
5765
|
+
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
|
|
5766
|
+
| Any of these keys on a skill of another subType, at the key | error |
|
|
5767
|
+
| An unknown, missing or wrongly shaped key in an entry | error |
|
|
5768
|
+
| A value outside its closed list — an `edge`, an element `position`, a register `kind`, `stress`, a join's `meeting` or `rule`, a mark's `kind` or `limit`, `onsets`, `neutralAs`, a closing's `usual` — at the value | error |
|
|
5769
|
+
| A `sounds` word other than `any`, at the value | error |
|
|
5770
|
+
| A tongue tag that is not lowercase letters and digits, at the tag | error |
|
|
5771
|
+
| A tongue tag stated twice, at the second | error |
|
|
5772
|
+
| A register or letter tongue `tongues` does not declare, at the tag | error |
|
|
5773
|
+
| An edge stated twice, at the second | error |
|
|
5774
|
+
| A `scope` Address that does not resolve, or a type that is no note type | error |
|
|
5775
|
+
| A tongue `language` or a cognate form's language that is no language note | error |
|
|
5776
|
+
| A register row with neither a `tongue` nor a `kind`, at the row | error |
|
|
5777
|
+
| A sound-change set's name stated twice, at the second | error |
|
|
5778
|
+
| A step label stated twice in one set, at the second | error |
|
|
5779
|
+
| A set's `from` or `to` that is no language note, at the value | error |
|
|
5780
|
+
| A frame class that is no word class base, at the class | error |
|
|
5781
|
+
| An affix stating both `replaces` and `lengthens: true`, at `lengthens` | error |
|
|
5782
|
+
| A calling-name closing with both or neither of `form` and `doubled` | error |
|
|
5783
|
+
|
|
5784
|
+
A fence sets each table back from its relation:
|
|
5785
|
+
|
|
5786
|
+
````markdown
|
|
5787
|
+
```sql
|
|
5788
|
+
SELECT '`' || tag || '`' AS "Tongue", meaning AS "Meaning"
|
|
5789
|
+
FROM tongues WHERE language = 'thalorna-note-skill-dunharlng' ORDER BY position
|
|
5790
|
+
```
|
|
5791
|
+
|
|
5792
|
+
```sql
|
|
5793
|
+
SELECT '**' || name || '**' AS "Name",
|
|
5794
|
+
coalesce(array_to_string(list_transform(notes, n -> '[[' || n || '|' || name || ']]'), ', '), '—') AS "Notes",
|
|
5795
|
+
tongue AS "Tongue", coalesce(built_text, '—') AS "Built from"
|
|
5796
|
+
FROM register WHERE language = 'thalorna-note-skill-dunharlng' ORDER BY position
|
|
5797
|
+
```
|
|
5798
|
+
|
|
5799
|
+
```sql
|
|
5800
|
+
SELECT form AS "Form", coalesce(array_to_string(instead, ', '), '—') AS "Written instead",
|
|
5801
|
+
why AS "Why"
|
|
5802
|
+
FROM retired WHERE language = 'thalorna-note-skill-dunharlng' ORDER BY position
|
|
5803
|
+
```
|
|
5804
|
+
|
|
5805
|
+
```sql
|
|
5806
|
+
SELECT array_to_string(letters, ', ') AS "Letter", kind AS "Kind", "like" AS "Sounds like"
|
|
5807
|
+
FROM letters WHERE language = 'thalorna-note-skill-dunharlng' ORDER BY position
|
|
5808
|
+
```
|
|
5809
|
+
|
|
5810
|
+
```sql
|
|
5811
|
+
SELECT edge AS "Edge", array_to_string(sounds, ', ') AS "Sounds"
|
|
5812
|
+
FROM edges WHERE language = 'thalorna-note-skill-dunharlng' ORDER BY position
|
|
5813
|
+
```
|
|
5814
|
+
````
|
|
5815
|
+
|
|
5816
|
+
`clusters`, `stress`, `finals`, `syllables`, `joining`, `joins`, `marks`,
|
|
5817
|
+
`skeleton`, `frames`, `read_past`, `scope`, `sound_changes`, `elements`,
|
|
5818
|
+
`roots`, `calling_names` and
|
|
5819
|
+
`cognates` read the same way; [content tables](#content-tables) gives every
|
|
5820
|
+
relation's columns.
|
|
5821
|
+
|
|
5366
5822
|
if a `sohl` property is present, a SoHL item of type "skill" is created.
|
|
5367
5823
|
|
|
5368
5824
|
If an `hm3` property is present, an HM3 item of type "skill" is created.
|
|
@@ -5695,8 +6151,8 @@ and `pref` are no entry.
|
|
|
5695
6151
|
| `pronunciation` | A glossary entry's that names it, else the word's; `NULL` where neither states one. |
|
|
5696
6152
|
| `class` | The word's class, as written. |
|
|
5697
6153
|
| `etymology` | `{ kind, language, language_tag, form, parts, root, frame }` from the word's `source`, `built`, `root` and `frame`; an inherited word's is `inherited` from the language that states it. `NULL` where there is none. |
|
|
5698
|
-
| `senses` | A list of `{ text, bodies }`: the word's gloss, with no bodies.
|
|
5699
|
-
| `usage` | The word
|
|
6154
|
+
| `senses` | A list of `{ text, bodies }`: one per sense of the word's gloss, with no bodies. A dictionary numbers a word's senses where it has more than one. |
|
|
6155
|
+
| `usage` | The Addresses of the notes whose prose cites the word, as the language that states it records them. |
|
|
5700
6156
|
| `common` | Whether a glossary entry that names the word marks it a word a player is expected to know by heart. |
|
|
5701
6157
|
| `depth` | How far up the language's lineage the word is stated: `0` for its own. |
|
|
5702
6158
|
|
|
@@ -6743,7 +7199,7 @@ A base is one of these. A base marked `no` never prints in the glossary.
|
|
|
6743
7199
|
| `adv` | adv. | adverb | yes |
|
|
6744
7200
|
| `pron` | pron. | pronoun | yes |
|
|
6745
7201
|
| `num` | num. | numeral | yes |
|
|
6746
|
-
| `part` |
|
|
7202
|
+
| `part` | ptcl. | particle | yes |
|
|
6747
7203
|
| `art` | art. | article | yes |
|
|
6748
7204
|
| `conj` | conj. | conjunction | yes |
|
|
6749
7205
|
| `dem` | dem. | demonstrative | yes |
|