@heroiclands/package-build 25.5.5 → 25.6.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/assets/styles/content-base.css +1 -1
  3. package/docs/api.md +24 -16
  4. package/docs/authoring/frontmatter.md +1 -1
  5. package/docs/authoring/links-and-markup.md +10 -9
  6. package/docs/content-format.md +40 -1
  7. package/docs/diagnostics.md +2 -2
  8. package/docs/guides/reference-pages.md +4 -1
  9. package/docs/guides/site.md +1 -1
  10. package/docs/reference/format-details.md +174 -129
  11. package/docs/reference/note-types.md +134 -121
  12. package/docs/reference/theme-pages.md +1 -0
  13. package/engine/content-format.yaml +9 -7
  14. package/engine/content-html.mjs +3 -2
  15. package/engine/content-index.mjs +23 -0
  16. package/engine/content-links.mjs +8 -0
  17. package/engine/content-render.mjs +2 -2
  18. package/engine/content-tables.mjs +12 -5
  19. package/engine/culture-reach.mjs +3 -0
  20. package/engine/declared-sections.mjs +100 -0
  21. package/engine/derived-sections.mjs +36 -2
  22. package/engine/dictionary-rows.mjs +2 -1
  23. package/engine/generated-sections.mjs +2 -0
  24. package/engine/holdings.mjs +107 -3
  25. package/engine/index-records.mjs +3 -1
  26. package/engine/index.mjs +1 -1
  27. package/engine/language-data.mjs +0 -1
  28. package/engine/language-rows.mjs +1 -3
  29. package/engine/language-terms.mjs +7 -10
  30. package/engine/map-dot.mjs +22 -0
  31. package/engine/markdown-blocks.mjs +23 -8
  32. package/engine/metadata-index.mjs +1 -0
  33. package/engine/note-addresses.mjs +16 -0
  34. package/engine/note-vocabulary.mjs +19 -8
  35. package/engine/office-holders.mjs +76 -0
  36. package/engine/page-breaks.mjs +36 -8
  37. package/engine/pdf-render.mjs +4 -3
  38. package/engine/place-kinds.mjs +106 -0
  39. package/engine/settlement-tables.mjs +410 -675
  40. package/engine/settlement-terms.mjs +118 -0
  41. package/engine/site-build.mjs +2 -4
  42. package/engine/sql-tables.mjs +101 -7
  43. package/engine/standing-terms.mjs +9 -5
  44. package/engine/standings.mjs +83 -31
  45. package/engine/unique-items.mjs +85 -0
  46. package/package.json +9 -4
  47. package/site-theme/data/banner-kinds.yaml +2 -0
  48. package/sohl/actors.mjs +4 -3
  49. package/types/engine/content-html.d.mts +2 -1
  50. package/types/engine/culture-reach.d.mts +3 -0
  51. package/types/engine/declared-sections.d.mts +30 -0
  52. package/types/engine/derived-sections.d.mts +5 -1
  53. package/types/engine/holdings.d.mts +34 -2
  54. package/types/engine/index-records.d.mts +2 -1
  55. package/types/engine/language-terms.d.mts +5 -1
  56. package/types/engine/markdown-blocks.d.mts +5 -1
  57. package/types/engine/office-holders.d.mts +33 -0
  58. package/types/engine/page-breaks.d.mts +8 -0
  59. package/types/engine/place-kinds.d.mts +18 -0
  60. package/types/engine/settlement-tables.d.mts +25 -158
  61. package/types/engine/settlement-terms.d.mts +53 -0
  62. package/types/engine/sql-tables.d.mts +35 -3
  63. package/types/engine/standing-terms.d.mts +3 -2
  64. package/types/engine/standings.d.mts +14 -2
  65. package/types/engine/unique-items.d.mts +12 -0
  66. package/vendor/markdownlint.mjs +855 -569
@@ -90,7 +90,7 @@ These fields are accepted by every note type. A field's value can still be irrel
90
90
  | Key | Shape | Required | Meaning |
91
91
  | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------- |
92
92
  | `data.affiliations.<Address>.rank` | the level on that body's own ladder, as a whole number — an ordinary member is `1`, and `0` is the rung for someone cast out | yes | The level on the body's own `governance.ranks` ladder. |
