@heroiclands/package-build 23.8.0 → 23.10.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 +53 -0
- package/README.md +2 -0
- package/bin/content-commands.mjs +207 -70
- package/docs/api.md +646 -78
- package/docs/authoring/first-note.md +1 -1
- package/docs/authoring/links-and-markup.md +253 -102
- package/docs/commands.md +111 -13
- package/docs/content-format.md +7 -2
- package/docs/diagnostics.md +1 -1
- package/docs/guides/packs.md +2 -1
- package/docs/guides/reference-pages.md +86 -63
- package/docs/reference/format-details.md +398 -137
- package/docs/reference/note-types.md +188 -174
- package/engine/anchors.mjs +15 -26
- package/engine/base-compiler.mjs +6 -4
- package/engine/changelog-group.mjs +58 -34
- package/engine/changelog-lint.mjs +6 -2
- package/engine/compendiums.mjs +15 -1
- package/engine/compile-corpus.mjs +17 -3
- package/engine/content-charset.mjs +13 -1
- package/engine/content-format.yaml +1 -0
- package/engine/content-html.mjs +18 -4
- package/engine/content-icons.mjs +15 -1
- package/engine/content-images.mjs +28 -9
- package/engine/content-index.mjs +496 -16
- package/engine/content-links.mjs +70 -27
- package/engine/content-session.mjs +247 -0
- package/engine/content-sources.mjs +110 -0
- package/engine/content-spans.mjs +87 -8
- package/engine/content-tables.mjs +9 -4
- package/engine/content-tasklists.mjs +20 -4
- package/engine/culture-reach.mjs +61 -34
- package/engine/data-keys.mjs +3 -1
- package/engine/diagnostics.mjs +17 -6
- package/engine/dictionary-layout.mjs +151 -19
- package/engine/dictionary-rows.mjs +129 -79
- package/engine/extension-attributes.mjs +28 -5
- package/engine/first-use.mjs +371 -0
- package/engine/foundry-entries.mjs +29 -8
- package/engine/generate.mjs +13 -4
- package/engine/glossary-entries.mjs +11 -11
- package/engine/heading-attributes.mjs +21 -28
- package/engine/helpers.mjs +54 -19
- package/engine/index-records.mjs +1 -0
- package/engine/index.mjs +3 -0
- package/engine/journals.mjs +13 -6
- package/engine/language-data.mjs +55 -2
- package/engine/language-rows.mjs +4 -4
- package/engine/language-terms.mjs +90 -4
- package/engine/language-words.mjs +2 -2
- package/engine/lexical-sections.mjs +247 -0
- package/engine/markup-validation.mjs +7 -2
- package/engine/metadata-index.mjs +1 -0
- package/engine/name-markup.mjs +114 -0
- package/engine/name-rows.mjs +70 -0
- package/engine/names.mjs +460 -0
- package/engine/note-addresses.mjs +25 -4
- package/engine/note-claims.mjs +2 -0
- package/engine/note-state.mjs +9 -3
- package/engine/note-vocabulary.mjs +7 -6
- package/engine/path-charset.mjs +24 -1
- package/engine/pdf-build.mjs +9 -9
- package/engine/pdf-render.mjs +15 -1
- package/engine/site-build.mjs +16 -2
- package/engine/site-index.mjs +5 -1
- package/engine/sql-tables.mjs +324 -44
- package/engine/stub-lint.mjs +10 -5
- package/engine/web-wikilinks.mjs +8 -6
- package/engine/word-rows.mjs +20 -12
- package/engine/word-terms.mjs +15 -6
- package/engine/yaml-lint.mjs +3 -5
- package/hugo-theme/static/css/style.css +4 -0
- package/package.json +1 -1
- package/types/engine/anchors.d.mts +4 -2
- package/types/engine/compendiums.d.mts +5 -1
- package/types/engine/compile-corpus.d.mts +5 -2
- package/types/engine/content-charset.d.mts +5 -1
- package/types/engine/content-html.d.mts +5 -1
- package/types/engine/content-icons.d.mts +5 -1
- package/types/engine/content-images.d.mts +5 -1
- package/types/engine/content-index.d.mts +102 -18
- package/types/engine/content-links.d.mts +22 -8
- package/types/engine/content-session.d.mts +108 -0
- package/types/engine/content-sources.d.mts +32 -0
- package/types/engine/content-spans.d.mts +3 -5
- package/types/engine/content-tables.d.mts +2 -1
- package/types/engine/content-tasklists.d.mts +5 -1
- package/types/engine/culture-reach.d.mts +22 -2
- package/types/engine/data-keys.d.mts +7 -0
- package/types/engine/diagnostics.d.mts +10 -0
- package/types/engine/dictionary-layout.d.mts +35 -4
- package/types/engine/dictionary-rows.d.mts +9 -0
- package/types/engine/extension-attributes.d.mts +16 -2
- package/types/engine/first-use.d.mts +31 -0
- package/types/engine/foundry-entries.d.mts +14 -5
- package/types/engine/generate.d.mts +5 -1
- package/types/engine/heading-attributes.d.mts +2 -2
- package/types/engine/helpers.d.mts +33 -7
- package/types/engine/index.d.mts +1 -0
- package/types/engine/journals.d.mts +5 -2
- package/types/engine/language-terms.d.mts +7 -0
- package/types/engine/lexical-sections.d.mts +96 -0
- package/types/engine/markup-validation.d.mts +2 -1
- package/types/engine/name-markup.d.mts +176 -0
- package/types/engine/name-rows.d.mts +35 -0
- package/types/engine/names.d.mts +356 -0
- package/types/engine/note-addresses.d.mts +3 -3
- package/types/engine/note-state.d.mts +2 -1
- package/types/engine/path-charset.d.mts +16 -1
- package/types/engine/site-build.d.mts +6 -3
- package/types/engine/site-index.d.mts +3 -1
- package/types/engine/sql-tables.d.mts +39 -4
- package/types/engine/stub-lint.d.mts +3 -1
- package/types/engine/word-rows.d.mts +9 -7
|
@@ -339,8 +339,11 @@ infoboxes:
|
|
|
339
339
|
### Frontmatter has three regions
|
|
340
340
|
|
|
341
341
|
A HeroicLands note has opening YAML frontmatter with nonempty `shortcode` and
|
|
342
|
-
`type` values.
|
|
343
|
-
|
|
342
|
+
`type` values. The opening and closing `---` delimiters accept LF or CRLF line
|
|
343
|
+
endings. Parsing keeps the original source text and diagnostic positions;
|
|
344
|
+
malformed YAML is an error with either line ending. The charset check recommends
|
|
345
|
+
LF and reports carriage returns as warnings. Other Markdown files are ordinary
|
|
346
|
+
Markdown. A note's frontmatter has three regions:
|
|
344
347
|
|
|
345
348
|
| Region | Describes | Unknown keys |
|
|
346
349
|
| -------------------- | ------------------------------------------------------- | ------------ |
|
|
@@ -1805,6 +1808,86 @@ name at every citation with no link edited. `[[x|]]` is labelled; `[[x]]` is not
|
|
|
1805
1808
|
It is the label that is required, not a target: the anchor-only form above
|
|
1806
1809
|
carries its pipe like every other link.
|
|
1807
1810
|
|
|
1811
|
+
#### Marking names in prose
|
|
1812
|
+
|
|
1813
|
+
`package-build lint` reports name-marking warnings in authored body prose.
|
|
1814
|
+
The warnings leave a valid package passing. Headings, frontmatter, tables,
|
|
1815
|
+
infoboxes, code, comments and embeds are outside this check.
|
|
1816
|
+
|
|
1817
|
+
A name is explicit: a `[Name]{.name}` bracket span or an authored link label.
|
|
1818
|
+
Use `.name` for names without indexed notes and links for names with notes.
|
|
1819
|
+
Plain prose is not searched for names. Wikilinks, ordinary Markdown links and
|
|
1820
|
+
reference links all supply names; a resolved empty wikilink label uses the
|
|
1821
|
+
note's full name. Images, code, footnote markers and bare autolinks without
|
|
1822
|
+
authored labels supply none.
|
|
1823
|
+
|
|
1824
|
+
1. A `.name` span whose whole text matches an indexed `name.full` or
|
|
1825
|
+
`name.aliases` should be a link. Use `[[place-arden|Arden Vale]]` or
|
|
1826
|
+
`[[place-arden|]]` to introduce that note.
|
|
1827
|
+
2. Mark or link each name at most once per note. An indexed full name and its
|
|
1828
|
+
declared aliases share one identity, including across different heading
|
|
1829
|
+
anchors. Other labels use their whole text as their identity: different
|
|
1830
|
+
labels linking to one page are separate names, and a label is not
|
|
1831
|
+
automatically an alias of its destination.
|
|
1832
|
+
3. Introduce the full name before a short form or declared alias.
|
|
1833
|
+
Possessives and regular plurals count as uses; other indexed forms can be
|
|
1834
|
+
declared aliases.
|
|
1835
|
+
|
|
1836
|
+
Bold is emphasis. A whole bold span exactly matching an indexed full name or
|
|
1837
|
+
alias receives one advisory to mark or link the name. It supplies no name
|
|
1838
|
+
occurrence or introduction, and bold containing a marked or linked name
|
|
1839
|
+
receives no such advisory. Unknown bold phrases supply no names.
|
|
1840
|
+
|
|
1841
|
+
Inline Markdown remains active inside name spans, and name spans remain
|
|
1842
|
+
valid inside emphasis:
|
|
1843
|
+
|
|
1844
|
+
```markdown
|
|
1845
|
+
**This is a phrase with [Joe Blow]{.name} in it**
|
|
1846
|
+
```
|
|
1847
|
+
|
|
1848
|
+
The name is `Joe Blow`; the surrounding phrase is emphasis. Sites and books display
|
|
1849
|
+
`.name` text in bold.
|
|
1850
|
+
|
|
1851
|
+
Each affected occurrence produces one warning at its authored
|
|
1852
|
+
`file:line:column`, naming the full name or explicit label. A warning
|
|
1853
|
+
can describe several marking problems at that occurrence.
|
|
1854
|
+
|
|
1855
|
+
An optional `data-type` on a `.name` span states what the named thing is:
|
|
1856
|
+
|
|
1857
|
+
```markdown
|
|
1858
|
+
[Ravenmoor]{.name data-type="place/settlement"}
|
|
1859
|
+
[Aldric Venn]{.name data-type="being"}
|
|
1860
|
+
```
|
|
1861
|
+
|
|
1862
|
+
Use a declared [note type](note-types.md), optionally followed by `/` and one
|
|
1863
|
+
of that type's subtypes. An enumerated declaration requires a listed subtype;
|
|
1864
|
+
an open declaration accepts a well-formed subtype, and an absent subtype
|
|
1865
|
+
declaration admits none. An unknown or malformed supplied value is an error
|
|
1866
|
+
at the `data-type` attribute's file, line and UTF-16 column. The same attribute
|
|
1867
|
+
on a span without the exact `name` class is an ordinary attribute. An untyped
|
|
1868
|
+
`.name` is valid; its type is not inferred from a matching note.
|
|
1869
|
+
|
|
1870
|
+
The index captures actual `.name` spans throughout the authored body, including
|
|
1871
|
+
headings, tables, verse and spans within links. The prose-only marking checks
|
|
1872
|
+
above keep their narrower scope. Frontmatter, literal code, escaped syntax,
|
|
1873
|
+
unmarked link labels, bold, plain prose and generated content add no names.
|
|
1874
|
+
The rendered visible text preserves its spelling and inline content.
|
|
1875
|
+
|
|
1876
|
+
Each own-note metadata record carries `names` in authored order. Every entry
|
|
1877
|
+
has exactly `name`, `type`, `subType`, `line` and `column`; absent
|
|
1878
|
+
classifications are explicit `null`, and no occurrences gives an empty array.
|
|
1879
|
+
This is derived metadata, not frontmatter. Documentation mirrors and assets
|
|
1880
|
+
do not duplicate a note's occurrences. The [`names` relation](#content-tables)
|
|
1881
|
+
flattens these entries with their containing NOTE Address.
|
|
1882
|
+
|
|
1883
|
+
Lint groups names without an indexed full-name or alias match by supplied
|
|
1884
|
+
classification and lists all their source uses. It also groups conflicting
|
|
1885
|
+
annotations of the same visible name. Untyped uses do not conflict. A bare
|
|
1886
|
+
type and its subtype agree; different supplied types or different supplied
|
|
1887
|
+
subtypes conflict. One package advisory contains both groups and is located
|
|
1888
|
+
at the earliest reported use. Advisory findings preserve a successful lint
|
|
1889
|
+
exit status. Supplied-value errors prevent publication and compilation.
|
|
1890
|
+
|
|
1808
1891
|
### Assets are types
|
|
1809
1892
|
|
|
1810
1893
|
`icon`, `image` and `audio` are types in the type vocabulary, and an address
|
|
@@ -2297,10 +2380,13 @@ convention rather than declared in a field — see
|
|
|
2297
2380
|
|
|
2298
2381
|
### Three states of a note
|
|
2299
2382
|
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2383
|
+
Nonempty `data.words` on a language note (`skill`/`language`), or `data.glossary`
|
|
2384
|
+
on a culture or affiliation, supplies page content without an authored body.
|
|
2385
|
+
Absent or empty arrays supply no such exemption. Every other typed note
|
|
2386
|
+
requires a nonempty body after its closing frontmatter fence, including
|
|
2387
|
+
`folder` and `homepage`. An empty or whitespace-only body is otherwise an error,
|
|
2388
|
+
regardless of description or `tags: [draft]`. Untyped vault scaffolding is
|
|
2389
|
+
excluded. A nonempty body with fewer than 25 prose words warns
|
|
2304
2390
|
unless tagged `draft`; the tag never exempts an empty body. A `folder` note is
|
|
2305
2391
|
held only to the nonempty rule: any body, a placeholder or a single line
|
|
2306
2392
|
included, passes with or without `draft`.
|
|
@@ -2309,14 +2395,14 @@ The `lint`, `content-index`, `package compile`, `site` and `pdf` commands enforc
|
|
|
2309
2395
|
body errors. Write a short beginning and tag it `draft` when work is unfinished.
|
|
2310
2396
|
|
|
2311
2397
|
The internal classification below describes records, including incomplete notes
|
|
2312
|
-
that inspection APIs can still read. A **stub**
|
|
2313
|
-
must receive
|
|
2398
|
+
that inspection APIs can still read. A **stub** has neither an authored body nor
|
|
2399
|
+
automatic lexical content and must receive content before it can publish.
|
|
2314
2400
|
|
|
2315
|
-
| State |
|
|
2316
|
-
| --------- |
|
|
2317
|
-
| **stub** |
|
|
2318
|
-
| **draft** |
|
|
2319
|
-
| **full** |
|
|
2401
|
+
| State | Content | Marker | Page | Document | Link target |
|
|
2402
|
+
| --------- | --------------- | --------------- | ------------ | --------------------------------- | ----------- |
|
|
2403
|
+
| **stub** | none | none | no | yes, where one would not be empty | no |
|
|
2404
|
+
| **draft** | body or lexical | `tags: [draft]` | yes, noticed | yes, noticed | yes |
|
|
2405
|
+
| **full** | body or lexical | none | yes | yes | yes |
|
|
2320
2406
|
|
|
2321
2407
|
"Document" here is the document a note's frontmatter earns. A system's Actor or
|
|
2322
2408
|
Item is earned by that system's block, in every state —
|
|
@@ -2338,7 +2424,7 @@ link starts resolving.
|
|
|
2338
2424
|
|
|
2339
2425
|
The rule is that severe because the test has to be one you can apply by looking
|
|
2340
2426
|
at the file. Every softer rule makes two files that look different behave the
|
|
2341
|
-
same.
|
|
2427
|
+
same. For a note without automatic lexical content:
|
|
2342
2428
|
|
|
2343
2429
|
| After the fence | Empty? | What happens |
|
|
2344
2430
|
| ----------------------- | ------ | --------------------------------------------------------------- |
|
|
@@ -2368,7 +2454,8 @@ It keeps everything else:
|
|
|
2368
2454
|
> index then names no artefact: `uuid`, `path` and `address` are `null`, which
|
|
2369
2455
|
> is how a record says one was not made.
|
|
2370
2456
|
|
|
2371
|
-
The test is about the **output
|
|
2457
|
+
The test is about the **output**. For a note with no generated Dictionary or
|
|
2458
|
+
Glossary content:
|
|
2372
2459
|
|
|
2373
2460
|
| The note | The document | Made? |
|
|
2374
2461
|
| ---------------------------------- | -------------------------------------- | ----- |
|
|
@@ -2400,6 +2487,11 @@ site's front door. The classification helpers retain their addresses and report
|
|
|
2400
2487
|
**full** even when their bodies are empty. Validation still rejects an empty
|
|
2401
2488
|
body for both types.
|
|
2402
2489
|
|
|
2490
|
+
Nonempty `data.words` on a language, or `data.glossary` on a culture or
|
|
2491
|
+
affiliation, supplies a generated Dictionary or Glossary page. These notes
|
|
2492
|
+
need no authored body. A nonempty authored body still follows the placeholder
|
|
2493
|
+
and short-prose rules.
|
|
2494
|
+
|
|
2403
2495
|
Every type in the vocabulary declares whether an empty body suppresses its page,
|
|
2404
2496
|
so adding a type means answering the question rather than inheriting a default.
|
|
2405
2497
|
|
|
@@ -2446,8 +2538,8 @@ any note they do not own, with no finding.
|
|
|
2446
2538
|
|
|
2447
2539
|
**Prose is untouched by this.** A body with content still compiles into one
|
|
2448
2540
|
JournalEntry, one web page and one PDF page, however many blocks the note
|
|
2449
|
-
carries and whether or not it carries any;
|
|
2450
|
-
|
|
2541
|
+
carries and whether or not it carries any; without automatic lexical content,
|
|
2542
|
+
an empty body compiles none of the three. For these notes, each state reaches the next by one edit in
|
|
2451
2543
|
one file, with its address, its id, its index record and every link into it
|
|
2452
2544
|
unchanged:
|
|
2453
2545
|
|
|
@@ -2902,7 +2994,7 @@ for the keys.
|
|
|
2902
2994
|
| `frames` | `data.sounds.frames` | `frame`, `shape`, `class` (a list), `makes`, `examples` (a list of `{ root, form }`) |
|
|
2903
2995
|
| `read_past` | `data.sounds.readPast` | `written`, `readAs`, `what` |
|
|
2904
2996
|
| `sound_changes` | `data.soundChanges` | One row per step: `position` (the set's), `name`, `from_language`, `to_language`, `takes`, `step_position` (the step's in its set), `step`, `change`, `where` |
|
|
2905
|
-
| `elements` | `data.elements` | `form`, `variants` (a list), `element_position` (the element's `position`), `kind`, `sense`, `examples` (a list), `word`, `
|
|
2997
|
+
| `elements` | `data.elements` | `form`, `variants` (a list), `element_position` (the element's `position`), `kind`, `sense`, `examples` (a list), `word`, `joining` |
|
|
2906
2998
|
| `roots` | `data.roots` | `root`, `sense`, `field` |
|
|
2907
2999
|
| `cognates` | `data.cognates` | One row per form of a set: `position` (the set's), `gloss`, `proto`, `form_language` (the form's language note), `form` |
|
|
2908
3000
|
| `calling_names` | `data.callingNames` | One row per closing: `form`, `doubled` (`true` or `false`), `usual`, and the language's `min_syllables` |
|
|
@@ -2913,7 +3005,7 @@ for the keys.
|
|
|
2913
3005
|
| `name_shapes` | `data.naming.shapes` | `of`, `syllables_min`, `syllables_max`, `per_vowel_min`, `per_vowel_max` |
|
|
2914
3006
|
| `name_edges` | `data.naming.edges` | `edge`, `sounds` (a list), `vowel` (`false` where unstated), `of` (`name` where unstated) |
|
|
2915
3007
|
| `name_draws` | `data.naming.draws` | `kind`, `elements` (a list) |
|
|
2916
|
-
| `held_from` | `data.naming.heldFrom` | `source`, `takes`, `clip`, `
|
|
3008
|
+
| `held_from` | `data.naming.heldFrom` | `source`, `takes`, `clip`, `joining` and `elements` (lists) |
|
|
2917
3009
|
| `near_names` | `data.naming.nearName.examples` | `near`, `given`, and the language's `min_syllables` |
|
|
2918
3010
|
|
|
2919
3011
|
A register name is carried by a note in the language's `data.scope` — any
|
|
@@ -2928,6 +3020,30 @@ office title, and by an anchor that has it as its name, which the row cites as
|
|
|
2928
3020
|
`max(form) FILTER (WHERE form_language = 'thalorna-note-skill-helonclng') AS "Helonic"`,
|
|
2929
3021
|
grouped by `position` and `gloss`.
|
|
2930
3022
|
|
|
3023
|
+
**`names`** is one row per actual `.name` span in an authored note body. Each
|
|
3024
|
+
row has these columns, including on an empty relation:
|
|
3025
|
+
|
|
3026
|
+
| Column | SQL type | Meaning |
|
|
3027
|
+
| --------- | --------- | -------------------------------------------------------------------------------------------- |
|
|
3028
|
+
| `owner` | `VARCHAR` | Containing authored page's canonical NOTE Address, or `NULL` when the record has no Address. |
|
|
3029
|
+
| `name` | `VARCHAR` | Rendered visible text, preserving its spelling. |
|
|
3030
|
+
| `type` | `VARCHAR` | Supplied note type, or `NULL`. |
|
|
3031
|
+
| `subType` | `VARCHAR` | Supplied subtype, or `NULL`. |
|
|
3032
|
+
| `line` | `BIGINT` | Original 1-based source line at the span's opening `[`. |
|
|
3033
|
+
| `column` | `BIGINT` | Original 1-based UTF-16 source column at that `[`. |
|
|
3034
|
+
|
|
3035
|
+
```sql
|
|
3036
|
+
SELECT owner, name, type, subType, line, "column"
|
|
3037
|
+
FROM names
|
|
3038
|
+
WHERE type = 'place'
|
|
3039
|
+
ORDER BY owner, line, "column"
|
|
3040
|
+
```
|
|
3041
|
+
|
|
3042
|
+
A native Item's source uses its NOTE page as `owner`. Declared dependency
|
|
3043
|
+
metadata supplies `names` in that package's SQL schema. Public queries exclude
|
|
3044
|
+
GM-only owners; all/native contexts retain them. Only authored occurrences
|
|
3045
|
+
contribute rows, so generated queries and sections add no further names.
|
|
3046
|
+
|
|
2931
3047
|
**`language_lineage`** is one row per language note and each language it
|
|
2932
3048
|
inherits words from through [`data.family`](#a-languages-words): `language`,
|
|
2933
3049
|
`ancestor` and `depth`, with the language itself at depth `0`, its parent at
|
|
@@ -3244,12 +3360,12 @@ value containing spaces with double quotes and escape an internal quote as
|
|
|
3244
3360
|
`\"`. Boolean values are exactly `true` or `false`; other spellings are
|
|
3245
3361
|
errors. Duplicate and unknown attributes are errors.
|
|
3246
3362
|
|
|
3247
|
-
| Attribute | What it does
|
|
3248
|
-
| ------------------------------------------- |
|
|
3249
|
-
| `allow-empty=true` | Permits a query selecting no rows. Default `false`.
|
|
3250
|
-
| `section-level=1` through `section-level=6` | Sets the heading level for `_section`. Default `2`.
|
|
3251
|
-
| `key=false` |
|
|
3252
|
-
| `key=only` | Prints a dictionary's or a glossary's key for its rows, and no letter heading or entry. Refused on a table.
|
|
3363
|
+
| Attribute | What it does |
|
|
3364
|
+
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
|
|
3365
|
+
| `allow-empty=true` | Permits a query selecting no rows. Default `false`. |
|
|
3366
|
+
| `section-level=1` through `section-level=6` | Sets the heading level for `_section`. Default `2`. |
|
|
3367
|
+
| `key=false` | Omits the key and any dictionary verb head table, retaining entries. Default `true`. Refused on a table, as `key=true` is. |
|
|
3368
|
+
| `key=only` | Prints a dictionary's or a glossary's key for its rows, and no letter heading or entry. Refused on a table. |
|
|
3253
3369
|
|
|
3254
3370
|
##### Page lists
|
|
3255
3371
|
|
|
@@ -3365,6 +3481,9 @@ An attribute-bearing opener allows a nested div to be distinguished from the bar
|
|
|
3365
3481
|
The watch wears [a _blue_ sash]{#watch-sash .uniform lang=en}.
|
|
3366
3482
|
```
|
|
3367
3483
|
|
|
3484
|
+
The exact `.name` class marks a name, with optional `data-type="type/subType"`;
|
|
3485
|
+
see [marking names in prose](#marking-names-in-prose) for the vocabulary and index.
|
|
3486
|
+
|
|
3368
3487
|
Inline Markdown remains active inside the span. Bracket spans have lower priority than URL links, image links, reference links, footnotes and wikilinks. A bracketed form immediately preceded by `!`, followed by `(` or another `[`, or beginning with `[[` is not a span, even when the link is unresolved. Ordinary links retain their existing syntax. Escape a bracket when it should be literal, or put examples inside a code span or fence. A span identifier addresses that point in the note; it does not start a journal page.
|
|
3369
3488
|
|
|
3370
3489
|
##### Alerts
|
|
@@ -3534,7 +3653,10 @@ A `follows[].event` resolves to exactly one event: a note holding one event, or
|
|
|
3534
3653
|
|
|
3535
3654
|
#### Generated sections
|
|
3536
3655
|
|
|
3537
|
-
The build
|
|
3656
|
+
The build supplies sections from a note's frontmatter and the content
|
|
3657
|
+
relationships around it. Every surface receives the same text: the Foundry
|
|
3658
|
+
journal, the website and the book. Relationship lists and event views follow
|
|
3659
|
+
the authored text as H1 sections with fixed anchors, in this order:
|
|
3538
3660
|
|
|
3539
3661
|
| Section | Anchor | On | Content |
|
|
3540
3662
|
| ----------------- | ---------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -3548,13 +3670,23 @@ The build appends sections to the end of a note's body, after everything the aut
|
|
|
3548
3670
|
| In song and story | `insongandstory` | any note | the `literature` works whose `data.subjects` name the note or one of its events, as list entries with each work's `data.form` |
|
|
3549
3671
|
| From here | `fromhere` | a `place` that states, or is named in, a border or route | the map drawn from the place, as an image |
|
|
3550
3672
|
|
|
3551
|
-
- **
|
|
3673
|
+
- **Relationship and event sections follow the author's text in the table's order.**
|
|
3552
3674
|
- **A section with nothing to show is not generated.**
|
|
3553
|
-
- **An author's own section replaces
|
|
3554
|
-
- **
|
|
3675
|
+
- **An author's own relationship or event section replaces its generated one.** A note whose body declares a prose anchor with the section's slug — `# Within {#within}`, or a block or span with that `id` — gets no generated section for it, and its own section is left exactly as written. This is the one way to turn a section off, and the way to choose different contents for it.
|
|
3676
|
+
- **A relationship list entry links to the note it names**, written `[[<address>|]]` so each surface resolves it and shows the note's current name. An entry naming a stub, which publishes no page, is its name as plain text. The lists take in the places, affiliations and works a fetched index carries.
|
|
3555
3677
|
- **The map is a drawing the build makes**, named `generated/from-<shortcode>.svg`. The website sets it inline so its place names are links, the Foundry compile stages it into the module at `assets/generated/`, and the book draws it beside its source. `generated/` is the build's: an authored image addressed there is an error. `site.maps: false` gives no place the section.
|
|
3556
3678
|
- A stub publishes no page and is given no section.
|
|
3557
3679
|
|
|
3680
|
+
**Dictionary and Glossary sections come from the owner's declarations.** A
|
|
3681
|
+
language with nonempty `data.words` receives its full alphabetical dictionary,
|
|
3682
|
+
with letter headings, field tags and one key. A culture or affiliation with
|
|
3683
|
+
nonempty `data.glossary` receives only its declared entries, including an
|
|
3684
|
+
explicitly named rank or office. An absent or empty declaration produces no
|
|
3685
|
+
section. An authored `{#dictionary}` or `{#lexicon}` heading receives the
|
|
3686
|
+
Dictionary list after its introduction, and `{#glossary}` does the same for a
|
|
3687
|
+
Glossary list. Without that heading, the build appends the section at the end
|
|
3688
|
+
of the note. See [dictionaries and glossaries](#dictionaries-and-glossaries).
|
|
3689
|
+
|
|
3558
3690
|
#### Event views
|
|
3559
3691
|
|
|
3560
3692
|
The build appends sections to the end of a note's body that list the events concerning it — a region's chronology, the events a being took part in, the accounts a people gives, what followed an event. Each is an H1 with a fixed anchor holding a `sql` fence over the `events` relation, the same Markdown an author could write, so every surface sets it as it sets an authored section: a page of the Foundry journal, a section of the website page in its table of contents, a section of the book.
|
|
@@ -4800,9 +4932,9 @@ rank names the standing, and the standing says.
|
|
|
4800
4932
|
| `language` | `Address` | The trade, temple or order tongue it keeps, naming a skill note with `subType: language` |
|
|
4801
4933
|
| `glossary` | `{ name, name_sort?, common?, definition?, pronunciation?, language? }[]` | Its own glossary terms — see [glossary terms](#glossary-terms) |
|
|
4802
4934
|
| `glossary[].name` | `string`, required | The headword |
|
|
4803
|
-
| `glossary[].name_sort` | `string` | Its sort key; the name when unstated
|
|
4804
|
-
| `glossary[].common` | `boolean` | `true` for a
|
|
4805
|
-
| `glossary[].definition` | `string` |
|
|
4935
|
+
| `glossary[].name_sort` | `string` | Its sort key; the matching word's, else the name, when unstated |
|
|
4936
|
+
| `glossary[].common` | `boolean` | `true` for a term in this owner's core vocabulary; `false` when unstated |
|
|
4937
|
+
| `glossary[].definition` | `string` | Its context meaning or own gloss; unstated, a matching dictionary word supplies its senses |
|
|
4806
4938
|
| `glossary[].pronunciation` | `string` | A respelling, as `sol-MEH-reh`: letters, apostrophes and hyphens, at most one syllable in capitals |
|
|
4807
4939
|
| `glossary[].language` | `Address` | The language the term is in, naming a skill note with `subType: language`; unstated, the affiliation's, its parents' or its culture's |
|
|
4808
4940
|
| `relations` | `Map<Address, Standing>` | Standing with other affiliations, keyed by the other body's Address |
|
|
@@ -4816,14 +4948,14 @@ together with every place whose `data.government` names it. See
|
|
|
4816
4948
|
|
|
4817
4949
|
**An affiliation may keep a tongue of its own.** A trade cant, a temple
|
|
4818
4950
|
language or an order's tongue is named in the affiliation's `data.language`, and
|
|
4819
|
-
it
|
|
4820
|
-
glossary
|
|
4821
|
-
|
|
4822
|
-
|
|
4951
|
+
it supplies the language of the affiliation's own
|
|
4952
|
+
[glossary terms](#glossary-terms) where an entry names none. A culture can
|
|
4953
|
+
select a word of that tongue for its own glossary by naming the language on
|
|
4954
|
+
the entry. In a tree that holds at least one culture note, an
|
|
4823
4955
|
affiliation that reaches no culture — naming none, inheriting none through
|
|
4824
4956
|
`data.parents`, and, for a `polity`, taking none from its places — is a warning
|
|
4825
|
-
at its `type:` line, because its ranks
|
|
4826
|
-
|
|
4957
|
+
at its `type:` line, because its ranks and offices have no culture associations
|
|
4958
|
+
for term queries.
|
|
4827
4959
|
|
|
4828
4960
|
A language needs no culture and no affiliation. A dead language, or one kept
|
|
4829
4961
|
only by a church, is a language note like any other, and nothing requires a
|
|
@@ -5317,15 +5449,29 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5317
5449
|
| `names.<name>` | `string[]` | A list the placeholder of the same name draws from |
|
|
5318
5450
|
| `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) |
|
|
5319
5451
|
| `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) |
|
|
5452
|
+
| `grammar` | `{ plural?, verbs? }` | Optional dictionary noun plurals and one verb pattern; supplied shapes only are checked |
|
|
5453
|
+
| `grammar.plural` | `{ ending, becomes }[]` | Literal suffix replacements in authored order; the first match wins |
|
|
5454
|
+
| `grammar.plural[].ending` | `string`, required, may be empty | Bare suffix to replace; empty matches every noun |
|
|
5455
|
+
| `grammar.plural[].becomes` | `string`, required, may be empty | Bare replacement; empty deletes the matching suffix |
|
|
5456
|
+
| `grammar.verbs` | `{ invariant: true }` or `{ persons: { I, you, heShe, we, youAll, they } }` | One regular present pattern, printed once at the dictionary head |
|
|
5457
|
+
| `grammar.verbs.invariant` | `true` | Verbs do not change; excludes `persons` |
|
|
5458
|
+
| `grammar.verbs.persons` | a map of all six ending strings | Each ending is added to the citation form; excludes `invariant` |
|
|
5459
|
+
| `grammar.verbs.persons.I` | `string`, required, may be empty | Ending for I |
|
|
5460
|
+
| `grammar.verbs.persons.you` | `string`, required, may be empty | Ending for you |
|
|
5461
|
+
| `grammar.verbs.persons.heShe` | `string`, required, may be empty | Ending for he/she |
|
|
5462
|
+
| `grammar.verbs.persons.we` | `string`, required, may be empty | Ending for we |
|
|
5463
|
+
| `grammar.verbs.persons.youAll` | `string`, required, may be empty | Ending for you all |
|
|
5464
|
+
| `grammar.verbs.persons.they` | `string`, required, may be empty | Ending for they |
|
|
5320
5465
|
| `classModifiers` | `string[]` | `language` only: the word class modifiers the language uses, each from the [master word classes](#word-classes); empty when unstated |
|
|
5321
5466
|
| `fields` | `{ name, holds }[]` | `language` only: the fields its words are grouped under |
|
|
5322
5467
|
| `fields[].name` | `string`, required | The field's name, which a word's `field` names |
|
|
5323
5468
|
| `fields[].holds` | `string`, required | What the field holds |
|
|
5324
|
-
| `words` | `{ form, class, field, gloss, … }[]` | `language` only: its words
|
|
5469
|
+
| `words` | `{ form, class, field, gloss, … }[]` | `language` only: its words in authored order; its automatic dictionary sorts them alphabetically — see [a language's words](#a-languages-words) |
|
|
5325
5470
|
| `words[].form` | `string`, required | The word as cited, bare: no backticks |
|
|
5326
5471
|
| `words[].variants` | `string[]` | Its other forms, as a short form beside a long one; a marked use of one cites the word |
|
|
5327
5472
|
| `words[].name_sort` | `string` | Its sort key; the form when unstated |
|
|
5328
5473
|
| `words[].class` | `string`, required | A class from the master word classes, base first: `n I f` |
|
|
5474
|
+
| `words[].plural` | `string` | Optional explicit noun plural; the dictionary uses it before the language rule |
|
|
5329
5475
|
| `words[].field` | `string`, required | One of the note's `fields` names |
|
|
5330
5476
|
| `words[].gloss` | `string` or `string[]`, required | The meaning, in brief; a list states one sense per entry, which a dictionary numbers |
|
|
5331
5477
|
| `words[].source` | `{ kind, language?, form? }` | Where the word comes from |
|
|
@@ -5456,7 +5602,7 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5456
5602
|
| `soundChanges[].steps[].step` | `string`, required | The step's label, as `A1` or `"1"`; no label stands twice in a set |
|
|
5457
5603
|
| `soundChanges[].steps[].change` | `string`, required | The change in arrow notation, as `` `ph` > `f`; `kh` > `h` ``, or the operation it names in words |
|
|
5458
5604
|
| `soundChanges[].steps[].where` | `string` | Where it holds, as `word end`; everywhere where absent |
|
|
5459
|
-
| `elements` | `{ form, variants?, position?, kind?, sense, examples?, word?,
|
|
5605
|
+
| `elements` | `{ form, variants?, position?, kind?, sense, examples?, word?, joining? }[]` | `language` only: the elements its names are built from |
|
|
5460
5606
|
| `elements[].form` | `string`, required | The element, as `arn-` |
|
|
5461
5607
|
| `elements[].variants` | `string[]` | The element's other forms, as `aldr-` beside `ald-` |
|
|
5462
5608
|
| `elements[].position` | `opening`, `closing`, `either` or `link` | Where in a name it stands |
|
|
@@ -5464,7 +5610,7 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5464
5610
|
| `elements[].sense` | `string`, required | What it means |
|
|
5465
5611
|
| `elements[].examples` | `string[]` | The names it is read from |
|
|
5466
5612
|
| `elements[].word` | `string` | The word it is the stem of, a form of `words` of the language or an ancestor |
|
|
5467
|
-
| `elements[].
|
|
5613
|
+
| `elements[].joining` | `string` | The element's joining form, as `-borgar`, when it qualifies another word |
|
|
5468
5614
|
| `roots` | `{ root, sense, field? }[]` | `language` only: the consonantal roots its words are set from |
|
|
5469
5615
|
| `roots[].root` | `string`, required | The root, as `d-l-k` |
|
|
5470
5616
|
| `roots[].sense` | `string`, required | What it means |
|
|
@@ -5504,11 +5650,11 @@ SoHL sets `system.quantity` to `1` for each compendium item.
|
|
|
5504
5650
|
| `naming.draws` | `{ kind, elements }[]` | The element kinds each kind of name is built from |
|
|
5505
5651
|
| `naming.draws[].kind` | `byname`, `given` or `place`, required | The kind of name; once per kind |
|
|
5506
5652
|
| `naming.draws[].elements` | list of `byname`, `given` or `place`, required | The element kinds, as `elements[].kind` states them |
|
|
5507
|
-
| `naming.heldFrom` | `{ source, takes, clip?,
|
|
5653
|
+
| `naming.heldFrom` | `{ source, takes, clip?, joining?, elements? }[]` | What a place name takes first, by what the place is held from |
|
|
5508
5654
|
| `naming.heldFrom[].source` | `string`, required | What the place is held from, as `a founder` |
|
|
5509
5655
|
| `naming.heldFrom[].takes` | `stem`, `godName`, `givenName` or `element`, required | What stands first: a name-stem in any grade, a god's name, a founder's given name, or one of `elements` |
|
|
5510
5656
|
| `naming.heldFrom[].clip` | `first` | How the name is clipped: to its first element; whole where absent. A name row only |
|
|
5511
|
-
| `naming.heldFrom[].
|
|
5657
|
+
| `naming.heldFrom[].joining` | `string[]` | The joining endings, one of which stands at the seam after the name. A name row only |
|
|
5512
5658
|
| `naming.heldFrom[].elements` | `string[]` | The elements that may stand first; required on, and only on, a row that takes an `element` |
|
|
5513
5659
|
| `naming.nearName` | `{ minSyllables, examples? }` | The near name a long given name carries |
|
|
5514
5660
|
| `naming.nearName.minSyllables` | `integer`, required | The fewest syllables a given name has that carries a near name |
|
|
@@ -5539,6 +5685,7 @@ data:
|
|
|
5539
5685
|
- {
|
|
5540
5686
|
form: solmère,
|
|
5541
5687
|
class: n m,
|
|
5688
|
+
pronunciation: sol-MEH-reh,
|
|
5542
5689
|
field: Love and its conduct,
|
|
5543
5690
|
gloss: "longing; the ache for a person, a place or a time that is gone",
|
|
5544
5691
|
source: { kind: borrowed, language: skill-elvndrlng, form: sólmerë },
|
|
@@ -5563,15 +5710,67 @@ so a language's words, however many, add nothing to it.
|
|
|
5563
5710
|
class I, feminine. A language declares the modifiers it uses in
|
|
5564
5711
|
`data.classModifiers`, and a word may carry only those.
|
|
5565
5712
|
|
|
5713
|
+
##### Optional noun and verb forms
|
|
5714
|
+
|
|
5715
|
+
A noun may carry gender through its existing class: `n m`, `n f` or `n n`,
|
|
5716
|
+
printed as _n. m._, _n. f._ or _n. nt._. It may state `plural` where its
|
|
5717
|
+
plural differs from the language's default. Neither is required.
|
|
5718
|
+
|
|
5719
|
+
```yaml
|
|
5720
|
+
data:
|
|
5721
|
+
classModifiers: [m]
|
|
5722
|
+
fields:
|
|
5723
|
+
- { name: People, holds: People and their everyday words }
|
|
5724
|
+
grammar:
|
|
5725
|
+
plural:
|
|
5726
|
+
- { ending: os, becomes: oi }
|
|
5727
|
+
verbs:
|
|
5728
|
+
persons: { I: o, you: es, heShe: "", we: om, youAll: et, they: on }
|
|
5729
|
+
words:
|
|
5730
|
+
- { form: marendos, class: n m, field: People, gloss: an example noun }
|
|
5731
|
+
```
|
|
5732
|
+
|
|
5733
|
+
The dictionary entry begins **marendos** _n. m., pl. marendoi_. An entry's
|
|
5734
|
+
nonempty explicit `plural` wins; otherwise the first matching
|
|
5735
|
+
`grammar.plural` replacement supplies its noun plural. Endings are bare,
|
|
5736
|
+
literal strings: `os` replaces the closing letters, with no regular
|
|
5737
|
+
expression or hyphen notation. An empty `ending` appends `becomes`; an empty
|
|
5738
|
+
`becomes` removes the ending. A noun matching no rule prints no plural.
|
|
5739
|
+
The raw `words` relation retains only the authored `plural`; the
|
|
5740
|
+
`dictionary` relation carries the displayed one.
|
|
5741
|
+
|
|
5742
|
+
`grammar.verbs` is either `{ invariant: true }`, where no verb changes, or
|
|
5743
|
+
the `persons` map shown above. A supplied `persons` map has all six string
|
|
5744
|
+
endings, each added to the citation form; `""` leaves that form unchanged.
|
|
5745
|
+
The dictionary prints the pattern once in a small table before its letter
|
|
5746
|
+
headings. A custom dictionary's default or `key=true` prints that table even
|
|
5747
|
+
when no abbreviation key is needed. `key=false` fragments omit both the key
|
|
5748
|
+
and table; `key=only` prints the abbreviation key alone. Separate results
|
|
5749
|
+
with their heads enabled each print their own tables.
|
|
5750
|
+
A language uses only its own stated grammar, including for words
|
|
5751
|
+
listed from an ancestor; an inherited word retains its explicit plural.
|
|
5752
|
+
Grammar is not inherited through `family`.
|
|
5753
|
+
|
|
5754
|
+
All grammar is optional. Only a supplied key's shape is checked: no language
|
|
5755
|
+
must supply a pattern, no noun must supply gender or plural, and no word is
|
|
5756
|
+
checked against a rule or required to provide an exception. There are no
|
|
5757
|
+
additional cases, tenses, moods or irregular verb forms. With none of these
|
|
5758
|
+
optional fields, dictionary output is unchanged. Grammar alone does not
|
|
5759
|
+
create a Dictionary section.
|
|
5760
|
+
|
|
5566
5761
|
**A word's source** is closed to seven kinds. `borrowed` names the language the
|
|
5567
5762
|
word came from in `language`, a language Address; `inherited`, `kept` and
|
|
5568
5763
|
`worn` give the ancient `form` where the note knows it; `coined`, `substrate`
|
|
5569
5764
|
and `island` give neither. A form is written bare: a renderer supplies its own
|
|
5570
5765
|
italics and its own asterisk.
|
|
5571
5766
|
|
|
5572
|
-
**`built` names the pieces a word is made of
|
|
5573
|
-
|
|
5574
|
-
|
|
5767
|
+
**`built` names the pieces a word is made of**. Each piece resolves against
|
|
5768
|
+
words, then affixes, then elements of its language, followed by each ancestor
|
|
5769
|
+
in `data.family` order. An element matches its `form` or an entry in `variants`
|
|
5770
|
+
and supplies its `sense` as the gloss. A piece written with different joining
|
|
5771
|
+
hyphens still matches (`am-` finds the word `am`); an exact spelling is checked
|
|
5772
|
+
first. An affix also matches its declared front-vowel form, `front`. Case and
|
|
5773
|
+
accents remain significant.
|
|
5575
5774
|
|
|
5576
5775
|
**A gloss is one sense or a list of them.** A list states one sense per entry,
|
|
5577
5776
|
and a dictionary numbers them: `zethu` glossed `[writing, a scribe]` prints
|
|
@@ -5636,7 +5835,7 @@ Each finding is located at the key at fault:
|
|
|
5636
5835
|
| A language Address naming something other than a language skill | error |
|
|
5637
5836
|
| A pronunciation that is not a respelling | error |
|
|
5638
5837
|
| A `frame` that no `sounds.frames` of the language or an ancestor names | error |
|
|
5639
|
-
| A `built` piece no word or
|
|
5838
|
+
| A `built` piece no word, affix or element in its lineage glosses | warning |
|
|
5640
5839
|
|
|
5641
5840
|
The `words` relation holds one row per word — see
|
|
5642
5841
|
[Content tables](#content-tables) — and a table of them is an `sql` fence over
|
|
@@ -5767,7 +5966,7 @@ data:
|
|
|
5767
5966
|
- { kind: byname, elements: [byname, place] }
|
|
5768
5967
|
heldFrom:
|
|
5769
5968
|
- { source: a god, takes: godName, clip: first }
|
|
5770
|
-
- { source: a founder, takes: givenName,
|
|
5969
|
+
- { source: a founder, takes: givenName, joining: ["-s", "-a"] }
|
|
5771
5970
|
- { source: the ting and its law, takes: element, elements: ["ting-", "lög-"] }
|
|
5772
5971
|
nearName:
|
|
5773
5972
|
minSyllables: 4
|
|
@@ -5883,9 +6082,8 @@ form and its other forms, where in a name it stands (`opening`, `closing`,
|
|
|
5883
6082
|
`either` or `link`), its sense and the names it is read from. In a language
|
|
5884
6083
|
that keeps one set of elements for each kind of name, `kind` says which
|
|
5885
6084
|
(`byname`, `given` or `place`). `word` names the word of `words` the element is
|
|
5886
|
-
the stem of, the language's or an ancestor's, and `
|
|
5887
|
-
|
|
5888
|
-
is also a word stays a word.
|
|
6085
|
+
the stem of, the language's or an ancestor's, and `joining` gives its form
|
|
6086
|
+
when it qualifies another word. An element that is also a word stays a word.
|
|
5889
6087
|
|
|
5890
6088
|
**`roots` lists consonantal roots**, each with its sense and the field it
|
|
5891
6089
|
belongs to. **`cognates`** lists, on the eldest language of a set, the form one
|
|
@@ -5918,7 +6116,7 @@ there too and `of` where the edge holds for one class of name only; an edge
|
|
|
5918
6116
|
stands once for each class. `draws` gives the element kinds each kind of name
|
|
5919
6117
|
is built from. `heldFrom` gives what a place name takes first by what the
|
|
5920
6118
|
place is held from: a name-stem, a god's name, a founder's given name — that
|
|
5921
|
-
name `clip`ped to its `first` element, or followed by one of its `
|
|
6119
|
+
name `clip`ped to its `first` element, or followed by one of its `joining`
|
|
5922
6120
|
endings — or one of the `elements` listed. `nearName` states the fewest
|
|
5923
6121
|
syllables a given name has that carries a near name, with worked examples.
|
|
5924
6122
|
|
|
@@ -5967,7 +6165,7 @@ Each finding is located at the key at fault:
|
|
|
5967
6165
|
| A naming edge stated twice for one class of name, at the second | error |
|
|
5968
6166
|
| A kind of name whose draws are stated twice, at the second | error |
|
|
5969
6167
|
| A held-from row that takes an `element` and names no `elements`, at the row | error |
|
|
5970
|
-
| `elements` on a held-from row that takes no element, or `clip` or `
|
|
6168
|
+
| `elements` on a held-from row that takes no element, or `clip` or `joining` on one that takes no name, at the key | error |
|
|
5971
6169
|
| A `scope` Address that does not resolve, or a type that is no note type | error |
|
|
5972
6170
|
| A tongue `language` or a cognate form's language that is no language note | error |
|
|
5973
6171
|
| A register row with neither a `tongue` nor a `kind`, at the row | error |
|
|
@@ -6216,7 +6414,7 @@ not a different cultural identity. See
|
|
|
6216
6414
|
| `form` | `string` | `literature` only: the kind of work in its people's own terms — `epic`, `saga`, `praise-song`, `elegy`. Free text |
|
|
6217
6415
|
| `subjects` | `Address[]` | `literature` only: the beings, places, gods and other notes the work concerns, and any event, as `note#id` |
|
|
6218
6416
|
| `parents` | `Address[]` | `culture` only: the larger cultures this one belongs to; each target is a culture lore note — see [culture parents](#culture-parents-and-inherited-fields) |
|
|
6219
|
-
| `language` | `Address` | `literature` and `culture` only: the tongue a work is composed in, or a culture's people speak, naming a skill note with `subType: language`; `package-build npc new` draws a culture's names from that language's [name lists](#name-lists)
|
|
6417
|
+
| `language` | `Address` | `literature` and `culture` only: the tongue a work is composed in, or a culture's people speak, naming a skill note with `subType: language`; `package-build npc new` draws a culture's names from that language's [name lists](#name-lists); glossary entries whose own `language` is unstated resolve to it |
|
|
6220
6418
|
| `events` | event entries — see [Events](#events) | What happened to or at this subject: dated, attributed events |
|
|
6221
6419
|
| `appearanceProfile` | `{ frame, eye_color, hair_color, skin_color, complexion, height }` | `culture` only: what its people look like, for `package-build npc new` — see [appearance profiles](#appearance-profiles) |
|
|
6222
6420
|
| `appearanceProfile.frame` | map of `frame` words to positive weights, required | How often each frame is drawn |
|
|
@@ -6229,9 +6427,9 @@ not a different cultural identity. See
|
|
|
6229
6427
|
| `appearanceProfile.height.<name>.max` | height in metres or feet and inches, required | The tallest height drawn for that gender |
|
|
6230
6428
|
| `glossary` | `{ name, name_sort?, common?, definition?, pronunciation?, language? }[]` | `culture` only: the culture's own glossary terms — see [glossary terms](#glossary-terms) |
|
|
6231
6429
|
| `glossary[].name` | `string`, required | The headword |
|
|
6232
|
-
| `glossary[].name_sort` | `string` | Its sort key; the name when unstated
|
|
6233
|
-
| `glossary[].common` | `boolean` | `true` for a
|
|
6234
|
-
| `glossary[].definition` | `string` |
|
|
6430
|
+
| `glossary[].name_sort` | `string` | Its sort key; the matching word's, else the name, when unstated |
|
|
6431
|
+
| `glossary[].common` | `boolean` | `true` for a term in this owner's core vocabulary; `false` when unstated |
|
|
6432
|
+
| `glossary[].definition` | `string` | Its context meaning or own gloss; unstated, a matching dictionary word supplies its senses |
|
|
6235
6433
|
| `glossary[].pronunciation` | `string` | A respelling, as `sol-MEH-reh`: letters, apostrophes and hyphens, at most one syllable in capitals |
|
|
6236
6434
|
| `glossary[].language` | `Address` | The language the term is in, naming a skill note with `subType: language`; unstated, the note's language |
|
|
6237
6435
|
|
|
@@ -6239,54 +6437,80 @@ not a different cultural identity. See
|
|
|
6239
6437
|
|
|
6240
6438
|
#### Glossary terms
|
|
6241
6439
|
|
|
6242
|
-
A
|
|
6243
|
-
|
|
6244
|
-
|
|
6245
|
-
|
|
6246
|
-
|
|
6247
|
-
|
|
6248
|
-
|
|
6249
|
-
|
|
6250
|
-
|
|
6251
|
-
the
|
|
6440
|
+
**A dictionary belongs to a language; a glossary belongs to a culture or an
|
|
6441
|
+
affiliation.** A language note with nonempty `data.words` receives its full Dictionary
|
|
6442
|
+
section automatically, with grammar, senses, etymology and pronunciation,
|
|
6443
|
+
field tags, letter headings and one key in a single alphabetical list. A
|
|
6444
|
+
culture or affiliation with nonempty `data.glossary` receives a Glossary section
|
|
6445
|
+
containing only its explicitly declared entries. Ranks and offices stand in
|
|
6446
|
+
the affiliation's own sections; the glossary selects one only through an
|
|
6447
|
+
explicit entry. A note without the relevant frontmatter receives no such
|
|
6448
|
+
section. These sections appear on the site, in the Foundry journal and in
|
|
6449
|
+
the book. Dictionaries and glossaries have no setting-wide pages.
|
|
6450
|
+
|
|
6451
|
+
A glossary entry belongs for one of three reasons:
|
|
6452
|
+
|
|
6453
|
+
1. **A common word** is part of the owner's core vocabulary, the words a
|
|
6454
|
+
player needs to adventure there. It states `common: true` and takes the
|
|
6455
|
+
dictionary's senses when it gives no `definition`.
|
|
6456
|
+
2. **A dictionary word with a context meaning** states that meaning in
|
|
6457
|
+
`definition`.
|
|
6458
|
+
3. **A term outside the dictionary** — a phrase, a hyphenated compound or a
|
|
6459
|
+
term of art — states its gloss in `definition`.
|
|
6460
|
+
|
|
6461
|
+
`common` belongs to an entry in its owner's glossary. A culture and an
|
|
6462
|
+
affiliation using the same language choose independently: a word may be
|
|
6463
|
+
common in one glossary and absent from another. A language's dictionary
|
|
6464
|
+
marks nothing common.
|
|
6465
|
+
|
|
6466
|
+
This culture glossary uses the words from [the Provenzal language
|
|
6467
|
+
example](#a-languages-words). `solmère` is a common word with its dictionary
|
|
6468
|
+
sense, `amère` takes the context's song sense, and `blood-field` is a term
|
|
6469
|
+
outside the dictionary. `Knight-Captain` names a rank that reaches the
|
|
6470
|
+
culture:
|
|
6252
6471
|
|
|
6253
6472
|
```yaml
|
|
6473
|
+
shortcode: provenzianclt
|
|
6474
|
+
name: { full: Provenzia }
|
|
6254
6475
|
type: lore
|
|
6255
6476
|
subType: culture
|
|
6256
6477
|
data:
|
|
6257
|
-
language: skill-
|
|
6478
|
+
language: skill-provnzlng
|
|
6258
6479
|
glossary:
|
|
6259
|
-
- { name:
|
|
6260
|
-
- { name:
|
|
6480
|
+
- { name: solmère, common: true }
|
|
6481
|
+
- { name: amère, definition: "a sweetheart, in the songs" }
|
|
6261
6482
|
- {
|
|
6262
6483
|
name: blood-field,
|
|
6263
6484
|
definition: "ground where a battle tore the boundary with the spirit world, and it did not close",
|
|
6264
6485
|
}
|
|
6265
|
-
- { name:
|
|
6486
|
+
- { name: Knight-Captain, common: true }
|
|
6266
6487
|
```
|
|
6267
6488
|
|
|
6268
|
-
**An entry
|
|
6269
|
-
|
|
6270
|
-
|
|
6271
|
-
|
|
6272
|
-
|
|
6489
|
+
**An entry naming a word of its resolved language, without a `definition`,
|
|
6490
|
+
carries that word's senses and class.** Its headword links to the word's
|
|
6491
|
+
entry in the language's dictionary. An entry with a `definition` carries that
|
|
6492
|
+
meaning instead, keeping its word link and class when it names a dictionary
|
|
6493
|
+
word.
|
|
6273
6494
|
|
|
6274
6495
|
**Every entry resolves to a language**, and the first match wins:
|
|
6275
6496
|
|
|
6276
6497
|
1. the entry's own `language`;
|
|
6277
|
-
2.
|
|
6278
|
-
every word in a language note's `data.words` is in that language;
|
|
6279
|
-
3. on an affiliation, its own `data.language`, then the nearest parent
|
|
6498
|
+
2. on an affiliation, its own `data.language`, then the nearest parent
|
|
6280
6499
|
affiliation's, nearest first and parents in the order `data.parents` lists
|
|
6281
6500
|
them, then its culture's `data.language`;
|
|
6282
|
-
|
|
6501
|
+
3. on a culture, its own `data.language`.
|
|
6502
|
+
|
|
6503
|
+
On lore and affiliation notes, `data.language` and
|
|
6504
|
+
`data.glossary[].language` name language notes. Use `skill-provnzlng` for a
|
|
6505
|
+
language in this package, or `<pkg>-note-skill-provnzlng` for its complete
|
|
6506
|
+
NOTE Address. Any other system segment, including `sohl`, is an error at the
|
|
6507
|
+
authored value. A SOHL skill Address names a compiled Item.
|
|
6283
6508
|
|
|
6284
6509
|
An affiliation's culture is the one it states or inherits, as
|
|
6285
6510
|
[Culture in the index](#culture-in-the-index) describes, and a culture's
|
|
6286
6511
|
`data.language` includes one it inherits from its
|
|
6287
|
-
[parent cultures](#culture-parents-and-inherited-fields). An
|
|
6288
|
-
|
|
6289
|
-
language and is marked `common`.
|
|
6512
|
+
[parent cultures](#culture-parents-and-inherited-fields). An entry in another
|
|
6513
|
+
tongue names that language explicitly:
|
|
6290
6514
|
|
|
6291
6515
|
```yaml
|
|
6292
6516
|
# Affiliations/Wardens.md — an order with a cant of its own
|
|
@@ -6310,76 +6534,114 @@ Each finding is located at the entry's key:
|
|
|
6310
6534
|
- An entry that resolves to no language is an error at the entry: state its
|
|
6311
6535
|
`language`, or `data.language` on the note.
|
|
6312
6536
|
- An entry's `language` that names no language skill is an error at the value.
|
|
6313
|
-
- An entry with no `definition`
|
|
6314
|
-
|
|
6537
|
+
- An entry with no `definition` naming neither a word of its resolved
|
|
6538
|
+
language, including inherited words, nor a rank or office that reaches its
|
|
6539
|
+
owner is an error at its `name`. State the word's `language`, or give the
|
|
6540
|
+
term its own `definition`.
|
|
6315
6541
|
- A pronunciation that is not a respelling is an error at the value.
|
|
6316
6542
|
- A `definition` that only repeats the one sense it replaces is a warning at the
|
|
6317
6543
|
definition, because the entry changes nothing.
|
|
6318
6544
|
|
|
6319
|
-
The `glossary` relation holds one row per entry, with the language
|
|
6320
|
-
to
|
|
6545
|
+
The `glossary` relation holds one row per entry as authored, with the language
|
|
6546
|
+
it resolves to. The `terms` relation supplies its senses and class for a
|
|
6547
|
+
`layout=glossary` fence — see [Content tables](#content-tables).
|
|
6321
6548
|
|
|
6322
6549
|
#### Dictionaries and glossaries
|
|
6323
6550
|
|
|
6324
|
-
|
|
6325
|
-
|
|
6326
|
-
|
|
6327
|
-
|
|
6328
|
-
|
|
6329
|
-
|
|
6330
|
-
|
|
6331
|
-
|
|
6332
|
-
|
|
6551
|
+
**A language's dictionary sets its words**, with their class, field,
|
|
6552
|
+
etymology, pronunciation, senses and citations. A language note with
|
|
6553
|
+
`data.words` receives that full dictionary automatically as one alphabetical
|
|
6554
|
+
list, with letter headings and one key. **A culture's or an affiliation's
|
|
6555
|
+
Glossary section sets its explicit `data.glossary` entries only**: common
|
|
6556
|
+
words, dictionary words with a context meaning, and phrases, compounds or
|
|
6557
|
+
terms of art with their own glosses. A note with absent or empty `data.words` or
|
|
6558
|
+
`data.glossary`, respectively, receives no such section. The site, Foundry
|
|
6559
|
+
journals and the book show the same sections.
|
|
6560
|
+
|
|
6561
|
+
An authored heading with `{#dictionary}` or `{#lexicon}` receives the
|
|
6562
|
+
Dictionary list after its authored text; `{#glossary}` does the same for a
|
|
6563
|
+
Glossary list. The heading and its introduction stay in place, with a single
|
|
6564
|
+
list under it. Otherwise the build appends a **Dictionary** or **Glossary**
|
|
6565
|
+
heading and its entries at the end of the note. There are no setting-wide
|
|
6566
|
+
dictionary or glossary pages.
|
|
6567
|
+
|
|
6568
|
+
`layout=dictionary` and `layout=glossary` remain available for custom SQL
|
|
6569
|
+
views of the same relations. The `terms` relation holds governance rows as
|
|
6570
|
+
well as declared glossary entries; the default Glossary section selects only
|
|
6571
|
+
the owner's explicitly declared entries. See [dictionaries and
|
|
6572
|
+
glossaries](../authoring/links-and-markup.md#dictionaries-and-glossaries) for
|
|
6573
|
+
the layouts and custom queries.
|
|
6333
6574
|
|
|
6334
6575
|
**`dictionary`** is one row per word per language it is listed under. A
|
|
6335
6576
|
language lists its own words at `depth` 0 and the words it inherits through
|
|
6336
|
-
`data.family` above that, nearest first, so `WHERE language = '<Address>'` is
|
|
6337
|
-
language's
|
|
6338
|
-
the language that states it. Where a daughter and a parent state the same
|
|
6577
|
+
`data.family` above that, nearest first, so `WHERE language = '<Address>'` is
|
|
6578
|
+
that language's full dictionary. Where a daughter and a parent state the same
|
|
6339
6579
|
form, the daughter's own word is the one listed. Words of class `name`, `stem`
|
|
6340
|
-
and `pref` are no entry.
|
|
6580
|
+
and `pref` are no entry. Nonempty `data.words` containing only these classes
|
|
6581
|
+
still supplies the Dictionary heading, with no entries or key; a stated verb
|
|
6582
|
+
pattern still supplies its head table. A word's sort
|
|
6583
|
+
key and pronunciation come from its declaration; a glossary's choices belong
|
|
6584
|
+
to its own entries.
|
|
6341
6585
|
|
|
6342
6586
|
| Column | What it holds |
|
|
6343
6587
|
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
6344
6588
|
| `language` | The language the word is listed under. |
|
|
6345
6589
|
| `language_tag` | That language note's `data.abbreviation`, or its full name where it states none. |
|
|
6346
6590
|
| `name` | The word's form. |
|
|
6347
|
-
| `name_sort` |
|
|
6591
|
+
| `name_sort` | The word's sort key, or its form where unstated. |
|
|
6348
6592
|
| `letter` | The heading letter: the first letter of `name_sort`, accents taken off and apostrophes skipped, in capitals. |
|
|
6349
|
-
| `pronunciation` |
|
|
6593
|
+
| `pronunciation` | The word's respelling; `NULL` where unstated. |
|
|
6350
6594
|
| `class` | The word's class, as written. |
|
|
6595
|
+
| `plural` | The noun's explicit plural, else its listed language's first matching replacement; `NULL` where unavailable or not a noun. |
|
|
6596
|
+
| `field` | The word's field, printed as a tag beside the entry; `NULL` where unstated. |
|
|
6351
6597
|
| `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. |
|
|
6352
6598
|
| `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. |
|
|
6353
6599
|
| `usage` | The Addresses of the notes whose prose cites the word, as the language that states it records them. |
|
|
6354
|
-
| `
|
|
6600
|
+
| `verbs` | The listed language's stated `{ invariant: true }` or six-person pattern, repeated as metadata for one head table; `NULL` where unstated. |
|
|
6355
6601
|
| `depth` | How far up the language's lineage the word is stated: `0` for its own. |
|
|
6356
6602
|
|
|
6603
|
+
A daughter language with no own words has no automatic Dictionary section.
|
|
6604
|
+
A glossary word in that resolved language links to its visible defining
|
|
6605
|
+
ancestor's dictionary entry. The glossary's `language` remains the resolved
|
|
6606
|
+
daughter language.
|
|
6607
|
+
|
|
6357
6608
|
**`terms`** is one row per term per note that owns it: an entry of a culture's
|
|
6358
6609
|
or an affiliation's `data.glossary`, or an affiliation's rank or office.
|
|
6359
6610
|
|
|
6360
|
-
| Column | What it holds
|
|
6361
|
-
| --------------- |
|
|
6362
|
-
| `owner` | The Address of the culture or affiliation that owns the term.
|
|
6363
|
-
| `owner_kind` | `culture` or `affiliation`.
|
|
6364
|
-
| `language` | The language the term is in: a glossary entry's, as it resolves; a rank's or office's, the language its body's glossary resolves to. `NULL` where none resolves.
|
|
6365
|
-
| `language_tag` | That language note's `data.abbreviation`, or its full name where it states none.
|
|
6366
|
-
| `name` | The headword.
|
|
6367
|
-
| `name_sort` |
|
|
6368
|
-
| `letter` | The heading letter, as for a word.
|
|
6369
|
-
| `pronunciation` |
|
|
6370
|
-
| `
|
|
6371
|
-
| `
|
|
6372
|
-
| `
|
|
6373
|
-
| `
|
|
6374
|
-
| `
|
|
6611
|
+
| Column | What it holds |
|
|
6612
|
+
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
6613
|
+
| `owner` | The Address of the culture or affiliation that owns the term. |
|
|
6614
|
+
| `owner_kind` | `culture` or `affiliation`. |
|
|
6615
|
+
| `language` | The language the term is in: a glossary entry's, as it resolves; a rank's or office's, the language its body's glossary resolves to. `NULL` where none resolves. |
|
|
6616
|
+
| `language_tag` | That language note's `data.abbreviation`, or its full name where it states none. |
|
|
6617
|
+
| `name` | The headword. |
|
|
6618
|
+
| `name_sort` | The glossary entry's sort key, else the dictionary word's, else the headword. |
|
|
6619
|
+
| `letter` | The heading letter, as for a word. |
|
|
6620
|
+
| `pronunciation` | The glossary entry's respelling, else the dictionary word's; `NULL` where neither states one. |
|
|
6621
|
+
| `class` | The matching dictionary word's class, as written; `NULL` where no word matches. |
|
|
6622
|
+
| `word` | The matching word's anchored dictionary entry: the resolved language's when it has own words, else the visible defining language's; `NULL` where no word matches. |
|
|
6623
|
+
| `senses` | A list of `{ text, bodies }`: a dictionary word's gloss senses with no bodies, or the entry's definition with its owner, or a rank's or office's descriptions with their bodies. |
|
|
6624
|
+
| `usage` | Citation Addresses: governance usage, inherited dictionary usage or the defining owner; a copied reached title also cites its selecting owner. |
|
|
6625
|
+
| `common` | Whether this owner's glossary entry marks the term part of its core vocabulary. |
|
|
6626
|
+
| `origins` | Which sources gave it: `rank`, `office`, `glossary`. |
|
|
6627
|
+
| `cultures` | The cultures associated through the owner and its parents, as a list of Addresses for selecting reached ranks and offices. |
|
|
6628
|
+
|
|
6629
|
+
A standalone word entry without a definition uses the dictionary's
|
|
6630
|
+
citations; an explicit term cites its owner. A rank or office keeps its
|
|
6631
|
+
body's and members' or holders' citations, including when its owner's
|
|
6632
|
+
glossary names a matching word or supplies a definition. An owner selecting
|
|
6633
|
+
a reached title also joins its own Address to that title's citations.
|
|
6375
6634
|
|
|
6376
6635
|
**A term reaches the cultures its owner reaches.** A culture's own terms reach
|
|
6377
6636
|
the culture. An affiliation's terms — its ranks, its offices and its own
|
|
6378
6637
|
glossary entries alike — reach its culture, its own or one the index resolves
|
|
6379
6638
|
for it, and the culture of every affiliation above it through `data.parents`.
|
|
6380
|
-
|
|
6381
|
-
|
|
6382
|
-
|
|
6639
|
+
`cultures` records those associations for custom queries. The default
|
|
6640
|
+
Glossary section selects its own owner's declared `data.glossary` entries;
|
|
6641
|
+
it adds no other rows from this reach. A custom view that includes reached
|
|
6642
|
+
governance rows can select `origins` containing `rank` or `office` and prints
|
|
6643
|
+
`common` only for the owner's own rows. An affiliation that reaches no culture
|
|
6644
|
+
has an empty list.
|
|
6383
6645
|
|
|
6384
6646
|
**A rank and an office of one title in one body are one row**, the rank's
|
|
6385
6647
|
sense first, and where their descriptions are identical, one sense.
|
|
@@ -6390,23 +6652,22 @@ of a culture it reaches, names it, or where it is a word of its language,
|
|
|
6390
6652
|
compared without case. A title of several words, as `Knight-Captain` or
|
|
6391
6653
|
`Lord Steward`, always is.
|
|
6392
6654
|
|
|
6393
|
-
**A glossary entry with a `definition`**
|
|
6655
|
+
**A glossary entry with a `definition`** carries that definition instead of a
|
|
6656
|
+
matching dictionary word's senses. It replaces the senses of its owner's own
|
|
6394
6657
|
rank or office of that name. Otherwise it is a term of its owner's own, cited
|
|
6395
6658
|
from the owner, so a culture's definition of a rank one of its affiliations
|
|
6396
|
-
holds is a second row beside the rank's
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
**A glossary entry without a `definition`**
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
one-word title in. Where several entries state one of these, the first in the
|
|
6409
|
-
order of the owner's Address wins.
|
|
6659
|
+
holds is a second row beside the rank's. A glossary of that culture combines
|
|
6660
|
+
the senses under one headword where the rows share a language.
|
|
6661
|
+
|
|
6662
|
+
**A glossary entry without a `definition`** names a word of its resolved
|
|
6663
|
+
language, or a rank or office that reaches its owner. A dictionary word gives
|
|
6664
|
+
the entry all its senses, its class and a link to its entry on the language
|
|
6665
|
+
page; a rank or office gives its descriptions. Where the owner has a rank or
|
|
6666
|
+
office of the same title as the word, its distinct descriptions follow the
|
|
6667
|
+
dictionary senses. The glossary entry can state its own `name_sort` or
|
|
6668
|
+
`pronunciation`. Names are compared after NFC normalisation, with case kept. Its `common` value belongs to its owner, so a
|
|
6669
|
+
culture entry naming an affiliation's rank does not mark the affiliation's
|
|
6670
|
+
entry common. Naming the rank also admits a title of one word.
|
|
6410
6671
|
|
|
6411
6672
|
**The datafiles.** `package-build content-index` writes each relation beside
|
|
6412
6673
|
the index: `<package>-dictionary.jsonl`, sorted by `language`, `name_sort` and
|
|
@@ -7358,7 +7619,7 @@ the map for the pack it is writing and falls back to `default` when there is no
|
|
|
7358
7619
|
such key, so a mistyped `journal:` files the folder wherever the default puts it
|
|
7359
7620
|
— exactly the hierarchy the key was written to override, and silently.
|
|
7360
7621
|
|
|
7361
|
-
**A folder note requires a body
|
|
7622
|
+
**A folder note requires a body.** Its body does not
|
|
7362
7623
|
produce a documentation journal or take part in `docEntryTypes`.
|
|
7363
7624
|
In a compiled Foundry journal, a wikilink to a folder prints its label as text:
|
|
7364
7625
|
the folder can materialise in several packs and has no single compendium UUID.
|