From 1c73ddf3894085c646b55d63e61a2483e03a3b4d Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Fri, 9 Feb 2018 22:03:10 -0500
Subject: 0.24.0 toml or sdlang for configuration

---
 src/sdp/meta/conf_make_meta.d           |  38 ---
 src/sdp/meta/conf_make_meta_composite.d |  45 ----
 src/sdp/meta/conf_make_meta_json.d      | 369 +++++++++++++++++++++++++++
 src/sdp/meta/conf_make_meta_sdlang.d    | 432 +++++++++++++++++++++++++-------
 src/sdp/meta/conf_make_meta_structs.d   | 305 ++++++++++++++++++++++
 src/sdp/meta/conf_make_meta_toml.d      |  79 ++++++
 src/sdp/meta/defaults.d                 | 269 --------------------
 src/sdp/meta/doc_debugs.d               |  12 +-
 src/sdp/meta/metadoc.d                  |  39 ++-
 src/sdp/meta/metadoc_from_src.d         |  29 ++-
 src/sdp/meta/read_config_files.d        | 271 ++++++++++++++++++--
 src/sdp/meta/read_source_files.d        |   6 +-
 src/sdp/meta/rgx.d                      |   9 +-
 13 files changed, 1393 insertions(+), 510 deletions(-)
 delete mode 100644 src/sdp/meta/conf_make_meta.d
 delete mode 100644 src/sdp/meta/conf_make_meta_composite.d
 create mode 100644 src/sdp/meta/conf_make_meta_json.d
 create mode 100644 src/sdp/meta/conf_make_meta_structs.d
 create mode 100644 src/sdp/meta/conf_make_meta_toml.d

(limited to 'src/sdp/meta')

