diff options
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/sdp.d | 196 | ||||
-rw-r--r-- | lib/sdp/ao_abstract_doc_source.d | 4 | ||||
-rw-r--r-- | lib/sdp/ao_defaults.d | 4 | ||||
-rw-r--r-- | lib/sdp/ao_rgx.d | 4 | ||||
-rw-r--r-- | lib/sdp/ao_scan_inserts.d | 32 |
5 files changed, 219 insertions, 21 deletions
diff --git a/lib/sdp.d b/lib/sdp.d new file mode 100755 index 0000000..7f94128 --- /dev/null +++ b/lib/sdp.d @@ -0,0 +1,196 @@ +#!/usr/bin/env rdmd + +/* + sdp + sdp.d +*/ +/+ sdp sisu document parser +/ +import + std.algorithm, + std.array, + std.container, + std.file, + std.exception, + std.json, + // std.path, + std.process, + std.range, + std.regex, + std.stdio, + std.string, + std.traits, + std.typecons, + std.utf, + // std.variant, + lib.sdp.ao_abstract_doc_source, // sdp/ao_abstract_doc_source.d + lib.sdp.ao_assertions, // sdp/ao_assertions.d + lib.sdp.ao_defaults, // sdp/ao_defaults.d + lib.sdp.ao_emitter, // sdp/ao_emitter.d + lib.sdp.ao_interface, // sdp/ao_interface.d + lib.sdp.ao_markup_source_raw, // sdp/ao_markup_source_raw.d + lib.sdp.ao_object_setter, // sdp/ao_object_setter.d + lib.sdp.ao_output_debugs, // sdp/ao_output_debugs.d + lib.sdp.ao_rgx, // sdp/ao_rgx.d + lib.sdp.ao_scan_inserts, // sdp/ao_scan_inserts.d + lib.sdp.ao_utils; // sdp/ao_utils.d + // std.conv; +import std.conv : to; +mixin RgxInit; mixin Interfaces; mixin Emitters; +void main(string[] argv) { + mixin SiSUheader; + mixin SiSUbiblio; + mixin SiSUrgxInitFlags; + mixin SiSUmarkupRaw; + mixin SiSUdocInserts; + mixin SiSUdocAbstraction; + mixin SiSUoutputDebugs; + mixin ScreenTxtColors; + auto cli = new CLI(); + auto raw = new MarkupRaw(); + auto abs = new Abstraction(); + auto dbg = new SDPoutputDebugs(); + // struct DocumentParts { + // string[string][] contents; + // JSONValue[string] metadata_json; + // JSONValue[string] make_json; + // string[][string][string] bookindex_unordered_hashes; + // JSONValue[] biblio; + // } + char[][] msc; + string[1000] fns_src; + string flag_action; + string[string] actions; + int file_count; + actions = [ + "assert" : "yes", + ]; + auto rgx = new Rgx(); + scope(success) { + debug(checkdoc) { + writeln( + scr_txt_color["cyan"], + "~ run complete, ok ~ ", + scr_txt_color["off"], + ); + } + // writeln("0"); + } + scope(failure) { + debug(checkdoc) { + writeln( + scr_txt_color["fuchsia"], + "~ run failure ~", + scr_txt_color["off"], + ); + } + // writeln("1"); + } + foreach(cmdlnins; argv) { + if (match(cmdlnins, rgx.flag_action)) { + flag_action ~= " " ~ cmdlnins; + actions = cli.extract_actions(cmdlnins, actions); + } else if (match(cmdlnins, rgx.src_pth)) { + fns_src[file_count] = cmdlnins; + file_count++; + } + } + foreach(fn_src; fns_src) { + if (!empty(fn_src)) { + scope(success) { + debug(checkdoc) { + writeln( + scr_txt_color["green"], + "~ document complete, ok ~ ", + scr_txt_color["off"], + fn_src + ); + } + // writeln("0"); + } + scope(failure) { + debug(checkdoc) { + writeln( + scr_txt_color["red"], + "~ document run failure ~", + scr_txt_color["off"], + fn_src + ); + } + // writeln("1"); + } + enforce( + match(fn_src, rgx.src_pth), + "not a sisu markup filename" + ); + auto markup_sourcefile_content = + raw.markupSourceContentRawLineArray(fn_src); // alternative call + // raw.markupSourceLineArray(raw.markupSourceString(fn_src)); // alternative calls (milliseconds faster?) + debug(insert) { + string[string] sysenv; + sysenv["pwd"] = shell("pwd"); + writeln(sysenv["pwd"]); + auto m = match(fn_src, rgx.src_pth); + // auto m = match(fn_src, rgx.src_pth); + auto markup_src_file_path = m.captures[1]; + writeln("markup source file path: ", markup_src_file_path); // writeln(m.captures[1]); + writeln(m.captures[2]); + } + if (match(fn_src, rgx.src_fn_master)) { + /+ if master file scan document source for document imports (inserted sub-documents) +/ + auto ins = new Inserts(); + auto markup_master_sourcefile_content = + ins.scan_doc_source(markup_sourcefile_content, fn_src); + msc = markup_master_sourcefile_content; + } else if (match(fn_src, rgx.src_fn)) { + msc = markup_sourcefile_content; + } else { + writeln("not a recognized filename"); + } + debug(raw) { + foreach (line; msc) { + writeln(line); + } + } + /+ process document ao_abstract_doc_source SiSUdocAbstraction::Abstraction return abstraction as tuple +/ + auto t = + abs.abstract_doc_source(msc); + static assert(!isTypeTuple!(t)); + auto contents = t[0]; + // static assert(!isIterable!(contents)); + auto metadata_json = t[1]; + auto make_json = t[2]; + auto bookindex_unordered_hashes = t[3]; + auto biblio = t[4]; + // destroy(t); + // DocumentParts + debug(checkdoc) { + dbg.abstract_doc_source_debugs( + contents, + make_json, + metadata_json, + bookindex_unordered_hashes, + biblio, + fn_src, + actions + ); + } + // compose abstract document markup state + // append book index + scope(exit) { + destroy(msc); + destroy(t); + destroy(contents); + destroy(make_json); + destroy(metadata_json); + destroy(bookindex_unordered_hashes); + destroy(fn_src); + destroy(biblio); + } + } else { + /* no recognized filename provided */ + writeln("no recognized filename"); + break; + // terminate, stop + } + } +} diff --git a/lib/sdp/ao_abstract_doc_source.d b/lib/sdp/ao_abstract_doc_source.d index 303011b..941c3f0 100644 --- a/lib/sdp/ao_abstract_doc_source.d +++ b/lib/sdp/ao_abstract_doc_source.d @@ -6,7 +6,7 @@ mixin template SiSUdocAbstraction() { class Abstraction { /* abstract marked up document */ auto abstract_doc_source(char[][] markup_sourcefile_content) { - /* initialize */ + /+ initialize +/ mixin ObjectSetters; mixin AssertionsOnMarkupDocumentStructure; mixin AssertionsOnBlocks; @@ -23,7 +23,7 @@ mixin template SiSUdocAbstraction() { string[1024] biblio_arr_json = biblio_entry_tags_jsonstr; JSONValue[1024] bib_arr_json; uint[string] line_occur; - int counter, previous_count, count_biblio_entry, ocn, ocn_, verse_line, bib_entry, heading_pointer, notepoint; + uint counter, previous_count, count_biblio_entry, ocn, ocn_, verse_line, bib_entry, heading_pointer, notepoint; string indent_first, indent_second; string[][string][string] bookindex_unordered_hashes; bool bullet = true; diff --git a/lib/sdp/ao_defaults.d b/lib/sdp/ao_defaults.d index 6599e69..50c1b09 100644 --- a/lib/sdp/ao_defaults.d +++ b/lib/sdp/ao_defaults.d @@ -75,7 +75,7 @@ template SiSUheader() { }, "links": { } - }`; + }`; // links auto pointer_head_main = [ "creator", @@ -228,7 +228,7 @@ template SiSUbiblio() { "note" : "", "short_name" : "", "id" : "" - }`; + }`; // is: book, article, magazine, newspaper, blog, other auto biblio_tag_map = [ "au" : "author_raw", "ed" : "editor_raw", diff --git a/lib/sdp/ao_rgx.d b/lib/sdp/ao_rgx.d index 21101b5..7050d25 100644 --- a/lib/sdp/ao_rgx.d +++ b/lib/sdp/ao_rgx.d @@ -27,8 +27,10 @@ mixin template RgxInit() { static levels_numbered_headings = ctRegex!(`^[0-7]$`); /* insert markup file */ static insert_src_fn_ssi_or_sst = ctRegex!(`^<<\s*(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[ti])$`); - /* header & comments */ + // static insert_ssi_or_sst_fn = ctRegex!(`^<<\s*[a-zA-Z0-9._-]+[.]ss[ti]`); + /* comments */ static comment = ctRegex!(`^%+ `); + /* header */ static header = ctRegex!(`^@([a-z_]+):(?:\s|$)`); static header_make = ctRegex!(`^@(make):(?:\s|$)`); static header_metadata = ctRegex!(`^@([a-z_]+):(?:\s|$)`); diff --git a/lib/sdp/ao_scan_inserts.d b/lib/sdp/ao_scan_inserts.d index ab705eb..54abb8f 100644 --- a/lib/sdp/ao_scan_inserts.d +++ b/lib/sdp/ao_scan_inserts.d @@ -1,7 +1,7 @@ -/* +/+ inserts ao_inserts.d -*/ ++/ mixin template SiSUdocInserts() { class Inserts { auto scan_subdoc_source( @@ -87,8 +87,8 @@ mixin template SiSUdocInserts() { markup_sourcesubfile_insert_content.length ); } - auto ins = new Inserts(); - /* + auto ins = new Inserts(); + /+ 1. load file, 2. read lines; 3. scan lines, @@ -96,7 +96,7 @@ mixin template SiSUdocInserts() { 5. repeat 1 6. else 7. add line to new array; - */ + +/ } else { ft1["header_make"] = 0; ft1["header_metadata"] = 0; @@ -192,16 +192,16 @@ mixin template SiSUdocInserts() { markup_sourcefile_insert_content.length ); } - auto ins = new Inserts(); - auto t = ins.scan_subdoc_source( - markup_sourcefile_insert_content, to!string(fn_src_insert), add - ); - static assert(!isTypeTuple!(t)); - auto tmparr = t[0]; - auto addsub = t[1]; - cont_arbitrary_max_length_set[add .. addsub-1] = tmparr[0 .. $-1]; - add=addsub; - /* + auto ins = new Inserts(); + auto t = ins.scan_subdoc_source( + markup_sourcefile_insert_content, to!string(fn_src_insert), add + ); + static assert(!isTypeTuple!(t)); + auto tmparr = t[0]; + auto addsub = t[1]; + cont_arbitrary_max_length_set[add .. addsub-1] = tmparr[0 .. $-1]; + add=addsub; + /+ 1. load file, 2. read lines; 3. scan lines, @@ -209,7 +209,7 @@ mixin template SiSUdocInserts() { 5. repeat 1 6. else 7. add line to new array; - */ + +/ } else { ft["header_make"] = 0; ft["header_metadata"] = 0; |