@heroiclands/package-build 25.2.1 → 25.3.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 CHANGED
@@ -1,5 +1,16 @@
1
1
  # @heroiclands/package-build
2
2
 
3
+ ## 25.3.0
4
+
5
+ **Verse**
6
+
7
+ - Versions of a work share automatic stanza labels and a check that their stanza shapes agree. An encoded original is written once and appears as aligned script and Roman text. Directions and speaker labels carry plain presentation hooks.
8
+
9
+ **Upgrading**
10
+
11
+ - Verse fences join source newlines: add `/` at intended line endings. Blank lines or `//` end stanzas, and standalone `***` ends a canto.
12
+ - Remove `numstep=` and `cols=` from verse fences and remove column prefixes. Write each original once with its fence-level `lang=` and `enc=`; update the package and convert its content together.
13
+
3
14
  ## 25.2.1
4
15
 
5
16
  **Rendering and sites**
@@ -124,168 +124,117 @@
124
124
  * the two markers are also the editor preview's stylesheet, with the content
125
125
  * roots replaced by the preview's own. */
126
126
 
127
- /* Verse groups are paragraphs; explicit stanza separators add their own gap. */
127
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
128
+ .verse
129
+ .verse-stanza
130
+ p {
131
+ margin: 0;
132
+ }
133
+
134
+ /* Logical stanzas share labels across native and Roman presentations. */
128
135
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror) .verse {
129
136
  margin: 1.5rem 0;
130
137
  line-height: 1.7;
138
+ container-type: inline-size;
131
139
  }
