diff options
| -rw-r--r-- | org/default_paths.org | 41 | ||||
| -rw-r--r-- | org/default_regex.org | 4 | ||||
| -rw-r--r-- | org/in_source_files.org | 13 | ||||
| -rw-r--r-- | org/out_sqlite.org | 80 | ||||
| -rw-r--r-- | org/out_xmls.org | 12 | ||||
| -rw-r--r-- | org/output_hub.org | 14 | ||||
| -rw-r--r-- | org/output_show.org | 118 | ||||
| -rw-r--r-- | org/spine.org | 149 | ||||
| -rw-r--r-- | src/doc_reform/io_in/paths_source.d | 41 | ||||
| -rw-r--r-- | src/doc_reform/io_in/read_config_files.d | 13 | ||||
| -rw-r--r-- | src/doc_reform/io_out/hub.d | 14 | ||||
| -rw-r--r-- | src/doc_reform/io_out/rgx.d | 4 | ||||
| -rw-r--r-- | src/doc_reform/io_out/sqlite.d | 80 | ||||
| -rw-r--r-- | src/doc_reform/io_out/xmls.d | 12 | ||||
| -rw-r--r-- | src/doc_reform/meta/metadoc.d | 24 | ||||
| -rw-r--r-- | src/doc_reform/meta/metadoc_show_config.d | 109 | ||||
| -rw-r--r-- | src/doc_reform/meta/metadoc_show_make.d | 2 | ||||
| -rw-r--r-- | src/doc_reform/meta/metadoc_show_metadata.d | 2 | ||||
| -rw-r--r-- | src/doc_reform/meta/metadoc_show_summary.d | 2 | ||||
| -rw-r--r-- | src/doc_reform/meta/rgx.d | 4 | ||||
| -rwxr-xr-x | src/doc_reform/spine.d | 113 | 
21 files changed, 574 insertions, 277 deletions
| diff --git a/org/default_paths.org b/org/default_paths.org index 20dae9e..3af1019 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -49,7 +49,7 @@ template PodManifest() {    mixin spineRgxIn;    static auto rgx = RgxI();    @safe auto PodManifest(O)( -    O       _opt_actions, +    O       _opt_action,      string  _pth=""    ) {      struct ManifestFile_ { @@ -71,10 +71,10 @@ template PodManifest() {              _manifest_path = m.captures["podpath"];            }          } else  { -          if (_opt_actions.verbose || _opt_actions.very_verbose || _opt_actions.debug_do) { +          if (_opt_action.verbose || _opt_action.very_verbose || _opt_action.debug_do) {              writeln("WARNING, src is not a pod, issue with manifest_path: ", _pth); // remove? unless can distinguish pod            } -          _manifest_path = null; // _manifest_path = ""; +          _manifest_path = "";          }          return _manifest_path;        } @@ -126,13 +126,13 @@ template PathMatters() {    static auto rgx  = RgxI();    static auto mkup = InlineMarkup();    @safe auto PathMatters(O,E)( -    O        _opt_actions, +    O        _opt_action,      E        _env,      string   _pth,      string   _fns              = "",      char[][] _manifest_fn_list = [[]],    ) { -    @safe auto _manifested = PodManifest!()(_opt_actions, _pth); +    @safe auto _manifested = PodManifest!()(_opt_action, _pth);      struct ManifestMatters_ {        auto env() {          auto _env = _env; @@ -149,7 +149,7 @@ template PathMatters() {        @safe auto opt() {          struct Opt_ {            auto action() { -            return _opt_actions; +            return _opt_action;            }          }          return Opt_(); @@ -208,7 +208,7 @@ template PathMatters() {        }        @safe auto src() {          string _fns = _fns; // required here by dmd & not by ldc (for D:2078) -        auto _opt_actions = _opt_actions; +        auto _opt_action = _opt_action;          auto _env = _env;          struct SRC_ {            @safe bool is_pod() { @@ -323,7 +323,7 @@ template PathMatters() {                assert(_dir == absolute_path_to_src                  .match(rgx.src_base_parent_dir_name).captures["dir"]);              } -            if (_opt_actions.debug_do) { +            if (_opt_action.debug_do) {                writeln("--> (base_dir)  ", _dir);              }              return _dir; @@ -355,7 +355,7 @@ template PathMatters() {              } else {                _dir = ((path_and_fn.chainPath("../../")).asNormalizedPath).array;              } -            if (_opt_actions.debug_do) { +            if (_opt_action.debug_do) {                writeln("--> (base_dir_path) ", _dir);              }              return _dir; @@ -401,7 +401,7 @@ template PathMatters() {              } else {                _dir = (absolute_path_to_src).match(rgx.src_base_parent_dir_name).captures["dir"];              } -            if (_opt_actions.debug_do) { +            if (_opt_action.debug_do) {                writeln("--> (base_parent_dir) ", _dir);              }              return _dir; @@ -437,10 +437,10 @@ template PathMatters() {          struct Out_ {            @safe auto path() {              auto _output_path = _env["pwd"]; -            if ((_opt_actions.output_dir_set.length > 0) -              && isValidPath(_opt_actions.output_dir_set) +            if ((_opt_action.output_dir_set.length > 0) +              && isValidPath(_opt_action.output_dir_set)              ) { -              _output_path = ((_opt_actions.output_dir_set).asNormalizedPath).array; +              _output_path = ((_opt_action.output_dir_set).asNormalizedPath).array;                if (!exists(_output_path)) {                  try {                    _output_path.mkdirRecurse; @@ -468,10 +468,10 @@ template PathMatters() {  #+NAME: template_paths_src  #+BEGIN_SRC d -template ConfigFilePaths() { +template configFilePaths() {    mixin spineRgxIn;    static auto rgx = RgxI(); -  @safe auto ConfigFilePaths(M,E)( +  @safe auto configFilePaths(M,E)(      M      _manifested,      E      _env,      string _cli_config_path_set = "" @@ -524,10 +524,9 @@ template ConfigFilePaths() {                    _dr_doc_conf_pwd_d,                  ];                } -            } else { -              _possible_config_path_locations = [ -                _cli_config_path_set -              ]; +            } else if (_cli_config_path_set.isDir) { +               _possible_config_path_locations = [_cli_config_path_set ]; +            // } else if (_cli_config_path_set.isFile) { // use file, taken care of elsewhere              }              /+ FIX clean up conf paths ↑              (compare pwd to doc path location, and build config path) @@ -549,10 +548,10 @@ template ConfigFilePaths() {                  _possible_config_path_locations = [                    _dot_pwd,                    _underscore_pwd, +                  _collection_root_a, +                  _collection_root_b,                    _dot_home,                    "/etc/dr", -                  _collection_root_a, // set priority higher? -                  _collection_root_b  // set priority higher?                  ];                } else {                  /+ config document (& or local site) on filesystem +/ diff --git a/org/default_regex.org b/org/default_regex.org index 67d259a..a768a65 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -480,8 +480,8 @@ static inline_link_empty                              = ctRegex!(`┥(?P<text>.+  static inline_link_number                             = ctRegex!(`┥(?P<text>.+?)┝┤(?P<num>[0-9]+)├`, "mg"); // not used  static inline_link_number_only                        = ctRegex!(`(?P<linked_text>┥.+?┝)┤(?P<num>[0-9]+)├`, "mg");  static inline_link_stow_uri                           = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>[^ 0-9#┥┝┤├][^ 0-9┥┝┤├]+)├`, "mg"); // will not stow (stowed links) or object number internal links -static inline_link_hash                               = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>#(?P<segname>\S+?))├`, "mg"); -static inline_link_seg_and_hash                       = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>[^/]+?#(?P<segname>.+?))├`, "mg"); +static inline_link_hash                               = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>#(?P<hash>\S+?))├`, "mg"); +static inline_link_seg_and_hash                       = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>(?P<seg>[^/#├]*)#(?P<hash>.+?))├`, "mg");  static inline_link_clean                              = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");  static inline_link_toc_to_backmatter                  = ctRegex!(`┤#(?P<link>endnotes|bibliography|bookindex|glossary|blurb)├`, "mg");  static url                                            = ctRegex!(`https?://`, "mg"); diff --git a/org/in_source_files.org b/org/in_source_files.org index eb813db..05e9889 100644 --- a/org/in_source_files.org +++ b/org/in_source_files.org @@ -56,7 +56,7 @@ import  #+NAME: meta_config_file_hub  #+BEGIN_SRC d  template readConfigSite() { -  @system final auto readConfigSite(C)(C _conf_file_details) { +  @system final auto readConfigSite(C,O)(C _conf_file_details, O _opt_action) {      mixin spineRgxIn;      static auto rgx = RgxI();      string conf_filename = "NONE"; @@ -114,6 +114,9 @@ webserv:            try {              if (exists(conf_file)) {                if (conf_file.getLinkAttributes.attrIsFile) { +                if (_opt_action.verbose || _opt_action.very_verbose || _opt_action.debug_do) { +                  writeln("config file used: \"", conf_file, "\" (cli flag settings override config file's individual settings)"); +                }                  config_file_str = conf_file.readText;                  break;                } @@ -137,7 +140,7 @@ webserv:          config_file_str = default_config_file_str;        }      } -    if (config_file_str.length == 0) { /+ create dummy default config file +/ +    if (config_file_str.length == 0) { /+ use dummy default config file +/        writeln("WARNING config file NOT found, default provided");        conf_filename = "VIRTUAL";        config_file_str = default_config_file_str; @@ -176,7 +179,7 @@ static template readConfigDoc() {      static auto rgx = RgxI();      string config_file_str;      string conf_filename = "NONE"; -    auto _conf_file_details = ConfigFilePaths!()(_manifested, _env); +    auto _conf_file_details = configFilePaths!()(_manifested, _env);      string[] possible_config_path_locations = _conf_file_details.possible_config_path_locations.dr_document_make;      foreach(conf_fn; [_conf_file_details.config_filename_document]) {        foreach(pth; possible_config_path_locations) { @@ -228,7 +231,7 @@ static template configReadSiteYAML() {      <<imports_spine>>;    @safe final YAMLDocument configReadSiteYAML(M,E)(M _manifested, E _env) {      string _configuration = configReadInSiteYAML!()(_manifested, _env); -    auto _conf_file_details = ConfigFilePaths!()(_manifested, _env); +    auto _conf_file_details = configFilePaths!()(_manifested, _env);      string _conf_yaml_fn = _conf_file_details.config_filename_site;      YAMLDocument _yaml_conf = configYAML!()(_configuration, _conf_yaml_fn);      return _yaml_conf; @@ -240,7 +243,7 @@ static template configReadDocYAML() {      <<imports_spine>>;    @safe final YAMLDocument configReadDocYAML(M,E)(M _manifested, E _env) {      string _configuration = configReadInDocYAML!()(_manifested, _env); -    auto _conf_file_details = ConfigFilePaths!()(_manifested, _env); +    auto _conf_file_details = configFilePaths!()(_manifested, _env);      string _conf_yaml_fn = _conf_file_details.config_filename_document;      YAMLDocument _yaml_conf = configYAML!()(_configuration, _conf_yaml_fn);      return _yaml_conf; diff --git a/org/out_sqlite.org b/org/out_sqlite.org index e886fbd..b5c2532 100644 --- a/org/out_sqlite.org +++ b/org/out_sqlite.org @@ -272,7 +272,7 @@ template SQLiteInsertDocObjectsLoop() {  #+NAME: sqlite_tables_create  #+BEGIN_SRC d  template SQLiteTablesCreate() { -  void SQLiteTablesCreate(E,O)(E env, O opt_action) { +  void SQLiteTablesCreate(E,O,C)(E env, O opt_action, C config) {      import d2sqlite3;      template SQLiteTablesReCreate() {        string SQLiteTablesReCreate()() { @@ -290,13 +290,32 @@ template SQLiteTablesCreate() {      }      if (opt_action.sqlite_db_create) {        string _db_statement; -      auto pth_sqlite = spinePathsSQLite!()(opt_action.sqlite_filename, opt_action.output_dir_set); -      pth_sqlite.base.mkdirRecurse; -      auto db = Database(pth_sqlite.sqlite_file); -      { -        _db_statement ~= SQLiteTablesReCreate!()(); +      string db_filename = (opt_action.sqlite_filename.length > 0) +      ? opt_action.sqlite_filename +      : (config.conf.w_srv_db_sqlite.length > 0) +        ? config.conf.w_srv_db_sqlite +        : ""; +      string output_path = (opt_action.output_dir_set.length > 0) +      ? opt_action.output_dir_set +      : (config.conf.output_path.length > 0) +        ? config.conf.output_path +        : ""; +      if (db_filename.length > 0 && output_path.length > 0) { +        if ((opt_action.verbose)) { +          writeln("db name & path: ", config.conf.output_path, "/sqlite/", db_filename); +        } +        auto pth_sqlite = spinePathsSQLite!()(db_filename, output_path); +        pth_sqlite.base.mkdirRecurse; +        auto db = Database(pth_sqlite.sqlite_file); +        { +          _db_statement ~= SQLiteTablesReCreate!()(); +        } +        SQLiteDbRun!()(db, _db_statement, opt_action, "TABLE RE-CREATE"); +      } else { +        writeln("must provide db name & output root path either on the command line or in configuration file"); +        writeln("db name: ", db_filename); +        writeln("output root path (path less /sqlite which is added: ", config.conf.output_path);        } -      SQLiteDbRun!()(db, _db_statement, opt_action, "TABLE RE-CREATE");      }    }  } @@ -307,15 +326,31 @@ template SQLiteTablesCreate() {  #+NAME: sqlite_tables_drop  #+BEGIN_SRC d  template SQLiteDbDrop() { -  void SQLiteDbDrop(O)(O opt_action) { +  void SQLiteDbDrop(O,C)(O opt_action, C config) {      writeln("db drop");      if ((opt_action.sqlite_db_drop)) { -      auto pth_sqlite = spinePathsSQLite!()(opt_action.sqlite_filename, opt_action.output_dir_set); -      writeln("remove(", pth_sqlite.sqlite_file, ")"); -      try { -        remove(pth_sqlite.sqlite_file); -      } catch (FileException ex) { -        // handle error +      string db_filename = (opt_action.sqlite_filename.length > 0) +      ? opt_action.sqlite_filename +      : (config.conf.w_srv_db_sqlite.length > 0) +        ? config.conf.w_srv_db_sqlite +        : ""; +      string output_path = (opt_action.output_dir_set.length > 0) +      ? opt_action.output_dir_set +      : (config.conf.output_path.length > 0) +        ? config.conf.output_path +        : ""; +      if (db_filename.length > 0 && output_path.length > 0) { +        auto pth_sqlite = spinePathsSQLite!()(db_filename, output_path); +        writeln("remove(", pth_sqlite.sqlite_file, ")"); +        try { +          remove(pth_sqlite.sqlite_file); +        } catch (FileException ex) { +          // handle error +        } +      } else { +        writeln("must provide db name & output root path either on the command line or in configuration file"); +        writeln("db name: ", db_filename); +        writeln("output root path (path less /sqlite which is added: ", config.conf.output_path);        }      }    } @@ -605,9 +640,9 @@ string inline_links(M,O)(      }      auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language);      if (_xml_type == "seg") { -      foreach (m; _txt.match(rgx.inline_link_seg_and_hash)) { -        if (m.captures["segname"] in doc_matters.has.tag_associations) { -          if (m.captures["segname"] == doc_matters.has.tag_associations[(m.captures["segname"])]["seg_lv4"]) { +      foreach (m; _txt.matchAll(rgx.inline_link_seg_and_hash)) { +        if (m.captures["hash"] in doc_matters.has.tag_associations) { +          if (m.captures["hash"] == doc_matters.has.tag_associations[(m.captures["hash"])]["seg_lv4"]) {              _txt = _txt.replaceFirst(                rgx.inline_link_seg_and_hash,                "┥$1┝┤" @@ -624,9 +659,9 @@ string inline_links(M,O)(                  ~ "/"                  ~ doc_matters.src.filename_base                  ~ "/" -                ~ doc_matters.has.tag_associations[(m.captures["segname"])]["seg_lv4"] +                ~ doc_matters.has.tag_associations[(m.captures["hash"])]["seg_lv4"]                  ~ ".html" -                ~ "#" ~ "$3" +                ~ "#" ~ m.captures["hash"]                ~ "├"              );            } @@ -634,9 +669,9 @@ string inline_links(M,O)(            if (!(doc_matters.opt.action.quiet)) {              writeln(                "WARNING on internal document links, anchor to link <<" -               ~ m.captures["segname"] +               ~ m.captures["hash"]                 ~ ">> not found in document, " -               ~ "anchor: " ~ m.captures["segname"] +               ~ "anchor: " ~ m.captures["hash"]                 ~ " document: " ~ doc_matters.src.filename              );            } @@ -650,7 +685,7 @@ string inline_links(M,O)(              ~ doc_matters.conf_make_meta.conf.w_srv_data_root_url_html              ~ "/"              ~ pth_html.tail_fn_scroll(doc_matters.src.filename) -            ~ "#" ~ "$3" +            ~ "#" ~ m.captures["hash"]            ~ "├"          );        } @@ -1869,7 +1904,6 @@ writeln(doc_matters.conf_make_meta.meta.classify_topic_register_arr);  #+NAME: sqlite_formatted_insertions_topic_register  #+BEGIN_SRC d  if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) { -    string _insert_topics;    foreach (topic; doc_matters.conf_make_meta.meta.classify_topic_register_arr) {      string[] subject_tree = topic.split(mkup.sep); diff --git a/org/out_xmls.org b/org/out_xmls.org index da5b640..acd2b79 100644 --- a/org/out_xmls.org +++ b/org/out_xmls.org @@ -499,10 +499,10 @@ import      if (_xml_type == "seg" || _xml_type == "epub") {        seg_lvs = (_xml_type == "epub") ? "seg_lv1_to_4" : "seg_lv4";        foreach (m; _txt.match(rgx.inline_link_hash)) { -        if (m.captures[3] in doc_matters.has.tag_associations) { +        if (m.captures["hash"] in doc_matters.has.tag_associations) {            if ( -            m.captures[3] -            == doc_matters.has.tag_associations[(m.captures[3])][seg_lvs] +            m.captures["hash"] +            == doc_matters.has.tag_associations[(m.captures["hash"])][seg_lvs]            ) {              _txt = _txt.replaceFirst(                rgx.inline_link_hash, @@ -512,7 +512,7 @@ import              _txt = _txt.replaceFirst(                rgx.inline_link_hash,                "┥$1┝┤" -              ~ doc_matters.has.tag_associations[(m.captures[3])][seg_lvs] +              ~ doc_matters.has.tag_associations[(m.captures["hash"])][seg_lvs]                ~ _suffix ~ "#" ~ "$3"                ~ "├"              ); @@ -521,9 +521,9 @@ import            if (!(doc_matters.opt.action.quiet)) {              writeln(                "WARNING on internal document links, anchor to link <<" -               ~ m.captures[3] +               ~ m.captures["hash"]                 ~ ">> not found in document, " -               ~ "anchor: " ~ m.captures[3] +               ~ "anchor: " ~ m.captures["hash"]                 ~ " document: " ~ doc_matters.src.filename              );            } diff --git a/org/output_hub.org b/org/output_hub.org index 560cc2e..ba39e2e 100644 --- a/org/output_hub.org +++ b/org/output_hub.org @@ -58,7 +58,7 @@ template outputHub() {  }  template outputHubOp() {    <<output_imports>> -  @system void outputHubOp(E,O,M)(E env, O opt_action, M make_and_meta_struct) { +  @system void outputHubOp(E,O,C)(E env, O opt_action, C config) {      mixin spineRgxOut;      static auto rgx = RgxO();      <<output_options_op>> @@ -226,7 +226,7 @@ if ((opt_action.sqlite_db_drop)) {      writeln("sqlite drop db...");    }    import doc_reform.io_out.sqlite; -  SQLiteDbDrop!()(opt_action); +  SQLiteDbDrop!()(opt_action, config);    if ((opt_action.very_verbose)) {      writeln("sqlite drop db done");    } @@ -243,7 +243,7 @@ if ((opt_action.sqlite_db_create)) {      writeln("sqlite create table...");    }    import doc_reform.io_out.sqlite; -  SQLiteTablesCreate!()(env, opt_action); +  SQLiteTablesCreate!()(env, opt_action, config);    if ((opt_action.very_verbose)) {      writeln("sqlite create table done");    } @@ -257,20 +257,20 @@ if ((opt_action.sqlite_db_create)) {  if ((opt_action.cgi_search_form_codegen)) {    if ((opt_action.verbose)) {      string _sqlite_db_fn = (opt_action.sqlite_filename.empty) -      ? make_and_meta_struct.conf.w_srv_db_sqlite +      ? config.conf.w_srv_db_sqlite        : opt_action.sqlite_filename;      string _cgi_search_script = (opt_action.cgi_sqlite_search_filename.empty) -      ? make_and_meta_struct.conf.w_srv_cgi_search_script +      ? config.conf.w_srv_cgi_search_script        : opt_action.cgi_sqlite_search_filename;      string _cgi_search_script_raw_fn_d = (opt_action.cgi_sqlite_search_filename_d.empty) -      ? make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d +      ? config.conf.w_srv_cgi_search_script_raw_fn_d        : opt_action.cgi_sqlite_search_filename_d;      auto pth_sqlite_cgi = spinePathsSQLiteCGI!()(_cgi_search_script_raw_fn_d, _cgi_search_script, opt_action.output_dir_set);      writeln("sqlite cgi search form...");      writeln(" ", pth_sqlite_cgi.search_form_path_out);    }    import doc_reform.io_out.cgi_sqlite_search_form; -  CGIsearchSQLite!()(env, opt_action, make_and_meta_struct); +  CGIsearchSQLite!()(env, opt_action, config);    if ((opt_action.very_verbose)) {      writeln("sqlite cgi search form done");    } diff --git a/org/output_show.org b/org/output_show.org index 3a1832b..0030b63 100644 --- a/org/output_show.org +++ b/org/output_show.org @@ -72,7 +72,7 @@ foreach (k; doc_matters.has.keys_seq.seg) {  #+NAME: meta_metadoc_show_summary_document  #+BEGIN_SRC d  writefln( -  "%s\n\"%s\", %s\n%s [%s]\n%s\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%s", +  "%s\n\"%s\", %s\n%s [%s]\n%s\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%s",    markup.repeat_character_by_number_provided("-", char_repeat_number),    doc_matters.conf_make_meta.meta.title_full,    doc_matters.conf_make_meta.meta.creator_author, @@ -131,10 +131,97 @@ writefln(  * show config  ** _module template_ show config +*** _show site config  --show-config (show config)  #+BEGIN_SRC d :tangle "../src/doc_reform/meta/metadoc_show_config.d"  module doc_reform.meta.metadoc_show_config; +template spineShowSiteConfig() { +  @safe void spineShowSiteConfig(O,T)( +    O opt_action, +    T config, +  ) { +    <<metadoc_show_summary_imports>> +    <<metadoc_show_imports_shared>> +    mixin InternalMarkup; +    auto markup = InlineMarkup(); +    auto char_repeat_number = 66; +    if (opt_action.show_config) { +      <<meta_metadoc_show_site_config>> +    } +  } +} +#+END_SRC + +*** show site config + +#+NAME: meta_metadoc_show_site_config +#+BEGIN_SRC d +writefln( +  "\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n", +  markup.repeat_character_by_number_provided("-", char_repeat_number), +  "- webserv domain name:", +  config.conf.w_srv_domain, +  "- webserv doc root (part):", +  config.conf.w_srv_data_root_part, +  "- webserv doc path:", +  config.conf.w_srv_data_root_path, +  "- webserv images (location):", +  config.conf.w_srv_images_root_part, +  "- webserv doc root url:", +  config.conf.w_srv_data_root_url, +  "- webserv cgi domain (host):", +  config.conf.w_srv_cgi_domain, +  "- webserv cgi host path:", +  config.conf.w_srv_cgi_bin_path, +  "- webserv cgi host (part):", +  config.conf.w_srv_cgi_bin_part, +  "- webserv cgi search script:", +  config.conf.w_srv_cgi_search_script, +  "- webserv cgi search script in d:", +  config.conf.w_srv_cgi_search_script_raw_fn_d, +  "- webserv cgi port:", +  config.conf.w_srv_cgi_port, +  "- webserv cgi user:", +  config.conf.w_srv_cgi_user, +  "- webserv cgi url:", +  config.conf.w_srv_cgi_bin_url, +  "- webserv cgi action:", +  config.conf.w_srv_cgi_action, +  // "- webserv cgi file links:", +  // config.conf.w_srv_cgi_file_links, +  "- webserv sqlite db:", +  config.conf.w_srv_db_sqlite, +  "- output path:", +  config.conf.output_path, +  "- processing concordance max:", +  config.conf.processing_concord_max, +  // "- flag act0:", +  // config.conf.flag_act0, +  "- default papersize:", +  config.conf.default_papersize, +  "- default text wrap:", +  config.conf.default_text_wrap, +  "- default emphasis markup symbol:", +  config.conf.default_emphasis, +  "- default language:", +  config.conf.default_language, +  "- default hash digest:", +  config.conf.default_digest, +  "- search flag:", +  config.conf.search_flag, +  "- search action:", +  config.conf.search_action, +  "- search db:", +  config.conf.search_db, +  "- search title:", +  config.conf.search_title, +); +#+END_SRC + +*** show (per document) config + +#+BEGIN_SRC d :tangle "../src/doc_reform/meta/metadoc_show_config.d"  template spineShowConfig() {    @safe void spineShowConfig(T)(      T  doc_matters, @@ -160,7 +247,7 @@ template spineShowConfig() {  #+NAME: meta_metadoc_show_config  #+BEGIN_SRC d  writefln( -  "%s\n\"%s\", %s\n%s\n%s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n", +  "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",    markup.repeat_character_by_number_provided("-", char_repeat_number),    doc_matters.conf_make_meta.meta.title_full,    doc_matters.conf_make_meta.meta.creator_author, @@ -202,26 +289,8 @@ writefln(    doc_matters.conf_make_meta.conf.output_path,    "- processing concordance max:",    doc_matters.conf_make_meta.conf.processing_concord_max, -  "- flag act0:", -  doc_matters.conf_make_meta.conf.flag_act0, -  "- flag act1:", -  doc_matters.conf_make_meta.conf.flag_act1, -  "- flag act2:", -  doc_matters.conf_make_meta.conf.flag_act2, -  "- flag act3:", -  doc_matters.conf_make_meta.conf.flag_act3, -  "- flag act4:", -  doc_matters.conf_make_meta.conf.flag_act4, -  "- flag act5:", -  doc_matters.conf_make_meta.conf.flag_act5, -  "- flag act6:", -  doc_matters.conf_make_meta.conf.flag_act6, -  "- flag act7:", -  doc_matters.conf_make_meta.conf.flag_act7, -  "- flag act8:", -  doc_matters.conf_make_meta.conf.flag_act8, -  "- flag act9:", -  doc_matters.conf_make_meta.conf.flag_act9, +  // "- flag act0:", +  // doc_matters.conf_make_meta.conf.flag_act0,    "- default papersize:",    doc_matters.conf_make_meta.conf.default_papersize,    "- default text wrap:", @@ -274,7 +343,7 @@ template spineShowMake() {  #+NAME: meta_metadoc_show_make  #+BEGIN_SRC d  writefln( -  "%s\n\"%s\", %s\n%s\n%s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n", +  "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",    markup.repeat_character_by_number_provided("-", char_repeat_number),    doc_matters.conf_make_meta.meta.title_full,    doc_matters.conf_make_meta.meta.creator_author, @@ -313,7 +382,6 @@ writefln(  );  #+END_SRC -  * show metadata  ** _module template_ show metadata  --show-metadata (show document metadata) @@ -345,7 +413,7 @@ template spineShowMetaData() {  #+NAME: meta_metadoc_show_metadata  #+BEGIN_SRC d  writefln( -  "%s\n\"%s\", %s\n%s\n%s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n", +  "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",    markup.repeat_character_by_number_provided("-", char_repeat_number),    doc_matters.conf_make_meta.meta.title_full,    doc_matters.conf_make_meta.meta.creator_author, diff --git a/org/spine.org b/org/spine.org index 253720f..f530703 100644 --- a/org/spine.org +++ b/org/spine.org @@ -98,7 +98,6 @@ string program_name = "spine";    <<spine_mixin>>    <<spine_init>>    <<spine_args>> -  <<spine_do_selected>>    if (_manifests.length > 1                            // _manifests[0] initialized dummy element    && _opt_action.abstraction) {      if (_opt_action.parallelise) {                     // see else @@ -425,7 +424,9 @@ auto helpInfo = getopt(args,    "abstraction",                "--abstraction document abstraction ",                                      &opts["abstraction"],    "assert",                     "--assert set optional assertions on",                                      &opts["assertions"],    "cgi-search-form-codegen",    "--cgi-search-form-codegen pre-compiled d code search of specified db",     &opts["cgi-search-form-codegen"], +  "cgi-sqlite-search-filename", "--cgi-sqlite-search-filename=[filename]",                                  &settings["cgi-sqlite-search-filename"],    "concordance",                "--concordance file for document",                                          &opts["concordance"], +  "config",                     "--config=/path/to/config/file/including/filename",                         &settings["config"],    "dark",                       "--dark alternative dark theme",                                            &opts["dark"],    "debug",                      "--debug",                                                                  &opts["debug"],    "digest",                     "--digest hash digest for each object",                                     &opts["digest"], @@ -438,6 +439,7 @@ auto helpInfo = getopt(args,    "html-link-search",           "--html-link-search html embedded search submission",                       &opts["html-link-search"],    "html-seg",                   "--html-seg process html output",                                           &opts["html-seg"],    "html-scroll",                "--html-seg process html output",                                           &opts["html-scroll"], +  "lang",                       "--lang=[lang code e.g. =en or =en,es]",                                    &settings["lang"],    "latex",                      "--latex output for pdfs",                                                  &opts["latex"],    "latex-color-links",          "--latex-color-links mono or color links for pdfs",                         &opts["latex-color-links"],    "light",                      "--light default light theme",                                              &opts["light"], @@ -446,8 +448,9 @@ auto helpInfo = getopt(args,    "ocn-off",                    "--ocn-off object cite numbers",                                            &opts["ocn-off"],    "odf",                        "--odf open document format text (--odt)",                                  &opts["odf"],    "odt",                        "--odt open document format text",                                          &opts["odt"], +  "output",                     "--output=/path/to/output/dir specify where to place output",               &settings["output"],    "parallel",                   "--parallel parallelisation",                                               &opts["parallel"], -  "parallel-subprocesses",      "--parallel-subprocesses nested parallelisation",                        &opts["parallel-subprocesses"], +  "parallel-subprocesses",      "--parallel-subprocesses nested parallelisation",                           &opts["parallel-subprocesses"],    "quiet|q",                    "--quiet output to terminal",                                               &opts["quiet"],    "pdf",                        "--pdf latex output for pdfs",                                              &opts["pdf"],    "pdf-color-links",            "--pdf-color-links mono or color links for pdfs",                           &opts["pdf-color-links"], @@ -477,16 +480,12 @@ auto helpInfo = getopt(args,    "section-biblio",             "--section-biblio process document biblio (default)",                       &opts["section_biblio"],    "section-bookindex",          "--section-bookindex process document bookindex (default)",                 &opts["section_bookindex"],    "section-blurb",              "--section-blurb process document blurb (default)",                         &opts["section_blurb"], +  "sqlite-db-filename",         "--sqlite-db-filename=[filename].sql.db",                                      &settings["sqlite-filename"],    "backmatter",                 "--section-backmatter process document backmatter (default)",               &opts["backmatter"],    "skip-output",                "--skip-output",                                                            &opts["skip-output"],    "theme-dark",                 "--theme-dark alternative dark theme",                                      &opts["theme-dark"],    "theme-light",                "--theme-light default light theme",                                        &opts["theme-light"],    "workon",                     "--workon (reserved for some matters under development & testing)",         &opts["workon"], -  "cgi-sqlite-search-filename", "--cgi-sqlite-search-filename=[filename]",                         &settings["cgi-sqlite-search-filename"], -  "config",                     "--config=/path/to/config/file/including/filename",                         &settings["config"], -  "output",                     "--output=/path/to/output/dir specify where to place output",               &settings["output"], -  "sqlite-db-filename",         "--sqlite-db-filename=[filename].sql.db",                                      &settings["sqlite-db-filename"], -  "lang",                       "--lang=[lang code e.g. =en or =en,es]",                                    &settings["lang"],  );  if (helpInfo.helpWanted) {    defaultGetoptPrinter("Some information about the program.", helpInfo.options); @@ -753,6 +752,28 @@ struct OptActions {        || sqlite_update      ) ? true : false;    } +  @trusted bool require_processing_files() { +    return ( +      opts["abstraction"] +      || epub +      || html +      || html_seg +      || html_scroll +      || latex +      || odt +      || manifest +      || pod +      || show_make +      || show_metadata +      || show_summary +      || source +      || source_or_pod +      || sqlite_discrete +      || sqlite_update +      || text +      || xhtml +    ) ? true : false; +  }    @trusted bool meta_processing_general() {      return (        opts["abstraction"] @@ -811,39 +832,71 @@ auto _env = [  ];  #+END_SRC -*** opt actions on processing files & file paths (pods, src etc.) +*** get/read site config  #+NAME: spine_args  #+BEGIN_SRC d  auto _manifested = PathMatters!()(_opt_action, _env, "");  auto _manifests = [ _manifested ]; -auto _conf_file_details = ConfigFilePaths!()(_manifested, _env, _opt_action.config_path_set); -ConfComposite _make_and_meta_struct; -if (_opt_action.config_path_set.empty) { +auto _conf_file_details = configFilePaths!()(_manifested, _env, _opt_action.config_path_set); +ConfComposite _config; +if ( +  _opt_action.require_processing_files +  && _opt_action.config_path_set.empty +) {    foreach(arg; args[1..$]) {      if (!(arg.match(rgx.flag_action))) { /+ cli markup source path +/ // get first input markup source file names for processing        _manifested = PathMatters!()(_opt_action, _env, arg);        { /+ local site config +/ -        _conf_file_details = ConfigFilePaths!()(_manifested, _env, _opt_action.config_path_set); -        auto _config_local_site_struct = readConfigSite!()(_conf_file_details); +        _conf_file_details = configFilePaths!()(_manifested, _env, _opt_action.config_path_set); +        auto _config_local_site_struct = readConfigSite!()(_conf_file_details, _opt_action);          import doc_reform.meta.conf_make_meta_yaml; -        _make_and_meta_struct = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_make_and_meta_struct, _manifested); // - get local site config +        _config = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_config, _manifested); // - get local site config          break;        }      }    } -} else { -  { /+ local site config +/ -    auto _config_local_site_struct = readConfigSite!()(_conf_file_details); -    import doc_reform.meta.conf_make_meta_yaml; -    _make_and_meta_struct = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_make_and_meta_struct, _manifested); // - get local site config +} else { /+ local site config +/ +  auto _config_local_site_struct = readConfigSite!()(_conf_file_details, _opt_action); +  import doc_reform.meta.conf_make_meta_yaml; +  _config = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_config, _manifested); // - get local site config +} +if (_opt_action.show_config) { +  import doc_reform.meta.metadoc_show_config; +  spineShowSiteConfig!()(_opt_action, _config); +} +#+END_SRC + +*** use config for operations that do not require file processing + +#+NAME: spine_args +#+BEGIN_SRC d +if (!(_opt_action.skip_output)) { +  if ((_opt_action.debug_do) +  || (_opt_action.very_verbose) +  ) { +    writeln("step0 commence → (without processing files)"); +  } +  outputHubOp!()(_env, _opt_action, _config); +  if ((_opt_action.debug_do) +  || (_opt_action.very_verbose) +  ) { +    writeln("- step0 complete");    }  } -foreach(arg; args[1..$]) { // refigure how args relate to _opt_action, need path from _opt_action or args early _manifested too late, work on (search for PathMatters and .harvest, -  auto _manifest_start = PodManifest!()(_opt_action, arg); +#+END_SRC + +*** opt action on processing files (loop args) + +#+NAME: spine_args +#+BEGIN_SRC d +ConfComposite _make_and_meta_struct = _config; +destroy(_config); +foreach(arg; args[1..$]) {    if (arg.match(rgx.flag_action)) { /+ cli instruction, flag do +/      flag_action ~= " " ~ arg;   // flags not taken by getopt -  } else { /+ cli, assumed to be path to source files +/ +  } else if (_opt_action.require_processing_files) { /+ cli, assumed to be path to source files +/ +    auto _manifest_start = PodManifest!()(_opt_action, arg);      if ( /+ pod files +/        !(arg.match(rgx.src_pth_sst_or_ssm))        && _manifest_start.pod_manifest_file_with_path @@ -1005,25 +1058,6 @@ foreach(arg; args[1..$]) { // refigure how args relate to _opt_action, need path  }  #+END_SRC -*** opt actions independent of processing files (no files no processing loop) - -#+NAME: spine_do_selected -#+BEGIN_SRC d -if (!(_opt_action.skip_output)) { -  if ((_opt_action.debug_do) -  || (_opt_action.very_verbose) -  ) { -    writeln("step0 commence → (without processing files)"); -  } -  outputHubOp!()(_env, _opt_action, _make_and_meta_struct); -  if ((_opt_action.debug_do) -  || (_opt_action.very_verbose) -  ) { -    writeln("- step0 complete"); -  } -} -#+END_SRC -  ** _2. processing: (loop each file)_ [+2]                          :loop:files:  *** scope (loop)                                                      :scope: @@ -1100,8 +1134,7 @@ if (doc_matters.opt.action.verbose  #+NAME: spine_each_file_do_debugs_checkdoc  #+BEGIN_SRC d  /+ ↓ debugs +/ -if (doc_matters.opt.action.show_metadata -) { +if (doc_matters.opt.action.show_metadata) {    import doc_reform.meta.metadoc_show_metadata;    spineShowMetaData!()(doc_matters);  } @@ -1113,8 +1146,7 @@ if (doc_matters.opt.action.show_metadata  #+NAME: spine_each_file_do_debugs_checkdoc  #+BEGIN_SRC d  /+ ↓ debugs +/ -if (doc_matters.opt.action.show_make -) { +if (doc_matters.opt.action.show_make) {    import doc_reform.meta.metadoc_show_make;    spineShowMake!()(doc_matters);  } @@ -1126,8 +1158,7 @@ if (doc_matters.opt.action.show_make  #+NAME: spine_each_file_do_debugs_checkdoc  #+BEGIN_SRC d  /+ ↓ debugs +/ -if (doc_matters.opt.action.show_config -) { +if (doc_matters.opt.action.show_config) {    import doc_reform.meta.metadoc_show_config;    spineShowConfig!()(doc_matters);  } @@ -1504,13 +1535,31 @@ struct DocumentMatters {    @safe auto sqlite() {      struct SQLite_ {        @safe string filename() { -        return _opt_action.sqlite_filename; +        string _fn = ""; +        if (_opt_action.sqlite_filename.length > 0) { +          _fn = _opt_action.sqlite_filename; +        } else if (_make_and_meta_struct.conf.w_srv_db_sqlite.length > 0) { +          _fn = _make_and_meta_struct.conf.w_srv_db_sqlite; +        } +        return _fn;        }        @safe string cgi_filename() { -        return _opt_action.cgi_sqlite_search_filename; +        string _fn = ""; +        if (_opt_action.cgi_sqlite_search_filename.length > 0) { +          _fn = _opt_action.cgi_sqlite_search_filename; +        } else if (_make_and_meta_struct.conf.w_srv_cgi_search_script.length > 0) { +          _fn = _make_and_meta_struct.conf.w_srv_cgi_search_script; +        } +        return _fn;        }        @safe string cgi_filename_d() { -        return _opt_action.cgi_sqlite_search_filename_d; +        string _fn = ""; +        if (_opt_action.cgi_sqlite_search_filename_d.length > 0) { +          _fn = _opt_action.cgi_sqlite_search_filename_d; +        } else if (_make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d.length > 0) { +          _fn = _make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d; +        } +        return _fn;        }      }      return SQLite_(); diff --git a/src/doc_reform/io_in/paths_source.d b/src/doc_reform/io_in/paths_source.d index 0cf0478..432b484 100644 --- a/src/doc_reform/io_in/paths_source.d +++ b/src/doc_reform/io_in/paths_source.d @@ -18,7 +18,7 @@ template PodManifest() {    mixin spineRgxIn;    static auto rgx = RgxI();    @safe auto PodManifest(O)( -    O       _opt_actions, +    O       _opt_action,      string  _pth=""    ) {      struct ManifestFile_ { @@ -40,10 +40,10 @@ template PodManifest() {              _manifest_path = m.captures["podpath"];            }          } else  { -          if (_opt_actions.verbose || _opt_actions.very_verbose || _opt_actions.debug_do) { +          if (_opt_action.verbose || _opt_action.very_verbose || _opt_action.debug_do) {              writeln("WARNING, src is not a pod, issue with manifest_path: ", _pth); // remove? unless can distinguish pod            } -          _manifest_path = null; // _manifest_path = ""; +          _manifest_path = "";          }          return _manifest_path;        } @@ -73,13 +73,13 @@ template PathMatters() {    static auto rgx  = RgxI();    static auto mkup = InlineMarkup();    @safe auto PathMatters(O,E)( -    O        _opt_actions, +    O        _opt_action,      E        _env,      string   _pth,      string   _fns              = "",      char[][] _manifest_fn_list = [[]],    ) { -    @safe auto _manifested = PodManifest!()(_opt_actions, _pth); +    @safe auto _manifested = PodManifest!()(_opt_action, _pth);      struct ManifestMatters_ {        auto env() {          auto _env = _env; @@ -96,7 +96,7 @@ template PathMatters() {        @safe auto opt() {          struct Opt_ {            auto action() { -            return _opt_actions; +            return _opt_action;            }          }          return Opt_(); @@ -155,7 +155,7 @@ template PathMatters() {        }        @safe auto src() {          string _fns = _fns; // required here by dmd & not by ldc (for D:2078) -        auto _opt_actions = _opt_actions; +        auto _opt_action = _opt_action;          auto _env = _env;          struct SRC_ {            @safe bool is_pod() { @@ -270,7 +270,7 @@ template PathMatters() {                assert(_dir == absolute_path_to_src                  .match(rgx.src_base_parent_dir_name).captures["dir"]);              } -            if (_opt_actions.debug_do) { +            if (_opt_action.debug_do) {                writeln("--> (base_dir)  ", _dir);              }              return _dir; @@ -302,7 +302,7 @@ template PathMatters() {              } else {                _dir = ((path_and_fn.chainPath("../../")).asNormalizedPath).array;              } -            if (_opt_actions.debug_do) { +            if (_opt_action.debug_do) {                writeln("--> (base_dir_path) ", _dir);              }              return _dir; @@ -348,7 +348,7 @@ template PathMatters() {              } else {                _dir = (absolute_path_to_src).match(rgx.src_base_parent_dir_name).captures["dir"];              } -            if (_opt_actions.debug_do) { +            if (_opt_action.debug_do) {                writeln("--> (base_parent_dir) ", _dir);              }              return _dir; @@ -384,10 +384,10 @@ template PathMatters() {          struct Out_ {            @safe auto path() {              auto _output_path = _env["pwd"]; -            if ((_opt_actions.output_dir_set.length > 0) -              && isValidPath(_opt_actions.output_dir_set) +            if ((_opt_action.output_dir_set.length > 0) +              && isValidPath(_opt_action.output_dir_set)              ) { -              _output_path = ((_opt_actions.output_dir_set).asNormalizedPath).array; +              _output_path = ((_opt_action.output_dir_set).asNormalizedPath).array;                if (!exists(_output_path)) {                  try {                    _output_path.mkdirRecurse; @@ -409,10 +409,10 @@ template PathMatters() {      return ManifestMatters_();    }  } -template ConfigFilePaths() { +template configFilePaths() {    mixin spineRgxIn;    static auto rgx = RgxI(); -  @safe auto ConfigFilePaths(M,E)( +  @safe auto configFilePaths(M,E)(      M      _manifested,      E      _env,      string _cli_config_path_set = "" @@ -465,10 +465,9 @@ template ConfigFilePaths() {                    _dr_doc_conf_pwd_d,                  ];                } -            } else { -              _possible_config_path_locations = [ -                _cli_config_path_set -              ]; +            } else if (_cli_config_path_set.isDir) { +               _possible_config_path_locations = [_cli_config_path_set ]; +            // } else if (_cli_config_path_set.isFile) { // use file, taken care of elsewhere              }              /+ FIX clean up conf paths ↑              (compare pwd to doc path location, and build config path) @@ -490,10 +489,10 @@ template ConfigFilePaths() {                  _possible_config_path_locations = [                    _dot_pwd,                    _underscore_pwd, +                  _collection_root_a, +                  _collection_root_b,                    _dot_home,                    "/etc/dr", -                  _collection_root_a, // set priority higher? -                  _collection_root_b  // set priority higher?                  ];                } else {                  /+ config document (& or local site) on filesystem +/ diff --git a/src/doc_reform/io_in/read_config_files.d b/src/doc_reform/io_in/read_config_files.d index 69c2f55..9180c20 100644 --- a/src/doc_reform/io_in/read_config_files.d +++ b/src/doc_reform/io_in/read_config_files.d @@ -12,7 +12,7 @@ import    doc_reform.meta.rgx;  template readConfigSite() { -  @system final auto readConfigSite(C)(C _conf_file_details) { +  @system final auto readConfigSite(C,O)(C _conf_file_details, O _opt_action) {      mixin spineRgxIn;      static auto rgx = RgxI();      string conf_filename = "NONE"; @@ -70,6 +70,9 @@ webserv:            try {              if (exists(conf_file)) {                if (conf_file.getLinkAttributes.attrIsFile) { +                if (_opt_action.verbose || _opt_action.very_verbose || _opt_action.debug_do) { +                  writeln("config file used: \"", conf_file, "\" (cli flag settings override config file's individual settings)"); +                }                  config_file_str = conf_file.readText;                  break;                } @@ -93,7 +96,7 @@ webserv:          config_file_str = default_config_file_str;        }      } -    if (config_file_str.length == 0) { /+ create dummy default config file +/ +    if (config_file_str.length == 0) { /+ use dummy default config file +/        writeln("WARNING config file NOT found, default provided");        conf_filename = "VIRTUAL";        config_file_str = default_config_file_str; @@ -128,7 +131,7 @@ static template readConfigDoc() {      static auto rgx = RgxI();      string config_file_str;      string conf_filename = "NONE"; -    auto _conf_file_details = ConfigFilePaths!()(_manifested, _env); +    auto _conf_file_details = configFilePaths!()(_manifested, _env);      string[] possible_config_path_locations = _conf_file_details.possible_config_path_locations.dr_document_make;      foreach(conf_fn; [_conf_file_details.config_filename_document]) {        foreach(pth; possible_config_path_locations) { @@ -176,7 +179,7 @@ static template configReadSiteYAML() {      doc_reform.io_in.paths_source;    @safe final YAMLDocument configReadSiteYAML(M,E)(M _manifested, E _env) {      string _configuration = configReadInSiteYAML!()(_manifested, _env); -    auto _conf_file_details = ConfigFilePaths!()(_manifested, _env); +    auto _conf_file_details = configFilePaths!()(_manifested, _env);      string _conf_yaml_fn = _conf_file_details.config_filename_site;      YAMLDocument _yaml_conf = configYAML!()(_configuration, _conf_yaml_fn);      return _yaml_conf; @@ -190,7 +193,7 @@ static template configReadDocYAML() {      doc_reform.io_in.paths_source;    @safe final YAMLDocument configReadDocYAML(M,E)(M _manifested, E _env) {      string _configuration = configReadInDocYAML!()(_manifested, _env); -    auto _conf_file_details = ConfigFilePaths!()(_manifested, _env); +    auto _conf_file_details = configFilePaths!()(_manifested, _env);      string _conf_yaml_fn = _conf_file_details.config_filename_document;      YAMLDocument _yaml_conf = configYAML!()(_configuration, _conf_yaml_fn);      return _yaml_conf; diff --git a/src/doc_reform/io_out/hub.d b/src/doc_reform/io_out/hub.d index 50ee897..2220d33 100644 --- a/src/doc_reform/io_out/hub.d +++ b/src/doc_reform/io_out/hub.d @@ -115,7 +115,7 @@ template outputHubOp() {      doc_reform.io_out.xmls,      doc_reform.io_out.create_zip_file,      doc_reform.io_out.paths_output; -  @system void outputHubOp(E,O,M)(E env, O opt_action, M make_and_meta_struct) { +  @system void outputHubOp(E,O,C)(E env, O opt_action, C config) {      mixin spineRgxOut;      static auto rgx = RgxO();      if ((opt_action.sqlite_db_drop)) { @@ -123,7 +123,7 @@ template outputHubOp() {          writeln("sqlite drop db...");        }        import doc_reform.io_out.sqlite; -      SQLiteDbDrop!()(opt_action); +      SQLiteDbDrop!()(opt_action, config);        if ((opt_action.very_verbose)) {          writeln("sqlite drop db done");        } @@ -134,7 +134,7 @@ template outputHubOp() {          writeln("sqlite create table...");        }        import doc_reform.io_out.sqlite; -      SQLiteTablesCreate!()(env, opt_action); +      SQLiteTablesCreate!()(env, opt_action, config);        if ((opt_action.very_verbose)) {          writeln("sqlite create table done");        } @@ -142,20 +142,20 @@ template outputHubOp() {      if ((opt_action.cgi_search_form_codegen)) {        if ((opt_action.verbose)) {          string _sqlite_db_fn = (opt_action.sqlite_filename.empty) -          ? make_and_meta_struct.conf.w_srv_db_sqlite +          ? config.conf.w_srv_db_sqlite            : opt_action.sqlite_filename;          string _cgi_search_script = (opt_action.cgi_sqlite_search_filename.empty) -          ? make_and_meta_struct.conf.w_srv_cgi_search_script +          ? config.conf.w_srv_cgi_search_script            : opt_action.cgi_sqlite_search_filename;          string _cgi_search_script_raw_fn_d = (opt_action.cgi_sqlite_search_filename_d.empty) -          ? make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d +          ? config.conf.w_srv_cgi_search_script_raw_fn_d            : opt_action.cgi_sqlite_search_filename_d;          auto pth_sqlite_cgi = spinePathsSQLiteCGI!()(_cgi_search_script_raw_fn_d, _cgi_search_script, opt_action.output_dir_set);          writeln("sqlite cgi search form...");          writeln(" ", pth_sqlite_cgi.search_form_path_out);        }        import doc_reform.io_out.cgi_sqlite_search_form; -      CGIsearchSQLite!()(env, opt_action, make_and_meta_struct); +      CGIsearchSQLite!()(env, opt_action, config);        if ((opt_action.very_verbose)) {          writeln("sqlite cgi search form done");        } diff --git a/src/doc_reform/io_out/rgx.d b/src/doc_reform/io_out/rgx.d index 5024319..e98f118 100644 --- a/src/doc_reform/io_out/rgx.d +++ b/src/doc_reform/io_out/rgx.d @@ -51,8 +51,8 @@ static template spineRgxOut() {      static inline_link_number                             = ctRegex!(`┥(?P<text>.+?)┝┤(?P<num>[0-9]+)├`, "mg"); // not used      static inline_link_number_only                        = ctRegex!(`(?P<linked_text>┥.+?┝)┤(?P<num>[0-9]+)├`, "mg");      static inline_link_stow_uri                           = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>[^ 0-9#┥┝┤├][^ 0-9┥┝┤├]+)├`, "mg"); // will not stow (stowed links) or object number internal links -    static inline_link_hash                               = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>#(?P<segname>\S+?))├`, "mg"); -    static inline_link_seg_and_hash                       = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>[^/]+?#(?P<segname>.+?))├`, "mg"); +    static inline_link_hash                               = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>#(?P<hash>\S+?))├`, "mg"); +    static inline_link_seg_and_hash                       = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>(?P<seg>[^/#├]*)#(?P<hash>.+?))├`, "mg");      static inline_link_clean                              = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");      static inline_link_toc_to_backmatter                  = ctRegex!(`┤#(?P<link>endnotes|bibliography|bookindex|glossary|blurb)├`, "mg");      static url                                            = ctRegex!(`https?://`, "mg"); diff --git a/src/doc_reform/io_out/sqlite.d b/src/doc_reform/io_out/sqlite.d index 392d8b0..99a6b5d 100644 --- a/src/doc_reform/io_out/sqlite.d +++ b/src/doc_reform/io_out/sqlite.d @@ -301,9 +301,9 @@ template SQLiteFormatAndLoadObject() {            }            auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language);            if (_xml_type == "seg") { -            foreach (m; _txt.match(rgx.inline_link_seg_and_hash)) { -              if (m.captures["segname"] in doc_matters.has.tag_associations) { -                if (m.captures["segname"] == doc_matters.has.tag_associations[(m.captures["segname"])]["seg_lv4"]) { +            foreach (m; _txt.matchAll(rgx.inline_link_seg_and_hash)) { +              if (m.captures["hash"] in doc_matters.has.tag_associations) { +                if (m.captures["hash"] == doc_matters.has.tag_associations[(m.captures["hash"])]["seg_lv4"]) {                    _txt = _txt.replaceFirst(                      rgx.inline_link_seg_and_hash,                      "┥$1┝┤" @@ -320,9 +320,9 @@ template SQLiteFormatAndLoadObject() {                        ~ "/"                        ~ doc_matters.src.filename_base                        ~ "/" -                      ~ doc_matters.has.tag_associations[(m.captures["segname"])]["seg_lv4"] +                      ~ doc_matters.has.tag_associations[(m.captures["hash"])]["seg_lv4"]                        ~ ".html" -                      ~ "#" ~ "$3" +                      ~ "#" ~ m.captures["hash"]                      ~ "├"                    );                  } @@ -330,9 +330,9 @@ template SQLiteFormatAndLoadObject() {                  if (!(doc_matters.opt.action.quiet)) {                    writeln(                      "WARNING on internal document links, anchor to link <<" -                     ~ m.captures["segname"] +                     ~ m.captures["hash"]                       ~ ">> not found in document, " -                     ~ "anchor: " ~ m.captures["segname"] +                     ~ "anchor: " ~ m.captures["hash"]                       ~ " document: " ~ doc_matters.src.filename                    );                  } @@ -346,7 +346,7 @@ template SQLiteFormatAndLoadObject() {                    ~ doc_matters.conf_make_meta.conf.w_srv_data_root_url_html                    ~ "/"                    ~ pth_html.tail_fn_scroll(doc_matters.src.filename) -                  ~ "#" ~ "$3" +                  ~ "#" ~ m.captures["hash"]                  ~ "├"                );              } @@ -1143,7 +1143,6 @@ template SQLiteInsertMetadata() {        SQLinsertDelimiter!()(doc_matters.conf_make_meta.conf.w_srv_data_root_url_html)      );      if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) { -            string _insert_topics;        foreach (topic; doc_matters.conf_make_meta.meta.classify_topic_register_arr) {          string[] subject_tree = topic.split(mkup.sep); @@ -1386,7 +1385,7 @@ template SQLiteInsertDocObjectsLoop() {    }  }  template SQLiteTablesCreate() { -  void SQLiteTablesCreate(E,O)(E env, O opt_action) { +  void SQLiteTablesCreate(E,O,C)(E env, O opt_action, C config) {      import d2sqlite3;      template SQLiteTablesReCreate() {        string SQLiteTablesReCreate()() { @@ -1545,26 +1544,61 @@ template SQLiteTablesCreate() {      }      if (opt_action.sqlite_db_create) {        string _db_statement; -      auto pth_sqlite = spinePathsSQLite!()(opt_action.sqlite_filename, opt_action.output_dir_set); -      pth_sqlite.base.mkdirRecurse; -      auto db = Database(pth_sqlite.sqlite_file); -      { -        _db_statement ~= SQLiteTablesReCreate!()(); +      string db_filename = (opt_action.sqlite_filename.length > 0) +      ? opt_action.sqlite_filename +      : (config.conf.w_srv_db_sqlite.length > 0) +        ? config.conf.w_srv_db_sqlite +        : ""; +      string output_path = (opt_action.output_dir_set.length > 0) +      ? opt_action.output_dir_set +      : (config.conf.output_path.length > 0) +        ? config.conf.output_path +        : ""; +      if (db_filename.length > 0 && output_path.length > 0) { +        if ((opt_action.verbose)) { +          writeln("db name & path: ", config.conf.output_path, "/sqlite/", db_filename); +        } +        auto pth_sqlite = spinePathsSQLite!()(db_filename, output_path); +        pth_sqlite.base.mkdirRecurse; +        auto db = Database(pth_sqlite.sqlite_file); +        { +          _db_statement ~= SQLiteTablesReCreate!()(); +        } +        SQLiteDbRun!()(db, _db_statement, opt_action, "TABLE RE-CREATE"); +      } else { +        writeln("must provide db name & output root path either on the command line or in configuration file"); +        writeln("db name: ", db_filename); +        writeln("output root path (path less /sqlite which is added: ", config.conf.output_path);        } -      SQLiteDbRun!()(db, _db_statement, opt_action, "TABLE RE-CREATE");      }    }  }  template SQLiteDbDrop() { -  void SQLiteDbDrop(O)(O opt_action) { +  void SQLiteDbDrop(O,C)(O opt_action, C config) {      writeln("db drop");      if ((opt_action.sqlite_db_drop)) { -      auto pth_sqlite = spinePathsSQLite!()(opt_action.sqlite_filename, opt_action.output_dir_set); -      writeln("remove(", pth_sqlite.sqlite_file, ")"); -      try { -        remove(pth_sqlite.sqlite_file); -      } catch (FileException ex) { -        // handle error +      string db_filename = (opt_action.sqlite_filename.length > 0) +      ? opt_action.sqlite_filename +      : (config.conf.w_srv_db_sqlite.length > 0) +        ? config.conf.w_srv_db_sqlite +        : ""; +      string output_path = (opt_action.output_dir_set.length > 0) +      ? opt_action.output_dir_set +      : (config.conf.output_path.length > 0) +        ? config.conf.output_path +        : ""; +      if (db_filename.length > 0 && output_path.length > 0) { +        auto pth_sqlite = spinePathsSQLite!()(db_filename, output_path); +        writeln("remove(", pth_sqlite.sqlite_file, ")"); +        try { +          remove(pth_sqlite.sqlite_file); +        } catch (FileException ex) { +          // handle error +        } +      } else { +        writeln("must provide db name & output root path either on the command line or in configuration file"); +        writeln("db name: ", db_filename); +        writeln("output root path (path less /sqlite which is added: ", config.conf.output_path);        }      }    } diff --git a/src/doc_reform/io_out/xmls.d b/src/doc_reform/io_out/xmls.d index 7649d40..c13d31f 100644 --- a/src/doc_reform/io_out/xmls.d +++ b/src/doc_reform/io_out/xmls.d @@ -364,10 +364,10 @@ template outputXHTMLs() {          if (_xml_type == "seg" || _xml_type == "epub") {            seg_lvs = (_xml_type == "epub") ? "seg_lv1_to_4" : "seg_lv4";            foreach (m; _txt.match(rgx.inline_link_hash)) { -            if (m.captures[3] in doc_matters.has.tag_associations) { +            if (m.captures["hash"] in doc_matters.has.tag_associations) {                if ( -                m.captures[3] -                == doc_matters.has.tag_associations[(m.captures[3])][seg_lvs] +                m.captures["hash"] +                == doc_matters.has.tag_associations[(m.captures["hash"])][seg_lvs]                ) {                  _txt = _txt.replaceFirst(                    rgx.inline_link_hash, @@ -377,7 +377,7 @@ template outputXHTMLs() {                  _txt = _txt.replaceFirst(                    rgx.inline_link_hash,                    "┥$1┝┤" -                  ~ doc_matters.has.tag_associations[(m.captures[3])][seg_lvs] +                  ~ doc_matters.has.tag_associations[(m.captures["hash"])][seg_lvs]                    ~ _suffix ~ "#" ~ "$3"                    ~ "├"                  ); @@ -386,9 +386,9 @@ template outputXHTMLs() {                if (!(doc_matters.opt.action.quiet)) {                  writeln(                    "WARNING on internal document links, anchor to link <<" -                   ~ m.captures[3] +                   ~ m.captures["hash"]                     ~ ">> not found in document, " -                   ~ "anchor: " ~ m.captures[3] +                   ~ "anchor: " ~ m.captures["hash"]                     ~ " document: " ~ doc_matters.src.filename                  );                } diff --git a/src/doc_reform/meta/metadoc.d b/src/doc_reform/meta/metadoc.d index cf74e23..5c45c96 100644 --- a/src/doc_reform/meta/metadoc.d +++ b/src/doc_reform/meta/metadoc.d @@ -184,13 +184,31 @@ template spineAbstraction() {        @safe auto sqlite() {          struct SQLite_ {            @safe string filename() { -            return _opt_action.sqlite_filename; +            string _fn = ""; +            if (_opt_action.sqlite_filename.length > 0) { +              _fn = _opt_action.sqlite_filename; +            } else if (_make_and_meta_struct.conf.w_srv_db_sqlite.length > 0) { +              _fn = _make_and_meta_struct.conf.w_srv_db_sqlite; +            } +            return _fn;            }            @safe string cgi_filename() { -            return _opt_action.cgi_sqlite_search_filename; +            string _fn = ""; +            if (_opt_action.cgi_sqlite_search_filename.length > 0) { +              _fn = _opt_action.cgi_sqlite_search_filename; +            } else if (_make_and_meta_struct.conf.w_srv_cgi_search_script.length > 0) { +              _fn = _make_and_meta_struct.conf.w_srv_cgi_search_script; +            } +            return _fn;            }            @safe string cgi_filename_d() { -            return _opt_action.cgi_sqlite_search_filename_d; +            string _fn = ""; +            if (_opt_action.cgi_sqlite_search_filename_d.length > 0) { +              _fn = _opt_action.cgi_sqlite_search_filename_d; +            } else if (_make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d.length > 0) { +              _fn = _make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d; +            } +            return _fn;            }          }          return SQLite_(); diff --git a/src/doc_reform/meta/metadoc_show_config.d b/src/doc_reform/meta/metadoc_show_config.d index 630fe0c..c642cb9 100644 --- a/src/doc_reform/meta/metadoc_show_config.d +++ b/src/doc_reform/meta/metadoc_show_config.d @@ -1,4 +1,89 @@  module doc_reform.meta.metadoc_show_config; +template spineShowSiteConfig() { +  @safe void spineShowSiteConfig(O,T)( +    O opt_action, +    T config, +  ) { +    import +      doc_reform.meta.defaults, +      doc_reform.meta.rgx; +    import +      std.array, +      std.exception, +      std.regex, +      std.stdio, +      std.string, +      std.typecons, +      std.uni, +      std.utf, +      std.conv : to; +    mixin InternalMarkup; +    auto markup = InlineMarkup(); +    auto char_repeat_number = 66; +    if (opt_action.show_config) { +      writefln( +        "\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n", +        markup.repeat_character_by_number_provided("-", char_repeat_number), +        "- webserv domain name:", +        config.conf.w_srv_domain, +        "- webserv doc root (part):", +        config.conf.w_srv_data_root_part, +        "- webserv doc path:", +        config.conf.w_srv_data_root_path, +        "- webserv images (location):", +        config.conf.w_srv_images_root_part, +        "- webserv doc root url:", +        config.conf.w_srv_data_root_url, +        "- webserv cgi domain (host):", +        config.conf.w_srv_cgi_domain, +        "- webserv cgi host path:", +        config.conf.w_srv_cgi_bin_path, +        "- webserv cgi host (part):", +        config.conf.w_srv_cgi_bin_part, +        "- webserv cgi search script:", +        config.conf.w_srv_cgi_search_script, +        "- webserv cgi search script in d:", +        config.conf.w_srv_cgi_search_script_raw_fn_d, +        "- webserv cgi port:", +        config.conf.w_srv_cgi_port, +        "- webserv cgi user:", +        config.conf.w_srv_cgi_user, +        "- webserv cgi url:", +        config.conf.w_srv_cgi_bin_url, +        "- webserv cgi action:", +        config.conf.w_srv_cgi_action, +        // "- webserv cgi file links:", +        // config.conf.w_srv_cgi_file_links, +        "- webserv sqlite db:", +        config.conf.w_srv_db_sqlite, +        "- output path:", +        config.conf.output_path, +        "- processing concordance max:", +        config.conf.processing_concord_max, +        // "- flag act0:", +        // config.conf.flag_act0, +        "- default papersize:", +        config.conf.default_papersize, +        "- default text wrap:", +        config.conf.default_text_wrap, +        "- default emphasis markup symbol:", +        config.conf.default_emphasis, +        "- default language:", +        config.conf.default_language, +        "- default hash digest:", +        config.conf.default_digest, +        "- search flag:", +        config.conf.search_flag, +        "- search action:", +        config.conf.search_action, +        "- search db:", +        config.conf.search_db, +        "- search title:", +        config.conf.search_title, +      ); +    } +  } +}  template spineShowConfig() {    @safe void spineShowConfig(T)(      T  doc_matters, @@ -31,7 +116,7 @@ template spineShowConfig() {      }      if (doc_matters.opt.action.show_config) {        writefln( -        "%s\n\"%s\", %s\n%s\n%s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n", +        "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",          markup.repeat_character_by_number_provided("-", char_repeat_number),          doc_matters.conf_make_meta.meta.title_full,          doc_matters.conf_make_meta.meta.creator_author, @@ -73,26 +158,8 @@ template spineShowConfig() {          doc_matters.conf_make_meta.conf.output_path,          "- processing concordance max:",          doc_matters.conf_make_meta.conf.processing_concord_max, -        "- flag act0:", -        doc_matters.conf_make_meta.conf.flag_act0, -        "- flag act1:", -        doc_matters.conf_make_meta.conf.flag_act1, -        "- flag act2:", -        doc_matters.conf_make_meta.conf.flag_act2, -        "- flag act3:", -        doc_matters.conf_make_meta.conf.flag_act3, -        "- flag act4:", -        doc_matters.conf_make_meta.conf.flag_act4, -        "- flag act5:", -        doc_matters.conf_make_meta.conf.flag_act5, -        "- flag act6:", -        doc_matters.conf_make_meta.conf.flag_act6, -        "- flag act7:", -        doc_matters.conf_make_meta.conf.flag_act7, -        "- flag act8:", -        doc_matters.conf_make_meta.conf.flag_act8, -        "- flag act9:", -        doc_matters.conf_make_meta.conf.flag_act9, +        // "- flag act0:", +        // doc_matters.conf_make_meta.conf.flag_act0,          "- default papersize:",          doc_matters.conf_make_meta.conf.default_papersize,          "- default text wrap:", diff --git a/src/doc_reform/meta/metadoc_show_make.d b/src/doc_reform/meta/metadoc_show_make.d index 854552a..ea533d0 100644 --- a/src/doc_reform/meta/metadoc_show_make.d +++ b/src/doc_reform/meta/metadoc_show_make.d @@ -31,7 +31,7 @@ template spineShowMake() {      }      if (doc_matters.opt.action.show_make) {        writefln( -        "%s\n\"%s\", %s\n%s\n%s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n", +        "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",          markup.repeat_character_by_number_provided("-", char_repeat_number),          doc_matters.conf_make_meta.meta.title_full,          doc_matters.conf_make_meta.meta.creator_author, diff --git a/src/doc_reform/meta/metadoc_show_metadata.d b/src/doc_reform/meta/metadoc_show_metadata.d index 05758b6..f7068c3 100644 --- a/src/doc_reform/meta/metadoc_show_metadata.d +++ b/src/doc_reform/meta/metadoc_show_metadata.d @@ -31,7 +31,7 @@ template spineShowMetaData() {      }      if (doc_matters.opt.action.show_metadata) {        writefln( -        "%s\n\"%s\", %s\n%s\n%s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n%30-s%10-s\n", +        "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",          markup.repeat_character_by_number_provided("-", char_repeat_number),          doc_matters.conf_make_meta.meta.title_full,          doc_matters.conf_make_meta.meta.creator_author, diff --git a/src/doc_reform/meta/metadoc_show_summary.d b/src/doc_reform/meta/metadoc_show_summary.d index f774a6d..2c2202c 100644 --- a/src/doc_reform/meta/metadoc_show_summary.d +++ b/src/doc_reform/meta/metadoc_show_summary.d @@ -52,7 +52,7 @@ template spineMetaDocSummary() {          }        }        writefln( -        "%s\n\"%s\", %s\n%s [%s]\n%s\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%s", +        "%s\n\"%s\", %s\n%s [%s]\n%s\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%s",          markup.repeat_character_by_number_provided("-", char_repeat_number),          doc_matters.conf_make_meta.meta.title_full,          doc_matters.conf_make_meta.meta.creator_author, diff --git a/src/doc_reform/meta/rgx.d b/src/doc_reform/meta/rgx.d index d4dd201..a5a153e 100644 --- a/src/doc_reform/meta/rgx.d +++ b/src/doc_reform/meta/rgx.d @@ -217,8 +217,8 @@ static template spineRgxIn() {      static inline_link_number                             = ctRegex!(`┥(?P<text>.+?)┝┤(?P<num>[0-9]+)├`, "mg"); // not used      static inline_link_number_only                        = ctRegex!(`(?P<linked_text>┥.+?┝)┤(?P<num>[0-9]+)├`, "mg");      static inline_link_stow_uri                           = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>[^ 0-9#┥┝┤├][^ 0-9┥┝┤├]+)├`, "mg"); // will not stow (stowed links) or object number internal links -    static inline_link_hash                               = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>#(?P<segname>\S+?))├`, "mg"); -    static inline_link_seg_and_hash                       = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>[^/]+?#(?P<segname>.+?))├`, "mg"); +    static inline_link_hash                               = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>#(?P<hash>\S+?))├`, "mg"); +    static inline_link_seg_and_hash                       = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>(?P<seg>[^/#├]*)#(?P<hash>.+?))├`, "mg");      static inline_link_clean                              = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");      static inline_link_toc_to_backmatter                  = ctRegex!(`┤#(?P<link>endnotes|bibliography|bookindex|glossary|blurb)├`, "mg");      static url                                            = ctRegex!(`https?://`, "mg"); diff --git a/src/doc_reform/spine.d b/src/doc_reform/spine.d index 3a64726..7539149 100755 --- a/src/doc_reform/spine.d +++ b/src/doc_reform/spine.d @@ -184,7 +184,9 @@ string program_name = "spine";      "abstraction",                "--abstraction document abstraction ",                                      &opts["abstraction"],      "assert",                     "--assert set optional assertions on",                                      &opts["assertions"],      "cgi-search-form-codegen",    "--cgi-search-form-codegen pre-compiled d code search of specified db",     &opts["cgi-search-form-codegen"], +    "cgi-sqlite-search-filename", "--cgi-sqlite-search-filename=[filename]",                                  &settings["cgi-sqlite-search-filename"],      "concordance",                "--concordance file for document",                                          &opts["concordance"], +    "config",                     "--config=/path/to/config/file/including/filename",                         &settings["config"],      "dark",                       "--dark alternative dark theme",                                            &opts["dark"],      "debug",                      "--debug",                                                                  &opts["debug"],      "digest",                     "--digest hash digest for each object",                                     &opts["digest"], @@ -197,6 +199,7 @@ string program_name = "spine";      "html-link-search",           "--html-link-search html embedded search submission",                       &opts["html-link-search"],      "html-seg",                   "--html-seg process html output",                                           &opts["html-seg"],      "html-scroll",                "--html-seg process html output",                                           &opts["html-scroll"], +    "lang",                       "--lang=[lang code e.g. =en or =en,es]",                                    &settings["lang"],      "latex",                      "--latex output for pdfs",                                                  &opts["latex"],      "latex-color-links",          "--latex-color-links mono or color links for pdfs",                         &opts["latex-color-links"],      "light",                      "--light default light theme",                                              &opts["light"], @@ -205,8 +208,9 @@ string program_name = "spine";      "ocn-off",                    "--ocn-off object cite numbers",                                            &opts["ocn-off"],      "odf",                        "--odf open document format text (--odt)",                                  &opts["odf"],      "odt",                        "--odt open document format text",                                          &opts["odt"], +    "output",                     "--output=/path/to/output/dir specify where to place output",               &settings["output"],      "parallel",                   "--parallel parallelisation",                                               &opts["parallel"], -    "parallel-subprocesses",      "--parallel-subprocesses nested parallelisation",                        &opts["parallel-subprocesses"], +    "parallel-subprocesses",      "--parallel-subprocesses nested parallelisation",                           &opts["parallel-subprocesses"],      "quiet|q",                    "--quiet output to terminal",                                               &opts["quiet"],      "pdf",                        "--pdf latex output for pdfs",                                              &opts["pdf"],      "pdf-color-links",            "--pdf-color-links mono or color links for pdfs",                           &opts["pdf-color-links"], @@ -236,16 +240,12 @@ string program_name = "spine";      "section-biblio",             "--section-biblio process document biblio (default)",                       &opts["section_biblio"],      "section-bookindex",          "--section-bookindex process document bookindex (default)",                 &opts["section_bookindex"],      "section-blurb",              "--section-blurb process document blurb (default)",                         &opts["section_blurb"], +    "sqlite-db-filename",         "--sqlite-db-filename=[filename].sql.db",                                      &settings["sqlite-filename"],      "backmatter",                 "--section-backmatter process document backmatter (default)",               &opts["backmatter"],      "skip-output",                "--skip-output",                                                            &opts["skip-output"],      "theme-dark",                 "--theme-dark alternative dark theme",                                      &opts["theme-dark"],      "theme-light",                "--theme-light default light theme",                                        &opts["theme-light"],      "workon",                     "--workon (reserved for some matters under development & testing)",         &opts["workon"], -    "cgi-sqlite-search-filename", "--cgi-sqlite-search-filename=[filename]",                         &settings["cgi-sqlite-search-filename"], -    "config",                     "--config=/path/to/config/file/including/filename",                         &settings["config"], -    "output",                     "--output=/path/to/output/dir specify where to place output",               &settings["output"], -    "sqlite-db-filename",         "--sqlite-db-filename=[filename].sql.db",                                      &settings["sqlite-db-filename"], -    "lang",                       "--lang=[lang code e.g. =en or =en,es]",                                    &settings["lang"],    );    if (helpInfo.helpWanted) {      defaultGetoptPrinter("Some information about the program.", helpInfo.options); @@ -505,6 +505,28 @@ string program_name = "spine";          || sqlite_update        ) ? true : false;      } +    @trusted bool require_processing_files() { +      return ( +        opts["abstraction"] +        || epub +        || html +        || html_seg +        || html_scroll +        || latex +        || odt +        || manifest +        || pod +        || show_make +        || show_metadata +        || show_summary +        || source +        || source_or_pod +        || sqlite_discrete +        || sqlite_update +        || text +        || xhtml +      ) ? true : false; +    }      @trusted bool meta_processing_general() {        return (          opts["abstraction"] @@ -556,33 +578,53 @@ string program_name = "spine";    ];    auto _manifested = PathMatters!()(_opt_action, _env, "");    auto _manifests = [ _manifested ]; -  auto _conf_file_details = ConfigFilePaths!()(_manifested, _env, _opt_action.config_path_set); -  ConfComposite _make_and_meta_struct; -  if (_opt_action.config_path_set.empty) { +  auto _conf_file_details = configFilePaths!()(_manifested, _env, _opt_action.config_path_set); +  ConfComposite _config; +  if ( +    _opt_action.require_processing_files +    && _opt_action.config_path_set.empty +  ) {      foreach(arg; args[1..$]) {        if (!(arg.match(rgx.flag_action))) { /+ cli markup source path +/ // get first input markup source file names for processing          _manifested = PathMatters!()(_opt_action, _env, arg);          { /+ local site config +/ -          _conf_file_details = ConfigFilePaths!()(_manifested, _env, _opt_action.config_path_set); -          auto _config_local_site_struct = readConfigSite!()(_conf_file_details); +          _conf_file_details = configFilePaths!()(_manifested, _env, _opt_action.config_path_set); +          auto _config_local_site_struct = readConfigSite!()(_conf_file_details, _opt_action);            import doc_reform.meta.conf_make_meta_yaml; -          _make_and_meta_struct = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_make_and_meta_struct, _manifested); // - get local site config +          _config = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_config, _manifested); // - get local site config            break;          }        }      } -  } else { -    { /+ local site config +/ -      auto _config_local_site_struct = readConfigSite!()(_conf_file_details); -      import doc_reform.meta.conf_make_meta_yaml; -      _make_and_meta_struct = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_make_and_meta_struct, _manifested); // - get local site config +  } else { /+ local site config +/ +    auto _config_local_site_struct = readConfigSite!()(_conf_file_details, _opt_action); +    import doc_reform.meta.conf_make_meta_yaml; +    _config = _config_local_site_struct.configParseYAMLreturnSpineStruct!()(_config, _manifested); // - get local site config +  } +  if (_opt_action.show_config) { +    import doc_reform.meta.metadoc_show_config; +    spineShowSiteConfig!()(_opt_action, _config); +  } +  if (!(_opt_action.skip_output)) { +    if ((_opt_action.debug_do) +    || (_opt_action.very_verbose) +    ) { +      writeln("step0 commence → (without processing files)"); +    } +    outputHubOp!()(_env, _opt_action, _config); +    if ((_opt_action.debug_do) +    || (_opt_action.very_verbose) +    ) { +      writeln("- step0 complete");      }    } -  foreach(arg; args[1..$]) { // refigure how args relate to _opt_action, need path from _opt_action or args early _manifested too late, work on (search for PathMatters and .harvest, -    auto _manifest_start = PodManifest!()(_opt_action, arg); +  ConfComposite _make_and_meta_struct = _config; +  destroy(_config); +  foreach(arg; args[1..$]) {      if (arg.match(rgx.flag_action)) { /+ cli instruction, flag do +/        flag_action ~= " " ~ arg;   // flags not taken by getopt -    } else { /+ cli, assumed to be path to source files +/ +    } else if (_opt_action.require_processing_files) { /+ cli, assumed to be path to source files +/ +      auto _manifest_start = PodManifest!()(_opt_action, arg);        if ( /+ pod files +/          !(arg.match(rgx.src_pth_sst_or_ssm))          && _manifest_start.pod_manifest_file_with_path @@ -731,19 +773,6 @@ string program_name = "spine";        }      }    } -  if (!(_opt_action.skip_output)) { -    if ((_opt_action.debug_do) -    || (_opt_action.very_verbose) -    ) { -      writeln("step0 commence → (without processing files)"); -    } -    outputHubOp!()(_env, _opt_action, _make_and_meta_struct); -    if ((_opt_action.debug_do) -    || (_opt_action.very_verbose) -    ) { -      writeln("- step0 complete"); -    } -  }    if (_manifests.length > 1                            // _manifests[0] initialized dummy element    && _opt_action.abstraction) {      if (_opt_action.parallelise) {                     // see else @@ -795,20 +824,17 @@ string program_name = "spine";              spineMetaDocSummary!()(doc_abstraction, doc_matters);            }            /+ ↓ debugs +/ -          if (doc_matters.opt.action.show_metadata -          ) { +          if (doc_matters.opt.action.show_metadata) {              import doc_reform.meta.metadoc_show_metadata;              spineShowMetaData!()(doc_matters);            }            /+ ↓ debugs +/ -          if (doc_matters.opt.action.show_make -          ) { +          if (doc_matters.opt.action.show_make) {              import doc_reform.meta.metadoc_show_make;              spineShowMake!()(doc_matters);            }            /+ ↓ debugs +/ -          if (doc_matters.opt.action.show_config -          ) { +          if (doc_matters.opt.action.show_config) {              import doc_reform.meta.metadoc_show_config;              spineShowConfig!()(doc_matters);            } @@ -910,20 +936,17 @@ string program_name = "spine";              spineMetaDocSummary!()(doc_abstraction, doc_matters);            }            /+ ↓ debugs +/ -          if (doc_matters.opt.action.show_metadata -          ) { +          if (doc_matters.opt.action.show_metadata) {              import doc_reform.meta.metadoc_show_metadata;              spineShowMetaData!()(doc_matters);            }            /+ ↓ debugs +/ -          if (doc_matters.opt.action.show_make -          ) { +          if (doc_matters.opt.action.show_make) {              import doc_reform.meta.metadoc_show_make;              spineShowMake!()(doc_matters);            }            /+ ↓ debugs +/ -          if (doc_matters.opt.action.show_config -          ) { +          if (doc_matters.opt.action.show_config) {              import doc_reform.meta.metadoc_show_config;              spineShowConfig!()(doc_matters);            } | 