diff --git a/src/sdp/meta/conf_make_meta.d b/src/sdp/meta/conf_make_meta.d
deleted file mode 100644
index 27c03bb..0000000
--- a/src/sdp/meta/conf_make_meta.d
+++ /dev/null
@@ -1,38 +0,0 @@
-/++
-  extract native/orig header return associative array<BR>
-
-  the header is passed as text (lopped off top of a sisu markup file until the
-  required first heading ^A~), determine whether is a native header or sdlang one
-  with a regex check if whether it contains the "native header" required tag/field
-  @title: then process accordingly as a "native header" or "sdlang header"
-  converting the metadata and make instructions to a common json format used by
-  program internally. Moved to associative array.
-+/
-module sdp.meta.conf_make_meta;
-static template docHeaderMakeAndMetaTupExtractAndConvertToStruct() {
-  import
-    std.exception,
-    std.regex,
-    std.stdio,
-    std.traits,
-    std.typecons,
-    std.utf,
-    std.conv : to;
-  import sdlang;
-  import
-    sdp.meta.conf_make_meta_sdlang,
-    sdp.meta.rgx;
-  mixin SiSUrgxInit;
-  mixin SiSUextractSDLang;
-  static auto rgx = Rgx();
-  auto docHeaderMakeAndMetaTupExtractAndConvertToStruct(CCm, Src)(
-    CCm     conf_composite_make,
-    Src     header_src,
-  ) {
-    auto header_sdlang_tag = (!(header_src.match(rgx.native_header_meta_title)))
-    ? extractSDL().docHeaderSDLtagGet(header_src) // sdlang.ast.Tag
-    : null;
-    auto header_make_and_meta_struct = extractSDL().docSDLtoStruct(conf_composite_make, header_sdlang_tag);
-    return header_make_and_meta_struct;
-  }
-}
diff --git a/src/sdp/meta/conf_make_meta_composite.d b/src/sdp/meta/conf_make_meta_composite.d
deleted file mode 100644
index 51e81ec..0000000
--- a/src/sdp/meta/conf_make_meta_composite.d
+++ /dev/null
@@ -1,45 +0,0 @@
-/++
-  return composite make from config files
-+/
-module sdp.meta.conf_make_meta_composite;
-
-template confFilesSDLtoStruct() {
-  import
-    std.exception,
-    std.regex,
-    std.stdio,
-    std.string,
-    std.traits,
-    std.typecons,
-    std.utf,
-    std.conv : to;
-  import
-    sdp.meta.defaults,
-    sdp.meta.rgx;
-  auto confFilesSDLtoStruct(S,L)(
-    S sdl_root_config_share,
-    L sdl_root_config_local,
-  ){
-    mixin SiSUregisters;
-    ConfCompositePlus _conf_composite;
-    foreach (conf_sdlang; [sdl_root_config_share, sdl_root_config_local]) {
-      if ("make" in conf_sdlang.maybe.tags) {
-         _conf_composite.make_str.bold              = _conf_composite.make.bold              = extractSDLangTabOrAttrib(conf_sdlang, "make", "bold");
-         _conf_composite.make_str.breaks            = _conf_composite.make.breaks            = extractSDLangTabOrAttrib(conf_sdlang, "make", "breaks");
-         _conf_composite.make_str.cover_image       = _conf_composite.make.cover_image       = extractSDLangTabOrAttrib(conf_sdlang, "make", "cover_image");
-         _conf_composite.make_str.css               = _conf_composite.make.css               = extractSDLangTabOrAttrib(conf_sdlang, "make", "css");
-         _conf_composite.make_str.emphasis          = _conf_composite.make.emphasis          = extractSDLangTabOrAttrib(conf_sdlang, "make", "emphasis");
-         _conf_composite.make_str.footer            = _conf_composite.make.footer            = extractSDLangTabOrAttrib(conf_sdlang, "make", "footer");
-         _conf_composite.make_str.headings          = _conf_composite.make.headings          = extractSDLangTabOrAttrib(conf_sdlang, "make", "headings");
-         _conf_composite.make_str.home_button_image = _conf_composite.make.home_button_image = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_image");
-         _conf_composite.make_str.home_button_text  = _conf_composite.make.home_button_text  = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_text");
-         _conf_composite.make_str.italics           = _conf_composite.make.italics           = extractSDLangTabOrAttrib(conf_sdlang, "make", "italics");
-         _conf_composite.make_str.num_top           = _conf_composite.make.num_top           = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_top");
-         _conf_composite.make_str.num_depth         = _conf_composite.make.num_depth         = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_depth");
-         _conf_composite.make_str.substitute        = _conf_composite.make.substitute        = extractSDLangTabOrAttrib(conf_sdlang, "make", "substitute");
-         _conf_composite.make_str.texpdf_font       = _conf_composite.make.texpdf_font       = extractSDLangTabOrAttrib(conf_sdlang, "make", "texpdf_font");
-      }
-    }
-    return _conf_composite;
-  }
-}
diff --git a/src/sdp/meta/conf_make_meta_json.d b/src/sdp/meta/conf_make_meta_json.d
new file mode 100644
index 0000000..88e24da
--- /dev/null
+++ b/src/sdp/meta/conf_make_meta_json.d
@@ -0,0 +1,369 @@
+/++
+  json headers<BR>
+  extract json header return json
++/
+module sdp.meta.conf_make_meta_json;
+static template contentJSONtoSiSUstruct() {
+  import
+    std.exception,
+    std.regex,
+    std.stdio,
+    std.string,
+    std.traits,
+    std.typecons,
+    std.utf,
+    std.conv : to;
+  import
+    sdp.meta.conf_make_meta_structs,
+    sdp.meta.conf_make_meta_json,
+    sdp.meta.rgx;
+  ConfCompositePlus _struct_composite;
+  auto contentJSONtoSiSUstruct(C, J)(C _struct_composite, J _json, string _identifier) {
+    mixin SiSUrgxInit;
+    static auto _rgx = Rgx();
+    debug (json) {
+      writeln(">> --------------------------- >>");
+      foreach (tag0; _json.object.byKeyValue) {
+        if (tag0.value.stringof == "string") {
+          writeln(tag0.key, ": ", tag0.value);
+        } else {
+          // writeln(tag0.key, ":");
+          foreach (tag1; tag0.value.object.byKeyValue) {
+            writeln(tag0.key, ":", tag1.key, ": ", tag1.value);
+          }
+        }
+      }
+      writeln("<< --------------------------- <<");
+    }
+    confCompositeMakeBuild _mk;
+    /+ make ------------------------------------------------------------------- +/
+    if ("make" in _json.object) {
+      if ("bold" in _json.object["make"]) {
+        _struct_composite.make_str.bold  = _json.object["make"]["bold"].str;
+      }
+      if ("breaks" in _json.object["make"]) {
+        _struct_composite.make_str.breaks  = _json.object["make"]["breaks"].str;
+      }
+      if ("cover_image" in _json.object["make"]) {
+        _struct_composite.make_str.cover_image  = _json.object["make"]["cover_image"].str;
+      }
+      if ("css" in _json.object["make"]) {
+        _struct_composite.make_str.css  = _json.object["make"]["css"].str;
+      }
+      if ("emphasis" in _json.object["make"]) {
+        _struct_composite.make_str.emphasis  = _json.object["make"]["emphasis"].str;
+      }
+      if ("footer" in _json.object["make"]) {
+        _struct_composite.make_str.footer  = _json.object["make"]["footer"].str;
+      }
+      if ("headings" in _json.object["make"]) {
+        _struct_composite.make_str.headings  = _json.object["make"]["headings"].str;
+      }
+      if ("home_button_image" in _json.object["make"]) {
+        _struct_composite.make_str.home_button_image  = _json.object["make"]["home_button_image"].str;
+      }
+      if ("home_button_text" in _json.object["make"]) {
+        _struct_composite.make_str.home_button_text  = _json.object["make"]["home_button_text"].str;
+      }
+      if ("italics" in _json.object["make"]) {
+        _struct_composite.make_str.italics  = _json.object["make"]["italics"].str;
+      }
+      if ("num_top" in _json.object["make"]) {
+        _struct_composite.make_str.num_top  = _json.object["make"]["num_top"].str;
+      }
+      if ("num_depth" in _json.object["make"]) {
+        _struct_composite.make_str.num_depth  = _json.object["num_depth"][""].str;
+      }
+      if ("substitute" in _json.object["make"]) {
+        _struct_composite.make_str.substitute  = _json.object["make"]["substitute"].str;
+      }
+      if ("texpdf_font" in _json.object["make"]) {
+        _struct_composite.make_str.texpdf_font  = _json.object["make"]["texpdf_font"].str;
+      }
+      _struct_composite.make.bold_rgxmatch                  = _mk.bold_rgxmatch(_struct_composite.make_str.bold);
+      _struct_composite.make.breaks                         = _mk.breaks(_struct_composite.make_str.breaks);
+      _struct_composite.make.cover_image                    = _mk.cover_image(_struct_composite.make_str.cover_image);
+      _struct_composite.make.css                            = _mk.css(_struct_composite.make_str.css);
+      _struct_composite.make.emphasis_rgxmatch              = _mk.emphasis_rgxmatch(_struct_composite.make_str.emphasis);
+      _struct_composite.make.footer                         = _mk.footer(_struct_composite.make_str.footer);
+      _struct_composite.make.headings                       = _mk.headings(_struct_composite.make_str.headings);
+      _struct_composite.make.home_button_image              = _mk.home_button_image(_struct_composite.make_str.home_button_image);
+      _struct_composite.make.home_button_text               = _mk.home_button_text(_struct_composite.make_str.home_button_text);
+      _struct_composite.make.italics_rgxmatch               = _mk.italics_rgxmatch(_struct_composite.make_str.italics);
+      _struct_composite.make.num_top                        = _mk.num_top(_struct_composite.make_str.num_top);
+      _struct_composite.make.num_depth                      = _mk.num_depth(_struct_composite.make_str.num_depth);
+      _struct_composite.make.substitute                     = _mk.substitute(_struct_composite.make_str.substitute);
+      _struct_composite.make.texpdf_font                    = _mk.texpdf_font(_struct_composite.make_str.texpdf_font);
+    }
+    /+ conf ------------------------------------------------------------------- +/
+    if ("webserv" in _json.object) {
+      if ("url_root" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_url_root = _json.object["webserv"]["url_root"].str;
+      }
+      if ("path" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_path = _json.object["webserv"]["path"].str;
+      }
+      if ("images" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_images = _json.object["webserv"]["images"].str;
+      }
+      if ("cgi" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_cgi = _json.object["webserv"]["cgi"].str;
+      }
+      if ("cgi_host" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_cgi_host = _json.object["webserv"]["cgi_host"].str;
+      }
+      if ("cgi_host_path" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_cgi_host_path = _json.object["webserv"]["cgi_host_path"].str;
+      }
+      if ("cgi_port" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_cgi_port = _json.object["webserv"]["cgi_port"].str;
+      }
+      if ("cgi_user" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_cgi_user = _json.object["webserv"]["cgi_user"].str;
+      }
+      if ("cgi_file_links" in _json.object["webserv"]) {
+        _struct_composite.conf.webserv_cgi_file_links = _json.object["webserv"]["cgi_file_links"].str;
+      }
+    }
+    if ("processing" in _json.object) { // TODO check & match logic with sdlang
+      if ("path" in _json.object["processing"]) {
+        _struct_composite.conf.processing_path = _json.object["processing"]["path"].str;
+      }
+      if ("dir" in _json.object["processing"]) {
+        _struct_composite.conf.processing_dir = _json.object["processing"]["dir"].str;
+      }
+      if ("concord_max" in _json.object["processing"]) {
+        _struct_composite.conf.processing_concord_max = _json.object["processing"]["concord_max"].str;
+      }
+    }
+    if ("flag" in _json.object) {
+      if ("act0" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act0 = _json.object["flag"]["act0"].str;
+      }
+      if ("act1" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act1 = _json.object["flag"]["act1"].str;
+      }
+      if ("act2" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act2 = _json.object["flag"]["act2"].str;
+      }
+      if ("act3" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act3 = _json.object["flag"]["act3"].str;
+      }
+      if ("act4" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act4 = _json.object["flag"]["act4"].str;
+      }
+      if ("act5" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act5 = _json.object["flag"]["act5"].str;
+      }
+      if ("act6" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act6 = _json.object["flag"]["act6"].str;
+      }
+      if ("act7" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act7 = _json.object["flag"]["act7"].str;
+      }
+      if ("act8" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act8 = _json.object["flag"]["act8"].str;
+      }
+      if ("act9" in _json.object["flag"]) {
+        _struct_composite.conf.flag_act9 = _json.object["flag"]["act9"].str;
+      }
+    }
+    if ("default" in _json.object) {
+      if ("papersize" in _json.object["default"]) {
+        _struct_composite.conf.default_papersize = _json.object["default"]["papersize"].str;
+      }
+      if ("text_wrap" in _json.object["default"]) {
+        _struct_composite.conf.default_text_wrap = _json.object["default"]["text_wrap"].str;
+      }
+      if ("emphasis" in _json.object["default"]) {
+        _struct_composite.conf.default_emphasis = _json.object["default"]["emphasis"].str;
+      }
+      if ("language" in _json.object["default"]) {
+        _struct_composite.conf.default_language = _json.object["default"]["language"].str;
+      }
+      if ("digest" in _json.object["default"]) {
+        _struct_composite.conf.default_digest = _json.object["default"]["digest"].str;
+      }
+    }
+    if ("search" in _json.object) {
+      if ("flag" in _json.object["search"]) {
+        _struct_composite.conf.search_flag = _json.object["search"]["flag"].str;
+      }
+      if ("action" in _json.object["search"]) {
+        _struct_composite.conf.search_action = _json.object["search"]["action"].str;
+      }
+      if ("db" in _json.object["search"]) {
+        _struct_composite.conf.search_db = _json.object["search"]["db"].str;
+      }
+      if ("title" in _json.object["search"]) {
+        _struct_composite.conf.search_title = _json.object["search"]["title"].str;
+      }
+    }
+    /+ meta ------------------------------------------------------------------- +/
+    if ("classify" in _json.object) {
+      if ("dewey" in _json.object["classify"]) {
+        _struct_composite.meta.classify_dewey = _json.object["classify"]["dewey"].str;
+      }
+      if ("keywords" in _json.object["classify"]) {
+        _struct_composite.meta.classify_keywords = _json.object["classify"]["keywords"].str;
+      }
+      if ("loc" in _json.object["classify"]) {
+        _struct_composite.meta.classify_loc = _json.object["classify"]["loc"].str;
+      }
+      if ("subject" in _json.object["classify"]) {
+        _struct_composite.meta.classify_subject = _json.object["classify"]["subject"].str;
+      }
+      if ("topic_register" in _json.object["classify"]) {
+        _struct_composite.meta.classify_topic_register = _json.object["classify"]["topic_register"].str;
+      }
+    }
+    if ("date" in _json.object) {
+      if ("added_to_site" in _json.object["date"]) {
+        _struct_composite.meta.date_added_to_site = _json.object["date"]["added_to_site"].str;
+      }
+      if ("available" in _json.object["date"]) {
+        _struct_composite.meta.date_available = _json.object["date"]["available"].str;
+      }
+      if ("created" in _json.object["date"]) {
+        _struct_composite.meta.date_created = _json.object["date"]["created"].str;
+      }
+      if ("issued" in _json.object["date"]) {
+        _struct_composite.meta.date_issued = _json.object["date"]["issued"].str;
+      }
+      if ("modified" in _json.object["date"]) {
+        _struct_composite.meta.date_modified = _json.object["date"]["modified"].str;
+      }
+      if ("published" in _json.object["date"]) {
+        _struct_composite.meta.date_published = _json.object["date"]["published"].str;
+      }
+      if ("valid" in _json.object["date"]) {
+        _struct_composite.meta.date_valid = _json.object["date"]["valid"].str;
+      }
+    }
+    if ("links" in _json.object) {
+      // if ("" in _json.object["links"]) {
+      //   _struct_composite.meta.links_ = _json.object["links"][""].str;
+      // }
+    }
+    if ("notes" in _json.object) {
+      if ("abstract" in _json.object["notes"]) {
+        _struct_composite.meta.notes_abstract = _json.object["notes"]["abstract"].str;
+      }
+      if ("description" in _json.object["notes"]) {
+        _struct_composite.meta.notes_description = _json.object["notes"]["description"].str;
+      }
+    }
+    if ("original" in _json.object) {
+      if ("language" in _json.object["original"]) {
+        _struct_composite.meta.original_language = _json.object["original"]["language"].str;
+      }
+      if ("language_char" in _json.object["original"]) {
+        _struct_composite.meta.original_language_char = _json.object["original"]["language_char"].str;
+      }
+      if ("source" in _json.object["original"]) {
+        _struct_composite.meta.original_source = _json.object["original"]["source"].str;
+      }
+      if ("title" in _json.object["original"]) {
+        _struct_composite.meta.original_title = _json.object["original"]["title"].str;
+      }
+    }
+    if ("publisher" in _json.object) {
+      // if ("" in _json.object["publisher"]) {
+      //   _struct_composite.meta.publisher = _json.object["publisher"][""].str;
+      // }
+    }
+    if ("rights" in _json.object) {
+      if ("copyright" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright = _json.object["rights"]["copyright"].str;
+      }
+      if ("copyright_text" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright_text = _json.object["rights"]["copyright_text"].str;
+      }
+      if ("copyright_audio" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright_audio = _json.object["rights"]["copyright_audio"].str;
+      }
+      if ("copyright_cover" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright_cover = _json.object["rights"]["copyright_cover"].str;
+      }
+      if ("copyright_illustrations" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright_illustrations = _json.object["rights"]["copyright_illustrations"].str;
+      }
+      if ("copyright_photographs" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright_photographs = _json.object["rights"]["copyright_photographs"].str;
+      }
+      if ("copyright_translation" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright_translation = _json.object["rights"]["copyright_translation"].str;
+      }
+      if ("copyright_video" in _json.object["rights"]) {
+        _struct_composite.meta.rights_copyright_video = _json.object["rights"]["copyright_video"].str;
+      }
+      if ("license" in _json.object["rights"]) {
+        _struct_composite.meta.rights_license = _json.object["rights"]["license"].str;
+      }
+    }
+    if (_struct_composite.meta.creator_author.empty) {
+      if ("creator" in _json.object) {
+        if ("author" in _json.object["creator"]) {
+          _struct_composite.meta.creator_author = _json.object["creator"]["author"].str;
+        }
+        if ("email" in _json.object["creator"]) {
+          _struct_composite.meta.creator_author_email = _json.object["creator"]["email"].str;
+        }
+        if ("illustrator" in _json.object["creator"]) {
+          _struct_composite.meta.creator_illustrator = _json.object["creator"]["illustrator"].str;
+        }
+        if ("translator" in _json.object["creator"]) {
+          _struct_composite.meta.creator_translator = _json.object["creator"]["translator"].str;
+        }
+      }
+      // dochead_meta["creator"]["author_raw"] = dochead_meta["creator"]["author"];
+      string[] authors_arr;
+      auto authors_raw_arr = _struct_composite.meta.creator_author.split(_rgx.arr_delimiter);
+      foreach (author_raw; authors_raw_arr) {
+        authors_arr ~= author_raw.replace(_rgx.raw_author_munge, "$2 $1");
+      }
+      _struct_composite.meta.creator_author = join(authors_arr, ", ").chomp.chomp;
+    }
+    if (_struct_composite.meta.title_main.empty) {
+      if ("title" in _json.object) {
+        if ((_json.object["title"].type().to!string) == "STRING") {
+          _struct_composite.meta.title_main                     = _json.object["title"].str;
+        } else {
+          if ("edition" in _json.object["title"]) {
+            _struct_composite.meta.title_edition                = _json.object["title"]["edition"].str;
+          }
+          if ("full" in _json.object["title"]) {
+            // _struct_composite.meta.title_full                  = _json.object["title"]["full"].str;
+          }
+          if ("language" in _json.object["title"]) {
+            _struct_composite.meta.title_language               = _json.object["title"]["language"].str;
+          }
+          if ("main" in _json.object["title"]) {
+            _struct_composite.meta.title_main                   = _json.object["title"]["main"].str;
+          }
+          if ("note" in _json.object["title"]) {
+            _struct_composite.meta.title_note                   = _json.object["title"]["note"].str;
+          }
+          if ("sub" in _json.object["title"]) {
+            _struct_composite.meta.title_sub                    = _json.object["title"]["sub"].str;
+          }
+          if ("subtitle" in _json.object["title"]) {
+            _struct_composite.meta.title_subtitle               = _json.object["title"]["subtitle"].str;
+          }
+        }
+      }
+      if ((!(_struct_composite.meta.title_subtitle.empty))
+      && (_struct_composite.meta.title_sub.empty)) {
+        _struct_composite.meta.title_sub = _struct_composite.meta.title_subtitle;
+      }
+      _struct_composite.meta.title_full = (_struct_composite.meta.title_sub.empty)
+      ? _struct_composite.meta.title_main
+      : format(
+          "%s - %s",
+          _struct_composite.meta.title_main,
+          _struct_composite.meta.title_sub,
+        );
+    }
+    return _struct_composite;
+  }
+}
diff --git a/src/sdp/meta/conf_make_meta_sdlang.d b/src/sdp/meta/conf_make_meta_sdlang.d
index ef395d0..4ebe960 100644
--- a/src/sdp/meta/conf_make_meta_sdlang.d
+++ b/src/sdp/meta/conf_make_meta_sdlang.d
@@ -1,8 +1,45 @@
+/++
+  extract native/orig header return associative array<BR>
+
+  the header is passed as text (lopped off top of a sisu markup file until the
+  required first heading ^A~), determine whether is a native header or sdlang one
+  with a regex check if whether it contains the "native header" required tag/field
+  @title: then process accordingly as a "native header" or "sdlang header"
+  converting the metadata and make instructions to a common json format used by
+  program internally. Moved to associative array.
++/
+module sdp.meta.conf_make_meta_sdlang;
+static template docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct() {
+  import
+    std.exception,
+    std.regex,
+    std.stdio,
+    std.traits,
+    std.typecons,
+    std.utf,
+    std.conv : to;
+  import sdlang;
+  import
+    sdp.meta.conf_make_meta_sdlang,
+    sdp.meta.rgx;
+  mixin SiSUrgxInit;
+  mixin SiSUextractSDLang;
+  static auto rgx = Rgx();
+  auto docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct(CCm, Src)(
+    CCm     conf_composite_make,
+    Src     header_src,
+  ) {
+    auto header_sdlang_tag = (header_src.match(rgx.sdlang_header_meta_title))
+    ? extractSDL().docHeaderSDLtagGet(header_src) // sdlang.ast.Tag
+    : null;
+    auto header_make_and_meta_struct = extractSDL().docSDLtoStruct(conf_composite_make, header_sdlang_tag);
+    return header_make_and_meta_struct;
+  }
+}
 /++
   sdlang headers<BR>
   extract sdlang header return sdlang
 +/
