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; | 
