From ae23669169b32d4986af06c1ae9483cc9c52d39d Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Sat, 7 Jul 2018 13:55:43 -0400
Subject: 0.26.4 file renames, cleaning, reorganisation

---
 src/sdp/meta/conf_make_meta_sdlang.d | 474 ---------------------
 src/sdp/meta/doc_debugs.d            |  14 +-
 src/sdp/meta/metadoc.d               |   8 +-
 src/sdp/meta/read_config_files.d     | 226 ----------
 src/sdp/meta/read_source_files.d     | 354 ----------------
 src/sdp/output/epub3.d               |   4 +-
 src/sdp/output/html.d                |   8 +-
 src/sdp/output/package.d             |   2 +-
 src/sdp/output/paths_output.d        |  22 +-
 src/sdp/output/paths_source.d        | 791 -----------------------------------
 src/sdp/output/sqlite.d              |  14 +-
 src/sdp/output/xmls.d                | 178 ++++----
 src/sdp/sdp.d                        |  10 +-
 src/sdp/source/paths_source.d        | 774 ++++++++++++++++++++++++++++++++++
 src/sdp/source/read_config_files.d   | 226 ++++++++++
 src/sdp/source/read_source_files.d   | 354 ++++++++++++++++
 16 files changed, 1481 insertions(+), 1978 deletions(-)
 delete mode 100644 src/sdp/meta/conf_make_meta_sdlang.d
 delete mode 100644 src/sdp/meta/read_config_files.d
 delete mode 100644 src/sdp/meta/read_source_files.d
 delete mode 100644 src/sdp/output/paths_source.d
 create mode 100644 src/sdp/source/paths_source.d
 create mode 100644 src/sdp/source/read_config_files.d
 create mode 100644 src/sdp/source/read_source_files.d

(limited to 'src')

