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 /org | |
| parent | sqlite related internal naming (diff) | |
configuration, hierarchy filenames & paths ...
Diffstat (limited to 'org')
| -rw-r--r-- | org/config_d_cfte.org | 6 | ||||
| -rw-r--r-- | org/config_git.org | 2 | ||||
| -rw-r--r-- | org/config_nix.org | 17 | ||||
| -rw-r--r-- | org/meta_conf_make_meta.org | 896 | ||||
| -rw-r--r-- | org/out_cgi_search_sqlite.org | 4 | ||||
| -rw-r--r-- | org/spine.org | 102 | 
6 files changed, 628 insertions, 399 deletions
diff --git a/org/config_d_cfte.org b/org/config_d_cfte.org index ae3f9c4..013aff9 100644 --- a/org/config_d_cfte.org +++ b/org/config_d_cfte.org @@ -68,7 +68,7 @@ SEE NOTES on configuration hierarchy in spine.org  *** spine: configuration.txt SET -#+HEADER: :tangle "../views/configuration_suggested.txt" +#+HEADER: :tangle "../views/configuration_example.txt"  #+BEGIN_SRC d  /+ obt - org-mode generated file +/  struct Cfg { @@ -97,7 +97,7 @@ enum _cfg = Cfg();  *** spine_search: configuration.txt SET -#+HEADER: :tangle "../sundry/spine_search_cgi/views/configuration_suggested.txt" +#+HEADER: :tangle "../sundry/spine_search_cgi/views/configuration_example.txt"  #+BEGIN_SRC d  /+ obt - org-mode generated file +/  struct Cfg { @@ -133,7 +133,7 @@ http://localhost  #+NAME: www_doc_root  #+BEGIN_SRC sh -/srv/www/spine/static +/srv/www/spine  #+END_SRC  #+NAME: cgi_bin_root diff --git a/org/config_git.org b/org/config_git.org index 5ec0081..12bc0ce 100644 --- a/org/config_git.org +++ b/org/config_git.org @@ -50,6 +50,8 @@  !nix  !nix/**  !.envrc +!.dr +!.dr/*  !src  !src/**  !data diff --git a/org/config_nix.org b/org/config_nix.org index cbd5ba6..2fd932c 100644 --- a/org/config_nix.org +++ b/org/config_nix.org @@ -328,6 +328,7 @@ $SpineBIN/spine -v --sqlite-update --sqlite-db-filename="<<spine_search_db>>" --  ,#+BEGIN_SRC sh  $SpineBIN/spine -v --html --html-link-search --html-link-curate --curate --sqlite-update --sqlite-db-filename="<<spine_search_db>>" --cgi-sqlite-search-filename="<<spine_search_cgi>>" --sqlite-db-path="$SpineDBpath" --output="$SpineOUT" $SpinePOD/* +$SpineBIN/spine --epub --html --html-link-search --html-link-curate --curate --sqlite-update --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine_search" --cgi-url-action="https://sisudoc.org/spine_search" --ouput="$SpineOUT" $SpinePOD/*  ,#+END_SRC  ,*** generate html (linked to search form), sql output, curate COMPOSITE with resource configuration @@ -355,7 +356,7 @@ webserv:    data_root_url:               "https://sisudoc.org"    data_root_path:              "/srv/www/spine"    images_root_part:            "image" -  cgi_title:                   "≅ SiSU Spine search" +  cgi_search_form_title:       "≅ SiSU Spine search"    cgi_http:                    "https"    cgi_domain:                  "sisudoc.org"    cgi_bin_url:                 "http://sisudoc.org/cgi-bin" @@ -1093,14 +1094,12 @@ nix flake update  #+BEGIN_SRC nix  { pkgs ? import <nixpkgs> {} }:  pkgs.mkShell { -  buildInputs = with pkgs; [( -    with pkgs; [ -      <<shell_packages_nix_related>> -      <<shell_packages_d_build_related>> -      <<shell_packages_search_related_sqlite>> -      <<shell_packages_candy>> -    ] -  )]; +  buildInputs = with pkgs; [ +    <<shell_packages_nix_related>> +    <<shell_packages_d_build_related>> +    <<shell_packages_search_related_sqlite>> +    <<shell_packages_candy>> +  ];    shellHook = ''      if [[ -e ".envrc" ]]; then        source .envrc diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org index cdb7571..118219e 100644 --- a/org/meta_conf_make_meta.org +++ b/org/meta_conf_make_meta.org @@ -20,40 +20,175 @@  * generic  ** conf yaml REFERENCE +NOTES on configuration hierarchy: +- compile time program defaults views/configuration.txt in config_d_cfte.org +  - config_d_cfte.org (writes views/configuration.txt) +    - compile time program defaults, set in views/configuration.txt +    - found in: _cfg.* +- run time default configuration administrators config ".dr/config_site_local" +  - in_source_files.org readConfigSite (reads administrators site defaults from +    yaml config file) +  - meta_conf_make_meta.org struct ConfCompositeSiteLocal +    - administrator site defaults read from yaml configuration file +      ".dr/config_site_local" +    - found in: "doc_matters.conf_make_meta.conf." (incorporates _cfg.* as +      initial default values that are overridden if set) +    - ("conf_make_meta.make" (& "conf_make_meta.meta") also available taken from +      document headers) +- command line execution configuration instruction +  - spine.org (org heading: initialize settings) (command line overrides) +    - command line settings/overrides +    - found in: doc_matters.opt.action.* + +** table + +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cfg ctfe              | config local              | cli                        | cli-run                    | composite                   | default                                 |     | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| _cfg.                 | ["webserv"]               | --                         | opt_action.                | _struct_composite.conf.     | default                                 | ✓ ✗ | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| www_doc_root          | ["data_root_path"]        | output                     | output_dir_set             | output_path                 | "/srv/www/spine"                        | ✓   | +|                       |                           |                            |                            |                             | "/var/www"                              |     | +|                       |                           |                            |                            |                             | "/var/www/html"                         |     | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| www_http              | ["http"]                  | www-http                   | webserver_http             | w_srv_http                  | "http" or "https"                       | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| www_host              | ["domain"]                | www-host                   | webserver_host_name        | CHECK                       | "localhost"                             | ✓   | +|                       |                           |                            |                            |                             | "sisudoc"                               |     | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| www_host_doc_root     | [""]                      | www-host-doc-root          | webserver_host_doc_root    | w_srv_data_root_path        |                                         | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| www_url_doc_root?     |                           | www-url-doc-root           |                            |                             | "http://localhost"                      |     | +| CHECK                 |                           |                            |                            |                             | "https://sisudoc.org"                   |     | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cgi_http              | [""]                      | cgi-http                   |                            |                             |                                         | ✗   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cgi_host              | [""]                      | cgi-host                   |                            |                             |                                         | ✗   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cgi_bin_root          | ["cgi_bin_path"]          | cgi-bin-root               | cgi_bin_root               | cgi_bin_root                | "/var/www/cgi/cgi-bin"                  | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cgi_filename          | ["cgi_search_script"]     | cgi-sqlite-search-filename | cgi_sqlite_search_filename | w_srv_cgi_search_script     | "spine_search"                          | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cgi_url_root          | ["cgi_bin_url"]           | cgi-url-root               | cgi_url_root               |                             | REMOVE UNUSED                           | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cgi_url_action        | ["cgi_action"]            | cgi-url-action             | cgi_url_action             | w_srv_cgi_action            | "http://localhost/cgi-bin/spine-search" | ✓   | +|                       |                           |                            |                            |                             | "https://sisudoc.org/spine-search"      |     | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| cgi_search_form_title | ["cgi_search_form_title"] | cgi-search-title           | cgi_search_title           | w_srv_cgi_search_form_title | "≅ SiSU Spine search"                   | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +|                       |                           | config                     |                            |                             |                                         |     | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| default_language      | [""]                      | lang                       | languages_set              |                             | "all" or "en"                           | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| default_papersize     | [""]                      | set-papersize              | latex_papersize            | set_papersize               | "a4"?                                   | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| default_text_wrap     | [""]                      | set-textwrap               | text_wrap                  | set_text_wrap               | 80                                      | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| default_hash_digest   | [""]                      | set-digest                 | hash_digest_type           |                             | sha258                                  | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| db_sqlite_path        | [""]                      | sqlite-db-path             | sqliteDB_path              | w_srv_db_sqlite_path        | "/var/www/sqlite"                       | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +| db_sqlite_filename    | [""]                      | sqlite-db-filename         | sqliteDB_filename          | w_srv_db_sqlite_filename    | "spine_search.db"                       | ✓   | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| +|                       |                           |                            |                            |                             |                                         |     | +|-----------------------+---------------------------+----------------------------+----------------------------+-----------------------------+-----------------------------------------+-----| + +** cli flag + +#+BEGIN_SRC d +string[string] settings = [ +  "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", +  "set-papersize"               : "", +  "set-textwrap"                : "", +  "set-digest"                  : "", +  "sqlite-db-path"              : "", +  "sqlite-db-filename"          : "", +]; +#+END_SRC + +** conf build - views/configuration.txt REFERENCE + +- see: config_d_cfte.org +  for configuration_example.txt + +#+BEGIN_SRC d +struct Cfg { +  string www_http              = "http"; +  string www_host              = "localhost"; +  string www_url_doc_root      = "http://localhost"; +  string www_doc_root          = "/srv/www/spine"; +  string www_host_doc_root     = "localhost"; +  string cgi_bin_root          = "/var/www/cgi/cgi-bin"; +  string cgi_bin_subpath       = ""; +  string cgi_filename          = "spine_search"; +  string cgi_url_root          = "http://localhost/"; +  string cgi_port              = ""; +  string cgi_user              = ""; +  string cgi_url_action        = "http://localhost/spine_search"; +  string cgi_search_form_title = "≅ SiSU Spine search"; +  string db_sqlite_path        = "/var/www/sqlite"; +  string db_sqlite_filename    = "spine.search.db"; +  string default_language      = "en"; +  string default_papersize     = "a4"; +  string default_text_wrap     = "80"; +  string default_hash_digest   = "sha256"; +} +enum _cfg = Cfg(); +#+END_SRC + +** conf yaml - .dr/config_site_local REFERENCE + +#+HEADER: :tangle "../.dr/config_local_site_example"  #+BEGIN_SRC yaml +# config_local_site +# read from directories ... FIX provide list  flag: -  act0:                       "--html" -  act1:                       "--html --epub" +  act0:                        "--html" +  act1:                        "--html --epub"  output: -  path:                       "/var/www/html" +  path:                        "/srv/www/spine"  default: -  language:                   "en" -  papersize:                  "a4" -  text_wrap:                  "80" -  digest:                     "sha256" +  language:                    "en" +  papersize:                   "a4" +  text_wrap:                   "80" +  digest:                      "sha256"  webserv: -  http:                       "http" -  host:                       "localhost" -  data_http:                  "http" -  data_host:                  "localhost" -  data_root_url:              "http://localhost" -  data_root_path:             "/var/www/html" -  data_root_part:             "" -  images_root_part:           "image" -  cgi_http:                   "http" -  cgi_host:                   "localhost" -  cgi_bin_url:                "http://localhost/cgi-bin" -  cgi_bin_subpath:            "cgi-bin" -  cgi_bin_path:               "/usr/lib/cgi-bin" -  cgi_search_form_title:      "≅ SiSU Spine search" -  cgi_search_script:          "spine_search" -  cgi_search_script_raw_fn_d: "spine_search.d" -  cgi_port:                   "" -  cgi_user:                   "" -  cgi_action:                 "http://localhost/cgi-bin/spine-search" -  db_sqlite:                  "spine.search.db" -  db_pg_table:                "" -  db_pg_user:                 "" +  http:                        "https"                            # "http" +  domain:                      "sisudoc"                          # "localhost" +  data_http:                   "https"                            # "http" +  data_domain:                 "sisudoc"                          # "localhost" +  data_root_url:               "https://sisudoc.org"              # "http://localhost" +  data_root_path:              "/srv/www/spine"                   # "/var/www/html" +  data_root_part:              "" +  images_root_part:            "image" +  cgi_search_form_title:       "≅ SiSU Spine search" +  cgi_http:                    "https"                            # "http" +  cgi_domain:                  "sisudoc.org"                      # "localhost" +  cgi_bin_url:                 "http://sisudoc.org/cgi-bin"       # "http://localhost/cgi-bin" +  cgi_bin_part:                "cgi-bin" +  cgi_bin_path:                "/var/www/cgi/cgi-bin"             # "/usr/lib/cgi-bin" +  cgi_search_script:           "spine_search" +  cgi_search_script_raw_fn_d:  "spine_search.d" +  cgi_port:                    "" +  cgi_user:                    "" +  cgi_action:                  "https://sisudoc.org/spine_search" # "http://localhost/cgi-bin/spine-search" +  db_sqlite_filename:          "spine.search.db" +  db_sqlite_path:              "/var/www/sqlite" +  db_pg_table:                 "" +  db_pg_user:                  ""  #+END_SRC  ** imports @@ -278,7 +413,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; @@ -426,244 +560,296 @@ 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; -    <<yaml_objects_make>> -    <<yaml_objects_conf>> -    <<yaml_objects_meta>> +    if (_identifier != "header") { // called only once per run anyway +      <<yaml_objects_conf>> +    } else { +      <<yaml_objects_make>> +      <<yaml_objects_meta>> +    }      return _struct_composite;    }  }  #+END_SRC -**  make +**  conf -#+NAME: yaml_objects_make +#+NAME: yaml_objects_conf  #+BEGIN_SRC d -/+ 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; +/+ 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 ("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 (_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 ("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 (_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_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 ("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 (_opt_action.sqliteDB_filename.length > 0) { +    _struct_composite.conf.w_srv_db_sqlite_filename +      = _opt_action.sqliteDB_filename; +  } else { +    _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 ("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 (_opt_action.sqliteDB_path.length > 0) { +    _struct_composite.conf.w_srv_db_sqlite_path +      = _opt_action.sqliteDB_path; +  } else { +    _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 ("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 (_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_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 ("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 (!(_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 ("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 (_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 ("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 (_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_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 ("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.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))      ) { -      _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 ("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 ("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.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))      ) { -      _struct_composite.make_str.texpdf_font = _yaml["make"]["texpdf_font"].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; +      }      }    } -  _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);  } - -#+END_SRC - -**  conf - -#+NAME: yaml_objects_conf -#+BEGIN_SRC d -/+ 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 (("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.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; -    //   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) @@ -688,59 +874,12 @@ if ("webserv" in _yaml      } 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; -    } -    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; -    } else { -      _struct_composite.conf.w_srv_cgi_search_title = "≅ SiSU spine search form"; -    } -    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; -    } else { -      _struct_composite.conf.w_srv_cgi_search_script = "spine_search"; -    } -    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"; -    } 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) @@ -769,66 +908,14 @@ if ("webserv" in _yaml            : _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 -    }      // 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 ? -    } -    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 ? -    } -  } -} -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 -      ) { -        _struct_composite.conf.output_path = (((_yaml["output"]["path"].get!string).expandTilde).asNormalizedPath).array; -      } -    } -  }  } +// make (in: conf, make, meta)?  if ("processing" in _yaml    && _yaml["processing"].type.sequence  ) { @@ -1054,6 +1141,163 @@ if ("search" in _yaml  }  #+END_SRC +**  make + +#+NAME: yaml_objects_make +#+BEGIN_SRC d +/+ 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 ("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; +    } +  } +  _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); +} + +#+END_SRC +  **  meta  #+NAME: yaml_objects_meta @@ -2112,11 +2356,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) { @@ -2129,7 +2374,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); @@ -2163,11 +2408,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 { @@ -2175,7 +2421,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/org/out_cgi_search_sqlite.org b/org/out_cgi_search_sqlite.org index 6b41da8..f65b1b7 100644 --- a/org/out_cgi_search_sqlite.org +++ b/org/out_cgi_search_sqlite.org @@ -140,7 +140,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", @@ -160,7 +160,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/org/spine.org b/org/spine.org index 805524d..fa246b9 100644 --- a/org/spine.org +++ b/org/spine.org @@ -393,48 +393,30 @@ bool[string] opts = [  ***** initialize settings -NOTES on configuration hierarchy: -- compile time program defaults views/configuration.txt in config_d_cfte.org -  - config_d_cfte.org (writes views/configuration.txt) -    - compile time program defaults, set in views/configuration.txt -    - found in: _cfg.* -- run time default configuration administrators config ".dr/config_site_local" -  - in_source_files.org readConfigSite (reads administrators site defaults from -    yaml config file) -  - meta_conf_make_meta.org struct ConfCompositeSiteLocal -    - administrator site defaults read from yaml configuration file -      ".dr/config_site_local" -    - found in: "doc_matters.conf_make_meta.conf." (incorporates _cfg.* as -      initial default values that are overridden if set) -    - ("conf_make_meta.make" (& "conf_make_meta.meta") also available taken from -      document headers) -- command line execution configuration instruction -  - spine.org (org heading: initialize settings) (command line overrides) -    - command line settings/overrides -    - found in: doc_matters.opt.action.* +NOTES on configuration hierarchy: see meta_conf_make_meta.org  #+NAME: spine_args_init_settings  #+BEGIN_SRC d  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"          : "",  ];  #+END_SRC @@ -449,10 +431,10 @@ auto helpInfo = getopt(args,    "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"], @@ -467,6 +449,7 @@ auto helpInfo = getopt(args,    "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"], @@ -474,6 +457,7 @@ auto helpInfo = getopt(args,    "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"], @@ -501,6 +485,8 @@ auto helpInfo = getopt(args,    "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"], @@ -517,13 +503,7 @@ auto helpInfo = getopt(args,    "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) { @@ -723,12 +703,6 @@ struct OptActions {    @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"];    } @@ -740,6 +714,12 @@ struct OptActions {      ? (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"];    } @@ -749,16 +729,16 @@ struct OptActions {    @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() { @@ -932,7 +912,7 @@ if (          _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;        }      } @@ -940,7 +920,7 @@ if (  } 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; @@ -1143,7 +1123,7 @@ foreach(arg; args[1..$]) {  { /+ 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);  }  #+END_SRC @@ -1190,7 +1170,7 @@ if ((_opt_action.debug_do)  ) {    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]; @@ -1357,10 +1337,11 @@ 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    ){ @@ -1463,6 +1444,7 @@ _make_and_meta_struct =      _make_and_meta_struct,      _manifest,      _opt_action, +    _cfg,    );  if ((_opt_action.debug_do)  || (_opt_action.very_verbose)  | 