93
- | `data.affiliations.<Address>.office` | a post from that body's `governance.offices` | no | A post the body names in its `governance.offices`, where one is held. |
93
+ | `data.affiliations.<Address>.office` | a post from that body's `governance.offices`, or a list of them | no | A post the body names in its `governance.offices`, where one is held, or a list of the posts one being holds in that body. |
94
94
  | `data.affiliations.<Address>.societies` | a list of society names | no | The societies the membership is held in, by name. SoHL carries one, the first, as the affiliation item's `system.society`. |
95
95
 
96
96
  **System mappings**
@@ -250,16 +250,17 @@ These fields are accepted by every note type. A field's value can still be irrel
250
250
 
251
251
  **Subtypes:** None.
252
252
 
253
- | Field | Shape | Meaning |
254
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
255
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
256
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
257
- | `data.weight` | number | What the thing weighs. |
258
- | `data.value` | number | What the thing is worth. |
259
- | `data.quality` | number | How well it is made. |
260
- | `data.durability` | number | How much wear it takes before it fails. |
261
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
262
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
253
+ | Field | Shape | Meaning |
254
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
255
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
256
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
257
+ | `data.weight` | number | What the thing weighs. |
258
+ | `data.value` | number | What the thing is worth. |
259
+ | `data.quality` | number | How well it is made. |
260
+ | `data.durability` | number | How much wear it takes before it fails. |
261
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
262
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
263
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
263
264
 
264
265
  **System mappings**
265
266
 
@@ -294,19 +295,20 @@ These fields are accepted by every note type. A field's value can still be irrel
294
295
 
295
296
  **Subtypes:** `mundane`, `exotic`, `elixir`.
296
297
 
297
- | Field | Shape | Meaning |
298
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
299
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
300
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
301
- | `data.weight` | number | What the thing weighs. |
302
- | `data.value` | number | What the thing is worth. |
303
- | `data.quality` | number | How well it is made. |
304
- | `data.durability` | number | How much wear it takes before it fails. |
305
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
306
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
307
- | `data.quantity` | number | How many of the thing there are; one when unstated. |
308
- | `data.potency` | string | Potency — `na`, `mild`, `strong` or `great`. |
309
- | `data.strength` | number | Strength; the higher, the stronger. |
298
+ | Field | Shape | Meaning |
299
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
300
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
301
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
302
+ | `data.weight` | number | What the thing weighs. |
303
+ | `data.value` | number | What the thing is worth. |
304
+ | `data.quality` | number | How well it is made. |
305
+ | `data.durability` | number | How much wear it takes before it fails. |
306
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
307
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
308
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
309
+ | `data.quantity` | number | How many of the thing there are; one when unstated. |
310
+ | `data.potency` | string | Potency — `na`, `mild`, `strong` or `great`. |
311
+ | `data.strength` | number | Strength; the higher, the stronger. |
310
312
 
311
313
  **System mappings**
312
314
 
@@ -322,17 +324,18 @@ These fields are accepted by every note type. A field's value can still be irrel
322
324
 
323
325
  **Subtypes:** None.
324
326
 
325
- | Field | Shape | Meaning |
326
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
327
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
328
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
329
- | `data.weight` | number | What the thing weighs. |
330
- | `data.value` | number | What the thing is worth. |
331
- | `data.quality` | number | How well it is made. |
332
- | `data.durability` | number | How much wear it takes before it fails. |
333
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
334
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
335
- | `data.capacity` | number | How much it holds. |
327
+ | Field | Shape | Meaning |
328
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
329
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
330
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
331
+ | `data.weight` | number | What the thing weighs. |
332
+ | `data.value` | number | What the thing is worth. |
333
+ | `data.quality` | number | How well it is made. |
334
+ | `data.durability` | number | How much wear it takes before it fails. |
335
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
336
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
337
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
338
+ | `data.capacity` | number | How much it holds. |
336
339
 
337
340
  **System mappings**
338
341
 
@@ -350,17 +353,18 @@ These fields are accepted by every note type. A field's value can still be irrel
350
353
 
351
354
  **Subtypes:** None.
352
355
 
