aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sisudoc
diff options
context:
space:
mode:
Diffstat (limited to 'src/sisudoc')
-rw-r--r--src/sisudoc/ocda/abstraction/ssp.d11
-rw-r--r--src/sisudoc/ocda/abstraction/ssp_in.d19
-rw-r--r--src/sisudoc/outputs/io_out/create_abstraction_db.d9
-rw-r--r--src/sisudoc/spine.d20
4 files changed, 49 insertions, 10 deletions
diff --git a/src/sisudoc/ocda/abstraction/ssp.d b/src/sisudoc/ocda/abstraction/ssp.d
index 6aa55c2..3e80956 100644
--- a/src/sisudoc/ocda/abstraction/ssp.d
+++ b/src/sisudoc/ocda/abstraction/ssp.d
@@ -414,7 +414,11 @@ template spineAbstractionTxt() {
import std.string;
import std.array;
mixin sspObjectRecord;
- void spineAbstractionTxt(D)(D doc) {
+ /+ ↓ the whole .ssp for a document, as lines. the file writer below emits
+ these, and the abstraction db is built by reading them back, so the
+ database cannot carry anything the .ssp does not
+ +/
+ string[] sspDocumentLines(D)(D doc) {
auto doc_abstraction = doc.abstraction;
auto doc_matters = doc.matters;
string[] output;
@@ -556,6 +560,11 @@ template spineAbstractionTxt() {
output ~= "}";
output ~= "";
}
+ return output;
+ }
+ void spineAbstractionTxt(D)(D doc) {
+ auto doc_matters = doc.matters;
+ string[] output = sspDocumentLines(doc);
/+ ↓ write to file +/
/+ path: <output_path>/<language>/abstraction/<doc_uid_out>.ssp +/
string out_root = (doc_matters.output_path.length > 0)
diff --git a/src/sisudoc/ocda/abstraction/ssp_in.d b/src/sisudoc/ocda/abstraction/ssp_in.d
index f0fb963..220bfe3 100644
--- a/src/sisudoc/ocda/abstraction/ssp_in.d
+++ b/src/sisudoc/ocda/abstraction/ssp_in.d
@@ -198,11 +198,16 @@ template spineAbstractionRead() {
obj.metainfo.identifier = _tail[_sp + 1 .. $];
} else {
obj.metainfo.heading_lev_markup = _levOfMarkedUp(_tail);
- obj.metainfo.identifier = obj.metainfo.ocn.to!string;
+ /+ ↓ omitted means it equals the ocn, and for an object with no ocn
+ it was empty: "a"~N identifiers are always written
+ +/
+ obj.metainfo.identifier = (obj.metainfo.ocn != 0)
+ ? obj.metainfo.ocn.to!string : "";
}
} else {
obj.metainfo.is_a = _rest;
- obj.metainfo.identifier = obj.metainfo.ocn.to!string;
+ obj.metainfo.identifier = (obj.metainfo.ocn != 0)
+ ? obj.metainfo.ocn.to!string : "";
}
obj.metainfo.is_of_section = section;
continue;
@@ -327,6 +332,16 @@ template spineAbstractionRead() {
}
return doc;
}
+ /+ ↓ the abstraction as it survives a trip through the .ssp text: emitted
+ as lines by the writer, read straight back. what a consumer built
+ from this cannot see, the .ssp does not carry, which is what makes a
+ second artefact built from it unable to drift
+ +/
+ auto sspRoundTripAbstraction(D)(D doc) {
+ import sisudoc.ocda.abstraction.ssp;
+ mixin spineAbstractionTxt;
+ return sspRead(sspDocumentLines(doc)).abstraction;
+ }
SSPdocument sspReadFile(string file_path) {
string[] _lines;
try {
diff --git a/src/sisudoc/outputs/io_out/create_abstraction_db.d b/src/sisudoc/outputs/io_out/create_abstraction_db.d
index 3a6a85e..cc90cb3 100644
--- a/src/sisudoc/outputs/io_out/create_abstraction_db.d
+++ b/src/sisudoc/outputs/io_out/create_abstraction_db.d
@@ -60,9 +60,12 @@ template spineAbstractionDb() {
import std.array;
import d2sqlite3;
import sisudoc.outputs.io_out.paths_output;
-
- void spineAbstractionDb(D)(D doc) {
- auto doc_abstraction = doc.abstraction;
+ /+ ↓ the abstraction is passed in rather than taken from doc, because the
+ caller hands over one that has been through the .ssp: written as text
+ and read back. so the database is a function of the .ssp and cannot
+ carry anything the .ssp does not
+ +/
+ void spineAbstractionDb(D,A)(D doc, A doc_abstraction) {
auto doc_matters = doc.matters;
/+ ↓ determine output path +/
diff --git a/src/sisudoc/spine.d b/src/sisudoc/spine.d
index 4bf714d..4695c60 100644
--- a/src/sisudoc/spine.d
+++ b/src/sisudoc/spine.d
@@ -1417,10 +1417,16 @@ string program_name = "spine";
import sisudoc.ocda.abstraction.ssp;
spineAbstractionTxt!()(doc);
}
- /+ ↓ document abstraction sqlite database +/
+ /+ ↓ document abstraction sqlite database, built from the .ssp: the
+ lines are emitted and read straight back, and the objects that
+ come out are what is written, so the database cannot carry
+ anything the .ssp does not
+ +/
if (doc.matters.opt.action.show_abstraction_db) {
+ import sisudoc.ocda.abstraction.ssp_in;
import sisudoc.outputs.io_out.create_abstraction_db;
- spineAbstractionDb!()(doc);
+ mixin spineAbstractionRead;
+ spineAbstractionDb!()(doc, sspRoundTripAbstraction(doc));
}
if (doc.matters.opt.action.curate) {
auto _hvst = spineMetaDocCurate!()(doc.matters, hvst);
@@ -1526,10 +1532,16 @@ string program_name = "spine";
import sisudoc.ocda.abstraction.ssp;
spineAbstractionTxt!()(doc);
}
- /+ ↓ document abstraction sqlite database +/
+ /+ ↓ document abstraction sqlite database, built from the .ssp: the
+ lines are emitted and read straight back, and the objects that
+ come out are what is written, so the database cannot carry
+ anything the .ssp does not
+ +/
if (doc.matters.opt.action.show_abstraction_db) {
+ import sisudoc.ocda.abstraction.ssp_in;
import sisudoc.outputs.io_out.create_abstraction_db;
- spineAbstractionDb!()(doc);
+ mixin spineAbstractionRead;
+ spineAbstractionDb!()(doc, sspRoundTripAbstraction(doc));
}
if (doc.matters.opt.action.curate) {
auto _hvst = spineMetaDocCurate!()(doc.matters, hvst);