summaryrefslogtreecommitdiffhomepage
path: root/dlang/src/write
diff options
context:
space:
mode:
authorRalph Amissah <ralph.amissah@gmail.com>2026-09-29 17:56:11 -0400
committerRalph Amissah <ralph.amissah@gmail.com>2026-09-29 17:56:11 -0400
commitcc0b844be3822ac45603a095ceee77dc0f231288 (patch)
tree43ff1a1ad062ae791412f0f792f925da06d2adae /dlang/src/write
parentformat 2.0: sample writers over the abstraction, in D and in Gleam (diff)
format 2.1: the poem, and a note mark of a symbol and a number
From format 2.1 a poem comes before its verses, carries object number 0 and states the range of its verses, where it came after them sharing the last verse's number. The text writer's rule, an object with no text writes nothing, covers both forms and is unchanged; its comment, in both languages, and the README now describe the poem as it is. Spine now writes the markup's editor's notes, ~[* ]~ and ~[+ ]~, as their own numbered series, marked *1, *2 ... and +1, +2 ..., in the form the special notes already had. The note patterns took symbols alone, so in every writer, both languages, these went through as text. They now take [*+]+[0-9]* where they took symbols. Over the markup document samples written by spine at 2.1: D == Gleam byte for byte in all five formats; the same .typ from .ssp and .ocda.db; spine's .typ body == this writer's; epubcheck clean; every html link resolves. Against the same writers over 2.0 artefacts, two things move, both the abstraction's doing: the_public_domain's html and epub gain note 84, which 2.0 never gathered; and seven epubs lose an empty body.xhtml page listed in the navigation, which was where the 2.0 poems went for want of a segment. The repository is sisudoc-ocda-writer, in the singular: named for its role, as its siblings are. It holds one writer, ocda-write, in each language, taking the format as an option. flake.lock, in dlang/ and gleam/, now pins the library at its model 2.1 commit. (assisted by Claude-Code)
Diffstat (limited to 'dlang/src/write')
-rw-r--r--dlang/src/write/epub.d2
-rw-r--r--dlang/src/write/rgx.d2
-rw-r--r--dlang/src/write/text.d8
3 files changed, 7 insertions, 5 deletions
diff --git a/dlang/src/write/epub.d b/dlang/src/write/epub.d
index 3765267..0f3131c 100644
--- a/dlang/src/write/epub.d
+++ b/dlang/src/write/epub.d
@@ -38,7 +38,7 @@ import write.html;
import write.zip;
/+ ↓ a note's mark, a number or a run of stars or pluses +/
-private static note_mark = ctRegex!(`【(?P<num>\d+|(?:[*]|[+])+)\s`, "mg");
+private static note_mark = ctRegex!(`【(?P<num>\d+|[*+]+[0-9]*)\s`, "mg");
/+ ↓ an anchor the markup placed in the text +/
private static inline_anchor = ctRegex!(`┃(?P<anchor>\S+?)┃`, "mg");
diff --git a/dlang/src/write/rgx.d b/dlang/src/write/rgx.d
index 23c848d..f32df85 100644
--- a/dlang/src/write/rgx.d
+++ b/dlang/src/write/rgx.d
@@ -44,7 +44,7 @@ static struct Rgx {
static inline_notes_al_regular_number_note = ctRegex!(`【(?P<num>\d+)\s+(?P<note>.+?)\s*】`, "mg");
/+ ↓ and the same for a note marked with a run of stars or pluses
instead of a number, which the markup also allows +/
- static inline_notes_al_all_note = ctRegex!(`【(?P<num>\d+|(?:[*]|[+])+)\s+(?P<note>.+?)\s*】`, "mg");
+ static inline_notes_al_all_note = ctRegex!(`【(?P<num>\d+|[*+]+[0-9]*)\s+(?P<note>.+?)\s*】`, "mg");
/+ ↓ tables: the object's text is rows and columns in one string +/
static table_delimiter_row = ctRegex!("[ ]*\n", "mg");
diff --git a/dlang/src/write/text.d b/dlang/src/write/text.d
index 9853a7e..0ce53f8 100644
--- a/dlang/src/write/text.d
+++ b/dlang/src/write/text.d
@@ -128,9 +128,11 @@ string[] textSections(ref OcdaDocument doc) {
+/
private string objectOut(ref const OcdaObject obj) {
/+ ↓ an object with no text of its own writes nothing. A poem is such an
- object: it is a container that closes a run of verses and carries the
- *same* object number as the last of them, so writing it would put that
- number in the file twice - 15 times over in one sample. +/
+ object: a container of the verses that follow it, which are what is
+ written. Since format 2.1 it carries object number 0 and states the
+ range of its verses; before, it closed the run carrying the *same*
+ number as the last verse, and writing it put that number in the file
+ twice - 15 times over in one sample. Both forms write nothing. +/
if (obj.text.strip.length == 0) { return ""; }
/+ ↓ and a dummy heading writes nothing: it is generated furniture whose
text repeats the heading above it, and every other writer here drops