@heroiclands/package-build 25.2.0 → 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 +18 -0
- package/assets/styles/content-base.css +65 -116
- package/docs/authoring/links-and-markup.md +114 -109
- package/docs/content-format.md +20 -3
- package/docs/diagnostics.md +25 -26
- package/docs/guides/writing-in-invented-scripts.md +41 -62
- package/docs/reference/format-details.md +0 -1
- package/docs/reference/theme-pages.md +30 -57
- package/docs/source-preview.md +2 -1
- package/engine/content-blocks.mjs +3 -2
- package/engine/content-render.mjs +31 -29
- package/engine/content-scripts.mjs +180 -86
- package/engine/content-spans.mjs +4 -6
- package/engine/content-verse.mjs +482 -281
- package/engine/journals.mjs +14 -14
- package/engine/pdf-render.mjs +65 -117
- package/engine/preview-source.mjs +15 -8
- package/engine/roman-verse.mjs +68 -57
- package/engine/verse-metre.mjs +33 -40
- package/package.json +1 -1
- package/site-theme/static/css/style.css +49 -101
- package/types/engine/content-blocks.d.mts +3 -1
- package/types/engine/content-scripts.d.mts +9 -5
- package/types/engine/content-verse.d.mts +269 -83
- package/types/engine/journals.d.mts +3 -3
- package/types/engine/roman-verse.d.mts +7 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
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
|
+
|
|
14
|
+
## 25.2.1
|
|
15
|
+
|
|
16
|
+
**Rendering and sites**
|
|
17
|
+
|
|
18
|
+
- Preview tables display linked names cleanly and keep their following columns aligned.
|
|
19
|
+
- Foundry journal page names show the readable text of headings containing names, links or emphasis.
|
|
20
|
+
|
|
3
21
|
## 25.2.0
|
|
4
22
|
|
|
5
23
|
**Content and notes**
|
|
@@ -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
|
-
|
|
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
|
-
|
|
134
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
183
|
-
|
|
184
|
-
|
|
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-
|
|
190
|
-
|
|
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
|
|
196
|
-
.verse-line
|
|
197
|
-
|
|
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
|
|
206
|
-
|
|
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
|
|
211
|
-
|
|
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-
|
|
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(
|
|
217
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
222
218
|
column-gap: 1.5rem;
|
|
223
|
-
|
|
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-
|
|
241
|
-
:is(.verse-
|
|
242
|
-
|
|
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-
|
|
248
|
-
.verse-
|
|
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-
|
|
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
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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
|
-
|
|
441
|
-
|
|
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
|
-
|
|
457
|
-
|
|
434
|
+
```verse {lang=en}
|
|
435
|
+
To be or not to be,/..that is the question!
|
|
458
436
|
```
|
|
459
437
|
````
|
|
460
438
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
addresses the
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
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
|
|
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
|
-
####
|
|
531
|
+
#### Versions and stanza labels
|
|
551
532
|
|
|
552
|
-
`
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
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 {
|
|
559
|
-
|
|
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
|
-
|
|
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
|
-
|
|
567
|
-
|
|
568
|
-
|
|
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
|
-
|
|
572
|
-
|
|
573
|
-
|
|
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
|
-
|
|
573
|
+
I walk the oath road.
|
|
574
|
+
```
|
|
579
575
|
|
|
580
|
-
|
|
581
|
-
|
|
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
|
-
|
|
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
|
-
|
|
594
|
-
|
|
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
|
-
|
|
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
|
-
|
|
607
|
-
|
|
608
|
-
|
|
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
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
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
|
-
|
|
617
|
-
|
|
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
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
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
|
|
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
|
|
package/docs/content-format.md
CHANGED
|
@@ -25,11 +25,28 @@ Start with [your first note](authoring/first-note.md). It explains the smallest
|
|
|
25
25
|
|
|
26
26
|
## The shared note
|
|
27
27
|
|
|
28
|
-
A nonempty note body creates one system-agnostic Foundry JournalEntry. Content before the first H1 becomes an introduction page; every H1 starts another JournalEntryPage. A lower-level heading with an explicit `{#anchor}` starts a page too, so a link can address it. The same prose becomes a web page and can be selected for a book. The content index records the note and its frontmatter for queries and navigation.
|
|
28
|
+
A nonempty note body creates one system-agnostic Foundry JournalEntry. Content before the first H1 becomes an introduction page; every H1 starts another JournalEntryPage. A lower-level heading with an explicit `{#anchor}` starts a page too, so a link can address it. Each page name is its heading's visible text: spans, links and emphasis contribute their text without their markup. The same prose becomes a web page and can be selected for a book. The content index records the note and its frontmatter for queries and navigation.
|
|
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
|
|
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
|
|
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
|