diff options
| author | Ralph Amissah <ralph.amissah@gmail.com> | 2021-10-07 20:39:57 -0400 | 
|---|---|---|
| committer | Ralph Amissah <ralph.amissah@gmail.com> | 2021-11-27 19:40:47 -0500 | 
| commit | e37589f5f5253d81c62f8846dbf721c23fe48d44 (patch) | |
| tree | f6a92b74b3b82453f7bce68b33647a428d144624 /src | |
| parent | sqlite related internal naming (diff) | |
configuration, hierarchy filenames & paths ...
Diffstat (limited to 'src')
| -rw-r--r-- | src/doc_reform/io_out/cgi_sqlite_search_form.d | 4 | ||||
| -rw-r--r-- | src/doc_reform/meta/conf_make_meta_structs.d | 1 | ||||
| -rw-r--r-- | src/doc_reform/meta/conf_make_meta_yaml.d | 1868 | ||||
| -rw-r--r-- | src/doc_reform/meta/metadoc.d | 6 | ||||
| -rwxr-xr-x | src/doc_reform/spine.d | 78 | 
5 files changed, 1034 insertions, 923 deletions
| 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]; | 
