aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRalph Amissah <ralph.amissah@gmail.com>2026-09-30 16:18:59 -0400
committerRalph Amissah <ralph.amissah@gmail.com>2026-09-30 23:14:23 -0400
commit993a3f655359f98dc26d3d3222e07792e2ccddf7 (patch)
tree1633a8183b2affec4a2951c8357ab89e9073bd25
parentsearch database: show all included notes (diff)
abstraction 2.1: a poem states its object range
- A poem is a container of verse, and stores its range of verse ocn, - its verse are the citable units with ocn. - A note in the last verse of a poem previously was not gathered into the endnotes section, this now is fixed Format 2.0 -> 2.1: the property is an addition, the poem is not a citable object (but contans a range of objects), its verse are (individual citable objects), and every reader checks the major version. A 2.0 database reads as having no ranges. (assisted by Claude-Code)
-rw-r--r--org/in_abstraction_artefacts.org25
-rw-r--r--org/ocda.org59
-rw-r--r--org/ocda_functions.org14
-rw-r--r--org/ocda_obj_setter.org6
-rw-r--r--org/out_ocda_peg_ssp.org15
-rw-r--r--org/out_ocda_sqlite_db.org8
-rw-r--r--org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org2
-rw-r--r--src/sisudoc/ocda/abstraction/db_in.d5
-rw-r--r--src/sisudoc/ocda/abstraction/doc_has.d12
-rw-r--r--src/sisudoc/ocda/abstraction/ssp.d17
-rw-r--r--src/sisudoc/ocda/abstraction/ssp_in.d10
-rw-r--r--src/sisudoc/ocda/meta/metadoc_from_src.d50
-rw-r--r--src/sisudoc/ocda/meta/metadoc_from_src_functions.d12
-rw-r--r--src/sisudoc/ocda/meta/metadoc_object_setter.d6
-rw-r--r--src/sisudoc/ocda/meta/ocn_align.d9
-rw-r--r--src/sisudoc/outputs/io_out/sqlite_ocda_db.d8
-rw-r--r--test/reference/abstraction/accelerando.charles_stross.en.ssp2
-rw-r--r--test/reference/abstraction/alices_adventures_in_wonderland.lewis_carroll.en.ssp303
-rw-r--r--test/reference/abstraction/content.cory_doctorow.en.ssp2
-rw-r--r--test/reference/abstraction/democratizing_innovation.eric_von_hippel.en.ssp2
-rw-r--r--test/reference/abstraction/down_and_out_in_the_magic_kingdom.cory_doctorow.en.ssp2
-rw-r--r--test/reference/abstraction/for_the_win.cory_doctorow.en.ssp2
-rw-r--r--test/reference/abstraction/free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.en.ssp44
-rw-r--r--test/reference/abstraction/free_culture.lawrence_lessig.en.ssp2
-rw-r--r--test/reference/abstraction/free_for_all.peter_wayner.en.ssp2
-rw-r--r--test/reference/abstraction/gpl2.fsf.en.ssp2
-rw-r--r--test/reference/abstraction/gpl3.fsf.en.ssp2
-rw-r--r--test/reference/abstraction/gullivers_travels.jonathan_swift.en.ssp2
-rw-r--r--test/reference/abstraction/little_brother.cory_doctorow.en.ssp2
-rw-r--r--test/reference/abstraction/live-manual.ca.ssp2
-rw-r--r--test/reference/abstraction/live-manual.de.ssp2
-rw-r--r--test/reference/abstraction/live-manual.en.ssp2
-rw-r--r--test/reference/abstraction/live-manual.es.ssp2
-rw-r--r--test/reference/abstraction/live-manual.fr.ssp2
-rw-r--r--test/reference/abstraction/live-manual.it.ssp2
-rw-r--r--test/reference/abstraction/live-manual.ja.ssp2
-rw-r--r--test/reference/abstraction/live-manual.pl.ssp2
-rw-r--r--test/reference/abstraction/live-manual.pt_BR.ssp2
-rw-r--r--test/reference/abstraction/live-manual.ro.ssp2
-rw-r--r--test/reference/abstraction/not_without_help.austin_amissah.en.ssp2
-rw-r--r--test/reference/abstraction/on_the_net_and_information.ralph_amissah.en.ssp2
-rw-r--r--test/reference/abstraction/outputs_of_ai_systems_qualify_as_artwork.anna_linne.en.ssp2
-rw-r--r--test/reference/abstraction/revisiting_the_autonomous_contract.ralph_amissah.en.ssp2
-rw-r--r--test/reference/abstraction/sisu-manual~sisu_markup.en.ssp61
-rw-r--r--test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp2
-rw-r--r--test/reference/abstraction/the_cathedral_and_the_bazaar.eric_s_raymond.en.ssp2
-rw-r--r--test/reference/abstraction/the_public_domain.james_boyle.en.ssp97
-rw-r--r--test/reference/abstraction/the_wealth_of_networks.yochai_benkler.en.ssp28
-rw-r--r--test/reference/abstraction/through_the_looking_glass.lewis_carroll.en.ssp419
-rw-r--r--test/reference/abstraction/two_bits.christopher_kelty.en.ssp2
-rw-r--r--test/reference/abstraction/viral_spiral.david_bollier.en.ssp2
-rw-r--r--test/reference/abstraction/war_and_peace.leo_tolstoy.en.ssp23
52 files changed, 806 insertions, 485 deletions
diff --git a/org/in_abstraction_artefacts.org b/org/in_abstraction_artefacts.org
index bbbdbd9..5abe72d 100644
--- a/org/in_abstraction_artefacts.org
+++ b/org/in_abstraction_artefacts.org
@@ -388,6 +388,14 @@ template spineAbstractionRead() {
case "section": obj.metainfo.is_of_section = _val; break;
case "parent": obj.metainfo.parent_ocn = _val.to!int; break;
case "last_descendant": obj.metainfo.last_descendant_ocn = _val.to!int; break;
+ case "ocn_range": {
+ auto _r = _ints(_val);
+ if (_r.length == 2) {
+ obj.metainfo.ocn_range_first = _r[0];
+ obj.metainfo.ocn_range_last = _r[1];
+ }
+ break;
+ }
case "children": obj.metainfo.children_headings = _ints(_val); break;
case "ancestors":
obj.metainfo.markedup_ancestors = _eight(_val);
@@ -881,6 +889,11 @@ template spineAbstractionDbRead() {
obj.metainfo.parent_ocn = row[_col["parent_ocn"]].as!int;
obj.metainfo.parent_lev_markup = row[_col["parent_lev"]].as!int;
obj.metainfo.last_descendant_ocn = row[_col["last_descendant_ocn"]].as!int;
+ /+ ↓ 2.1: a 2.0 database has no such columns, and reads as no range +/
+ if ("ocn_range_first" in _col) {
+ obj.metainfo.ocn_range_first = row[_col["ocn_range_first"]].as!int;
+ obj.metainfo.ocn_range_last = row[_col["ocn_range_last"]].as!int;
+ }
obj.metainfo.children_headings = _jsonInts(row[_col["children"]].as!string);
obj.metainfo.markedup_ancestors = _jsonEight(row[_col["ancestors"]].as!string);
obj.metainfo.collapsed_ancestors = _jsonEight(row[_col["ancestors_collapsed"]].as!string);
@@ -1673,13 +1686,11 @@ template spineDocHasFromAbstraction() {
_tag_assoc[obj.metainfo.identifier]["seg_lv4"]
= obj.tags.html_segment_anchor_tag_is;
}
- /+ ↓ An object that is not written into any segment still carries an
- identifier, and can share it: a poem block and its verses have one
- ocn between them, the verses are written and the block itself is not.
- The block comes second, so an unguarded assignment replaced a good
- segment name with an empty one, and the link came out as
- ".xhtml#297". seg_lv4 above is guarded already, which is why this
- showed in the epub and not in the html.
+ /+ ↓ An object that is not written into a segment still carries an
+ identifier, and could share it: a poem block carried the ocn of
+ its last verse until spec:2.1, with an issue affecting epub output.
+ Since spec:2.1 the poem has no identifier; the guard stays, for any
+ object that is not in a segment.
+/
if (obj.tags.epub_segment_anchor_tag_is.length > 0) {
_tag_assoc[obj.metainfo.identifier]["seg_lv1to4"]
diff --git a/org/ocda.org b/org/ocda.org
index b84b3ef..a164226 100644
--- a/org/ocda.org
+++ b/org/ocda.org
@@ -238,6 +238,8 @@ string[string] object_number_poem = [
"start" : "",
"end" : ""
];
+/+ ↓ where the open poem's first verse will go, -1 when no poem is open +/
+long _poem_open_idx = -1;
string[] lv_ancestors_txt = [ "", "", "", "", "", "", "", "", ];
/+ ↓ dom structure state, per document (not shared, parallel safe) +/
int[] dom_structure_markedup_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0,];
@@ -530,6 +532,7 @@ _loopMarkupSrcByLineStruct loopMarkupSrcByLine(
object_reset(an_object);
processing.remove("verse");
object_number_poem["start"] = obj_cite_digits.object_number.to!string;
+ _poem_open_idx = the_document_body_section.length.to!long;
}
{
ST_txt_by_line_block_start _get = line.txt_by_line_block_start(pith, dochas, object_number_poem);
@@ -706,6 +709,46 @@ _loopMarkupSrcByLineStruct loopMarkupSrcByLine(
pith = _get.pith;
}
}
+ /+ ↓ poem closed: poem object has been appended after its last verse.
+ It is a container, not a citable unit - its verses are - so it
+ carries no ocn of its own and states the range of its verses
+ instead, and it goes to the head of them, so that a writer
+ meeting it knows what follows and where it ends, and can wrap the
+ verses in one pass. (an issue with a note in the last verse of a
+ poem has been addressed)
+ +/
+ if (_poem_open_idx >= 0
+ && the_document_body_section.length > _poem_open_idx + 1
+ && the_document_body_section[$-1].metainfo.is_a == "poem"
+ ) {
+ size_t _s = _poem_open_idx.to!size_t;
+ size_t _p = the_document_body_section.length - 1;
+ size_t _first = _s;
+ while (_first < _p && the_document_body_section[_first].metainfo.is_a != "verse") { ++_first; }
+ size_t _last = _p;
+ while (_last > _s && the_document_body_section[_last - 1].metainfo.is_a != "verse") { --_last; }
+ if (_first < _p && _last > _s) {
+ --_last;
+ if ((the_document_body_section[_last].text).match(rgx.inline_notes_al_all_note)) {
+ object_notes = note_section.gather_notes_for_endnote_section(
+ the_document_body_section,
+ tag_in_seg,
+ (_last).to!int,
+ );
+ }
+ auto _poem = the_document_body_section[_p];
+ _poem.metainfo.ocn_range_first = the_document_body_section[_first].metainfo.ocn;
+ _poem.metainfo.ocn_range_last = the_document_body_section[_last].metainfo.ocn;
+ _poem.tags.html_segment_anchor_tag_is = the_document_body_section[_first].tags.html_segment_anchor_tag_is;
+ _poem.tags.epub_segment_anchor_tag_is = the_document_body_section[_first].tags.epub_segment_anchor_tag_is;
+ the_document_body_section
+ = the_document_body_section[0 .. _s]
+ ~ _poem
+ ~ the_document_body_section[_s .. _p];
+ previous_length = the_document_body_section.length.to!int;
+ }
+ _poem_open_idx = -1;
+ }
} else {
// line.empty, post contents, empty variables:
assert(
@@ -1142,12 +1185,13 @@ if (the_document_body_section.length > 1) { // writeln("body");
= obj.tags.html_segment_anchor_tag_is;
}
/+ ↓ An object that is not written into any segment still carries an
- identifier, and can share it: a poem block and its verses have one
- ocn between them, the verses are written and the block itself is not.
+ identifier, and could share it: a poem block carried the ocn of its last
+ verse until 2.1, and the verses are written where the block is not.
The block comes second, so an unguarded assignment replaced a good
segment name with an empty one, and the link came out as
".xhtml#297". seg_lv4 above is guarded already, which is why this
- showed in the epub and not in the html.
+ showed in the epub and not in the html. Since 2.1 the poem has no
+ identifier; the guard stays, for any object that is not in a segment.
+/
if (!(obj.tags.epub_segment_anchor_tag_is.empty)) {
tag_assoc[(obj.metainfo.identifier)]["seg_lv1to4"]
@@ -1892,10 +1936,11 @@ template spineOcnAlign() {
foreach (obj; doc.abstraction[section]) {
int _ocn = obj.metainfo.ocn.to!int;
if (_ocn <= 0) { continue; }
- /+ ↓ first in document order wins. An ocn is not unique: a poem and
- its first verse share one, by design, so the same number names
- two objects and the first of them is the one both languages
- will have reached first.
+ /+ ↓ first in document order wins. Until format spec:2.1 a (verse) ocn
+ was not unique: a poem carried the ocn of its last verse, so the
+ same number named two objects. A poem now carries 0 and is passed
+ over above; the rule stays, and costs nothing, for an artefact
+ written before spec:2.1.
+/
if (_ocn !in _p.kinds) { _p.kinds[_ocn] = _kindOf(obj); }
_p.ocn_count += 1;
diff --git a/org/ocda_functions.org b/org/ocda_functions.org
index da8e5ee..badbccd 100644
--- a/org/ocda_functions.org
+++ b/org/ocda_functions.org
@@ -1334,11 +1334,13 @@ ST_flow_table_array_munge flow_table_array_munge()(
heading_ptr-1,
an_object["is"]
);
- comp_obj_poem_ocn = set_object_generic("body", "body", "block", "poem", "", obj_cite_digits.object_number);
- comp_obj_poem_ocn.metainfo.identifier = obj_cite_digits.identifier;
- comp_obj_poem_ocn.metainfo.object_number_off = obj_cite_digits.off;
- comp_obj_poem_ocn.metainfo.o_n_book_index = obj_cite_digits.bkidx;
- comp_obj_poem_ocn.metainfo.object_number_type = obj_cite_digits.type;
+ /+ ↓ the poem: a container of the verses just written, not a citable unit
+ on its own, it now states the range of its verses
+ (ocn_range_first/_last), (it previously carried the last verse's ocn
+ and identifier, one number occurring on two objects)
+ +/
+ comp_obj_poem_ocn = set_object_generic("body", "body", "block", "poem", "", 0);
+ comp_obj_poem_ocn.metainfo.identifier = "";
the_document_body_section ~= comp_obj_poem_ocn;
pith["block_is"] = eN.blk_is.poem;
pith["block_state"] = eN.blk_state.off;
@@ -2634,7 +2636,7 @@ static struct ObjInlineMarkupMunge {
/+ ↓ editor's notes: ~[* note ]~ and ~[+ note ]~, and a bare ~[ note ]~,
which joins the asterisk series as it did in sisu. Each series is
numbered through the document, apart from the author's notes:
- ,*1, *2 ... and +1, +2 ...
+ *1, *2 ... and +1, +2 ...
.
Placed after the author's notes rather than before, so that the reset
above, made once per document at its first note, has happened by the
diff --git a/org/ocda_obj_setter.org b/org/ocda_obj_setter.org
index cd90f36..7f37e76 100644
--- a/org/ocda_obj_setter.org
+++ b/org/ocda_obj_setter.org
@@ -133,6 +133,12 @@ struct DocObj_MetaInfo_ {
int parent_lev_markup = 0;
int parent_ocn = 0;
int last_descendant_ocn = 0;
+ /+ ↓ the objects a container holds, as the first and last of their ocns: a
+ poem is not itself a citable object, its verses are, and it is cited as
+ the range of citable objects, ocn ("173-180"). 0 where not a container.
+ +/
+ int ocn_range_first = 0;
+ int ocn_range_last = 0;
int[] children_headings;
SHA_256_Hashes_ sha256;
}
diff --git a/org/out_ocda_peg_ssp.org b/org/out_ocda_peg_ssp.org
index 9fda543..7e54845 100644
--- a/org/out_ocda_peg_ssp.org
+++ b/org/out_ocda_peg_ssp.org
@@ -41,6 +41,16 @@ module sisudoc.ocda.abstraction.ssp;
part when a property is added (a reader of the newer format still reads
the older one), the major part when one changes meaning or goes away.
+ 2.1 2026-09-29 .ocn_range, the first and last ocn of what a
+ container holds. A poem is a container of verses and
+ is cited as their range: it now opens its run of
+ verses rather than closing it, carries ocn 0 and no
+ identifier, and states the range. It used to carry
+ the last verse's ocn and identifier, so one number
+ named two objects. A 2.0 reader reads a 2.1 file:
+ the poem was never rendered and has no text, the
+ verses are unchanged, and the property is an
+ addition.
2.0 2026-09-18 source.digest changes meaning: it now covers every
markup file the document is made of, where it was the
sha256 of the master file alone. For a .sst that was
@@ -163,6 +173,11 @@ template sspObjectRecord() {
if (obj.metainfo.last_descendant_ocn != 0) {
output ~= ".last_descendant: " ~ obj.metainfo.last_descendant_ocn.to!string;
}
+ /+ ↓ a container: the first and last ocn of what it holds (2.1) +/
+ if (obj.metainfo.ocn_range_first != 0) {
+ output ~= ".ocn_range: " ~ obj.metainfo.ocn_range_first.to!string
+ ~ " " ~ obj.metainfo.ocn_range_last.to!string;
+ }
/+ ↓ child headings (from pre-computed map) +/
if (obj.metainfo.children_headings.length > 0) {
string[] ch;
diff --git a/org/out_ocda_sqlite_db.org b/org/out_ocda_sqlite_db.org
index e8c8490..5424ed8 100644
--- a/org/out_ocda_sqlite_db.org
+++ b/org/out_ocda_sqlite_db.org
@@ -164,6 +164,8 @@ template spineAbstractionDb() {
parent_ocn INTEGER DEFAULT 0,
parent_lev INTEGER DEFAULT 0,
last_descendant_ocn INTEGER DEFAULT 0,
+ ocn_range_first INTEGER DEFAULT 0,
+ ocn_range_last INTEGER DEFAULT 0,
children TEXT
CHECK(children IS NULL OR json_valid(children)),
ancestors TEXT
@@ -418,7 +420,7 @@ template spineAbstractionDb() {
"INSERT INTO objects ("
~ "doc_id, section, seq, ocn, is_a, is_of_part, is_of_section, is_of_type,"
~ "heading_level, heading_lev_collapsed, identifier,"
- ~ "parent_ocn, parent_lev, last_descendant_ocn,"
+ ~ "parent_ocn, parent_lev, last_descendant_ocn, ocn_range_first, ocn_range_last,"
~ "children, ancestors, ancestors_collapsed,"
~ "dom_status, dom_status_collapsed,"
~ "dummy_heading, object_number_off,"
@@ -433,7 +435,7 @@ template spineAbstractionDb() {
~ ") VALUES ("
~ ":doc_id, :section, :seq, :ocn, :is_a, :is_of_part, :is_of_section, :is_of_type,"
~ ":heading_level, :heading_lev_collapsed, :identifier,"
- ~ ":parent_ocn, :parent_lev, :last_descendant_ocn,"
+ ~ ":parent_ocn, :parent_lev, :last_descendant_ocn, :ocn_range_first, :ocn_range_last,"
~ ":children, :ancestors, :ancestors_collapsed,"
~ ":dom_status, :dom_status_collapsed,"
~ ":dummy_heading, :object_number_off,"
@@ -542,6 +544,8 @@ template spineAbstractionDb() {
obj_stmt.bind(":parent_ocn", obj.metainfo.parent_ocn);
obj_stmt.bind(":parent_lev", obj.metainfo.parent_lev_markup);
obj_stmt.bind(":last_descendant_ocn", obj.metainfo.last_descendant_ocn);
+ obj_stmt.bind(":ocn_range_first", obj.metainfo.ocn_range_first);
+ obj_stmt.bind(":ocn_range_last", obj.metainfo.ocn_range_last);
bindJsonInts(":children", obj.metainfo.children_headings);
bindJsonInts(":ancestors", obj.metainfo.markedup_ancestors);
diff --git a/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org b/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org
index dbd4bab..eaf3a38 100644
--- a/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org
+++ b/org/sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org
@@ -156,7 +156,7 @@ git+file:///home/ralph/grotto/repo/git.repo/projects/doc-reform/packages/nix-fla
#+NAME: ocda_ssp_format_version_part_minor
#+BEGIN_SRC org
-0
+1
#+END_SRC
* sqlite collection search db schema version
diff --git a/src/sisudoc/ocda/abstraction/db_in.d b/src/sisudoc/ocda/abstraction/db_in.d
index 986a09d..28d6423 100644
--- a/src/sisudoc/ocda/abstraction/db_in.d
+++ b/src/sisudoc/ocda/abstraction/db_in.d
@@ -347,6 +347,11 @@ template spineAbstractionDbRead() {
obj.metainfo.parent_ocn = row[_col["parent_ocn"]].as!int;
obj.metainfo.parent_lev_markup = row[_col["parent_lev"]].as!int;
obj.metainfo.last_descendant_ocn = row[_col["last_descendant_ocn"]].as!int;
+ /+ ↓ 2.1: a 2.0 database has no such columns, and reads as no range +/
+ if ("ocn_range_first" in _col) {
+ obj.metainfo.ocn_range_first = row[_col["ocn_range_first"]].as!int;
+ obj.metainfo.ocn_range_last = row[_col["ocn_range_last"]].as!int;
+ }
obj.metainfo.children_headings = _jsonInts(row[_col["children"]].as!string);
obj.metainfo.markedup_ancestors = _jsonEight(row[_col["ancestors"]].as!string);
obj.metainfo.collapsed_ancestors = _jsonEight(row[_col["ancestors_collapsed"]].as!string);
diff --git a/src/sisudoc/ocda/abstraction/doc_has.d b/src/sisudoc/ocda/abstraction/doc_has.d
index 4ecf018..f01af78 100644
--- a/src/sisudoc/ocda/abstraction/doc_has.d
+++ b/src/sisudoc/ocda/abstraction/doc_has.d
@@ -264,13 +264,11 @@ template spineDocHasFromAbstraction() {
_tag_assoc[obj.metainfo.identifier]["seg_lv4"]
= obj.tags.html_segment_anchor_tag_is;
}
- /+ ↓ An object that is not written into any segment still carries an
- identifier, and can share it: a poem block and its verses have one
- ocn between them, the verses are written and the block itself is not.
- The block comes second, so an unguarded assignment replaced a good
- segment name with an empty one, and the link came out as
- ".xhtml#297". seg_lv4 above is guarded already, which is why this
- showed in the epub and not in the html.
+ /+ ↓ An object that is not written into a segment still carries an
+ identifier, and could share it: a poem block carried the ocn of
+ its last verse until spec:2.1, with an issue affecting epub output.
+ Since spec:2.1 the poem has no identifier; the guard stays, for any
+ object that is not in a segment.
+/
if (obj.tags.epub_segment_anchor_tag_is.length > 0) {
_tag_assoc[obj.metainfo.identifier]["seg_lv1to4"]
diff --git a/src/sisudoc/ocda/abstraction/ssp.d b/src/sisudoc/ocda/abstraction/ssp.d
index c22741b..dfb8c10 100644
--- a/src/sisudoc/ocda/abstraction/ssp.d
+++ b/src/sisudoc/ocda/abstraction/ssp.d
@@ -59,6 +59,16 @@ module sisudoc.ocda.abstraction.ssp;
part when a property is added (a reader of the newer format still reads
the older one), the major part when one changes meaning or goes away.
+ 2.1 2026-09-29 .ocn_range, the first and last ocn of what a
+ container holds. A poem is a container of verses and
+ is cited as their range: it now opens its run of
+ verses rather than closing it, carries ocn 0 and no
+ identifier, and states the range. It used to carry
+ the last verse's ocn and identifier, so one number
+ named two objects. A 2.0 reader reads a 2.1 file:
+ the poem was never rendered and has no text, the
+ verses are unchanged, and the property is an
+ addition.
2.0 2026-09-18 source.digest changes meaning: it now covers every
markup file the document is made of, where it was the
sha256 of the master file alone. For a .sst that was
@@ -74,7 +84,7 @@ module sisudoc.ocda.abstraction.ssp;
reference to a heading above level 4 lands on;
was 0.1
+/
-enum ssp_format_version = "2.0";
+enum ssp_format_version = "2.1";
enum ssp_format_version_major = "2";
/+ ↓ escaping for values that are folded onto one line
@@ -181,6 +191,11 @@ template sspObjectRecord() {
if (obj.metainfo.last_descendant_ocn != 0) {
output ~= ".last_descendant: " ~ obj.metainfo.last_descendant_ocn.to!string;
}
+ /+ ↓ a container: the first and last ocn of what it holds (2.1) +/
+ if (obj.metainfo.ocn_range_first != 0) {
+ output ~= ".ocn_range: " ~ obj.metainfo.ocn_range_first.to!string
+ ~ " " ~ obj.metainfo.ocn_range_last.to!string;
+ }
/+ ↓ child headings (from pre-computed map) +/
if (obj.metainfo.children_headings.length > 0) {
string[] ch;
diff --git a/src/sisudoc/ocda/abstraction/ssp_in.d b/src/sisudoc/ocda/abstraction/ssp_in.d
index 0e461ad..0c67ab2 100644
--- a/src/sisudoc/ocda/abstraction/ssp_in.d
+++ b/src/sisudoc/ocda/abstraction/ssp_in.d
@@ -76,7 +76,7 @@ template spineAbstractionRead() {
object sections in the order the file gives them
+/
struct SSPdocument {
- string format; // "% SiSU Document Abstraction v2.0"
+ string format; // "% SiSU Document Abstraction v2.1"
string source; // "% Source: ..."
string[string] source_info; // the @source block
string[] source_info_order;
@@ -230,6 +230,14 @@ template spineAbstractionRead() {
case "section": obj.metainfo.is_of_section = _val; break;
case "parent": obj.metainfo.parent_ocn = _val.to!int; break;
case "last_descendant": obj.metainfo.last_descendant_ocn = _val.to!int; break;
+ case "ocn_range": {
+ auto _r = _ints(_val);
+ if (_r.length == 2) {
+ obj.metainfo.ocn_range_first = _r[0];
+ obj.metainfo.ocn_range_last = _r[1];
+ }
+ break;
+ }
case "children": obj.metainfo.children_headings = _ints(_val); break;
case "ancestors":
obj.metainfo.markedup_ancestors = _eight(_val);
diff --git a/src/sisudoc/ocda/meta/metadoc_from_src.d b/src/sisudoc/ocda/meta/metadoc_from_src.d
index 3670a39..cbd25e2 100644
--- a/src/sisudoc/ocda/meta/metadoc_from_src.d
+++ b/src/sisudoc/ocda/meta/metadoc_from_src.d
@@ -148,6 +148,8 @@ template docAbstraction() {
"start" : "",
"end" : ""
];
+ /+ ↓ where the open poem's first verse will go, -1 when no poem is open +/
+ long _poem_open_idx = -1;
string[] lv_ancestors_txt = [ "", "", "", "", "", "", "", "", ];
/+ ↓ dom structure state, per document (not shared, parallel safe) +/
int[] dom_structure_markedup_tags_status = [ 0, 0, 0, 0, 0, 0, 0, 0,];
@@ -426,6 +428,7 @@ template docAbstraction() {
object_reset(an_object);
processing.remove("verse");
object_number_poem["start"] = obj_cite_digits.object_number.to!string;
+ _poem_open_idx = the_document_body_section.length.to!long;
}
{
ST_txt_by_line_block_start _get = line.txt_by_line_block_start(pith, dochas, object_number_poem);
@@ -602,6 +605,46 @@ template docAbstraction() {
pith = _get.pith;
}
}
+ /+ ↓ poem closed: poem object has been appended after its last verse.
+ It is a container, not a citable unit - its verses are - so it
+ carries no ocn of its own and states the range of its verses
+ instead, and it goes to the head of them, so that a writer
+ meeting it knows what follows and where it ends, and can wrap the
+ verses in one pass. (an issue with a note in the last verse of a
+ poem has been addressed)
+ +/
+ if (_poem_open_idx >= 0
+ && the_document_body_section.length > _poem_open_idx + 1
+ && the_document_body_section[$-1].metainfo.is_a == "poem"
+ ) {
+ size_t _s = _poem_open_idx.to!size_t;
+ size_t _p = the_document_body_section.length - 1;
+ size_t _first = _s;
+ while (_first < _p && the_document_body_section[_first].metainfo.is_a != "verse") { ++_first; }
+ size_t _last = _p;
+ while (_last > _s && the_document_body_section[_last - 1].metainfo.is_a != "verse") { --_last; }
+ if (_first < _p && _last > _s) {
+ --_last;
+ if ((the_document_body_section[_last].text).match(rgx.inline_notes_al_all_note)) {
+ object_notes = note_section.gather_notes_for_endnote_section(
+ the_document_body_section,
+ tag_in_seg,
+ (_last).to!int,
+ );
+ }
+ auto _poem = the_document_body_section[_p];
+ _poem.metainfo.ocn_range_first = the_document_body_section[_first].metainfo.ocn;
+ _poem.metainfo.ocn_range_last = the_document_body_section[_last].metainfo.ocn;
+ _poem.tags.html_segment_anchor_tag_is = the_document_body_section[_first].tags.html_segment_anchor_tag_is;
+ _poem.tags.epub_segment_anchor_tag_is = the_document_body_section[_first].tags.epub_segment_anchor_tag_is;
+ the_document_body_section
+ = the_document_body_section[0 .. _s]
+ ~ _poem
+ ~ the_document_body_section[_s .. _p];
+ previous_length = the_document_body_section.length.to!int;
+ }
+ _poem_open_idx = -1;
+ }
} else {
// line.empty, post contents, empty variables:
assert(
@@ -1031,12 +1074,13 @@ template docAbstraction() {
= obj.tags.html_segment_anchor_tag_is;
}
/+ ↓ An object that is not written into any segment still carries an
- identifier, and can share it: a poem block and its verses have one
- ocn between them, the verses are written and the block itself is not.
+ identifier, and could share it: a poem block carried the ocn of its last
+ verse until 2.1, and the verses are written where the block is not.
The block comes second, so an unguarded assignment replaced a good
segment name with an empty one, and the link came out as
".xhtml#297". seg_lv4 above is guarded already, which is why this
- showed in the epub and not in the html.
+ showed in the epub and not in the html. Since 2.1 the poem has no
+ identifier; the guard stays, for any object that is not in a segment.
+/
if (!(obj.tags.epub_segment_anchor_tag_is.empty)) {
tag_assoc[(obj.metainfo.identifier)]["seg_lv1to4"]
diff --git a/src/sisudoc/ocda/meta/metadoc_from_src_functions.d b/src/sisudoc/ocda/meta/metadoc_from_src_functions.d
index 922f389..fc12087 100644
--- a/src/sisudoc/ocda/meta/metadoc_from_src_functions.d
+++ b/src/sisudoc/ocda/meta/metadoc_from_src_functions.d
@@ -2163,11 +2163,13 @@ template docAbstractionFunctions() {
heading_ptr-1,
an_object["is"]
);
- comp_obj_poem_ocn = set_object_generic("body", "body", "block", "poem", "", obj_cite_digits.object_number);
- comp_obj_poem_ocn.metainfo.identifier = obj_cite_digits.identifier;
- comp_obj_poem_ocn.metainfo.object_number_off = obj_cite_digits.off;
- comp_obj_poem_ocn.metainfo.o_n_book_index = obj_cite_digits.bkidx;
- comp_obj_poem_ocn.metainfo.object_number_type = obj_cite_digits.type;
+ /+ ↓ the poem: a container of the verses just written, not a citable unit
+ on its own, it now states the range of its verses
+ (ocn_range_first/_last), (it previously carried the last verse's ocn
+ and identifier, one number occurring on two objects)
+ +/
+ comp_obj_poem_ocn = set_object_generic("body", "body", "block", "poem", "", 0);
+ comp_obj_poem_ocn.metainfo.identifier = "";
the_document_body_section ~= comp_obj_poem_ocn;
pith["block_is"] = eN.blk_is.poem;
pith["block_state"] = eN.blk_state.off;
diff --git a/src/sisudoc/ocda/meta/metadoc_object_setter.d b/src/sisudoc/ocda/meta/metadoc_object_setter.d
index 6c090db..eff01a2 100644
--- a/src/sisudoc/ocda/meta/metadoc_object_setter.d
+++ b/src/sisudoc/ocda/meta/metadoc_object_setter.d
@@ -230,6 +230,12 @@ template ObjectSetter() {
int parent_lev_markup = 0;
int parent_ocn = 0;
int last_descendant_ocn = 0;
+ /+ ↓ the objects a container holds, as the first and last of their ocns: a
+ poem is not itself a citable object, its verses are, and it is cited as
+ the range of citable objects, ocn ("173-180"). 0 where not a container.
+ +/
+ int ocn_range_first = 0;
+ int ocn_range_last = 0;
int[] children_headings;
SHA_256_Hashes_ sha256;
}
diff --git a/src/sisudoc/ocda/meta/ocn_align.d b/src/sisudoc/ocda/meta/ocn_align.d
index 9f9fdaf..e93f12a 100644
--- a/src/sisudoc/ocda/meta/ocn_align.d
+++ b/src/sisudoc/ocda/meta/ocn_align.d
@@ -163,10 +163,11 @@ template spineOcnAlign() {
foreach (obj; doc.abstraction[section]) {
int _ocn = obj.metainfo.ocn.to!int;
if (_ocn <= 0) { continue; }
- /+ ↓ first in document order wins. An ocn is not unique: a poem and
- its first verse share one, by design, so the same number names
- two objects and the first of them is the one both languages
- will have reached first.
+ /+ ↓ first in document order wins. Until format spec:2.1 a (verse) ocn
+ was not unique: a poem carried the ocn of its last verse, so the
+ same number named two objects. A poem now carries 0 and is passed
+ over above; the rule stays, and costs nothing, for an artefact
+ written before spec:2.1.
+/
if (_ocn !in _p.kinds) { _p.kinds[_ocn] = _kindOf(obj); }
_p.ocn_count += 1;
diff --git a/src/sisudoc/outputs/io_out/sqlite_ocda_db.d b/src/sisudoc/outputs/io_out/sqlite_ocda_db.d
index f312d91..561d89c 100644
--- a/src/sisudoc/outputs/io_out/sqlite_ocda_db.d
+++ b/src/sisudoc/outputs/io_out/sqlite_ocda_db.d
@@ -182,6 +182,8 @@ template spineAbstractionDb() {
parent_ocn INTEGER DEFAULT 0,
parent_lev INTEGER DEFAULT 0,
last_descendant_ocn INTEGER DEFAULT 0,
+ ocn_range_first INTEGER DEFAULT 0,
+ ocn_range_last INTEGER DEFAULT 0,
children TEXT
CHECK(children IS NULL OR json_valid(children)),
ancestors TEXT
@@ -436,7 +438,7 @@ template spineAbstractionDb() {
"INSERT INTO objects ("
~ "doc_id, section, seq, ocn, is_a, is_of_part, is_of_section, is_of_type,"
~ "heading_level, heading_lev_collapsed, identifier,"
- ~ "parent_ocn, parent_lev, last_descendant_ocn,"
+ ~ "parent_ocn, parent_lev, last_descendant_ocn, ocn_range_first, ocn_range_last,"
~ "children, ancestors, ancestors_collapsed,"
~ "dom_status, dom_status_collapsed,"
~ "dummy_heading, object_number_off,"
@@ -451,7 +453,7 @@ template spineAbstractionDb() {
~ ") VALUES ("
~ ":doc_id, :section, :seq, :ocn, :is_a, :is_of_part, :is_of_section, :is_of_type,"
~ ":heading_level, :heading_lev_collapsed, :identifier,"
- ~ ":parent_ocn, :parent_lev, :last_descendant_ocn,"
+ ~ ":parent_ocn, :parent_lev, :last_descendant_ocn, :ocn_range_first, :ocn_range_last,"
~ ":children, :ancestors, :ancestors_collapsed,"
~ ":dom_status, :dom_status_collapsed,"
~ ":dummy_heading, :object_number_off,"
@@ -560,6 +562,8 @@ template spineAbstractionDb() {
obj_stmt.bind(":parent_ocn", obj.metainfo.parent_ocn);
obj_stmt.bind(":parent_lev", obj.metainfo.parent_lev_markup);
obj_stmt.bind(":last_descendant_ocn", obj.metainfo.last_descendant_ocn);
+ obj_stmt.bind(":ocn_range_first", obj.metainfo.ocn_range_first);
+ obj_stmt.bind(":ocn_range_last", obj.metainfo.ocn_range_last);
bindJsonInts(":children", obj.metainfo.children_headings);
bindJsonInts(":ancestors", obj.metainfo.markedup_ancestors);
diff --git a/test/reference/abstraction/accelerando.charles_stross.en.ssp b/test/reference/abstraction/accelerando.charles_stross.en.ssp
index 98e4f7e..81f7f82 100644
--- a/test/reference/abstraction/accelerando.charles_stross.en.ssp
+++ b/test/reference/abstraction/accelerando.charles_stross.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: accelerando.charles_stross.sst
@source {
diff --git a/test/reference/abstraction/alices_adventures_in_wonderland.lewis_carroll.en.ssp b/test/reference/abstraction/alices_adventures_in_wonderland.lewis_carroll.en.ssp
index d38264e..1c3dc6c 100644
--- a/test/reference/abstraction/alices_adventures_in_wonderland.lewis_carroll.en.ssp
+++ b/test/reference/abstraction/alices_adventures_in_wonderland.lewis_carroll.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: alices_adventures_in_wonderland.lewis_carroll.sst
@source {
@@ -622,30 +622,33 @@
.segment_epub_is: x2
| And she went on planning to herself how she would manage it. `They must go by the carrier,' she thought; `and how funny it'll seem, sending presents to one's own feet! And how odd the directions will look!
-[30] verse
+[0] poem
.part: body
.parent: 27
+.ocn_range: 30 30
.ancestors: 1 0 0 0 27 0 0 0
.ancestors_collapsed: 1 27 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 517ADA3858CFFE11B59C38DA66D03D5ED116EACFE382ADE237CDECDCFB9CCF63
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x2
.segment_epub_is: x2
-|
-| ALICE'S RIGHT FOOT, ESQ.
-| HEARTHRUG,
-| NEAR THE FENDER,
-| (WITH ALICE'S LOVE).
-[30] poem
+[30] verse
.part: body
.parent: 27
.ancestors: 1 0 0 0 27 0 0 0
.ancestors_collapsed: 1 27 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 517ADA3858CFFE11B59C38DA66D03D5ED116EACFE382ADE237CDECDCFB9CCF63
+.segment_html_is: x2
+.segment_epub_is: x2
+|
+| ALICE'S RIGHT FOOT, ESQ.
+| HEARTHRUG,
+| NEAR THE FENDER,
+| (WITH ALICE'S LOVE).
[31] para
.part: body
@@ -731,6 +734,18 @@
.segment_epub_is: x2
| `I'm sure I'm not Ada,' she said, `for her hair goes in such long ringlets, and mine doesn't go in ringlets at all; and I'm sure I can't be Mabel, for I know all sorts of things, and she, oh! she knows such a very little! Besides, SHE'S she, and I'm I, and--oh dear, how puzzling it all is! I'll try if I know all the things I used to know. Let me see: four times five is twelve, and four times six is thirteen, and four times seven is--oh dear! I shall never get to twenty at that rate! However, the Multiplication Table doesn't signify: let's try Geography. London is the capital of Paris, and Paris is the capital of Rome, and Rome--no, THAT'S all wrong, I'm certain! I must have been changed for Mabel! I'll try and say “How doth the little--”' and she crossed her hands on her lap as if she were saying lessons, and began to repeat it, but her voice sounded hoarse and strange, and the words did not come the same as they used to do:--
+[0] poem
+.part: body
+.parent: 27
+.ocn_range: 38 39
+.ancestors: 1 0 0 0 27 0 0 0
+.ancestors_collapsed: 1 27 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x2
+.segment_epub_is: x2
+
[38] verse
.part: body
.parent: 27
@@ -762,15 +777,6 @@
| And welcome little fishes in
| With gently smiling jaws!'
-[39] poem
-.part: body
-.parent: 27
-.ancestors: 1 0 0 0 27 0 0 0
-.ancestors_collapsed: 1 27 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[40] para
.part: body
.parent: 27
@@ -1356,6 +1362,18 @@
.segment_epub_is: x3
| `It IS a long tail, certainly,' said Alice, looking down with wonder at the Mouse's tail; `but why do you call it sad?' And she kept on puzzling about it while the Mouse was speaking, so that her idea of the tale was something like this:--
+[0] poem
+.part: body
+.parent: 54
+.ocn_range: 88 88
+.ancestors: 1 0 0 0 54 0 0 0
+.ancestors_collapsed: 1 54 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x3
+.segment_epub_is: x3
+
[88] verse
.part: body
.parent: 54
@@ -1412,15 +1430,6 @@
| to
| death."'
-[88] poem
-.part: body
-.parent: 54
-.ancestors: 1 0 0 0 54 0 0 0
-.ancestors_collapsed: 1 54 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[89] para
.part: body
.parent: 54
@@ -2447,6 +2456,18 @@
.segment_epub_is: x5
| Alice folded her hands, and began:--
+[0] poem
+.part: body
+.parent: 146
+.ocn_range: 173 180
+.ancestors: 1 0 0 0 146 0 0 0
+.ancestors_collapsed: 1 146 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x5
+.segment_epub_is: x5
+
[173] verse
.part: body
.parent: 146
@@ -2568,15 +2589,6 @@
| Do you think I can listen all day to such stuff?
| Be off, or I'll kick you down stairs!'
-[180] poem
-.part: body
-.parent: 146
-.ancestors: 1 0 0 0 146 0 0 0
-.ancestors_collapsed: 1 146 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[181] para
.part: body
.parent: 146
@@ -3552,6 +3564,18 @@
.segment_epub_is: x6
| `Oh, don't bother ME,' said the Duchess; `I never could abide figures!' And with that she began nursing her child again, singing a sort of lullaby to it as she did so, and giving it a violent shake at the end of every line:
+[0] poem
+.part: body
+.parent: 222
+.ocn_range: 258 261
+.ancestors: 1 0 0 0 222 0 0 0
+.ancestors_collapsed: 1 222 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x6
+.segment_epub_is: x6
+
[258] verse
.part: body
.parent: 222
@@ -3604,26 +3628,29 @@
.segment_epub_is: x6
| `Wow! wow! wow!'
-[261] poem
+[262] para
.part: body
.parent: 222
.ancestors: 1 0 0 0 222 0 0 0
.ancestors_collapsed: 1 222 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.is_of_type: para
+.sha256: 97BFE0B287A8705D308272958CA9CBD543F786A15C85BD03F23AA0669177A9C1
+.segment_html_is: x6
+.segment_epub_is: x6
+| While the Duchess sang the second verse of the song, she kept tossing the baby violently up and down, and the poor little thing howled so, that Alice could hardly hear the words:--
-[262] para
+[0] poem
.part: body
.parent: 222
+.ocn_range: 263 265
.ancestors: 1 0 0 0 222 0 0 0
.ancestors_collapsed: 1 222 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: para
-.sha256: 97BFE0B287A8705D308272958CA9CBD543F786A15C85BD03F23AA0669177A9C1
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x6
.segment_epub_is: x6
-| While the Duchess sang the second verse of the song, she kept tossing the baby violently up and down, and the poor little thing howled so, that Alice could hardly hear the words:--
[263] verse
.part: body
@@ -3665,15 +3692,6 @@
.segment_epub_is: x6
| `Wow! wow! wow!'
-[265] poem
-.part: body
-.parent: 222
-.ancestors: 1 0 0 0 222 0 0 0
-.ancestors_collapsed: 1 222 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[266] para
.part: body
.parent: 222
@@ -4727,28 +4745,31 @@
.segment_epub_is: x7
| The Hatter shook his head mournfully. `Not I!' he replied. `We quarrelled last March--just before HE went mad, you know--' (pointing with his tea spoon at the March Hare,) `--it was at the great concert given by the Queen of Hearts, and I had to sing
-[353] verse
+[0] poem
.part: body
.parent: 304
+.ocn_range: 353 353
.ancestors: 1 0 0 0 304 0 0 0
.ancestors_collapsed: 1 304 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: D905C2514C9A6ADACA3DF000CA64B575CC363D15B13129EA7FBBED97EAB3F5C9
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x7
.segment_epub_is: x7
-|
-| "Twinkle, twinkle, little bat!
-| How I wonder what you're at!"
-[353] poem
+[353] verse
.part: body
.parent: 304
.ancestors: 1 0 0 0 304 0 0 0
.ancestors_collapsed: 1 304 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: D905C2514C9A6ADACA3DF000CA64B575CC363D15B13129EA7FBBED97EAB3F5C9
+.segment_html_is: x7
+.segment_epub_is: x7
+|
+| "Twinkle, twinkle, little bat!
+| How I wonder what you're at!"
[354] para
.part: body
@@ -4786,29 +4807,32 @@
.segment_epub_is: x7
| `It goes on, you know,' the Hatter continued, `in this way:--
-[357] verse
+[0] poem
.part: body
.parent: 304
+.ocn_range: 357 357
.ancestors: 1 0 0 0 304 0 0 0
.ancestors_collapsed: 1 304 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: A294B37F5AEBE061DD2D3F91D5606E7C2DB181AC2B2FD97AD4A0712A9EE6AA9C
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x7
.segment_epub_is: x7
-|
-| "Up above the world you fly,
-| Like a tea-tray in the sky.
-| Twinkle, twinkle--"'
-[357] poem
+[357] verse
.part: body
.parent: 304
.ancestors: 1 0 0 0 304 0 0 0
.ancestors_collapsed: 1 304 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: A294B37F5AEBE061DD2D3F91D5606E7C2DB181AC2B2FD97AD4A0712A9EE6AA9C
+.segment_html_is: x7
+.segment_epub_is: x7
+|
+| "Up above the world you fly,
+| Like a tea-tray in the sky.
+| Twinkle, twinkle--"'
[358] para
.part: body
@@ -7729,6 +7753,18 @@
.segment_epub_is: x10
| So they began solemnly dancing round and round Alice, every now and then treading on her toes when they passed too close, and waving their forepaws to mark the time, while the Mock Turtle sang this, very slowly and sadly:--
+[0] poem
+.part: body
+.parent: 575
+.ocn_range: 599 603
+.ancestors: 1 0 0 0 575 0 0 0
+.ancestors_collapsed: 1 575 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x10
+.segment_epub_is: x10
+
[599] verse
.part: body
.parent: 575
@@ -7814,15 +7850,6 @@
| Will you, won't you, will you, won't you, won't you join the
| dance?"'
-[603] poem
-.part: body
-.parent: 575
-.ancestors: 1 0 0 0 575 0 0 0
-.ancestors_collapsed: 1 575 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[604] para
.part: body
.parent: 575
@@ -8195,6 +8222,18 @@
.segment_epub_is: x10
| `How the creatures order one about, and make one repeat lessons!' thought Alice; `I might as well be at school at once.' However, she got up, and began to repeat it, but her head was so full of the Lobster Quadrille, that she hardly knew what she was saying, and the words came very queer indeed:--
+[0] poem
+.part: body
+.parent: 575
+.ocn_range: 635 636
+.ancestors: 1 0 0 0 575 0 0 0
+.ancestors_collapsed: 1 575 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x10
+.segment_epub_is: x10
+
[635] verse
.part: body
.parent: 575
@@ -8227,15 +8266,6 @@
| But, when the tide rises and sharks are around,
| His voice has a timid and tremulous sound.]
-[636] poem
-.part: body
-.parent: 575
-.ancestors: 1 0 0 0 575 0 0 0
-.ancestors_collapsed: 1 575 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[637] para
.part: body
.parent: 575
@@ -8344,6 +8374,18 @@
.segment_epub_is: x10
| Alice did not dare to disobey, though she felt sure it would all come wrong, and she went on in a trembling voice:--
+[0] poem
+.part: body
+.parent: 575
+.ocn_range: 646 647
+.ancestors: 1 0 0 0 575 0 0 0
+.ancestors_collapsed: 1 575 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x10
+.segment_epub_is: x10
+
[646] verse
.part: body
.parent: 575
@@ -8376,15 +8418,6 @@
| While the Panther received knife and fork with a growl,
| And concluded the banquet--]
-[647] poem
-.part: body
-.parent: 575
-.ancestors: 1 0 0 0 575 0 0 0
-.ancestors_collapsed: 1 575 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[648] para
.part: body
.parent: 575
@@ -8445,6 +8478,18 @@
.segment_epub_is: x10
| The Mock Turtle sighed deeply, and began, in a voice sometimes choked with sobs, to sing this:--
+[0] poem
+.part: body
+.parent: 575
+.ocn_range: 653 654
+.ancestors: 1 0 0 0 575 0 0 0
+.ancestors_collapsed: 1 575 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x10
+.segment_epub_is: x10
+
[653] verse
.part: body
.parent: 575
@@ -8486,15 +8531,6 @@
| Soo--oop of the e--e--evening,
| Beautiful, beauti--FUL SOUP!'
-[654] poem
-.part: body
-.parent: 575
-.ancestors: 1 0 0 0 575 0 0 0
-.ancestors_collapsed: 1 575 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[655] para
.part: body
.parent: 575
@@ -8531,28 +8567,31 @@
.segment_epub_is: x10
| `What trial is it?' Alice panted as she ran; but the Gryphon only answered `Come on!' and ran the faster, while more and more faintly came, carried on the breeze that followed them, the melancholy words:--
-[658] verse
+[0] poem
.part: body
.parent: 575
+.ocn_range: 658 658
.ancestors: 1 0 0 0 575 0 0 0
.ancestors_collapsed: 1 575 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: D066ABE514BBB2A535B819A1431BDCA709CF6E19EAFC793B75881F90240F79AC
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x10
.segment_epub_is: x10
-|
-| `Soo--oop of the e--e--evening,
-| Beautiful, beautiful Soup!'
-[658] poem
+[658] verse
.part: body
.parent: 575
.ancestors: 1 0 0 0 575 0 0 0
.ancestors_collapsed: 1 575 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: D066ABE514BBB2A535B819A1431BDCA709CF6E19EAFC793B75881F90240F79AC
+.segment_html_is: x10
+.segment_epub_is: x10
+|
+| `Soo--oop of the e--e--evening,
+| Beautiful, beautiful Soup!'
[659] heading :1
.part: body
@@ -8707,30 +8746,33 @@
.segment_epub_is: x11
| On this the White Rabbit blew three blasts on the trumpet, and then unrolled the parchment scroll, and read as follows:--
-[671] verse
+[0] poem
.part: body
.parent: 659
+.ocn_range: 671 671
.ancestors: 1 0 0 0 659 0 0 0
.ancestors_collapsed: 1 659 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 0DC2597E225767360B800C631A742B4CA95BC80C08E0534948012729F2733761
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x11
.segment_epub_is: x11
-|
-| `The Queen of Hearts, she made some tarts,
-| All on a summer day:
-| The Knave of Hearts, he stole those tarts,
-| And took them quite away!'
-[671] poem
+[671] verse
.part: body
.parent: 659
.ancestors: 1 0 0 0 659 0 0 0
.ancestors_collapsed: 1 659 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 0DC2597E225767360B800C631A742B4CA95BC80C08E0534948012729F2733761
+.segment_html_is: x11
+.segment_epub_is: x11
+|
+| `The Queen of Hearts, she made some tarts,
+| All on a summer day:
+| The Knave of Hearts, he stole those tarts,
+| And took them quite away!'
[672] para
.part: body
@@ -9964,6 +10006,18 @@
.segment_epub_is: x12
| These were the verses the White Rabbit read:--
+[0] poem
+.part: body
+.parent: 734
+.ocn_range: 774 779
+.ancestors: 1 0 0 0 734 0 0 0
+.ancestors_collapsed: 1 734 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x12
+.segment_epub_is: x12
+
[774] verse
.part: body
.parent: 734
@@ -10055,15 +10109,6 @@
| A secret, kept from all the rest,
| Between yourself and me.'
-[779] poem
-.part: body
-.parent: 734
-.ancestors: 1 0 0 0 734 0 0 0
-.ancestors_collapsed: 1 734 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[780] para
.part: body
.parent: 734
diff --git a/test/reference/abstraction/content.cory_doctorow.en.ssp b/test/reference/abstraction/content.cory_doctorow.en.ssp
index cb027ae..57a0018 100644
--- a/test/reference/abstraction/content.cory_doctorow.en.ssp
+++ b/test/reference/abstraction/content.cory_doctorow.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: content.cory_doctorow.sst
@source {
diff --git a/test/reference/abstraction/democratizing_innovation.eric_von_hippel.en.ssp b/test/reference/abstraction/democratizing_innovation.eric_von_hippel.en.ssp
index e7c13db..ebfaaa5 100644
--- a/test/reference/abstraction/democratizing_innovation.eric_von_hippel.en.ssp
+++ b/test/reference/abstraction/democratizing_innovation.eric_von_hippel.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: democratizing_innovation.eric_von_hippel.sst
@source {
diff --git a/test/reference/abstraction/down_and_out_in_the_magic_kingdom.cory_doctorow.en.ssp b/test/reference/abstraction/down_and_out_in_the_magic_kingdom.cory_doctorow.en.ssp
index a596a5c..7472a99 100644
--- a/test/reference/abstraction/down_and_out_in_the_magic_kingdom.cory_doctorow.en.ssp
+++ b/test/reference/abstraction/down_and_out_in_the_magic_kingdom.cory_doctorow.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: down_and_out_in_the_magic_kingdom.cory_doctorow.sst
@source {
diff --git a/test/reference/abstraction/for_the_win.cory_doctorow.en.ssp b/test/reference/abstraction/for_the_win.cory_doctorow.en.ssp
index d23b8df..fe1aa48 100644
--- a/test/reference/abstraction/for_the_win.cory_doctorow.en.ssp
+++ b/test/reference/abstraction/for_the_win.cory_doctorow.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: for_the_win.cory_doctorow.sst
@source {
diff --git a/test/reference/abstraction/free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.en.ssp b/test/reference/abstraction/free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.en.ssp
index d96ad31..ac5a7d1 100644
--- a/test/reference/abstraction/free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.en.ssp
+++ b/test/reference/abstraction/free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst
@source {
@@ -4920,6 +4920,18 @@
.segment_epub_is: chapter_5
| Stallman asks me if I would be interested in hearing the filk. As soon as I say yes, Stallman's voice begins singing in an unexpectedly clear tone, using the tune of “Blowin' in the Wind”:
+[0] poem
+.part: body
+.parent: 295
+.ocn_range: 363 363
+.ancestors: 1 0 0 0 295 0 0 0
+.ancestors_collapsed: 1 295 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: chapter_5
+.segment_epub_is: chapter_5
+
[363] verse
.part: body
.parent: 295
@@ -4941,15 +4953,6 @@
| is stick it in your ear.
| The answer is, stick it in your ear...
-[363] poem
-.part: body
-.parent: 295
-.ancestors: 1 0 0 0 295 0 0 0
-.ancestors_collapsed: 1 295 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[364] para
.part: body
.parent: 295
@@ -11537,6 +11540,18 @@
.sha256: F73D7C186B75B55A94B32B5D7814279048480526CEC2D63FDBFBC216CE77A2D2
| % poem or group what follows ?
+[0] poem
+.part: body
+.parent: 880
+.ocn_range: 888 892
+.ancestors: 1 0 0 0 880 0 0 0
+.ancestors_collapsed: 1 880 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: epilogue
+.segment_epub_is: epilogue
+
[888] verse
.part: body
.parent: 880
@@ -11610,15 +11625,6 @@
| and enlighten readers outside the more hardcore
| programming scene?
-[892] poem
-.part: body
-.parent: 880
-.ancestors: 1 0 0 0 880 0 0 0
-.ancestors_collapsed: 1 880 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[893] para
.part: body
.parent: 880
diff --git a/test/reference/abstraction/free_culture.lawrence_lessig.en.ssp b/test/reference/abstraction/free_culture.lawrence_lessig.en.ssp
index 8dedc24..6efd2d6 100644
--- a/test/reference/abstraction/free_culture.lawrence_lessig.en.ssp
+++ b/test/reference/abstraction/free_culture.lawrence_lessig.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: free_culture.lawrence_lessig.sst
@source {
diff --git a/test/reference/abstraction/free_for_all.peter_wayner.en.ssp b/test/reference/abstraction/free_for_all.peter_wayner.en.ssp
index 6847e4e..00cde9b 100644
--- a/test/reference/abstraction/free_for_all.peter_wayner.en.ssp
+++ b/test/reference/abstraction/free_for_all.peter_wayner.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: free_for_all.peter_wayner.sst
@source {
diff --git a/test/reference/abstraction/gpl2.fsf.en.ssp b/test/reference/abstraction/gpl2.fsf.en.ssp
index f7cb530..d0d18dd 100644
--- a/test/reference/abstraction/gpl2.fsf.en.ssp
+++ b/test/reference/abstraction/gpl2.fsf.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: gpl2.fsf.sst
@source {
diff --git a/test/reference/abstraction/gpl3.fsf.en.ssp b/test/reference/abstraction/gpl3.fsf.en.ssp
index cd9d341..c5286aa 100644
--- a/test/reference/abstraction/gpl3.fsf.en.ssp
+++ b/test/reference/abstraction/gpl3.fsf.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: gpl3.fsf.sst
@source {
diff --git a/test/reference/abstraction/gullivers_travels.jonathan_swift.en.ssp b/test/reference/abstraction/gullivers_travels.jonathan_swift.en.ssp
index 1f709cc..c2bd798 100644
--- a/test/reference/abstraction/gullivers_travels.jonathan_swift.en.ssp
+++ b/test/reference/abstraction/gullivers_travels.jonathan_swift.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: gullivers_travels.jonathan_swift.sst
@source {
diff --git a/test/reference/abstraction/little_brother.cory_doctorow.en.ssp b/test/reference/abstraction/little_brother.cory_doctorow.en.ssp
index 6fe96dc..51b8d22 100644
--- a/test/reference/abstraction/little_brother.cory_doctorow.en.ssp
+++ b/test/reference/abstraction/little_brother.cory_doctorow.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: little_brother.cory_doctorow.sst
@source {
diff --git a/test/reference/abstraction/live-manual.ca.ssp b/test/reference/abstraction/live-manual.ca.ssp
index 8afb728..b222cab 100644
--- a/test/reference/abstraction/live-manual.ca.ssp
+++ b/test/reference/abstraction/live-manual.ca.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.de.ssp b/test/reference/abstraction/live-manual.de.ssp
index e831fdb..9cf8789 100644
--- a/test/reference/abstraction/live-manual.de.ssp
+++ b/test/reference/abstraction/live-manual.de.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.en.ssp b/test/reference/abstraction/live-manual.en.ssp
index 174ba73..574bfc8 100644
--- a/test/reference/abstraction/live-manual.en.ssp
+++ b/test/reference/abstraction/live-manual.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.es.ssp b/test/reference/abstraction/live-manual.es.ssp
index 6b5f103..4bb11a5 100644
--- a/test/reference/abstraction/live-manual.es.ssp
+++ b/test/reference/abstraction/live-manual.es.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.fr.ssp b/test/reference/abstraction/live-manual.fr.ssp
index 9a76767..eabbdc4 100644
--- a/test/reference/abstraction/live-manual.fr.ssp
+++ b/test/reference/abstraction/live-manual.fr.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.it.ssp b/test/reference/abstraction/live-manual.it.ssp
index 49cd3a4..b7ac5fc 100644
--- a/test/reference/abstraction/live-manual.it.ssp
+++ b/test/reference/abstraction/live-manual.it.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.ja.ssp b/test/reference/abstraction/live-manual.ja.ssp
index fa0db66..3660060 100644
--- a/test/reference/abstraction/live-manual.ja.ssp
+++ b/test/reference/abstraction/live-manual.ja.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.pl.ssp b/test/reference/abstraction/live-manual.pl.ssp
index 196862d..087c99e 100644
--- a/test/reference/abstraction/live-manual.pl.ssp
+++ b/test/reference/abstraction/live-manual.pl.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.pt_BR.ssp b/test/reference/abstraction/live-manual.pt_BR.ssp
index be05cda..e64be49 100644
--- a/test/reference/abstraction/live-manual.pt_BR.ssp
+++ b/test/reference/abstraction/live-manual.pt_BR.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/live-manual.ro.ssp b/test/reference/abstraction/live-manual.ro.ssp
index 8f679f8..39721b1 100644
--- a/test/reference/abstraction/live-manual.ro.ssp
+++ b/test/reference/abstraction/live-manual.ro.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: live-manual.ssm
@source {
diff --git a/test/reference/abstraction/not_without_help.austin_amissah.en.ssp b/test/reference/abstraction/not_without_help.austin_amissah.en.ssp
index f5865b6..8eb49a0 100644
--- a/test/reference/abstraction/not_without_help.austin_amissah.en.ssp
+++ b/test/reference/abstraction/not_without_help.austin_amissah.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: not_without_help.austin_amissah.sst
@source {
diff --git a/test/reference/abstraction/on_the_net_and_information.ralph_amissah.en.ssp b/test/reference/abstraction/on_the_net_and_information.ralph_amissah.en.ssp
index 3b72332..6cd5004 100644
--- a/test/reference/abstraction/on_the_net_and_information.ralph_amissah.en.ssp
+++ b/test/reference/abstraction/on_the_net_and_information.ralph_amissah.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: on_the_net_and_information.ralph_amissah.sst
@source {
diff --git a/test/reference/abstraction/outputs_of_ai_systems_qualify_as_artwork.anna_linne.en.ssp b/test/reference/abstraction/outputs_of_ai_systems_qualify_as_artwork.anna_linne.en.ssp
index 6a52946..7af8ea4 100644
--- a/test/reference/abstraction/outputs_of_ai_systems_qualify_as_artwork.anna_linne.en.ssp
+++ b/test/reference/abstraction/outputs_of_ai_systems_qualify_as_artwork.anna_linne.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: outputs_of_ai_systems_qualify_as_artwork.anna_linne.sst
@source {
diff --git a/test/reference/abstraction/revisiting_the_autonomous_contract.ralph_amissah.en.ssp b/test/reference/abstraction/revisiting_the_autonomous_contract.ralph_amissah.en.ssp
index bad6692..e2ca19f 100644
--- a/test/reference/abstraction/revisiting_the_autonomous_contract.ralph_amissah.en.ssp
+++ b/test/reference/abstraction/revisiting_the_autonomous_contract.ralph_amissah.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: revisiting_the_autonomous_contract.ralph_amissah.sst
@source {
diff --git a/test/reference/abstraction/sisu-manual~sisu_markup.en.ssp b/test/reference/abstraction/sisu-manual~sisu_markup.en.ssp
index 4ea560e..6adc7b6 100644
--- a/test/reference/abstraction/sisu-manual~sisu_markup.en.ssp
+++ b/test/reference/abstraction/sisu-manual~sisu_markup.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: sisu_markup.sst
@source {
@@ -5031,6 +5031,18 @@
.segment_epub_is: seg_4
| ⑆!┨curly brace delimiter, resulting poem text output (broken into verse):┣!
+[0] poem
+.part: body
+.parent: 286
+.ocn_range: 291 291
+.ancestors: 1 54 0 0 110 261 286 0
+.ancestors_collapsed: 1 54 110 261 286 0 0 0
+.parent_lev: 6
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: seg_4
+.segment_epub_is: seg_4
+
[291] verse
.part: body
.parent: 286
@@ -5088,15 +5100,6 @@
| death."'
|
-[291] poem
-.part: body
-.parent: 286
-.ancestors: 1 54 0 0 110 261 286 0
-.ancestors_collapsed: 1 54 110 261 286 0 0 0
-.parent_lev: 6
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[0] comment
.part: comment
.section: comment
@@ -5120,6 +5123,18 @@
.segment_epub_is: seg_4
| ⑆!┨curly brace delimiter, resulting poem text output (broken into verse):┣!
+[0] poem
+.part: body
+.parent: 286
+.ocn_range: 293 297
+.ancestors: 1 54 0 0 110 261 286 0
+.ancestors_collapsed: 1 54 110 261 286 0 0 0
+.parent_lev: 6
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: seg_4
+.segment_epub_is: seg_4
+
[293] verse
.part: body
.parent: 286
@@ -5191,26 +5206,29 @@
| Purge them, scourge them, burnish brightly,
| Then in love set each one free.
-[297] poem
+[298] para
.part: body
.parent: 286
.ancestors: 1 54 0 0 110 261 286 0
.ancestors_collapsed: 1 54 110 261 286 0 0 0
.parent_lev: 6
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.is_of_type: para
+.sha256: A9B484F8D854295F3471217F5EA897CC276457D444785772AD01E7776EFD3497
+.segment_html_is: seg_4
+.segment_epub_is: seg_4
+| ⑆!┨tics delimiter, resulting group text output:┣!
-[298] para
+[0] poem
.part: body
.parent: 286
+.ocn_range: 299 303
.ancestors: 1 54 0 0 110 261 286 0
.ancestors_collapsed: 1 54 110 261 286 0 0 0
.parent_lev: 6
-.is_of_type: para
-.sha256: A9B484F8D854295F3471217F5EA897CC276457D444785772AD01E7776EFD3497
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: seg_4
.segment_epub_is: seg_4
-| ⑆!┨tics delimiter, resulting group text output:┣!
[299] verse
.part: body
@@ -5284,15 +5302,6 @@
| Then in love set each one free.
|
-[303] poem
-.part: body
-.parent: 286
-.ancestors: 1 54 0 0 110 261 286 0
-.ancestors_collapsed: 1 54 110 261 286 0 0 0
-.parent_lev: 6
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[304] heading :3
.part: body
.parent: 261
diff --git a/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp b/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp
index 51ef9f2..b9786c6 100644
--- a/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp
+++ b/test/reference/abstraction/the_autonomous_contract.ralph_amissah.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: the_autonomous_contract.ralph_amissah.sst
@source {
diff --git a/test/reference/abstraction/the_cathedral_and_the_bazaar.eric_s_raymond.en.ssp b/test/reference/abstraction/the_cathedral_and_the_bazaar.eric_s_raymond.en.ssp
index 41d4578..40f4dcb 100644
--- a/test/reference/abstraction/the_cathedral_and_the_bazaar.eric_s_raymond.en.ssp
+++ b/test/reference/abstraction/the_cathedral_and_the_bazaar.eric_s_raymond.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: the_cathedral_and_the_bazaar.eric_s_raymond.sst
@source {
diff --git a/test/reference/abstraction/the_public_domain.james_boyle.en.ssp b/test/reference/abstraction/the_public_domain.james_boyle.en.ssp
index 4345291..922119e 100644
--- a/test/reference/abstraction/the_public_domain.james_boyle.en.ssp
+++ b/test/reference/abstraction/the_public_domain.james_boyle.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: the_public_domain.james_boyle.sst
@source {
@@ -3036,6 +3036,18 @@
.lev4_subtoc: 5~ ┥Chapter 3: Further Reading┝┤#230├
| Chapter 3: The Second Enclosure Movement
+[0] poem
+.part: body
+.parent: 189
+.ocn_range: 190 191
+.ancestors: 1 0 0 0 189 0 0 0
+.ancestors_collapsed: 1 189 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: chapter_3
+.segment_epub_is: chapter_3
+
[190] verse
.part: body
.parent: 189
@@ -3077,15 +3089,6 @@
.segment_epub_is: chapter_3
| [Anon.]【84 Apart from being anonymous, this poem is extremely hard to date. It probably originates in the enclosure controversies of the eighteenth century. However, the earliest reference to it that I have been able to discover is from 1821. Edward Birch was moved to compose some (fairly poor) verses in response when he reported “seeing the following jeu d’esprit in a Handbill posted up in Plaistow, as a ‘CAUTION’ to prevent persons from supporting the intended inclosure of Hainault or Waltham Forest.” He then quotes a version of the poem. Edward Birch, Tickler Magazine 3 (February 1821), 45. In 1860, “Exon,” a staff writer for the journal Notes and Queries, declares that “the animosity excited against the Inclosure Acts and their authors . . . was almost without precedent: though fifty years and more have passed, the subject is still a sore one in many parishes. . . . I remember some years ago, in hunting over an old library discovering a box full of printed squibs, satires and ballads of the time against the acts and those who were supposed to favor them,—the library having belonged to a gentleman who played an active part on the opposition side.” “Exon,” “Ballads Against Inclosures,” Notes and Queries 9, 2nd series (February 1860): 130–131. He reports finding the poem in that box, and quotes a verse from it. The context of the article makes it appear that the poem itself must date from the late eighteenth century. In other sources, the poem is sometimes dated at 1764, and said to be in response to Sir Charles Pratt’s fencing of common land. See, e.g., Dana A. Freiburger, “John Thompson, English Philomath—A Question of Land Surveying and Astronomy,” n. 15, available at ┥http://www.nd.edu/~histast4/exhibits/papers/Freiburger/┝┤http://www.nd.edu/~histast4/exhibits/papers/Freiburger/├. This attribution is widespread and may well be true, but I have been able to discover no contemporary source material that sustains it. By the end of the nineteenth century, the poem was being quoted, sometimes with amusement and sometimes with agreement, on both sides of the Atlantic. See Ezra S. Carr, “Aids and Obstacles to Agriculture on the Pacific-Coast,” in The Patrons of Husbandry on the Pacific Coast (San Francisco: A. L. Bancroft and Co., 1875), 290–291; Edward P. Cheyney, An Introduction to the Industrial and Social History of England (New York: Macmillan, 1901), 219.】
-[191] poem
-.part: body
-.parent: 189
-.ancestors: 1 0 0 0 189 0 0 0
-.ancestors_collapsed: 1 189 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[192] para
.part: body
.parent: 189
@@ -7070,6 +7073,18 @@
.segment_epub_is: chapter_6
| The song was called “George Bush Doesn’t Care About Black People” (also referred to as “George Bush Doesn’t Like Black People”). Appropriately, given that Mr. West was the one to come up with the phrase, the song was built around Mr. West’s “Gold Digger.” Much of the melody was sampled directly from the recording of that song. Yet the words were very different. Where “Gold Digger” is about a predatory, sensual, and materialist woman who “take[s] my money when I’m in need” and is a “triflin’ friend indeed,” The Legendary K.O.’s song is a lyrical and profane condemnation of the response to Katrina by both the government and the media. Here is a sample:
+[0] poem
+.part: body
+.parent: 486
+.ocn_range: 502 502
+.ancestors: 1 0 0 0 486 0 0 0
+.ancestors_collapsed: 1 486 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: chapter_6
+.segment_epub_is: chapter_6
+
[502] verse
.part: body
.parent: 486
@@ -7097,15 +7112,6 @@
| George Bush don’t like black people
| George Bush don’t like black people
-[502] poem
-.part: body
-.parent: 486
-.ancestors: 1 0 0 0 486 0 0 0
-.ancestors_collapsed: 1 486 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[503] para
.part: body
.parent: 486
@@ -7227,30 +7233,33 @@
.segment_epub_is: chapter_6
| To secular ears, “Jesus Is All the World to Me” is a plodding piece of music with a mechanical, up-and-down melodic structure. It conjures up a bored (and white) church audience, trudging through the verses, a semitone flat, while thinking about Sunday lunch rather than salvation. It is about as far removed as one could be from the syncopated beat and amorous subject matter of “I Got a Woman.” The hymn was the product of Will Lamartine Thompson—a severe-looking fellow with a faint resemblance to an elderly Doc Holliday—who died in 1909 and is buried in the same place he was born, East Liverpool, Ohio. But the words have an earnestness to them that gives life to the otherwise uninspired verse.
-[512] verse
+[0] poem
.part: body
.parent: 504
+.ocn_range: 512 512
.ancestors: 1 0 0 0 486 504 0 0
.ancestors_collapsed: 1 486 504 0 0 0 0 0
.parent_lev: 5
.is_of_type: block
-.sha256: C6E65864895DE9E20666CC8F1ABB10692C2594D7227D5177E724C6F1EAE6F722
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: chapter_6
.segment_epub_is: chapter_6
-|
-| Jesus is all the world to me, my life, my joy, my all;
-| He is my strength from day to day, without Him I would fall.
-| When I am sad, to Him I go, no other one can cheer me so;
-| When I am sad, He makes me glad, He’s my Friend.
-[512] poem
+[512] verse
.part: body
.parent: 504
.ancestors: 1 0 0 0 486 504 0 0
.ancestors_collapsed: 1 486 504 0 0 0 0 0
.parent_lev: 5
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: C6E65864895DE9E20666CC8F1ABB10692C2594D7227D5177E724C6F1EAE6F722
+.segment_html_is: chapter_6
+.segment_epub_is: chapter_6
+|
+| Jesus is all the world to me, my life, my joy, my all;
+| He is my strength from day to day, without Him I would fall.
+| When I am sad, to Him I go, no other one can cheer me so;
+| When I am sad, He makes me glad, He’s my Friend.
[513] para
.part: body
@@ -7865,6 +7874,18 @@
.heading_ancestors_text: The Public Domain - Enclosing the Commons of the Mind James Boyle (2008)||||Chapter 6: I Got a Mashup|George Bush Doesn’t Care . . .||
| George Bush Doesn’t Care . . .
+[0] poem
+.part: body
+.parent: 561
+.ocn_range: 562 562
+.ancestors: 1 0 0 0 486 561 0 0
+.ancestors_collapsed: 1 486 561 0 0 0 0 0
+.parent_lev: 5
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: chapter_6
+.segment_epub_is: chapter_6
+
[562] verse
.part: body
.parent: 561
@@ -7895,15 +7916,6 @@
| George Bush ain’t a gold digger,
| but he ain’t f——ing with no broke n———s
-[562] poem
-.part: body
-.parent: 561
-.ancestors: 1 0 0 0 486 561 0 0
-.ancestors_collapsed: 1 486 561 0 0 0 0 0
-.parent_lev: 5
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[563] para
.part: body
.parent: 561
@@ -14143,6 +14155,17 @@
[0] endnote
.part: backmatter
+.parent: 191
+.ancestors: 1 970 0 0 0 0 0 0
+.ancestors_collapsed: 1 0 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: para
+.has: links
+.anchor_tag: note_84
+| ┥⑆^┨84.┣^┝┤¤chapter_3.fnSuffix#noteref_84├ Apart from being anonymous, this poem is extremely hard to date. It probably originates in the enclosure controversies of the eighteenth century. However, the earliest reference to it that I have been able to discover is from 1821. Edward Birch was moved to compose some (fairly poor) verses in response when he reported “seeing the following jeu d’esprit in a Handbill posted up in Plaistow, as a ‘CAUTION’ to prevent persons from supporting the intended inclosure of Hainault or Waltham Forest.” He then quotes a version of the poem. Edward Birch, Tickler Magazine 3 (February 1821), 45. In 1860, “Exon,” a staff writer for the journal Notes and Queries, declares that “the animosity excited against the Inclosure Acts and their authors . . . was almost without precedent: though fifty years and more have passed, the subject is still a sore one in many parishes. . . . I remember some years ago, in hunting over an old library discovering a box full of printed squibs, satires and ballads of the time against the acts and those who were supposed to favor them,—the library having belonged to a gentleman who played an active part on the opposition side.” “Exon,” “Ballads Against Inclosures,” Notes and Queries 9, 2nd series (February 1860): 130–131. He reports finding the poem in that box, and quotes a verse from it. The context of the article makes it appear that the poem itself must date from the late eighteenth century. In other sources, the poem is sometimes dated at 1764, and said to be in response to Sir Charles Pratt’s fencing of common land. See, e.g., Dana A. Freiburger, “John Thompson, English Philomath—A Question of Land Surveying and Astronomy,” n. 15, available at ┥http://www.nd.edu/~histast4/exhibits/papers/Freiburger/┝┤http://www.nd.edu/~histast4/exhibits/papers/Freiburger/├. This attribution is widespread and may well be true, but I have been able to discover no contemporary source material that sustains it. By the end of the nineteenth century, the poem was being quoted, sometimes with amusement and sometimes with agreement, on both sides of the Atlantic. See Ezra S. Carr, “Aids and Obstacles to Agriculture on the Pacific-Coast,” in The Patrons of Husbandry on the Pacific Coast (San Francisco: A. L. Bancroft and Co., 1875), 290–291; Edward P. Cheyney, An Introduction to the Industrial and Social History of England (New York: Macmillan, 1901), 219.
+
+[0] endnote
+.part: backmatter
.parent: 192
.ancestors: 1 970 0 0 0 0 0 0
.ancestors_collapsed: 1 0 0 0 0 0 0 0
diff --git a/test/reference/abstraction/the_wealth_of_networks.yochai_benkler.en.ssp b/test/reference/abstraction/the_wealth_of_networks.yochai_benkler.en.ssp
index b8e25ff..f6463d5 100644
--- a/test/reference/abstraction/the_wealth_of_networks.yochai_benkler.en.ssp
+++ b/test/reference/abstraction/the_wealth_of_networks.yochai_benkler.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: the_wealth_of_networks.yochai_benkler.sst
@source {
@@ -7663,6 +7663,18 @@
.lev4_subtoc: 5~ ┥A PARTICIPATORY CULTURE: TOWARD POLICY┝┤#531├
| Chapter 8 - Cultural Freedom: A Culture Both Plastic and Critical
+[0] poem
+.part: body
+.parent: 485
+.ocn_range: 486 488
+.ancestors: 1 251 0 0 485 0 0 0
+.ancestors_collapsed: 1 251 485 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: chapter_8
+.segment_epub_is: chapter_8
+
[486] verse
.part: body
.parent: 485
@@ -7704,14 +7716,17 @@
.segment_epub_is: chapter_8
| --MGM (1939) film adaptation of Margaret Mitchell's novel (1936)
-[488] poem
+[0] poem
.part: body
.parent: 485
+.ocn_range: 489 493
.ancestors: 1 251 0 0 485 0 0 0
.ancestors_collapsed: 1 251 485 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: chapter_8
+.segment_epub_is: chapter_8
[489] verse
.part: body
@@ -7784,15 +7799,6 @@
| --Billie Holiday (1939)
| from lyrics by Abel Meeropol (1937)
-[493] poem
-.part: body
-.parent: 485
-.ancestors: 1 251 0 0 485 0 0 0
-.ancestors_collapsed: 1 251 485 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[0] comment
.part: comment
.section: comment
diff --git a/test/reference/abstraction/through_the_looking_glass.lewis_carroll.en.ssp b/test/reference/abstraction/through_the_looking_glass.lewis_carroll.en.ssp
index a2aa1ea..8e66fa5 100644
--- a/test/reference/abstraction/through_the_looking_glass.lewis_carroll.en.ssp
+++ b/test/reference/abstraction/through_the_looking_glass.lewis_carroll.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: through_the_looking_glass.lewis_carroll.sst
@source {
@@ -651,6 +651,18 @@
.segment_epub_is: x1
| It was like this.
+[0] poem
+.part: body
+.parent: 2
+.ocn_range: 40 41
+.ancestors: 1 0 0 0 2 0 0 0
+.ancestors_collapsed: 1 2 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x1
+.segment_epub_is: x1
+
[40] verse
.part: body
.parent: 2
@@ -679,15 +691,6 @@
| ,sevogorob eht erew ysmim llA
| .ebargtuo shtar emom eht dnA
-[41] poem
-.part: body
-.parent: 2
-.ancestors: 1 0 0 0 2 0 0 0
-.ancestors_collapsed: 1 2 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[42] para
.part: body
.parent: 2
@@ -712,6 +715,18 @@
.segment_epub_is: x1
| This was the poem that Alice read.
+[0] poem
+.part: body
+.parent: 2
+.ocn_range: 44 51
+.ancestors: 1 0 0 0 2 0 0 0
+.ancestors_collapsed: 1 2 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x1
+.segment_epub_is: x1
+
[44] verse
.part: body
.parent: 2
@@ -830,15 +845,6 @@
| All mimsy were the borogoves,
| And the mome raths outgrabe.
-[51] poem
-.part: body
-.parent: 2
-.ancestors: 1 0 0 0 2 0 0 0
-.ancestors_collapsed: 1 2 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[52] para
.part: body
.parent: 2
@@ -3038,6 +3044,18 @@
.segment_epub_is: x4
| 'I'm sure I'm very sorry,' was all Alice could say; for the words of the old song kept ringing through her head like the ticking of a clock, and she could hardly help saying them out loud:--
+[0] poem
+.part: body
+.parent: 220
+.ocn_range: 226 227
+.ancestors: 1 0 0 0 220 0 0 0
+.ancestors_collapsed: 1 220 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x4
+.segment_epub_is: x4
+
[226] verse
.part: body
.parent: 220
@@ -3069,15 +3087,6 @@
| Which frightened both the heroes so,
| They quite forgot their quarrel.'
-[227] poem
-.part: body
-.parent: 220
-.ancestors: 1 0 0 0 220 0 0 0
-.ancestors_collapsed: 1 220 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[228] para
.part: body
.parent: 220
@@ -3342,6 +3351,18 @@
.segment_epub_is: x4
| Tweedledee smiled gently, and began again:
+[0] poem
+.part: body
+.parent: 220
+.ocn_range: 250 267
+.ancestors: 1 0 0 0 220 0 0 0
+.ancestors_collapsed: 1 220 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x4
+.segment_epub_is: x4
+
[250] verse
.part: body
.parent: 220
@@ -3649,15 +3670,6 @@
| And that was scarcely odd, because
| They'd eaten every one.'
-[267] poem
-.part: body
-.parent: 220
-.ancestors: 1 0 0 0 220 0 0 0
-.ancestors_collapsed: 1 220 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[268] para
.part: body
.parent: 220
@@ -5848,30 +5860,33 @@
.segment_epub_is: x6
| Alice didn't know what to say to this: it wasn't at all like conversation, she thought, as he never said anything to HER; in fact, his last remark was evidently addressed to a tree--so she stood and softly repeated to herself:--
-[442] verse
+[0] poem
.part: body
.parent: 434
+.ocn_range: 442 442
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 28552CD7D3AF55CD7FA72ABC7F9B32F9CE8F3835637BEE8FE3F84CD5C425F52C
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x6
.segment_epub_is: x6
-|
-| 'Humpty Dumpty sat on a wall:
-| Humpty Dumpty had a great fall.
-| All the King's horses and all the King's men
-| Couldn't put Humpty Dumpty in his place again.'
-[442] poem
+[442] verse
.part: body
.parent: 434
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 28552CD7D3AF55CD7FA72ABC7F9B32F9CE8F3835637BEE8FE3F84CD5C425F52C
+.segment_html_is: x6
+.segment_epub_is: x6
+|
+| 'Humpty Dumpty sat on a wall:
+| Humpty Dumpty had a great fall.
+| All the King's horses and all the King's men
+| Couldn't put Humpty Dumpty in his place again.'
[443] para
.part: body
@@ -6730,30 +6745,33 @@
.segment_epub_is: x6
| This sounded very hopeful, so Alice repeated the first verse:
-[514] verse
+[0] poem
.part: body
.parent: 434
+.ocn_range: 514 514
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 390FCF955557B10BAA341E845DA9E4529546325905F6D7CE7F368DC655A098DF
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x6
.segment_epub_is: x6
-|
-| 'Twas brillig, and the slithy toves
-| Did gyre and gimble in the wabe;
-| All mimsy were the borogoves,
-| And the mome raths outgrabe.
-[514] poem
+[514] verse
.part: body
.parent: 434
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 390FCF955557B10BAA341E845DA9E4529546325905F6D7CE7F368DC655A098DF
+.segment_html_is: x6
+.segment_epub_is: x6
+|
+| 'Twas brillig, and the slithy toves
+| Did gyre and gimble in the wabe;
+| All mimsy were the borogoves,
+| And the mome raths outgrabe.
[515] para
.part: body
@@ -7019,28 +7037,31 @@
.segment_epub_is: x6
| Alice felt that in that case she really OUGHT to listen to it, so she sat down, and said 'Thank you' rather sadly.
-[537] verse
+[0] poem
.part: body
.parent: 434
+.ocn_range: 537 537
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 46A354749390C648056A221C20D39F77A1F4349A72A0CE1187006D67ADE28E54
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x6
.segment_epub_is: x6
-|
-| 'In winter, when the fields are white,
-| I sing this song for your delight--
-[537] poem
+[537] verse
.part: body
.parent: 434
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 46A354749390C648056A221C20D39F77A1F4349A72A0CE1187006D67ADE28E54
+.segment_html_is: x6
+.segment_epub_is: x6
+|
+| 'In winter, when the fields are white,
+| I sing this song for your delight--
[538] para
.part: body
@@ -7078,28 +7099,31 @@
.segment_epub_is: x6
| 'If you can SEE whether I'm singing or not, you've sharper eyes than most.' Humpty Dumpty remarked severely. Alice was silent.
-[541] verse
+[0] poem
.part: body
.parent: 434
+.ocn_range: 541 541
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 8CB332C9723B502BEEDAF2D9CF5E3CC3C6A62A81FA7AB343FF65FABB30EE10DC
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x6
.segment_epub_is: x6
-|
-| 'In spring, when woods are getting green,
-| I'll try and tell you what I mean.'
-[541] poem
+[541] verse
.part: body
.parent: 434
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 8CB332C9723B502BEEDAF2D9CF5E3CC3C6A62A81FA7AB343FF65FABB30EE10DC
+.segment_html_is: x6
+.segment_epub_is: x6
+|
+| 'In spring, when woods are getting green,
+| I'll try and tell you what I mean.'
[542] para
.part: body
@@ -7113,30 +7137,33 @@
.segment_epub_is: x6
| 'Thank you very much,' said Alice.
-[543] verse
+[0] poem
.part: body
.parent: 434
+.ocn_range: 543 543
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 138140557815AF7AE6AEEF4A800D20015E1881C6C83E57B8B6F202871477AB14
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x6
.segment_epub_is: x6
-|
-| 'In summer, when the days are long,
-| Perhaps you'll understand the song:
-| In autumn, when the leaves are brown,
-| Take pen and ink, and write it down.'
-[543] poem
+[543] verse
.part: body
.parent: 434
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 138140557815AF7AE6AEEF4A800D20015E1881C6C83E57B8B6F202871477AB14
+.segment_html_is: x6
+.segment_epub_is: x6
+|
+| 'In summer, when the days are long,
+| Perhaps you'll understand the song:
+| In autumn, when the leaves are brown,
+| Take pen and ink, and write it down.'
[544] para
.part: body
@@ -7162,6 +7189,18 @@
.segment_epub_is: x6
| 'You needn't go on making remarks like that,' Humpty Dumpty said: 'they're not sensible, and they put me out.'
+[0] poem
+.part: body
+.parent: 434
+.ocn_range: 546 548
+.ancestors: 1 0 0 0 434 0 0 0
+.ancestors_collapsed: 1 434 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x6
+.segment_epub_is: x6
+
[546] verse
.part: body
.parent: 434
@@ -7202,15 +7241,6 @@
| The little fishes' answer was
| “We cannot do it, Sir, because--”'
-[548] poem
-.part: body
-.parent: 434
-.ancestors: 1 0 0 0 434 0 0 0
-.ancestors_collapsed: 1 434 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[549] para
.part: body
.parent: 434
@@ -7235,6 +7265,18 @@
.segment_epub_is: x6
| 'It gets easier further on,' Humpty Dumpty replied.
+[0] poem
+.part: body
+.parent: 434
+.ocn_range: 551 558
+.ancestors: 1 0 0 0 434 0 0 0
+.ancestors_collapsed: 1 434 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x6
+.segment_epub_is: x6
+
[551] verse
.part: body
.parent: 434
@@ -7340,26 +7382,29 @@
| I said it very loud and clear;
| I went and shouted in his ear.'
-[558] poem
+[559] para
.part: body
.parent: 434
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.is_of_type: para
+.sha256: E28C0A32E9FB42C44F9E245AC9B8C95CC2565A0758AF7EE7A457FF10C9D9F51B
+.segment_html_is: x6
+.segment_epub_is: x6
+| Humpty Dumpty raised his voice almost to a scream as he repeated this verse, and Alice thought with a shudder, 'I wouldn't have been the messenger for ANYTHING!'
-[559] para
+[0] poem
.part: body
.parent: 434
+.ocn_range: 560 564
.ancestors: 1 0 0 0 434 0 0 0
.ancestors_collapsed: 1 434 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: para
-.sha256: E28C0A32E9FB42C44F9E245AC9B8C95CC2565A0758AF7EE7A457FF10C9D9F51B
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x6
.segment_epub_is: x6
-| Humpty Dumpty raised his voice almost to a scream as he repeated this verse, and Alice thought with a shudder, 'I wouldn't have been the messenger for ANYTHING!'
[560] verse
.part: body
@@ -7427,15 +7472,6 @@
| And when I found the door was shut,
| I tried to turn the handle, but--'
-[564] poem
-.part: body
-.parent: 434
-.ancestors: 1 0 0 0 434 0 0 0
-.ancestors_collapsed: 1 434 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[565] para
.part: body
.parent: 434
@@ -8009,30 +8045,33 @@
.segment_epub_is: x7
| 'Yes, to be sure,' said the King: 'and the best of the joke is, that it's MY crown all the while! Let's run and see them.' And they trotted off, Alice repeating to herself, as she ran, the words of the old song:--
-[612] verse
+[0] poem
.part: body
.parent: 574
+.ocn_range: 612 612
.ancestors: 1 0 0 0 574 0 0 0
.ancestors_collapsed: 1 574 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: C127564E9F67795B2E5E7A97F5AAEEBBC0A4F48C72BCDB78721E75EC6F492102
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x7
.segment_epub_is: x7
-|
-| 'The Lion and the Unicorn were fighting for the crown:
-| The Lion beat the Unicorn all round the town.
-| Some gave them white bread, some gave them brown;
-| Some gave them plum-cake and drummed them out of town.'
-[612] poem
+[612] verse
.part: body
.parent: 574
.ancestors: 1 0 0 0 574 0 0 0
.ancestors_collapsed: 1 574 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: C127564E9F67795B2E5E7A97F5AAEEBBC0A4F48C72BCDB78721E75EC6F492102
+.segment_html_is: x7
+.segment_epub_is: x7
+|
+| 'The Lion and the Unicorn were fighting for the crown:
+| The Lion beat the Unicorn all round the town.
+| Some gave them white bread, some gave them brown;
+| Some gave them plum-cake and drummed them out of town.'
[613] para
.part: body
@@ -9885,6 +9924,18 @@
.segment_epub_is: x8
| 'But the tune ISN'T his own invention,' she said to herself: 'it's “I GIVE THEE ALL, I CAN NO MORE.”' She stood and listened very attentively, but no tears came into her eyes.
+[0] poem
+.part: body
+.parent: 669
+.ocn_range: 763 772
+.ancestors: 1 0 0 0 669 0 0 0
+.ancestors_collapsed: 1 669 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x8
+.segment_epub_is: x8
+
[763] verse
.part: body
.parent: 669
@@ -10079,15 +10130,6 @@
| That summer evening, long ago,
| A-sitting on a gate.'
-[772] poem
-.part: body
-.parent: 669
-.ancestors: 1 0 0 0 669 0 0 0
-.ancestors_collapsed: 1 669 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[773] para
.part: body
.parent: 669
@@ -11219,30 +11261,33 @@
.segment_epub_is: x9
| 'I must do it myself, then,' said the Red Queen, and she began:
-[863] verse
+[0] poem
.part: body
.parent: 781
+.ocn_range: 863 863
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: 4172A0924ECA86D3457FD9A9504FEAE1253AA4172FB3C575C258FBAC869D287B
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x9
.segment_epub_is: x9
-|
-| 'Hush-a-by lady, in Alice's lap!
-| Till the feast's ready, we've time for a nap:
-| When the feast's over, we'll go to the ball--
-| Red Queen, and White Queen, and Alice, and all!
-[863] poem
+[863] verse
.part: body
.parent: 781
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.sha256: 4172A0924ECA86D3457FD9A9504FEAE1253AA4172FB3C575C258FBAC869D287B
+.segment_html_is: x9
+.segment_epub_is: x9
+|
+| 'Hush-a-by lady, in Alice's lap!
+| Till the feast's ready, we've time for a nap:
+| When the feast's over, we'll go to the ball--
+| Red Queen, and White Queen, and Alice, and all!
[864] para
.part: body
@@ -11460,6 +11505,18 @@
.segment_epub_is: x9
| At this moment the door was flung open, and a shrill voice was heard singing:
+[0] poem
+.part: body
+.parent: 781
+.ocn_range: 882 882
+.ancestors: 1 0 0 0 781 0 0 0
+.ancestors_collapsed: 1 781 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x9
+.segment_epub_is: x9
+
[882] verse
.part: body
.parent: 781
@@ -11476,26 +11533,29 @@
| Let the Looking-Glass creatures, whatever they be,
| Come and dine with the Red Queen, the White Queen, and me."'
-[882] poem
+[883] para
.part: body
.parent: 781
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.is_of_type: para
+.sha256: F0E54FF1CBEF22042904C1FA6D936C484F3EE3E1F57FC44D5D56A31075E4BA95
+.segment_html_is: x9
+.segment_epub_is: x9
+| And hundreds of voices joined in the chorus:
-[883] para
+[0] poem
.part: body
.parent: 781
+.ocn_range: 884 884
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: para
-.sha256: F0E54FF1CBEF22042904C1FA6D936C484F3EE3E1F57FC44D5D56A31075E4BA95
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x9
.segment_epub_is: x9
-| And hundreds of voices joined in the chorus:
[884] verse
.part: body
@@ -11513,26 +11573,29 @@
| Put cats in the coffee, and mice in the tea--
| And welcome Queen Alice with thirty-times-three!'
-[884] poem
+[885] para
.part: body
.parent: 781
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.is_of_type: para
+.sha256: A1E794052D17374FD45F50A1B85261D54D718F91CD9262734F9BF0D166FB2532
+.segment_html_is: x9
+.segment_epub_is: x9
+| Then followed a confused noise of cheering, and Alice thought to herself, 'Thirty times three makes ninety. I wonder if any one's counting?' In a minute there was silence again, and the same shrill voice sang another verse;
-[885] para
+[0] poem
.part: body
.parent: 781
+.ocn_range: 886 886
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: para
-.sha256: A1E794052D17374FD45F50A1B85261D54D718F91CD9262734F9BF0D166FB2532
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x9
.segment_epub_is: x9
-| Then followed a confused noise of cheering, and Alice thought to herself, 'Thirty times three makes ninety. I wonder if any one's counting?' In a minute there was silence again, and the same shrill voice sang another verse;
[886] verse
.part: body
@@ -11550,26 +11613,29 @@
| 'Tis a privilege high to have dinner and tea
| Along with the Red Queen, the White Queen, and me!"'
-[886] poem
+[887] para
.part: body
.parent: 781
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.is_of_type: para
+.sha256: 235D8C05B19D55DC41038C17FFAA579EA1BCC417E006F978D544F0C10B876D07
+.segment_html_is: x9
+.segment_epub_is: x9
+| Then came the chorus again:--
-[887] para
+[0] poem
.part: body
.parent: 781
+.ocn_range: 888 888
.ancestors: 1 0 0 0 781 0 0 0
.ancestors_collapsed: 1 781 0 0 0 0 0 0
.parent_lev: 4
-.is_of_type: para
-.sha256: 235D8C05B19D55DC41038C17FFAA579EA1BCC417E006F978D544F0C10B876D07
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
.segment_html_is: x9
.segment_epub_is: x9
-| Then came the chorus again:--
[888] verse
.part: body
@@ -11587,15 +11653,6 @@
| Mix sand with the cider, and wool with the wine--
| And welcome Queen Alice with ninety-times-nine!'
-[888] poem
-.part: body
-.parent: 781
-.ancestors: 1 0 0 0 781 0 0 0
-.ancestors_collapsed: 1 781 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[889] para
.part: body
.parent: 781
@@ -11812,6 +11869,18 @@
.segment_epub_is: x9
| The White Queen laughed with delight, and stroked Alice's cheek. Then she began:
+[0] poem
+.part: body
+.parent: 781
+.ocn_range: 907 910
+.ancestors: 1 0 0 0 781 0 0 0
+.ancestors_collapsed: 1 781 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x9
+.segment_epub_is: x9
+
[907] verse
.part: body
.parent: 781
@@ -11873,15 +11942,6 @@
| Which is easiest to do,
| Un-dish-cover the fish, or dishcover the riddle?'
-[910] poem
-.part: body
-.parent: 781
-.ancestors: 1 0 0 0 781 0 0 0
-.ancestors_collapsed: 1 781 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[911] para
.part: body
.parent: 781
@@ -12280,6 +12340,18 @@
.segment_epub_is: x12
| Which do YOU think it was?
+[0] poem
+.part: body
+.parent: 930
+.ocn_range: 942 948
+.ancestors: 1 0 0 0 930 0 0 0
+.ancestors_collapsed: 1 930 0 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x12
+.segment_epub_is: x12
+
[942] verse
.part: body
.parent: 930
@@ -12379,15 +12451,6 @@
| Lingering in the golden gleam--
| Life, what is it but a dream?
-[948] poem
-.part: body
-.parent: 930
-.ancestors: 1 0 0 0 930 0 0 0
-.ancestors_collapsed: 1 930 0 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[949] para
.part: body
.parent: 930
diff --git a/test/reference/abstraction/two_bits.christopher_kelty.en.ssp b/test/reference/abstraction/two_bits.christopher_kelty.en.ssp
index 3ee3ec2..55072cb 100644
--- a/test/reference/abstraction/two_bits.christopher_kelty.en.ssp
+++ b/test/reference/abstraction/two_bits.christopher_kelty.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: two_bits.christopher_kelty.sst
@source {
diff --git a/test/reference/abstraction/viral_spiral.david_bollier.en.ssp b/test/reference/abstraction/viral_spiral.david_bollier.en.ssp
index 0179586..95f76bf 100644
--- a/test/reference/abstraction/viral_spiral.david_bollier.en.ssp
+++ b/test/reference/abstraction/viral_spiral.david_bollier.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: viral_spiral.david_bollier.sst
@source {
diff --git a/test/reference/abstraction/war_and_peace.leo_tolstoy.en.ssp b/test/reference/abstraction/war_and_peace.leo_tolstoy.en.ssp
index 9efe425..ba1572b 100644
--- a/test/reference/abstraction/war_and_peace.leo_tolstoy.en.ssp
+++ b/test/reference/abstraction/war_and_peace.leo_tolstoy.en.ssp
@@ -1,4 +1,4 @@
-% SiSU Document Abstraction v2.0
+% SiSU Document Abstraction v2.1
% Source: war_and_peace.leo_tolstoy.sst
@source {
@@ -12228,6 +12228,18 @@
.segment_epub_is: x20
| Sonya, shaking off some down which clung to her and tucking away the verses in the bosom of her dress close to her bony little chest, ran after Natasha down the passage into the sitting room with flushed face and light, joyous steps. At the visitors' request the young people sang the quartette, “The Brook,” with which everyone was delighted. Then Nicholas sang a song he had just learned:
+[0] poem
+.part: body
+.parent: 713
+.ocn_range: 740 742
+.ancestors: 1 2 0 0 713 0 0 0
+.ancestors_collapsed: 1 2 713 0 0 0 0 0
+.parent_lev: 4
+.is_of_type: block
+.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
+.segment_html_is: x20
+.segment_epub_is: x20
+
[740] verse
.part: body
.parent: 713
@@ -12272,15 +12284,6 @@
| A day or two, then bliss unspoilt,
| But oh! till then I cannot live!...
-[742] poem
-.part: body
-.parent: 713
-.ancestors: 1 2 0 0 713 0 0 0
-.ancestors_collapsed: 1 2 713 0 0 0 0 0
-.parent_lev: 4
-.is_of_type: block
-.sha256: E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855
-
[743] para
.part: body
.parent: 713