From e37589f5f5253d81c62f8846dbf721c23fe48d44 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph.amissah@gmail.com>
Date: Thu, 7 Oct 2021 20:39:57 -0400
Subject: configuration, hierarchy filenames & paths ...

---
 src/doc_reform/io_out/cgi_sqlite_search_form.d |    4 +-
 src/doc_reform/meta/conf_make_meta_structs.d   |    1 -
 src/doc_reform/meta/conf_make_meta_yaml.d      | 1868 +++++++++++++-----------
 src/doc_reform/meta/metadoc.d                  |    6 +-
 src/doc_reform/spine.d                         |   78 +-
 5 files changed, 1034 insertions(+), 923 deletions(-)

(limited to 'src/doc_reform')

diff --git a/src/doc_reform/io_out/cgi_sqlite_search_form.d b/src/doc_reform/io_out/cgi_sqlite_search_form.d
index 092e882..fb3febb 100644
--- a/src/doc_reform/io_out/cgi_sqlite_search_form.d
+++ b/src/doc_reform/io_out/cgi_sqlite_search_form.d
@@ -1848,7 +1848,7 @@ mixin GenericMain!cgi_function_intro;
   make_and_meta_struct.conf.output_path ~ "/sqlite/",
   _sqlite_db_fn,
   (opt_action.cgi_search_title.empty)
-    ? make_and_meta_struct.conf.w_srv_cgi_search_title
+    ? make_and_meta_struct.conf.w_srv_cgi_search_form_title
     : opt_action.cgi_search_title,
   (opt_action.css_theme_default) ? "FFFFFF" : "000000",
   (opt_action.css_theme_default) ? "000000" : "CCCCCC",
@@ -1868,7 +1868,7 @@ mixin GenericMain!cgi_function_intro;
   (opt_action.css_theme_default) ? "000000" : "FFFF48",
   (opt_action.css_theme_default) ? "FFFF48" : "777748",
   (opt_action.cgi_search_title.empty)
-    ? make_and_meta_struct.conf.w_srv_cgi_search_title
+    ? make_and_meta_struct.conf.w_srv_cgi_search_form_title
     : opt_action.cgi_search_title,
   (opt_action.css_theme_default) ? "222222" : "AAAAAA",
   _cgi_search_script,