353
- | Field | Shape | Meaning |
354
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
355
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
356
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
357
- | `data.weight` | number | What the thing weighs. |
358
- | `data.value` | number | What the thing is worth. |
359
- | `data.quality` | number | How well it is made. |
360
- | `data.durability` | number | How much wear it takes before it fails. |
361
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
362
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
363
- | `data.quantity` | number | How many of the thing there are; one when unstated. |
356
+ | Field | Shape | Meaning |
357
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
358
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
359
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
360
+ | `data.weight` | number | What the thing weighs. |
361
+ | `data.value` | number | What the thing is worth. |
362
+ | `data.quality` | number | How well it is made. |
363
+ | `data.durability` | number | How much wear it takes before it fails. |
364
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
365
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
366
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
367
+ | `data.quantity` | number | How many of the thing there are; one when unstated. |
364
368
 
365
369
  **System mappings**
366
370
 
@@ -425,17 +429,18 @@ These fields are accepted by every note type. A field's value can still be irrel
425
429
 
426
430
  **Subtypes:** `none`, `arrow`, `bolt`, `bullet`, `dart`, `other`.
427
431
 
428
- | Field | Shape | Meaning |
429
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
430
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
431
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
432
- | `data.weight` | number | What the thing weighs. |
433
- | `data.value` | number | What the thing is worth. |
434
- | `data.quality` | number | How well it is made. |
435
- | `data.durability` | number | How much wear it takes before it fails. |
436
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
437
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
438
- | `data.quantity` | number | How many of the thing there are; one when unstated. |
432
+ | Field | Shape | Meaning |
433
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
434
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
435
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
436
+ | `data.weight` | number | What the thing weighs. |
437
+ | `data.value` | number | What the thing is worth. |
438
+ | `data.quality` | number | How well it is made. |
439
+ | `data.durability` | number | How much wear it takes before it fails. |
440
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
441
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
442
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
443
+ | `data.quantity` | number | How many of the thing there are; one when unstated. |
439
444
 
440
445
  **System mappings**
441
446
 
@@ -473,7 +478,7 @@ These fields are accepted by every note type. A field's value can still be irrel
473
478
  | `data.tongues` | list of `{ tag, meaning, language? }` | The tags a register row's `tongue` may name, each with what it means. A language skill note only. |
474
479
  | `data.register` | list of `{ name, tongue?, kind?, built?, gloss?, why? }` | Every name the setting gives in the language's reach, with its tongue and pieces; the notes carrying each name are derived. A language skill note only. |
475
480
  | `data.retired` | list of `{ form, instead?, why }` | The forms the setting does not write, and why. A language skill note only. |
476
- | `data.scope` | a map — `{ folders?, cultures?, lore?, parents?, addresses?, paths?, types?, skip? }` | The notes the register covers. A language skill note only. |
481
+ | `data.scope` | a map — `{ folders?, cultures?, lore?, parents?, addresses?, types?, skip? }` | The notes the register covers. A language skill note only. |
477
482
  | `data.sounds` | a map — `{ letters?, edges?, clusters?, stress?, finals?, syllables?, joining?, joins?, marks?, skeleton?, frames?, readPast?, mutations? }` | The letters the language writes and the rules its words keep. A language skill note only. |
478
483
  | `data.soundChanges` | list of `{ name, from?, to?, takes?, steps }` | Named sets of ordered changes, each making one tongue's words from another's. A language skill note only. |
479
484
  | `data.elements` | list of `{ form, variants?, position?, kind?, sense, examples?, word?, joining? }` | The elements the language's names are built from. A language skill note only. |
@@ -576,7 +581,6 @@ These fields are accepted by every note type. A field's value can still be irrel
576
581
  | `data.scope.lore` | a list of lore Addresses | no | Every note whose `data.lore` names one of these notes. |
577
582
  | `data.scope.parents` | a list of Addresses | no | Every note whose `data.parents` names one of these notes. |
578
583
  | `data.scope.addresses` | a list of Addresses | no | These notes themselves. |
579
- | `data.scope.paths` | a list of content paths | no | Every note whose file sits below one of these paths of the content tree. |
580
584
  | `data.scope.types` | a list of note types | no | The note types the register covers; where stated, a note of another type is out of scope whatever else catches it. |
581
585
  | `data.scope.skip` | a list of Addresses | no | Notes out of scope whatever else catches them. |
582
586
  | `data.sounds.letters` | list of `{ letters, kind, like?, place?, ipa?, tongue? }` | no | The letters the language writes, and the sounds they stand for. |
@@ -632,7 +636,7 @@ These fields are accepted by every note type. A field's value can still be irrel
632
636
  | `data.sounds.marks` | list of `{ mark, letters, kind, limit }` | no | The marks the language writes on its letters. |
