diff options
| author | Ralph Amissah <ralph@amissah.com> | 2016-06-25 06:37:22 -0400 | 
|---|---|---|
| committer | Ralph Amissah <ralph@amissah.com> | 2019-04-04 14:48:18 -0400 | 
| commit | f0c845eba3718fd0c732aebf25eb33e689798e03 (patch) | |
| tree | c2ea36e199950647b1d3cce153691bb8f4fec378 /src | |
| parent | step5.1 headers sdlang (like native headers) converted to json for common int... (diff) | |
step6 headers (&config), native & sdlang to json internally
Diffstat (limited to 'src')
| -rwxr-xr-x | src/sdp.d | 57 | ||||
| -rw-r--r-- | src/sdp/ao_abstract_doc_source.d | 121 | ||||
| -rw-r--r-- | src/sdp/ao_defaults.d | 2 | ||||
| -rw-r--r-- | src/sdp/ao_header_extract.d | 1312 | ||||
| -rw-r--r-- | src/sdp/ao_header_extract_native.d | 320 | ||||
| -rw-r--r-- | src/sdp/ao_header_extract_sdlang.d | 516 | ||||
| -rw-r--r-- | src/sdp/ao_output_debugs.d | 154 | ||||
| -rw-r--r-- | src/sdp/ao_read_config_files.d | 56 | ||||
| -rw-r--r-- | src/sdp/ao_read_source_files.d | 7 | 
9 files changed, 1182 insertions, 1363 deletions
| @@ -9,6 +9,8 @@ import    ao_abstract_doc_source,     // sdp/ao_abstract_doc_source.d    ao_defaults,                // sdp/ao_defaults.d    ao_header_extract,          // sdp/ao_header_extract.d +  ao_header_extract_native,   // sdp/ao_header_extract_native.d +  ao_header_extract_sdlang,   // sdp/ao_header_extract_sdlang.d    ao_read_config_files,       // sdp/ao_read_config_files.d    ao_read_source_files,       // sdp/ao_read_source_files.d    ao_output_debugs,           // sdp/ao_output_debugs.d @@ -18,9 +20,6 @@ import    // std.conv;  /+ sdlang http://sdlang.org +/  import sdlang;                            // sdlang.d -  // sdlang.parser,                       // sdlang/parser.d -  // sdlang.exceptions;                   // sdp/ao_ansi_colors.d -  // // std.conv;  /+ sdp  sisu document parser +/  private import    std.getopt, @@ -98,20 +97,18 @@ mixin CompileTimeInfo;  mixin RgxInit;  void main(string[] args) { -  mixin SiSUheaderSkel; -  mixin SiSUheaderExtractNative; -  mixin SiSUheaderExtractSDLang; +  mixin SiSUheaderRegister; +  mixin SiSUheaderExtractHub;    mixin SiSUbiblio;    mixin SiSUrgxInitFlags; -  mixin SiSUconfiguration; +  mixin SiSUconfigSDLangHub;    mixin SiSUmarkupRaw;    mixin SiSUdocAbstraction;    mixin SiSUoutputDebugs;    mixin SiSUoutputHub;    mixin ScreenTxtColors;    auto raw = MarkupRaw(); -  auto head_native = HeaderDocMetadataAndMakeNativeToJson(); -  auto headsdl = HeaderExtractSDL(); +  auto head = HeaderDocMetadataAndMake();    auto abs = Abstraction();    auto dbg = SDPoutputDebugs();    auto output = SDPoutput(); @@ -208,34 +205,9 @@ void main(string[] args) {        arg_unrecognized ~= " " ~ arg;      }    } -  auto conf = Config(); -  auto configuration = conf.readInConfigFile(); -  /+ sdlang config +/ -  Tag sdl_root_conf; -  try { -    sdl_root_conf = parseSource(configuration); -  } -  catch(SDLangParseException e) { -    stderr.writeln("SDLang problem with config.sdl content"); -    // Error messages of the form: -    // myFile.sdl(5:28): Error: Invalid integer suffix. -    stderr.writeln(e.msg); -  } -  debug(sdlang) { -    // Value is a std.variant.Algebraic -    Value output_dir_structure_by = sdl_root_conf.tags["output_dir_structure_by"][0].values[0]; -    assert(output_dir_structure_by.type == typeid(string)); -    writeln(output_dir_structure_by); -   -    // Tag person = sdl_root_conf.namespaces["myNamespace"].tags["person"][0]; -    // writeln("Name: ", person.attributes["name"][0].value); -    // -    // int age = person.tags["age"][0].values[0].get!int(); -    // writeln("Age: ", age); -   -    writeln("config SDL:"); -    writeln(sdl_root_conf.toSDLDocument()); -  } +  auto conf = ConfigHub(); +  auto sdl_root_configuration = conf.configSDLang("conf.sdl"); +  auto sdl_root_document_make = conf.configSDLang("sisu_document_make");    foreach(fn_src; fns_src) {    // foreach(fn_src; fns_src) {      if (!empty(fn_src)) { @@ -270,15 +242,12 @@ void main(string[] args) {          writeln(header_and_content_tuple.length);          writeln(sourcefile_content[0]);        } -      // Tuple!(JSONValue[string], JSONValue[string]) header_make_and_meta_tuple; -      auto header_make_and_meta_tuple = (match(header, rgx.native_header_meta_title)) -      ? (head_native.headerContentJSON(header)) -      : (headsdl.headerSDLangToJSON(header)); +      auto header_make_and_meta_tuple = head.headerContentJSON(header);        static assert(!isTypeTuple!(header_make_and_meta_tuple));        JSONValue[string] dochead_make_json = header_make_and_meta_tuple[0];        JSONValue[string] dochead_meta_json = header_make_and_meta_tuple[1];        /+ ↓ process document, return abstraction as tuple +/ -      auto t = abs.abstract_doc_source(sourcefile_content); +      auto t = abs.abstract_doc_source(sourcefile_content, dochead_make_json, dochead_meta_json);        static assert(!isTypeTuple!(t));        auto doc_ao_contents = t[0]; // contents ~ endnotes ~ bookindex;        // static assert(!isIterable!(doc_ao_contents)); @@ -291,8 +260,8 @@ void main(string[] args) {            doc_ao_contents,            doc_ao_bookindex_unordered_hashes,            doc_ao_biblio, -          // doc_ao_make_json, -          // doc_ao_metadata_json, +          dochead_make_json, +          dochead_meta_json,            fn_src,            opt_action_bool          ); diff --git a/src/sdp/ao_abstract_doc_source.d b/src/sdp/ao_abstract_doc_source.d index aca4944..8c19bf3 100644 --- a/src/sdp/ao_abstract_doc_source.d +++ b/src/sdp/ao_abstract_doc_source.d @@ -120,8 +120,11 @@ template SiSUdocAbstraction() {      // mixin SiSUdocAbstractionFunctions;      /+ ↓ abstract marked up document +/ -    auto abstract_doc_source(char[][] markup_sourcefile_content) { - +    auto abstract_doc_source( +      char[][] markup_sourcefile_content, +      JSONValue[string] dochead_make_json, +      JSONValue[string] dochead_meta_json +    ) {        /+ ↓ abstraction init +/        scope(success) {        } @@ -338,24 +341,24 @@ template SiSUdocAbstraction() {                  && ((type["para"] == State.off)                  && (type["heading"] == State.off))) {                    /+ heading or para but neither flag nor line exists +/ -                  // if ((to!string(dochead_make_json["make"]["headings"]).length > 2) -                  // && (type["make_headings"] == State.off)) { -                  //   /+ heading found +/ -                  //   auto dochead_make_headings = -                  //     to!string(dochead_make_json["make"]["headings"]); -                  //   heading_found(line, dochead_make_headings, heading_match_str, heading_match_rgx, type); -                  // } +                  if ((to!string(dochead_make_json["make"]["headings"]).length > 2) +                  && (type["make_headings"] == State.off)) { +                    /+ heading found +/ +                    auto dochead_make_headings = +                      to!string(dochead_make_json["make"]["headings"]); +                    heading_found(line, dochead_make_headings, heading_match_str, heading_match_rgx, type); +                  }                    if ((type["make_headings"] == State.on)                    && ((line_occur["para"] == State.off)                    && (line_occur["heading"] == State.off))                    && ((type["para"] == State.off)                    && (type["heading"] == State.off))) {                      /+ heading make set +/ -                    // heading_make_set(line, line_occur, heading_match_rgx, type); +                    heading_make_set(line, line_occur, heading_match_rgx, type);                    }                    if (matchFirst(line, rgx.heading)) {                      /+ heading match +/ -                    heading_matched(line, line_occur, an_object, lv, collapsed_lev, type); +                    heading_matched(line, line_occur, an_object, lv, collapsed_lev, type, dochead_meta_json);                    } else if (line_occur["para"] == State.off) {                      /+ para match +/                      para_match(line, an_object, indent, bullet, type, line_occur); @@ -1614,6 +1617,94 @@ template SiSUdocAbstraction() {          }        }      } +    auto heading_found( +      char[] line, +      string dochead_make_headings, +      ref string[string] heading_match_str, +      ref Regex!(char)[string] heading_match_rgx, +      ref int[string] type +    ) { +      if ((to!string(dochead_make_headings).length > 2) +      && (type["make_headings"] == State.off)) { +        /+ headings found +/ +        debug(headingsfound) { +          writeln(dochead_make_headings); +        } +        auto make_headings_txt = +          match( +            to!string(dochead_make_headings), +            rgx.within_quotes); +        char[][] make_headings_spl = +          split( +            cast(char[]) make_headings_txt.captures[1], +            rgx.make_heading_delimiter); +        debug(headingsfound) { +          writeln(make_headings_spl.length); +          writeln(make_headings_spl); +        } +        switch (make_headings_spl.length) { +        case 7 : +          if (!empty(make_headings_spl[6])) { +            heading_match_str["h_4"] = +              "^(" ~ to!string(make_headings_spl[6]) ~ ")"; +            heading_match_rgx["h_4"] = +              regex(heading_match_str["h_4"]); +          } +          goto case; +        case 6 : +          if (!empty(make_headings_spl[5])) { +            heading_match_str["h_3"] = +              "^(" ~ to!string(make_headings_spl[5]) ~ ")"; +            heading_match_rgx["h_3"] = +              regex(heading_match_str["h_3"]); +          } +          goto case; +        case 5 : +          if (!empty(make_headings_spl[4])) { +            heading_match_str["h_2"] = +              "^(" ~ to!string(make_headings_spl[4]) ~ ")"; +            heading_match_rgx["h_2"] = +              regex(heading_match_str["h_2"]); +          } +          goto case; +        case 4 : +          if (!empty(make_headings_spl[3])) { +            heading_match_str["h_1"] = +              "^(" ~ to!string(make_headings_spl[3]) ~ ")"; +            heading_match_rgx["h_1"] = +              regex(heading_match_str["h_1"]); +          } +          goto case; +        case 3 : +          if (!empty(make_headings_spl[2])) { +            heading_match_str["h_D"] = +              "^(" ~ to!string(make_headings_spl[2]) ~ ")"; +            heading_match_rgx["h_D"] = +              regex(heading_match_str["h_D"]); +          } +          goto case; +        case 2 : +          if (!empty(make_headings_spl[1])) { +            heading_match_str["h_C"] = +              "^(" ~ to!string(make_headings_spl[1]) ~ ")"; +            heading_match_rgx["h_C"] = +              regex(heading_match_str["h_C"]); +          } +          goto case; +        case 1 : +          if (!empty(make_headings_spl[0])) { +            heading_match_str["h_B"] = +              "^(" ~ to!string(make_headings_spl[0]) ~ ")"; +            heading_match_rgx["h_B"] = +              regex(heading_match_str["h_B"]); +          } +          break; +        default: +          break; +        } +        type["make_headings"] = State.on; +      } +    }      auto heading_make_set(        ref char[] line,        ref int[string] line_occur, @@ -1676,8 +1767,8 @@ template SiSUdocAbstraction() {        ref string[string] an_object,        ref int[string] lv,        ref int[string] collapsed_lev, -      ref int[string] type -      // ref JSONValue[string] dochead_meta_json +      ref int[string] type, +      ref JSONValue[string] dochead_meta_json      ) {        if (auto m = match(line, rgx.heading)) {          /+ heading match +/ @@ -1691,8 +1782,8 @@ template SiSUdocAbstraction() {          assertions_doc_structure(an_object, lv); // includes most of the logic for collapsed levels          switch (an_object["lev"]) {          case "A": -          // an_object["obj"]=replaceFirst(an_object["obj"], rgx.variable_doc_title, to!string(dochead_meta_json["title"]["main"])); -          // an_object["obj"]=replaceFirst(an_object["obj"], rgx.variable_doc_author, to!string(dochead_meta_json["creator"]["author"])); +          an_object["obj"]=replaceFirst(an_object["obj"], rgx.variable_doc_title, to!string(dochead_meta_json["title"]["main"])); +          an_object["obj"]=replaceFirst(an_object["obj"], rgx.variable_doc_author, to!string(dochead_meta_json["creator"]["author"]));            collapsed_lev["h0"] = 1;            an_object["lev_collapsed_number"] =              to!string(collapsed_lev["h0"]); diff --git a/src/sdp/ao_defaults.d b/src/sdp/ao_defaults.d index b6eeae1..48f61c9 100644 --- a/src/sdp/ao_defaults.d +++ b/src/sdp/ao_defaults.d @@ -2,7 +2,7 @@    defaults    ao_defaults.d  +/ -template SiSUheaderSkel() { +template SiSUheaderRegister() {    auto header_make_jsonstr = `{      "make": {        "bold"               : "", diff --git a/src/sdp/ao_header_extract.d b/src/sdp/ao_header_extract.d index c02bc7c..76c5a7d 100644 --- a/src/sdp/ao_header_extract.d +++ b/src/sdp/ao_header_extract.d @@ -1,1307 +1,25 @@  /+ -  extract sdl header return sdl -+/ -template SiSUheaderExtractSDLang() { -  private import -    std.regex; -  private import -    ao_rgx; -  struct HeaderExtractSDL { -    mixin RgxInit; -    auto rgx = Rgx(); -    final private auto headerMakeSDLang(in string src_header) { -      scope(failure) { -        stderr.writefln( -          "%s\n%s\n%s:%s failed here:\n  src_header: %s", -          __MODULE__, __FUNCTION__, -          __FILE__, __LINE__, -          src_header, -        ); -      } -      Tag sdl_root_header; -      try { -        sdl_root_header = parseSource(src_header); -      } -      catch(SDLangParseException e) { -        stderr.writeln("SDLang problem with this document header:"); -        stderr.writeln(src_header); -        // Error messages of the form: -        // myFile.sdl(5:28): Error: Invalid integer suffix. -        stderr.writeln(e.msg); -      } -      debug(sdlang) { -        writeln("header SDL:"); -        writeln(sdl_root_header.toSDLDocument()); -      } -      return sdl_root_header; -    } -    private auto headerSDLangToJSON(in char[] src_header) { -      char[][] source_header_arr = -        split(cast(char[]) src_header, rgx.line_delimiter); -      char[] header_clean; -      // TODO -      foreach(header_line; source_header_arr) { -        if (!match(header_line, rgx.comments)) { -          header_clean ~= header_line ~ "\n"; -          // writeln(header_line); -        } -      } -      /+ get sdlang tags +/ -      auto header_sdlang=headerMakeSDLang(to!string(header_clean)); -      debug(sdlang) { -        writeln("--------------"); -        stdout.rawWrite( header_sdlang.toSDLDocument() ); -        writeln("--------------"); -        Value test = header_sdlang.tags["title"][0].values[0]; -        assert(test == typeid(string)); -        writeln(header_sdlang.maybe.tags["title"]); -        writeln(header_sdlang.maybe.tags["title"][0].maybe.attributes["subtitle"]); -      } -      /+ TODO separate modules? sdlang then json -      return header_sdlang; -      // then do json module? -      +/ -      /+ TODO json next +/ -      /+ TODO -        auto dochead_make = parseJSON(header_make_jsonstr).object; -        auto dochead_meta = parseJSON(header_meta_jsonstr).object; -        auto hm = to!string(t.captures[1]); -        auto hs = to!string(s.captures[1]); -        if (dochead_make[hm][hs].type() == JSON_TYPE.STRING) { -          dochead_make[hm][hs].str = to!string(s.captures[2]); -        } -        if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -          dochead_meta[hm][hs].str = to!string(s.captures[2]); -        } -      +/ -      /+ dochead +/ -      string hm; -      string hs; -      /+ make +/ -      auto dochead_make = parseJSON(header_make_jsonstr).object; -      if (!(header_sdlang.maybe.tags["make"].empty)) { -        hm = "make"; -        hs = "bold"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "breaks"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "cover_image"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "css"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "emphasis"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "footer"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "headings"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "home_button_image"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "home_button_text"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "italics"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "num_top"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "substitute"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "texpdf_font"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_make[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      /+ meta +/ -      auto dochead_meta = parseJSON(header_meta_jsonstr).object; -      hm = "title"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        /+ TODO Title REQUIRED +/ -        hs = "main"; -        if (!(header_sdlang.tags[hm].empty) -        && (header_sdlang.tags[hm][0].values[0].length > 1)) { -          writeln(header_sdlang.tags[hm][0].values[0]); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].values[0]); -            // to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } else if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } else { -          writeln("Required header metadata Title, missing"); -        } -        hs = "sub"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } else if (!(header_sdlang.tags[hm][0].maybe.attributes["subtitle"].empty) -        && (header_sdlang.tags[hm][0].attributes["subtitle"][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes["subtitle"][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes["subtitle"][0].value); -        } -        // full title composite (main + sub) -        // hs = "full"; -        // dochead_meta[hm][hs] = dochead_meta[hm]["main"] ~ dochead_meta[hm]["sub"]; -        hs = "language"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes["lang"].empty) -        && (header_sdlang.tags[hm][0].attributes["lang"][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes["lang"][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes["lang"][0].value); -        } else if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "edition"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "note"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "creator"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        /+ Creator / Author REQUIRED +/ -        /+ TODO -        - decide on representation for & deal with multiple authors; -        - author(s) full name; -        - author(s) surname & other parts -        +/ -        hs = "author"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "author_email"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "illustrator"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "translator"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "classify"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        hs = "dewey"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "keywords"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "loc"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "subject"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "topic_register"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "date"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        hs = "added_to_site"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "available"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "created"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "issued"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "modified"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "published"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "valid"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "identifier"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        hs = "isbn"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "oclc"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "pg"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "links"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        /+ TODO -          stuff to fix -        +/ -        // hs = "link"; -        // if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        // && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -        //   writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -        //   dochead_meta[hm][hs].str = -        //     to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        // } -      } -      hm = "notes"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        hs = "abstract"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "description"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "original"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        hs = "language"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "source"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "title"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "publisher"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        hs = "name"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      hm = "rights"; -      if (!(header_sdlang.maybe.tags[hm].empty)) { -        hs = "copyright"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "cover"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "illustrations"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -        hs = "license"; -        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) -        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { -          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); -          dochead_meta[hm][hs].str = -            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); -        } -      } -      // writeln(dochead_make); -      // writeln(dochead_meta); -      auto t = tuple(dochead_make, dochead_meta); -      static assert(!isTypeTuple!(t)); -      return t; -    } -    private auto headerSDLangToHash(in char[] src_header) { -      char[][] source_header_arr = -        split(cast(char[]) src_header, rgx.line_delimiter); -      char[] header_clean; -      string[string] header_make; -      string[string][string] header_metadata; -      foreach(header_line; source_header_arr) { -        if (!match(header_line, rgx.comments)) { -          header_clean ~= header_line ~ "\n"; -          // writeln(header_line); -        } -      } -      /+ get sdlang tags +/ -      auto header_sdlang=headerMakeSDLang(to!string(header_clean)); -      Value test = header_sdlang.tags["title"][0].values[0]; -      // assert(test == typeid(string)); -      // writeln(header_sdlang.maybe.tags["title"]); -      // writeln(header_sdlang.maybe.tags["title"][0].attributes["subtitle"]); -      if (!(header_sdlang.maybe.tags["make"].empty)) { -        if (!(header_sdlang.tags["make"][0].maybe.attributes["bold"].empty) -        && (header_sdlang.tags["make"][0].attributes["bold"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["bold"][0].value); -          header_make["bold"] = -            to!string(header_sdlang.tags["make"][0].attributes["bold"][0].value); -        } else { -          header_make["bold"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["breaks"].empty) -        && (header_sdlang.tags["make"][0].attributes["breaks"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["breaks"][0].value); -          header_make["breaks"] = -            to!string(header_sdlang.tags["make"][0].attributes["breaks"][0].value); -        } else { -          header_make["breaks"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["cover_image"].empty) -        && (header_sdlang.tags["make"][0].attributes["cover_image"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["cover_image"][0].value); -          header_make["cover_image"] = -            to!string(header_sdlang.tags["make"][0].attributes["cover_image"][0].value); -        } else { -          header_make["cover_image"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["css"].empty) -        && (header_sdlang.tags["make"][0].attributes["css"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["css"][0].value); -          header_make["css"] = -            to!string(header_sdlang.tags["make"][0].attributes["css"][0].value); -        } else { -          header_make["css"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["emphasis"].empty) -        && (header_sdlang.tags["make"][0].attributes["emphasis"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["emphasis"][0].value); -          header_make["emphasis"] = -            to!string(header_sdlang.tags["make"][0].attributes["emphasis"][0].value); -        } else { -          header_make["emphasis"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["footer"].empty) -        && (header_sdlang.tags["make"][0].attributes["footer"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["footer"][0].value); -          header_make["footer"] = -            to!string(header_sdlang.tags["make"][0].attributes["footer"][0].value); -        } else { -          header_make["footer"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["headings"].empty) -        && (header_sdlang.tags["make"][0].attributes["headings"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["headings"][0].value); -          header_make["headings"] = -            to!string(header_sdlang.tags["make"][0].attributes["headings"][0].value); -        } else { -          header_make["headings"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["home_button_image"].empty) -        && (header_sdlang.tags["make"][0].attributes["home_button_image"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["home_button_image"][0].value); -          header_make["home_button_image"] = -            to!string(header_sdlang.tags["make"][0].attributes["home_button_image"][0].value); -        } else { -          header_make["home_button_image"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["home_button_text"].empty) -        && (header_sdlang.tags["make"][0].attributes["home_button_text"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["home_button_text"][0].value); -          header_make["home_button_text"] = -            to!string(header_sdlang.tags["make"][0].attributes["home_button_text"][0].value); -        } else { -          header_make["home_button_text"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["italics"].empty) -        && (header_sdlang.tags["make"][0].attributes["italics"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["italics"][0].value); -          header_make["italics"] = -            to!string(header_sdlang.tags["make"][0].attributes["italics"][0].value); -        } else { -          header_make["italics"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["num_top"].empty) -        && (header_sdlang.tags["make"][0].attributes["num_top"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["num_top"][0].value); -          header_make["num_top"] = -            to!string(header_sdlang.tags["make"][0].attributes["num_top"][0].value); -        } else { -          header_make["num_top"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["substitute"].empty) -        && (header_sdlang.tags["make"][0].attributes["substitute"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["substitute"][0].value); -          header_make["substitute"] = -            to!string(header_sdlang.tags["make"][0].attributes["substitute"][0].value); -        } else { -          header_make["substitute"] = ""; -        } -        if (!(header_sdlang.tags["make"][0].maybe.attributes["texpdf_font"].empty) -        && (header_sdlang.tags["make"][0].attributes["texpdf_font"][0].value.length > 1)) { -          writeln(header_sdlang.tags["make"][0].attributes["texpdf_font"][0].value); -          header_make["texpdf_font"] = -            to!string(header_sdlang.tags["make"][0].attributes["texpdf_font"][0].value); -        } else { -          header_make["texpdf_font"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["title"].empty)) { -        /+ Title REQUIRED +/ -        if (!(header_sdlang.tags["title"].empty) -        && (header_sdlang.tags["title"][0].values[0].length > 1)) { -          writeln(header_sdlang.tags["title"][0].values[0]); -          header_metadata["title"]["main"] = -            to!string(header_sdlang.tags["title"][0].values[0]); -        } else if (!(header_sdlang.tags["title"][0].maybe.attributes["main"].empty) -        && (header_sdlang.tags["title"][0].attributes["main"][0].value.length > 1)) { -          writeln(header_sdlang.tags["title"][0].attributes["main"][0].value); -          header_metadata["title"]["main"] = -            to!string(header_sdlang.tags["title"][0].attributes["main"][0].value); -        } else { -          writeln("Required header metadata Title, missing"); -          header_metadata["title"]["main"] = ""; -        } -        if (!(header_sdlang.tags["title"][0].maybe.attributes["sub"].empty) -        && (header_sdlang.tags["title"][0].attributes["sub"][0].value.length > 1)) { -          writeln(header_sdlang.tags["title"][0].attributes["sub"][0].value); -          header_metadata["title"]["sub"] = -            to!string(header_sdlang.tags["title"][0].attributes["sub"][0].value); -        } else if (!(header_sdlang.tags["title"][0].maybe.attributes["subtitle"].empty) -        && (header_sdlang.tags["title"][0].attributes["subtitle"][0].value.length > 1)) { -          writeln(header_sdlang.tags["title"][0].attributes["subtitle"][0].value); -          header_metadata["title"]["sub"] = -            to!string(header_sdlang.tags["title"][0].attributes["subtitle"][0].value); -        } else { -          header_metadata["title"]["sub"] = ""; -        } -        // full title composite (main + sub) -        header_metadata["title"]["full"] = header_metadata["title"]["main"] ~ header_metadata["title"]["sub"]; -        if (!(header_sdlang.tags["title"][0].maybe.attributes["lang"].empty) -        && (header_sdlang.tags["title"][0].attributes["lang"][0].value.length > 1)) { -          writeln(header_sdlang.tags["title"][0].attributes["lang"][0].value); -          header_metadata["title"]["language"] = -            to!string(header_sdlang.tags["title"][0].attributes["lang"][0].value); -        } else if (!(header_sdlang.tags["title"][0].maybe.attributes["language"].empty) -        && (header_sdlang.tags["title"][0].attributes["language"][0].value.length > 1)) { -          writeln(header_sdlang.tags["title"][0].attributes["language"][0].value); -          header_metadata["title"]["language"] = -            to!string(header_sdlang.tags["title"][0].attributes["language"][0].value); -        } else { -          header_metadata["title"]["language"] = ""; -        } -        if (!(header_sdlang.tags["title"][0].maybe.attributes["edition"].empty) -        && (header_sdlang.tags["title"][0].attributes["edition"][0].value.length > 1)) { -          writeln(header_sdlang.tags["title"][0].attributes["edition"][0].value); -          header_metadata["title"]["edition"] = -            to!string(header_sdlang.tags["title"][0].attributes["edition"][0].value); -        } else { -          header_metadata["title"]["edition"] = ""; -        } -        if (!(header_sdlang.tags["title"][0].maybe.attributes["note"].empty) -        && (header_sdlang.tags["title"][0].attributes["note"][0].value.length > 1)) { -          writeln(header_sdlang.tags["title"][0].attributes["note"][0].value); -          header_metadata["title"]["note"] = -            to!string(header_sdlang.tags["title"][0].attributes["note"][0].value); -        } else { -          header_metadata["title"]["note"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["creator"].empty)) { -        /+ Creator / Author REQUIRED +/ -        /+ TODO -        - decide on representation for & deal with multiple authors; -        - author(s) full name; -        - author(s) surname & other parts -        +/ -        if (!(header_sdlang.tags["creator"][0].maybe.attributes["author"].empty) -        && (header_sdlang.tags["creator"][0].attributes["author"][0].value.length > 1)) { -          writeln(header_sdlang.tags["creator"][0].attributes["author"][0].value); -          header_metadata["creator"]["author"] = -            to!string(header_sdlang.tags["creator"][0].attributes["author"][0].value); -        } else { -          header_metadata["creator"]["author"] = ""; -        } -        if (!(header_sdlang.tags["creator"][0].maybe.attributes["author_email"].empty) -        && (header_sdlang.tags["creator"][0].attributes["author_email"][0].value.length > 1)) { -          writeln(header_sdlang.tags["creator"][0].attributes["author_email"][0].value); -          header_metadata["creator"]["author_email"] = -            to!string(header_sdlang.tags["creator"][0].attributes["author_email"][0].value); -        } else { -          header_metadata["creator"]["author_email"] = ""; -        } -        if (!(header_sdlang.tags["creator"][0].maybe.attributes["illustrator"].empty) -        && (header_sdlang.tags["creator"][0].attributes["illustrator"][0].value.length > 1)) { -          writeln(header_sdlang.tags["creator"][0].attributes["illustrator"][0].value); -          header_metadata["creator"][""] = -            to!string(header_sdlang.tags["creator"][0].attributes["illustrator"][0].value); -        } else { -          header_metadata["creator"]["illustrator"] = ""; -        } -        if (!(header_sdlang.tags["creator"][0].maybe.attributes["translator"].empty) -        && (header_sdlang.tags["creator"][0].attributes["translator"][0].value.length > 1)) { -          writeln(header_sdlang.tags["creator"][0].attributes["translator"][0].value); -          header_metadata["creator"]["translator"] = -            to!string(header_sdlang.tags["creator"][0].attributes["translator"][0].value); -        } else { -          header_metadata["creator"][""] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["classify"].empty)) { -        if (!(header_sdlang.tags["classify"][0].maybe.attributes["dewey"].empty) -        && (header_sdlang.tags["classify"][0].attributes["dewey"][0].value.length > 1)) { -          writeln(header_sdlang.tags["classify"][0].attributes["dewey"][0].value); -          header_metadata["classify"]["dewey"] = -            to!string(header_sdlang.tags["classify"][0].attributes["dewey"][0].value); -        } else { -          header_metadata["classify"]["dewey"] = ""; -        } -        if (!(header_sdlang.tags["classify"][0].maybe.attributes["keyword"].empty) -        && (header_sdlang.tags["classify"][0].attributes["keyword"][0].value.length > 1)) { -          writeln(header_sdlang.tags["classify"][0].attributes["keyword"][0].value); -          header_metadata["classify"]["keyword"] = -            to!string(header_sdlang.tags["classify"][0].attributes["keyword"][0].value); -        } else { -          header_metadata["classify"]["keyword"] = ""; -        } -        if (!(header_sdlang.tags["classify"][0].maybe.attributes["loc"].empty) -        && (header_sdlang.tags["classify"][0].attributes["loc"][0].value.length > 1)) { -          writeln(header_sdlang.tags["classify"][0].attributes["loc"][0].value); -          header_metadata["classify"]["loc"] = -            to!string(header_sdlang.tags["classify"][0].attributes["loc"][0].value); -        } else { -          header_metadata["classify"]["loc"] = ""; -        } -        if (!(header_sdlang.tags["classify"][0].maybe.attributes["subject"].empty) -        && (header_sdlang.tags["classify"][0].attributes["subject"][0].value.length > 1)) { -          writeln(header_sdlang.tags["classify"][0].attributes["subject"][0].value); -          header_metadata["classify"]["subject"] = -            to!string(header_sdlang.tags["classify"][0].attributes["subject"][0].value); -        } else { -          header_metadata["classify"]["subject"] = ""; -        } -        if (!(header_sdlang.tags["classify"][0].maybe.attributes["topic_register"].empty) -        && (header_sdlang.tags["classify"][0].attributes["topic_register"][0].value.length > 1)) { -          writeln(header_sdlang.tags["classify"][0].attributes["topic_register"][0].value); -          header_metadata["classify"]["topic_register"] = -            to!string(header_sdlang.tags["classify"][0].attributes["topic_register"][0].value); -        } else { -          header_metadata["classify"]["topic_register"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["date"].empty)) { -        if (!(header_sdlang.tags["date"][0].maybe.attributes["added_to_site"].empty) -        && (header_sdlang.tags["date"][0].attributes["added_to_site"][0].value.length > 1)) { -          writeln(header_sdlang.tags["date"][0].attributes["added_to_site"][0].value); -          header_metadata["date"]["added_to_site"] = -            to!string(header_sdlang.tags["date"][0].attributes["added_to_site"][0].value); -        } else { -          header_metadata["date"]["added_to_site"] = ""; -        } -        if (!(header_sdlang.tags["date"][0].maybe.attributes["available"].empty) -        && (header_sdlang.tags["date"][0].attributes["available"][0].value.length > 1)) { -          writeln(header_sdlang.tags["date"][0].attributes["available"][0].value); -          header_metadata["date"]["available"] = -            to!string(header_sdlang.tags["date"][0].attributes["available"][0].value); -        } else { -          header_metadata["date"]["available"] = ""; -        } -        if (!(header_sdlang.tags["date"][0].maybe.attributes["created"].empty) -        && (header_sdlang.tags["date"][0].attributes["created"][0].value.length > 1)) { -          writeln(header_sdlang.tags["date"][0].attributes["created"][0].value); -          header_metadata["date"]["created"] = -            to!string(header_sdlang.tags["date"][0].attributes["created"][0].value); -        } else { -          header_metadata["date"]["created"] = ""; -        } -        if (!(header_sdlang.tags["date"][0].maybe.attributes["issued"].empty) -        && (header_sdlang.tags["date"][0].attributes["issued"][0].value.length > 1)) { -          writeln(header_sdlang.tags["date"][0].attributes["issued"][0].value); -          header_metadata["date"]["issued"] = -            to!string(header_sdlang.tags["date"][0].attributes["issued"][0].value); -        } else { -          header_metadata["date"]["issued"] = ""; -        } -        if (!(header_sdlang.tags["date"][0].maybe.attributes["modified"].empty) -        && (header_sdlang.tags["date"][0].attributes["modified"][0].value.length > 1)) { -          writeln(header_sdlang.tags["date"][0].attributes["modified"][0].value); -          header_metadata["date"]["modified"] = -            to!string(header_sdlang.tags["date"][0].attributes["modified"][0].value); -        } else { -          header_metadata["date"]["modified"] = ""; -        } -        if (!(header_sdlang.tags["date"][0].maybe.attributes["published"].empty) -        && (header_sdlang.tags["date"][0].attributes["published"][0].value.length > 1)) { -          writeln(header_sdlang.tags["date"][0].attributes["published"][0].value); -          header_metadata["date"]["published"] = -            to!string(header_sdlang.tags["date"][0].attributes["published"][0].value); -        } else { -          header_metadata["date"]["published"] = ""; -        } -        if (!(header_sdlang.tags["date"][0].maybe.attributes["valid"].empty) -        && (header_sdlang.tags["date"][0].attributes["valid"][0].value.length > 1)) { -          writeln(header_sdlang.tags["date"][0].attributes["valid"][0].value); -          header_metadata["date"]["valid"] = -            to!string(header_sdlang.tags["date"][0].attributes["valid"][0].value); -        } else { -          header_metadata["date"]["valid"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["identifier"].empty)) { -        if (!(header_sdlang.tags["identifier"][0].maybe.attributes["isbn"].empty) -        && (header_sdlang.tags["identifier"][0].attributes["isbn"][0].value.length > 1)) { -          writeln(header_sdlang.tags["identifier"][0].attributes["isbn"][0].value); -          header_metadata["identifier"]["isbn"] = -            to!string(header_sdlang.tags["identifier"][0].attributes["isbn"][0].value); -        } else { -          header_metadata["identifier"]["isbn"] = ""; -        } -        if (!(header_sdlang.tags["identifier"][0].maybe.attributes["oclc"].empty) -        && (header_sdlang.tags["identifier"][0].attributes["oclc"][0].value.length > 1)) { -          writeln(header_sdlang.tags["identifier"][0].attributes["oclc"][0].value); -          header_metadata["identifier"]["oclc"] = -            to!string(header_sdlang.tags["identifier"][0].attributes["oclc"][0].value); -        } else { -          header_metadata["identifier"]["oclc"] = ""; -        } -        if (!(header_sdlang.tags["identifier"][0].maybe.attributes["pg"].empty) -        && (header_sdlang.tags["identifier"][0].attributes["pg"][0].value.length > 1)) { -          writeln(header_sdlang.tags["identifier"][0].attributes["pg"][0].value); -          header_metadata["identifier"]["pg"] = -            to!string(header_sdlang.tags["identifier"][0].attributes["pg"][0].value); -        } else { -          header_metadata["identifier"]["pg"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["links"].empty)) { -        /+ TODO -          stuff to fix -        +/ -        if (!(header_sdlang.tags["links"][0].maybe.attributes["link"].empty) -        && (header_sdlang.tags["links"][0].attributes["link"][0].value.length > 1)) { -          writeln(header_sdlang.tags["links"][0].attributes["link"][0].value); -          // header_metadata["links"]["list"] = -          //   to!string(header_sdlang.tags["links"][0].attributes["link"][0].value); -          header_metadata["links"]["list"] = ""; -        } else { -          header_metadata["links"]["list"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["notes"].empty)) { -        if (!(header_sdlang.tags["notes"][0].maybe.attributes["abstract"].empty) -        && (header_sdlang.tags["notes"][0].attributes["abstract"][0].value.length > 1)) { -          writeln(header_sdlang.tags["notes"][0].attributes["abstract"][0].value); -          header_metadata["notes"]["abstract"] = -            to!string(header_sdlang.tags["notes"][0].attributes["abstract"][0].value); -        } else { -          header_metadata["notes"]["abstract"] = ""; -        } -        if (!(header_sdlang.tags["notes"][0].maybe.attributes["description"].empty) -        && (header_sdlang.tags["notes"][0].attributes["description"][0].value.length > 1)) { -          writeln(header_sdlang.tags["notes"][0].attributes["description"][0].value); -          header_metadata["notes"]["description"] = -            to!string(header_sdlang.tags["notes"][0].attributes["description"][0].value); -        } else { -          header_metadata["notes"]["description"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["original"].empty)) { -        if (!(header_sdlang.tags["original"][0].maybe.attributes["language"].empty) -        && (header_sdlang.tags["original"][0].attributes["language"][0].value.length > 1)) { -          writeln(header_sdlang.tags["original"][0].attributes["language"][0].value); -          header_metadata["original"]["language"] = -            to!string(header_sdlang.tags["original"][0].attributes["language"][0].value); -        } else { -          header_metadata["original"]["language"] = ""; -        } -        if (!(header_sdlang.tags["original"][0].maybe.attributes["source"].empty) -        && (header_sdlang.tags["original"][0].attributes["source"][0].value.length > 1)) { -          writeln(header_sdlang.tags["original"][0].attributes["source"][0].value); -          header_metadata["original"]["source"] = -            to!string(header_sdlang.tags["original"][0].attributes["source"][0].value); -        } else { -          header_metadata["original"]["source"] = ""; -        } -        if (!(header_sdlang.tags["original"][0].maybe.attributes["title"].empty) -        && (header_sdlang.tags["original"][0].attributes["title"][0].value.length > 1)) { -          writeln(header_sdlang.tags["original"][0].attributes["title"][0].value); -          header_metadata["original"]["title"] = -            to!string(header_sdlang.tags["original"][0].attributes["title"][0].value); -        } else { -          header_metadata["original"]["title"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["publisher"].empty)) { -        if (!(header_sdlang.tags["publisher"][0].maybe.attributes["name"].empty) -        && (header_sdlang.tags["publisher"][0].attributes["name"][0].value.length > 1)) { -          writeln(header_sdlang.tags["publisher"][0].attributes["name"][0].value); -          header_metadata["publisher"]["name"] = -            to!string(header_sdlang.tags["publisher"][0].attributes["name"][0].value); -        } else { -          header_metadata["publisher"]["name"] = ""; -        } -      } -      if (!(header_sdlang.maybe.tags["rights"].empty)) { -        if (!(header_sdlang.tags["rights"][0].maybe.attributes["copyright"].empty) -        && (header_sdlang.tags["rights"][0].attributes["copyright"][0].value.length > 1)) { -          writeln(header_sdlang.tags["rights"][0].attributes["copyright"][0].value); -          header_metadata["rights"]["copyright"] = -            to!string(header_sdlang.tags["rights"][0].attributes["copyright"][0].value); -        } else { -          header_metadata["rights"]["copyright"] = ""; -        } -        if (!(header_sdlang.tags["rights"][0].maybe.attributes["cover"].empty) -        && (header_sdlang.tags["rights"][0].attributes["cover"][0].value.length > 1)) { -          writeln(header_sdlang.tags["rights"][0].attributes["cover"][0].value); -          header_metadata["rights"]["cover"] = -            to!string(header_sdlang.tags["rights"][0].attributes["cover"][0].value); -        } else { -          header_metadata["rights"]["cover"] = ""; -        } -        if (!(header_sdlang.tags["rights"][0].maybe.attributes["illustrations"].empty) -        && (header_sdlang.tags["rights"][0].attributes["illustrations"][0].value.length > 1)) { -          writeln(header_sdlang.tags["rights"][0].attributes["illustrations"][0].value); -          header_metadata["rights"]["illustrations"] = -            to!string(header_sdlang.tags["rights"][0].attributes["illustrations"][0].value); -        } else { -          header_metadata["rights"]["illustrations"] = ""; -        } -        if (!(header_sdlang.tags["rights"][0].maybe.attributes["license"].empty) -        && (header_sdlang.tags["rights"][0].attributes["license"][0].value.length > 1)) { -          writeln(header_sdlang.tags["rights"][0].attributes["license"][0].value); -          header_metadata["rights"]["license"] = -            to!string(header_sdlang.tags["rights"][0].attributes["license"][0].value); -        } else { -          header_metadata["rights"]["license"] = ""; -        } -      } -      writeln("--------------"); -      stdout.rawWrite( header_sdlang.toSDLDocument() ); -      writeln("--------------"); -      /+ -      namespace:name values attributes { -        children -      } -      +/ -      return header_sdlang; -    } -    private auto headerSDLang(in char[] src_header) { -      char[][] source_header_arr = -        split(cast(char[]) src_header, rgx.line_delimiter); -      char[] header_clean; -      foreach(header_line; source_header_arr) { -        if (!match(header_line, rgx.comments)) { -          header_clean ~= header_line ~ "\n"; -          // writeln(header_line); -        } -      } -      // writeln(header_clean); // consider -      auto header_sdlang=headerMakeSDLang(to!string(header_clean)); -      return header_sdlang; -    } -     -  } -  struct HeaderUseSDL { -    mixin RgxInit; -    auto rgx = Rgx(); -    // Tag = sdl_header; -    auto headerUseSDLang(T)(auto T sdl_root_header) { -    // T sdl_root_header; -    // auto headerUseSDLang(Tag sdl_root_header) { -    // private auto headerUseSDLang(Tag sdl_root_header) { -    // private auto headerUseSDLang(in Tag sdl_root_header) { -      // auto sdl_root_header = T; - -  // Value is a std.variant.Algebraic -  Value test = sdl_root_header.tags["title"][0].values[0]; -  // assert(test == typeid(string)); -  writeln(test); - -      return sdl_root_header; -    } -  } -} -/+    extract native/orig header return json  +/ -template SiSUheaderExtractNative() { +template SiSUheaderExtractHub() {    private import -    std.exception, -    std.regex, -    std.utf, -    std.conv : to; +    std.regex;    private import      ao_rgx; -  struct HeaderDocMetadataAndMakeNativeToJson { -    mixin SiSUrgxInitFlags; -    mixin RgxInit; +  struct HeaderDocMetadataAndMake { +    mixin SiSUheaderExtractNative; +    mixin SiSUheaderExtractSDLang;      auto rgx = Rgx(); -    enum State { off, on } -    string hm, hs; -    auto header_metadata_and_make_jsonstr( -      string header, -      JSONValue[string] dochead_meta, -      JSONValue[string] dochead_make -    ) -    in { } -    body { -      scope(exit) { -        destroy(header); -        destroy(dochead_meta); -        destroy(dochead_make); -      } -      if (auto t = match(header, rgx.native_header_main)) { -        char[][] header_obj_spl = split( -          cast(char[]) header, -          rgx.line_delimiter_ws_strip -        ); -        auto hm = to!string(t.captures[1]); -        if (match(hm, rgx.main_headers)) { -          foreach (line; header_obj_spl) { -            if (auto m = match(line, rgx.native_header_main)) { -              if (!empty(m.captures[2])) { -                if (hm == "creator") { -                  dochead_meta[hm]["author"].str = -                    to!string(m.captures[2]); -                } else if (hm == "title") { -                  dochead_meta[hm]["main"].str = -                    to!string(m.captures[2]); -                } else if (hm == "publisher") { -                  dochead_meta[hm]["name"].str = -                    to!string(m.captures[2]); -                } -              } -            } else if (auto s = match(line, rgx.native_header_sub)) { -              if (!empty(s.captures[2])) { -                auto hs = to!string(s.captures[1]); -                if ((hm == "make" ) -                && (dochead_make[hm].type() == JSON_TYPE.OBJECT)) { -                  switch (hm) { -                  case "make": -                    if (match(hs, rgx.native_subhead_make)) { -                      if (dochead_make[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_make[hm][hs].str = to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  default: -                    break; -                  } -                } else if (dochead_meta[hm].type() == JSON_TYPE.OBJECT) { -                  switch (hm) { -                  case "creator": -                    if (match(hs, rgx.native_subhead_creator)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "title": -                    if (match(hs, rgx.native_subhead_title)) { -                      if ((hs == "subtitle") -                      && (dochead_meta[hm]["sub"].type() == JSON_TYPE.STRING)) { -                        dochead_meta[hm]["sub"].str = -                          to!string(s.captures[2]); -                      } else if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "rights": -                    if (match(hs, rgx.native_subhead_rights)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "date": -                    if (match(hs, rgx.native_subhead_date)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "original": -                    if (match(hs, rgx.native_subhead_original)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "classify": -                    if (match(hs, rgx.native_subhead_classify)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "identifier": -                    if (match(hs, rgx.native_subhead_identifier)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "notes": -                    if (match(hs, rgx.native_subhead_notes)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "publisher": -                    if (match(hs, rgx.native_subhead_publisher)) { -                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                        dochead_meta[hm][hs].str = -                          to!string(s.captures[2]); -                      } -                    } else { -                      writeln("not a valid header type:", hm, ":", hs); -                      destroy(hm); -                      destroy(hs); -                    } -                    break; -                  case "links": -                    destroy(hm); -                    destroy(hs); -                    // if (match(hs, rgx.native_subhead_links)) { -                    //   if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { -                    //     dochead_meta[hm][hs].str = to!string(s.captures[2]); -                    //   } -                    // } else { -                    //   writeln("not a valid header type:", hm, ":", hs); -                    //   destroy(hm); -                    //   destroy(hs); -                    // } -                    break; -                  default: -                    break; -                  } -                } -              } -            } -          } -        } else { -          writeln("not a valid header type:", hm); -        } -      } -      auto t = tuple(dochead_meta, dochead_make); -      static assert(!isTypeTuple!(t)); -      return t; -    } -    private auto native_header_extract( -      char[] line, -      ref int[string] line_occur, -      ref string[string] an_object, -      ref int[string] type -    ) { -      if (matchFirst(line, rgx.native_header_make)) {   /+ matched header_make +/ -        debug(header1) { /+ writeln(line); +/ } -        type["header"]      = State.on; -        type["header_make"] = State.on; -        type["header_meta"] = State.off; -        ++line_occur["header_make"]; -        an_object["obj"] ~= line ~= "\n"; -      } else if (matchFirst(line, rgx.native_header)) { /+ matched header_metadata +/ -        /+ (generic header match and not previously caught by header_make) +/ -        debug(header1) { /+ writeln(line); +/ } -        type["header"]      = State.on; -        type["header_make"] = State.off; -        type["header_meta"] = State.on; -        ++line_occur["header_meta"]; -        an_object["obj"] ~= line ~= "\n"; -      } else if (type["header_make"] == State.on -      && (line_occur["header_make"] > State.off)) {     /+ header_make flag set +/ -        if (matchFirst(line, rgx.native_header_sub)) {  /+ sub-header +/ -          debug(header1) { /+ writeln(line); +/ } -          ++line_occur["header_make"]; -          an_object["obj"] ~= line ~= "\n"; -        } -      } else if (type["header_meta"] == State.on -      && (line_occur["header_meta"] > State.off)) {     /+ header_metadata flag set +/ -        if (matchFirst(line, rgx.native_header_sub)) {  /+ sub-header +/ -          debug(header1) { /+ writeln(line); +/ } -          ++line_occur["header_meta"]; -          an_object["obj"] ~= line ~= "\n"; -        } -      } -      return an_object; -    } -    auto header_reset_states_common( -      ref int[string] line_occur, -      ref string[string] an_object, -      ref int[string] type -    ) { -      // line_occur["header"] = State.off; -      line_occur["header_make"] = State.off; -      line_occur["header_meta"] = State.off; -      type["header"] = State.off; -      // type["header_make"] = State.off; -      // type["header_meta"] = State.off; -      an_object.remove("obj"); -      an_object.remove("is"); -      an_object.remove("attrib"); -    } -    private auto headerContentJSON(in char[] src_header) { -      auto type = flags_type_init; -      type = [ -       "header"          : State.off, -       "header_make"     : State.off, -       "header_meta"     : State.off, -      ]; -      string[string] an_object; -      int[string] line_occur; -      auto dochead_make = parseJSON(header_make_jsonstr).object; -      auto dochead_meta = parseJSON(header_meta_jsonstr).object; -      auto set_header = HeaderDocMetadataAndMakeNativeToJson(); -      char[][] source_header_arr = -        split(cast(char[]) src_header, rgx.line_delimiter); -      foreach(header_line; source_header_arr) { -        if (auto m = matchFirst(header_line, rgx.comment)) { -          /+ matched comment +/ -          debug(comment) { -            // tell_l("blue", header_line); -          } -          header_reset_states_common(line_occur, an_object, type); -          // type["header_make"] = State.off; -          // type["header_meta"] = State.off; -        } else if ((matchFirst(header_line, rgx.native_header)) -        || (type["header_make"] == State.on -        && (line_occur["header_make"] > State.off)) -        || (type["header_meta"] == State.on -        && (line_occur["header_meta"] > State.off))) { -          if (header_line.length == 0) { -            /+ header_make instructions (current line empty) +/ -            auto dochead_metadata_and_make = -              set_header.header_metadata_and_make_jsonstr(strip(an_object["obj"]), dochead_meta, dochead_make); -            static assert(!isTypeTuple!(dochead_metadata_and_make)); -            dochead_meta = dochead_metadata_and_make[0]; -            dochead_make = dochead_metadata_and_make[1]; -            header_reset_states_common(line_occur, an_object, type); -            type["header_make"] = State.off; -            type["header_meta"] = State.off; -            writeln(dochead_metadata_and_make); -          } else { -            an_object = native_header_extract(header_line, line_occur, an_object, type); -          } -        } else { -          // writeln(__LINE__); -        } -      } -      auto t = tuple( -        dochead_make, -        dochead_meta, -      ); -      return t; +    private auto headerContentJSON(char[] header_src) { +      auto head_native = HeaderDocMetadataAndMakeNativeToJson(); +      auto head_sdlang = HeaderExtractSDL(); +      writeln(__LINE__); +      auto header_make_and_meta_tuple = (match(header_src, rgx.native_header_meta_title)) +      ? (head_native.headerNativeToJSON(header_src)) +      : (head_sdlang.headerSDLangToJSON(header_src)); +      writeln(__LINE__); +      static assert(!isTypeTuple!(header_make_and_meta_tuple)); +      return header_make_and_meta_tuple;      }    }  } diff --git a/src/sdp/ao_header_extract_native.d b/src/sdp/ao_header_extract_native.d new file mode 100644 index 0000000..49555ef --- /dev/null +++ b/src/sdp/ao_header_extract_native.d @@ -0,0 +1,320 @@ +/+ +  extract native/orig header return json ++/ +template SiSUheaderExtractNative() { +  private import +    std.exception, +    std.regex, +    std.utf, +    std.conv : to; +  private import +    ao_rgx; +  struct HeaderDocMetadataAndMakeNativeToJson { +    mixin SiSUheaderRegister; +    mixin SiSUrgxInitFlags; +    mixin RgxInit; +    auto rgx = Rgx(); +    enum State { off, on } +    string hm, hs; +    auto header_metadata_and_make_jsonstr( +      string header, +      JSONValue[string] dochead_meta, +      JSONValue[string] dochead_make +    ) +    in { } +    body { +      scope(exit) { +        destroy(header); +        destroy(dochead_meta); +        destroy(dochead_make); +      } +      if (auto t = match(header, rgx.native_header_main)) { +        char[][] header_obj_spl = split( +          cast(char[]) header, +          rgx.line_delimiter_ws_strip +        ); +        auto hm = to!string(t.captures[1]); +        if (match(hm, rgx.main_headers)) { +          foreach (line; header_obj_spl) { +            if (auto m = match(line, rgx.native_header_main)) { +              if (!empty(m.captures[2])) { +                if (hm == "creator") { +                  dochead_meta[hm]["author"].str = +                    to!string(m.captures[2]); +                } else if (hm == "title") { +                  dochead_meta[hm]["main"].str = +                    to!string(m.captures[2]); +                } else if (hm == "publisher") { +                  dochead_meta[hm]["name"].str = +                    to!string(m.captures[2]); +                } +              } +            } else if (auto s = match(line, rgx.native_header_sub)) { +              if (!empty(s.captures[2])) { +                auto hs = to!string(s.captures[1]); +                if ((hm == "make" ) +                && (dochead_make[hm].type() == JSON_TYPE.OBJECT)) { +                  switch (hm) { +                  case "make": +                    if (match(hs, rgx.native_subhead_make)) { +                      if (dochead_make[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_make[hm][hs].str = to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  default: +                    break; +                  } +                } else if (dochead_meta[hm].type() == JSON_TYPE.OBJECT) { +                  switch (hm) { +                  case "creator": +                    if (match(hs, rgx.native_subhead_creator)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "title": +                    if (match(hs, rgx.native_subhead_title)) { +                      if ((hs == "subtitle") +                      && (dochead_meta[hm]["sub"].type() == JSON_TYPE.STRING)) { +                        dochead_meta[hm]["sub"].str = +                          to!string(s.captures[2]); +                      } else if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "rights": +                    if (match(hs, rgx.native_subhead_rights)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "date": +                    if (match(hs, rgx.native_subhead_date)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "original": +                    if (match(hs, rgx.native_subhead_original)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "classify": +                    if (match(hs, rgx.native_subhead_classify)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "identifier": +                    if (match(hs, rgx.native_subhead_identifier)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "notes": +                    if (match(hs, rgx.native_subhead_notes)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "publisher": +                    if (match(hs, rgx.native_subhead_publisher)) { +                      if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                        dochead_meta[hm][hs].str = +                          to!string(s.captures[2]); +                      } +                    } else { +                      writeln("not a valid header type:", hm, ":", hs); +                      destroy(hm); +                      destroy(hs); +                    } +                    break; +                  case "links": +                    destroy(hm); +                    destroy(hs); +                    // if (match(hs, rgx.native_subhead_links)) { +                    //   if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +                    //     dochead_meta[hm][hs].str = to!string(s.captures[2]); +                    //   } +                    // } else { +                    //   writeln("not a valid header type:", hm, ":", hs); +                    //   destroy(hm); +                    //   destroy(hs); +                    // } +                    break; +                  default: +                    break; +                  } +                } +              } +            } +          } +        } else { +          writeln("not a valid header type:", hm); +        } +      } +      auto t = tuple(dochead_meta, dochead_make); +      static assert(!isTypeTuple!(t)); +      return t; +    } +    private auto native_header_extract( +      char[] line, +      ref int[string] line_occur, +      ref string[string] an_object, +      ref int[string] type +    ) { +      if (matchFirst(line, rgx.native_header_make)) {   /+ matched header_make +/ +        debug(header1) { /+ writeln(line); +/ } +        type["header"]      = State.on; +        type["header_make"] = State.on; +        type["header_meta"] = State.off; +        ++line_occur["header_make"]; +        an_object["obj"] ~= line ~= "\n"; +      } else if (matchFirst(line, rgx.native_header)) { /+ matched header_metadata +/ +        /+ (generic header match and not previously caught by header_make) +/ +        debug(header1) { /+ writeln(line); +/ } +        type["header"]      = State.on; +        type["header_make"] = State.off; +        type["header_meta"] = State.on; +        ++line_occur["header_meta"]; +        an_object["obj"] ~= line ~= "\n"; +      } else if (type["header_make"] == State.on +      && (line_occur["header_make"] > State.off)) {     /+ header_make flag set +/ +        if (matchFirst(line, rgx.native_header_sub)) {  /+ sub-header +/ +          debug(header1) { /+ writeln(line); +/ } +          ++line_occur["header_make"]; +          an_object["obj"] ~= line ~= "\n"; +        } +      } else if (type["header_meta"] == State.on +      && (line_occur["header_meta"] > State.off)) {     /+ header_metadata flag set +/ +        if (matchFirst(line, rgx.native_header_sub)) {  /+ sub-header +/ +          debug(header1) { /+ writeln(line); +/ } +          ++line_occur["header_meta"]; +          an_object["obj"] ~= line ~= "\n"; +        } +      } +      return an_object; +    } +    auto header_reset_states_common( +      ref int[string] line_occur, +      ref string[string] an_object, +      ref int[string] type +    ) { +      // line_occur["header"] = State.off; +      line_occur["header_make"] = State.off; +      line_occur["header_meta"] = State.off; +      type["header"] = State.off; +      // type["header_make"] = State.off; +      // type["header_meta"] = State.off; +      an_object.remove("obj"); +      an_object.remove("is"); +      an_object.remove("attrib"); +    } +    private auto headerNativeToJSON(in char[] src_header) { +      auto type = flags_type_init; +      type = [ +       "header"          : State.off, +       "header_make"     : State.off, +       "header_meta"     : State.off, +      ]; +      string[string] an_object; +      int[string] line_occur; +      auto dochead_make = parseJSON(header_make_jsonstr).object; +      auto dochead_meta = parseJSON(header_meta_jsonstr).object; +      auto set_header = HeaderDocMetadataAndMakeNativeToJson(); +      char[][] source_header_arr = +        split(cast(char[]) src_header, rgx.line_delimiter); +      foreach(header_line; source_header_arr) { +        if (auto m = matchFirst(header_line, rgx.comment)) { +          /+ matched comment +/ +          debug(comment) { +            // tell_l("blue", header_line); +          } +          header_reset_states_common(line_occur, an_object, type); +          // type["header_make"] = State.off; +          // type["header_meta"] = State.off; +        } else if ((matchFirst(header_line, rgx.native_header)) +        || (type["header_make"] == State.on +        && (line_occur["header_make"] > State.off)) +        || (type["header_meta"] == State.on +        && (line_occur["header_meta"] > State.off))) { +          if (header_line.length == 0) { +            /+ header_make instructions (current line empty) +/ +            auto dochead_metadata_and_make = +              set_header.header_metadata_and_make_jsonstr(strip(an_object["obj"]), dochead_meta, dochead_make); +            static assert(!isTypeTuple!(dochead_metadata_and_make)); +            dochead_meta = dochead_metadata_and_make[0]; +            dochead_make = dochead_metadata_and_make[1]; +            header_reset_states_common(line_occur, an_object, type); +            type["header_make"] = State.off; +            type["header_meta"] = State.off; +            writeln(dochead_metadata_and_make); +          } else { +            an_object = native_header_extract(header_line, line_occur, an_object, type); +          } +        } else { +          // writeln(__LINE__); +        } +      } +      auto t = tuple( +        dochead_make, +        dochead_meta, +      ); +      return t; +    } +  } +} diff --git a/src/sdp/ao_header_extract_sdlang.d b/src/sdp/ao_header_extract_sdlang.d new file mode 100644 index 0000000..a175b4f --- /dev/null +++ b/src/sdp/ao_header_extract_sdlang.d @@ -0,0 +1,516 @@ +/+ +  extract sdl header return sdl ++/ +template SiSUheaderExtractSDLang() { +  private import +    std.regex; +  private import +    ao_rgx; +  struct HeaderExtractSDL { +    mixin SiSUheaderRegister; +    mixin RgxInit; +    auto rgx = Rgx(); +    final private auto headerMakeSDLang(in string src_header) { +      scope(failure) { +        stderr.writefln( +          "%s\n%s\n%s:%s failed here:\n  src_header: %s", +          __MODULE__, __FUNCTION__, +          __FILE__, __LINE__, +          src_header, +        ); +      } +      Tag sdl_root_header; +      try { +        sdl_root_header = parseSource(src_header); +      } +      catch(SDLangParseException e) { +        stderr.writeln("SDLang problem with this document header:"); +        stderr.writeln(src_header); +        // Error messages of the form: +        // myFile.sdl(5:28): Error: Invalid integer suffix. +        stderr.writeln(e.msg); +      } +      debug(sdlang) { +        writeln("header SDL:"); +        writeln(sdl_root_header.toSDLDocument()); +      } +      return sdl_root_header; +    } +    private auto headerSDLangGet(in char[] src_header) { +      char[][] source_header_arr = +        split(cast(char[]) src_header, rgx.line_delimiter); +      char[] header_clean; +      // TODO +      foreach(header_line; source_header_arr) { +        if (!match(header_line, rgx.comments)) { +          header_clean ~= header_line ~ "\n"; +          // writeln(header_line); +        } +      } +      /+ get sdlang tags +/ +      auto header_sdlang=headerMakeSDLang(to!string(header_clean)); +      debug(sdlang) { +        writeln("--------------"); +        stdout.rawWrite( header_sdlang.toSDLDocument() ); +        writeln("--------------"); +        Value test = header_sdlang.tags["title"][0].values[0]; +        assert(test == typeid(string)); +        writeln(header_sdlang.maybe.tags["title"]); +        writeln(header_sdlang.maybe.tags["title"][0].maybe.attributes["subtitle"]); +      } +      return header_sdlang; // sdlang.ast.Tag +    } +    private auto headerSDLangToJSONmake(Tag header_sdlang) { +      /+ TODO json next +/ +      /+ TODO +        auto dochead_make = parseJSON(header_make_jsonstr).object; +        auto dochead_meta = parseJSON(header_meta_jsonstr).object; +        auto hm = to!string(t.captures[1]); +        auto hs = to!string(s.captures[1]); +        if (dochead_make[hm][hs].type() == JSON_TYPE.STRING) { +          dochead_make[hm][hs].str = to!string(s.captures[2]); +        } +        if (dochead_meta[hm][hs].type() == JSON_TYPE.STRING) { +          dochead_meta[hm][hs].str = to!string(s.captures[2]); +        } +      +/ +      /+ dochead +/ +      string hm; +      string hs; +      /+ make +/ +      auto dochead_make = parseJSON(header_make_jsonstr).object; +      if (!(header_sdlang.maybe.tags["make"].empty)) { +        hm = "make"; +        hs = "bold"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "breaks"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "cover_image"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "css"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "emphasis"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "footer"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "headings"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "home_button_image"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "home_button_text"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "italics"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "num_top"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "substitute"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "texpdf_font"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_make[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      /+ meta +/ +      auto dochead_meta = parseJSON(header_meta_jsonstr).object; +      hm = "title"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        /+ TODO Title REQUIRED +/ +        hs = "main"; +        if (!(header_sdlang.tags[hm].empty) +        && (header_sdlang.tags[hm][0].values[0].length > 1)) { +          writeln(header_sdlang.tags[hm][0].values[0]); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].values[0]); +            // to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } else if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } else { +          writeln("Required header metadata Title, missing"); +        } +        hs = "sub"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } else if (!(header_sdlang.tags[hm][0].maybe.attributes["subtitle"].empty) +        && (header_sdlang.tags[hm][0].attributes["subtitle"][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes["subtitle"][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes["subtitle"][0].value); +        } +        // full title composite (main + sub) +        // hs = "full"; +        // dochead_meta[hm][hs] = dochead_meta[hm]["main"] ~ dochead_meta[hm]["sub"]; +        hs = "language"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes["lang"].empty) +        && (header_sdlang.tags[hm][0].attributes["lang"][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes["lang"][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes["lang"][0].value); +        } else if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "edition"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "note"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "creator"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        /+ Creator / Author REQUIRED +/ +        /+ TODO +        - decide on representation for & deal with multiple authors; +        - author(s) full name; +        - author(s) surname & other parts +        +/ +        hs = "author"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "author_email"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "illustrator"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "translator"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "classify"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        hs = "dewey"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "keywords"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "loc"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "subject"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "topic_register"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "date"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        hs = "added_to_site"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "available"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "created"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "issued"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "modified"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "published"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "valid"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "identifier"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        hs = "isbn"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "oclc"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "pg"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "links"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        /+ TODO +          stuff to fix +        +/ +        // hs = "link"; +        // if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        // && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +        //   writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +        //   dochead_meta[hm][hs].str = +        //     to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        // } +      } +      hm = "notes"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        hs = "abstract"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "description"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "original"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        hs = "language"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "source"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "title"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "publisher"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        hs = "name"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      hm = "rights"; +      if (!(header_sdlang.maybe.tags[hm].empty)) { +        hs = "copyright"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "cover"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "illustrations"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +        hs = "license"; +        if (!(header_sdlang.tags[hm][0].maybe.attributes[hs].empty) +        && (header_sdlang.tags[hm][0].attributes[hs][0].value.length > 1)) { +          writeln(header_sdlang.tags[hm][0].attributes[hs][0].value); +          dochead_meta[hm][hs].str = +            to!string(header_sdlang.tags[hm][0].attributes[hs][0].value); +        } +      } +      // writeln(dochead_make); +      // writeln(dochead_meta); +      auto t = tuple(dochead_make, dochead_meta); +      static assert(!isTypeTuple!(t)); +      return t; +    } +    private auto headerSDLangToJSON(char[] header_sdlang_src) { +      auto header_sdlang_tag = headerSDLangGet(header_sdlang_src); // sdlang.ast.Tag +      auto header_json_tuple = headerSDLangToJSONmake(header_sdlang_tag); +      return header_json_tuple; +    } +     +  } +  struct HeaderUseSDL { +    mixin RgxInit; +    auto rgx = Rgx(); +    // Tag = sdl_header; +    auto headerUseSDLang(T)(auto T sdl_root_header) { +    // T sdl_root_header; +    // auto headerUseSDLang(Tag sdl_root_header) { +    // private auto headerUseSDLang(Tag sdl_root_header) { +    // private auto headerUseSDLang(in Tag sdl_root_header) { +      // auto sdl_root_header = T; + +  // Value is a std.variant.Algebraic +  Value test = sdl_root_header.tags["title"][0].values[0]; +  // assert(test == typeid(string)); +  writeln(test); + +      return sdl_root_header; +    } +  } +} diff --git a/src/sdp/ao_output_debugs.d b/src/sdp/ao_output_debugs.d index 525ebcc..68a2d40 100644 --- a/src/sdp/ao_output_debugs.d +++ b/src/sdp/ao_output_debugs.d @@ -8,8 +8,8 @@ template SiSUoutputDebugs() {        auto ref const S         contents,        string[][string][string] bookindex_unordered_hashes,        JSONValue[]              biblio, -      // JSONValue[string]        dochead_make, -      // JSONValue[string]        dochead_meta, +      JSONValue[string]        dochead_make, +      JSONValue[string]        dochead_meta,        string                   fn_src,        bool[string]             opt_action_bool      ) { @@ -76,6 +76,154 @@ template SiSUoutputDebugs() {            }          }        } +      debug(headermakejson) { +        writefln( +          "%s\n%s\n%s", +          "document header, metadata & make instructions:", +          dochead_meta, +          pointer_head_main, +        ); +        foreach (main_header; pointer_head_main) { +          switch (main_header) { +          case "make": +            foreach (sub_header; pointer_head_sub_make) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          default: +            break; +          } +        } +      } +      debug(headermetadatajson) { +        writefln( +          "%s\n%s\n%s", +          "document header, metadata & make instructions:", +          dochead_meta, +          pointer_head_main, +        ); +        foreach (main_header; pointer_head_main) { +          switch (main_header) { +          case "creator": +            foreach (sub_header; pointer_head_sub_creator) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "title": +            foreach (sub_header; pointer_head_sub_title) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "rights": +            foreach (sub_header; pointer_head_sub_rights) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "date": +            foreach (sub_header; pointer_head_sub_date) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "original": +            foreach (sub_header; pointer_head_sub_original) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "classify": +            foreach (sub_header; pointer_head_sub_classify) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "identifier": +            foreach (sub_header; pointer_head_sub_identifier) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "notes": +            foreach (sub_header; pointer_head_sub_notes) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          case "publisher": +            foreach (sub_header; pointer_head_sub_publisher) { +              if (to!string(dochead_meta[main_header][sub_header]).length > 2) { +                writefln( +                  "%s:%s: %s", +                  main_header, +                  sub_header, +                  dochead_meta[main_header][sub_header] +                ); +              } +            } +            break; +          default: +            break; +          } +        } +      }        debug(bookindex) {          writefln(            "%s\n%s:%s", @@ -138,10 +286,12 @@ template SiSUoutputDebugs() {            if (auto mfn=match(fn_src, rgx.src_fn)) {              if (opt_action_bool["assertions"]) {                switch (mfn.captures[2]) { +              // live manual:                case "live-manual.ssm":                  assert(check["last_obj_cite_number"] ==                    "1019","last obj_cite_number should be: 1019 (check test, document is frequently updated)"); // ok                  break; +              // sisu_markup:                case "sisu_markup.sst":                  assert(check["last_obj_cite_number"] ==                    "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]); // ok diff --git a/src/sdp/ao_read_config_files.d b/src/sdp/ao_read_config_files.d index 47980da..e53c656 100644 --- a/src/sdp/ao_read_config_files.d +++ b/src/sdp/ao_read_config_files.d @@ -2,7 +2,7 @@    ao_config_files.d    - read config files  +/ -template SiSUconfiguration() { +template SiSUconfigIn() {    private import      std.exception,      // std.regex, @@ -14,9 +14,9 @@ template SiSUconfiguration() {    // mixin RgxInit;    // auto rgx = Rgx();    private -  struct Config { +  struct ConfigIn {      private import std.file; -    final private string readInConfigFile() { +    final private string readInConfigFile(string conf_sdl) {        // enforce(        //   exists(fn_src)!=0,        //   "file not found" @@ -27,7 +27,6 @@ template SiSUconfiguration() {          environment["HOME"] ~ "/.sisu",          "/etc/sisu"        ]; -      string conf_sdl = "conf.sdl";        string config_file_str;        foreach(pth; possible_config_path_locations) {          auto conf_file = format( @@ -69,3 +68,52 @@ template SiSUconfiguration() {      }    }  } +/+ + ++/ +template SiSUconfigSDLang() { +  struct ConfigSDLangRootTag { +    private auto configSDLangRootTag(string configuration, string conf_sdl_filename) { +      Tag sdl_root_conf; +      try { +        sdl_root_conf = parseSource(configuration); +      } +      catch(SDLangParseException e) { +        stderr.writeln("SDLang problem with content for ", conf_sdl_filename); +        // Error messages of the form: +        // myFile.sdl(5:28): Error: Invalid integer suffix. +        stderr.writeln(e.msg); +      } +      debug(sdlang) { +        // Value is a std.variant.Algebraic +        Value output_dir_structure_by = sdl_root_conf.tags["output_dir_structure_by"][0].values[0]; +        assert(output_dir_structure_by.type == typeid(string)); +        writeln(output_dir_structure_by); +        // Tag person = sdl_root_conf.namespaces["myNamespace"].tags["person"][0]; +        // writeln("Name: ", person.attributes["name"][0].value); +        // +        // int age = person.tags["age"][0].values[0].get!int(); +        // writeln("Age: ", age); +        writeln("conf SDL:"); +        writeln(sdl_root_conf.toSDLDocument()); +      } +      return sdl_root_conf; +    } +  } +} +/+ + ++/ +template SiSUconfigSDLangHub() { +  mixin SiSUconfigIn; +  mixin SiSUconfigSDLang; +  struct ConfigHub { +    final private auto configSDLang(string conf_sdl) { +      auto conf_get = ConfigIn(); +      auto configuration = conf_get.readInConfigFile(conf_sdl); +      auto conf = ConfigSDLangRootTag(); +      auto sdl_root = conf.configSDLangRootTag(configuration, conf_sdl); +      return sdl_root; +    } +  } +} diff --git a/src/sdp/ao_read_source_files.d b/src/sdp/ao_read_source_files.d index 4d766b2..06c5f41 100644 --- a/src/sdp/ao_read_source_files.d +++ b/src/sdp/ao_read_source_files.d @@ -233,6 +233,13 @@ template SiSUmarkupRaw() {            auto fn_src_insert =              to!string(markup_src_file_path ~ insert_sub_pth ~ insert_fn);            auto raw = MarkupRawUnit(); +          /+ TODO +/ +          if (auto ma = match(line, rgx.src_fn_text)) { +            /+ .sst when inserted, not used: headers and heading level ^:?A~ so remove +/ +            writeln(__LINE__); writeln(ma); +          // auto t = +          //   raw.markupSourceHeaderContentRawLineTupleArray(fn_src, rgx.src_pth); +          }            auto markup_sourcefile_insert_content =              raw.markupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts);            debug(insert) {                              // insert file | 