-module sdp.meta.conf_make_meta_sdlang;
 static template SiSUextractSDLang() {
   import
     std.exception,
@@ -14,10 +51,10 @@ static template SiSUextractSDLang() {
     std.utf,
     std.conv : to;
   import
-    sdp.meta.defaults,
+    sdp.meta.conf_make_meta_structs,
     sdp.meta.rgx;
   struct extractSDL {
-    mixin SiSUregisters;
+    mixin SiSUmakeMetaStructsSDLang;
     mixin SiSUrgxInit;
     static auto rgx = Rgx();
     private auto docHeaderSDLtagGet(Hs)(Hs src_header) {
@@ -69,104 +106,118 @@ static template SiSUextractSDLang() {
       }
       return sdl_root_header; // sdlang.ast.Tag
     }
-    private auto docSDLtoStruct(C,Tag)(C _conf_composite, Tag header_sdlang) {
-      mixin SiSUregisters;
-      /+ make +/
+    private auto docSDLtoStruct(C,Tag)(C _conf_composite, Tag header_sdlang) { // work on
+      /+ make ------------------------------------------------------------------- +/
       if ("make" in header_sdlang.maybe.tags) {
-        _conf_composite.make_str.bold              = _conf_composite.make.bold              = extractSDLangTabOrAttrib(header_sdlang, "make", "bold");
-        _conf_composite.make_str.breaks            = _conf_composite.make.breaks            = extractSDLangTabOrAttrib(header_sdlang, "make", "breaks");
-        _conf_composite.make_str.cover_image       = _conf_composite.make.cover_image       = extractSDLangTabOrAttrib(header_sdlang, "make", "cover_image");
-        _conf_composite.make_str.css               = _conf_composite.make.css               = extractSDLangTabOrAttrib(header_sdlang, "make", "css");
-        _conf_composite.make_str.emphasis          = _conf_composite.make.emphasis          = extractSDLangTabOrAttrib(header_sdlang, "make", "emphasis");
-        _conf_composite.make_str.footer            = _conf_composite.make.footer            = extractSDLangTabOrAttrib(header_sdlang, "make", "footer");
-        _conf_composite.make_str.headings          = _conf_composite.make.headings          = extractSDLangTabOrAttrib(header_sdlang, "make", "headings");
-        _conf_composite.make_str.home_button_image = _conf_composite.make.home_button_image = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_image");
-        _conf_composite.make_str.home_button_text  = _conf_composite.make.home_button_text  = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_text");
-        _conf_composite.make_str.italics           = _conf_composite.make.italics           = extractSDLangTabOrAttrib(header_sdlang, "make", "italics");
-        _conf_composite.make_str.num_top           = _conf_composite.make.num_top           = extractSDLangTabOrAttrib(header_sdlang, "make", "num_top");
-        _conf_composite.make_str.num_depth         = _conf_composite.make.num_depth         = extractSDLangTabOrAttrib(header_sdlang, "make", "num_depth");
-        _conf_composite.make_str.substitute        = _conf_composite.make.substitute        = extractSDLangTabOrAttrib(header_sdlang, "make", "substitute");
-        _conf_composite.make_str.texpdf_font       = _conf_composite.make.texpdf_font       = extractSDLangTabOrAttrib(header_sdlang, "make", "texpdf_font");
-      }
-      /+ conf +/
+        confCompositeMakeBuild _mk;
+        _conf_composite.make_str.bold                       = extractSDLangTabOrAttrib(header_sdlang, "make", "bold"); // TODO
+        _conf_composite.make_str.breaks                     = extractSDLangTabOrAttrib(header_sdlang, "make", "breaks");
+        _conf_composite.make_str.cover_image                = extractSDLangTabOrAttrib(header_sdlang, "make", "cover_image");
+        _conf_composite.make_str.css                        = extractSDLangTabOrAttrib(header_sdlang, "make", "css");
+        _conf_composite.make_str.emphasis                   = extractSDLangTabOrAttrib(header_sdlang, "make", "emphasis"); // TODO
+        _conf_composite.make_str.footer                     = extractSDLangTabOrAttrib(header_sdlang, "make", "footer");
+        _conf_composite.make_str.headings                   = extractSDLangTabOrAttrib(header_sdlang, "make", "headings");
+        _conf_composite.make_str.home_button_image          = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_image");
+        _conf_composite.make_str.home_button_text           = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_text");
+        _conf_composite.make_str.italics                    = extractSDLangTabOrAttrib(header_sdlang, "make", "italics"); // TODO
+        _conf_composite.make_str.num_top                    = extractSDLangTabOrAttrib(header_sdlang, "make", "num_top");
+        _conf_composite.make_str.num_depth                  = extractSDLangTabOrAttrib(header_sdlang, "make", "num_depth");
+        _conf_composite.make_str.substitute                 = extractSDLangTabOrAttrib(header_sdlang, "make", "substitute"); // TODO
+        _conf_composite.make_str.texpdf_font                = extractSDLangTabOrAttrib(header_sdlang, "make", "texpdf_font");
+        _conf_composite.make.bold_rgxmatch                  = _mk.bold_rgxmatch(_conf_composite.make_str.bold);
+        _conf_composite.make.breaks                         = _mk.breaks(_conf_composite.make_str.breaks);
+        _conf_composite.make.cover_image                    = _mk.cover_image(_conf_composite.make_str.cover_image);
+        _conf_composite.make.css                            = _mk.css(_conf_composite.make_str.css);
+        _conf_composite.make.emphasis_rgxmatch              = _mk.emphasis_rgxmatch(_conf_composite.make_str.emphasis);
+        _conf_composite.make.footer                         = _mk.footer(_conf_composite.make_str.footer);
+        _conf_composite.make.headings                       = _mk.headings(_conf_composite.make_str.headings);
+        _conf_composite.make.home_button_image              = _mk.home_button_image(_conf_composite.make_str.home_button_image);
+        _conf_composite.make.home_button_text               = _mk.home_button_text(_conf_composite.make_str.home_button_text);
+        _conf_composite.make.italics_rgxmatch               = _mk.italics_rgxmatch(_conf_composite.make_str.italics);
+        _conf_composite.make.num_top                        = _mk.num_top(_conf_composite.make_str.num_top);
+        _conf_composite.make.num_depth                      = _mk.num_depth(_conf_composite.make_str.num_depth);
+        _conf_composite.make.substitute                     = _mk.substitute(_conf_composite.make_str.substitute);
+        _conf_composite.make.texpdf_font                    = _mk.texpdf_font(_conf_composite.make_str.texpdf_font);
+      }
+      /+ conf ------------------------------------------------------------------- +/
       if ("webserv" in header_sdlang.maybe.tags) {
-        _conf_composite.conf.webserv_url_root        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "url_root");
-        _conf_composite.conf.webserv_path            = extractSDLangTabOrAttrib(header_sdlang, "webserv", "path");
-        _conf_composite.conf.webserv_images          = extractSDLangTabOrAttrib(header_sdlang, "webserv", "images");
-        _conf_composite.conf.webserv_cgi             = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi");
-        _conf_composite.conf.webserv_cgi_host        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host");
-        _conf_composite.conf.webserv_cgi_host_path   = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host_path");
-        _conf_composite.conf.webserv_cgi_port        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_port");
-        _conf_composite.conf.webserv_cgi_user        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_user");
-        _conf_composite.conf.webserv_cgi_file_links  = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_file_links");
+        _conf_composite.conf.webserv_url_root               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "url_root");
+        _conf_composite.conf.webserv_path                   = extractSDLangTabOrAttrib(header_sdlang, "webserv", "path");
+        _conf_composite.conf.webserv_images                 = extractSDLangTabOrAttrib(header_sdlang, "webserv", "images");
+        _conf_composite.conf.webserv_cgi                    = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi");
+        _conf_composite.conf.webserv_cgi_host               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host");
+        _conf_composite.conf.webserv_cgi_host_path          = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host_path");
+        _conf_composite.conf.webserv_cgi_port               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_port");
+        _conf_composite.conf.webserv_cgi_user               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_user");
+        _conf_composite.conf.webserv_cgi_file_links         = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_file_links");
       }
       if ("processing" in header_sdlang.maybe.tags) {
-        _conf_composite.conf.processing_path         = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_path");
-        _conf_composite.conf.processing_dir          = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_dir");
-        _conf_composite.conf.processing_concord_max  = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_concord_max");
-      }
-      if("flag" in header_sdlang.maybe.tags) {
-        _conf_composite.conf.flag_act0               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act0");
-        _conf_composite.conf.flag_act1               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act1");
-        _conf_composite.conf.flag_act2               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act2");
-        _conf_composite.conf.flag_act3               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act3");
-        _conf_composite.conf.flag_act4               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act4");
-        _conf_composite.conf.flag_act5               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act5");
-        _conf_composite.conf.flag_act6               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act6");
-        _conf_composite.conf.flag_act7               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act7");
-        _conf_composite.conf.flag_act8               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act8");
-        _conf_composite.conf.flag_act9               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act9");
+        _conf_composite.conf.processing_path                = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_path");
+        _conf_composite.conf.processing_dir                 = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_dir");
+        _conf_composite.conf.processing_concord_max         = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_concord_max");
+      }
+      if ("flag" in header_sdlang.maybe.tags) {
+        _conf_composite.conf.flag_act0                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act0");
+        _conf_composite.conf.flag_act1                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act1");
+        _conf_composite.conf.flag_act2                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act2");
+        _conf_composite.conf.flag_act3                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act3");
+        _conf_composite.conf.flag_act4                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act4");
+        _conf_composite.conf.flag_act5                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act5");
+        _conf_composite.conf.flag_act6                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act6");
+        _conf_composite.conf.flag_act7                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act7");
+        _conf_composite.conf.flag_act8                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act8");
+        _conf_composite.conf.flag_act9                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act9");
       }
       if ("default" in header_sdlang.maybe.tags) {
-        _conf_composite.conf.default_papersize       = extractSDLangTabOrAttrib(header_sdlang, "default", "papersize");
-        _conf_composite.conf.default_text_wrap       = extractSDLangTabOrAttrib(header_sdlang, "default", "text_wrap");
-        _conf_composite.conf.default_emphasis        = extractSDLangTabOrAttrib(header_sdlang, "default", "emphasis");
-        _conf_composite.conf.default_language        = extractSDLangTabOrAttrib(header_sdlang, "default", "language");
-        _conf_composite.conf.default_digest          = extractSDLangTabOrAttrib(header_sdlang, "default", "digest");
+        _conf_composite.conf.default_papersize              = extractSDLangTabOrAttrib(header_sdlang, "default", "papersize");
+        _conf_composite.conf.default_text_wrap              = extractSDLangTabOrAttrib(header_sdlang, "default", "text_wrap");
+        _conf_composite.conf.default_emphasis               = extractSDLangTabOrAttrib(header_sdlang, "default", "emphasis");
+        _conf_composite.conf.default_language               = extractSDLangTabOrAttrib(header_sdlang, "default", "language");
+        _conf_composite.conf.default_digest                 = extractSDLangTabOrAttrib(header_sdlang, "default", "digest");
       }
       if ("search" in header_sdlang.maybe.tags) {
-        _conf_composite.conf.search_flag             = extractSDLangTabOrAttrib(header_sdlang, "search", "flag");
-        _conf_composite.conf.search_action           = extractSDLangTabOrAttrib(header_sdlang, "search", "action");
-        _conf_composite.conf.search_db               = extractSDLangTabOrAttrib(header_sdlang, "search", "db");
-        _conf_composite.conf.search_title            = extractSDLangTabOrAttrib(header_sdlang, "search", "title");
+        _conf_composite.conf.search_flag                    = extractSDLangTabOrAttrib(header_sdlang, "search", "flag");
+        _conf_composite.conf.search_action                  = extractSDLangTabOrAttrib(header_sdlang, "search", "action");
+        _conf_composite.conf.search_db                      = extractSDLangTabOrAttrib(header_sdlang, "search", "db");
+        _conf_composite.conf.search_title                   = extractSDLangTabOrAttrib(header_sdlang, "search", "title");
       }
-      /+ meta +/
+      /+ meta ------------------------------------------------------------------- +/
       if ("classify" in header_sdlang.maybe.tags) {
-        _conf_composite.meta.classify_dewey          = extractSDLangTabOrAttrib(header_sdlang, "classify", "dewey");
-        _conf_composite.meta.classify_keywords       = extractSDLangTabOrAttrib(header_sdlang, "classify", "keywords");
-        _conf_composite.meta.classify_loc            = extractSDLangTabOrAttrib(header_sdlang, "classify", "loc");
-        _conf_composite.meta.classify_subject        = extractSDLangTabOrAttrib(header_sdlang, "classify", "subject");
-        _conf_composite.meta.classify_topic_register = extractSDLangTabOrAttrib(header_sdlang, "classify", "topic_register");
+        _conf_composite.meta.classify_dewey                 = extractSDLangTabOrAttrib(header_sdlang, "classify", "dewey");
+        _conf_composite.meta.classify_keywords              = extractSDLangTabOrAttrib(header_sdlang, "classify", "keywords");
+        _conf_composite.meta.classify_loc                   = extractSDLangTabOrAttrib(header_sdlang, "classify", "loc");
+        _conf_composite.meta.classify_subject               = extractSDLangTabOrAttrib(header_sdlang, "classify", "subject");
+        _conf_composite.meta.classify_topic_register        = extractSDLangTabOrAttrib(header_sdlang, "classify", "topic_register");
       }
       if ("date" in header_sdlang.maybe.tags) {
-        _conf_composite.meta.date_added_to_site      = extractSDLangTabOrAttrib(header_sdlang, "date", "added_to_site");
-        _conf_composite.meta.date_available          = extractSDLangTabOrAttrib(header_sdlang, "date", "available");
-        _conf_composite.meta.date_created            = extractSDLangTabOrAttrib(header_sdlang, "date", "created");
-        _conf_composite.meta.date_issued             = extractSDLangTabOrAttrib(header_sdlang, "date", "issued");
-        _conf_composite.meta.date_modified           = extractSDLangTabOrAttrib(header_sdlang, "date", "modified");
-        _conf_composite.meta.date_published          = extractSDLangTabOrAttrib(header_sdlang, "date", "published");
-        _conf_composite.meta.date_valid              = extractSDLangTabOrAttrib(header_sdlang, "date", "valid");
-      }
-      if("identifier" in header_sdlang.maybe.tags) {
-        _conf_composite.meta.identifier_isbn         = extractSDLangTabOrAttrib(header_sdlang, "identifier", "isbn");
-        _conf_composite.meta.identifier_oclc         = extractSDLangTabOrAttrib(header_sdlang, "identifier", "oclc");
-        _conf_composite.meta.identifier_pg           = extractSDLangTabOrAttrib(header_sdlang, "identifier", "pg");
+        _conf_composite.meta.date_added_to_site             = extractSDLangTabOrAttrib(header_sdlang, "date", "added_to_site");
+        _conf_composite.meta.date_available                 = extractSDLangTabOrAttrib(header_sdlang, "date", "available");
+        _conf_composite.meta.date_created                   = extractSDLangTabOrAttrib(header_sdlang, "date", "created");
+        _conf_composite.meta.date_issued                    = extractSDLangTabOrAttrib(header_sdlang, "date", "issued");
+        _conf_composite.meta.date_modified                  = extractSDLangTabOrAttrib(header_sdlang, "date", "modified");
+        _conf_composite.meta.date_published                 = extractSDLangTabOrAttrib(header_sdlang, "date", "published");
+        _conf_composite.meta.date_valid                     = extractSDLangTabOrAttrib(header_sdlang, "date", "valid");
+      }
+      if ("identifier" in header_sdlang.maybe.tags) {
+        _conf_composite.meta.identifier_isbn                = extractSDLangTabOrAttrib(header_sdlang, "identifier", "isbn");
+        _conf_composite.meta.identifier_oclc                = extractSDLangTabOrAttrib(header_sdlang, "identifier", "oclc");
+        _conf_composite.meta.identifier_pg                  = extractSDLangTabOrAttrib(header_sdlang, "identifier", "pg");
       }
       if ("links" in header_sdlang.maybe.tags) {
-        // _conf_composite.meta.links                   = extractSDLangTabOrAttrib(header_sdlang, "links", "");
+        // _conf_composite.meta.links                         = extractSDLangTabOrAttrib(header_sdlang, "links", "");
       }
       if ("notes" in header_sdlang.maybe.tags) {
-        _conf_composite.meta.notes_abstract          = extractSDLangTabOrAttrib(header_sdlang, "notes", "abstract");
-        _conf_composite.meta.notes_description       = extractSDLangTabOrAttrib(header_sdlang, "notes", "description");
+        _conf_composite.meta.notes_abstract                 = extractSDLangTabOrAttrib(header_sdlang, "notes", "abstract");
+        _conf_composite.meta.notes_description              = extractSDLangTabOrAttrib(header_sdlang, "notes", "description");
       }
       if ("original" in header_sdlang.maybe.tags) {
-        _conf_composite.meta.original_language       = extractSDLangTabOrAttrib(header_sdlang, "original", "language");
-        _conf_composite.meta.original_language_char  = extractSDLangTabOrAttrib(header_sdlang, "original", "language_char");
-        _conf_composite.meta.original_source         = extractSDLangTabOrAttrib(header_sdlang, "original", "source");
-        _conf_composite.meta.original_title          = extractSDLangTabOrAttrib(header_sdlang, "original", "title");
+        _conf_composite.meta.original_language              = extractSDLangTabOrAttrib(header_sdlang, "original", "language");
+        _conf_composite.meta.original_language_char         = extractSDLangTabOrAttrib(header_sdlang, "original", "language_char");
+        _conf_composite.meta.original_source                = extractSDLangTabOrAttrib(header_sdlang, "original", "source");
+        _conf_composite.meta.original_title                 = extractSDLangTabOrAttrib(header_sdlang, "original", "title");
       }
       if ("publisher" in header_sdlang.maybe.tags) {
-        // _conf_composite.meta.publisher               = extractSDLangTabOrAttrib(header_sdlang, "publisher", "");
+        // _conf_composite.meta.publisher                     = extractSDLangTabOrAttrib(header_sdlang, "publisher", "");
       }
       if ("rights" in header_sdlang.maybe.tags) {
         _conf_composite.meta.rights_copyright               = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright");
@@ -181,10 +232,10 @@ static template SiSUextractSDLang() {
       }
       if (_conf_composite.meta.creator_author.empty) {
         if ("creator" in header_sdlang.maybe.tags) {
-          _conf_composite.meta.creator_author          = extractSDLangTabOrAttrib(header_sdlang, "creator", "author");
-          _conf_composite.meta.creator_author_email    = extractSDLangTabOrAttrib(header_sdlang, "creator", "author_email");
-          _conf_composite.meta.creator_illustrator     = extractSDLangTabOrAttrib(header_sdlang, "creator", "illustrator");
-          _conf_composite.meta.creator_translator      = extractSDLangTabOrAttrib(header_sdlang, "creator", "translator");
+          _conf_composite.meta.creator_author               = extractSDLangTabOrAttrib(header_sdlang, "creator", "author");
+          _conf_composite.meta.creator_author_email         = extractSDLangTabOrAttrib(header_sdlang, "creator", "author_email");
+          _conf_composite.meta.creator_illustrator          = extractSDLangTabOrAttrib(header_sdlang, "creator", "illustrator");
+          _conf_composite.meta.creator_translator           = extractSDLangTabOrAttrib(header_sdlang, "creator", "translator");
         }
         // dochead_meta["creator"]["author_raw"] = dochead_meta["creator"]["author"];
         string[] authors_arr;
@@ -196,12 +247,13 @@ static template SiSUextractSDLang() {
       }
       if (_conf_composite.meta.title_main.empty) {
         if ("title" in header_sdlang.maybe.tags) {
-          _conf_composite.meta.title_edition           = extractSDLangTabOrAttrib(header_sdlang, "title", "edition");
-          _conf_composite.meta.title_language          = extractSDLangTabOrAttrib(header_sdlang, "title", "language");
-          _conf_composite.meta.title_main              = extractSDLangTabOrAttrib(header_sdlang, "title", "main");
-          _conf_composite.meta.title_note              = extractSDLangTabOrAttrib(header_sdlang, "title", "note");
-          _conf_composite.meta.title_sub               = extractSDLangTabOrAttrib(header_sdlang, "title", "sub");
-          _conf_composite.meta.title_subtitle          = extractSDLangTabOrAttrib(header_sdlang, "title", "subtitle");
+          _conf_composite.meta.title_edition                = extractSDLangTabOrAttrib(header_sdlang, "title", "edition");
+          // _conf_composite.meta.title_full                  = extractSDLangTabOrAttrib(header_sdlang, "title", "full");
+          _conf_composite.meta.title_language               = extractSDLangTabOrAttrib(header_sdlang, "title", "language");
+          _conf_composite.meta.title_main                   = extractSDLangTabOrAttrib(header_sdlang, "title", "main");
+          _conf_composite.meta.title_note                   = extractSDLangTabOrAttrib(header_sdlang, "title", "note");
+          _conf_composite.meta.title_sub                    = extractSDLangTabOrAttrib(header_sdlang, "title", "sub");
+          _conf_composite.meta.title_subtitle               = extractSDLangTabOrAttrib(header_sdlang, "title", "subtitle");
         }
         if (_conf_composite.meta.title_main.empty) {
           Tag _maintag = header_sdlang.getTag("title");
@@ -210,7 +262,6 @@ static template SiSUextractSDLang() {
               _conf_composite.meta.title_main
                 = to!string(_maintag.getTagValues("main"));
             } else if ("main" !in _maintag.maybe.attributes) {
-              writeln(_maintag.values[0]); // document title
               _conf_composite.meta.title_main
                 = (_maintag.values[0]).to!string; // test that this exists
             }
@@ -220,17 +271,204 @@ static template SiSUextractSDLang() {
         && (_conf_composite.meta.title_sub.empty)) {
           _conf_composite.meta.title_sub = _conf_composite.meta.title_subtitle;
         }
-        if (_conf_composite.meta.title_sub.empty) {
-          _conf_composite.meta.title_full = _conf_composite.meta.title_main;
-        } else {
-          _conf_composite.meta.title_full = format(
+        _conf_composite.meta.title_full = (_conf_composite.meta.title_sub.empty)
+        ? _conf_composite.meta.title_main
+        : format(
             "%s - %s",
             _conf_composite.meta.title_main,
             _conf_composite.meta.title_sub,
           );
-        }
       }
       return _conf_composite;
     }
   }
 }
+static template parseSDLangConfig() {
+  import
+    std.exception,
+    std.regex,
+    std.stdio,
+    std.string,
+    std.traits,
+    std.typecons,
+    std.utf,
+    std.conv : to;
+  import sdlang;
+  auto parseSDLangConfig(string configuration, string conf_sdl_filename) {
+    Tag sdl_root_conf;
+    try {
+      sdl_root_conf = parseSource(configuration);
+    }
+    catch(ParseException e) {
+      stderr.writeln("SDLang problem with content for ", conf_sdl_filename);
+      stderr.writeln(e.msg);
+    }
+    return sdl_root_conf;
+  }
+}
+/++
+  return composite make from config files
++/
+
+template confFilesSDLtoStruct() {
+  import
+    std.exception,
+    std.regex,
+    std.stdio,
+    std.string,
+    std.traits,
+    std.typecons,
+    std.utf,
+    std.conv : to;
+  import
+    sdp.meta.conf_make_meta_structs,
+    sdp.meta.rgx;
+  auto configParseSDL(T)(
+    T _text
+  ){
+    Tag sdl_root;
+    try {
+      sdl_root = parseSource(_text.to!string);
+    }
+    catch(ParseException 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(__LINE__, ": ",  sdl_root.toSDLDocument());
+      writeln(__LINE__, ": ",  sdl_root.maybe.namespaces);
+      writeln("header make sdlang: ", sdl_root.toSDLDocument());
+      writeln(__LINE__, ": ", sdl_root.getTagValues("title"));
+      writeln(__LINE__, ": ", sdl_root.getTagValues("creator"));
+      Tag creator = sdl_root.getTag("creator");
+      if (creator !is null) {
+        if ("author" in creator.maybe.tags) {
+          writeln(__LINE__, ": ", creator.getTagValues("author"));
+        } else if ("author" in creator.maybe.attributes) {
+          writeln(__LINE__, ": ", creator.maybe.attributes["author"][0].value);
+        }
+      }
+    }
+    return sdl_root; // sdlang.ast.Tag
+  }
+  auto confFilesSDLtoStruct(S,L)(
+    S sdl_root_config_share,
+    L sdl_root_config_local,
+  ){
+    mixin SiSUmakeMetaStructsSDLang;
+    ConfCompositePlus _conf_composite;
+    foreach (conf_sdlang; [sdl_root_config_share, sdl_root_config_local]) {
+      if ("make" in conf_sdlang.maybe.tags) {
+        confCompositeMakeBuild _mk;
+        _conf_composite.make_str.bold               = extractSDLangTabOrAttrib(conf_sdlang, "make", "bold"); // TODO
+        _conf_composite.make_str.breaks             = extractSDLangTabOrAttrib(conf_sdlang, "make", "breaks");
+        _conf_composite.make_str.cover_image        = extractSDLangTabOrAttrib(conf_sdlang, "make", "cover_image");
+        _conf_composite.make_str.css                = extractSDLangTabOrAttrib(conf_sdlang, "make", "css");
+        _conf_composite.make_str.emphasis           = extractSDLangTabOrAttrib(conf_sdlang, "make", "emphasis"); // TODO
+        _conf_composite.make_str.footer             = extractSDLangTabOrAttrib(conf_sdlang, "make", "footer");
+        _conf_composite.make_str.headings           = extractSDLangTabOrAttrib(conf_sdlang, "make", "headings");
+        _conf_composite.make_str.home_button_image  = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_image");
+        _conf_composite.make_str.home_button_text   = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_text");
+        _conf_composite.make_str.italics            = extractSDLangTabOrAttrib(conf_sdlang, "make", "italics"); // TODO
+        _conf_composite.make_str.num_top            = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_top");
+        _conf_composite.make_str.num_depth          = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_depth");
+        _conf_composite.make_str.substitute         = extractSDLangTabOrAttrib(conf_sdlang, "make", "substitute"); // TODO
+        _conf_composite.make_str.texpdf_font        = extractSDLangTabOrAttrib(conf_sdlang, "make", "texpdf_font");
+        _conf_composite.make.bold_rgxmatch          = _mk.bold_rgxmatch(_conf_composite.make_str.bold); //
+        _conf_composite.make.breaks                 = _mk.breaks(_conf_composite.make_str.breaks);
+        _conf_composite.make.cover_image            = _mk.cover_image(_conf_composite.make_str.cover_image);
+        _conf_composite.make.css                    = _mk.css(_conf_composite.make_str.css);
+        _conf_composite.make.emphasis_rgxmatch      = _mk.emphasis_rgxmatch(_conf_composite.make_str.emphasis);
+        _conf_composite.make.footer                 = _mk.footer(_conf_composite.make_str.footer);
+        _conf_composite.make.headings               = _mk.headings(_conf_composite.make_str.headings);
+        _conf_composite.make.home_button_image      = _mk.home_button_image(_conf_composite.make_str.home_button_image);
+        _conf_composite.make.home_button_text       = _mk.home_button_text(_conf_composite.make_str.home_button_text);
+        _conf_composite.make.italics_rgxmatch       = _mk.italics_rgxmatch(_conf_composite.make_str.italics);
+        _conf_composite.make.num_top                = _mk.num_top(_conf_composite.make_str.num_top);
+        _conf_composite.make.num_depth              = _mk.num_depth(_conf_composite.make_str.num_depth);
+        _conf_composite.make.substitute             = _mk.substitute(_conf_composite.make_str.substitute); // TODO
+        _conf_composite.make.texpdf_font            = _mk.texpdf_font(_conf_composite.make_str.texpdf_font);
+      }
+    }
+    return _conf_composite;
+  }
+}
+/++
+  default settings
++/
+template SiSUmakeMetaStructsSDLang() {
+  import
+    std.algorithm,
+    std.array,
+    std.container,
+    std.exception,
+    std.file,
+    std.getopt,
+    std.json,
+    std.path,
+    std.process,
+    std.range,
+    std.regex,
+    std.stdio,
+    std.string,
+    std.traits,
+    std.typecons,
+    std.uni,
+    std.utf,
+    std.conv : to;
+  import sdp.meta.conf_make_meta_structs;
+  string extractSDLangTabOrAttrib(S)(
+    S conf_sdlang,
+    string maintab,
+    string atab
+  ) {
+    string _conf_composite_string = "";
+    if (maintab in conf_sdlang.maybe.tags) {
+      auto _maintag = conf_sdlang.getTag(maintab);
+      if (
+        (atab in _maintag.maybe.tags)
+        && (_maintag.getTagValues(atab).length > 0)
+      ) {
+        debug(configsdlang) {
+          writeln(
+            "  ", __LINE__,
+            ": sdl tag, ",
+            maintab, ":", atab, ": ",
+            _maintag.getTagValues(atab)[0]
+          );
+        }
+        if (_maintag.getTagValues(atab).length == 1) {
+          writeln((_maintag.getTagValues(atab)[0]).to!string);
+          _conf_composite_string
+            = (_maintag.getTagValues(atab)[0]).to!string;
+        } else if (_maintag.getTagValues(atab).length > 1) {
+          string _tmp = "";
+          foreach (st; _maintag.getTagValues(atab)) {
+            writeln(st.to!string, ";");
+            _tmp ~= st.to!string ~ ";";
+          }
+          _conf_composite_string = _tmp;
+        }
+      } else if (
+        (atab in _maintag.maybe.attributes)
+        && (_maintag.attributes[atab][0].value.length > 0)
+      ) {
+        debug(configsdlang) {
+          writeln(
+            "  ", __LINE__,
+            ": sdl attrib, ",
+            maintab, ":", atab, ": ",
+            _maintag.attributes[atab][0].value
+          );
+        }
+        _conf_composite_string
+          = (_maintag.attributes[atab][0].value).to!string;
+      }
+    }
+    return _conf_composite_string;
+  }
+}
diff --git a/src/sdp/meta/conf_make_meta_structs.d b/src/sdp/meta/conf_make_meta_structs.d
new file mode 100644
index 0000000..211d2c0
--- /dev/null
+++ b/src/sdp/meta/conf_make_meta_structs.d
@@ -0,0 +1,305 @@
+module sdp.meta.conf_make_meta_structs;
+import
+  std.exception,
+  std.regex,
+  std.stdio,
+  std.string,
+  std.traits,
+  std.typecons,
+  std.utf,
+  std.conv : to;
+struct ConfCompositeMakeStr {
+  string bold                           = "";
+  string breaks                         = "";
+  string cover_image                    = "";
+  string css                            = "";
+  string emphasis                       = "";
+  string footer                         = "";
+  string headings                       = "";
+  string home_button_image              = "";
+  string home_button_text               = "";
+  string italics                        = "";
+  string num_top                        = "";
+  string num_depth                      = "";
+  string substitute                     = "";
+  string texpdf_font                    = "";
+}
+struct confCompositeMakeBuild {
+  auto bold_rgxmatch(string _mk) {
+    auto _rgxtxt = (_mk.empty)
+    ? `=NULL`
+    : `(` ~ _mk.dup ~ `)`;
+    return (cast(char[]) (_rgxtxt));
+  }
+  auto bold_substitute_abstract() {
+    return "<b>$1</b>";
+  }
+  auto bold_substitute_html() {
+    return "<b>$1</b>";
+  }
+  auto breaks(string _mk) {
+    return _mk;
+  }
+  auto cover_image(string _mk) {
+    return _mk;
+  }
+  auto css(string _mk) {
+    return _mk;
+  }
+  auto emphasis_rgxmatch(string _mk) {
+    auto _rgxtxt = (_mk.empty)
+    ? `=NULL`
+    : `(` ~ _mk.dup ~ `)`;
+    return (cast(char[]) (_rgxtxt));
+  }
+  auto emphasis_substitute_abstract() {
+    return "<em>$1</em>";
+  }
+  auto emphasis_substitute_html() {
+    return "<em>$1</em>";
+  }
+  auto footer(string _mk) {
+    return _mk;
+  }
+  auto headings(string _mk) {
+    return _mk;
+  }
+  auto home_button_image(string _mk) {
+    return _mk;
+  }
+  auto home_button_text(string _mk) {
+    return _mk;
+  }
+  auto italics_rgxmatch(string _mk) {
+    auto _rgxtxt = (_mk.empty)
+    ? `=NULL`
+    : `(` ~ _mk.dup ~ `)`;
+    return (cast(char[]) (_rgxtxt));
+  }
+  auto italics_substitute_abstract() {
+    return "<i>$1</i>";
+  }
+  auto italics_substitute_html() {
+    return "<i>$1</i>";
+  }
+  auto num_top(string _mk) {
+    return _mk;
+  }
+  auto num_depth(string _mk) {
+    return _mk;
+  }
+  auto substitute(string _mk) { // TODO this is different from others
+    return regex(_mk);
+  }
+  auto texpdf_font(string _mk) {
+    return _mk;
+  }
+}
+struct ConfCompositeMakeInit {
+  char[] bold_rgxmatch                  = `=NULL`.dup;
+  auto bold_substitute_abstract         = "<b>$1</b>";
+  auto bold_substitute_html             = "<b>$1</b>";
+  string breaks                         = "";
+  string cover_image                    = "";
+  string css                            = "";
+  char[] emphasis_rgxmatch              = `=NULL`.dup;
+  auto emphasis_substitute_abstract     = "<em>$1</em>";
+  auto emphasis_substitute_html         = "<em>$1</em>";
+  string footer                         = "";
+  string headings                       = "";
+  string home_button_image              = "";
+  string home_button_text               = "";
+  char[] italics_rgxmatch               = `=NULL`.dup;
+  auto italics_substitute_abstract      = "<i>$1</i>";
+  auto italics_substitute_html          = "<i>$1</i>";
+  string num_top                        = "";
+  string num_depth                      = "";
+  auto substitute                       = regex(""); // TODO
+  string texpdf_font                    = "";
+}
+struct ConfCompositeSiteLocal {
+  string webserv_url_root               = "";
+  string webserv_path                   = "";
+  string webserv_images                 = "";
+  string webserv_cgi                    = "";
+  string webserv_cgi_host               = "";
+  string webserv_cgi_host_path          = "";
+  string webserv_cgi_port               = "";
+  string webserv_cgi_user               = "";
+  string webserv_cgi_file_links         = "";
+  string processing_path                = "";
+  string processing_dir                 = "";
+  string processing_concord_max         = "";
+  string flag_act0                      = "";
+  string flag_act1                      = "";
+  string flag_act2                      = "";
+  string flag_act3                      = "";
+  string flag_act4                      = "";
+  string flag_act5                      = "";
+  string flag_act6                      = "";
+  string flag_act7                      = "";
+  string flag_act8                      = "";
+  string flag_act9                      = "";
+  string default_papersize              = "";
+  string default_text_wrap              = "";
+  string default_emphasis               = "";
+  string default_language               = "";
+  string default_digest                 = "";
+  string permission_share_source        = "";
+  string search_flag                    = "";
+  string search_action                  = "";
+  string search_db                      = "";
+  string search_title                   = "";
+}
+struct MetaComposite {
+  string classify_dewey                 = "";
+  string classify_keywords              = "";
+  string classify_loc                   = "";
+  string classify_subject               = "";
+  string classify_topic_register        = "";
+  string creator_author                 = "";
+  string creator_author_email           = "";
+  string creator_illustrator            = "";
+  string creator_translator             = "";
+  string date_added_to_site             = "";
+  string date_available                 = "";
+  string date_created                   = "";
+  string date_issued                    = "";
+  string date_modified                  = "";
+  string date_published                 = "";
+  string date_valid                     = "";
+  string identifier_isbn                = "";
+  string identifier_oclc                = "";
+  string identifier_pg                  = "";
+  string language_document              = "";
+  string language_document_char         = "";
+  string links                          = "";
+  string notes_abstract                 = "";
+  string notes_description              = "";
+  string original_language              = "";
+  string original_language_char         = "";
+  string original_publisher             = "";
+  string original_source                = "";
+  string original_title                 = "";
+  string publisher                      = "";
+  string rights_copyright               = "";
+  string rights_copyright_audio         = "";
+  string rights_copyright_cover         = "";
+  string rights_copyright_illustrations = "";
+  string rights_copyright_photographs   = "";
+  string rights_copyright_text          = "";
+  string rights_copyright_translation   = "";
+  string rights_copyright_video         = "";
+  string rights_license                 = "";
+  string title_edition                  = "";
+  string title_full                     = "";
+  string title_language                 = "";
+  string title_main                     = "";
+  string title_note                     = "";
+  string title_short                    = "";
+  string title_sub                      = "";
+  string title_subtitle                 = "";
+}
+struct ConfComposite {
+  MetaComposite               meta;
+  ConfCompositeMakeInit       make;
+  ConfCompositeSiteLocal      conf;
+}
+struct ConfCompositePlus {
+  MetaComposite               meta;
+  ConfCompositeMakeInit       make;
+  ConfCompositeMakeStr        make_str;
+  ConfCompositeSiteLocal      conf;
+}
+static auto ptr_head_main
+  = [
+    "classify",
+    "creator",
+    "date",
+    "identifier",
+    "links",
+    "make",
+    "original",
+    "notes",
+    "rights",
+    "title"
+  ];
+static auto ptr_head_sub_classify
+  = [
+    "dewey",
+    "keywords",
+    "loc",
+    "subject",
+    "topic_register"
+  ];
+static auto ptr_head_sub_creator
+  = [
+    "author",
+    "author_email",
+    "cover",
+    "illustrator",
+    "translator"
+  ];
+static auto ptr_head_sub_date
+  = [
+    "added_to_site",
+    "available",
+    "created",
+    "issued",
+    "modified",
+    "published",
+    "valid"
+  ];
+static auto ptr_head_sub_identifier
+  = [
+    "isbn",
+    "oclc",
+    "pg"
+  ];
+/+ make +/
+static auto ptr_head_sub_make
+  = [
+    "cover_image",
+    "home_button_image",
+    "home_button_text",
+    "footer", "headings",
+    "num_top", "num_depth",
+    "breaks",
+    "substitute",
+    "bold",
+    "italics",
+    "emphasis",
+    "texpdf_font",
+    "css"
+  ];
+static auto ptr_head_sub_notes
+  = [
+    "abstract",
+    "description"
+  ];
+static auto ptr_head_sub_original
+  = [
+    "language",
+    "source",
+    "title"
+  ];
+static auto ptr_head_sub_publisher
+  = [ "name" ];
+static auto ptr_head_sub_rights
+  = [
+    "copyright",
+    "cover",
+    "illustrations",
+    "license"
+  ];
+static auto ptr_head_sub_title
+  = [
+    "edition",
+    "full",
+    "language",
+    "main",
+    "note",
+    "sub"
+  ];
+auto config_jsonstr = `{
+}`;
diff --git a/src/sdp/meta/conf_make_meta_toml.d b/src/sdp/meta/conf_make_meta_toml.d
new file mode 100644
index 0000000..4390c5c
--- /dev/null
+++ b/src/sdp/meta/conf_make_meta_toml.d
@@ -0,0 +1,79 @@
+/++
+  extract native/orig header return associative array<BR>
+
+  the header is passed as text (lopped off top of a sisu markup file until the
+  required first heading ^A~), determine whether is a native header or sdlang one
+  with a regex check if whether it contains the "native header" required tag/field
+  @title: then process accordingly as a "native header" or "sdlang header"
+  converting the metadata and make instructions to a common json format used by
+  program internally. Moved to associative array.
++/
+module sdp.meta.conf_make_meta_toml;
+static template configParseTOMLreturnJSON() {
+  import
+    toml,
+    toml.json;
+  auto configParseTOMLreturnJSON(T)(
+    T _text
+  ){
+    TOMLDocument _doc;
+    _doc = parseTOML(cast(string)(_text.content));
+    auto _doc_json = toJSON(_doc);
+    return _doc_json;
+  }
+}
+static template configParseTOMLreturnSiSUstruct() {
+  import
+    toml,
+    toml.json;
+  import
+    sdp.meta.conf_make_meta_structs,
+    sdp.meta.conf_make_meta_json;
+  mixin contentJSONtoSiSUstruct;
+  auto configParseTOMLreturnSiSUstruct(CCm, T)(
+    CCm     _make_and_meta_struct,
+    T       _document_struct
+  ){
+    TOMLDocument _doc = parseTOML(cast(string)(_document_struct.content));
+    auto _doc_json = toJSON(_doc);
+    _make_and_meta_struct = contentJSONtoSiSUstruct!()(_make_and_meta_struct, _doc_json, _document_struct.filename); // struct from json
+    return _make_and_meta_struct;
+  }
+}
+static template docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct() {
+  import
+    std.exception,
+    std.regex,
+    std.stdio,
+    std.traits,
+    std.typecons,
+    std.utf,
+    std.conv : to;
+  import
+    toml,
+    toml.json;
+  import
+    sdp.meta.conf_make_meta_structs,
+    sdp.meta.conf_make_meta_json,
+    sdp.meta.rgx;
+  mixin SiSUrgxInit;
+  mixin contentJSONtoSiSUstruct;
+  static auto rgx = Rgx();
+  auto docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct(CCm, Src)(
+    CCm     _make_and_meta_struct,
+    Src     header_src,
+  ) {
+    TOMLDocument _doc;
+    if (header_src.match(rgx.sdlang_header_meta_title)) {
+      writeln("WARNING >>> document header is sdlang (in wrong location JSON)");
+    } else if (header_src.match(rgx.toml_header_meta_title)) {
+      debug (json) {
+        writeln(">>> document header is toml, convert to JSON");
+      }
+      _doc = parseTOML(cast(string)(header_src));
+    }
+    auto _doc_json = toJSON(_doc);
+    auto _header_and_make_and_meta_struct = contentJSONtoSiSUstruct!()(_make_and_meta_struct, _doc_json, "header");
+    return _header_and_make_and_meta_struct;
+  }
+}
diff --git a/src/sdp/meta/defaults.d b/src/sdp/meta/defaults.d
index 7f0586e..13bf312 100644
--- a/src/sdp/meta/defaults.d
+++ b/src/sdp/meta/defaults.d
@@ -2,275 +2,6 @@
   default settings
 +/
 module sdp.meta.defaults;
-template SiSUregisters() {
-  import
-    std.algorithm,
-    std.array,
-    std.container,
-    std.exception,
-    std.file,
-    std.getopt,
-    std.json,
-    std.path,
-    std.process,
-    std.range,
-    std.regex,
-    std.stdio,
-    std.string,
-    std.traits,
-    std.typecons,
-    std.uni,
-    std.utf,
-    std.conv : to;
-  struct ConfCompositeMake {
-    string bold                           = "";
-    string breaks                         = "";
-    string cover_image                    = "";
-    string css                            = "";
-    string emphasis                       = "";
-    string footer                         = "";
-    string headings                       = "";
-    string home_button_image              = "";
-    string home_button_text               = "";
-    string italics                        = "";
-    string num_top                        = "";
-    string num_depth                      = "";
-    string substitute                     = "";
-    string texpdf_font                    = "";
-  }
-  struct ConfCompositeMakeStr {
-    string bold                           = "";
-    string breaks                         = "";
-    string cover_image                    = "";
-    string css                            = "";
-    string emphasis                       = "";
-    string footer                         = "";
-    string headings                       = "";
-    string home_button_image              = "";
-    string home_button_text               = "";
-    string italics                        = "";
-    string num_top                        = "";
-    string num_depth                      = "";
-    string substitute                     = "";
-    string texpdf_font                    = "";
-  }
-  struct ConfCompositeSiteLocal {
-    string webserv_url_root               = "";
-    string webserv_path                   = "";
-    string webserv_images                 = "";
-    string webserv_cgi                    = "";
-    string webserv_cgi_host               = "";
-    string webserv_cgi_host_path          = "";
-    string webserv_cgi_port               = "";
-    string webserv_cgi_user               = "";
-    string webserv_cgi_file_links         = "";
-    string processing_path                = "";
-    string processing_dir                 = "";
-    string processing_concord_max         = "";
-    string flag_act0                      = "";
-    string flag_act1                      = "";
-    string flag_act2                      = "";
-    string flag_act3                      = "";
-    string flag_act4                      = "";
-    string flag_act5                      = "";
-    string flag_act6                      = "";
-    string flag_act7                      = "";
-    string flag_act8                      = "";
-    string flag_act9                      = "";
-    string default_papersize              = "";
-    string default_text_wrap              = "";
-    string default_emphasis               = "";
-    string default_language               = "";
-    string default_digest                 = "";
-    string permission_share_source        = "";
-    string search_flag                    = "";
-    string search_action                  = "";
-    string search_db                      = "";
-    string search_title                   = "";
-  }
-  struct MetaComposite {
-    string classify_dewey                 = "";
-    string classify_keywords              = "";
-    string classify_loc                   = "";
-    string classify_subject               = "";
-    string classify_topic_register        = "";
-    string creator_author                 = "";
-    string creator_author_email           = "";
-    string creator_illustrator            = "";
-    string creator_translator             = "";
-    string date_added_to_site             = "";
-    string date_available                 = "";
-    string date_created                   = "";
-    string date_issued                    = "";
-    string date_modified                  = "";
-    string date_published                 = "";
-    string date_valid                     = "";
-    string identifier_isbn                = "";
-    string identifier_oclc                = "";
-    string identifier_pg                  = "";
-    string language_document              = "";
-    string language_document_char         = "";
-    string links                          = "";
-    string notes_abstract                 = "";
-    string notes_description              = "";
-    string original_language              = "";
-    string original_language_char         = "";
-    string original_publisher             = "";
-    string original_source                = "";
-    string original_title                 = "";
-    string publisher                      = "";
-    string rights_copyright               = "";
-    string rights_copyright_audio         = "";
-    string rights_copyright_cover         = "";
-    string rights_copyright_illustrations = "";
-    string rights_copyright_photographs   = "";
-    string rights_copyright_text          = "";
-    string rights_copyright_translation   = "";
-    string rights_copyright_video         = "";
-    string rights_license                 = "";
-    string title_edition                  = "";
-    string title_full                     = "";
-    string title_language                 = "";
-    string title_main                     = "";
-    string title_note                     = "";
-    string title_short                    = "";
-    string title_sub                      = "";
-    string title_subtitle                 = "";
-  }
-  struct ConfComposite {
-    MetaComposite          meta;
-    ConfCompositeMake      make;
-    ConfCompositeSiteLocal conf;
-  }
-  struct ConfCompositePlus {
-    MetaComposite          meta;
-    ConfCompositeMake      make;
-    ConfCompositeMakeStr   make_str;
-    ConfCompositeSiteLocal conf;
-  }
-  string extractSDLangTabOrAttrib(S)(S conf_sdlang, string maintab, string atab) {
-    string _conf_composite_string = "";
-    if (maintab in conf_sdlang.maybe.tags) {
-      auto _maintag = conf_sdlang.getTag(maintab);
-      if ((atab in _maintag.maybe.tags)
-      && (_maintag.getTagValues(atab).length > 0)) {
-        debug(configsdlang) {
-          writeln(__LINE__, ": make:", atab, ": ", _maintag.getTagValues(atab)[0]);
-        }
-        if (_maintag.getTagValues(atab).length == 1) {
-          writeln((_maintag.getTagValues(atab)[0]).to!string);
-          _conf_composite_string = (_maintag.getTagValues(atab)[0]).to!string;
-        } else if (_maintag.getTagValues(atab).length > 1) {
-          string _tmp = "";
-          foreach (st; _maintag.getTagValues(atab)) {
-            writeln(st.to!string, ";");
-            _tmp ~= st.to!string ~ ";";
-          }
-          _conf_composite_string = _tmp;
-        }
-      } else if ((atab in _maintag.maybe.attributes)
-      && (_maintag.maybe.attributes[atab][0].value.length > 0)) {
-        debug(configsdlang) {
-          writeln(__LINE__, ": make:", atab, ": ", conf_sdlang.tags[maintag][0].attributes[atab][0].value);
-        }
-        _conf_composite_string = (_maintag.attributes[atab][0].value).to!string;
-      }
-    }
-    return _conf_composite_string;
-  }
-  static auto ptr_head_main
-    = [
-      "classify",
-      "creator",
-      "date",
-      "identifier",
-      "links",
-      "make",
-      "original",
-      "notes",
-      "rights",
-      "title"
-    ];
-  static auto ptr_head_sub_classify
-    = [
-      "dewey",
-      "keywords",
-      "loc",
-      "subject",
-      "topic_register"
-    ];
-  static auto ptr_head_sub_creator
-    = [
-      "author",
-      "author_email",
-      "cover",
-      "illustrator",
-      "translator"
-    ];
-  static auto ptr_head_sub_date
-    = [
-      "added_to_site",
-      "available",
-      "created",
-      "issued",
-      "modified",
-      "published",
-      "valid"
-    ];
-  static auto ptr_head_sub_identifier
-    = [
-      "isbn",
-      "oclc",
-      "pg"
-    ];
-  /+ make +/
-  static auto ptr_head_sub_make
-    = [
-      "cover_image",
-      "home_button_image",
-      "home_button_text",
-      "footer", "headings",
-      "num_top", "num_depth",
-      "breaks",
-      "substitute",
-      "bold",
-      "italics",
-      "emphasis",
-      "texpdf_font",
-      "css"
-    ];
-  static auto ptr_head_sub_notes
-    = [
-      "abstract",
-      "description"
-    ];
-  static auto ptr_head_sub_original
-    = [
-      "language",
-      "source",
-      "title"
-    ];
-  static auto ptr_head_sub_publisher
-    = [ "name" ];
-  static auto ptr_head_sub_rights
-    = [
-      "copyright",
-      "cover",
-      "illustrations",
-      "license"
-    ];
-  static auto ptr_head_sub_title
-    = [
-      "edition",
-      "full",
-      "language",
-      "main",
-      "note",
-      "sub"
-    ];
-  auto config_jsonstr = `{
-  }`;
-}
 template SiSUrgxInitFlags() {
   /+ regex flags +/
   static int[string] flags_type_init() {
diff --git a/src/sdp/meta/doc_debugs.d b/src/sdp/meta/doc_debugs.d
index 255ea92..18f50ad 100644
--- a/src/sdp/meta/doc_debugs.d
+++ b/src/sdp/meta/doc_debugs.d
@@ -55,8 +55,7 @@ template SiSUdebugs() {
     }
     debug(dumpdoc) {
       writefln(
-        "%s\n%s:%s",
-        "-------------------------------",
+        "> %s:%s",
         __FILE__,
         __LINE__,
       );
@@ -232,8 +231,7 @@ template SiSUdebugs() {
     }
     debug(objects) {
       writefln(
-        "%s\n%s:%s",
-        "-------------------------------",
+        "> %s:%s",
         __FILE__,
         __LINE__,
       );
@@ -398,8 +396,7 @@ template SiSUdebugs() {
     }
     debug(anchor) {
       writefln(
-        "%s\n%s:%s",
-        "-------------------------------",
+        "> %s:%s",
         __FILE__,
         __LINE__,
       );
@@ -435,8 +432,7 @@ template SiSUdebugs() {
     }
     debug(headings) {
       writefln(
-        "%s\n%s:%s",
-        "-------------------------------",
+        "> %s:%s",
         __FILE__,
         __LINE__,
       );
diff --git a/src/sdp/meta/metadoc.d b/src/sdp/meta/metadoc.d
index cbc5d51..8223029 100644
--- a/src/sdp/meta/metadoc.d
+++ b/src/sdp/meta/metadoc.d
@@ -9,10 +9,10 @@ template SiSUabstraction() {
     sdp.meta,
     sdp.meta.metadoc_summary,
     sdp.meta.metadoc_from_src,
-    sdp.meta.conf_make_meta,
-    // sdp.meta.conf_make_meta_native,
+    sdp.meta.conf_make_meta_structs,
     sdp.meta.conf_make_meta_sdlang,
-    sdp.meta.conf_make_meta_composite,
+    sdp.meta.conf_make_meta_toml,
+    sdp.meta.conf_make_meta_json,
     sdp.meta.defaults,
     sdp.meta.doc_debugs,
     sdp.meta.read_config_files,
@@ -21,8 +21,9 @@ template SiSUabstraction() {
     sdp.output.hub,
     sdp.output.paths_source;
   mixin SiSUrgxInit;
-  mixin SiSUregisters;
+  mixin SiSUmakeMetaStructsSDLang;
   mixin SiSUextractSDLang;
+  mixin contentJSONtoSiSUstruct;
   mixin SiSUnode;
   mixin SiSUbiblio;
   mixin SiSUrgxInitFlags;
@@ -36,9 +37,22 @@ template SiSUabstraction() {
     O _opt_action,
     M _manifest,
   ){
-    auto sdl_root_config_document = configReadDoc!()(_manifest, _env); // document config file
-    auto sdl_root_config_local_site = configReadSite!()(_manifest, _env); // local site config
-    auto conf_files_composite_make = confFilesSDLtoStruct!()(sdl_root_config_document, sdl_root_config_local_site);
+    auto _config_document_struct = readConfigDoc!()(_manifest, _env); // document config file
+    auto _config_local_site_struct = readConfigSite!()(_manifest, _env); // local site config
+    ConfCompositePlus _make_and_meta_struct;
+    switch (_config_local_site_struct.filetype) {
+    case "toml" :
+      _make_and_meta_struct = configParseTOMLreturnSiSUstruct!()(_make_and_meta_struct, _config_document_struct);
+      _make_and_meta_struct = configParseTOMLreturnSiSUstruct!()(_make_and_meta_struct, _config_local_site_struct);
+      break;
+    case "sdl" :
+      auto sdl_root_config_document = parseSDLangConfig!()(_config_document_struct.content, _config_document_struct.filename);
+      auto sdl_root_config_local_site = parseSDLangConfig!()(_config_local_site_struct.content, _config_local_site_struct.filename);
+      _make_and_meta_struct = confFilesSDLtoStruct!()(sdl_root_config_document, sdl_root_config_local_site);
+      break;
+    default :
+      break;
+    }
     /+ ↓ read file (filename with path) +/
     /+ ↓ file tuple of header and content +/
     debug(steps) {
@@ -61,9 +75,14 @@ template SiSUabstraction() {
     debug(steps) {
       writeln("step2 commence → (read document header - toml or sdlang, return struct)");
     }
-    auto _make_and_meta_struct
-      = docHeaderMakeAndMetaTupExtractAndConvertToStruct!()(
-        conf_files_composite_make,
+    _make_and_meta_struct =
+    ((_header_body_insertfilelist_imagelist[headBody.header]).match(rgx.toml_header_meta_title))
+    ? docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct!()(
+        _make_and_meta_struct,
+        _header_body_insertfilelist_imagelist[headBody.header]
+      )
+    : docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct!()(
+        _make_and_meta_struct,
         _header_body_insertfilelist_imagelist[headBody.header]
       );
     debug(steps) {
diff --git a/src/sdp/meta/metadoc_from_src.d b/src/sdp/meta/metadoc_from_src.d
index a8014e3..d0ee599 100644
--- a/src/sdp/meta/metadoc_from_src.d
+++ b/src/sdp/meta/metadoc_from_src.d
@@ -1396,7 +1396,8 @@ template SiSUdocAbstraction() {
             segnames_0_4 ~= obj.segment_anchor_tag;
             if (obj.heading_lev_markup == 4) {
               obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -1425,7 +1426,8 @@ template SiSUdocAbstraction() {
             segnames_0_4 ~= obj.segment_anchor_tag;
             if (obj.heading_lev_markup == 4) {
               obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           if ((opt_action.html)
@@ -1454,7 +1456,8 @@ template SiSUdocAbstraction() {
               if (html_segnames.length > obj.ptr_html_segnames + 1) {
                 obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
               }
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -1496,7 +1499,8 @@ template SiSUdocAbstraction() {
               if (html_segnames.length > obj.ptr_html_segnames + 1) {
                 obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
               }
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -1531,7 +1535,8 @@ template SiSUdocAbstraction() {
               if (html_segnames.length > obj.ptr_html_segnames + 1) {
                 obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
               }
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -1570,7 +1575,8 @@ template SiSUdocAbstraction() {
               if (html_segnames.length > obj.ptr_html_segnames + 1) {
                 obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
               }
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -1614,7 +1620,8 @@ template SiSUdocAbstraction() {
               if (html_segnames.length > obj.ptr_html_segnames + 1) {
                 obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
               }
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -1653,7 +1660,8 @@ template SiSUdocAbstraction() {
               if (html_segnames.length > obj.ptr_html_segnames + 1) {
                 obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
               }
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -1696,7 +1704,8 @@ template SiSUdocAbstraction() {
               if (html_segnames.length > obj.ptr_html_segnames + 1) {
                 obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];
               }
-              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]);
+              assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames],
+              obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);
             }
           }
           /+ dom structure (marked up & collapsed) +/
@@ -2963,7 +2972,7 @@ template SiSUdocAbstraction() {
       comp_obj_block = comp_obj_block.init;
       obj_cite_digits = ocn_emit(OCNstatus.on);
       an_object["bookindex_nugget"]
-        =("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
+        = ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";
       bookindex_unordered_hashes
         = bookindex_extract_hash.bookindex_nugget_hash(
           an_object["bookindex_nugget"],
diff --git a/src/sdp/meta/read_config_files.d b/src/sdp/meta/read_config_files.d
index 15a7a67..554f740 100644
--- a/src/sdp/meta/read_config_files.d
+++ b/src/sdp/meta/read_config_files.d
@@ -4,16 +4,16 @@
   meta_config_files.d
 +/
 module sdp.meta.read_config_files;
-static template configInSite() {
+static template configReadInSiteSDL() {
   import
     sdp.meta,
     sdp.output.paths_source,
     std.file,
     std.path;
-  final string configInSite(M,E)(M manifest, E env) {
+  final string configReadInSiteSDL(M,E)(M manifest, E env) {
     auto conf_file_details = ConfigFilePaths!()(manifest, env);
-    string conf_sdl = conf_file_details.possible_config_path_locations.config_filename_site;
-    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.local_site;
+    string conf_sdl = conf_file_details.config_filename_site_sdl;
+    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.config_local_site;
     string config_file_str;
     debug(io) {
       writeln("WARNING (io debug) in config filename: ", conf_sdl);
@@ -41,16 +41,16 @@ static template configInSite() {
     return config_file_str;
   }
 }
-static template configInDoc() {
+static template configReadInDocSDL() {
   import
     sdp.meta,
     sdp.output.paths_source,
     std.file,
     std.path;
-  final string configInDoc(M,E)(M manifest, E env) {
+  final string configReadInDocSDL(M,E)(M manifest, E env) {
     auto conf_file_details = ConfigFilePaths!()(manifest, env);
-    string conf_sdl = conf_file_details.config_filename_document;
-    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.document;
+    string conf_sdl = conf_file_details.config_filename_document_sdl;
+    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.sisu_document_make;
     string config_file_str;
     debug(io) {
       writeln("WARNING (io debug) in config filename: ", conf_sdl);
@@ -78,17 +78,88 @@ static template configInDoc() {
     return config_file_str;
   }
 }
-/+
-
-+/
-static template ConfigSDLang() {
+static template configReadInSiteTOML() {
+  import
+    sdp.meta,
+    sdp.output.paths_source,
+    std.file,
+    std.path;
+  final string configReadInSiteTOML(M,E)(M manifest, E env) {
+    auto conf_file_details = ConfigFilePaths!()(manifest, env);
+    string conf_toml = conf_file_details.config_filename_site_toml;
+    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.config_local_site;
+    string config_file_str;
+    debug(io) {
+      writeln("WARNING (io debug) in config filename: ", conf_toml);
+      writeln("WARNING (io debug) in config possible path locations: ", possible_config_path_locations);
+    }
+    foreach(pth; possible_config_path_locations) {
+      auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_toml)).array;
+      if (config_file_str.length > 0) {
+        break;
+      }
+      try {
+        if (exists(conf_file)) {
+          debug(io) {
+            writeln("WARNING (io debug) in config file found: ", conf_file);
+          }
+          config_file_str = conf_file.readText;
+          break;
+        }
+      }
+      catch (ErrnoException ex) {
+      }
+      catch (FileException ex) {
+      }
+    }
+    return config_file_str;
+  }
+}
+static template configReadInDocTOML() {
+  import
+    sdp.meta,
+    sdp.output.paths_source,
+    std.file,
+    std.path;
+  final string configReadInDocTOML(M,E)(M manifest, E env) {
+    auto conf_file_details = ConfigFilePaths!()(manifest, env);
+    string conf_toml = conf_file_details.config_filename_document_toml;
+    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.sisu_document_make;
+    string config_file_str;
+    debug(io) {
+      writeln("WARNING (io debug) in config filename: ", conf_toml);
+      writeln("WARNING (io debug) in config possible path locations: ", possible_config_path_locations);
+    }
+    foreach(pth; possible_config_path_locations) {
+      auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_toml)).array;
+      if (config_file_str.length > 0) {
+        break;
+      }
+      try {
+        if (exists(conf_file)) {
+          debug(io) {
+            writeln("WARNING (io debug) in config file found: ", conf_file);
+          }
+          config_file_str = conf_file.readText;
+          break;
+        }
+      }
+      catch (ErrnoException ex) {
+      }
+      catch (FileException ex) {
+      }
+    }
+    return config_file_str;
+  }
+}
+static template configSDLang() {
   import sdlang;
   import
     sdp.meta,
     sdp.output.paths_source,
     std.file,
     std.path;
-  auto ConfigSDLang(string configuration, string conf_sdl_filename) {
+  auto configSDLang(string configuration, string conf_sdl_filename) {
     Tag sdl_root_conf;
     try {
       sdl_root_conf = parseSource(configuration);
@@ -100,35 +171,181 @@ static template ConfigSDLang() {
     return sdl_root_conf;
   }
 }
-/+
-+/
-static template configReadSite() {
+static template configTOML() {
+  import toml; //
   import
     sdp.meta,
     sdp.output.paths_source,
     std.file,
     std.path;
-  
-  final auto configReadSite(M,E)(M manifest, E env) {
-    auto configuration = configInSite!()(manifest, env);
+  auto configTOML(string configuration, string conf_toml_filename) {
+    TOMLDocument _toml_conf;
+    try {
+      _toml_conf = parseTOML(configuration); // parseTOML(cast(string)(configuration));
+    }
+    catch(ErrnoException e) {
+      stderr.writeln("Toml problem with content for ", conf_toml_filename);
+      stderr.writeln(e.msg);
+    }
+    return _toml_conf;
+  }
+}
+static template readConfigSite() {
+  import
+    sdp.meta,
+    sdp.output.paths_source,
+    std.file,
+    std.path;
+  final auto readConfigSite(M,E)(M _manifest, E _env) {
+    string config_file_str;
+    string conf_filename = "NONE";
+    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env);
+    auto possible_config_path_locations = _conf_file_details.possible_config_path_locations.config_local_site;
+    foreach(conf_fn; [_conf_file_details.config_filename_site_toml, _conf_file_details.config_filename_site_sdl]) {
+      foreach(pth; possible_config_path_locations) {
+        auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_fn)).array;
+        conf_filename = conf_fn;
+        if (config_file_str.length > 0) {
+          // conf_filename = conf_fn;
+          break;
+        }
+        try {
+          if (exists(conf_file)) {
+            debug(io) {
+              writeln("WARNING (io debug) in config file found: ", conf_file);
+              // writeln(__LINE__, ": found: ", conf_file, " in ", pth);
+            }
+            config_file_str = conf_file.readText;
+            break;
+          }
+        }
+        catch (ErrnoException ex) {
+        }
+        catch (FileException ex) {
+        }
+      }
+      if (config_file_str.length > 0) { break; }
+    }
+    struct _ConfContent {
+      string filename() {
+        return conf_filename;
+      }
+      string filetype() {
+        return conf_filename.extension.chompPrefix(".");
+      }
+      auto content() {
+        return config_file_str;
+      }
+    }
+    return _ConfContent();
+  }
+}
+static template readConfigDoc() {
+  import
+    sdp.meta,
+    sdp.output.paths_source,
+    std.file,
+    std.path;
+  final auto readConfigDoc(M,E)(M _manifest, E _env) {
+    string config_file_str;
+    string conf_filename = "NONE";
+    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env);
+    auto possible_config_path_locations = _conf_file_details.possible_config_path_locations.sisu_document_make;
+    foreach(conf_fn; [_conf_file_details.config_filename_document_toml, _conf_file_details.config_filename_document_sdl]) {
+      foreach(pth; possible_config_path_locations) {
+        auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_fn)).array;
+        conf_filename = conf_fn;
+        if (config_file_str.length > 0) {
+          // conf_filename = conf_fn;
+          break;
+        }
+        try {
+          if (exists(conf_file)) {
+            debug(io) {
+              writeln("WARNING (io debug) in config file found: ", conf_file);
+            }
+            config_file_str = conf_file.readText;
+            break;
+          }
+        }
+        catch (ErrnoException ex) {
+        }
+        catch (FileException ex) {
+        }
+      }
+      if (config_file_str.length > 0) { break; }
+    }
+    struct _ConfContent {
+      string filename() {
+        return conf_filename;
+      }
+      string filetype() {
+        return conf_filename.extension.chompPrefix(".");
+      }
+      auto content() {
+        return config_file_str;
+      }
+    }
+    return _ConfContent();
+  }
+}
+static template configReadSiteSDLang() {
+  import
+    sdp.meta,
+    sdp.output.paths_source,
+    std.file,
+    std.path;
+  import sdlang;
+  final auto configReadSiteSDLang(M,E)(M manifest, E env) {
+    auto configuration = configReadInSiteSDL!()(manifest, env);
     auto conf_file_details = ConfigFilePaths!()(manifest, env);
-    string conf_sdl = conf_file_details.possible_config_path_locations.config_filename_site;
-    auto sdl_root = ConfigSDLang!()(configuration, conf_sdl);
+    string conf_sdl = conf_file_details.config_filename_site_sdl;
+    auto sdl_root = configSDLang!()(configuration, conf_sdl);
     return sdl_root;
   }
 }
-static template configReadDoc() {
+static template configReadDocSDLang() {
   import
     sdp.meta,
     sdp.output.paths_source,
     std.file,
     std.path;
-  
-  final auto configReadDoc(M,E)(M manifest, E env) {
-    auto configuration = configInDoc!()(manifest, env);
+  import sdlang;
+  final auto configReadDocSDLang(M,E)(M manifest, E env) {
+    auto configuration = configReadInDocSDL!()(manifest, env);
     auto conf_file_details = ConfigFilePaths!()(manifest, env);
-    string conf_sdl = conf_file_details.config_filename_document;
-    auto sdl_root = ConfigSDLang!()(configuration, conf_sdl);
+    string conf_sdl = conf_file_details.config_filename_document_sdl;
+    auto sdl_root = configSDLang!()(configuration, conf_sdl);
     return sdl_root;
   }
 }
+static template configReadSiteTOML() {
+  import
+    sdp.meta,
+    sdp.output.paths_source,
+    std.file,
+    std.path;
+  import toml;
+  final auto configReadSiteTOML(M,E)(M _manifest, E _env) {
+    auto _configuration = configReadInSiteTOML!()(_manifest, _env);
+    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env);
+    string _conf_toml = _conf_file_details.config_filename_site_toml;
+    auto _toml_conf = configTOML!()(_configuration, _conf_toml);
+    return _toml_conf;
+  }
+}
+static template configReadDocTOML() {
+  import
+    sdp.meta,
+    sdp.output.paths_source,
+    std.file,
+    std.path;
+  import toml;
+  final auto configReadDocTOML(M,E)(M _manifest, E _env) {
+    auto _configuration = configReadInDocTOML!()(_manifest, _env);
+    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env);
+    string _conf_toml = _conf_file_details.config_filename_document_toml;
+    auto _toml_conf = configTOML!()(_configuration, _conf_toml);
+    return _toml_conf;
+  }
+}
diff --git a/src/sdp/meta/read_source_files.d b/src/sdp/meta/read_source_files.d
index 0e53e73..cd4a253 100644
--- a/src/sdp/meta/read_source_files.d
+++ b/src/sdp/meta/read_source_files.d
@@ -155,7 +155,7 @@ static template SiSUrawMarkupContent() {
     }
   }
   struct Inserts {
-    import sdp.meta.defaults;
+    import sdp.meta.conf_make_meta_sdlang;
     auto scan_subdoc_source(O)(
       O        _opt_action,
       char[][] markup_sourcefile_insert_content,
@@ -293,10 +293,6 @@ static template SiSUrawMarkupContent() {
             insert_file_list ~= to!string(fn_src_insert);
           auto raw = MarkupRawUnit();
           /+ TODO +/
-          if (auto ma = line.match(rgx.src_fn_text)) {
-            /+ .sst when inserted, not used: headers and heading level ^:?A~ so remove +/
-            writeln(__LINE__); writeln(ma);
-          }
           auto markup_sourcefile_insert_content
             = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts);
           debug(insert_file) {
diff --git a/src/sdp/meta/rgx.d b/src/sdp/meta/rgx.d
index fe9e36d..35d6970 100644
--- a/src/sdp/meta/rgx.d
+++ b/src/sdp/meta/rgx.d
@@ -53,6 +53,8 @@ static template SiSUrgxInit() {
     static variable_doc_title                             = ctRegex!(`@title`);
     static variable_doc_author                            = ctRegex!(`@author|@creator`);
     static raw_author_munge                               = ctRegex!(`(\S.+?),\s+(.+)`,"i");
+    static sdlang_header_meta_title                       = ctRegex!(`^\s*title\s+["\\]`, "m");
+    static toml_header_meta_title                         = ctRegex!(`^\s*(title\s*=\s*"|\[title\])`, "m");
     /+ head +/
     static native_subhead_creator                         = ctRegex!(`^(?:author|translator|illustrator)$`, "m");
     static native_subhead_title                           = ctRegex!(`^(?:main|sub(?:title)?|full|language|edition|note)$`, "m");
@@ -171,6 +173,7 @@ static template SiSUrgxInit() {
     static break_page_line_across                         = ctRegex!(`^=[.]{2}=$`);
     static break_string                                   = ctRegex!(`』`);
     static parent                                         = ctRegex!(`([0-7]):([0-9]+)`);
+    static header_regex_content                           = ctRegex!(`([0-7]):([0-9]+)`);
     /+ json +/
     static tailing_comma                                  = ctRegex!(`,$`, "m");
     /+ biblio tags +/
@@ -197,7 +200,9 @@ static template SiSUrgxInit() {
     static nbsp_and_space                                 = ctRegex!(`&nbsp;[ ]`, "mg");
     static nbsp_char_and_space                            = ctRegex!(`░[ ]`, "mg");
     static src_pth_sst_or_ssm                             = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`);
+    static src_pth_pod_sst_or_ssm                         = ctRegex!(`^(?P<podpath>[/]?(?:[a-zA-Z0-9._-]+/)*)media/text/[a-z]{2}/(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`);
     static src_pth_contents                               = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisupod[.]manifest$`);
+    static src_pth_pod_root                               = ctRegex!(`^(?P<podroot>(?:[/]?(?:[a-zA-Z0-9._-]+/)*)(sisupod))$`);
     static src_pth_zip                                    = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]zip)$`);
     static src_pth_unzip_pod                              = ctRegex!(`^(?P<path>media/text/[a-z]{2}/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[im])$`);
     static src_pth_types                                  =
@@ -212,7 +217,8 @@ static template SiSUrgxInit() {
     static src_fn_find_inserts                            = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[im])$`);
     static insert_src_fn_ssi_or_sst                       = ctRegex!(`^<<\s*(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[ti])$`);
     static src_base_parent_dir_name                       = ctRegex!(`[/](?P<dir>(?:[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure
-    static src_formalised_file_path_parts                 = ctRegex!(`(?P<pth>(?:[/a-zA-Z0-9._-]+?)(?P<dir>[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalized dir structure
+    static src_base_parent_path                           = ctRegex!(`(?P<dir>(?:[/a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure
+    static src_formalised_file_path_parts                 = ctRegex!(`(?P<pth>(?:[/a-zA-Z0-9._-]+?)(?P<dir>[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure
     /+ inline markup footnotes endnotes +/
     static inline_notes_al                                = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg");
     static inline_notes_al_gen                            = ctRegex!(`【.+?】`, "m");
@@ -258,6 +264,7 @@ static template SiSUrgxInit() {
     static inline_italics_line                            = ctRegex!(`^/_ (?P<text>.+?)((?: [\\]{2}|[~]#){0,2}$)`);
     static inline_underscore_line                         = ctRegex!(`^__ (?P<text>.+?)((?: [\\]{2}|[~]#){0,2}$)`);
     static inline_fontface_clean                          = ctRegex!(`[*!_/^,+#■"-]\{|\}[*!_/^,+#■"-]`, "mg");
+    static no_header_rgx                                  = ctRegex!(`^=NULL$`);
     /+ table delimiters +/
     static table_delimiter_col                           = ctRegex!("[ ]*[┊][ ]*", "mg");
     static table_delimiter_row                           = ctRegex!("[ ]*\n", "mg");
-- 
cgit v1.2.3