633
637
  | `data.sounds.marks[].mark` | a string, such as `acute` | yes | The mark's name. |
634
638
  | `data.sounds.marks[].letters` | a list of letters | yes | The letters that carry it. |
635
- | `data.sounds.marks[].kind` | one of stress, length, apart | yes | What the mark says of its letter. |
639
+ | `data.sounds.marks[].kind` | one of stress, length, apart, quality | yes | What the mark says of its letter. |
636
640
  | `data.sounds.marks[].limit` | one of one, any | yes | How many a word may carry: `one` at most, or `any`. |
637
641
  | `data.sounds.skeleton` | list of `{ second, between? }` | no | The vowel set between a root's second and third consonants. |
638
642
  | `data.sounds.skeleton[].second` | a list of sounds, or `any` | yes | The second consonants of a root the row holds for; `any` for every other. |
@@ -754,16 +758,17 @@ These fields are accepted by every note type. A field's value can still be irrel
754
758
 
755
759
  **Subtypes:** None.
756
760
 
757
- | Field | Shape | Meaning |
758
- | ----------------------- | ----------------------- | ------------------------------------------------------------------------------------------------------------ |
759
- | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
760
- | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
761
- | `data.weight` | number | What the thing weighs. |
762
- | `data.value` | number | What the thing is worth. |
763
- | `data.quality` | number | How well it is made. |
764
- | `data.durability` | number | How much wear it takes before it fails. |
765
- | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
766
- | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
761
+ | Field | Shape | Meaning |
762
+ | ----------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
763
+ | `data.icon` | an Address | The document's profile art — an `icon` address, resolved into `img`. |
764
+ | `data.templatePriority` | number | Template priority; unset means the note is not a template. |
765
+ | `data.weight` | number | What the thing weighs. |
766
+ | `data.value` | number | What the thing is worth. |
767
+ | `data.quality` | number | How well it is made. |
768
+ | `data.durability` | number | How much wear it takes before it fails. |
769
+ | `data.made` | an Address of one event | The event in which the thing was made — `lore-forging`, or one event of a note as `place-ironfells#raising`. |
770
+ | `data.lost` | an Address of one event | The event in which the thing was lost — `lore-flood`, or one event of a note as `place-ironfells#sack`. |
771
+ | `data.unique` | `true` or `false` | `true` for a one-of-a-kind item, such as a named weapon; its note links the places and beings involved. Absent, the item is common. |
767
772
 
768
773
  **System mappings**
769
774
 
@@ -897,7 +902,7 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
897
902
 
898
903
  ### place
899
904
 
900
- **Subtypes:** `world`, `region`, `settlement`, `site`, `structure`, `feature`, `celestial`.
905
+ **Subtypes:** `world`, `region`, `district`, `settlement`, `site`, `structure`, `feature`, `route`, `celestial`.
901
906
 
902
907
  | Field | Shape | Meaning |
903
908
  | -------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -909,6 +914,7 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
909
914
  | `data.culture` | an Address | The people this place belongs to, as a culture lore note. |
910
915
  | `data.population` | number | Approximate population, to two significant digits. |
911
916
  | `data.government` | an Address or null | The governing affiliation Address; the default target type is affiliation. Explicit null means complete anarchy. A positive population with no government key produces an advisory. |
917
+ | `data.settlements` | { rows, tail } | A region's settlement rows and the sentence stating what they leave out; the table is generated from this declaration. |
912
918
  | `data.market` | number | What trade the settlement supports, on a scale of six: 1 hamlet, 2 village, 3 town, 4 market town, 5 city, 6 great city. |
913
919
  | `data.borders` | list of `{ to, bearing }` entries | Places sharing a frontier with this one — each the other's shortcode and where it lies from here. |
914
920
  | `data.routes` | list of `{ to, bearing, mode, days, terrain?, leagues? }` entries | Journeys from this place's centre — where the destination lies, how it is travelled, and about how many days it takes. |
@@ -929,54 +935,62 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
929
935
 
930
936
  **Inner keys** — a key a field's value does not declare is an error at its own line and column.
931
937
 
