diff options
Diffstat (limited to 'lib/sdp.d')
-rwxr-xr-x | lib/sdp.d | 196 |
1 files changed, 196 insertions, 0 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 + } + } +} |