132
-
133
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror) .verse p {
134
- margin: 0;
140
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
141
+ .verse
142
+ .verse-stanza {
143
+ position: relative;
144
+ margin: 0 0 1em;
135
145
  }
136
-
137
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror) .verse p + p {
138
- margin-top: 1em;
146
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
147
+ .verse-labelled
148
+ .verse-stanza {
149
+ padding-inline-start: 3em;
139
150
  }
140
-
141
- .verse .verse-line {
151
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
152
+ .verse
153
+ .verse-label {
154
+ position: absolute;
155
+ inset-inline-start: 0;
156
+ width: 2.5em;
157
+ text-align: end;
158
+ font-size: 0.75em;
159
+ color: color-mix(in srgb, currentColor 60%, transparent);
160
+ }
161
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror) .verse .verse-line {
142
162
  display: inline-block;
143
163
  margin-inline-start: var(--verse-indent, 0em);
144
164
  white-space: pre-wrap;
145
165
  }
146
-
147
- .verse :is(.verse-line, .verse-part).i1 {
166
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
167
+ .verse
168
+ .verse-line.i1 {
148
169
  --verse-indent: 1.25em;
149
170
  }
150
- .verse :is(.verse-line, .verse-part).i2 {
171
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
172
+ .verse
173
+ .verse-line.i2 {
151
174
  --verse-indent: 2.5em;
152
175
  }
153
- .verse :is(.verse-line, .verse-part).i3 {
176
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
177
+ .verse
178
+ .verse-line.i3 {
154
179
  --verse-indent: 3.75em;
155
180
  }
156
- .verse :is(.verse-line, .verse-part).i4 {
181
+ :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
182
+ .verse
183
+ .verse-line.i4 {
157
184
  --verse-indent: 5em;
158
185
  }
159
- .verse :is(.verse-line, .verse-part).i5 {
160
- --verse-indent: 6.25em;
161
- }
162
- .verse :is(.verse-line, .verse-part).i6 {
163
- --verse-indent: 7.5em;
164
- }
165
- .verse :is(.verse-line, .verse-part).i7 {
166
- --verse-indent: 8.75em;
167
- }
168
- .verse :is(.verse-line, .verse-part).i8 {
169
- --verse-indent: 10em;
170
- }
171
-
172
- .verse .verse-stanza-break {
173
- display: block;
174
- height: 0.5em;
175
- }
176
-
177
- /* Numbered verse carries its numbers in a margin. A verse in columns is one
178
- * grid per verse line: its number, then each column's parts stacked, the
179
- * first in the normal tone and the rest muted, every part in the serif unless
180
- * its face sets it. A narrow journal stacks the columns of each line. */
181
186
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
182
- .verse.verse-numbered {
183
- position: relative;
184
- padding-inline-start: 3em;
187
+ .verse
188
+ .verse-line.i5 {
189
+ --verse-indent: 6.25em;
185
190
  }
186
-
187
191
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
188
192
  .verse
189
- .verse-number {
190
- color: color-mix(in srgb, currentColor 60%, transparent);
191
- font-size: 0.8em;
193
+ .verse-line.i6 {
194
+ --verse-indent: 7.5em;
192
195
  }
193
-
194
196
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
195
- .verse-numbered
196
- .verse-line
197
- .verse-number {
198
- position: absolute;
199
- inset-inline-start: 0;
200
- width: 2.2em;
201
- text-align: end;
197
+ .verse
198
+ .verse-line.i7 {
199
+ --verse-indent: 8.75em;
202
200
  }
203
-
204
201
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
205
- .verse.verse-columns {
206
- container-type: inline-size;
202
+ .verse
203
+ .verse-line.i8 {
204
+ --verse-indent: 10em;
207
205
  }
208
-
209
206
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
210
- .verse-numbered.verse-columns {
211
- padding-inline-start: 0;
207
+ .verse
208
+ .verse-canto-break {
209
+ display: block;
210
+ height: 0.5em;
212
211
  }
213
-
214
212
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
215
- .verse-columns
213
+ .verse-paired
216
214
  .verse-row {
217
215
  display: grid;
218
- grid-auto-flow: column;
219
- grid-auto-columns: 1fr;
220
216
  direction: ltr;
221
- grid-template-columns: repeat(var(--verse-columns, 2), minmax(0, 1fr));
217
+ grid-template-columns: repeat(2, minmax(0, 1fr));
222
218
  column-gap: 1.5rem;
223
- margin-bottom: 0.5em;
224
- }
225
-
226
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
227
- .verse-numbered.verse-columns
228
- .verse-row {
229
- grid-template-columns: 2.5em repeat(var(--verse-columns, 2), minmax(0, 1fr));
230
- }
231
-
232
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
233
- .verse-columns
234
- .verse-number {
235
- text-align: end;
236
- padding-top: 0.2em;
219
+ align-items: start;
237
220
  }
238
-
239
221
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
240
- .verse-columns
241
- :is(.verse-column, .verse-part) {
242
- display: block;
222
+ .verse-paired
223
+ :is(.verse-native, .verse-roman) {
224
+ min-width: 0;
243
225
  white-space: pre-wrap;
244
226
  }
245
-
246
227
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
247
- .verse-columns
248
- .verse-part {
228
+ .verse-paired
229
+ .verse-roman {
249
230
  font-family: serif;
250
- padding-inline-start: var(--verse-indent, 0em);
251
- }
252
-
253
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
254
- .verse-columns
255
- .verse-secondary {
256
- color: color-mix(in srgb, currentColor 60%, transparent);
257
- }
258
-
259
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
260
- .verse-columns
261
- .verse-secondary
262
- * {
263
- color: inherit;
264
- }
265
-
266
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
267
- .verse-columns
268
- .verse-part[dir="rtl"] {
269
- text-align: start;
270
231
  }
271
-
272
232
  @container (max-width: 32rem) {
273
233
  :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
274
- .verse-columns
234
+ .verse-paired
275
235
  .verse-row {
276
- grid-auto-flow: row;
277
236
  grid-template-columns: 1fr;
278
237
  }
279
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
280
- .verse-numbered.verse-columns
281
- .verse-row {
282
- grid-template-columns: 2.5em 1fr;
283
- }
284
- :is(.journal-entry-page, .journal-entry-content, .editor-content, .prosemirror)
285
- .verse-numbered.verse-columns
286
- .verse-column {
287
- grid-column: 2;
288
- }
289
238
  }
290
239
 
291
240
  /* Text set in one of the faces. The font family and features come from the
@@ -409,65 +409,47 @@ Foundry renders a secret section; the website renders an expandable spoiler, and
409
409
 
410
410
  ### Verse
411
411
 
412
- Use a code fence with the language `verse` to preserve verse lines and stanzas.
413
- Each nonblank source line is one verse line. A blank line separates verse units;
414
- `***` on a line by itself separates stanzas. Neither separator is numbered.
415
- The fence itself adds no title, caption or number.
416
-
417
- Leading periods set indentation: one `.` per level. They are removed
418
- from the displayed line. Leading spaces are ignored and do not set indentation.
419
- Periods inside the first inline span also set indentation when that span begins
420
- the line; periods in later spans are literal text. Interior spaces between text
421
- and spans are preserved. Tabs anywhere in the poem are an error. Each medium
422
- sets the actual width of an indent level, with every higher level wider than the
423
- preceding one.
424
-
425
- Levels 1 through 8 use the `i1`–`i8` indent classes. Deeper levels retain
426
- their full depth in the generated indent width.
427
-
428
- For example, `.A line` is indented one level, while ` ..A line` is indented
429
- two levels: the spaces do not count. Verse is upright by default. English text
430
- can use Markdown emphasis; emphasis inside a span whose effective language is
431
- not English is an error. See [emphasis in a script](#emphasis-in-a-script).
432
-
433
- A verse line can mix plain English, language-marked spans and more English on
434
- one authored line. Spaces are kept exactly as written between those runs; the
435
- spans add no spaces of their own. A period at the start of the first span also
436
- sets that line's indentation:
412
+ A `verse` fence sets a version of a work, whether poetry or prose. `/` ends a
413
+ logical line. Source newlines otherwise join with whitespace, so prose can wrap
414
+ across source lines. A blank line or `//` ends a stanza (a paragraph); a line
415
+ containing only `***` ends a canto (a section). The last line before either
416
+ boundary needs no `/`. A literal slash in text is written `\/`; slashes inside
417
+ Markdown syntax, such as a link destination, remain syntax.
418
+
419
+ Leading periods at the beginning of a logical line set indentation, one `.` per
420
+ level, and are removed from the display. They may follow `/` on the same source
421
+ line. Leading spaces do not set indentation. A period beginning a continuation
422
+ source line is literal text when the preceding text has no logical line ending.
423
+ Periods inside the first inline span can set indentation; periods in later spans
424
+ are literal. Tabs inside a verse fence are errors.
425
+
426
+ These two bodies have the same lines and indentation:
437
427
 
438
428
  ````markdown
439
429
  ```verse {lang=en}
440
- ..The [boundary]{lang=en} is [thiruthriman]{lang=vyl} again.
441
- [.The boundary]{lang=en} is [thiruthriman]{lang=vyl} again.
430
+ To be or not to be,/
431
+ ..that is the question!
442
432
  ```
443
- ````
444
-
445
- Both lines have one verse number apiece when numbering is enabled. In the
446
- second, the leading period inside the first span is removed and indents the
447
- whole line.
448
-
449
- ````markdown
450
- ```verse {form=ballad lang=en}
451
- The lantern burns beside the gate,
452
- The harbor sleeps below.
453
-
454
- ***
455
433
 
456
- The keeper guards the road till dawn,
457
- And keeps a light aglow.
434
+ ```verse {lang=en}
435
+ To be or not to be,/..that is the question!
458
436
  ```
459
437
  ````
460
438
 
461
- The optional `form` attribute records the author's intent; the build does not
462
- infer stress, rhyme or pronunciation. `numstep` numbers the logical rows, and `cols`
463
- sets the poem's column count; see below. `lang` names the poem's language,
464
- `font` the font it is set in and `map` the mapping its text is rewritten by; see
465
- [marking language, font and encoding](#marking-language-font-and-encoding). An optional `#id`
466
- addresses the poem itself. There are no `title` or `lines` attributes, and no
467
- special punctuation for stress, pauses or refrains. A poem's metre, rhyme or
468
- syllable pattern is described in the note's prose. `scan` names a metre the
469
- package declares, and the build counts the poem's beats against it, as the next
470
- section describes.
439
+ Verse is upright by default. English text accepts Markdown emphasis; other
440
+ languages use their declared [script emphasis](#emphasis-in-a-script). Inline
441
+ links, names, language spans and footnotes keep their ordinary meanings.
442
+ The optional `form=` records the author's literary form, `lang=` identifies the
443
+ language, and `font=` selects a face. `enc=` selects an encoding document. An
444
+ optional `#id` addresses the fence. `scan=` checks a declared metre.
445
+
446
+ A concrete `enc=` draws the original in its script on the left and the same text
447
+ in Roman on the right. Write the original once, with no column prefixes. Each
448
+ logical line aligns with its counterpart at full weight; indentation and breaks
449
+ match. `⟦…⟧` codage draws glyphs on the left and remains codage on the right.
450
+ Names, nested language choices and `lang=zxx` gaps retain their scope. A fence
451
+ with no `enc=`, or with `enc=default`, has one Roman column. The content index's
452
+ `runs` relation records the authored original once, in its language and encoding.
471
453
 
472
454
  #### Metre
473
455
 
@@ -530,8 +512,7 @@ Beats are counted this way:
530
512
  - The caesura is not written.
531
513
 
532
514
  `scan=` is refused where it cannot mean anything: a name no `data.metres`
533
- declares, a fence with no `lang=`, a language without a stress rule, and a verse
534
- in columns. A fence with no `scan=` is not counted. Readers see nothing of the
515
+ declares, a fence with no `lang=`, a language without a stress rule. A fence with no `scan=` is not counted. Readers see nothing of the
535
516
  count; the fence carries `data-scan` with the metre's name.
536
517
 
537
518
  To number and caption a poem, put a leading numbered caption before the verse fence:
@@ -540,81 +521,105 @@ To number and caption a poem, put a leading numbered caption before the verse fe
540
521
  :@ A song sung by the harbor watch. {#watch-song}
541
522
 
542
523
  ```verse {form=ballad}
543
- The watch has gone to sea,
524
+ The watch has gone to sea,/
544
525
  The lantern marks the shore.
545
526
  ```
546
527
  ````
547
528
 
548
529
  This uses the **Poem** counter, so `{{ref "#watch-song"}}` reads **Poem 1**. Use `:` for a caption without a number.
549
530
 
550
- #### Line numbers
531
+ #### Versions and stanza labels
551
532
 
552
- `numstep=N` numbers the poem's lines, counting every verse line from the first
553
- to the last across stanzas. `numstep=1` numbers every line, `numstep=5` every
554
- fifth line, and `numstep=0`, the default, numbers none. The numbers sit in a
555
- margin beside the lines, in a muted tone.
533
+ `work=<key>` names a work within the page. Every fence with that key is a version
534
+ of the same work. Each stanza opens with its automatically counted label: `1`,
535
+ `2`, and so on for a work with no canto break, or `1:1`, `1:2`, `2:1`, and so on
536
+ when the fence contains cantos. Stanza numbering starts at one in each canto.
537
+ The website, Foundry journals and book show the same labels. A paired original
538
+ has one label shared by both presentations. A fence without `work=` has no label.
539
+
540
+ Versions must have the same number of cantos and the same number of stanzas in
541
+ each canto. Their line counts can differ. A work with only one version is a
542
+ finding. Shape disagreements are findings at the opening lines of the versions,
543
+ naming the canto and the counts. A `***` at the edge of a fence, or beside another
544
+ canto break with no intervening stanza, is a finding at the break itself.
545
+
546
+ This poem's English version and Sinale original share stanza `1`. The original
547
+ is authored once and displays as script beside Roman:
556
548
 
557
549
  ````markdown
558
- ```verse {numstep=5 lang=en}
559
- The lantern burns beside the gate,
560
- …
550
+ ```verse {form=lay work=asking lang=en}
551
+ A child comes up the hill at night/
552
+ .and leaves a loaf beneath the birch./
553
+ .She does not wait. She does not search/
554
+ the dark for us. We stand in sight.
561
555
  ```
562
- ````
563
556
 
564
- #### Verse in columns
557
+ ```verse {form=lay work=asking lang=sina enc=sinaveldikkoenc}
558
+ irtal nysse auldiho nalduho/
559
+ .penvai onsa tarnevinu halpi polpeho/
560
+ .ahi sennevi onsa ahi syltete onsa/
561
+ ehii nalduho setty ehii nelkis yinserseho
562
+ ```
563
+ ````
565
564
 
566
- `cols=N` sets a positive whole number of columns and defaults to `1`. A
567
- single-column poem keeps its physical lines without column prefixes. For
568
- `cols` above one, every content line starts with its column number and one
569
- or more spaces. The prefix selects its cell and is not displayed.
565
+ Prose uses the same fence and omits line-ending marks. Source lines join into
566
+ paragraphs. Both versions below have stanzas `1` and `2`; the original's paragraphs
567
+ also appear beside their Roman text:
570
568
 
571
- A blank line ends a **logical verse row**. Within that row, numbers must be
572
- in `1..cols` and nondecreasing: finish one column before starting a higher
573
- one. Any column may be omitted; its empty cell remains in the grid. A column
574
- may hold any number of readings. Its first line uses the foreground color,
575
- and every subsequent line in that same column is grey. Each column starts
576
- its own foreground line, and the choice resets in the next row.
569
+ ````markdown
570
+ ```verse {work=walking lang=en}
571
+ He walks the oath road.
577
572
 
578
- This sparse three-column poem leaves the middle cell empty in its first row:
573
+ I walk the oath road.
574
+ ```
579
575
 
580
- ````markdown
581
- ```verse {form=epic lang=en numstep=5 cols=3}
582
- 1 [Thiruthriman sorimamen,]{lang=vyl}
583
- 3 [The hallowed boundary I sing,]{lang=en}
584
- 3 [Thiruthriman sorimamen,]{lang=vyl}
576
+ ```verse {work=walking lang=vyl enc=vylsemaronenc}
577
+ Lokazor lonak zaron.
585
578
 
586
- 1 [ul alathas kedis alatha valmazor, ul talothoi]{lang=vyl}
587
- 2 [Nothing to say]{lang=en}
588
- 3 [and the one who walked it, and the stones]{lang=en}
589
- 3 [ul alathas kedis alatha valmazor, ul talothoi]{lang=vyl}
579
+ Lokamen lonak zaron.
590
580
  ```
591
581
  ````
592
582
 
593
- The left cell uses Vylari's configured native script. The third cell contains
594
- an English reading in foreground and a separately authored Roman Vylari
595
- reading in grey. Language labels identify words; column numbers alone place
596
- them. `lang=`, `font=` and `enc=` are written on the actual
597
- runs, so a Roman repeat makes its own presentation choice. Inline links and
598
- mixed-language spans stay in their authored order with their spaces intact.
583
+ See [work shape diagnostics](../diagnostics.md#a-worked-case-versions-of-a-work)
584
+ for how findings locate a disagreement.
599
585
 
600
- `numstep=N` counts logical rows, not their individual readings. A standalone
601
- `***` separates stanzas, and column order resets after it as after a blank
602
- line. Leading periods after the number and its separating spaces set a
603
- reading's indent. Periods at the start of its first span also count; periods
604
- inside later spans remain text. For example:
586
+ #### Directions and speakers
605
587
 
606
- ```markdown
607
- 1 [.Thiruthriman [the boundary]{lang=en} sorimamen]{lang=vyl}
608
- 3 [The hallowed boundary I sing,]{lang=en}
588
+ A `.direction` span identifies an instruction or stage direction; `.speaker`
589
+ identifies the person speaking. Either can fill a logical line or sit within it.
590
+ Each version writes its own directions and speaker names in its own language.
591
+ Write ordinary case; these classes do not rewrite the text. The classes are
592
+ valid outside verse as well.
593
+
594
+ ````markdown
595
+ ```verse {form=rite work=weighing lang=en}
596
+ Let the household enter. Let the creditor enter./
597
+ [The reader names the year of the reign, the season, the day, and the dead.]{.direction}/
598
+ One person of this household goes down to the West.
609
599
  ```
610
600
 
611
- Every target aligns a logical row's cells at the top, including empty ones.
612
- On a narrow screen or journal, cells stack in their numbered order. A reading
613
- in a right-to-left face stays in its chosen cell and runs right to left
614
- within it. The book uses the same row and cell order.
601
+ ```verse {form=rite work=weighing lang=khel enc=khelqalezuenc}
602
+ galun garqen. galun zeqatar./
603
+ [zethul nemar …]{.direction}/
604
+ yarul genar lazen elu garqen nizar ez ithnar.
605
+ ```
606
+
607
+ ```verse {form=roll work=thresholds lang=en}
608
+ [The Captain]{.speaker}/
609
+ Is the stone here?
610
+ ```
611
+
612
+ ```verse {form=roll work=thresholds lang=tarv enc=tarvsemaronenc}
613
+ [thrumar]{.speaker}/
614
+ eza goitsa ared ir denon sedon.
615
+ ```
616
+ ````
615
617
 
616
- Findings point to the authored `cols` value, column prefix or inline run;
617
- see [a verse in columns](../diagnostics.md#a-worked-case-a-verse-in-columns).
618
+ Their text is encoded normally. The classes themselves are presentation hooks;
619
+ they add no emphasis, encoding controls or stanza boundaries. A direction alone
620
+ between blank lines is a stanza like any other. HTML preserves `direction` and
621
+ `speaker` classes. Typst preserves those classes through `book-span` and provides
622
+ plain `book-direction` and `book-speaker` hooks. The default appearance is plain.
618
623
 
619
624
  ### Scrolls
620
625
 
@@ -727,10 +732,10 @@ Use the guillemet pairs instead of English double quotation marks or `<<` and
727
732
 
728
733
  Whitespace is every Unicode space-separator (`Zs`) and U+0009 through U+000D.
729
734
  A contiguous run of that whitespace is one word separator, written as the
730
- chosen encoding specifies. A newline in prose is whitespace. In verse, line
731
- endings and blank lines supply line and stanza boundaries; a line of only
732
- `--- {.canto}` supplies a canto boundary. Visual verse indentation stays
733
- layout, outside the encoded letters. Do not type `/` inside a verse fence.
735
+ chosen encoding specifies. A source newline joins as whitespace. In verse,
736
+ `/` ends a logical line, blank lines or `//` end stanzas, and standalone `***`
737
+ ends a canto. Visual indentation at a logical line boundary stays layout,
738
+ outside the encoded letters. Write `\/` for a literal slash.
734
739
 
735
740
  Native characters in a language run are written through literal codage:
736
741
  `⟦U+F0230⟧`, or a name the encoding defines between `⟦` and `⟧`. Directly
@@ -1314,7 +1319,7 @@ const lantern = "lit"; // the harbor light
1314
1319
  ```
1315
1320
  ````
1316
1321
 
1317
- A fence named `sql`, `pagelist` or `verse` is not a listing: a query is replaced by its table, and verse is set as a poem.
1322
+ A fence named `sql`, `pagelist` or `verse` is not a listing: a query is replaced by its table, and verse is set as a work.
1318
1323
 
1319
1324
  ## SQL generated tables
1320
1325
 
@@ -29,7 +29,24 @@ A nonempty note body creates one system-agnostic Foundry JournalEntry. Content b
29
29
 
30
30
  Leading `:` captions describe the next supported block; `:@` captions also number it. The optional type accepts `figure`, `table`, `verse`, `code`, `prose`, and `example`. Captions support identifiers, classes and named attributes; unsupported following blocks are errors. See [captions and numbered references](authoring/links-and-markup.md#captions-and-numbered-references).
31
31
 
32
- A code fence with language `verse` keeps verse lines, stanza breaks and relative indentation. Leading periods set indent levels and are removed from the text; leading spaces do not count. Blank lines separate verse units and `***` separates stanzas. Its numbered caption uses the **Poem** label. Generic `:::` divs and `[inline spans]{.class}` accept attributes. See [verse](authoring/links-and-markup.md#verse), [fenced divs](authoring/links-and-markup.md#fenced-divs) and [inline spans](authoring/links-and-markup.md#inline-spans). `numstep=N` numbers every Nth line. `cols=N` sets a positive whole number of columns and defaults to one. With `cols` above one, each content line starts with an integer and one or more spaces; numbers lie in `1..cols` and are nondecreasing within each blank-separated logical row. Any column may be omitted and keeps an empty cell. A column may repeat without limit: its first reading is foreground and its later readings are grey, independently for every column and row. Number prefixes are not displayed; `numstep` counts logical rows. `***` separates stanzas. Inline language and native presentation are explicit on each authored run. See [verse in columns](authoring/links-and-markup.md#verse-in-columns).
32
+ A `verse` fence sets poetry or prose. `/` ends a logical line; source newlines
33
+ otherwise join. Blank lines or `//` end stanzas, and standalone `***` ends a canto.
34
+ Leading periods indent a logical line, including after `/` within a source line;
35
+ a period on a joined continuation line is text. `\/` writes a literal slash.
36
+ A concrete `enc=` sets the original once in two presentations, script on the left
37
+ and Roman on the right, aligned by logical line at full weight. No `enc=`, or
38
+ `enc=default`, produces one Roman column. Inline names, codage, language gaps and
39
+ footnotes retain their meaning. `work=<key>` groups versions within the page,
40
+ labels each stanza with its number (or canto:stanza), and requires matching canto
41
+ and per-canto stanza counts; line counts may differ. Singleton work keys and
42
+ shape disagreements are findings. A canto separator with no stanza on either
43
+ side is a finding at that separator. `.direction` and `.speaker` spans identify
44
+ instructions and speakers inside or outside verse, retain plain presentation
45
+ hooks in HTML and Typst, and change neither encoding nor shape. See
46
+ [verse and worked examples](authoring/links-and-markup.md#verse). Its numbered
47
+ caption uses the **Poem** label. Generic `:::` divs and `[inline spans]{.class}`
48
+ accept attributes; see [fenced divs](authoring/links-and-markup.md#fenced-divs)
49
+ and [inline spans](authoring/links-and-markup.md#inline-spans).
33
50
 
34
51
  A code fence with language `scroll` sets text in a script whose script note states `direction: vertical-rl` as columns, top to bottom, read from the right. The lines of a paragraph are joined, and each paragraph starts a fresh column. `rows=N` is the characters in a column and `cols=M` the columns in a panel, each a whole number above zero; `lang=`, `font=` and `enc=` mark the text as on a verse fence, an explicit `enc=` selects an encoding document and its language and font. The site, the preview and Foundry set it with `writing-mode: vertical-rl` in a panel that scrolls sideways from the right; the book draws its panels as images from the face's outlines, each with its roman text as alt text. A scroll fence in a script written in lines is an error. See [scrolls](authoring/links-and-markup.md#scrolls).
35
52
 
@@ -41,7 +58,7 @@ then its mappings. Unknown characters, undefined glyph codes and conflicting
41
58
  selections are located errors. `⟦…⟧` reads the selected font's glyph codes or
42
59
  strict Unicode scalars. See [encodings](reference/format-details.md#encodings).
43
60
  Language word-book validation applies to both Roman and native runs. Parallel
44
- verse retains independent authored readings and their column numbers.
61
+ verse keeps one authored original with its language and selected encoding.
45
62
 
46
63
  Mark a name without a note as `[Name]{.name data-type="being"}`; the optional
47
64
  classification uses the declared note vocabulary. The [name-marking