932
- | Key | Shape | Required | Meaning |
933
- | ------------------------------------------ | ------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------- |
934
- | `data.events[].id` | an address segment | no | The event's name within its note — lowercase letters and digits. |
935
- | `data.events[].kind` | one `eventKind` value | no | What sort of thing happened. |
936
- | `data.events[].depth` | one `depth` value | no | How far the event's history reaches. |
937
- | `data.events[].when` | a date, or `"0.<day>"` | yes | When it happened, or the anchor and first instance of an event that recurs. |
938
- | `data.events[].until` | a date | no | When a continuous event ended, or where a recurring series stopped. |
939
- | `data.events[].recurs` | `{ every }` or `{ on }` | no | How further occurrences are found; absent for an event that happened once. |
940
- | `data.events[].recurs.every` | a whole number of years, 1 or more | no | A period counted on the canonical axis from `when`. |
941
- | `data.events[].recurs.on` | a list of dates, strictly increasing, each later than `when` | no | Recorded occurrences beyond the first, in place of a period. |
942
- | `data.events[].summary` | a string | yes | What happened, stated plainly. |
943
- | `data.events[].standing` | one `standing` value | no | What the world's evidence supports. |
944
- | `data.events[].names` | `{ name, by, gloss? }[]` | no | The event's names in the world, each with who uses it. |
945
- | `data.events[].names[].name` | a string | yes | One name the event goes by in the world. |
946
- | `data.events[].names[].by` | an Address naming an `affiliation`, `lore`, `place`, `being` or `skill` note | yes | Who uses that name — a people, a polity, a faith, a place, a tongue. |
947
- | `data.events[].names[].gloss` | a string | no | What the name means, or how it is used. |
948
- | `data.events[].where` | `{ locus?, reach? }` | no | Where it happened, and where it was felt. |
949
- | `data.events[].where.locus` | a list of Addresses, each defaulting to `place` | no | Where the event physically happened; each resolves to a place. |
950
- | `data.events[].where.reach` | `{ place, how, knowledge, attributedTo? }[]` | no | Where the event was felt, and whether each place knows why. |
951
- | `data.events[].where.reach[].place` | an Address, defaulting to `place` | yes | A place where the event was felt. |
952
- | `data.events[].where.reach[].how` | a string | yes | One clause: a consequence someone in that place could notice. |
953
- | `data.events[].where.reach[].knowledge` | one `knowledge` value | yes | Whether that place connects what it felt to this event. |
954
- | `data.events[].where.reach[].attributedTo` | an Address, defaulting to `lore`, naming an event or a `lore` note | no | Only beside `knowledge: misattributed` — the cause that place names instead. |
955
- | `data.events[].who` | `{ ref, role }[]` | no | Who took part, and as what. |
956
- | `data.events[].who[].ref` | an Address naming a `being`, `affiliation` or `lore` note | yes | A participant — a being, a people, an affiliation. |
957
- | `data.events[].who[].role` | one `role` value | yes | What the participant was to the event. |
958
- | `data.events[].follows` | `{ event, how, note? }[]` | no | The earlier events this one follows from. |
959
- | `data.events[].follows[].event` | an Address, defaulting to `lore`, anchored to an `event` where its note holds several | yes | The earlier event; it resolves to exactly one event. |
960
- | `data.events[].follows[].how` | one `followsHow` value | yes | How this event follows from it. |
961
- | `data.events[].follows[].note` | a string | no | One clause saying what connects the two. |
962
- | `data.events[].accounts` | `{ by, says, agrees, withholds? }[]` | no | What each people, polity, faith or place says about it. |
963
- | `data.events[].accounts[].by` | an Address naming an `affiliation`, `lore`, `place` or `being` note | yes | Who holds the account. |
964
- | `data.events[].accounts[].says` | a string | yes | What they say happened, in their terms. |
965
- | `data.events[].accounts[].agrees` | one `agrees` value | yes | How far their account agrees with `summary`. |
966
- | `data.events[].accounts[].withholds` | a string | no | What they decline to say. |
967
- | `data.events[].unresolved` | a list of strings | no | What the world itself has not settled. |
968
- | `data.events[].sources` | a list of Addresses | no | The notes that state or support the event; each resolves. |
969
- | `data.events[].stated` | `{ calendar, text }` | no | The date as one tradition writes it in its own reckoning. |
970
- | `data.events[].stated.calendar` | an Address, or a lore shortcode | yes | The calendar that tradition reckons in — a `lore` note with `subType: calendar`. |
971
- | `data.events[].stated.text` | a string | yes | The date as that tradition writes it. |
972
- | `data.borders[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
973
- | `data.borders[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
974
- | `data.routes[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
975
- | `data.routes[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
976
- | `data.routes[].mode` | one of land, boat, ship | yes | How the journey is travelled. |
977
- | `data.routes[].days` | one of 1, 2, 3, 5, 10, 20, 30, 45, 60, 90, 180, 360 | yes | About how many days the journey takes, under normal conditions. |
978
- | `data.routes[].terrain` | a list of terrains in travel order | no | The terrains crossed, in travel order, each crossable by the mode. |
979
- | `data.routes[].leagues` | a distance in leagues | no | The distance, in leagues. |
938
+ | Key | Shape | Required | Meaning |
939
+ | ------------------------------------------ | ------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------- |
940
+ | `data.events[].id` | an address segment | no | The event's name within its note — lowercase letters and digits. |
941
+ | `data.events[].kind` | one `eventKind` value | no | What sort of thing happened. |
942
+ | `data.events[].depth` | one `depth` value | no | How far the event's history reaches. |
943
+ | `data.events[].when` | a date, or `"0.<day>"` | yes | When it happened, or the anchor and first instance of an event that recurs. |
944
+ | `data.events[].until` | a date | no | When a continuous event ended, or where a recurring series stopped. |
945
+ | `data.events[].recurs` | `{ every }` or `{ on }` | no | How further occurrences are found; absent for an event that happened once. |
946
+ | `data.events[].recurs.every` | a whole number of years, 1 or more | no | A period counted on the canonical axis from `when`. |
947
+ | `data.events[].recurs.on` | a list of dates, strictly increasing, each later than `when` | no | Recorded occurrences beyond the first, in place of a period. |
948
+ | `data.events[].summary` | a string | yes | What happened, stated plainly. |
949
+ | `data.events[].standing` | one `standing` value | no | What the world's evidence supports. |
950
+ | `data.events[].names` | `{ name, by, gloss? }[]` | no | The event's names in the world, each with who uses it. |
951
+ | `data.events[].names[].name` | a string | yes | One name the event goes by in the world. |
952
+ | `data.events[].names[].by` | an Address naming an `affiliation`, `lore`, `place`, `being` or `skill` note | yes | Who uses that name — a people, a polity, a faith, a place, a tongue. |
953
+ | `data.events[].names[].gloss` | a string | no | What the name means, or how it is used. |
954
+ | `data.events[].where` | `{ locus?, reach? }` | no | Where it happened, and where it was felt. |
955
+ | `data.events[].where.locus` | a list of Addresses, each defaulting to `place` | no | Where the event physically happened; each resolves to a place. |
956
+ | `data.events[].where.reach` | `{ place, how, knowledge, attributedTo? }[]` | no | Where the event was felt, and whether each place knows why. |
957
+ | `data.events[].where.reach[].place` | an Address, defaulting to `place` | yes | A place where the event was felt. |
958
+ | `data.events[].where.reach[].how` | a string | yes | One clause: a consequence someone in that place could notice. |
959
+ | `data.events[].where.reach[].knowledge` | one `knowledge` value | yes | Whether that place connects what it felt to this event. |
960
+ | `data.events[].where.reach[].attributedTo` | an Address, defaulting to `lore`, naming an event or a `lore` note | no | Only beside `knowledge: misattributed` — the cause that place names instead. |
961
+ | `data.events[].who` | `{ ref, role }[]` | no | Who took part, and as what. |
962
+ | `data.events[].who[].ref` | an Address naming a `being`, `affiliation` or `lore` note | yes | A participant — a being, a people, an affiliation. |
963
+ | `data.events[].who[].role` | one `role` value | yes | What the participant was to the event. |
964
+ | `data.events[].follows` | `{ event, how, note? }[]` | no | The earlier events this one follows from. |
965
+ | `data.events[].follows[].event` | an Address, defaulting to `lore`, anchored to an `event` where its note holds several | yes | The earlier event; it resolves to exactly one event. |
966
+ | `data.events[].follows[].how` | one `followsHow` value | yes | How this event follows from it. |
967
+ | `data.events[].follows[].note` | a string | no | One clause saying what connects the two. |
968
+ | `data.events[].accounts` | `{ by, says, agrees, withholds? }[]` | no | What each people, polity, faith or place says about it. |
969
+ | `data.events[].accounts[].by` | an Address naming an `affiliation`, `lore`, `place` or `being` note | yes | Who holds the account. |
970
+ | `data.events[].accounts[].says` | a string | yes | What they say happened, in their terms. |
971
+ | `data.events[].accounts[].agrees` | one `agrees` value | yes | How far their account agrees with `summary`. |
972
+ | `data.events[].accounts[].withholds` | a string | no | What they decline to say. |
973
+ | `data.events[].unresolved` | a list of strings | no | What the world itself has not settled. |
974
+ | `data.events[].sources` | a list of Addresses | no | The notes that state or support the event; each resolves. |
975
+ | `data.events[].stated` | `{ calendar, text }` | no | The date as one tradition writes it in its own reckoning. |
976
+ | `data.events[].stated.calendar` | an Address, or a lore shortcode | yes | The calendar that tradition reckons in — a `lore` note with `subType: calendar`. |
977
+ | `data.events[].stated.text` | a string | yes | The date as that tradition writes it. |
978
+ | `data.settlements.rows` | a list of settlement rows | yes | One row per settlement. |
979
+ | `data.settlements.rows[].place` | a place Address | no | The existing settlement note; exclusive with name. |
980
+ | `data.settlements.rows[].name` | plain text | no | A settlement without a note; exclusive with place. |
981
+ | `data.settlements.rows[].market` | a market class, 1 to 6 | yes | What trade the settlement supports. |
982
+ | `data.settlements.rows[].population` | a positive whole number | yes | How many people live here. |
983
+ | `data.settlements.rows[].heldBy` | an affiliation or being Address | no | What holds the settlement's land, where its culture holds land; what the holder is says how it is held. |
984
+ | `data.settlements.rows[].for` | plain text | no | Optional reason the settlement exists. |
985
+ | `data.settlements.tail` | a nonempty sentence | yes | What the table leaves out. |
986
+ | `data.borders[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
987
+ | `data.borders[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
988
+ | `data.routes[].to` | the other place — its shortcode, or its Address | yes | The other place, by Address; the type defaults to `place`. |
989
+ | `data.routes[].bearing` | one of N, NE, E, SE, S, SW, W, NW | yes | Where the other place lies from here. |
990
+ | `data.routes[].mode` | one of land, boat, ship | yes | How the journey is travelled. |
991
+ | `data.routes[].days` | one of 1, 2, 3, 5, 10, 20, 30, 45, 60, 90, 180, 360 | yes | About how many days the journey takes, under normal conditions. |
992
+ | `data.routes[].terrain` | a list of terrains in travel order | no | The terrains crossed, in travel order, each crossable by the mode. |
993
+ | `data.routes[].leagues` | a distance in leagues | no | The distance, in leagues. |
980
994
 
981
995
  ### scenario
982
996
 
@@ -989,7 +1003,6 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
989
1003
  | `data.cast` | list of Addresses | Beings who appear in it. |
990
1004
  | `data.factions` | list of Addresses | Affiliations with a stake in it. |
991
1005
  | `data.follows` | list of Addresses | Scenarios that should be played before this one. |
992
- | `data.status` | string | `draft`, `playtested` or `published`. |
993
1006
  | `data.party.size` | string | `solo`, `small`, `standard`, `large` or `host`. |
994
1007
  | `data.party.archetypes` | list of strings | Archetypes the scenario is written for. |
995
1008
 
@@ -1063,7 +1076,7 @@ Lore records in-world knowledge. A `culture` describes a people; a `custom` desc
1063
1076
  | `data.sounds.marks` | list of `{ mark, letters, kind, limit }` | no | The marks the language writes on its letters. |
1064
1077
  | `data.sounds.marks[].mark` | a string, such as `acute` | yes | The mark's name. |
1065
1078
  | `data.sounds.marks[].letters` | a list of letters | yes | The letters that carry it. |
1066
- | `data.sounds.marks[].kind` | one of stress, length, apart | yes | What the mark says of its letter. |
1079
+ | `data.sounds.marks[].kind` | one of stress, length, apart, quality | yes | What the mark says of its letter. |
1067
1080
  | `data.sounds.marks[].limit` | one of one, any | yes | How many a word may carry: `one` at most, or `any`. |
1068
1081
  | `data.metres[].name` | string | yes | What a verse div's `scan=` names the metre by: lowercase letters, digits and `-`, unique in the package. |
1069
1082
  | `data.metres[].beats` | a whole number above zero | yes | The beats of one line. |
@@ -218,6 +218,7 @@ something to show:
218
218
  | Within | `within` | a place | the places whose `data.parents` names it, a paragraph to each kind of place |
219
219
  | Governed by | `governedby` | a place | the affiliation its `data.government` names, with that affiliation's kind |
220
220
  | Governed places | `governedplaces` | an affiliation | the places whose `data.government` names it, a paragraph to each kind of place |
221
+ | Office holders | `officeholders` | an affiliation | each office a living being holds, one line each, with its holders |
221
222
  | Chronology | `chronology` | a place | the [event views](format-details.md#event-views) |
222
223
  | Events | `events` | a being, an affiliation or a people | the event views |
223
224
  | Accounts | `accounts` | an affiliation, a place or a people | the event views |
@@ -96,6 +96,7 @@ types:
96
96
  - durability
97
97
  - made
98
98
  - lost
99
+ - unique
99
100
  subTypes: []
100
101
  armorlocation:
101
102
  data:
@@ -114,6 +115,7 @@ types:
114
115
  - durability
115
116
  - made
116
117
  - lost
118
+ - unique
117
119
  - quantity
118
120
  - potency
119
121
  - strength
@@ -130,6 +132,7 @@ types:
130
132
  - durability
131
133
  - made
132
134
  - lost
135
+ - unique
133
136
  - capacity
134
137
  subTypes: []
135
138
  miscgear:
@@ -141,6 +144,7 @@ types:
141
144
  - durability
142
145
  - made
143
146
  - lost
147
+ - unique
144
148
  - quantity
145
149
  subTypes: []
146
150
  mystery:
@@ -189,6 +193,7 @@ types:
189
193
  - durability
190
194
  - made
191
195
  - lost
196
+ - unique
192
197
  - quantity
193
198
  subTypes:
194
199
  - none
@@ -268,6 +273,7 @@ types:
268
273
  - durability
269
274
  - made
270
275
  - lost
276
+ - unique
271
277
  subTypes: []
272
278
  lore:
273
279
  data:
@@ -323,6 +329,7 @@ types:
323
329
  - culture
324
330
  - population
325
331
  - government
332
+ - settlements
326
333
  - market
327
334
  - borders
328
335
  - routes
@@ -343,10 +350,12 @@ types:
343
350
  subTypes:
344
351
  - world
345
352
  - region
353
+ - district
346
354
  - settlement
347
355
  - site
348
356
  - structure
349
357
  - feature
358
+ - route
350
359
  - celestial
351
360
  scenario:
352
361
  data:
@@ -355,7 +364,6 @@ types:
355
364
  - cast
356
365
  - factions
357
366
  - follows
358
- - status
359
367
  - party.size
360
368
  - party.archetypes
361
369
  subTypes:
@@ -740,12 +748,6 @@ vocabularies:
740
748
  - "4"
741
749
  - "5"
742
750
  - "6"
743
- holdingModel:
744
- - held
745
- - endowed
746
- - registered
747
- - kin
748
- - polis
749
751
  bearing:
750
752
  - N
751
753
  - NE
@@ -64,7 +64,8 @@ import { positionInBody, splitFrontmatter } from "./diagnostics.mjs";
64
64
  * markdown's own angle brackets out of it: an autolink is `<https://…>`, and
65
65
  * `https` is followed by `:` rather than whitespace or `>`, so the pattern
66
66
  * stops. A comparison written in prose — `a < b` — has no name after the
67
- * bracket at all.
67
+ * bracket at all. A doubled `<<` opens a quotation, so its second bracket
68
+ * never starts an HTML tag.
68
69
  *
69
70
  * Attributes are consumed as "anything but a bracket", deliberately loosely: a
70
71
  * finding names the tag, and a pattern that tried to parse attribute syntax
@@ -73,7 +74,7 @@ import { positionInBody, splitFrontmatter } from "./diagnostics.mjs";
73
74
  *
74
75
  * @type {RegExp}
75
76
  */
76
- export const HTML_TAG = /<\/?[A-Za-z][A-Za-z0-9-]*(?:\s[^<>]*)?\/?>/g;
77
+ export const HTML_TAG = /(?<!<)<\/?[A-Za-z][A-Za-z0-9-]*(?:\s[^<>]*)?\/?>/g;
77
78
 
78
79
  /**
79
80
  * What a note carrying raw HTML is told.