diff --git a/src/sdp/meta/conf_make_meta_sdlang.d b/src/sdp/meta/conf_make_meta_sdlang.d
deleted file mode 100644
index 4ebe960..0000000
--- a/src/sdp/meta/conf_make_meta_sdlang.d
+++ /dev/null
@@ -1,474 +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_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
-+/
-static template SiSUextractSDLang() {
-  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;
-  struct extractSDL {
-    mixin SiSUmakeMetaStructsSDLang;
-    mixin SiSUrgxInit;
-    static auto rgx = Rgx();
-    private auto docHeaderSDLtagGet(Hs)(Hs src_header) {
-      debug(asserts){
-        static assert(is(typeof(src_header) == char[]));
-      }
-      char[][] source_header_arr
-        = (cast(char[]) src_header).split(rgx.newline_eol_delimiter);
-      char[] _src_header;
-      foreach(header_line; source_header_arr) {
-        if (!match(header_line, rgx.comments)) {
-          _src_header ~= header_line ~ "\n";
-        }
-      }
-      scope(failure) {
-        stderr.writefln(
-          "%s\n%s\n%s:%s failed here:\n  _src_header: %s",
-          __MODULE__, __FUNCTION__,
-          __FILE__, __LINE__,
-          _src_header,
-        );
-      }
-      Tag sdl_root_header;
-      try {
-        sdl_root_header = parseSource(_src_header.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_header.toSDLDocument());
-        writeln(__LINE__, ": ",  sdl_root_header.maybe.namespaces);
-        writeln("header make sdlang: ", sdl_root_header.toSDLDocument());
-        writeln(__LINE__, ": ", sdl_root_header.getTagValues("title"));
-        writeln(__LINE__, ": ", sdl_root_header.getTagValues("creator"));
-        Tag creator = sdl_root_header.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_header; // sdlang.ast.Tag
-    }
-    private auto docSDLtoStruct(C,Tag)(C _conf_composite, Tag header_sdlang) { // work on
-      /+ make ------------------------------------------------------------------- +/
-      if ("make" in header_sdlang.maybe.tags) {
-        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");
-      }
-      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");
-      }
-      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");
-      }
-      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");
-      }
-      /+ 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");
-      }
-      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");
-      }
-      if ("links" in header_sdlang.maybe.tags) {
-        // _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");
-      }
-      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");
-      }
-      if ("publisher" in header_sdlang.maybe.tags) {
-        // _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");
-        _conf_composite.meta.rights_copyright_text          = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_text");
-        _conf_composite.meta.rights_copyright_audio         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_audio");
-        _conf_composite.meta.rights_copyright_cover         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_cover");
-        _conf_composite.meta.rights_copyright_illustrations = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_illustrations");
-        _conf_composite.meta.rights_copyright_photographs   = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_photographs");
-        _conf_composite.meta.rights_copyright_translation   = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_translation");
-        _conf_composite.meta.rights_copyright_video         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_video");
-        _conf_composite.meta.rights_license                 = extractSDLangTabOrAttrib(header_sdlang, "rights", "license");
-      }
-      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");
-        }
-        // dochead_meta["creator"]["author_raw"] = dochead_meta["creator"]["author"];
-        string[] authors_arr;
-        auto authors_raw_arr = _conf_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");
-        }
-        _conf_composite.meta.creator_author = join(authors_arr, ", ").chomp.chomp;
-      }
-      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_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");
-          if (_maintag !is null) {
-            if ("main" in _maintag.maybe.tags) {
-              _conf_composite.meta.title_main
-                = to!string(_maintag.getTagValues("main"));
-            } else if ("main" !in _maintag.maybe.attributes) {
-              _conf_composite.meta.title_main
-                = (_maintag.values[0]).to!string; // test that this exists
-            }
-          }
-        }
-        if ((!(_conf_composite.meta.title_subtitle.empty))
-        && (_conf_composite.meta.title_sub.empty)) {
-          _conf_composite.meta.title_sub = _conf_composite.meta.title_subtitle;
-        }
-        _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/doc_debugs.d b/src/sdp/meta/doc_debugs.d
index 89ca3a7..66b5f0e 100644
--- a/src/sdp/meta/doc_debugs.d
+++ b/src/sdp/meta/doc_debugs.d
@@ -23,8 +23,8 @@ template SiSUdebugs() {
     std.utf,
     std.conv : to;
   auto SiSUdebugs(S,T)(
-    auto return ref const S  contents,
-    auto return ref T        doc_matters,
+    const S  contents,
+          T  doc_matters,
   ) {
     mixin SiSUrgxInit;
     mixin InternalMarkup;
@@ -595,8 +595,8 @@ template SiSUdebugs() {
         }
         debug(checkdoc) {
           void out_segnames(S,T)(
-            auto return ref const S  contents,
-            auto return ref T        doc_matters,
+            const S  contents,
+                  T  doc_matters,
           ) {
             foreach (key; doc_matters.xml.keys_seq.seg) {
               if (contents[key].length > 1) {
@@ -611,7 +611,7 @@ template SiSUdebugs() {
         }
         debug(checkdoc) {
           void out_toc(S)(
-            auto return ref const S  contents,
+            const S  contents,
             string                   key,
           ) {
             if (contents[key].length > 1) {
@@ -629,7 +629,7 @@ template SiSUdebugs() {
         }
         debug(checkdoc) {
           void out_endnotes(S)(
-            auto return ref const S  contents,
+            const S  contents,
             string                   key,
           ) {
             if (contents[key].length > 1) {
@@ -645,7 +645,7 @@ template SiSUdebugs() {
         }
         debug(checkdoc) {
           void out_bookindex(S)(
-            auto return ref const S  contents,
+            const S  contents,
             string                   key,
           ) {
             if (contents[key].length > 1) {
diff --git a/src/sdp/meta/metadoc.d b/src/sdp/meta/metadoc.d
index 8160010..29af49c 100644
--- a/src/sdp/meta/metadoc.d
+++ b/src/sdp/meta/metadoc.d
@@ -14,11 +14,11 @@ template SiSUabstraction() {
     sdp.meta.conf_make_meta_json,
     sdp.meta.defaults,
     sdp.meta.doc_debugs,
-    sdp.meta.read_config_files,
-    sdp.meta.read_source_files,
     sdp.meta.rgx,
-    sdp.output.hub,
-    sdp.output.paths_source;
+    sdp.source.paths_source,
+    sdp.source.read_config_files,
+    sdp.source.read_source_files,
+    sdp.output.hub;
   mixin SiSUrgxInit;
   mixin contentJSONtoSiSUstruct;
   mixin SiSUbiblio;
diff --git a/src/sdp/meta/read_config_files.d b/src/sdp/meta/read_config_files.d
deleted file mode 100644
index 22d285f..0000000
--- a/src/sdp/meta/read_config_files.d
+++ /dev/null
@@ -1,226 +0,0 @@
-/++
-  read configuration files<BR>
-  - read config files<BR>
-  meta_config_files.d
-+/
-module sdp.meta.read_config_files;
-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(pth.to!string, 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(pth.to!string, 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 configTOML() {
-  import toml; //
-  import
-    sdp.meta,
-    sdp.output.paths_source,
-    std.file,
-    std.path;
-  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]) {
-      foreach(pth; possible_config_path_locations) {
-        auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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]) {
-      foreach(pth; possible_config_path_locations) {
-        auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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 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
deleted file mode 100644
index 135d8e8..0000000
--- a/src/sdp/meta/read_source_files.d
+++ /dev/null
@@ -1,354 +0,0 @@
-/++
-  module meta_read_source_files;<BR>
-  - open markup files<BR>
-  - if master file scan for addional files to import/insert
-+/
-module sdp.meta.read_source_files;
-static template SiSUrawMarkupContent() {
-  import
-    sdp.meta.rgx;
-  import
-    sdp.meta,
-    sdp.output.paths_source,
-    std.file,
-    std.path;
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  string[] _images=[];
-  auto _extract_images(S)(S content_block) {
-    string[] images_;
-    auto _content_block = content_block.to!string;
-    if (auto m = _content_block.matchAll(rgx.image)) {
-      images_ ~= m.captures[1].to!string;
-    }
-    return images_;
-  }
-  auto rawsrc = RawMarkupContent();
-  auto SiSUrawMarkupContent(O,Fn)(O _opt_action, Fn fn_src) {
-    auto _0_header_1_body_content_2_insert_filelist_tuple
-      = rawsrc.sourceContentSplitIntoHeaderAndBody(_opt_action, rawsrc.sourceContent(fn_src), fn_src);
-    return _0_header_1_body_content_2_insert_filelist_tuple;
-  }
-  struct RawMarkupContent {
-    final sourceContent(in string fn_src) {
-      auto raw = MarkupRawUnit();
-      auto source_txt_str
-        = raw.markupSourceReadIn(fn_src);
-      return source_txt_str;
-    }
-    final auto sourceContentSplitIntoHeaderAndBody(O)(O _opt_action, in string source_txt_str, in string fn_src="") {
-      auto raw = MarkupRawUnit();
-      string[] insert_file_list;
-      string[] images_list;
-      auto t
-        = raw.markupSourceHeaderContentRawLineTupleArray(source_txt_str);
-      auto header_raw = t[0];
-      auto sourcefile_body_content = t[1];
-      if (fn_src.match(rgx.src_fn_master)) { // filename with path needed if master file (.ssm) not otherwise
-        auto ins = Inserts();
-        auto tu
-          = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src);
-        static assert(!isTypeTuple!(tu));
-        sourcefile_body_content = tu[0];
-        insert_file_list = tu[1].dup;
-        images_list = tu[2].dup;
-      } else if (_opt_action.source || _opt_action.sisupod) {
-        auto ins = Inserts();
-        auto tu
-          = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src);
-        static assert(!isTypeTuple!(tu));
-        images_list = tu[2].dup;
-      }
-      t = tuple(
-        header_raw,
-        sourcefile_body_content,
-        insert_file_list,
-        images_list
-      );
-      static assert(t.length==4);
-      return t;
-    }
-  }
-  struct MarkupRawUnit {
-    import std.file;
-    final private string readInMarkupSource(in char[] fn_src) {
-      enforce(
-        exists(fn_src)!=0,
-        "file not found: «" ~
-        fn_src ~ "»"
-      );
-      string source_txt_str;
-      try {
-        if (exists(fn_src)) {
-          debug(io) {
-            writeln("in src, markup source file found: ", fn_src);
-          }
-          source_txt_str = fn_src.readText;
-        }
-      }
-      catch (ErrnoException ex) {
-      }
-      catch (UTFException ex) {
-        // Handle validation errors
-      }
-      catch (FileException ex) {
-        // Handle errors
-      }
-      std.utf.validate(source_txt_str);
-      return source_txt_str;
-    }
-    final private char[][] header0Content1(in string src_text) {
-      /+ split string on _first_ match of "^:?A~\s" into [header, content] array/tuple +/
-      char[][] header_and_content;
-      auto m = (cast(char[]) src_text).matchFirst(rgx.heading_a);
-      header_and_content ~= m.pre;
-      header_and_content ~= m.hit ~ m.post;
-      assert(header_and_content.length == 2,
-        "document markup is broken, header body split == "
-        ~ header_and_content.length.to!string
-        ~ "; (header / body array split should == 2 (split is on level A~))"
-      );
-      return header_and_content;
-    }
-    final private char[][] markupSourceLineArray(in char[] src_text) {
-      char[][] source_line_arr
-        = (cast(char[]) src_text).split(rgx.newline_eol_strip_preceding);
-      return source_line_arr;
-    }
-    auto markupSourceReadIn(in string fn_src) {
-      static auto rgx = Rgx();
-      enforce(
-        fn_src.match(rgx.src_pth_sst_or_ssm),
-        "not a sisu markup filename: «" ~
-        fn_src ~ "»"
-      );
-      auto source_txt_str = readInMarkupSource(fn_src);
-      return source_txt_str;
-    }
-    auto markupSourceHeaderContentRawLineTupleArray(in string source_txt_str) {
-      string[] file_insert_list = [];
-      string[] images_list = [];
-      auto hc = header0Content1(source_txt_str);
-      auto header = hc[0];
-      char[] source_txt = hc[1];
-      auto source_line_arr = markupSourceLineArray(source_txt);
-      auto t = tuple(
-        header,
-        source_line_arr,
-        file_insert_list,
-        images_list
-      );
-      return t;
-    }
-    final char[][] getInsertMarkupSourceContentRawLineArray(
-      in char[]    fn_src_insert,
-      Regex!(char) rgx_file
-    ) {
-      enforce(
-        fn_src_insert.match(rgx_file),
-        "not a sisu markup filename: «" ~
-        fn_src_insert  ~ "»"
-      );
-      auto source_txt_str = readInMarkupSource(fn_src_insert);
-      auto source_line_arr = markupSourceLineArray(source_txt_str);
-      return source_line_arr;
-    }
-  }
-  struct Inserts {
-    auto scan_subdoc_source(O)(
-      O        _opt_action,
-      char[][] markup_sourcefile_insert_content,
-      string   fn_src
-    ) {
-      mixin SiSUrgxInitFlags;
-      char[][] contents_insert;
-      auto type1 = flags_type_init;
-      auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm);
-      auto markup_src_file_path = fn_pth_full.captures[1];
-      foreach (line; markup_sourcefile_insert_content) {
-        if (type1["curly_code"] == 1) {
-          type1["header_make"] = 0;
-          type1["header_meta"] = 0;
-          if (line.matchFirst(rgx.block_curly_code_close)) {
-            type1["curly_code"] = 0;
-          }
-          contents_insert ~= line;
-        } else if (line.matchFirst(rgx.block_curly_code_open)) {
-          type1["curly_code"] = 1;
-          type1["header_make"] = 0;
-          type1["header_meta"] = 0;
-          contents_insert ~= line;
-        } else if (type1["tic_code"] == 1) {
-          type1["header_make"] = 0;
-          type1["header_meta"] = 0;
-          if (line.matchFirst(rgx.block_tic_close)) {
-            type1["tic_code"] = 0;
-          }
-          contents_insert ~= line;
-        } else if (line.matchFirst(rgx.block_tic_code_open)) {
-          type1["tic_code"] = 1;
-          type1["header_make"] = 0;
-          type1["header_meta"] = 0;
-          contents_insert ~= line;
-        } else if (
-          (type1["header_make"] == 1)
-          && line.matchFirst(rgx.native_header_sub)
-        ) {
-            type1["header_make"] = 1;
-            type1["header_meta"] = 0;
-        } else if (
-          (type1["header_meta"] == 1)
-          && line.matchFirst(rgx.native_header_sub)
-        ) {
-            type1["header_meta"] = 1;
-            type1["header_make"] = 0;
-        } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) {
-          type1["header_make"] = 0;
-          type1["header_meta"] = 0;
-          auto insert_fn = m.captures[2];
-          auto insert_sub_pth = m.captures[1];
-          auto fn_src_insert
-            = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array;
-          auto raw = MarkupRawUnit();
-          auto markup_sourcesubfile_insert_content
-            = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts);
-          debug(insert_file) {
-            tell_l("red", line);
-            tell_l("red", fn_src_insert);
-            tell_l("fuchsia", "ERROR");
-            writeln(
-              "  length contents insert array: ",
-              markup_sourcesubfile_insert_content.length
-            );
-          }
-          if (_opt_action.source || _opt_action.sisupod) {
-            _images ~= _extract_images(markup_sourcesubfile_insert_content);
-          }
-          auto ins = Inserts();
-          /+
-            - 1. load file
-            - 2. read lines
-            - 3. scan lines
-              - a. if filename insert, and insert filename
-                 - repeat 1
-              - b. else
-                 - add line to new array;
-                 - build image list, search for any image files to add to image list
-          +/
-        } else {
-          type1["header_make"] = 0;
-          type1["header_meta"] = 0;
-          contents_insert ~= line; // images to extract for image list?
-          if (_opt_action.source || _opt_action.sisupod) {
-            auto _image_linelist = _extract_images(line);
-            if (_image_linelist.length > 0) {
-              _images ~= _image_linelist;
-            }
-          }
-        }
-      } // end src subdoc (inserts) loop
-      auto t = tuple(
-        contents_insert,
-        _images
-      );
-      return t;
-    }
-    auto scan_master_src_for_insert_files_and_import_content(O)(
-      O        _opt_action,
-      char[][] sourcefile_body_content,
-      string   fn_src
-    ) {
-      import std.algorithm;
-      mixin SiSUrgxInitFlags;
-      char[][] contents;
-      auto type = flags_type_init;
-      auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm);
-      auto markup_src_file_path = fn_pth_full.captures[1];
-      char[][] contents_insert;
-      string[] _images =[];
-      string[] insert_file_list =[];
-      foreach (line; sourcefile_body_content) {
-        if (type["curly_code"] == 1) {
-          if (line.matchFirst(rgx.block_curly_code_close)) {
-            type["curly_code"] = 0;
-          }
-          contents ~= line;
-        } else if (line.matchFirst(rgx.block_curly_code_open)) {
-          type["curly_code"] = 1;
-          contents ~= line;
-        } else if (type["tic_code"] == 1) {
-          if (line.matchFirst(rgx.block_tic_close)) {
-            type["tic_code"] = 0;
-          }
-          contents ~= line;
-        } else if (line.matchFirst(rgx.block_tic_code_open)) {
-          type["tic_code"] = 1;
-          contents ~= line;
-        } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) {
-          auto insert_fn = m.captures[2];
-          auto insert_sub_pth = m.captures[1];
-          auto fn_src_insert
-            = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array;
-            insert_file_list ~= fn_src_insert.to!string;
-          auto raw = MarkupRawUnit();
-          /+ TODO +/
-          auto markup_sourcefile_insert_content
-            = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts);
-          debug(insert_file) {
-            tell_l("red", line);
-            tell_l("red", fn_src_insert);
-            writeln(
-              "  length contents insert array: ",
-              markup_sourcefile_insert_content.length
-            );
-          }
-          auto ins = Inserts();
-          auto contents_insert_tu = ins.scan_subdoc_source(
-            _opt_action,
-            markup_sourcefile_insert_content,
-            fn_src_insert.to!string
-          );
-          contents ~= contents_insert_tu[0]; // images to extract for image list?
-          if (_opt_action.source || _opt_action.sisupod) {
-            auto _image_linelist = _extract_images(contents_insert_tu[0]);
-            if (_image_linelist.length > 0) {
-              _images ~= _image_linelist;
-            }
-          }
-          /+
-            - 1. load file
-            - 2. read lines
-            - 3. scan lines
-              - a. if filename insert, and insert filename
-                 - repeat 1
-              - b. else
-                 - add line to new array;
-                 - build image list, search for any image files to add to image list
-          +/
-        } else {
-          contents ~= line;
-          if (_opt_action.source || _opt_action.sisupod) {
-            auto _image_linelist = _extract_images(line);
-            if (_image_linelist.length > 0) {
-              _images ~= _image_linelist;
-            }
-          }
-        }
-      } // end src doc loop
-      string[] images = [];
-      foreach(i; uniq(_images.sort())) {
-        images ~= i;
-      }
-      debug(insert_file) {
-        writeln(__LINE__);
-        writeln(contents.length);
-      }
-      auto t = tuple(
-        contents,
-        insert_file_list,
-        images
-      );
-      return t;
-    }
-  }
-}
diff --git a/src/sdp/output/epub3.d b/src/sdp/output/epub3.d
index 9389e58..cde42d1 100644
--- a/src/sdp/output/epub3.d
+++ b/src/sdp/output/epub3.d
@@ -293,8 +293,8 @@ template outputEPub3() {
   }
   
   void outputEPub3(D,I)(
-    auto ref const D    doc_abstraction,
-    auto ref I          doc_matters,
+    const D    doc_abstraction,
+          I    doc_matters,
   ) {
     mixin SiSUoutputRgxInit;
     auto xhtml_format = outputXHTMLs();
diff --git a/src/sdp/output/html.d b/src/sdp/output/html.d
index d783579..7024b0f 100644
--- a/src/sdp/output/html.d
+++ b/src/sdp/output/html.d
@@ -13,8 +13,8 @@ template outputHTML() {
     sdp.output.xmls_css;
   mixin outputXHTMLs;
   void scroll(D,I)(
-    auto ref const D    doc_abstraction,
-    auto ref       I    doc_matters,
+    const D    doc_abstraction,
+          I    doc_matters,
   ) {
     mixin SiSUoutputRgxInit;
     auto xhtml_format = outputXHTMLs();
@@ -181,8 +181,8 @@ template outputHTML() {
     writeln(" ", pth_html.fn_scroll(doc_matters.src.filename));
   }
   void seg(D,M)(
-    auto ref const D    doc_abstraction,
-    auto ref              M    doc_matters,
+    const D    doc_abstraction,
+          M    doc_matters,
   ) {
     mixin SiSUoutputRgxInit;
     auto rgx = Rgx();
diff --git a/src/sdp/output/package.d b/src/sdp/output/package.d
index 84bdfce..2aa6544 100644
--- a/src/sdp/output/package.d
+++ b/src/sdp/output/package.d
@@ -15,7 +15,7 @@ public import
   // std.uni,
   std.utf;
 public import
-  sdp.output.paths_source,
+  sdp.source.paths_source,
   sdp.output.defaults,
   sdp.output.paths_output,
   sdp.output.rgx;
diff --git a/src/sdp/output/paths_output.d b/src/sdp/output/paths_output.d
index cd4817b..8a4d623 100644
--- a/src/sdp/output/paths_output.d
+++ b/src/sdp/output/paths_output.d
@@ -14,13 +14,9 @@ template SiSUoutPaths() {
   ) {
     struct _PathsStruct {
       string output_root() {
-        string out_root_;
-        if (output_pth_root.length > 0) {
-          out_root_ = output_pth_root;
-        } else {
-          out_root_ = "sisugen";
-        }
-        return out_root_;
+        return (output_pth_root.length > 0)
+        ? output_pth_root
+        : "sisugen";
       }
       string output_base() {
         return asNormalizedPath(output_root.chainPath(lng)).array;
@@ -35,13 +31,9 @@ template SiSUoutPathSQLite() {
   ) {
     struct _PathsStruct {
       string output_root() {
-        string out_root_;
-        if (output_pth_root.length > 0) {
-          out_root_ = output_pth_root;
-        } else {
-          out_root_ = "sisugen";
-        }
-        return out_root_;
+        return (output_pth_root.length > 0)
+        ? output_pth_root
+        : "sisugen";
       }
       string output_base() {
         return asNormalizedPath(output_root).array;
@@ -70,7 +62,7 @@ template SiSUoutPathsFnPd() {
             - else if pod_name != file_name
               - pod_name.file_name
         +/
-        auto _fn_src = fn_src_pth.baseName.stripExtension;
+        string _fn_src = fn_src_pth.baseName.stripExtension;
         string _output_base_name;
         if (!(pod_name.empty)) {
           if (pod_name == _fn_src) {
diff --git a/src/sdp/output/paths_source.d b/src/sdp/output/paths_source.d
deleted file mode 100644
index e7233f0..0000000
--- a/src/sdp/output/paths_source.d
+++ /dev/null
@@ -1,791 +0,0 @@
-/++
-  read configuration files<BR>
-  - read config files<BR>
-  meta_config_files.d
-+/
-module sdp.output.paths_source;
-import std.array,
-  std.file,
-  std.path,
-  std.regex,
-  std.stdio,
-  std.conv : to;
-import sdp.meta.rgx;
-template PodManifest() {
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  auto PodManifest(P)(
-    P   _pth
-  ) {
-    struct ManifestFile_ {
-      auto pod_manifest_filename() {
-        string _manifest_file = "sisupod.manifest";
-        return _manifest_file;
-      }
-      auto pod_manifest_path() {
-        string _manifest_path;
-        if ((isValidPath(_pth) && exists(_pth)!=0 && _pth.isDir)
-        && (exists(_pth.chainPath(pod_manifest_filename).array)!=0
-        && (_pth.chainPath(pod_manifest_filename).array).isFile)) {
-          _manifest_path = _pth;
-        } else if (_pth.match(rgx.src_pth_contents)
-        && exists(_pth)!=0 && _pth.isFile) {
-          _manifest_path = _pth.dirName;
-        } else if (_pth.match(rgx.src_pth_pod_sst_or_ssm)
-        && exists(_pth)!=0 && (_pth.isFile)) {
-          if (auto m = _pth.match(rgx.src_pth_pod_sst_or_ssm)) {
-            _manifest_path = m.captures["podpath"];
-          }
-        } else  {
-          writeln("WARNING, issue with manifest_path: ", _pth); // remove?
-          _manifest_path = null; // _manifest_path = "";
-        }
-        return _manifest_path;
-      }
-      string pod_manifest_file_with_path() {
-        string _k;
-        if  (exists(pod_manifest_path.chainPath(pod_manifest_filename).array)!=0) {
-          _k = pod_manifest_path.chainPath(pod_manifest_filename).array;
-        } else if (exists(pod_manifest_path)!=0) {
-          _k = pod_manifest_path;
-        }
-        if (exists(_k)==0) {
-          writeln("ERROR >> Processing Skipped! Manifest not found: ", _k);
-          _k = null;
-        }
-        return _k;
-      }
-    }
-    return ManifestFile_();
-  }
-}
-template PathMatters() {
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  auto PathMatters(O,E,P,F)(
-    O   _opt_actions,
-    E   _env,
-    P   _pth,
-    F   _fns                   = "",
-    char[][] _manifest_fn_list = [[]],
-  ) {
-    auto _manifest = PodManifest!()(_pth);
-    struct ManifestMatters_ {
-      auto env() {
-        auto _env = _env;
-        struct Env_ {
-          auto pwd() {
-            return _env["pwd"];
-          }
-          auto home() {
-            return _env["home"];
-          }
-        }
-        return Env_();
-      }
-      auto opt() {
-        auto _opt_actions = _opt_actions;
-        struct Opt_ {
-          auto action() { // redundant
-            return _opt_actions;
-          }
-        }
-        return Opt_();
-      }
-      auto src_is_pod() {
-        auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false;
-        return _src_is_pod;
-      }
-      auto pod() {
-        struct Pod_ {
-          auto src_is_pod() {
-            auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false;
-            return _src_is_pod;
-          }
-          auto collection_root() {
-            auto _collection_root = asNormalizedPath(chainPath(_manifest.pod_manifest_path, "..")).array;
-            if (auto m = (_collection_root).match(rgx.src_pth_pod_root)) {
-            // consider testing for last dir in path name being sisupod, and giving warning if not
-            } else {
-              writeln("WARNING, collection_root not named \"sisupod\"");
-            }
-            return _collection_root;
-          }
-          auto manifest_filename() {
-            return _manifest.pod_manifest_filename;
-          }
-          auto manifest_path() {
-            return _manifest.pod_manifest_path;
-          }
-          auto pod_name() { // TODO decide what returned if src_is_pod == false
-            return _manifest.pod_manifest_path.baseName;
-          }
-          auto manifest_file_with_path() {
-            return _manifest.pod_manifest_file_with_path;
-          }
-          auto config_sisu_document_make_dirs() {                              // TODO sisu_document_make
-            string[] _config_dirs;
-            return _config_dirs;
-          }
-          auto config_local_site_dirs() {                   // TODO sisu_document_make
-            string[] _config_dirs;
-            return _config_dirs;
-          }
-          auto image_dirs() {                               // TODO
-            string[] _image_dirs;
-            return _image_dirs;
-          }
-          auto manifest_list_of_filenames() {
-            return _manifest_fn_list;
-          }
-          auto manifest_list_of_languages() {
-            string[] _lngs;
-            foreach (filename_; manifest_list_of_filenames) {
-              string _k = "en";
-              if (auto m = (filename_).match(rgx.language_code_and_filename)) {
-                _k = m.captures[1].to!string;
-              }
-              _lngs ~= _k; // all the languages from the manifest list of filenames with paths
-            }
-            return _lngs;
-          }
-        }
-        return Pod_();
-      }
-      auto src() {
-        string _fns = _fns; // required here by dmd & not by ldc (for D:2078)
-        auto _opt_actions = _opt_actions;
-        auto _env = _env;
-        string _sep = "␣";
-        struct SRC_ {
-          auto is_pod() {
-            auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false;
-            return _src_is_pod;
-          }
-          auto path_and_fn() {
-            return _fns;
-          }
-          auto pod_name() { /+ work on +/
-            auto _pod_name = (is_pod)
-            ? _manifest.pod_manifest_path
-            : "";
-            return _pod_name;
-          }
-          auto filename() {
-            auto _fn = (path_and_fn).baseName;
-            return _fn;
-          }
-          auto filename_base() {
-            auto _fn = filename.stripExtension;
-            return _fn;
-          }
-          auto filename_extension() {
-            auto _ext = filename.match(rgx.src_pth_sst_or_ssm).captures["extension"];
-            return _ext;
-          }
-          auto lng() {
-            string _k;
-            if (auto m = path_and_fn.match(rgx.language_code_and_filename)) {
-              _k = m.captures[1];
-            } else {
-              _k = "en";
-            }
-            return _k;
-          }
-          auto docname_composite_unique_per_src_doc() {
-          /+
-            z pod name if any + src filename + lng code
-             filename ~ "." ~  lng
-             * unique per src doc
-             used by
-             - sqlite discrete index (multilingual, each language of a document)
-          +/
-            string _fn;
-            if (pod_name.baseName == filename_base) {
-              _fn = filename_base ~ _sep ~ filename_extension ~ _sep ~ lng;
-            } else if (!(pod_name.empty)) {
-              _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng;
-            } else {
-              _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng;
-            }
-            return _fn;
-          }
-          auto docname_composite_unique_per_src_pod() {
-          /+
-            z pod name if any + src filename (without lng code)
-             filename ~ _sep ~ lng
-             * unique per src pod
-             used by
-             - sisupod (multilingual collection)
-             - sqlite discrete index (multilingual collection)
-          +/
-            string _fn;
-            if (pod_name.baseName == filename_base) {
-              _fn = filename_base ~ _sep ~ filename_extension;
-            } else if (!(pod_name.empty)) {
-              _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension;
-            } else {
-              _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension;
-            }
-            return _fn;
-          }
-          auto language() {
-            return lng();
-          }
-          auto file_with_absolute_path() {
-            string _pth = _env["pwd"].chainPath(path_and_fn).array;
-            return _pth;
-          }
-          auto absolute_path_to_src() {
-            string _pth = (_env["pwd"].chainPath(path_and_fn)).dirName.array;
-            return _pth;
-          }
-          auto base_dir() {
-            string _dir;
-            if ( // TODO this should catch generated --source sisupod, untested, needs manifest
-              auto m = (absolute_path_to_src)
-              .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
-            ) {
-              _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array;
-              assert(_dir == m.captures["dir"]);
-            } else {
-              _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array;
-              assert(_dir == absolute_path_to_src
-                .match(rgx.src_base_parent_dir_name).captures["dir"]);
-            }
-            if ((_opt_actions.debug_do)) {
-              writeln("--> (base_dir)  ", _dir);
-            }
-            return _dir;
-          }
-          auto base_parent_dir_path() {
-            string _dir;
-            if ( // TODO this should catch generated --source sisupod, untested, needs manifest
-              auto m = (absolute_path_to_src)
-              .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
-            ) {
-              _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array;
-            } else {
-              _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array;
-            }
-            return _dir;
-          }
-          auto base_dir_path() { // looks like there is work to do
-            string _dir;
-            if (
-              auto m = (absolute_path_to_src)
-              .match(rgx.src_formalised_file_path_parts)
-            ) {
-              _dir = asNormalizedPath(m.captures["pth"]).array;
-            } else if ( // TODO this should catch generated --source sisupod, untested, needs manifest
-             auto m = (absolute_path_to_src)
-             .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
-            ) {
-              _dir = asNormalizedPath(path_and_fn.chainPath("../")).array;
-            } else {
-              _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array;
-            }
-            if ((_opt_actions.debug_do)) {
-              writeln("--> (base_dir_path) ", _dir);
-            }
-            return _dir;
-          }
-          auto media_dir_path() { // TODO rework, can base directly on src fn path
-            string _dir = asNormalizedPath(base_dir_path.chainPath("media")).array;
-            return _dir;
-          }
-          auto image_dir_path() {
-            string _paths;
-            string[] _possible_img_pths = [ "./image", "../image", "../../image" ];
-            string _img_pth_found = "";
-            if (is_pod) {
-              _img_pth_found = asNormalizedPath(file_with_absolute_path.dirName ~ "/../../image").array;
-            } else {
-              string _img_pth(string _possible_img_pth) {
-                return asNormalizedPath(file_with_absolute_path.dirName ~ "/" ~ _possible_img_pth).array;
-              }
-              foreach(_possible_img_pth; _possible_img_pths) {
-                if (exists(_img_pth(_possible_img_pth))) {
-                  _img_pth_found = _img_pth(_possible_img_pth);
-                  break;
-                } else {
-                  _paths ~= " " ~ _img_pth(_possible_img_pth);
-                }
-              }
-            }
-            if (_img_pth_found.empty) {
-              writeln("WARNING not image path found, searched: ", _paths);
-            }
-            return _img_pth_found;
-          }
-          auto conf_dir_path() {
-            auto _dir = asNormalizedPath(base_dir_path.chainPath("conf")).array;
-            return _dir;
-          }
-          auto base_parent_dir() {
-            string _dir;
-            if ( // TODO this should catch generated --source sisupod, untested, needs manifest
-              auto m = (absolute_path_to_src)
-              .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
-            ) {
-              _dir = m.captures["dir"];
-            } else {
-              _dir = (absolute_path_to_src).match(rgx.src_base_parent_dir_name).captures["dir"];
-            }
-            if ((_opt_actions.debug_do)) {
-              writeln("--> (base_parent_dir) ", _dir);
-            }
-            return _dir;
-          }
-          auto config_dirs() {                              // TODO
-            string[] _config_dirs;
-            if (is_pod) {
-            } else {
-            }
-            return _config_dirs;
-          }
-          auto image_dirs() {                               // TODO
-            string[] _image_dirs;
-            if (is_pod) {
-            } else {
-            }
-            return _image_dirs;
-          }
-        }
-        return SRC_();
-      }
-      auto output() {
-        auto _opt_actions = _opt_actions;
-        auto _env = _env;
-        struct Out_ {
-          auto path() {
-            auto _output_path = _env["pwd"];
-            if ((_opt_actions.output_dir_set.length > 0)
-              && isValidPath(_opt_actions.output_dir_set)
-            ) {
-              _output_path = asNormalizedPath(_opt_actions.output_dir_set).array;
-              if (!exists(_output_path)) {
-                try {
-                  _output_path.mkdirRecurse;
-                }
-                // catch (ErrnoException ex) {
-                catch (Exception ex) {
-                  // Handle error
-                }
-              }
-              assert(_output_path.isDir,
-                "not a directory: " ~ _output_path);
-              // TODO always test that is a directory and it is writable
-            }
-            return _output_path;
-          }
-        }
-        return Out_();
-      }
-    }
-    return ManifestMatters_();
-  }
-}
-template ConfigFilePaths() {
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  auto ConfigFilePaths(M,E)(
-    M   _manifest,
-    E   _env,
-  ) {
-    struct ConfFilePaths {
-      auto config_filename_document_toml() {
-        return "sisu_document_make";
-      }
-      auto config_filename_site_toml() {
-        return "config_local_site";
-      }
-      auto possible_config_path_locations() {
-        struct _ConfFilePaths {
-          auto sisu_document_make() {
-            /+ FIX clean up conf paths ↓ +/
-            /+ config local site (file system only, not in pod) +/
-            /+ return paths +/
-            string[] _possible_config_path_locations;
-            if (_manifest.src.is_pod) {
-              /+ config document in pod +/
-              string _sisudoc_conf_pod; //
-              string _sisudoc_conf_pod_text; //
-              _sisudoc_conf_pod = asNormalizedPath(chainPath(
-                to!string(_env["pwd"]),
-                _manifest.pod.manifest_path ~ "/conf"
-              )).array;
-              _sisudoc_conf_pod_text = asNormalizedPath(chainPath(
-                to!string(_env["pwd"]),
-                _manifest.pod.manifest_path ~ "/media/text/" ~ _manifest.src.lng ~ "/conf"
-              )).array;
-              /+ return paths +/
-              _possible_config_path_locations = [
-                _sisudoc_conf_pod_text,
-                _sisudoc_conf_pod,
-              ];
-            } else {
-              /+ config document (& or local site) on filesystem +/
-              string _sisudoc_conf_pwd   = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about
-              string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array;
-              string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array;
-              string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array;
-              string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array;
-              /+ return paths +/
-              _possible_config_path_locations = [
-                _sisudoc_conf_pwd,
-                _sisudoc_conf_pwd_a,
-                _sisudoc_conf_pwd_b,
-                _sisudoc_conf_pwd_c,
-                _sisudoc_conf_pwd_d,
-              ];
-            }
-            /+ FIX clean up conf paths ↑
-            (compare pwd to doc path location, and build config path)
-            +/
-            return _possible_config_path_locations;
-          }
-          auto config_local_site() {
-            /+ FIX clean up conf paths ↓ +/
-            /+ config local site (file system only, not in pod) +/
-            string _dot_pwd        = asNormalizedPath(chainPath(to!string(_env["pwd"]), ".sisu")).array;
-            string _underscore_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "_sisu")).array;
-            string _dot_home       = asNormalizedPath(chainPath(to!string(_env["home"]), ".sisu")).array;
-            /+ return paths +/
-            string[] _possible_config_path_locations;
-            if (_manifest.src.is_pod) {
-              string _collection_root_a = asNormalizedPath(chainPath(to!string(_manifest.pod.collection_root.to!string), ".sisu")).array;
-              string _collection_root_b = asNormalizedPath(chainPath(to!string(_manifest.pod.collection_root.to!string), "_sisu")).array;
-              _possible_config_path_locations = [
-                _dot_pwd,
-                _underscore_pwd,
-                _dot_home,
-                "/etc/sisu",
-                _collection_root_a, // set priority higher?
-                _collection_root_b // set priority higher?
-              ];
-            } else {
-              /+ config document (& or local site) on filesystem +/
-              string _sisudoc_conf_pwd   = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about
-              string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array;
-              string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array;
-              string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array;
-              string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array;
-              _possible_config_path_locations = [
-                _sisudoc_conf_pwd,
-                _sisudoc_conf_pwd_a,
-                _sisudoc_conf_pwd_b,
-                _sisudoc_conf_pwd_c,
-                _sisudoc_conf_pwd_d,
-                _dot_pwd,
-                _underscore_pwd,
-                _dot_home,
-                "/etc/sisu"
-              ];
-            }
-            /+ FIX clean up conf paths ↑
-            (compare pwd to doc path location, and build config path)
-            +/
-            return _possible_config_path_locations;
-          }
-        }
-        return _ConfFilePaths();
-      }
-    }
-    return ConfFilePaths();
-  }
-}
-template SiSUpathsSRC() {
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  auto SiSUpathsSRC(D,Fn)(
-    D   _pwd,
-    Fn  _fn_src_and_path,
-  ) {
-    struct SisuSrcPaths {
-      auto pwd() {
-        return _pwd;
-      }
-      auto language() {
-        // use command line info as well?
-        string _k;
-        if (auto m = _fn_src_and_path.match(rgx.language_code_and_filename)) {
-          _k = m.captures[1];
-        } else { /+ unknown until doc_meta read, (could provide & use command line info?) +/
-          _k = "xx"; // original default was "en" but is not known
-        }
-        return _k;
-      }
-      auto doc_root() {
-        return "sisudoc";
-      }
-      auto media_root() {
-        return asNormalizedPath(doc_root.chainPath("media")).array;
-      }
-      auto conf_root() {
-        return asNormalizedPath(doc_root.chainPath("conf")).array;
-      }
-      auto text_root() {
-        return asNormalizedPath(media_root.chainPath("text")).array;
-      }
-      auto image_root() {
-        return asNormalizedPath(media_root.chainPath("image")).array;
-      }
-      auto doc_src_fn_with_path_for_text_root_and_lng() {
-        return asNormalizedPath(text_root.chainPath(language)).array;
-      }
-      auto doc_src_fn() {
-        return asNormalizedPath(_fn_src_and_path.baseName).array;
-      }
-      auto doc_src_with_path() {
-        return asNormalizedPath(pwd.chainPath(_fn_src_and_path)).array;
-      }
-    }
-    return SisuSrcPaths();
-  }
-}
-
-
-template SiSUpathsSisupods() {
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  string _suffix = ".zip";
-  auto SiSUpathsSisupods(Dm)(Dm doc_matters) {
-    string _base_dir_pod = (doc_matters.output_path.length > 0)
-    ? doc_matters.output_path ~ "/sisupod"
-    : "/sisupod";
-    string _base_dir_doc = "sisudoc";
-    struct _PodPaths {
-      string base_filename_(string fn_src) {
-        auto pth = fn_src.baseName.stripExtension;
-        return pth;
-      }
-      string sisupod_dir_() {
-        auto pth = _base_dir_pod;
-        return pth;
-      }
-      string sisudoc_dir_() {
-        auto pth = _base_dir_doc;
-        return pth;
-      }
-      string sisupod_filename_(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array;
-        return pth;
-      }
-      string base_filesystem_(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array;
-        assert(pth == _base_dir_pod ~ "/"  ~ base_filename_(fn_src),
-          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename_(fn_src) ~ "?");
-        return pth;
-      }
-      string base_pod_(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this
-        return pth;
-      }
-      auto base_filename(string fn_src) {
-        auto pth_1_ = base_filename_(fn_src);
-        auto pth_2_ = base_filename_(fn_src);
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto sisupod_filename(string fn_src) {
-        auto pth_1_ = sisupod_filename_(fn_src);
-        auto pth_2_ = sisupod_filename_(fn_src);
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto base(string fn_src) {
-        auto pth_1_ = "";
-        auto pth_2_ = base_filesystem_(fn_src);
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto pod_root(string fn_src) {
-        auto pth_1_ = "";
-        auto pth_2_ = asNormalizedPath(base(fn_src).filesystem_open_zpod.chainPath("")).array; // "sisudoc"
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto conf_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = "conf";
-        auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("conf")).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto css(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = asNormalizedPath(conf_root(fn_src).zpod.chainPath("css")).array;
-        auto pth_2_ = asNormalizedPath(conf_root(fn_src).filesystem_open_zpod.chainPath("css")).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto media_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = "media";
-        auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("media")).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto text_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("text")).array;
-        auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("text")).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto doc(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = text_root(fn_src).zpod;
-        auto pth_2_ = text_root(fn_src).filesystem_open_zpod;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto doc_lng(string fn_src, string lng) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = asNormalizedPath(text_root(fn_src).zpod.chainPath(lng)).array;
-        auto pth_2_ = asNormalizedPath(text_root(fn_src).filesystem_open_zpod.chainPath(lng)).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto image_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("image")).array;
-        auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("image")).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto fn_pod_filelist(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto _manifest = PodManifest!()(fn_src).pod_manifest_filename;
-        auto pth_1_ = _manifest;
-        auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath(_manifest)).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto fn_doc(string fn_src, string lng) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_src.baseName)).array;
-        auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_src.baseName)).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto fn_doc_insert(string fn_src, string fn_insert, string lng) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_insert.baseName)).array;
-        auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_insert.baseName)).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-    }
-    return _PodPaths();
-  }
-}
diff --git a/src/sdp/output/sqlite.d b/src/sdp/output/sqlite.d
index f805392..faff29b 100644
--- a/src/sdp/output/sqlite.d
+++ b/src/sdp/output/sqlite.d
@@ -685,10 +685,11 @@ template SQLiteTablesReCreate() {
         seg                              VARCHAR(256) NULL,
         lev_an                           VARCHAR(1),
         lev                              SMALLINT NULL,
-        t_of                             VARCHAR(16),
-        t_is                             VARCHAR(16),
+        is_of_type                       VARCHAR(16),
+        is_a                             VARCHAR(16),
         node                             VARCHAR(16) NULL,
         parent                           VARCHAR(16) NULL,
+        last_decendant                   VARCHAR(16) NULL, /* headings only */
         digest_clean                     CHAR(256),
         digest_all                       CHAR(256),
         types                            CHAR(1) NULL
@@ -874,8 +875,8 @@ template SQLiteInsertDocObjectsLoop() {
           clean,
           body,
           lev,
-          t_of,
-          t_is
+          is_of_type,
+          is_a
         )
         VALUES (
           %d,
@@ -1173,10 +1174,11 @@ template SQLiteTablesCreate() {
             seg                              VARCHAR(256) NULL,
             lev_an                           VARCHAR(1),
             lev                              SMALLINT NULL,
-            t_of                             VARCHAR(16),
-            t_is                             VARCHAR(16),
+            is_of_type                       VARCHAR(16),
+            is_a                             VARCHAR(16),
             node                             VARCHAR(16) NULL,
             parent                           VARCHAR(16) NULL,
+            last_decendant                   VARCHAR(16) NULL, /* headings only */
             digest_clean                     CHAR(256),
             digest_all                       CHAR(256),
             types                            CHAR(1) NULL
diff --git a/src/sdp/output/xmls.d b/src/sdp/output/xmls.d
index e389c5c..874329f 100644
--- a/src/sdp/output/xmls.d
+++ b/src/sdp/output/xmls.d
@@ -51,8 +51,8 @@ template outputXHTMLs() {
       return delimit;
     }
     string special_characters(O)(
-      auto ref const O           obj,
-      string                     _txt
+      const  O         obj,
+      string           _txt
     ){
       _txt = (_txt)
         .replaceAll(rgx.xhtml_ampersand,    "&#38;")
@@ -312,10 +312,10 @@ template outputXHTMLs() {
       return o;
     }
     auto inline_images(O)(
-      auto ref const O obj,
-      string                  _txt,
-      string                  _suffix    = ".html",
-      string                  _xml_type = "seg",
+      const  O         obj,
+      string           _txt,
+      string           _suffix    = ".html",
+      string           _xml_type = "seg",
     ) {
       string _img_pth;
       if (_xml_type == "epub") {
@@ -335,10 +335,10 @@ template outputXHTMLs() {
       return _txt;
     }
     auto inline_links(O)(
-      auto ref const O obj,
-      string                  _txt,
-      string                  _suffix    = ".html",
-      string                  _xml_type = "seg",
+      const  O         obj,
+      string           _txt,
+      string           _suffix    = ".html",
+      string           _xml_type = "seg",
     ) {
       if (obj.has.inline_links) {
         if ((_txt.match(rgx.mark_internal_site_lnk))
@@ -381,8 +381,8 @@ template outputXHTMLs() {
       return _txt;
     }
     auto inline_notes_scroll(O)(
-      auto ref const O   obj,
-      string                    _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       if (obj.has.inline_notes_reg) {
         _txt = font_face(_txt);
@@ -404,8 +404,8 @@ template outputXHTMLs() {
       return _txt;
     }
     auto inline_notes_seg(O)(
-      auto ref const O     obj,
-      string                      _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       string[] _endnotes;
       if (obj.has.inline_notes_reg) {
@@ -443,9 +443,9 @@ template outputXHTMLs() {
       return t;
     }
     auto inline_markup_scroll(O)(
-      auto ref const O  obj,
-      string                   _txt,
-      string                   _suffix = ".html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
     ) {
       _txt = inline_images(obj, _txt, _suffix, "scroll");
       _txt = inline_links(obj, _txt, _suffix, "scroll");
@@ -453,10 +453,10 @@ template outputXHTMLs() {
       return _txt;
     }
     auto inline_markup_seg(O)(
-      auto ref const O  obj,
-      string                   _txt,
-      string                   _suffix = ".html",
-      string                   _xml_type = "seg",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "seg",
     ) {
       _txt = inline_images(obj, _txt, _suffix, _xml_type);
       _txt = inline_links(obj, _txt, _suffix, _xml_type);
@@ -464,7 +464,7 @@ template outputXHTMLs() {
       return t;
     }
     string lev4_heading_subtoc(O)(
-      auto ref const O    obj,
+      const  O         obj,
     ) {
       char[] lev4_subtoc;
       lev4_subtoc ~= "  <div class=\"nav\">\n";
@@ -490,7 +490,7 @@ template outputXHTMLs() {
       return lev4_subtoc.to!string;
     }
     auto nav_pre_next_svg(O)(
-      auto ref const O    obj,
+      const  O         obj,
     ) {
       string prev, next, toc;
       if (obj.tags.segment_anchor_tag == "toc") {
@@ -567,9 +567,9 @@ template outputXHTMLs() {
       return bar();
     }
     auto heading(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _xml_type = "html",
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       string _horizontal_rule = "<hr />";
@@ -616,9 +616,9 @@ template outputXHTMLs() {
       return o;
     }
     auto heading_scroll(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = inline_markup_scroll(obj, _txt, _suffix);
@@ -626,10 +626,10 @@ template outputXHTMLs() {
       return o;
     }
     auto heading_seg(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type);
       _txt = t[0];
@@ -642,8 +642,8 @@ template outputXHTMLs() {
       return u;
     }
     auto para(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = font_face(_txt);
@@ -681,9 +681,9 @@ template outputXHTMLs() {
       return o;
     }
     auto para_scroll(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = inline_markup_scroll(obj, _txt, _suffix);
@@ -691,10 +691,10 @@ template outputXHTMLs() {
       return o;
     }
     auto para_seg(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type);
       _txt = t[0].to!string;
@@ -707,8 +707,8 @@ template outputXHTMLs() {
       return u;
     }
     auto quote(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       _txt = font_face(_txt);
       string o;
@@ -738,9 +738,9 @@ template outputXHTMLs() {
       return o;
     }
     auto quote_scroll(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = inline_markup_scroll(obj, _txt, _suffix);
@@ -748,10 +748,10 @@ template outputXHTMLs() {
       return o;
     }
     auto quote_seg(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type);
       _txt = t[0].to!string;
@@ -764,8 +764,8 @@ template outputXHTMLs() {
       return u;
     }
     auto group(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       _txt = font_face(_txt);
       string o;
@@ -795,10 +795,10 @@ template outputXHTMLs() {
       return o;
     }
     auto group_scroll(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = inline_markup_scroll(obj, _txt, _suffix);
@@ -806,10 +806,10 @@ template outputXHTMLs() {
       return o;
     }
     auto group_seg(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type);
       _txt = t[0].to!string;
@@ -822,8 +822,8 @@ template outputXHTMLs() {
       return u;
     }
     auto block(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       _txt = font_face(_txt);
       string o;
@@ -849,10 +849,10 @@ template outputXHTMLs() {
       return o;
     }
     auto block_scroll(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = inline_markup_scroll(obj, _txt, _suffix);
@@ -860,10 +860,10 @@ template outputXHTMLs() {
       return o;
     }
     auto block_seg(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type);
       _txt = t[0].to!string;
@@ -876,8 +876,8 @@ template outputXHTMLs() {
       return u;
     }
     auto verse(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       _txt = font_face(_txt);
       string o;
@@ -903,10 +903,10 @@ template outputXHTMLs() {
       return o;
     }
     auto verse_scroll(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = inline_markup_scroll(obj, _txt, _suffix);
@@ -914,10 +914,10 @@ template outputXHTMLs() {
       return o;
     }
     auto verse_seg(O)(
-      auto ref const O    obj,
-      string                     _txt,
-      string                     _suffix = ".html",
-      string                     _xml_type = "html",
+      const  O         obj,
+      string           _txt,
+      string           _suffix = ".html",
+      string           _xml_type = "html",
     ) {
       auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type);
       _txt = t[0].to!string;
@@ -930,8 +930,8 @@ template outputXHTMLs() {
       return u;
     }
     auto tablarize(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       string[] _table_rows = (_txt).split(rgx.table_delimiter_row);
       string[] _table_cols;
@@ -963,8 +963,8 @@ template outputXHTMLs() {
       return t;
     }
     auto table(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags);
       _txt = font_face(_txt);
@@ -992,8 +992,8 @@ template outputXHTMLs() {
       return o;
     }
     auto endnote(O)(
-      auto ref const O    obj,
-      string                     _txt,
+      const O          obj,
+      string           _txt,
     ) {
       string o;
       o = format(q"¶    <p class="%s" indent="h%si%s">
@@ -1007,8 +1007,8 @@ template outputXHTMLs() {
       return o;
     }
     auto code(O)(
-      auto ref const O  obj,
-      string                   _txt,
+      const  O         obj,
+      string           _txt,
     ) {
       string o;
       if (obj.metainfo.object_number.empty) {
diff --git a/src/sdp/sdp.d b/src/sdp/sdp.d
index 0c2c271..b703838 100755
--- a/src/sdp/sdp.d
+++ b/src/sdp/sdp.d
@@ -17,11 +17,11 @@ import
   sdp.meta.conf_make_meta_json,
   sdp.meta.defaults,
   sdp.meta.doc_debugs,
-  sdp.meta.read_config_files,
-  sdp.meta.read_source_files,
   sdp.meta.rgx,
-  sdp.output.hub,
-  sdp.output.paths_source;
+  sdp.source.paths_source,
+  sdp.source.read_config_files,
+  sdp.source.read_source_files,
+  sdp.output.hub;
 mixin(import("version.txt"));
 mixin CompileTimeInfo;
 /++
@@ -42,7 +42,7 @@ void main(string[] args) {
   scope(success) {
     debug(checkdoc) {
       writefln(
-        "~ run complete, ok ~ (sdp-%s.%s.%s, %s v%s, %s %s)",
+        "~ run complete, ok ~ (sdp-%s.%s.%s, %s D:%s, %s %s)",
         ver.major, ver.minor, ver.patch,
         __VENDOR__, __VERSION__,
         bits, os,
diff --git a/src/sdp/source/paths_source.d b/src/sdp/source/paths_source.d
new file mode 100644
index 0000000..8d3aefe
--- /dev/null
+++ b/src/sdp/source/paths_source.d
@@ -0,0 +1,774 @@
+/++
+  read configuration files<BR>
+  - read config files<BR>
+  meta_config_files.d
++/
+module sdp.source.paths_source;
+import std.array,
+  std.file,
+  std.path,
+  std.regex,
+  std.stdio,
+  std.conv : to;
+import sdp.meta.rgx;
+template PodManifest() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  auto PodManifest(P)(
+    P   _pth
+  ) {
+    struct ManifestFile_ {
+      string pod_manifest_filename() {
+        return "sisupod.manifest";
+      }
+      string pod_manifest_path() {
+        string _manifest_path;
+        if ((isValidPath(_pth) && exists(_pth)!=0 && _pth.isDir)
+        && (exists(_pth.chainPath(pod_manifest_filename).array)!=0
+        && (_pth.chainPath(pod_manifest_filename).array).isFile)) {
+          _manifest_path = _pth;
+        } else if (_pth.match(rgx.src_pth_contents)
+        && exists(_pth)!=0 && _pth.isFile) {
+          _manifest_path = _pth.dirName;
+        } else if (_pth.match(rgx.src_pth_pod_sst_or_ssm)
+        && exists(_pth)!=0 && (_pth.isFile)) {
+          if (auto m = _pth.match(rgx.src_pth_pod_sst_or_ssm)) {
+            _manifest_path = m.captures["podpath"];
+          }
+        } else  {
+          writeln("WARNING, issue with manifest_path: ", _pth); // remove?
+          _manifest_path = null; // _manifest_path = "";
+        }
+        return _manifest_path;
+      }
+      string pod_manifest_file_with_path() {
+        string _k;
+        if  (exists(pod_manifest_path.chainPath(pod_manifest_filename).array)!=0) {
+          _k = pod_manifest_path.chainPath(pod_manifest_filename).array;
+        } else if (exists(pod_manifest_path)!=0) {
+          _k = pod_manifest_path;
+        }
+        if (exists(_k)==0) {
+          writeln("ERROR >> Processing Skipped! Manifest not found: ", _k);
+          _k = null;
+        }
+        return _k;
+      }
+    }
+    return ManifestFile_();
+  }
+}
+template PathMatters() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  auto PathMatters(O,E)(
+    O        _opt_actions,
+    E        _env,
+    string   _pth,
+    string   _fns              = "",
+    char[][] _manifest_fn_list = [[]],
+  ) {
+    auto _manifest = PodManifest!()(_pth);
+    struct ManifestMatters_ {
+      auto env() {
+        auto _env = _env;
+        struct Env_ {
+          auto pwd() {
+            return _env["pwd"];
+          }
+          auto home() {
+            return _env["home"];
+          }
+        }
+        return Env_();
+      }
+      auto opt() {
+        auto _opt_actions = _opt_actions;
+        struct Opt_ {
+          auto action() { // redundant
+            return _opt_actions;
+          }
+        }
+        return Opt_();
+      }
+      bool src_is_pod() {
+        return (_manifest.pod_manifest_path.length > 0) ? true : false;
+      }
+      auto pod() {
+        struct Pod_ {
+          bool src_is_pod() {
+            return (_manifest.pod_manifest_path.length > 0) ? true : false;
+          }
+          auto collection_root() {
+            auto _collection_root = asNormalizedPath(chainPath(_manifest.pod_manifest_path, "..")).array;
+            if (auto m = (_collection_root).match(rgx.src_pth_pod_root)) {
+            // consider testing for last dir in path name being sisupod, and giving warning if not
+            } else {
+              writeln("WARNING, collection_root not named \"sisupod\"");
+            }
+            return _collection_root;
+          }
+          string manifest_filename() {
+            return _manifest.pod_manifest_filename;
+          }
+          string manifest_path() {
+            return _manifest.pod_manifest_path;
+          }
+          string pod_name() {
+            return _manifest.pod_manifest_path.baseName;
+          }
+          string manifest_file_with_path() {
+            return _manifest.pod_manifest_file_with_path;
+          }
+          string[] config_sisu_document_make_dirs() {
+            string[] _config_dirs;
+            return _config_dirs;
+          }
+          string[] config_local_site_dirs() {
+            string[] _config_dirs;
+            return _config_dirs;
+          }
+          string[] image_dirs() {
+            string[] _image_dirs;
+            return _image_dirs;
+          }
+          auto manifest_list_of_filenames() {
+            return _manifest_fn_list;
+          }
+          string[] manifest_list_of_languages() {
+            string[] _lngs;
+            foreach (filename_; manifest_list_of_filenames) {
+              string _k = "en";
+              if (auto m = (filename_).match(rgx.language_code_and_filename)) {
+                _k = m.captures[1].to!string;
+              }
+              _lngs ~= _k; // all the languages from the manifest list of filenames with paths
+            }
+            return _lngs;
+          }
+        }
+        return Pod_();
+      }
+      auto src() {
+        string _fns = _fns; // required here by dmd & not by ldc (for D:2078)
+        auto _opt_actions = _opt_actions;
+        auto _env = _env;
+        string _sep = "␣";
+        struct SRC_ {
+          bool is_pod() {
+            return (_manifest.pod_manifest_path.length > 0) ? true : false;
+          }
+          string path_and_fn() {
+            return _fns;
+          }
+          string pod_name() {
+            return (is_pod) ? _manifest.pod_manifest_path : "";
+          }
+          string filename() {
+            return path_and_fn.baseName;
+          }
+          string filename_base() {
+            return filename.stripExtension;
+          }
+          string filename_extension() {
+            return filename.match(rgx.src_pth_sst_or_ssm).captures["extension"];
+          }
+          string lng() {
+            string _k;
+            if (auto m = path_and_fn.match(rgx.language_code_and_filename)) {
+              _k = m.captures[1];
+            } else {_k = "en"; }
+            return _k;
+          }
+          string docname_composite_unique_per_src_doc() {
+          /+
+            z pod name if any + src filename + lng code
+             filename ~ "." ~  lng
+             * unique per src doc
+             used by
+             - sqlite discrete index (multilingual, each language of a document)
+          +/
+            string _fn;
+            if (pod_name.baseName == filename_base) {
+              _fn = filename_base ~ _sep ~ filename_extension ~ _sep ~ lng;
+            } else if (!(pod_name.empty)) {
+              _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng;
+            } else {
+              _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng;
+            }
+            return _fn;
+          }
+          string docname_composite_unique_per_src_pod() {
+          /+
+            z pod name if any + src filename (without lng code)
+             filename ~ _sep ~ lng
+             * unique per src pod
+             used by
+             - sisupod (multilingual collection)
+             - sqlite discrete index (multilingual collection)
+          +/
+            string _fn;
+            if (pod_name.baseName == filename_base) {
+              _fn = filename_base ~ _sep ~ filename_extension;
+            } else if (!(pod_name.empty)) {
+              _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension;
+            } else {
+              _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension;
+            }
+            return _fn;
+          }
+          string language() {
+            return lng();
+          }
+          string file_with_absolute_path() {
+            return _env["pwd"].chainPath(path_and_fn).array;
+          }
+          string absolute_path_to_src() {
+            return (_env["pwd"].chainPath(path_and_fn)).dirName.array;
+          }
+          string base_dir() {
+            string _dir;
+            if ( // TODO this should catch generated --source sisupod, untested, needs manifest
+              auto m = (absolute_path_to_src)
+              .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
+            ) {
+              _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array;
+              assert(_dir == m.captures["dir"]);
+            } else {
+              _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array;
+              assert(_dir == absolute_path_to_src
+                .match(rgx.src_base_parent_dir_name).captures["dir"]);
+            }
+            if ((_opt_actions.debug_do)) {
+              writeln("--> (base_dir)  ", _dir);
+            }
+            return _dir;
+          }
+          string base_parent_dir_path() {
+            string _dir;
+            if ( // TODO this should catch generated --source sisupod, untested, needs manifest
+              auto m = (absolute_path_to_src)
+              .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
+            ) {
+              _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array;
+            } else {
+              _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array;
+            }
+            return _dir;
+          }
+          string base_dir_path() {
+            string _dir;
+            if (
+              auto m = (absolute_path_to_src)
+              .match(rgx.src_formalised_file_path_parts)
+            ) {
+              _dir = asNormalizedPath(m.captures["pth"]).array;
+            } else if ( // TODO this should catch generated --source sisupod, untested, needs manifest
+             auto m = (absolute_path_to_src)
+             .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
+            ) {
+              _dir = asNormalizedPath(path_and_fn.chainPath("../")).array;
+            } else {
+              _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array;
+            }
+            if ((_opt_actions.debug_do)) {
+              writeln("--> (base_dir_path) ", _dir);
+            }
+            return _dir;
+          }
+          string media_dir_path() {
+            string _dir = asNormalizedPath(base_dir_path.chainPath("media")).array;
+            return _dir;
+          }
+          string image_dir_path() {
+            string _paths;
+            string[] _possible_img_pths = [ "./image", "../image", "../../image" ];
+            string _img_pth_found = "";
+            if (is_pod) {
+              _img_pth_found = asNormalizedPath(file_with_absolute_path.dirName ~ "/../../image").array;
+            } else {
+              string _img_pth(string _possible_img_pth) {
+                return asNormalizedPath(file_with_absolute_path.dirName ~ "/" ~ _possible_img_pth).array;
+              }
+              foreach(_possible_img_pth; _possible_img_pths) {
+                if (exists(_img_pth(_possible_img_pth))) {
+                  _img_pth_found = _img_pth(_possible_img_pth);
+                  break;
+                } else {
+                  _paths ~= " " ~ _img_pth(_possible_img_pth);
+                }
+              }
+            }
+            if (_img_pth_found.empty) {
+              writeln("WARNING not image path found, searched: ", _paths);
+            }
+            return _img_pth_found;
+          }
+          auto conf_dir_path() {
+            return asNormalizedPath(base_dir_path.chainPath("conf")).array;
+          }
+          auto base_parent_dir() {
+            string _dir;
+            if ( // TODO this should catch generated --source sisupod, untested, needs manifest
+              auto m = (absolute_path_to_src)
+              .match(regex(r"[/](?P<dir>(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension))
+            ) {
+              _dir = m.captures["dir"];
+            } else {
+              _dir = (absolute_path_to_src).match(rgx.src_base_parent_dir_name).captures["dir"];
+            }
+            if ((_opt_actions.debug_do)) {
+              writeln("--> (base_parent_dir) ", _dir);
+            }
+            return _dir;
+          }
+          string[] config_dirs() {
+            string[] _config_dirs;
+            if (is_pod) {
+            } else {}
+            return _config_dirs;
+          }
+          string[] image_dirs() {
+            string[] _image_dirs;
+            if (is_pod) {
+            } else {}
+            return _image_dirs;
+          }
+        }
+        return SRC_();
+      }
+      auto output() {
+        auto _opt_actions = _opt_actions;
+        auto _env = _env;
+        struct Out_ {
+          auto path() {
+            auto _output_path = _env["pwd"];
+            if ((_opt_actions.output_dir_set.length > 0)
+              && isValidPath(_opt_actions.output_dir_set)
+            ) {
+              _output_path = asNormalizedPath(_opt_actions.output_dir_set).array;
+              if (!exists(_output_path)) {
+                try {
+                  _output_path.mkdirRecurse;
+                }
+                // catch (ErrnoException ex) {
+                catch (Exception ex) {
+                  // Handle error
+                }
+              }
+              assert(_output_path.isDir,
+                "not a directory: " ~ _output_path);
+              // TODO always test that is a directory and it is writable
+            }
+            return _output_path;
+          }
+        }
+        return Out_();
+      }
+    }
+    return ManifestMatters_();
+  }
+}
+template ConfigFilePaths() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  auto ConfigFilePaths(M,E)(
+    M   _manifest,
+    E   _env,
+  ) {
+    struct ConfFilePaths {
+      string config_filename_document_toml() {
+        return "sisu_document_make";
+      }
+      string config_filename_site_toml() {
+        return "config_local_site";
+      }
+      auto possible_config_path_locations() {
+        struct _ConfFilePaths {
+          string[] sisu_document_make() {
+            /+ FIX clean up conf paths ↓ +/
+            /+ config local site (file system only, not in pod) +/
+            /+ return paths +/
+            string[] _possible_config_path_locations;
+            if (_manifest.src.is_pod) {
+              /+ config document in pod +/
+              string _sisudoc_conf_pod; //
+              string _sisudoc_conf_pod_text; //
+              _sisudoc_conf_pod = asNormalizedPath(chainPath(
+                to!string(_env["pwd"]),
+                _manifest.pod.manifest_path ~ "/conf"
+              )).array;
+              _sisudoc_conf_pod_text = asNormalizedPath(chainPath(
+                to!string(_env["pwd"]),
+                _manifest.pod.manifest_path ~ "/media/text/" ~ _manifest.src.lng ~ "/conf"
+              )).array;
+              /+ return paths +/
+              _possible_config_path_locations = [
+                _sisudoc_conf_pod_text,
+                _sisudoc_conf_pod,
+              ];
+            } else {
+              /+ config document (& or local site) on filesystem +/
+              string _sisudoc_conf_pwd   = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about
+              string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array;
+              string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array;
+              string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array;
+              string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array;
+              /+ return paths +/
+              _possible_config_path_locations = [
+                _sisudoc_conf_pwd,
+                _sisudoc_conf_pwd_a,
+                _sisudoc_conf_pwd_b,
+                _sisudoc_conf_pwd_c,
+                _sisudoc_conf_pwd_d,
+              ];
+            }
+            /+ FIX clean up conf paths ↑
+            (compare pwd to doc path location, and build config path)
+            +/
+            return _possible_config_path_locations;
+          }
+          string[] config_local_site() {
+            /+ FIX clean up conf paths ↓ +/
+            /+ config local site (file system only, not in pod) +/
+            string _dot_pwd        = asNormalizedPath(chainPath(to!string(_env["pwd"]), ".sisu")).array;
+            string _underscore_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "_sisu")).array;
+            string _dot_home       = asNormalizedPath(chainPath(to!string(_env["home"]), ".sisu")).array;
+            /+ return paths +/
+            string[] _possible_config_path_locations;
+            if (_manifest.src.is_pod) {
+              string _collection_root_a = asNormalizedPath(chainPath(to!string(_manifest.pod.collection_root.to!string), ".sisu")).array;
+              string _collection_root_b = asNormalizedPath(chainPath(to!string(_manifest.pod.collection_root.to!string), "_sisu")).array;
+              _possible_config_path_locations = [
+                _dot_pwd,
+                _underscore_pwd,
+                _dot_home,
+                "/etc/sisu",
+                _collection_root_a, // set priority higher?
+                _collection_root_b // set priority higher?
+              ];
+            } else {
+              /+ config document (& or local site) on filesystem +/
+              string _sisudoc_conf_pwd   = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about
+              string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array;
+              string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array;
+              string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array;
+              string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array;
+              _possible_config_path_locations = [
+                _sisudoc_conf_pwd,
+                _sisudoc_conf_pwd_a,
+                _sisudoc_conf_pwd_b,
+                _sisudoc_conf_pwd_c,
+                _sisudoc_conf_pwd_d,
+                _dot_pwd,
+                _underscore_pwd,
+                _dot_home,
+                "/etc/sisu"
+              ];
+            }
+            /+ FIX clean up conf paths ↑
+            (compare pwd to doc path location, and build config path)
+            +/
+            return _possible_config_path_locations;
+          }
+        }
+        return _ConfFilePaths();
+      }
+    }
+    return ConfFilePaths();
+  }
+}
+template SiSUpathsSRC() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  auto SiSUpathsSRC(D,Fn)(
+    D   _pwd,
+    Fn  _fn_src_and_path,
+  ) {
+    struct SisuSrcPaths {
+      auto pwd() {
+        return _pwd;
+      }
+      string language() {
+        // use command line info as well?
+        string _k;
+        if (auto m = _fn_src_and_path.match(rgx.language_code_and_filename)) {
+          _k = m.captures[1];
+        } else { /+ unknown until doc_meta read, (could provide & use command line info?) +/
+          _k = "xx"; // original default was "en" but is not known
+        }
+        return _k;
+      }
+      string doc_root() {
+        return "sisudoc";
+      }
+      auto media_root() {
+        return asNormalizedPath(doc_root.chainPath("media")).array;
+      }
+      auto conf_root() {
+        return asNormalizedPath(doc_root.chainPath("conf")).array;
+      }
+      auto text_root() {
+        return asNormalizedPath(media_root.chainPath("text")).array;
+      }
+      auto image_root() {
+        return asNormalizedPath(media_root.chainPath("image")).array;
+      }
+      auto doc_src_fn_with_path_for_text_root_and_lng() {
+        return asNormalizedPath(text_root.chainPath(language)).array;
+      }
+      auto doc_src_fn() {
+        return asNormalizedPath(_fn_src_and_path.baseName).array;
+      }
+      auto doc_src_with_path() {
+        return asNormalizedPath(pwd.chainPath(_fn_src_and_path)).array;
+      }
+    }
+    return SisuSrcPaths();
+  }
+}
+
+
+template SiSUpathsSisupods() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  string _suffix = ".zip";
+  auto SiSUpathsSisupods(Dm)(Dm doc_matters) {
+    string _base_dir_pod = (doc_matters.output_path.length > 0)
+    ? doc_matters.output_path ~ "/sisupod"
+    : "/sisupod";
+    string _base_dir_doc = "sisudoc";
+    struct _PodPaths {
+      string base_filename_(string fn_src) {
+        auto pth = fn_src.baseName.stripExtension;
+        return pth;
+      }
+      string sisupod_dir_() {
+        auto pth = _base_dir_pod;
+        return pth;
+      }
+      string sisudoc_dir_() {
+        auto pth = _base_dir_doc;
+        return pth;
+      }
+      string sisupod_filename_(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array;
+        return pth;
+      }
+      string base_filesystem_(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array;
+        assert(pth == _base_dir_pod ~ "/"  ~ base_filename_(fn_src),
+          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename_(fn_src) ~ "?");
+        return pth;
+      }
+      string base_pod_(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this
+        return pth;
+      }
+      auto base_filename(string fn_src) {
+        auto pth_1_ = base_filename_(fn_src);
+        auto pth_2_ = base_filename_(fn_src);
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto sisupod_filename(string fn_src) {
+        auto pth_1_ = sisupod_filename_(fn_src);
+        auto pth_2_ = sisupod_filename_(fn_src);
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto base(string fn_src) {
+        auto pth_1_ = "";
+        auto pth_2_ = base_filesystem_(fn_src);
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto pod_root(string fn_src) {
+        auto pth_1_ = "";
+        auto pth_2_ = asNormalizedPath(base(fn_src).filesystem_open_zpod.chainPath("")).array; // "sisudoc"
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto conf_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = "conf";
+        auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("conf")).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto css(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = asNormalizedPath(conf_root(fn_src).zpod.chainPath("css")).array;
+        auto pth_2_ = asNormalizedPath(conf_root(fn_src).filesystem_open_zpod.chainPath("css")).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto media_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = "media";
+        auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("media")).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto text_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("text")).array;
+        auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("text")).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto doc(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = text_root(fn_src).zpod;
+        auto pth_2_ = text_root(fn_src).filesystem_open_zpod;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto doc_lng(string fn_src, string lng) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = asNormalizedPath(text_root(fn_src).zpod.chainPath(lng)).array;
+        auto pth_2_ = asNormalizedPath(text_root(fn_src).filesystem_open_zpod.chainPath(lng)).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto image_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("image")).array;
+        auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("image")).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto fn_pod_filelist(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto _manifest = PodManifest!()(fn_src).pod_manifest_filename;
+        auto pth_1_ = _manifest;
+        auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath(_manifest)).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto fn_doc(string fn_src, string lng) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_src.baseName)).array;
+        auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_src.baseName)).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto fn_doc_insert(string fn_src, string fn_insert, string lng) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_insert.baseName)).array;
+        auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_insert.baseName)).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+    }
+    return _PodPaths();
+  }
+}
diff --git a/src/sdp/source/read_config_files.d b/src/sdp/source/read_config_files.d
new file mode 100644
index 0000000..9d976a5
--- /dev/null
+++ b/src/sdp/source/read_config_files.d
@@ -0,0 +1,226 @@
+/++
+  read configuration files<BR>
+  - read config files<BR>
+  meta_config_files.d
++/
+module sdp.source.read_config_files;
+static template configReadInSiteTOML() {
+  import
+    sdp.meta,
+    sdp.source.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(pth.to!string, 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.source.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(pth.to!string, 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 configTOML() {
+  import toml; //
+  import
+    sdp.meta,
+    sdp.source.paths_source,
+    std.file,
+    std.path;
+  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.source.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]) {
+      foreach(pth; possible_config_path_locations) {
+        auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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.source.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]) {
+      foreach(pth; possible_config_path_locations) {
+        auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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 configReadSiteTOML() {
+  import
+    sdp.meta,
+    sdp.source.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.source.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/source/read_source_files.d b/src/sdp/source/read_source_files.d
new file mode 100644
index 0000000..28a660a
--- /dev/null
+++ b/src/sdp/source/read_source_files.d
@@ -0,0 +1,354 @@
+/++
+  module source_read_source_files;<BR>
+  - open markup files<BR>
+  - if master file scan for addional files to import/insert
++/
+module sdp.source.read_source_files;
+static template SiSUrawMarkupContent() {
+  import
+    sdp.meta.rgx;
+  import
+    sdp.meta,
+    sdp.source.paths_source,
+    std.file,
+    std.path;
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  string[] _images=[];
+  auto _extract_images(S)(S content_block) {
+    string[] images_;
+    auto _content_block = content_block.to!string;
+    if (auto m = _content_block.matchAll(rgx.image)) {
+      images_ ~= m.captures[1].to!string;
+    }
+    return images_;
+  }
+  auto rawsrc = RawMarkupContent();
+  auto SiSUrawMarkupContent(O,Fn)(O _opt_action, Fn fn_src) {
+    auto _0_header_1_body_content_2_insert_filelist_tuple
+      = rawsrc.sourceContentSplitIntoHeaderAndBody(_opt_action, rawsrc.sourceContent(fn_src), fn_src);
+    return _0_header_1_body_content_2_insert_filelist_tuple;
+  }
+  struct RawMarkupContent {
+    final sourceContent(in string fn_src) {
+      auto raw = MarkupRawUnit();
+      auto source_txt_str
+        = raw.markupSourceReadIn(fn_src);
+      return source_txt_str;
+    }
+    final auto sourceContentSplitIntoHeaderAndBody(O)(O _opt_action, in string source_txt_str, in string fn_src="") {
+      auto raw = MarkupRawUnit();
+      string[] insert_file_list;
+      string[] images_list;
+      auto t
+        = raw.markupSourceHeaderContentRawLineTupleArray(source_txt_str);
+      auto header_raw = t[0];
+      auto sourcefile_body_content = t[1];
+      if (fn_src.match(rgx.src_fn_master)) { // filename with path needed if master file (.ssm) not otherwise
+        auto ins = Inserts();
+        auto tu
+          = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src);
+        static assert(!isTypeTuple!(tu));
+        sourcefile_body_content = tu[0];
+        insert_file_list = tu[1].dup;
+        images_list = tu[2].dup;
+      } else if (_opt_action.source || _opt_action.sisupod) {
+        auto ins = Inserts();
+        auto tu
+          = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src);
+        static assert(!isTypeTuple!(tu));
+        images_list = tu[2].dup;
+      }
+      t = tuple(
+        header_raw,
+        sourcefile_body_content,
+        insert_file_list,
+        images_list
+      );
+      static assert(t.length==4);
+      return t;
+    }
+  }
+  struct MarkupRawUnit {
+    import std.file;
+    final private string readInMarkupSource(in char[] fn_src) {
+      enforce(
+        exists(fn_src)!=0,
+        "file not found: «" ~
+        fn_src ~ "»"
+      );
+      string source_txt_str;
+      try {
+        if (exists(fn_src)) {
+          debug(io) {
+            writeln("in src, markup source file found: ", fn_src);
+          }
+          source_txt_str = fn_src.readText;
+        }
+      }
+      catch (ErrnoException ex) {
+      }
+      catch (UTFException ex) {
+        // Handle validation errors
+      }
+      catch (FileException ex) {
+        // Handle errors
+      }
+      std.utf.validate(source_txt_str);
+      return source_txt_str;
+    }
+    final private char[][] header0Content1(in string src_text) {
+      /+ split string on _first_ match of "^:?A~\s" into [header, content] array/tuple +/
+      char[][] header_and_content;
+      auto m = (cast(char[]) src_text).matchFirst(rgx.heading_a);
+      header_and_content ~= m.pre;
+      header_and_content ~= m.hit ~ m.post;
+      assert(header_and_content.length == 2,
+        "document markup is broken, header body split == "
+        ~ header_and_content.length.to!string
+        ~ "; (header / body array split should == 2 (split is on level A~))"
+      );
+      return header_and_content;
+    }
+    final private char[][] markupSourceLineArray(in char[] src_text) {
+      char[][] source_line_arr
+        = (cast(char[]) src_text).split(rgx.newline_eol_strip_preceding);
+      return source_line_arr;
+    }
+    auto markupSourceReadIn(in string fn_src) {
+      static auto rgx = Rgx();
+      enforce(
+        fn_src.match(rgx.src_pth_sst_or_ssm),
+        "not a sisu markup filename: «" ~
+        fn_src ~ "»"
+      );
+      auto source_txt_str = readInMarkupSource(fn_src);
+      return source_txt_str;
+    }
+    auto markupSourceHeaderContentRawLineTupleArray(in string source_txt_str) {
+      string[] file_insert_list = [];
+      string[] images_list = [];
+      auto hc = header0Content1(source_txt_str);
+      auto header = hc[0];
+      char[] source_txt = hc[1];
+      auto source_line_arr = markupSourceLineArray(source_txt);
+      auto t = tuple(
+        header,
+        source_line_arr,
+        file_insert_list,
+        images_list
+      );
+      return t;
+    }
+    final char[][] getInsertMarkupSourceContentRawLineArray(
+      in char[]    fn_src_insert,
+      Regex!(char) rgx_file
+    ) {
+      enforce(
+        fn_src_insert.match(rgx_file),
+        "not a sisu markup filename: «" ~
+        fn_src_insert  ~ "»"
+      );
+      auto source_txt_str = readInMarkupSource(fn_src_insert);
+      auto source_line_arr = markupSourceLineArray(source_txt_str);
+      return source_line_arr;
+    }
+  }
+  struct Inserts {
+    auto scan_subdoc_source(O)(
+      O        _opt_action,
+      char[][] markup_sourcefile_insert_content,
+      string   fn_src
+    ) {
+      mixin SiSUrgxInitFlags;
+      char[][] contents_insert;
+      auto type1 = flags_type_init;
+      auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm);
+      auto markup_src_file_path = fn_pth_full.captures[1];
+      foreach (line; markup_sourcefile_insert_content) {
+        if (type1["curly_code"] == 1) {
+          type1["header_make"] = 0;
+          type1["header_meta"] = 0;
+          if (line.matchFirst(rgx.block_curly_code_close)) {
+            type1["curly_code"] = 0;
+          }
+          contents_insert ~= line;
+        } else if (line.matchFirst(rgx.block_curly_code_open)) {
+          type1["curly_code"] = 1;
+          type1["header_make"] = 0;
+          type1["header_meta"] = 0;
+          contents_insert ~= line;
+        } else if (type1["tic_code"] == 1) {
+          type1["header_make"] = 0;
+          type1["header_meta"] = 0;
+          if (line.matchFirst(rgx.block_tic_close)) {
+            type1["tic_code"] = 0;
+          }
+          contents_insert ~= line;
+        } else if (line.matchFirst(rgx.block_tic_code_open)) {
+          type1["tic_code"] = 1;
+          type1["header_make"] = 0;
+          type1["header_meta"] = 0;
+          contents_insert ~= line;
+        } else if (
+          (type1["header_make"] == 1)
+          && line.matchFirst(rgx.native_header_sub)
+        ) {
+            type1["header_make"] = 1;
+            type1["header_meta"] = 0;
+        } else if (
+          (type1["header_meta"] == 1)
+          && line.matchFirst(rgx.native_header_sub)
+        ) {
+            type1["header_meta"] = 1;
+            type1["header_make"] = 0;
+        } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) {
+          type1["header_make"] = 0;
+          type1["header_meta"] = 0;
+          auto insert_fn = m.captures[2];
+          auto insert_sub_pth = m.captures[1];
+          auto fn_src_insert
+            = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array;
+          auto raw = MarkupRawUnit();
+          auto markup_sourcesubfile_insert_content
+            = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts);
+          debug(insert_file) {
+            tell_l("red", line);
+            tell_l("red", fn_src_insert);
+            tell_l("fuchsia", "ERROR");
+            writeln(
+              "  length contents insert array: ",
+              markup_sourcesubfile_insert_content.length
+            );
+          }
+          if (_opt_action.source || _opt_action.sisupod) {
+            _images ~= _extract_images(markup_sourcesubfile_insert_content);
+          }
+          auto ins = Inserts();
+          /+
+            - 1. load file
+            - 2. read lines
+            - 3. scan lines
+              - a. if filename insert, and insert filename
+                 - repeat 1
+              - b. else
+                 - add line to new array;
+                 - build image list, search for any image files to add to image list
+          +/
+        } else {
+          type1["header_make"] = 0;
+          type1["header_meta"] = 0;
+          contents_insert ~= line; // images to extract for image list?
+          if (_opt_action.source || _opt_action.sisupod) {
+            auto _image_linelist = _extract_images(line);
+            if (_image_linelist.length > 0) {
+              _images ~= _image_linelist;
+            }
+          }
+        }
+      } // end src subdoc (inserts) loop
+      auto t = tuple(
+        contents_insert,
+        _images
+      );
+      return t;
+    }
+    auto scan_master_src_for_insert_files_and_import_content(O)(
+      O        _opt_action,
+      char[][] sourcefile_body_content,
+      string   fn_src
+    ) {
+      import std.algorithm;
+      mixin SiSUrgxInitFlags;
+      char[][] contents;
+      auto type = flags_type_init;
+      auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm);
+      auto markup_src_file_path = fn_pth_full.captures[1];
+      char[][] contents_insert;
+      string[] _images =[];
+      string[] insert_file_list =[];
+      foreach (line; sourcefile_body_content) {
+        if (type["curly_code"] == 1) {
+          if (line.matchFirst(rgx.block_curly_code_close)) {
+            type["curly_code"] = 0;
+          }
+          contents ~= line;
+        } else if (line.matchFirst(rgx.block_curly_code_open)) {
+          type["curly_code"] = 1;
+          contents ~= line;
+        } else if (type["tic_code"] == 1) {
+          if (line.matchFirst(rgx.block_tic_close)) {
+            type["tic_code"] = 0;
+          }
+          contents ~= line;
+        } else if (line.matchFirst(rgx.block_tic_code_open)) {
+          type["tic_code"] = 1;
+          contents ~= line;
+        } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) {
+          auto insert_fn = m.captures[2];
+          auto insert_sub_pth = m.captures[1];
+          auto fn_src_insert
+            = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array;
+            insert_file_list ~= fn_src_insert.to!string;
+          auto raw = MarkupRawUnit();
+          /+ TODO +/
+          auto markup_sourcefile_insert_content
+            = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts);
+          debug(insert_file) {
+            tell_l("red", line);
+            tell_l("red", fn_src_insert);
+            writeln(
+              "  length contents insert array: ",
+              markup_sourcefile_insert_content.length
+            );
+          }
+          auto ins = Inserts();
+          auto contents_insert_tu = ins.scan_subdoc_source(
+            _opt_action,
+            markup_sourcefile_insert_content,
+            fn_src_insert.to!string
+          );
+          contents ~= contents_insert_tu[0]; // images to extract for image list?
+          if (_opt_action.source || _opt_action.sisupod) {
+            auto _image_linelist = _extract_images(contents_insert_tu[0]);
+            if (_image_linelist.length > 0) {
+              _images ~= _image_linelist;
+            }
+          }
+          /+
+            - 1. load file
+            - 2. read lines
+            - 3. scan lines
+              - a. if filename insert, and insert filename
+                 - repeat 1
+              - b. else
+                 - add line to new array;
+                 - build image list, search for any image files to add to image list
+          +/
+        } else {
+          contents ~= line;
+          if (_opt_action.source || _opt_action.sisupod) {
+            auto _image_linelist = _extract_images(line);
+            if (_image_linelist.length > 0) {
+              _images ~= _image_linelist;
+            }
+          }
+        }
+      } // end src doc loop
+      string[] images = [];
+      foreach(i; uniq(_images.sort())) {
+        images ~= i;
+      }
+      debug(insert_file) {
+        writeln(__LINE__);
+        writeln(contents.length);
+      }
+      auto t = tuple(
+        contents,
+        insert_file_list,
+        images
+      );
+      return t;
+    }
+  }
+}
-- 
cgit v1.2.3