diff --git a/src/doc_reform/meta/conf_make_meta_structs.d b/src/doc_reform/meta/conf_make_meta_structs.d
index 2a95379..dc9d635 100644
--- a/src/doc_reform/meta/conf_make_meta_structs.d
+++ b/src/doc_reform/meta/conf_make_meta_structs.d
@@ -206,7 +206,6 @@ struct ConfCompositeSiteLocal {
   string   w_srv_cgi_host;             // if not set same as webserv_host
   string   w_srv_cgi_bin_subpath;
   string   w_srv_cgi_bin_path;
-  string   w_srv_cgi_search_title;
   string   w_srv_cgi_search_script;
   string   w_srv_cgi_search_script_raw_fn_d;
   string   w_srv_cgi_port;
diff --git a/src/doc_reform/meta/conf_make_meta_yaml.d b/src/doc_reform/meta/conf_make_meta_yaml.d
index 6d4a2b1..ef40a09 100644
--- a/src/doc_reform/meta/conf_make_meta_yaml.d
+++ b/src/doc_reform/meta/conf_make_meta_yaml.d
@@ -70,982 +70,1092 @@ template contentYAMLtoSpineStruct() {
     doc_reform.meta.defaults,
     doc_reform.meta.rgx;
   ConfComposite _struct_composite;
-  @system auto contentYAMLtoSpineStruct(C,Y,M,O)(
-    C _struct_composite,
-    Y _yaml,
-    M _manifested,
-    O _opt_action,
+  @system auto contentYAMLtoSpineStruct(C,Y,M,O,Cfg)(
+    C      _struct_composite,
+    Y      _yaml,
+    M      _manifested,
+    O      _opt_action,
+    Cfg    _cfg,
     string _identifier
   ) {
     mixin spineRgxIn;
     static auto rgx = RgxI();
     confCompositeMakeBuild _mk;
-    /+ make ------------------------------------------------------------------- +/
-    if ("make" in _yaml
-      && _yaml["make"].type.sequence
-    ) {
-      if (_yaml["make"].type.mapping
-        && _yaml["make"].tag.match(rgx.yaml_tag_is_map)
-      ) {
-        if ("bold" in _yaml["make"]
-          && _yaml["make"]["bold"].type.string
-          && _yaml["make"]["bold"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.bold = _yaml["make"]["bold"].get!string;
-        }
-        if ("breaks" in _yaml["make"]
-          && _yaml["make"]["breaks"].type.string
-          && _yaml["make"]["breaks"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.breaks = _yaml["make"]["breaks"].get!string;
-        }
-        if ("cover_image" in _yaml["make"]
-          && _yaml["make"]["cover_image"].type.string
-          && _yaml["make"]["cover_image"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.cover_image = _yaml["make"]["cover_image"].get!string;
-        }
-        if ("css" in _yaml["make"]
-          && _yaml["make"]["css"].type.string
-          && _yaml["make"]["css"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.css = _yaml["make"]["css"].get!string;
-        }
-        if ("emphasis" in _yaml["make"]
-          && _yaml["make"]["emphasis"].type.string
-          && _yaml["make"]["emphasis"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.emphasis = _yaml["make"]["emphasis"].get!string;
-        }
-        if ("footer" in _yaml["make"]
-          && _yaml["make"]["footer"].type.string
-          && _yaml["make"]["footer"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          char[][] __match_footer_array
-            = (cast(char[]) _yaml["make"]["footer"].get!string)
-              .split(rgx.make_heading_delimiter);
-          _struct_composite.make_str.footer = __match_footer_array.to!(string[]);
-        }
-        if ("headings" in _yaml["make"]
-          && _yaml["make"]["headings"].type.string
-          && _yaml["make"]["headings"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          char[][] __match_headings_array
-            = (cast(char[]) _yaml["make"]["headings"].get!string)
-              .split(rgx.make_heading_delimiter);
-          _struct_composite.make_str.headings = __match_headings_array.to!(string[]);
-        } else if ("headings" in _yaml["make"]
-          && _yaml["make"]["headings"].type.string
-          && _yaml["make"]["headings"].tag.match(rgx.yaml_tag_is_seq)
-        ) {
-          foreach(string identify_heading_level; _yaml["make"]["headings"]) {
-            _struct_composite.make_str.headings ~= identify_heading_level;
-          }
-        }
-        if ("home_button_image" in _yaml["make"]
-          && _yaml["make"]["home_button_image"].type.string
-          && _yaml["make"]["home_button_image"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          char[][] __match_home_button_image_array
-            = (cast(char[]) _yaml["make"]["home_button_image"].get!string)
-              .split(rgx.make_heading_delimiter);
-          _struct_composite.make_str.home_button_image = __match_home_button_image_array.to!(string[]);
-        }
-        if ("home_button_text" in _yaml["make"]
-          && _yaml["make"]["home_button_text"].type.string
-          && _yaml["make"]["home_button_text"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.home_button_text = _yaml["make"]["home_button_text"].get!string;
-        } else if ("home_button_text" in _yaml["make"]
-          && _yaml["make"]["home_button_text"].type.string
-          && _yaml["make"]["home_button_text"].tag.match(rgx.yaml_tag_is_seq)
-        ) {
-          _struct_composite.make_str.home_button_text = "";
-          foreach(string hbt; _yaml["make"]["home_button_text"]) {
-            _struct_composite.make_str.home_button_text ~= hbt ~ "; ";
+    if (_identifier != "header") { // called only once per run anyway
+      /+ conf ------------------------------------------------------------------- +/
+      /+
+       _cfg. build defaults (else program runtime defaults)
+       local_site_configuration defaults
+       command line overrides
+      +/
+      {
+        if (_opt_action.webserver_http.length > 0) {
+          _struct_composite.conf.w_srv_http
+            = _opt_action.webserver_http;
+        } else {
+          _struct_composite.conf.w_srv_http
+            = (_cfg.www_http.empty)
+              ? "http"
+              : _cfg.www_http;
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("http" in _yaml["webserv"]
+              && _yaml["webserv"]["http"].type.string
+              && _yaml["webserv"]["http"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_http
+                = _yaml["webserv"]["http"].get!string;
+            }
           }
         }
-        if ("italics" in _yaml["make"]
-          && _yaml["make"]["italics"].type.string
-          && _yaml["make"]["italics"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.italics = _yaml["make"]["italics"].get!string;
-        }
-        if ("auto_num_top_at_level" in _yaml["make"]
-          && _yaml["make"]["auto_num_top_at_level"].type.string
-          && _yaml["make"]["auto_num_top_at_level"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.make_str.auto_num_top_at_level = _yaml["make"]["auto_num_top_at_level"].get!string;
-          switch (_yaml["make"]["auto_num_top_at_level"].get!string) {
-          case "A":
-            break;
-          case "B": _struct_composite.make_str.auto_num_top_lv = 1;
-            break;
-          case "C": _struct_composite.make_str.auto_num_top_lv = 2;
-            break;
-          case "D": _struct_composite.make_str.auto_num_top_lv = 3;
-            break;
-          case "1": _struct_composite.make_str.auto_num_top_lv = 4;
-            break;
-          case "2": _struct_composite.make_str.auto_num_top_lv = 5;
-            break;
-          case "3": _struct_composite.make_str.auto_num_top_lv = 6;
-            break;
-          case "4": _struct_composite.make_str.auto_num_top_lv = 7;
-            break;
-          default:
-            break;
+        if (_opt_action.cgi_search_title.length > 0) {
+          _struct_composite.conf.w_srv_cgi_search_form_title
+            = _opt_action.cgi_search_title;
+        } else {
+          _struct_composite.conf.w_srv_cgi_search_form_title
+            = (_cfg.cgi_search_form_title.empty)
+              ? "≅ SiSU spine search form"
+              : _cfg.cgi_search_form_title;
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("cgi_search_form_title" in _yaml["webserv"]
+              && _yaml["webserv"]["cgi_search_form_title"].type.string
+              && _yaml["webserv"]["cgi_search_form_title"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_cgi_search_form_title
+                = _yaml["webserv"]["cgi_search_form_title"].get!string;
+            }
           }
         }
-        if ("auto_num_depth" in _yaml["make"]
-          && _yaml["make"]["auto_num_depth"].type.string
-          && _yaml["make"]["auto_num_depth"].tag.match(rgx.yaml_tag_is_int)
-        ) { // not sure implemented for documents
-          _struct_composite.make_str.auto_num_depth = _yaml["make"]["auto_num_depth"].get!int;
-        } else if ("auto_num_depth" in _yaml["make"]
-          && _yaml["make"]["auto_num_depth"].type.string
-          && _yaml["make"]["auto_num_depth"].tag.match(rgx.yaml_tag_is_str)
-        ) { // not sure implemented for documents
-          _struct_composite.make_str.auto_num_depth = _yaml["make"]["auto_num_depth"].get!int;
-        }
-        if ("texpdf_font" in _yaml["make"]
-          && _yaml["make"]["texpdf_font"].type.string
-        ) {
-          _struct_composite.make_str.texpdf_font = _yaml["make"]["texpdf_font"].get!string;
-        }
-      }
-      _struct_composite.make.bold                     = _mk.bold(_struct_composite.make_str.bold);
-      _struct_composite.make.breaks                   = _mk.breaks(_struct_composite.make_str.breaks);
-      _struct_composite.make.cover_image              = _mk.cover_image(_struct_composite.make_str.cover_image);
-      _struct_composite.make.css                      = _mk.css(_struct_composite.make_str.css);
-      _struct_composite.make.emphasis                 = _mk.emphasis(_struct_composite.make_str.emphasis);
-      _struct_composite.make.footer                   = _mk.footer(_struct_composite.make_str.footer);
-      _struct_composite.make.headings                 = _mk.headings(_struct_composite.make_str.headings);
-      _struct_composite.make.home_button_image        = _mk.home_button_image(_struct_composite.make_str.home_button_image);
-      _struct_composite.make.home_button_text         = _mk.home_button_text(_struct_composite.make_str.home_button_text);
-      _struct_composite.make.italics                  = _mk.italics(_struct_composite.make_str.italics);
-      _struct_composite.make.auto_num_top_at_level    = _mk.auto_num_top_at_level(_struct_composite.make_str.auto_num_top_at_level);
-      _struct_composite.make.auto_num_top_lv          = _mk.auto_num_top_lv(_struct_composite.make_str.auto_num_top_lv);
-      _struct_composite.make.auto_num_depth           = _mk.auto_num_depth(_struct_composite.make_str.auto_num_depth);
-      _struct_composite.make.substitute               = _mk.substitute(_struct_composite.make_str.substitute);
-      _struct_composite.make.texpdf_font              = _mk.texpdf_font(_struct_composite.make_str.texpdf_font);
-    }
-    
-    /+ conf ------------------------------------------------------------------- +/
-    if ("webserv" in _yaml
-      && _yaml["webserv"].type.sequence
-    ) {
-      if (_yaml["webserv"].type.mapping
-        && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map)
-      ) {
-        if ("http" in _yaml["webserv"]
-          && _yaml["webserv"]["http"].type.string
-          && _yaml["webserv"]["http"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_http = _yaml["webserv"]["http"].get!string;
-        } // else { set default? }
-        if ("data_http" in _yaml["webserv"]
-          && _yaml["webserv"]["data_http"].type.string
-          && _yaml["webserv"]["data_http"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_data_http = _yaml["webserv"]["data_http"].get!string;
-        }
-        if ("cgi_http" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_http"].type.string
-          && _yaml["webserv"]["cgi_http"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_http = _yaml["webserv"]["cgi_http"].get!string;
-        }
-        if ("host" in _yaml["webserv"]
-          && _yaml["webserv"]["host"].type.string
-          && _yaml["webserv"]["host"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_host = _yaml["webserv"]["host"].get!string;
-        }
-        // if ("data_root_url" in _yaml["webserv"]
-        //   && _yaml["webserv"]["data_root_url"].type.string
-        //   && _yaml["webserv"]["data_root_url"].tag.match(rgx.yaml_tag_is_str)
-        // ) {
-        //   _struct_composite.conf.w_srv_data_root_url = _yaml["webserv"]["data_root_url"].get!string;
-        //   if (auto m = _struct_composite.conf.w_srv_data_root_url.match(rgx.webserv_url_doc_root)) {
-        //     _struct_composite.conf.w_srv_url_host = m.captures[2].to!string;
-        //     _struct_composite.conf.w_srv_url_doc_path = m.captures[3].to!string;
-        //   }
-        // }
-        if ("data_root_path" in _yaml["webserv"]
-          && _yaml["webserv"]["data_root_path"].type.string
-          && _yaml["webserv"]["data_root_path"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_data_root_path = _yaml["webserv"]["data_root_path"].get!string;
-        }
-        if ("data_root_part" in _yaml["webserv"]
-          && _yaml["webserv"]["data_root_part"].type.string
-          && _yaml["webserv"]["data_root_part"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_data_root_part = _yaml["webserv"]["data_root_part"].get!string;
-        }
-        if ("images_root_part" in _yaml["webserv"]
-          && _yaml["webserv"]["images_root_part"].type.string
-          && _yaml["webserv"]["images_root_part"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_images_root_part = _yaml["webserv"]["images_root_part"].get!string;
-        }
-        if ("data_root_url" in _yaml["webserv"]
-          && _yaml["webserv"]["data_root_url"].type.string
-          && _yaml["webserv"]["data_root_url"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_data_root_url      = _yaml["webserv"]["data_root_url"].get!string;
-          _struct_composite.conf.w_srv_data_root_url_html =
-            _yaml["webserv"]["data_root_url"].get!string ~ "/"
-            ~ _manifested.src.language ~ "/"
-            ~ "html";
+        if (_opt_action.cgi_sqlite_search_filename.length > 0) {
+          _struct_composite.conf.w_srv_cgi_search_script
+            = _opt_action.cgi_sqlite_search_filename;
         } else {
-          _struct_composite.conf.w_srv_data_root_url =  _struct_composite.conf.w_srv_data_root_part;
-          _struct_composite.conf.w_srv_data_root_url_html =
-            _struct_composite.conf.w_srv_data_root_part ~ "/"
-            ~ _manifested.src.language ~ "/"
-            ~ "html";
-        }
-        if ("cgi_host" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_host"].type.string
-          && _yaml["webserv"]["cgi_host"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_host = _yaml["webserv"]["cgi_host"].get!string;
-        } else { // composite construct
-          _struct_composite.conf.w_srv_cgi_host = _struct_composite.conf.w_srv_host;
-        }
-        if ("cgi_search_form_title" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_search_form_title"].type.string
-          && _yaml["webserv"]["cgi_search_form_title"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_search_form_title = _yaml["webserv"]["cgi_search_form_title"].get!string;
-        }
-        if ("cgi_bin_subpath" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_bin_subpath"].type.string
-          && _yaml["webserv"]["cgi_bin_subpath"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_bin_subpath = _yaml["webserv"]["cgi_bin_subpath"].get!string;
-        }
-        if ("cgi_bin_path" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_bin_path"].type.string
-          && _yaml["webserv"]["cgi_bin_path"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_bin_path = _yaml["webserv"]["cgi_bin_path"].get!string;
+          _struct_composite.conf.w_srv_cgi_search_script
+            = (_cfg.cgi_filename.empty)
+              ? "spine_search"
+              : _cfg.cgi_filename;
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("cgi_search_script" in _yaml["webserv"]
+              && _yaml["webserv"]["cgi_search_script"].type.string
+              && _yaml["webserv"]["cgi_search_script"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_cgi_search_script
+                = _yaml["webserv"]["cgi_search_script"].get!string;
+            }
+          }
         }
-        if (_opt_action.cgi_search_title.length > 0) {
-          _struct_composite.conf.w_srv_cgi_search_title = _opt_action.cgi_search_title;
-        } else if ("cgi_search_title" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_search_title"].type.string
-          && _yaml["webserv"]["cgi_search_title"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_search_title = _yaml["webserv"]["cgi_search_title"].get!string;
+        if (_opt_action.sqliteDB_filename.length > 0) {
+          _struct_composite.conf.w_srv_db_sqlite_filename
+            = _opt_action.sqliteDB_filename;
         } else {
-          _struct_composite.conf.w_srv_cgi_search_title = "≅ SiSU spine search form";
+          _struct_composite.conf.w_srv_db_sqlite_filename
+            = (_cfg.db_sqlite_filename.empty)
+              ?  "spine.search.db"
+              : _cfg.db_sqlite_filename;
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("db_sqlite_filename" in _yaml["webserv"]
+              && _yaml["webserv"]["db_sqlite_filename"].type.string
+              && _yaml["webserv"]["db_sqlite_filename"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_db_sqlite_filename
+                = _yaml["webserv"]["db_sqlite_filename"].get!string;
+            }
+          }
         }
-        if (_opt_action.cgi_sqlite_search_filename.length > 0) {
-          _struct_composite.conf.w_srv_cgi_search_script = _opt_action.cgi_sqlite_search_filename;
-        } else if ("cgi_search_script" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_search_script"].type.string
-          && _yaml["webserv"]["cgi_search_script"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_search_script = _yaml["webserv"]["cgi_search_script"].get!string;
+        if (_opt_action.sqliteDB_path.length > 0) {
+          _struct_composite.conf.w_srv_db_sqlite_path
+            = _opt_action.sqliteDB_path;
         } else {
-          _struct_composite.conf.w_srv_cgi_search_script = "spine_search";
+          _struct_composite.conf.w_srv_db_sqlite_path
+            = (_cfg.db_sqlite_path.empty)
+              ?  "/var/www/sqlite"
+              : _cfg.db_sqlite_path;
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("db_sqlite_path" in _yaml["webserv"]
+              && _yaml["webserv"]["db_sqlite_path"].type.string
+              && _yaml["webserv"]["db_sqlite_path"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_db_sqlite_path
+                = _yaml["webserv"]["db_sqlite_path"].get!string;
+            }
+          }
         }
-        if (_opt_action.cgi_sqlite_search_filename_d.length > 0) {
-          _struct_composite.conf.w_srv_cgi_search_script_raw_fn_d = _opt_action.cgi_sqlite_search_filename_d;
-        } else if ("cgi_search_script_raw_fn_d" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_search_script_raw_fn_d"].type.string
-          && _yaml["webserv"]["cgi_search_script_raw_fn_d"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_search_script_raw_fn_d = _yaml["webserv"]["cgi_search_script_raw_fn_d"].get!string;
-        } else if ("cgi_search_script" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_search_script"].type.string
-          && _yaml["webserv"]["cgi_search_script"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_search_script_raw_fn_d = (_yaml["webserv"]["cgi_search_script"].get!string).translate(['-' : "_"]) ~ ".d";
+        if (_opt_action.cgi_url_action.length > 0) {
+          _struct_composite.conf.w_srv_cgi_action
+            = _opt_action.cgi_url_action;
         } else {
-          _struct_composite.conf.w_srv_cgi_search_script_raw_fn_d = "spine_search.d";
-        }
-        if ("cgi_port" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_port"].type.string
-          && _yaml["webserv"]["cgi_port"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_port = _yaml["webserv"]["cgi_port"].get!string;
+          _struct_composite.conf.w_srv_cgi_action
+            = (_cfg.www_url_doc_root.empty)
+              ?  "http://locahost" // "https://sisudoc.org"
+              : _cfg.www_url_doc_root;
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("cgi_action" in _yaml["webserv"]
+              && _yaml["webserv"]["cgi_action"].type.string
+              && _yaml["webserv"]["cgi_action"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_cgi_action
+                = _yaml["webserv"]["cgi_action"].get!string;
+            } else if (_opt_action.cgi_sqlite_search_filename.length > 0) {
+              _struct_composite.conf.w_srv_cgi_action
+                = _struct_composite.conf.w_srv_cgi_bin_url ~ "/" ~ _opt_action.cgi_sqlite_search_filename;
+            }
+          }
         }
-        if ("cgi_user" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_user"].type.string
-          && _yaml["webserv"]["cgi_user"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_user = _yaml["webserv"]["cgi_user"].get!string;
+        if (!(_struct_composite.conf.output_path)) {
+          _struct_composite.conf.output_path = ((_manifested.output.path).asNormalizedPath).array;
+        } {
+          if (_opt_action.output_dir_set.length > 0) {
+            _struct_composite.conf.output_path
+              = (_opt_action.output_dir_set.asNormalizedPath).array;
+          } else {
+            _struct_composite.conf.output_path
+              = (_cfg.www_doc_root.empty)
+                ?  "/srv/www/spine"
+                : _cfg.www_doc_root;
+            if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+              && (_yaml["webserv"].type.mapping
+                && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+            ) {
+              if (_yaml["output"].type.mapping
+                && _yaml["output"].tag.match(rgx.yaml_tag_is_map)
+              ) {
+                if ("path" in _yaml["output"]
+                  && _yaml["output"]["path"].type.string
+                  && _yaml["output"]["path"].tag.match(rgx.yaml_tag_is_str)
+                ) {
+                  if (_manifested.output.path == _manifested.env.pwd
+                    && _yaml["output"]["path"].get!string.length > 0
+                  ) {
+                    _struct_composite.conf.output_path = (((_yaml["output"]["path"].get!string).expandTilde).asNormalizedPath).array;
+                  }
+                }
+              }
+            }
+          }
+          if (_opt_action.webserver_host_doc_root.length > 0) { // same as output_path immediately above, resolve FIX REMOVE
+            _struct_composite.conf.w_srv_data_root_path
+              = _opt_action.webserver_host_doc_root;
+          } else {
+            _struct_composite.conf.w_srv_data_root_path
+              = (_cfg.www_doc_root.empty)
+                ? "/var/www/spine"
+                : _cfg.www_doc_root;
+            if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+              && (_yaml["webserv"].type.mapping
+                && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+            ) {
+              if ("data_root_path" in _yaml["webserv"]
+                && _yaml["webserv"]["data_root_path"].type.string
+                && _yaml["webserv"]["data_root_path"].tag.match(rgx.yaml_tag_is_str)
+              ) {
+                _struct_composite.conf.w_srv_data_root_path
+                  = _yaml["webserv"]["data_root_path"].get!string;
+              }
+            }
+          }
         }
-        if ("cgi_bin_url" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_bin_url"].type.string
-          && _yaml["webserv"]["cgi_bin_url"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_bin_url = _yaml["webserv"]["cgi_bin_url"].get!string;
+        if (_opt_action.cgi_bin_root.length > 0) {
+          _struct_composite.conf.w_srv_cgi_bin_path
+            = _opt_action.cgi_bin_root;
         } else {
-          _struct_composite.conf.w_srv_cgi_bin_url =
-            (_struct_composite.conf.w_srv_cgi_http.empty)
-              ? _struct_composite.conf.w_srv_http
-              :_struct_composite.conf.w_srv_cgi_http
-            ~ "://"
-            ~ (_struct_composite.conf.w_srv_cgi_host.empty)
-              ? _struct_composite.conf.w_srv_cgi_host
-              : _struct_composite.conf.w_srv_host
-            ~ _struct_composite.conf.w_srv_cgi_bin_subpath;
-        }
-        if (_opt_action.cgi_url_action.length > 0) {
-          _struct_composite.conf.w_srv_cgi_action = _opt_action.cgi_url_action;
-        } else if ("cgi_action" in _yaml["webserv"]
-          && _yaml["webserv"]["cgi_action"].type.string
-          && _yaml["webserv"]["cgi_action"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_cgi_action = _yaml["webserv"]["cgi_action"].get!string;
-        } else if (_opt_action.cgi_sqlite_search_filename.length > 0) { // WORKON
-          _struct_composite.conf.w_srv_cgi_action = _struct_composite.conf.w_srv_cgi_bin_url ~ "/" ~ _opt_action.cgi_sqlite_search_filename;
-        } else { // action is composite, build
+          _struct_composite.conf.w_srv_cgi_bin_path
+            = (_cfg.cgi_bin_root.empty)
+              ? "/var/www/cgi/cgi-bin"
+              : _cfg.cgi_bin_root;
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("cgi_bin_path" in _yaml["webserv"]
+              && _yaml["webserv"]["cgi_bin_path"].type.string
+              && _yaml["webserv"]["cgi_bin_path"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_cgi_bin_path
+                = _yaml["webserv"]["cgi_bin_path"].get!string;
+            }
+          }
         }
-        // if ("cgi_file_links" in _yaml["webserv"]
-        //   && _yaml["webserv"]["cgi_file_links"].type.string
-        //   && _yaml["webserv"]["cgi_file_links"].tag.match(rgx.yaml_tag_is_str)
-        // ) {
-        //   _struct_composite.conf.w_srv_cgi_file_links = _yaml["webserv"]["cgi_file_links"].get!string;
-        // }
-        if (_opt_action.sqliteDB_filename.length > 0) {
-          _struct_composite.conf.w_srv_db_sqlite_filename = _opt_action.sqliteDB_filename;
-        } else if ("db_sqlite_filename" in _yaml["webserv"]
-          && _yaml["webserv"]["db_sqlite_filename"].type.string
-          && _yaml["webserv"]["db_sqlite_filename"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_db_sqlite_filename = _yaml["webserv"]["db_sqlite_filename"].get!string;
-        } else { // set default ?
+        { _struct_composite.conf.w_srv_data_root_part
+            = "";
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("data_root_part" in _yaml["webserv"]
+              && _yaml["webserv"]["data_root_part"].type.string
+              && _yaml["webserv"]["data_root_part"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_data_root_part = _yaml["webserv"]["data_root_part"].get!string;
+            }
+          }
         }
-        if (_opt_action.sqliteDB_path.length > 0) {
-          _struct_composite.conf.w_srv_db_sqlite_path = _opt_action.sqliteDB_path;
-        } else if ("db_sqlite_path" in _yaml["webserv"]
-          && _yaml["webserv"]["db_sqlite_path"].type.string
-          && _yaml["webserv"]["db_sqlite_path"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.w_srv_db_sqlite_path = _yaml["webserv"]["db_sqlite_path"].get!string;
-        } else { // set default ?
+        { _struct_composite.conf.w_srv_images_root_part
+            = "image";
+          if (("webserv" in _yaml && _yaml["webserv"].type.sequence)
+            && (_yaml["webserv"].type.mapping
+              && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+          ) {
+            if ("images_root_part" in _yaml["webserv"]
+              && _yaml["webserv"]["images_root_part"].type.string
+              && _yaml["webserv"]["images_root_part"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.conf.w_srv_images_root_part = _yaml["webserv"]["images_root_part"].get!string;
+            }
+          }
         }
       }
-    }
-    if (!(_struct_composite.conf.output_path)) {
-      _struct_composite.conf.output_path = ((_manifested.output.path).asNormalizedPath).array;
-    }
-    if (_opt_action.output_dir_set.length > 0) {
-      _struct_composite.conf.output_path = (_opt_action.output_dir_set.asNormalizedPath).array;
-    } else if ("output" in _yaml
-      && _yaml["output"].type.sequence
-    ) {
-      if (_yaml["output"].type.mapping
-        && _yaml["output"].tag.match(rgx.yaml_tag_is_map)
-      ) {
-        if ("path" in _yaml["output"]
-          && _yaml["output"]["path"].type.string
-          && _yaml["output"]["path"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          if (_manifested.output.path == _manifested.env.pwd
-            && _yaml["output"]["path"].get!string.length > 0
+      if (("webserv" in _yaml
+        && _yaml["webserv"].type.sequence)
+        && (_yaml["webserv"].type.mapping
+          && _yaml["webserv"].tag.match(rgx.yaml_tag_is_map))
+      ) { // cannot be used as is with opt_action FIX look at remaining, decide what to do later
+          if ("data_http" in _yaml["webserv"]
+            && _yaml["webserv"]["data_http"].type.string
+            && _yaml["webserv"]["data_http"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.conf.output_path = (((_yaml["output"]["path"].get!string).expandTilde).asNormalizedPath).array;
+            _struct_composite.conf.w_srv_data_http = _yaml["webserv"]["data_http"].get!string;
           }
-        }
+          // if (_opt_action.*.length > 0) {
+          if ("cgi_http" in _yaml["webserv"]
+            && _yaml["webserv"]["cgi_http"].type.string
+            && _yaml["webserv"]["cgi_http"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_cgi_http = _yaml["webserv"]["cgi_http"].get!string;
+          }
+          // if (_opt_action.*.length > 0) {
+          if ("host" in _yaml["webserv"]
+            && _yaml["webserv"]["host"].type.string
+            && _yaml["webserv"]["host"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_host = _yaml["webserv"]["host"].get!string;
+          }
+          if ("data_root_url" in _yaml["webserv"]
+            && _yaml["webserv"]["data_root_url"].type.string
+            && _yaml["webserv"]["data_root_url"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_data_root_url      = _yaml["webserv"]["data_root_url"].get!string;
+            _struct_composite.conf.w_srv_data_root_url_html =
+              _yaml["webserv"]["data_root_url"].get!string ~ "/"
+              ~ _manifested.src.language ~ "/"
+              ~ "html";
+          } else {
+            _struct_composite.conf.w_srv_data_root_url =  _struct_composite.conf.w_srv_data_root_part;
+            _struct_composite.conf.w_srv_data_root_url_html =
+              _struct_composite.conf.w_srv_data_root_part ~ "/"
+              ~ _manifested.src.language ~ "/"
+              ~ "html";
+          }
+          if ("cgi_host" in _yaml["webserv"]
+            && _yaml["webserv"]["cgi_host"].type.string
+            && _yaml["webserv"]["cgi_host"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_cgi_host = _yaml["webserv"]["cgi_host"].get!string;
+          } else { // composite construct
+            _struct_composite.conf.w_srv_cgi_host = _struct_composite.conf.w_srv_host;
+          }
+          if ("cgi_bin_subpath" in _yaml["webserv"]
+            && _yaml["webserv"]["cgi_bin_subpath"].type.string
+            && _yaml["webserv"]["cgi_bin_subpath"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_cgi_bin_subpath = _yaml["webserv"]["cgi_bin_subpath"].get!string;
+          }
+          if ("cgi_port" in _yaml["webserv"]
+            && _yaml["webserv"]["cgi_port"].type.string
+            && _yaml["webserv"]["cgi_port"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_cgi_port = _yaml["webserv"]["cgi_port"].get!string;
+          }
+          if ("cgi_user" in _yaml["webserv"]
+            && _yaml["webserv"]["cgi_user"].type.string
+            && _yaml["webserv"]["cgi_user"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_cgi_user = _yaml["webserv"]["cgi_user"].get!string;
+          }
+          if ("cgi_bin_url" in _yaml["webserv"]
+            && _yaml["webserv"]["cgi_bin_url"].type.string
+            && _yaml["webserv"]["cgi_bin_url"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.w_srv_cgi_bin_url = _yaml["webserv"]["cgi_bin_url"].get!string;
+          } else {
+            _struct_composite.conf.w_srv_cgi_bin_url =
+              (_struct_composite.conf.w_srv_cgi_http.empty)
+                ? _struct_composite.conf.w_srv_http
+                :_struct_composite.conf.w_srv_cgi_http
+              ~ "://"
+              ~ (_struct_composite.conf.w_srv_cgi_host.empty)
+                ? _struct_composite.conf.w_srv_cgi_host
+                : _struct_composite.conf.w_srv_host
+              ~ _struct_composite.conf.w_srv_cgi_bin_subpath;
+          }
+          // if ("cgi_file_links" in _yaml["webserv"]
+          //   && _yaml["webserv"]["cgi_file_links"].type.string
+          //   && _yaml["webserv"]["cgi_file_links"].tag.match(rgx.yaml_tag_is_str)
+          // ) {
+          //   _struct_composite.conf.w_srv_cgi_file_links = _yaml["webserv"]["cgi_file_links"].get!string;
+          // }
       }
-    }
-    if ("processing" in _yaml
-      && _yaml["processing"].type.sequence
-    ) {
-      if (_yaml["processing"].type.mapping
-        && _yaml["processing"].tag.match(rgx.yaml_tag_is_map)
+      // make (in: conf, make, meta)?
+      if ("processing" in _yaml
+        && _yaml["processing"].type.sequence
       ) {
-        if ("concord_max" in _yaml["processing"]
-          && _yaml["processing"]["concord_max"].type.string
-          && _yaml["processing"]["concord_max"].tag.match(rgx.yaml_tag_is_str)
+        if (_yaml["processing"].type.mapping
+          && _yaml["processing"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          _struct_composite.conf.processing_concord_max = _yaml["processing"]["concord_max"].get!string;
+          if ("concord_max" in _yaml["processing"]
+            && _yaml["processing"]["concord_max"].type.string
+            && _yaml["processing"]["concord_max"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.processing_concord_max = _yaml["processing"]["concord_max"].get!string;
+          }
         }
       }
-    }
-    if ("flag" in _yaml
-      && _yaml["flag"].type.sequence
-    ) {
-      if (_yaml["flag"].type.mapping
-        && _yaml["flag"].tag.match(rgx.yaml_tag_is_map)
+      if ("flag" in _yaml
+        && _yaml["flag"].type.sequence
       ) {
-        if ("act0" in _yaml["flag"]
-          && _yaml["flag"]["act0"].type.string
-          && _yaml["flag"]["act0"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act0 = _yaml["flag"]["act0"].get!string;
-        }
-        if ("act1" in _yaml["flag"]
-          && _yaml["flag"]["act1"].type.string
-          && _yaml["flag"]["act1"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act1 = _yaml["flag"]["act1"].get!string;
-        }
-        if ("act2" in _yaml["flag"]
-          && _yaml["flag"]["act2"].type.string
-          && _yaml["flag"]["act2"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act2 = _yaml["flag"]["act2"].get!string;
-        }
-        if ("act3" in _yaml["flag"]
-          && _yaml["flag"]["act3"].type.string
-          && _yaml["flag"]["act3"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act3 = _yaml["flag"]["act3"].get!string;
-        }
-        if ("act4" in _yaml["flag"]
-          && _yaml["flag"]["act4"].type.string
-          && _yaml["flag"]["act4"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act4 = _yaml["flag"]["act4"].get!string;
-        }
-        if ("act5" in _yaml["flag"]
-          && _yaml["flag"]["act5"].type.string
-          && _yaml["flag"]["act5"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act5 = _yaml["flag"]["act5"].get!string;
-        }
-        if ("act6" in _yaml["flag"]
-          && _yaml["flag"]["act6"].type.string
-          && _yaml["flag"]["act6"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act6 = _yaml["flag"]["act6"].get!string;
-        }
-        if ("act7" in _yaml["flag"]
-          && _yaml["flag"]["act7"].type.string
-          && _yaml["flag"]["act7"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act7 = _yaml["flag"]["act7"].get!string;
-        }
-        if ("act8" in _yaml["flag"]
-          && _yaml["flag"]["act8"].type.string
-          && _yaml["flag"]["act8"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.conf.flag_act8 = _yaml["flag"]["act8"].get!string;
-        }
-        if ("act9" in _yaml["flag"]
-          && _yaml["flag"]["act9"].type.string
-          && _yaml["flag"]["act9"].tag.match(rgx.yaml_tag_is_str)
+        if (_yaml["flag"].type.mapping
+          && _yaml["flag"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          _struct_composite.conf.flag_act9 = _yaml["flag"]["act9"].get!string;
+          if ("act0" in _yaml["flag"]
+            && _yaml["flag"]["act0"].type.string
+            && _yaml["flag"]["act0"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act0 = _yaml["flag"]["act0"].get!string;
+          }
+          if ("act1" in _yaml["flag"]
+            && _yaml["flag"]["act1"].type.string
+            && _yaml["flag"]["act1"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act1 = _yaml["flag"]["act1"].get!string;
+          }
+          if ("act2" in _yaml["flag"]
+            && _yaml["flag"]["act2"].type.string
+            && _yaml["flag"]["act2"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act2 = _yaml["flag"]["act2"].get!string;
+          }
+          if ("act3" in _yaml["flag"]
+            && _yaml["flag"]["act3"].type.string
+            && _yaml["flag"]["act3"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act3 = _yaml["flag"]["act3"].get!string;
+          }
+          if ("act4" in _yaml["flag"]
+            && _yaml["flag"]["act4"].type.string
+            && _yaml["flag"]["act4"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act4 = _yaml["flag"]["act4"].get!string;
+          }
+          if ("act5" in _yaml["flag"]
+            && _yaml["flag"]["act5"].type.string
+            && _yaml["flag"]["act5"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act5 = _yaml["flag"]["act5"].get!string;
+          }
+          if ("act6" in _yaml["flag"]
+            && _yaml["flag"]["act6"].type.string
+            && _yaml["flag"]["act6"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act6 = _yaml["flag"]["act6"].get!string;
+          }
+          if ("act7" in _yaml["flag"]
+            && _yaml["flag"]["act7"].type.string
+            && _yaml["flag"]["act7"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act7 = _yaml["flag"]["act7"].get!string;
+          }
+          if ("act8" in _yaml["flag"]
+            && _yaml["flag"]["act8"].type.string
+            && _yaml["flag"]["act8"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act8 = _yaml["flag"]["act8"].get!string;
+          }
+          if ("act9" in _yaml["flag"]
+            && _yaml["flag"]["act9"].type.string
+            && _yaml["flag"]["act9"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.conf.flag_act9 = _yaml["flag"]["act9"].get!string;
+          }
         }
       }
-    }
-    string[] selected_papersize(string _sizes_str) {
-      string[] _sizes = _sizes_str.split(regex(r"\s*,\s*"));
-      string[] _selected_sizes;
-      foreach (_size; _sizes) {
-        switch (_size) {
-          case "a4":
-            _selected_sizes ~= "a4.portrait";
-            _selected_sizes ~= "a4.landscape";
-            break;
-          case "a4.portrait":
-            _selected_sizes ~= _size;
-            break;
-          case "a4.landscape":
-            _selected_sizes ~= _size;
-            break;
-          case "a5":
-            _selected_sizes ~= "a5.portrait";
-            _selected_sizes ~= "a5.landscape";
-            break;
-          case "a5.portrait":
-            _selected_sizes ~= _size;
-            break;
-          case "a5.landscape":
-            _selected_sizes ~= _size;
-            break;
-          case "b4":
-            _selected_sizes ~= "b4.portrait";
-            _selected_sizes ~= "b4.landscape";
-            break;
-          case "b4.portrait":
-            _selected_sizes ~= _size;
-            break;
-          case "b4.landscape":
-            _selected_sizes ~= _size;
-            break;
-          case "letter":
-            _selected_sizes ~= "letter.portrait";
-            _selected_sizes ~= "letter.landscape";
-            break;
-          case "letter.portrait":
-            _selected_sizes ~= _size;
-            break;
-          case "letter.landscape":
-            _selected_sizes ~= _size;
-            break;
-          case "legal":
-            _selected_sizes ~= "legal.portrait";
-            _selected_sizes ~= "legal.landscape";
-            break;
-          case "legal.portrait":
-            _selected_sizes ~= _size;
-            break;
-          case "legal.landscape":
-            _selected_sizes ~= _size;
-            break;
-          default: break;
+      string[] selected_papersize(string _sizes_str) {
+        string[] _sizes = _sizes_str.split(regex(r"\s*,\s*"));
+        string[] _selected_sizes;
+        foreach (_size; _sizes) {
+          switch (_size) {
+            case "a4":
+              _selected_sizes ~= "a4.portrait";
+              _selected_sizes ~= "a4.landscape";
+              break;
+            case "a4.portrait":
+              _selected_sizes ~= _size;
+              break;
+            case "a4.landscape":
+              _selected_sizes ~= _size;
+              break;
+            case "a5":
+              _selected_sizes ~= "a5.portrait";
+              _selected_sizes ~= "a5.landscape";
+              break;
+            case "a5.portrait":
+              _selected_sizes ~= _size;
+              break;
+            case "a5.landscape":
+              _selected_sizes ~= _size;
+              break;
+            case "b4":
+              _selected_sizes ~= "b4.portrait";
+              _selected_sizes ~= "b4.landscape";
+              break;
+            case "b4.portrait":
+              _selected_sizes ~= _size;
+              break;
+            case "b4.landscape":
+              _selected_sizes ~= _size;
+              break;
+            case "letter":
+              _selected_sizes ~= "letter.portrait";
+              _selected_sizes ~= "letter.landscape";
+              break;
+            case "letter.portrait":
+              _selected_sizes ~= _size;
+              break;
+            case "letter.landscape":
+              _selected_sizes ~= _size;
+              break;
+            case "legal":
+              _selected_sizes ~= "legal.portrait";
+              _selected_sizes ~= "legal.landscape";
+              break;
+            case "legal.portrait":
+              _selected_sizes ~= _size;
+              break;
+            case "legal.landscape":
+              _selected_sizes ~= _size;
+              break;
+            default: break;
+          }
         }
+        return _selected_sizes;
       }
-      return _selected_sizes;
-    }
-    if (_opt_action.latex_papersize.length > 0) {
-      _struct_composite.conf.set_papersize = selected_papersize(_opt_action.latex_papersize);
-    } else if (
-      "default" in _yaml
-      && _yaml["default"].type.sequence
-      && _yaml["default"].type.mapping
-      && _yaml["default"].tag.match(rgx.yaml_tag_is_map)
-    ) {
-      if ("papersize" in _yaml["default"]
-        && _yaml["default"]["papersize"].type.string
-        && _yaml["default"]["papersize"].tag.match(rgx.yaml_tag_is_str)
-      ) {
-        _struct_composite.conf.set_papersize = selected_papersize(_yaml["default"]["papersize"].get!string);
-      }
-    }
-    if (_struct_composite.conf.set_papersize.length == 0) {
-      _struct_composite.conf.set_papersize = ["a4.portrait", "a4.landscape"];
-    }
-    if (
-      "default" in _yaml
-      && _yaml["default"].type.sequence
-      && _yaml["default"].type.mapping
-      && _yaml["default"].tag.match(rgx.yaml_tag_is_map)
-    ) {
-      if ("text_wrap" in _yaml["default"]
-        && _yaml["default"]["text_wrap"].type.string
-        && _yaml["default"]["text_wrap"].tag.match(rgx.yaml_tag_is_str)
-      ) {
-        _struct_composite.conf.set_text_wrap = _yaml["default"]["text_wrap"].get!string;
-      }
-      if ("emphasis" in _yaml["default"]
-        && _yaml["default"]["emphasis"].type.string
-        && _yaml["default"]["emphasis"].tag.match(rgx.yaml_tag_is_str)
+      if (_opt_action.latex_papersize.length > 0) {
+        _struct_composite.conf.set_papersize = selected_papersize(_opt_action.latex_papersize);
+      } else if (
+        "default" in _yaml
+        && _yaml["default"].type.sequence
+        && _yaml["default"].type.mapping
+        && _yaml["default"].tag.match(rgx.yaml_tag_is_map)
       ) {
-        _struct_composite.conf.set_emphasis = _yaml["default"]["emphasis"].get!string;
-      }
-      if ("language" in _yaml["default"]
-        && _yaml["default"]["language"].type.string
-        && _yaml["default"]["language"].tag.match(rgx.yaml_tag_is_str)
-      ) {
-        _struct_composite.conf.set_language = _yaml["default"]["language"].get!string;
+        if ("papersize" in _yaml["default"]
+          && _yaml["default"]["papersize"].type.string
+          && _yaml["default"]["papersize"].tag.match(rgx.yaml_tag_is_str)
+        ) {
+          _struct_composite.conf.set_papersize = selected_papersize(_yaml["default"]["papersize"].get!string);
+        }
       }
-      if ("digest" in _yaml["default"]
-        && _yaml["default"]["digest"].type.string
-        && _yaml["default"]["digest"].tag.match(rgx.yaml_tag_is_str)
-      ) {
-        _struct_composite.conf.set_digest = _yaml["default"]["digest"].get!string;
+      if (_struct_composite.conf.set_papersize.length == 0) {
+        _struct_composite.conf.set_papersize = ["a4.portrait", "a4.landscape"];
       }
-    }
-    if ("search" in _yaml
-      && _yaml["search"].type.sequence
-    ) {
-      if (_yaml["search"].type.mapping
-        && _yaml["search"].tag.match(rgx.yaml_tag_is_map)
+      if (
+        "default" in _yaml
+        && _yaml["default"].type.sequence
+        && _yaml["default"].type.mapping
+        && _yaml["default"].tag.match(rgx.yaml_tag_is_map)
       ) {
-        if ("flag" in _yaml["search"]
-          && _yaml["search"]["flag"].type.string
-          && _yaml["search"]["flag"].tag.match(rgx.yaml_tag_is_str)
+        if ("text_wrap" in _yaml["default"]
+          && _yaml["default"]["text_wrap"].type.string
+          && _yaml["default"]["text_wrap"].tag.match(rgx.yaml_tag_is_str)
         ) {
-          _struct_composite.conf.search_flag = _yaml["search"]["flag"].get!string;
+          _struct_composite.conf.set_text_wrap = _yaml["default"]["text_wrap"].get!string;
         }
-        if ("action" in _yaml["search"]
-          && _yaml["search"]["action"].type.string
-          && _yaml["search"]["action"].tag.match(rgx.yaml_tag_is_str)
+        if ("emphasis" in _yaml["default"]
+          && _yaml["default"]["emphasis"].type.string
+          && _yaml["default"]["emphasis"].tag.match(rgx.yaml_tag_is_str)
         ) {
-          _struct_composite.conf.search_action = _yaml["search"]["action"].get!string;
+          _struct_composite.conf.set_emphasis = _yaml["default"]["emphasis"].get!string;
         }
-        if ("db" in _yaml["search"]
-          && _yaml["search"]["db"].type.string
-          && _yaml["search"]["db"].tag.match(rgx.yaml_tag_is_str)
+        if ("language" in _yaml["default"]
+          && _yaml["default"]["language"].type.string
+          && _yaml["default"]["language"].tag.match(rgx.yaml_tag_is_str)
         ) {
-          _struct_composite.conf.search_db = _yaml["search"]["db"].get!string;
+          _struct_composite.conf.set_language = _yaml["default"]["language"].get!string;
         }
-        if ("title" in _yaml["search"]
-          && _yaml["search"]["title"].type.string
-          && _yaml["search"]["title"].tag.match(rgx.yaml_tag_is_str)
+        if ("digest" in _yaml["default"]
+          && _yaml["default"]["digest"].type.string
+          && _yaml["default"]["digest"].tag.match(rgx.yaml_tag_is_str)
         ) {
-          _struct_composite.conf.search_title = _yaml["search"]["title"].get!string;
+          _struct_composite.conf.set_digest = _yaml["default"]["digest"].get!string;
         }
       }
-    }
-    /+ meta ------------------------------------------------------------------- +/
-    if (_struct_composite.meta.creator_author.empty) {
-      if ("creator" in _yaml
-        && _yaml["creator"].type.sequence
+      if ("search" in _yaml
+        && _yaml["search"].type.sequence
       ) {
-        if (_yaml["creator"].type.mapping
-          && _yaml["creator"].tag.match(rgx.yaml_tag_is_map)
+        if (_yaml["search"].type.mapping
+          && _yaml["search"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          if ("author" in _yaml["creator"]
-            && _yaml["creator"]["author"].type.string
-            && _yaml["creator"]["author"].tag.match(rgx.yaml_tag_is_str)
+          if ("flag" in _yaml["search"]
+            && _yaml["search"]["flag"].type.string
+            && _yaml["search"]["flag"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.creator_author = _yaml["creator"]["author"].get!string;
+            _struct_composite.conf.search_flag = _yaml["search"]["flag"].get!string;
           }
-          if ("email" in _yaml["creator"]
-            && _yaml["creator"]["email"].type.string
-            && _yaml["creator"]["email"].tag.match(rgx.yaml_tag_is_str)
+          if ("action" in _yaml["search"]
+            && _yaml["search"]["action"].type.string
+            && _yaml["search"]["action"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.creator_author_email = _yaml["creator"]["email"].get!string;
+            _struct_composite.conf.search_action = _yaml["search"]["action"].get!string;
           }
-          if ("illustrator" in _yaml["creator"]
-            && _yaml["creator"]["illustrator"].type.string
-            && _yaml["creator"]["illustrator"].tag.match(rgx.yaml_tag_is_str)
+          if ("db" in _yaml["search"]
+            && _yaml["search"]["db"].type.string
+            && _yaml["search"]["db"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.creator_illustrator = _yaml["creator"]["illustrator"].get!string;
+            _struct_composite.conf.search_db = _yaml["search"]["db"].get!string;
           }
-          if ("translator" in _yaml["creator"]
-            && _yaml["creator"]["translator"].type.string
-            && _yaml["creator"]["translator"].tag.match(rgx.yaml_tag_is_str)
+          if ("title" in _yaml["search"]
+            && _yaml["search"]["title"].type.string
+            && _yaml["search"]["title"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.creator_translator = _yaml["creator"]["translator"].get!string;
+            _struct_composite.conf.search_title = _yaml["search"]["title"].get!string;
           }
-        } else if (_yaml["creator"].type.string
-          && _yaml["creator"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.creator_author = _yaml["creator"].get!string;
-        }
-      }
-      string[] author_arr;
-      string[][string] authors_hash_arr = [ "first" : [], "last" : [], "full" : [], "last_first" : [], "as_input" : [] ];
-      string[] authors_raw_arr
-        = _struct_composite.meta.creator_author.split(rgx.arr_delimiter);
-      auto _lastname = appender!(char[])();
-      foreach (author_raw; authors_raw_arr) {
-        if (auto m = author_raw.match(rgx.raw_author_munge)) {
-          author_arr                   ~= author_raw.replace(rgx.raw_author_munge, "$2 $1");
-          authors_hash_arr["first"]    ~= author_raw.replace(rgx.raw_author_munge, "$2");
-          authors_hash_arr["last"]     ~= author_raw.replace(rgx.raw_author_munge, "$1");
-          authors_hash_arr["full"]     ~= author_raw.replace(rgx.raw_author_munge, "$2 $1");
-          (m.captures[1]).map!toUpper.copy(_lastname);
-          authors_hash_arr["last_first"] ~= _lastname.data.to!string ~ ", " ~ m.captures[2];
-          _lastname = appender!(char[])();
-        } else {
-          author_arr                     ~= author_raw;
-          authors_hash_arr["last"]       ~= author_raw;
-          authors_hash_arr["full"]       ~= author_raw;
-          authors_hash_arr["last_first"] ~= author_raw;
         }
-        authors_hash_arr["as_input"] ~= author_raw;
       }
-      _struct_composite.meta.creator_author_arr = author_arr;
-      _struct_composite.meta.creator_author     = author_arr.join(", ").chomp.chomp;
-      _struct_composite.meta.creator_author_surname = (authors_hash_arr["last"].length > 0) ? authors_hash_arr["last"][0] : "";
-      string _author_name_last_first = authors_hash_arr["last_first"].join("; ").chomp.chomp;
-      _struct_composite.meta.creator_author_surname_fn = (_author_name_last_first.length > 0)
-      ? _author_name_last_first
-      : authors_hash_arr["as_input"].join("; ").chomp.chomp;
-    }
-    if (_struct_composite.meta.title_main.empty) {
-      if ("title" in _yaml
-        && _yaml["title"].type.sequence
+    } else {
+      /+ make ------------------------------------------------------------------- +/
+      if ("make" in _yaml
+        && _yaml["make"].type.sequence
       ) {
-        if (_yaml["title"].type.mapping
-          && _yaml["title"].tag.match(rgx.yaml_tag_is_map)
+        if (_yaml["make"].type.mapping
+          && _yaml["make"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          if ("main" in _yaml["title"]
-            && _yaml["title"]["main"].type.string
-            && _yaml["title"]["main"].tag.match(rgx.yaml_tag_is_str)
+          if ("bold" in _yaml["make"]
+            && _yaml["make"]["bold"].type.string
+            && _yaml["make"]["bold"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.title_main = _yaml["title"]["main"].get!string;
-          } else if ("title" in _yaml["title"]
-            && _yaml["title"]["title"].type.string
-            && _yaml["title"]["title"].tag.match(rgx.yaml_tag_is_str)
+            _struct_composite.make_str.bold = _yaml["make"]["bold"].get!string;
+          }
+          if ("breaks" in _yaml["make"]
+            && _yaml["make"]["breaks"].type.string
+            && _yaml["make"]["breaks"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.title_main = _yaml["title"]["title"].get!string;
+            _struct_composite.make_str.breaks = _yaml["make"]["breaks"].get!string;
           }
-          if ("edition" in _yaml["title"]
-            && _yaml["title"]["edition"].type.string
-            && _yaml["title"]["edition"].tag.match(rgx.yaml_tag_is_str)
+          if ("cover_image" in _yaml["make"]
+            && _yaml["make"]["cover_image"].type.string
+            && _yaml["make"]["cover_image"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.title_edition = _yaml["title"]["edition"].get!string;
+            _struct_composite.make_str.cover_image = _yaml["make"]["cover_image"].get!string;
           }
-          if ("full" in _yaml["title"]
-            && _yaml["title"]["full"].type.string
-            && _yaml["title"]["full"].tag.match(rgx.yaml_tag_is_str)
+          if ("css" in _yaml["make"]
+            && _yaml["make"]["css"].type.string
+            && _yaml["make"]["css"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.title_full = _yaml["title"]["full"].get!string;
+            _struct_composite.make_str.css = _yaml["make"]["css"].get!string;
           }
-          if ("language" in _yaml["title"]
-            && _yaml["title"]["language"].type.string
-            && _yaml["title"]["language"].tag.match(rgx.yaml_tag_is_str)
+          if ("emphasis" in _yaml["make"]
+            && _yaml["make"]["emphasis"].type.string
+            && _yaml["make"]["emphasis"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.title_language = _yaml["title"]["language"].get!string;
+            _struct_composite.make_str.emphasis = _yaml["make"]["emphasis"].get!string;
           }
-          if ("note" in _yaml["title"]
-            && _yaml["title"]["note"].type.string
-            && _yaml["title"]["note"].tag.match(rgx.yaml_tag_is_str)
+          if ("footer" in _yaml["make"]
+            && _yaml["make"]["footer"].type.string
+            && _yaml["make"]["footer"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.title_note = _yaml["title"]["note"].get!string;
+            char[][] __match_footer_array
+              = (cast(char[]) _yaml["make"]["footer"].get!string)
+                .split(rgx.make_heading_delimiter);
+            _struct_composite.make_str.footer = __match_footer_array.to!(string[]);
           }
-          if ("subtitle" in _yaml["title"]
-            && _yaml["title"]["subtitle"].type.string
-            && _yaml["title"]["subtitle"].tag.match(rgx.yaml_tag_is_str)
+          if ("headings" in _yaml["make"]
+            && _yaml["make"]["headings"].type.string
+            && _yaml["make"]["headings"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            char[][] __match_headings_array
+              = (cast(char[]) _yaml["make"]["headings"].get!string)
+                .split(rgx.make_heading_delimiter);
+            _struct_composite.make_str.headings = __match_headings_array.to!(string[]);
+          } else if ("headings" in _yaml["make"]
+            && _yaml["make"]["headings"].type.string
+            && _yaml["make"]["headings"].tag.match(rgx.yaml_tag_is_seq)
           ) {
-            _struct_composite.meta.title_subtitle = _yaml["title"]["subtitle"].get!string;
-          } else if ("sub" in _yaml["title"]
-            && _yaml["title"]["sub"].type.string
-            && _yaml["title"]["sub"].tag.match(rgx.yaml_tag_is_str)
+            foreach(string identify_heading_level; _yaml["make"]["headings"]) {
+              _struct_composite.make_str.headings ~= identify_heading_level;
+            }
+          }
+          if ("home_button_image" in _yaml["make"]
+            && _yaml["make"]["home_button_image"].type.string
+            && _yaml["make"]["home_button_image"].tag.match(rgx.yaml_tag_is_str)
           ) {
-            _struct_composite.meta.title_subtitle = _yaml["title"]["sub"].get!string;
+            char[][] __match_home_button_image_array
+              = (cast(char[]) _yaml["make"]["home_button_image"].get!string)
+                .split(rgx.make_heading_delimiter);
+            _struct_composite.make_str.home_button_image = __match_home_button_image_array.to!(string[]);
+          }
+          if ("home_button_text" in _yaml["make"]
+            && _yaml["make"]["home_button_text"].type.string
+            && _yaml["make"]["home_button_text"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.make_str.home_button_text = _yaml["make"]["home_button_text"].get!string;
+          } else if ("home_button_text" in _yaml["make"]
+            && _yaml["make"]["home_button_text"].type.string
+            && _yaml["make"]["home_button_text"].tag.match(rgx.yaml_tag_is_seq)
+          ) {
+            _struct_composite.make_str.home_button_text = "";
+            foreach(string hbt; _yaml["make"]["home_button_text"]) {
+              _struct_composite.make_str.home_button_text ~= hbt ~ "; ";
+            }
+          }
+          if ("italics" in _yaml["make"]
+            && _yaml["make"]["italics"].type.string
+            && _yaml["make"]["italics"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.make_str.italics = _yaml["make"]["italics"].get!string;
+          }
+          if ("auto_num_top_at_level" in _yaml["make"]
+            && _yaml["make"]["auto_num_top_at_level"].type.string
+            && _yaml["make"]["auto_num_top_at_level"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.make_str.auto_num_top_at_level = _yaml["make"]["auto_num_top_at_level"].get!string;
+            switch (_yaml["make"]["auto_num_top_at_level"].get!string) {
+            case "A":
+              break;
+            case "B": _struct_composite.make_str.auto_num_top_lv = 1;
+              break;
+            case "C": _struct_composite.make_str.auto_num_top_lv = 2;
+              break;
+            case "D": _struct_composite.make_str.auto_num_top_lv = 3;
+              break;
+            case "1": _struct_composite.make_str.auto_num_top_lv = 4;
+              break;
+            case "2": _struct_composite.make_str.auto_num_top_lv = 5;
+              break;
+            case "3": _struct_composite.make_str.auto_num_top_lv = 6;
+              break;
+            case "4": _struct_composite.make_str.auto_num_top_lv = 7;
+              break;
+            default:
+              break;
+            }
+          }
+          if ("auto_num_depth" in _yaml["make"]
+            && _yaml["make"]["auto_num_depth"].type.string
+            && _yaml["make"]["auto_num_depth"].tag.match(rgx.yaml_tag_is_int)
+          ) { // not sure implemented for documents
+            _struct_composite.make_str.auto_num_depth = _yaml["make"]["auto_num_depth"].get!int;
+          } else if ("auto_num_depth" in _yaml["make"]
+            && _yaml["make"]["auto_num_depth"].type.string
+            && _yaml["make"]["auto_num_depth"].tag.match(rgx.yaml_tag_is_str)
+          ) { // not sure implemented for documents
+            _struct_composite.make_str.auto_num_depth = _yaml["make"]["auto_num_depth"].get!int;
+          }
+          if ("texpdf_font" in _yaml["make"]
+            && _yaml["make"]["texpdf_font"].type.string
+          ) {
+            _struct_composite.make_str.texpdf_font = _yaml["make"]["texpdf_font"].get!string;
           }
-        } else if (
-          _yaml["title"].type.string
-          && _yaml["title"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.title_main = _yaml["title"].get!string;
         }
+        _struct_composite.make.bold                     = _mk.bold(_struct_composite.make_str.bold);
+        _struct_composite.make.breaks                   = _mk.breaks(_struct_composite.make_str.breaks);
+        _struct_composite.make.cover_image              = _mk.cover_image(_struct_composite.make_str.cover_image);
+        _struct_composite.make.css                      = _mk.css(_struct_composite.make_str.css);
+        _struct_composite.make.emphasis                 = _mk.emphasis(_struct_composite.make_str.emphasis);
+        _struct_composite.make.footer                   = _mk.footer(_struct_composite.make_str.footer);
+        _struct_composite.make.headings                 = _mk.headings(_struct_composite.make_str.headings);
+        _struct_composite.make.home_button_image        = _mk.home_button_image(_struct_composite.make_str.home_button_image);
+        _struct_composite.make.home_button_text         = _mk.home_button_text(_struct_composite.make_str.home_button_text);
+        _struct_composite.make.italics                  = _mk.italics(_struct_composite.make_str.italics);
+        _struct_composite.make.auto_num_top_at_level    = _mk.auto_num_top_at_level(_struct_composite.make_str.auto_num_top_at_level);
+        _struct_composite.make.auto_num_top_lv          = _mk.auto_num_top_lv(_struct_composite.make_str.auto_num_top_lv);
+        _struct_composite.make.auto_num_depth           = _mk.auto_num_depth(_struct_composite.make_str.auto_num_depth);
+        _struct_composite.make.substitute               = _mk.substitute(_struct_composite.make_str.substitute);
+        _struct_composite.make.texpdf_font              = _mk.texpdf_font(_struct_composite.make_str.texpdf_font);
       }
-      _struct_composite.meta.title_sub = _struct_composite.meta.title_subtitle;
-      if ((!(_struct_composite.meta.title_subtitle.empty))
-      && (_struct_composite.meta.title_sub.empty)) {
-        _struct_composite.meta.title_sub = _struct_composite.meta.title_subtitle;
-      }
-      _struct_composite.meta.title_full = (_struct_composite.meta.title_subtitle.empty)
-      ? _struct_composite.meta.title_main
-      : format(
-          "%s - %s",
-          _struct_composite.meta.title_main,
-          _struct_composite.meta.title_subtitle,
-        );
-    }
-    if ("classify" in _yaml
-      && _yaml["classify"].type.sequence
-    ) {
-      if (_yaml["classify"].type.mapping
-        && _yaml["classify"].tag.match(rgx.yaml_tag_is_map)
-      ) {
-        if ("dewey" in _yaml["classify"]
-          && _yaml["classify"]["dewey"].type.string
-          && _yaml["classify"]["dewey"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.classify_dewey = _yaml["classify"]["dewey"].get!string;
-        }
-        if ("loc" in _yaml["classify"]
-          && _yaml["classify"]["loc"].type.string
-          && _yaml["classify"]["loc"].tag.match(rgx.yaml_tag_is_str)
+
+      /+ meta ------------------------------------------------------------------- +/
+      if (_struct_composite.meta.creator_author.empty) {
+        if ("creator" in _yaml
+          && _yaml["creator"].type.sequence
         ) {
-          _struct_composite.meta.classify_loc = _yaml["classify"]["loc"].get!string;
+          if (_yaml["creator"].type.mapping
+            && _yaml["creator"].tag.match(rgx.yaml_tag_is_map)
+          ) {
+            if ("author" in _yaml["creator"]
+              && _yaml["creator"]["author"].type.string
+              && _yaml["creator"]["author"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.creator_author = _yaml["creator"]["author"].get!string;
+            }
+            if ("email" in _yaml["creator"]
+              && _yaml["creator"]["email"].type.string
+              && _yaml["creator"]["email"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.creator_author_email = _yaml["creator"]["email"].get!string;
+            }
+            if ("illustrator" in _yaml["creator"]
+              && _yaml["creator"]["illustrator"].type.string
+              && _yaml["creator"]["illustrator"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.creator_illustrator = _yaml["creator"]["illustrator"].get!string;
+            }
+            if ("translator" in _yaml["creator"]
+              && _yaml["creator"]["translator"].type.string
+              && _yaml["creator"]["translator"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.creator_translator = _yaml["creator"]["translator"].get!string;
+            }
+          } else if (_yaml["creator"].type.string
+            && _yaml["creator"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.creator_author = _yaml["creator"].get!string;
+          }
         }
-        if ("keywords" in _yaml["classify"]
-          && _yaml["classify"]["keywords"].type.string
-          && _yaml["classify"]["keywords"].tag.match(rgx.yaml_tag_is_str)
+        string[] author_arr;
+        string[][string] authors_hash_arr = [ "first" : [], "last" : [], "full" : [], "last_first" : [], "as_input" : [] ];
+        string[] authors_raw_arr
+          = _struct_composite.meta.creator_author.split(rgx.arr_delimiter);
+        auto _lastname = appender!(char[])();
+        foreach (author_raw; authors_raw_arr) {
+          if (auto m = author_raw.match(rgx.raw_author_munge)) {
+            author_arr                   ~= author_raw.replace(rgx.raw_author_munge, "$2 $1");
+            authors_hash_arr["first"]    ~= author_raw.replace(rgx.raw_author_munge, "$2");
+            authors_hash_arr["last"]     ~= author_raw.replace(rgx.raw_author_munge, "$1");
+            authors_hash_arr["full"]     ~= author_raw.replace(rgx.raw_author_munge, "$2 $1");
+            (m.captures[1]).map!toUpper.copy(_lastname);
+            authors_hash_arr["last_first"] ~= _lastname.data.to!string ~ ", " ~ m.captures[2];
+            _lastname = appender!(char[])();
+          } else {
+            author_arr                     ~= author_raw;
+            authors_hash_arr["last"]       ~= author_raw;
+            authors_hash_arr["full"]       ~= author_raw;
+            authors_hash_arr["last_first"] ~= author_raw;
+          }
+          authors_hash_arr["as_input"] ~= author_raw;
+        }
+        _struct_composite.meta.creator_author_arr = author_arr;
+        _struct_composite.meta.creator_author     = author_arr.join(", ").chomp.chomp;
+        _struct_composite.meta.creator_author_surname = (authors_hash_arr["last"].length > 0) ? authors_hash_arr["last"][0] : "";
+        string _author_name_last_first = authors_hash_arr["last_first"].join("; ").chomp.chomp;
+        _struct_composite.meta.creator_author_surname_fn = (_author_name_last_first.length > 0)
+        ? _author_name_last_first
+        : authors_hash_arr["as_input"].join("; ").chomp.chomp;
+      }
+      if (_struct_composite.meta.title_main.empty) {
+        if ("title" in _yaml
+          && _yaml["title"].type.sequence
         ) {
-          _struct_composite.meta.classify_keywords = _yaml["classify"]["keywords"].get!string;
+          if (_yaml["title"].type.mapping
+            && _yaml["title"].tag.match(rgx.yaml_tag_is_map)
+          ) {
+            if ("main" in _yaml["title"]
+              && _yaml["title"]["main"].type.string
+              && _yaml["title"]["main"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_main = _yaml["title"]["main"].get!string;
+            } else if ("title" in _yaml["title"]
+              && _yaml["title"]["title"].type.string
+              && _yaml["title"]["title"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_main = _yaml["title"]["title"].get!string;
+            }
+            if ("edition" in _yaml["title"]
+              && _yaml["title"]["edition"].type.string
+              && _yaml["title"]["edition"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_edition = _yaml["title"]["edition"].get!string;
+            }
+            if ("full" in _yaml["title"]
+              && _yaml["title"]["full"].type.string
+              && _yaml["title"]["full"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_full = _yaml["title"]["full"].get!string;
+            }
+            if ("language" in _yaml["title"]
+              && _yaml["title"]["language"].type.string
+              && _yaml["title"]["language"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_language = _yaml["title"]["language"].get!string;
+            }
+            if ("note" in _yaml["title"]
+              && _yaml["title"]["note"].type.string
+              && _yaml["title"]["note"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_note = _yaml["title"]["note"].get!string;
+            }
+            if ("subtitle" in _yaml["title"]
+              && _yaml["title"]["subtitle"].type.string
+              && _yaml["title"]["subtitle"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_subtitle = _yaml["title"]["subtitle"].get!string;
+            } else if ("sub" in _yaml["title"]
+              && _yaml["title"]["sub"].type.string
+              && _yaml["title"]["sub"].tag.match(rgx.yaml_tag_is_str)
+            ) {
+              _struct_composite.meta.title_subtitle = _yaml["title"]["sub"].get!string;
+            }
+          } else if (
+            _yaml["title"].type.string
+            && _yaml["title"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.title_main = _yaml["title"].get!string;
+          }
         }
-        if ("topic_register" in _yaml["classify"]
-          && _yaml["classify"]["topic_register"].type.string
-          && _yaml["classify"]["topic_register"].tag.match(rgx.yaml_tag_is_str)
+        _struct_composite.meta.title_sub = _struct_composite.meta.title_subtitle;
+        if ((!(_struct_composite.meta.title_subtitle.empty))
+        && (_struct_composite.meta.title_sub.empty)) {
+          _struct_composite.meta.title_sub = _struct_composite.meta.title_subtitle;
+        }
+        _struct_composite.meta.title_full = (_struct_composite.meta.title_subtitle.empty)
+        ? _struct_composite.meta.title_main
+        : format(
+            "%s - %s",
+            _struct_composite.meta.title_main,
+            _struct_composite.meta.title_subtitle,
+          );
+      }
+      if ("classify" in _yaml
+        && _yaml["classify"].type.sequence
+      ) {
+        if (_yaml["classify"].type.mapping
+          && _yaml["classify"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          _struct_composite.meta.classify_topic_register = _yaml["classify"]["topic_register"].get!string;
-          string[] main_topics_ = _struct_composite.meta.classify_topic_register.strip.split(rgx.topic_register_main_terms_split);
-          string[] topics;
-          string   topics_tmp;
-          string[] multiple_sub_terms;
-          foreach (mt; main_topics_) {
-            topics_tmp = mt.replaceAll(rgx.topic_register_main_term_plus_rest_split,    mkup.sep);
-            if (auto m = topics_tmp.match(rgx.topic_register_multiple_sub_terms_split)) {
-              multiple_sub_terms = m.captures[1].split(rgx.topic_register_sub_terms_split);
-              foreach (subterm; multiple_sub_terms) {
-                topics ~= m.captures.pre ~ mkup.sep ~ subterm;
+          if ("dewey" in _yaml["classify"]
+            && _yaml["classify"]["dewey"].type.string
+            && _yaml["classify"]["dewey"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.classify_dewey = _yaml["classify"]["dewey"].get!string;
+          }
+          if ("loc" in _yaml["classify"]
+            && _yaml["classify"]["loc"].type.string
+            && _yaml["classify"]["loc"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.classify_loc = _yaml["classify"]["loc"].get!string;
+          }
+          if ("keywords" in _yaml["classify"]
+            && _yaml["classify"]["keywords"].type.string
+            && _yaml["classify"]["keywords"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.classify_keywords = _yaml["classify"]["keywords"].get!string;
+          }
+          if ("topic_register" in _yaml["classify"]
+            && _yaml["classify"]["topic_register"].type.string
+            && _yaml["classify"]["topic_register"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.classify_topic_register = _yaml["classify"]["topic_register"].get!string;
+            string[] main_topics_ = _struct_composite.meta.classify_topic_register.strip.split(rgx.topic_register_main_terms_split);
+            string[] topics;
+            string   topics_tmp;
+            string[] multiple_sub_terms;
+            foreach (mt; main_topics_) {
+              topics_tmp = mt.replaceAll(rgx.topic_register_main_term_plus_rest_split,    mkup.sep);
+              if (auto m = topics_tmp.match(rgx.topic_register_multiple_sub_terms_split)) {
+                multiple_sub_terms = m.captures[1].split(rgx.topic_register_sub_terms_split);
+                foreach (subterm; multiple_sub_terms) {
+                  topics ~= m.captures.pre ~ mkup.sep ~ subterm;
+                }
+              } else {
+                topics ~= topics_tmp;
               }
-            } else {
-              topics ~= topics_tmp;
             }
+            // writeln("--> ", topics);
+            _struct_composite.meta.classify_topic_register_arr = topics;
           }
-          // writeln("--> ", topics);
-          _struct_composite.meta.classify_topic_register_arr = topics;
         }
       }
-    }
-    if ("date" in _yaml
-      && _yaml["date"].type.sequence
-    ) {
-      if (_yaml["date"].type.mapping
-        && _yaml["date"].tag.match(rgx.yaml_tag_is_map)
+      if ("date" in _yaml
+        && _yaml["date"].type.sequence
       ) {
-        if ("added_to_site" in _yaml["date"]
-          && _yaml["date"]["added_to_site"].type.string
-          && _yaml["date"]["added_to_site"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.date_added_to_site = _yaml["date"]["added_to_site"].get!string;
-        }
-        if ("available" in _yaml["date"]
-          && _yaml["date"]["available"].type.string
-          && _yaml["date"]["available"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.date_available = _yaml["date"]["available"].get!string;
-        }
-        if ("created" in _yaml["date"]
-          && _yaml["date"]["created"].type.string
-          && _yaml["date"]["created"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.date_created = _yaml["date"]["created"].get!string;
-        }
-        if ("issued" in _yaml["date"]
-          && _yaml["date"]["issued"].type.string
-          && _yaml["date"]["issued"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.date_issued = _yaml["date"]["issued"].get!string;
-        }
-        if ("modified" in _yaml["date"]
-          && _yaml["date"]["modified"].type.string
-          && _yaml["date"]["modified"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.date_modified = _yaml["date"]["modified"].get!string;
-        }
-        if ("published" in _yaml["date"]
-          && _yaml["date"]["published"].type.string
-          && _yaml["date"]["published"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.date_published = _yaml["date"]["published"].get!string;
-        }
-        if ("valid" in _yaml["date"]
-          && _yaml["date"]["valid"].type.string
-          && _yaml["date"]["valid"].tag.match(rgx.yaml_tag_is_str)
+        if (_yaml["date"].type.mapping
+          && _yaml["date"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          _struct_composite.meta.date_valid = _yaml["date"]["valid"].get!string;
+          if ("added_to_site" in _yaml["date"]
+            && _yaml["date"]["added_to_site"].type.string
+            && _yaml["date"]["added_to_site"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.date_added_to_site = _yaml["date"]["added_to_site"].get!string;
+          }
+          if ("available" in _yaml["date"]
+            && _yaml["date"]["available"].type.string
+            && _yaml["date"]["available"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.date_available = _yaml["date"]["available"].get!string;
+          }
+          if ("created" in _yaml["date"]
+            && _yaml["date"]["created"].type.string
+            && _yaml["date"]["created"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.date_created = _yaml["date"]["created"].get!string;
+          }
+          if ("issued" in _yaml["date"]
+            && _yaml["date"]["issued"].type.string
+            && _yaml["date"]["issued"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.date_issued = _yaml["date"]["issued"].get!string;
+          }
+          if ("modified" in _yaml["date"]
+            && _yaml["date"]["modified"].type.string
+            && _yaml["date"]["modified"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.date_modified = _yaml["date"]["modified"].get!string;
+          }
+          if ("published" in _yaml["date"]
+            && _yaml["date"]["published"].type.string
+            && _yaml["date"]["published"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.date_published = _yaml["date"]["published"].get!string;
+          }
+          if ("valid" in _yaml["date"]
+            && _yaml["date"]["valid"].type.string
+            && _yaml["date"]["valid"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.date_valid = _yaml["date"]["valid"].get!string;
+          }
         }
       }
-    }
-    _struct_composite.meta.language_document_char = _manifested.src.language; // move
-    if ("links" in _yaml) {
-      // if ("" in _yaml["links"]) {
-      //   _struct_composite.meta.links_ = _yaml["links"][""].str;
-      // }
-    }
-    if ("notes" in _yaml
-      && _yaml["notes"].type.sequence
-    ) {
-      if (_yaml["notes"].type.mapping
-        && _yaml["notes"].tag.match(rgx.yaml_tag_is_map)
+      _struct_composite.meta.language_document_char = _manifested.src.language; // move
+      if ("links" in _yaml) {
+        // if ("" in _yaml["links"]) {
+        //   _struct_composite.meta.links_ = _yaml["links"][""].str;
+        // }
+      }
+      if ("notes" in _yaml
+        && _yaml["notes"].type.sequence
       ) {
-        if ("abstract" in _yaml["notes"]
-          && _yaml["notes"]["abstract"].type.string
-          && _yaml["notes"]["abstract"].tag.match(rgx.yaml_tag_is_str)
+        if (_yaml["notes"].type.mapping
+          && _yaml["notes"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          _struct_composite.meta.notes_abstract = _yaml["notes"]["abstract"].get!string;
-        }
-        if ("description" in _yaml["notes"]
-          && _yaml["notes"]["description"].type.string
-          && _yaml["notes"]["description"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.notes_description = _yaml["notes"]["description"].get!string;
-        }
-        if ("summary" in _yaml["notes"]
-          && _yaml["notes"]["summary"].type.string
-          && _yaml["notes"]["summary"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.notes_summary = _yaml["notes"]["summary"].get!string;
+          if ("abstract" in _yaml["notes"]
+            && _yaml["notes"]["abstract"].type.string
+            && _yaml["notes"]["abstract"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.notes_abstract = _yaml["notes"]["abstract"].get!string;
+          }
+          if ("description" in _yaml["notes"]
+            && _yaml["notes"]["description"].type.string
+            && _yaml["notes"]["description"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.notes_description = _yaml["notes"]["description"].get!string;
+          }
+          if ("summary" in _yaml["notes"]
+            && _yaml["notes"]["summary"].type.string
+            && _yaml["notes"]["summary"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.notes_summary = _yaml["notes"]["summary"].get!string;
+          }
         }
       }
-    }
-    if ("original" in _yaml
-      && _yaml["original"].type.sequence
-    ) {
-      if (_yaml["original"].type.mapping
-        && _yaml["original"].tag.match(rgx.yaml_tag_is_map)
+      if ("original" in _yaml
+        && _yaml["original"].type.sequence
       ) {
-        if ("language" in _yaml["original"]
-          && _yaml["original"]["language"].type.string
-          && _yaml["original"]["language"].tag.match(rgx.yaml_tag_is_str)
+        if (_yaml["original"].type.mapping
+          && _yaml["original"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          _struct_composite.meta.original_language = _yaml["original"]["language"].get!string;
-        }
-        if ("language_char" in _yaml["original"]
-          && _yaml["original"]["language_char"].type.string
-          && _yaml["original"]["language_char"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.original_language_char = _yaml["original"]["language_char"].get!string;
-        }
-        if ("source" in _yaml["original"]
-          && _yaml["original"]["source"].type.string
-          && _yaml["original"]["source"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.original_source = _yaml["original"]["source"].get!string;
-        }
-        if ("title" in _yaml["original"]
-          && _yaml["original"]["title"].type.string
-          && _yaml["original"]["title"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.original_title = _yaml["original"]["title"].get!string;
+          if ("language" in _yaml["original"]
+            && _yaml["original"]["language"].type.string
+            && _yaml["original"]["language"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.original_language = _yaml["original"]["language"].get!string;
+          }
+          if ("language_char" in _yaml["original"]
+            && _yaml["original"]["language_char"].type.string
+            && _yaml["original"]["language_char"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.original_language_char = _yaml["original"]["language_char"].get!string;
+          }
+          if ("source" in _yaml["original"]
+            && _yaml["original"]["source"].type.string
+            && _yaml["original"]["source"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.original_source = _yaml["original"]["source"].get!string;
+          }
+          if ("title" in _yaml["original"]
+            && _yaml["original"]["title"].type.string
+            && _yaml["original"]["title"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.original_title = _yaml["original"]["title"].get!string;
+          }
         }
       }
-    }
-    if ("publisher" in _yaml) {
-      // if ("" in _yaml["publisher"]) {
-      //   _struct_composite.meta.publisher = _yaml["publisher"][""].str;
-      // }
-    }
-    if ("rights" in _yaml
-      && _yaml["rights"].type.sequence
-    ) {
-      if (_yaml["rights"].type.mapping
-        && _yaml["rights"].tag.match(rgx.yaml_tag_is_map)
+      if ("publisher" in _yaml) {
+        // if ("" in _yaml["publisher"]) {
+        //   _struct_composite.meta.publisher = _yaml["publisher"][""].str;
+        // }
+      }
+      if ("rights" in _yaml
+        && _yaml["rights"].type.sequence
       ) {
-        if ("copyright" in _yaml["rights"]
-          && _yaml["rights"]["copyright"].type.string
-          && _yaml["rights"]["copyright"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_copyright = _yaml["rights"]["copyright"].get!string;
-        }
-        if ("copyright_text" in _yaml["rights"]
-          && _yaml["rights"]["copyright_text"].type.string
-          && _yaml["rights"]["copyright_text"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_copyright_text = _yaml["rights"]["copyright_text"].get!string;
-        }
-        if ("copyright_audio" in _yaml["rights"]
-          && _yaml["rights"]["copyright_audio"].type.string
-          && _yaml["rights"]["copyright_audio"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_copyright_audio = _yaml["rights"]["copyright_audio"].get!string;
-        }
-        if ("copyright_cover" in _yaml["rights"]
-          && _yaml["rights"]["copyright_cover"].type.string
-          && _yaml["rights"]["copyright_cover"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_copyright_cover = _yaml["rights"]["copyright_cover"].get!string;
-        }
-        if ("copyright_illustrations" in _yaml["rights"]
-          && _yaml["rights"]["copyright_illustrations"].type.string
-          && _yaml["rights"]["copyright_illustrations"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_copyright_illustrations = _yaml["rights"]["copyright_illustrations"].get!string;
-        }
-        if ("copyright_photographs" in _yaml["rights"]
-          && _yaml["rights"]["copyright_photographs"].type.string
-          && _yaml["rights"]["copyright_photographs"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_copyright_photographs = _yaml["rights"]["copyright_photographs"].get!string;
-        }
-        if ("copyright_translation" in _yaml["rights"]
-          && _yaml["rights"]["copyright_translation"].type.string
-          && _yaml["rights"]["copyright_translation"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_copyright_translation = _yaml["rights"]["copyright_translation"].get!string;
-        }
-        if ("copyright_video" in _yaml["rights"]
-          && _yaml["rights"]["copyright_video"].type.string
-          && _yaml["rights"]["copyright_video"].tag.match(rgx.yaml_tag_is_str)
+        if (_yaml["rights"].type.mapping
+          && _yaml["rights"].tag.match(rgx.yaml_tag_is_map)
         ) {
-          _struct_composite.meta.rights_copyright_video = _yaml["rights"]["copyright_video"].get!string;
-        }
-        if ("license" in _yaml["rights"]
-          && _yaml["rights"]["license"].type.string
-          && _yaml["rights"]["license"].tag.match(rgx.yaml_tag_is_str)
-        ) {
-          _struct_composite.meta.rights_license = _yaml["rights"]["license"].get!string;
+          if ("copyright" in _yaml["rights"]
+            && _yaml["rights"]["copyright"].type.string
+            && _yaml["rights"]["copyright"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright = _yaml["rights"]["copyright"].get!string;
+          }
+          if ("copyright_text" in _yaml["rights"]
+            && _yaml["rights"]["copyright_text"].type.string
+            && _yaml["rights"]["copyright_text"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright_text = _yaml["rights"]["copyright_text"].get!string;
+          }
+          if ("copyright_audio" in _yaml["rights"]
+            && _yaml["rights"]["copyright_audio"].type.string
+            && _yaml["rights"]["copyright_audio"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright_audio = _yaml["rights"]["copyright_audio"].get!string;
+          }
+          if ("copyright_cover" in _yaml["rights"]
+            && _yaml["rights"]["copyright_cover"].type.string
+            && _yaml["rights"]["copyright_cover"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright_cover = _yaml["rights"]["copyright_cover"].get!string;
+          }
+          if ("copyright_illustrations" in _yaml["rights"]
+            && _yaml["rights"]["copyright_illustrations"].type.string
+            && _yaml["rights"]["copyright_illustrations"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright_illustrations = _yaml["rights"]["copyright_illustrations"].get!string;
+          }
+          if ("copyright_photographs" in _yaml["rights"]
+            && _yaml["rights"]["copyright_photographs"].type.string
+            && _yaml["rights"]["copyright_photographs"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright_photographs = _yaml["rights"]["copyright_photographs"].get!string;
+          }
+          if ("copyright_translation" in _yaml["rights"]
+            && _yaml["rights"]["copyright_translation"].type.string
+            && _yaml["rights"]["copyright_translation"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright_translation = _yaml["rights"]["copyright_translation"].get!string;
+          }
+          if ("copyright_video" in _yaml["rights"]
+            && _yaml["rights"]["copyright_video"].type.string
+            && _yaml["rights"]["copyright_video"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_copyright_video = _yaml["rights"]["copyright_video"].get!string;
+          }
+          if ("license" in _yaml["rights"]
+            && _yaml["rights"]["license"].type.string
+            && _yaml["rights"]["license"].tag.match(rgx.yaml_tag_is_str)
+          ) {
+            _struct_composite.meta.rights_license = _yaml["rights"]["license"].get!string;
+          }
         }
       }
     }
@@ -1108,11 +1218,12 @@ template configParseYAMLreturnSpineStruct() {
     doc_reform.meta.conf_make_meta_structs,
     doc_reform.meta.conf_make_meta_json;
   mixin contentYAMLtoSpineStruct;
-  @system auto configParseYAMLreturnSpineStruct(T,CCm,M,O)(
+  @system auto configParseYAMLreturnSpineStruct(T,CCm,M,O,Cfg)(
     T       _document_struct,
     CCm     _make_and_meta_struct,
     M       _manifested,
-    O       _opt_action
+    O       _opt_action,
+    Cfg     _cfg
   ){
     Node _yaml;
     if (_document_struct.content.length > 0) {
@@ -1125,7 +1236,7 @@ template configParseYAMLreturnSpineStruct() {
       }
       try {
       _make_and_meta_struct
-        = contentYAMLtoSpineStruct!()(_make_and_meta_struct, _yaml, _manifested, _opt_action, _document_struct.filename);
+        = contentYAMLtoSpineStruct!()(_make_and_meta_struct, _yaml, _manifested, _opt_action, _cfg, _document_struct.filename);
       } catch (Throwable) {
         import std.stdio;
         writeln("ERROR failed to convert yaml to struct: ", _document_struct.filename);
@@ -1202,11 +1313,12 @@ template docHeaderMakeAndMetaTupYamlExtractAndConvertToStruct() {
   mixin spineRgxIn;
   mixin contentJSONtoSpineStruct;
   static auto rgx = RgxI();
-  @system auto docHeaderMakeAndMetaTupYamlExtractAndConvertToStruct(CCm,Src,M,O)(
+  @system auto docHeaderMakeAndMetaTupYamlExtractAndConvertToStruct(CCm,Src,M,O,Cfg)(
     Src     header_src,
     CCm     _make_and_meta_struct,
     M       _manifested,
     O       _opt_action,
+    Cfg     _cfg,
   ) {
     Node _yaml;
     try {
@@ -1214,7 +1326,7 @@ template docHeaderMakeAndMetaTupYamlExtractAndConvertToStruct() {
       if (("title" in _yaml) && ("creator" in _yaml)) {} else { // need test for _yaml content (does not work)
         writeln("ERROR failed to read document header, yaml header does not contain essential information related to title and author");
       }
-      return contentYAMLtoSpineStruct!()(_make_and_meta_struct, _yaml, _manifested, _opt_action, "header");
+      return contentYAMLtoSpineStruct!()(_make_and_meta_struct, _yaml, _manifested, _opt_action, _cfg, "header");
     } catch (Throwable) {
       writeln("ERROR failed to read document header, header not parsed as yaml: ", _manifested.src.filename);
       return _make_and_meta_struct;
diff --git a/src/doc_reform/meta/metadoc.d b/src/doc_reform/meta/metadoc.d
index fdec126..3d04236 100644
--- a/src/doc_reform/meta/metadoc.d
+++ b/src/doc_reform/meta/metadoc.d
@@ -20,17 +20,18 @@ template spineAbstraction() {
   enum makeMeta { make, meta }
   enum docAbst  { doc_abstract_obj, doc_has }
   static auto rgx = RgxI();
-  @system auto spineAbstraction(E,P,O,M,S)(
+  @system auto spineAbstraction(E,P,O,Cfg,M,S)(
     E _env,
     P program_info,
     O _opt_action,
+    Cfg _cfg,
     M _manifest,
     S _make_and_meta_struct
   ){
     { /+ document config/make file +/
       auto _config_document_struct = readConfigDoc!()(_manifest, _env);
       import doc_reform.meta.conf_make_meta_yaml;
-      _make_and_meta_struct = _config_document_struct.configParseYAMLreturnSpineStruct!()(_make_and_meta_struct, _manifest, _opt_action);
+      _make_and_meta_struct = _config_document_struct.configParseYAMLreturnSpineStruct!()(_make_and_meta_struct, _manifest, _opt_action, _cfg);
     }
     /+ ↓ read file (filename with path) +/
     /+ ↓ file tuple of header and content +/
@@ -66,6 +67,7 @@ template spineAbstraction() {
         _make_and_meta_struct,
         _manifest,
         _opt_action,
+        _cfg,
       );
     if ((_opt_action.debug_do)
     || (_opt_action.very_verbose)
diff --git a/src/doc_reform/spine.d b/src/doc_reform/spine.d
index 006ea1b..2ebdae2 100755
--- a/src/doc_reform/spine.d
+++ b/src/doc_reform/spine.d
@@ -172,25 +172,25 @@ string program_name = "spine";
     "workon"                      : false,
   ];
   string[string] settings = [
-    "output"                      : "",    //_cfg.www_doc_root,          // "/srv/www/spine/static" or "/var/www/html"
-    "www-http"                    : "",    //_cfg.www_http,              // "http" or "https"
-    "www-host"                    : "",    //_cfg.www_host,              // start with "localhost" ?
-    "www-host-doc-root"           : "",    //_cfg.www_host_doc_root,     // start with "localhost" ?
-    "www-url-doc-root"            : "",    //_cfg.www_url_doc_root,      // start with "http://localhost" ?
-    "cgi-http"                    : "",    //_cfg.cgi_http,              // suggest
-    "cgi-host"                    : "",    //_cfg.cgi_host,              // suggest
-    "cgi-bin-root"                : "",    //_cfg.cgi_bin_root,          // suggest "/var/www/cgi/cgi-bin"
-    "cgi-sqlite-search-filename"  : "",    //_cfg.cgi_filename,          // suggest "spine_search" (though "spine-search" would have been preferable?)
-    "cgi-url-root"                : "",    //_cfg.cgi_url_root,          // start with "http://localhost/cgi-bin" ?
-    "cgi-url-action"              : "",    //_cfg.cgi_url_action,        // start with "http://localhost/cgi-bin/spine-search"
-    "cgi-search-title"            : "",    //_cfg.cgi_search_form_title, // e.g. "≅ SiSU Spine search"
+    "output"                      : "",
+    "www-http"                    : "",
+    "www-host"                    : "",
+    "www-host-doc-root"           : "",
+    "www-url-doc-root"            : "",
+    "cgi-http"                    : "",
+    "cgi-host"                    : "",
+    "cgi-bin-root"                : "",
+    "cgi-sqlite-search-filename"  : "",
+    "cgi-url-root"                : "",
+    "cgi-url-action"              : "",
+    "cgi-search-title"            : "",
     "config"                      : "",
-    "lang"                        : "all", //_cfg.default_language,      // suggest "all" or "en" (default which language to process)
-    "set-papersize"               : "",    //_cfg.default_papersize,     // suggest: a4
-    "set-textwrap"                : "",    //_cfg.default_text_wrap,     // suggest: 80
-    "set-digest"                  : "",    //_cfg.default_hash_digest,   // suggest: sha256
-    "sqlite-db-path"              : "",    //_cfg.db_sqlite_path,        // suggest: "/var/www/sqlite"
-    "sqlite-db-filename"          : "",    //_cfg.db_sqlite_filename,    // suggest: "spine-search.db"
+    "lang"                        : "all",
+    "set-papersize"               : "",
+    "set-textwrap"                : "",
+    "set-digest"                  : "",
+    "sqlite-db-path"              : "",
+    "sqlite-db-filename"          : "",
   ];
   auto helpInfo = getopt(args,
     std.getopt.config.passThrough,
@@ -199,10 +199,10 @@ string program_name = "spine";
     "assert",                     "set optional assertions on",                                     &opts["assertions"],
     "cgi-search-form-codegen",    "generates (pre-compiled) d code for search of specified db",     &opts["cgi-search-form-codegen"],
     "cgi-bin-root",               "path to cgi-bin directory",                                      &settings["cgi-bin-root"],
-    "cgi-sqlite-search-filename", "cgi-bin sqlite search form name",                                &settings["cgi-sqlite-search-filename"],
     "cgi-url-root",               "url to cgi-bin (to find cgi-bin)",                               &settings["cgi-url-root"],
     "cgi-url-action",             "url to post to cgi-bin search form",                             &settings["cgi-url-action"],
-    "cgi-search-title",           "title for cgi-bin search form",                                  &settings["cgi-search-title"],
+    "cgi-search-title",           "if generating a cgi search form the title to use for it",        &settings["cgi-search-title"],
+    "cgi-sqlite-search-filename", "=[filename] default is spine-search",                            &settings["cgi-sqlite-search-filename"],
     "concordance",                "file for document",                                              &opts["concordance"],
     "curate",                    "extract info on authors & topics from document header metadata",  &opts["curate"],
     "curate-authors",            "extract info on authors from document header metadata",           &opts["curate-authors"],
@@ -217,6 +217,7 @@ string program_name = "spine";
     "html-link-search",           "html embedded search submission",                                &opts["html-link-search"],
     "html-seg",                   "process html output",                                            &opts["html-seg"],
     "html-scroll",                "process html output",                                            &opts["html-scroll"],
+    "lang",                       "=[lang code e.g. =en or =en,es]",                                &settings["lang"],
     "latex",                      "output for pdfs",                                                &opts["latex"],
     "latex-color-links",          "mono or color links for pdfs",                                   &opts["latex-color-links"],
     "light",                      "default light theme",                                            &opts["light"],
@@ -224,6 +225,7 @@ string program_name = "spine";
     "ocn-off",                    "object cite numbers",                                            &opts["ocn-off"],
     "odf",                        "open document format text (--odt)",                              &opts["odf"],
     "odt",                        "open document format text",                                      &opts["odt"],
+    "output",                     "=/path/to/output/dir specify where to place output",             &settings["output"],
     "parallel",                   "parallelisation",                                                &opts["parallel"],
     "parallel-subprocesses",      "nested parallelisation",                                         &opts["parallel-subprocesses"],
     "pdf",                        "latex output for pdfs",                                          &opts["pdf"],
@@ -251,6 +253,8 @@ string program_name = "spine";
     "sqlite-discrete",            "process discrete sqlite output",                                 &opts["sqlite-discrete"],
     "sqlite-db-create",           "create db, create tables",                                       &opts["sqlite-db-create"],
     "sqlite-db-drop",             "drop tables & db",                                               &opts["sqlite-db-drop"],
+    "sqlite-db-filename",         "sqlite db to create, populate & make available for search",      &settings["sqlite-db-filename"],
+    "sqlite-db-path",             "sqlite db path",                                                 &settings["sqlite-db-path"],
     "sqlite-db-recreate",         "create db, create tables",                                       &opts["sqlite-db-recreate"],
     "sqlite-delete",              "sqlite output",                                                  &opts["sqlite-delete"],
     "sqlite-insert",              "sqlite output",                                                  &opts["sqlite-insert"],
@@ -267,13 +271,7 @@ string program_name = "spine";
     "very-verbose",               "output to terminal",                                             &opts["very-verbose"],
     "workon",                     "(reserved for some matters under development & testing)",        &opts["workon"],
     "xhtml",                      "xhtml output",                                                   &opts["xhtml"],
-    "cgi-search-title",           "if generating a cgi search form the title to use for it",        &settings["cgi-search-title"],
-    "cgi-sqlite-search-filename", "=[filename] default is spine-search",                            &settings["cgi-sqlite-search-filename"],
     "config",                     "=/path/to/config/file/including/filename",                       &settings["config"],
-    "lang",                       "=[lang code e.g. =en or =en,es]",                                &settings["lang"],
-    "output",                     "=/path/to/output/dir specify where to place output",             &settings["output"],
-    "sqlite-db-path",             "sqlite db path",                                                 &settings["sqlite-db-path"],
-    "sqlite-db-filename",         "sqlite db to create, populate & make available for search",      &settings["sqlite-db-filename"],
     // "sqlite-db-filename",         "=[filename].sql.db",                                             &settings["sqlite-db-filename"],
   );
   if (helpInfo.helpWanted) {
@@ -466,12 +464,6 @@ string program_name = "spine";
     @trusted string cgi_bin_root() {
       return settings["cgi-bin-root"];
     }
-    @trusted string cgi_url_root() {
-      return settings["cgi-url-root"];
-    }
-    @trusted string cgi_url_action() {
-      return settings["cgi-url-action"];
-    }
     @trusted string cgi_search_title() {
       return settings["cgi-search-title"];
     }
@@ -483,6 +475,12 @@ string program_name = "spine";
       ? (settings["cgi-sqlite-search-filename"].translate(['-' : "_"]) ~ ".d")
       : "";
     }
+    @trusted string cgi_url_root() {
+      return settings["cgi-url-root"];
+    }
+    @trusted string cgi_url_action() {
+      return settings["cgi-url-action"];
+    }
     @trusted string hash_digest_type() {
       return settings["set-digest"];
     }
@@ -492,16 +490,16 @@ string program_name = "spine";
     @trusted string latex_papersize() {
       return settings["set-papersize"];
     }
-    @trusted string  webserver_host_name() {
+    @trusted string webserver_host_name() {
       return settings["www-host"];
     }
-    @trusted string  webserver_host_doc_root() {
+    @trusted string webserver_host_doc_root() {
       return settings["www-host-doc-root"];
     }
-    @trusted string  webserver_url_doc_root() {
+    @trusted string webserver_url_doc_root() {
       return settings["www-url-doc-root"];
     }
-    @trusted string  webserver_http() {
+    @trusted string webserver_http() {
       return settings["www-http"];
     }
     @trusted bool parallelise() {
@@ -662,7 +660,7 @@ string program_name = "spine";
           _conf_file_details = configFilePaths!()(_manifested, _env, _opt_action.config_path_set);
           auto _config_local_site_struct = readConfigSite!()(_conf_file_details, _opt_action, _cfg);
           import doc_reform.meta.conf_make_meta_yaml;
-          _siteConfig = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_siteConfig, _manifested, _opt_action); // - get local site config
+          _siteConfig = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_siteConfig, _manifested, _opt_action, _cfg); // - get local site config
           break;
         }
       }
@@ -670,7 +668,7 @@ string program_name = "spine";
   } else { /+ local site config +/
     auto _config_local_site_struct = readConfigSite!()(_conf_file_details, _opt_action, _cfg);
     import doc_reform.meta.conf_make_meta_yaml;
-    _siteConfig = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_siteConfig, _manifested, _opt_action); // - get local site config
+    _siteConfig = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_siteConfig, _manifested, _opt_action, _cfg); // - get local site config
   }
   if (_opt_action.show_config) {
     import doc_reform.meta.metadoc_show_config;
@@ -886,7 +884,7 @@ string program_name = "spine";
           ) {
             writeln("--->\nstepX commence → (document abstraction)");
           }
-          auto t = spineAbstraction!()(_env, program_info, _opt_action, manifest, _make_and_meta_struct);
+          auto t = spineAbstraction!()(_env, program_info, _opt_action, _cfg, manifest, _make_and_meta_struct);
           static assert(t.length==2);
           auto doc_abstraction = t[dAM.abstraction];
           auto doc_matters = t[dAM.matters];
@@ -1000,7 +998,7 @@ string program_name = "spine";
           ) {
             writeln("--->\nstepX commence → (document abstraction)");
           }
-          auto t = spineAbstraction!()(_env, program_info, _opt_action, manifest, _make_and_meta_struct);
+          auto t = spineAbstraction!()(_env, program_info, _opt_action, _cfg, manifest, _make_and_meta_struct);
           static assert(t.length==2);
           auto doc_abstraction = t[dAM.abstraction];
           auto doc_matters = t[dAM.matters];
-- 
cgit v1.2.3