diff options
| author | Ralph Amissah <ralph@amissah.com> | 2018-02-09 22:03:10 -0500 | 
|---|---|---|
| committer | Ralph Amissah <ralph@amissah.com> | 2019-04-10 15:14:14 -0400 | 
| commit | 1c73ddf3894085c646b55d63e61a2483e03a3b4d (patch) | |
| tree | 34e3a837d0e0d224008ff380055ea263a03d3c14 /org | |
| parent | paths, further adjustments (diff) | |
0.24.0 toml or sdlang for configuration
Diffstat (limited to 'org')
| -rw-r--r-- | org/default_misc.org | 375 | ||||
| -rw-r--r-- | org/default_paths.org | 71 | ||||
| -rw-r--r-- | org/default_regex.org | 9 | ||||
| -rw-r--r-- | org/meta_abstraction.org | 29 | ||||
| -rw-r--r-- | org/meta_conf_make_meta.org | 1538 | ||||
| -rw-r--r-- | org/meta_debugs.org | 12 | ||||
| -rw-r--r-- | org/meta_read_source_files.org | 338 | ||||
| -rw-r--r-- | org/output_sisupod.org | 58 | ||||
| -rw-r--r-- | org/sdp.org | 52 | 
9 files changed, 1760 insertions, 722 deletions
| diff --git a/org/default_misc.org b/org/default_misc.org index 9129db2..2fcef58 100644 --- a/org/default_misc.org +++ b/org/default_misc.org @@ -24,10 +24,6 @@    default settings  +/  module sdp.meta.defaults; -template SiSUregisters() { -  <<meta_defaults_imports>> -  <<meta_defaults_template_registers>> -}  <<meta_defaults_template_init_flags>>  <<meta_defaults_template_node>>  <<meta_defaults_template_biblio>> @@ -35,377 +31,6 @@ template SiSUregisters() {  <<defaults_template_language_codes>>  #+END_SRC -** imports - -#+name: meta_defaults_imports -#+BEGIN_SRC d -import -  std.algorithm, -  std.array, -  std.container, -  std.exception, -  std.file, -  std.getopt, -  std.json, -  std.path, -  std.process, -  std.range, -  std.regex, -  std.stdio, -  std.string, -  std.traits, -  std.typecons, -  std.uni, -  std.utf, -  std.conv : to; -#+END_SRC - -** struct ConfComposite - -#+name: meta_defaults_template_registers -#+BEGIN_SRC d -struct ConfCompositeMake { -  string bold                           = ""; -  string breaks                         = ""; -  string cover_image                    = ""; -  string css                            = ""; -  string emphasis                       = ""; -  string footer                         = ""; -  string headings                       = ""; -  string home_button_image              = ""; -  string home_button_text               = ""; -  string italics                        = ""; -  string num_top                        = ""; -  string num_depth                      = ""; -  string substitute                     = ""; -  string texpdf_font                    = ""; -} -struct ConfCompositeMakeStr { -  string bold                           = ""; -  string breaks                         = ""; -  string cover_image                    = ""; -  string css                            = ""; -  string emphasis                       = ""; -  string footer                         = ""; -  string headings                       = ""; -  string home_button_image              = ""; -  string home_button_text               = ""; -  string italics                        = ""; -  string num_top                        = ""; -  string num_depth                      = ""; -  string substitute                     = ""; -  string texpdf_font                    = ""; -} -struct ConfCompositeSiteLocal { -  string webserv_url_root               = ""; -  string webserv_path                   = ""; -  string webserv_images                 = ""; -  string webserv_cgi                    = ""; -  string webserv_cgi_host               = ""; -  string webserv_cgi_host_path          = ""; -  string webserv_cgi_port               = ""; -  string webserv_cgi_user               = ""; -  string webserv_cgi_file_links         = ""; -  string processing_path                = ""; -  string processing_dir                 = ""; -  string processing_concord_max         = ""; -  string flag_act0                      = ""; -  string flag_act1                      = ""; -  string flag_act2                      = ""; -  string flag_act3                      = ""; -  string flag_act4                      = ""; -  string flag_act5                      = ""; -  string flag_act6                      = ""; -  string flag_act7                      = ""; -  string flag_act8                      = ""; -  string flag_act9                      = ""; -  string default_papersize              = ""; -  string default_text_wrap              = ""; -  string default_emphasis               = ""; -  string default_language               = ""; -  string default_digest                 = ""; -  string permission_share_source        = ""; -  string search_flag                    = ""; -  string search_action                  = ""; -  string search_db                      = ""; -  string search_title                   = ""; -} -struct MetaComposite { -  string classify_dewey                 = ""; -  string classify_keywords              = ""; -  string classify_loc                   = ""; -  string classify_subject               = ""; -  string classify_topic_register        = ""; -  string creator_author                 = ""; -  string creator_author_email           = ""; -  string creator_illustrator            = ""; -  string creator_translator             = ""; -  string date_added_to_site             = ""; -  string date_available                 = ""; -  string date_created                   = ""; -  string date_issued                    = ""; -  string date_modified                  = ""; -  string date_published                 = ""; -  string date_valid                     = ""; -  string identifier_isbn                = ""; -  string identifier_oclc                = ""; -  string identifier_pg                  = ""; -  string language_document              = ""; -  string language_document_char         = ""; -  string links                          = ""; -  string notes_abstract                 = ""; -  string notes_description              = ""; -  string original_language              = ""; -  string original_language_char         = ""; -  string original_publisher             = ""; -  string original_source                = ""; -  string original_title                 = ""; -  string publisher                      = ""; -  string rights_copyright               = ""; -  string rights_copyright_audio         = ""; -  string rights_copyright_cover         = ""; -  string rights_copyright_illustrations = ""; -  string rights_copyright_photographs   = ""; -  string rights_copyright_text          = ""; -  string rights_copyright_translation   = ""; -  string rights_copyright_video         = ""; -  string rights_license                 = ""; -  string title_edition                  = ""; -  string title_full                     = ""; -  string title_language                 = ""; -  string title_main                     = ""; -  string title_note                     = ""; -  string title_short                    = ""; -  string title_sub                      = ""; -  string title_subtitle                 = ""; -} -struct ConfComposite { -  MetaComposite          meta; -  ConfCompositeMake      make; -  ConfCompositeSiteLocal conf; -} -struct ConfCompositePlus { -  MetaComposite          meta; -  ConfCompositeMake      make; -  ConfCompositeMakeStr   make_str; -  ConfCompositeSiteLocal conf; -} -#+END_SRC - -** extractSDLangTabOrAttrib - -#+name: meta_defaults_template_registers -#+BEGIN_SRC d -string extractSDLangTabOrAttrib(S)(S conf_sdlang, string maintab, string atab) { -  string _conf_composite_string = ""; -  if (maintab in conf_sdlang.maybe.tags) { -    auto _maintag = conf_sdlang.getTag(maintab); -    if ((atab in _maintag.maybe.tags) -    && (_maintag.getTagValues(atab).length > 0)) { -      debug(configsdlang) { -        writeln(__LINE__, ": make:", atab, ": ", _maintag.getTagValues(atab)[0]); -      } -      if (_maintag.getTagValues(atab).length == 1) { -        writeln((_maintag.getTagValues(atab)[0]).to!string); -        _conf_composite_string = (_maintag.getTagValues(atab)[0]).to!string; -      } else if (_maintag.getTagValues(atab).length > 1) { -        string _tmp = ""; -        foreach (st; _maintag.getTagValues(atab)) { -          writeln(st.to!string, ";"); -          _tmp ~= st.to!string ~ ";"; -        } -        _conf_composite_string = _tmp; -      } -    } else if ((atab in _maintag.maybe.attributes) -    && (_maintag.maybe.attributes[atab][0].value.length > 0)) { -      debug(configsdlang) { -        writeln(__LINE__, ": make:", atab, ": ", conf_sdlang.tags[maintag][0].attributes[atab][0].value); -      } -      _conf_composite_string = (_maintag.attributes[atab][0].value).to!string; -    } -  } -  return _conf_composite_string; -} -#+END_SRC - -** metadata associative array indexes                               :header: - -#+name: meta_defaults_template_registers -#+BEGIN_SRC d -static auto ptr_head_main -  = [ -    "classify", -    "creator", -    "date", -    "identifier", -    "links", -    "make", -    "original", -    "notes", -    "rights", -    "title" -  ]; -static auto ptr_head_sub_classify -  = [ -    "dewey", -    "keywords", -    "loc", -    "subject", -    "topic_register" -  ]; -static auto ptr_head_sub_creator -  = [ -    "author", -    "author_email", -    "cover", -    "illustrator", -    "translator" -  ]; -static auto ptr_head_sub_date -  = [ -    "added_to_site", -    "available", -    "created", -    "issued", -    "modified", -    "published", -    "valid" -  ]; -static auto ptr_head_sub_identifier -  = [ -    "isbn", -    "oclc", -    "pg" -  ]; -/+ make +/ -static auto ptr_head_sub_make -  = [ -    "cover_image", -    "home_button_image", -    "home_button_text", -    "footer", "headings", -    "num_top", "num_depth", -    "breaks", -    "substitute", -    "bold", -    "italics", -    "emphasis", -    "texpdf_font", -    "css" -  ]; -static auto ptr_head_sub_notes -  = [ -    "abstract", -    "description" -  ]; -static auto ptr_head_sub_original -  = [ -    "language", -    "source", -    "title" -  ]; -static auto ptr_head_sub_publisher -  = [ "name" ]; -static auto ptr_head_sub_rights -  = [ -    "copyright", -    "cover", -    "illustrations", -    "license" -  ]; -static auto ptr_head_sub_title -  = [ -    "edition", -    "full", -    "language", -    "main", -    "note", -    "sub" -  ]; -auto config_jsonstr = `{ -}`; -#+END_SRC - -*** notes headers - -#+name: meta_defaults_template -#+BEGIN_SRC d -/+ -  /+ -    unify internal representation of header info for native & sdlang document headers -    represent either using struct, hashes or possibly json -    sdp internal representation should be identical for native & sdlang variants -  +/ -header. -  ├── make                         // make instructions -  │   ├── bold -  │   ├── breaks -  │   ├── cover_image -  │   ├── css -  │   ├── emphasis -  │   ├── footer -  │   ├── headings -  │   ├── home_button_image -  │   ├── home_button_text -  │   ├── italics -  │   ├── num_top -  │   ├── substitute -  │   └── texpdf_font -  └── meta                         // metadata -     ├── author                    // move author to creator:author -     ├── classify -     │   ├── dewey -     │   ├── keyword -     │   ├── loc -     │   ├── subject -     │   └── topic_register -     ├── creator -     │   ├── author -     │   │     ├── [ [first_name: x0, last_name: y0], [first_name: x1, last_name: y1] ] -     │   │     └── [ full_name0, full_name1 ] -     │   ├── author_email -     │   ├── illustrator -     │   └── translator -     ├── date -     │   ├── added_to_site -     │   ├── available -     │   ├── created -     │   ├── issued -     │   ├── modified -     │   ├── published -     │   └── valid -     ├── identifier -     │   ├── isbn -     │   ├── oclc -     │   └── pg -     ├── links -     ├── notes -     │   ├── abstract -     │   └── description -     ├── original -     │   ├── language -     │   ├── source -     │   └── title -     ├── publisher -     │   └── name -     ├── rights -     │   ├── copyright -     │   ├── cover -     │   ├── illustrations -     │   └── license -     └── title                    // move title: to title:main -         ├── edition -         ├── [ full (main + sub) ] -         ├── language -         ├── main -         ├── note -         ├── sub -         └── subtitle              // move title:subtitle to title:sub - -61 leaves -+/ -#+END_SRC -  ** template: flags regex initialize                            :regex_flags:  #+name: meta_defaults_template_init_flags diff --git a/org/default_paths.org b/org/default_paths.org index 5334a78..914703c 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -60,9 +60,15 @@ template PodManifest() {          && (_pth.chainPath(pod_manifest_filename).array).isFile)) {            _manifest_path = _pth;          } else if (_pth.match(rgx.src_pth_contents) -        && exists(_pth)!=0 && _pth.isDir && (_pth.isFile)) { +        && exists(_pth)!=0 && _pth.isDir) {            _manifest_path = dirName(_pth); +        } else if (_pth.match(rgx.src_pth_pod_sst_or_ssm) +        && exists(_pth)!=0 && (_pth.isFile)) { +          if (auto m = _pth.match(rgx.src_pth_pod_sst_or_ssm)) { +            _manifest_path = m.captures["podpath"]; +          }          } else  { +          writeln("WARNING, issue with manifest_path: ", _pth);            _manifest_path = _pth; // _manifest_path = null;          }          return _manifest_path; @@ -86,7 +92,23 @@ template PodManifest() {  }  #+END_SRC -** _manifest and source files_                                      :manifest: +** _path matters (pod, manifest and source files)_             :manifest: + +tree sisupod +sisupod +└─ [sisudoc filename] +    ├── conf +    │   └── sisu_document_make +    ├── media +    │   ├── audio +    │   ├── image +    │   ├── text +    │   │   └── en +    │   │      ... +    │   │       ├── [conf] +    │   │       └── [image] +    │   └── video +    └── sisupod.manifest  #+name: template_paths_src  #+BEGIN_SRC d @@ -131,6 +153,15 @@ template PathMatters() {              auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false;              return _src_is_pod;            } +          auto collection_root() { +            auto _collection_root = asNormalizedPath(chainPath(_manifest.pod_manifest_path, "..")).array; +            if (auto m = (_collection_root).match(rgx.src_pth_pod_root)) { +            // consider testing for last dir in path name being sisupod, and giving warning if not +            } else { +              writeln("WARNING, collection_root not named \"sisupod\""); +            } +            return _collection_root; +          }            auto manifest_filename() {              return _manifest.pod_manifest_filename;            } @@ -140,7 +171,11 @@ template PathMatters() {            auto manifest_file_with_path() {              return _manifest.pod_manifest_file_with_path;            } -          auto config_dirs() {                              // TODO +          auto config_sisu_document_make_dirs() {                              // TODO sisu_document_make +            string[] _config_dirs; +            return _config_dirs; +          } +          auto config_local_site_dirs() {                   // TODO sisu_document_make              string[] _config_dirs;              return _config_dirs;            } @@ -323,7 +358,7 @@ template PathMatters() {  }  #+END_SRC -** _config_                                                           :config: +** _config_ (sisu_document_make & config_local_site)                  :config:  #+name: template_paths_src  #+BEGIN_SRC d @@ -335,12 +370,21 @@ template ConfigFilePaths() {      E   _env,    ) {      struct ConfFilePaths { -      auto config_filename_document() { -        return "config_document"; +      auto config_filename_document_sdl() { +        return "sisu_document_make.sdl"; +      } +      auto config_filename_site_sdl() { +        return "config_local_site.sdl"; +      } +      auto config_filename_document_toml() { +        return "sisu_document_make.toml"; +      } +      auto config_filename_site_toml() { +        return "config_local_site.toml";        }        auto possible_config_path_locations() {          struct _ConfFilePaths { -          auto document() { +          auto sisu_document_make() {              /+ FIX clean up conf paths ↓ +/              /+ config local site (file system only, not in pod) +/              /+ return paths +/ @@ -383,10 +427,7 @@ template ConfigFilePaths() {              +/              return _possible_config_path_locations;            } -          auto config_filename_site() { -            return "config_local_site"; -          } -          auto local_site() { +          auto config_local_site() {              /+ FIX clean up conf paths ↓ +/              /+ config local site (file system only, not in pod) +/              string _dot_pwd        = asNormalizedPath(chainPath(to!string(_env["pwd"]), ".sisu")).array; @@ -395,11 +436,15 @@ template ConfigFilePaths() {              /+ return paths +/              string[] _possible_config_path_locations;              if (_manifest.src.is_pod) { +              string _collection_root_a = asNormalizedPath(chainPath(to!string(_manifest.pod.collection_root.to!string), ".sisu")).array; +              string _collection_root_b = asNormalizedPath(chainPath(to!string(_manifest.pod.collection_root.to!string), "_sisu")).array;                _possible_config_path_locations = [                  _dot_pwd,                  _underscore_pwd,                  _dot_home, -                "/etc/sisu" +                "/etc/sisu", +                _collection_root_a, // set priority higher? +                _collection_root_b // set priority higher?                ];              } else {                /+ config document (& or local site) on filesystem +/ @@ -1004,7 +1049,7 @@ template SiSUpathsSQLiteDiscrete() {          return fn_src.baseName.stripExtension;        }        string base() { -        return asNormalizedPath((out_pth.output_base).chainPath(base_dir)).array; +        return asNormalizedPath((out_pth.output_root).chainPath(base_dir)).array;        }        string seg(string fn_src) {          return asNormalizedPath(base.chainPath(base_filename(fn_src))).array; diff --git a/org/default_regex.org b/org/default_regex.org index 1ad8ee5..a5cf084 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -110,6 +110,8 @@ static native_header_meta_title                       = ctRegex!(`^@title:\s`, "  static variable_doc_title                             = ctRegex!(`@title`);  static variable_doc_author                            = ctRegex!(`@author|@creator`);  static raw_author_munge                               = ctRegex!(`(\S.+?),\s+(.+)`,"i"); +static sdlang_header_meta_title                       = ctRegex!(`^\s*title\s+["\\]`, "m"); +static toml_header_meta_title                         = ctRegex!(`^\s*(title\s*=\s*"|\[title\])`, "m");  #+END_SRC  *** subheader                                            :native:subheader: @@ -313,6 +315,7 @@ static break_page_new                                 = ctRegex!(`^=[\\]{2}=$`);  static break_page_line_across                         = ctRegex!(`^=[.]{2}=$`);  static break_string                                   = ctRegex!(`』`);  static parent                                         = ctRegex!(`([0-7]):([0-9]+)`); +static header_regex_content                           = ctRegex!(`([0-7]):([0-9]+)`);  #+END_SRC  ** json                                                               :json: @@ -412,7 +415,9 @@ static nbsp_char_and_space                            = ctRegex!(`░[ ]`, "mg")  #+name: prgmkup_rgx  #+BEGIN_SRC d  static src_pth_sst_or_ssm                             = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`); +static src_pth_pod_sst_or_ssm                         = ctRegex!(`^(?P<podpath>[/]?(?:[a-zA-Z0-9._-]+/)*)media/text/[a-z]{2}/(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`);  static src_pth_contents                               = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisupod[.]manifest$`); +static src_pth_pod_root                               = ctRegex!(`^(?P<podroot>(?:[/]?(?:[a-zA-Z0-9._-]+/)*)(sisupod))$`);  static src_pth_zip                                    = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]zip)$`);  static src_pth_unzip_pod                              = ctRegex!(`^(?P<path>media/text/[a-z]{2}/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[im])$`);  static src_pth_types                                  = @@ -427,7 +432,8 @@ static src_fn_insert                                  = ctRegex!(`^(?P<path>[a-z  static src_fn_find_inserts                            = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[im])$`);  static insert_src_fn_ssi_or_sst                       = ctRegex!(`^<<\s*(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[ti])$`);  static src_base_parent_dir_name                       = ctRegex!(`[/](?P<dir>(?:[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure -static src_formalised_file_path_parts                 = ctRegex!(`(?P<pth>(?:[/a-zA-Z0-9._-]+?)(?P<dir>[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalized dir structure +static src_base_parent_path                           = ctRegex!(`(?P<dir>(?:[/a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure +static src_formalised_file_path_parts                 = ctRegex!(`(?P<pth>(?:[/a-zA-Z0-9._-]+?)(?P<dir>[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure  #+END_SRC  ** inline markup @@ -492,6 +498,7 @@ static inline_bold_line                               = ctRegex!(`^!_ (?P<text>.  static inline_italics_line                            = ctRegex!(`^/_ (?P<text>.+?)((?: [\\]{2}|[~]#){0,2}$)`);  static inline_underscore_line                         = ctRegex!(`^__ (?P<text>.+?)((?: [\\]{2}|[~]#){0,2}$)`);  static inline_fontface_clean                          = ctRegex!(`[*!_/^,+#■"-]\{|\}[*!_/^,+#■"-]`, "mg"); +static no_header_rgx                                  = ctRegex!(`^=NULL$`);  #+END_SRC  *** table related diff --git a/org/meta_abstraction.org b/org/meta_abstraction.org index b1464b5..aa79d9a 100644 --- a/org/meta_abstraction.org +++ b/org/meta_abstraction.org @@ -1907,7 +1907,8 @@ if (the_table_of_contents_section["scroll"].length > 1) {          segnames_0_4 ~= obj.segment_anchor_tag;          if (obj.heading_lev_markup == 4) {            obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -1936,7 +1937,8 @@ if (the_table_of_contents_section["scroll"].length > 1) {          segnames_0_4 ~= obj.segment_anchor_tag;          if (obj.heading_lev_markup == 4) {            obj.segname_next = html_segnames[obj.ptr_html_segnames + 1]; -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        if ((opt_action.html) @@ -1971,7 +1973,8 @@ if (the_document_body_section.length > 1) {            if (html_segnames.length > obj.ptr_html_segnames + 1) {              obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];            } -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -2019,7 +2022,8 @@ if (the_endnotes_section.length > 1) {            if (html_segnames.length > obj.ptr_html_segnames + 1) {              obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];            } -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -2060,7 +2064,8 @@ if (the_glossary_section.length > 1) {            if (html_segnames.length > obj.ptr_html_segnames + 1) {              obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];            } -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -2105,7 +2110,8 @@ if (the_bibliography_section.length > 1) {            if (html_segnames.length > obj.ptr_html_segnames + 1) {              obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];            } -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -2155,7 +2161,8 @@ if (the_bookindex_section["scroll"].length > 1) {            if (html_segnames.length > obj.ptr_html_segnames + 1) {              obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];            } -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -2194,7 +2201,8 @@ if (the_bookindex_section["scroll"].length > 1) {            if (html_segnames.length > obj.ptr_html_segnames + 1) {              obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];            } -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -2243,7 +2251,8 @@ if (the_blurb_section.length > 1) {            if (html_segnames.length > obj.ptr_html_segnames + 1) {              obj.segname_next = html_segnames[obj.ptr_html_segnames + 1];            } -          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames]); +          assert(obj.segment_anchor_tag == html_segnames[obj.ptr_html_segnames], +          obj.segment_anchor_tag ~ "!=" ~ html_segnames[obj.ptr_html_segnames]);          }        }        /+ dom structure (marked up & collapsed) +/ @@ -3784,7 +3793,7 @@ void _block_flag_line_empty_(B,N,CMM)(      comp_obj_block = comp_obj_block.init;      obj_cite_digits = ocn_emit(OCNstatus.on);      an_object["bookindex_nugget"] -      =("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : ""; +      = ("bookindex_nugget" in an_object) ? an_object["bookindex_nugget"] : "";      bookindex_unordered_hashes        = bookindex_extract_hash.bookindex_nugget_hash(          an_object["bookindex_nugget"], diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org index 1494410..91c9d11 100644 --- a/org/meta_conf_make_meta.org +++ b/org/meta_conf_make_meta.org @@ -1,4 +1,4 @@ -#+TITLE:       sdp header extract +#+TITLE:       sdp config & header (make & meta) extract  #+AUTHOR:      Ralph Amissah  #+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]  #+DESCRIPTION: documents - structuring, publishing in multiple formats & search @@ -15,10 +15,875 @@  #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)  [[./sdp.org][sdp]]  [[./][org/]] -* 0. header extract (native & sdlang) to Struct    :module:sdp:meta_conf_make_meta: -** module template +* 0. generic +** imports -#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta.d +#+name: meta_defaults_imports +#+BEGIN_SRC d +import +  std.algorithm, +  std.array, +  std.container, +  std.exception, +  std.file, +  std.getopt, +  std.json, +  std.path, +  std.process, +  std.range, +  std.regex, +  std.stdio, +  std.string, +  std.traits, +  std.typecons, +  std.uni, +  std.utf, +  std.conv : to; +import sdp.meta.conf_make_meta_structs; +#+END_SRC + +** struct ConfComposite + +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_structs.d +module sdp.meta.conf_make_meta_structs; +import +  std.exception, +  std.regex, +  std.stdio, +  std.string, +  std.traits, +  std.typecons, +  std.utf, +  std.conv : to; +<<meta_defaults_template_structs>> +#+END_SRC + +** struct Generic ConfComposite + +#+name: meta_defaults_template_structs +#+BEGIN_SRC d +struct ConfCompositeMakeStr { +  string bold                           = ""; +  string breaks                         = ""; +  string cover_image                    = ""; +  string css                            = ""; +  string emphasis                       = ""; +  string footer                         = ""; +  string headings                       = ""; +  string home_button_image              = ""; +  string home_button_text               = ""; +  string italics                        = ""; +  string num_top                        = ""; +  string num_depth                      = ""; +  string substitute                     = ""; +  string texpdf_font                    = ""; +} +struct confCompositeMakeBuild { +  auto bold_rgxmatch(string _mk) { +    auto _rgxtxt = (_mk.empty) +    ? `=NULL` +    : `(` ~ _mk.dup ~ `)`; +    return (cast(char[]) (_rgxtxt)); +  } +  auto bold_substitute_abstract() { +    return "<b>$1</b>"; +  } +  auto bold_substitute_html() { +    return "<b>$1</b>"; +  } +  auto breaks(string _mk) { +    return _mk; +  } +  auto cover_image(string _mk) { +    return _mk; +  } +  auto css(string _mk) { +    return _mk; +  } +  auto emphasis_rgxmatch(string _mk) { +    auto _rgxtxt = (_mk.empty) +    ? `=NULL` +    : `(` ~ _mk.dup ~ `)`; +    return (cast(char[]) (_rgxtxt)); +  } +  auto emphasis_substitute_abstract() { +    return "<em>$1</em>"; +  } +  auto emphasis_substitute_html() { +    return "<em>$1</em>"; +  } +  auto footer(string _mk) { +    return _mk; +  } +  auto headings(string _mk) { +    return _mk; +  } +  auto home_button_image(string _mk) { +    return _mk; +  } +  auto home_button_text(string _mk) { +    return _mk; +  } +  auto italics_rgxmatch(string _mk) { +    auto _rgxtxt = (_mk.empty) +    ? `=NULL` +    : `(` ~ _mk.dup ~ `)`; +    return (cast(char[]) (_rgxtxt)); +  } +  auto italics_substitute_abstract() { +    return "<i>$1</i>"; +  } +  auto italics_substitute_html() { +    return "<i>$1</i>"; +  } +  auto num_top(string _mk) { +    return _mk; +  } +  auto num_depth(string _mk) { +    return _mk; +  } +  auto substitute(string _mk) { // TODO this is different from others +    return regex(_mk); +  } +  auto texpdf_font(string _mk) { +    return _mk; +  } +} +#+END_SRC + +** initialize make & meta +*** composite make + +#+name: meta_defaults_template_structs +#+BEGIN_SRC d +struct ConfCompositeMakeInit { +  char[] bold_rgxmatch                  = `=NULL`.dup; +  auto bold_substitute_abstract         = "<b>$1</b>"; +  auto bold_substitute_html             = "<b>$1</b>"; +  string breaks                         = ""; +  string cover_image                    = ""; +  string css                            = ""; +  char[] emphasis_rgxmatch              = `=NULL`.dup; +  auto emphasis_substitute_abstract     = "<em>$1</em>"; +  auto emphasis_substitute_html         = "<em>$1</em>"; +  string footer                         = ""; +  string headings                       = ""; +  string home_button_image              = ""; +  string home_button_text               = ""; +  char[] italics_rgxmatch               = `=NULL`.dup; +  auto italics_substitute_abstract      = "<i>$1</i>"; +  auto italics_substitute_html          = "<i>$1</i>"; +  string num_top                        = ""; +  string num_depth                      = ""; +  auto substitute                       = regex(""); // TODO +  string texpdf_font                    = ""; +} +#+END_SRC + +*** conf site local + +#+name: meta_defaults_template_structs +#+BEGIN_SRC d +struct ConfCompositeSiteLocal { +  string webserv_url_root               = ""; +  string webserv_path                   = ""; +  string webserv_images                 = ""; +  string webserv_cgi                    = ""; +  string webserv_cgi_host               = ""; +  string webserv_cgi_host_path          = ""; +  string webserv_cgi_port               = ""; +  string webserv_cgi_user               = ""; +  string webserv_cgi_file_links         = ""; +  string processing_path                = ""; +  string processing_dir                 = ""; +  string processing_concord_max         = ""; +  string flag_act0                      = ""; +  string flag_act1                      = ""; +  string flag_act2                      = ""; +  string flag_act3                      = ""; +  string flag_act4                      = ""; +  string flag_act5                      = ""; +  string flag_act6                      = ""; +  string flag_act7                      = ""; +  string flag_act8                      = ""; +  string flag_act9                      = ""; +  string default_papersize              = ""; +  string default_text_wrap              = ""; +  string default_emphasis               = ""; +  string default_language               = ""; +  string default_digest                 = ""; +  string permission_share_source        = ""; +  string search_flag                    = ""; +  string search_action                  = ""; +  string search_db                      = ""; +  string search_title                   = ""; +} +#+END_SRC + +*** composite meta + +#+name: meta_defaults_template_structs +#+BEGIN_SRC d +struct MetaComposite { +  string classify_dewey                 = ""; +  string classify_keywords              = ""; +  string classify_loc                   = ""; +  string classify_subject               = ""; +  string classify_topic_register        = ""; +  string creator_author                 = ""; +  string creator_author_email           = ""; +  string creator_illustrator            = ""; +  string creator_translator             = ""; +  string date_added_to_site             = ""; +  string date_available                 = ""; +  string date_created                   = ""; +  string date_issued                    = ""; +  string date_modified                  = ""; +  string date_published                 = ""; +  string date_valid                     = ""; +  string identifier_isbn                = ""; +  string identifier_oclc                = ""; +  string identifier_pg                  = ""; +  string language_document              = ""; +  string language_document_char         = ""; +  string links                          = ""; +  string notes_abstract                 = ""; +  string notes_description              = ""; +  string original_language              = ""; +  string original_language_char         = ""; +  string original_publisher             = ""; +  string original_source                = ""; +  string original_title                 = ""; +  string publisher                      = ""; +  string rights_copyright               = ""; +  string rights_copyright_audio         = ""; +  string rights_copyright_cover         = ""; +  string rights_copyright_illustrations = ""; +  string rights_copyright_photographs   = ""; +  string rights_copyright_text          = ""; +  string rights_copyright_translation   = ""; +  string rights_copyright_video         = ""; +  string rights_license                 = ""; +  string title_edition                  = ""; +  string title_full                     = ""; +  string title_language                 = ""; +  string title_main                     = ""; +  string title_note                     = ""; +  string title_short                    = ""; +  string title_sub                      = ""; +  string title_subtitle                 = ""; +} +#+END_SRC + +*** composite structs + +#+name: meta_defaults_template_structs +#+BEGIN_SRC d +struct ConfComposite { +  MetaComposite               meta; +  ConfCompositeMakeInit       make; +  ConfCompositeSiteLocal      conf; +} +struct ConfCompositePlus { +  MetaComposite               meta; +  ConfCompositeMakeInit       make; +  ConfCompositeMakeStr        make_str; +  ConfCompositeSiteLocal      conf; +} +#+END_SRC + +*** metadata associative array indexes                             :header: + +#+name: meta_defaults_template_structs +#+BEGIN_SRC d +static auto ptr_head_main +  = [ +    "classify", +    "creator", +    "date", +    "identifier", +    "links", +    "make", +    "original", +    "notes", +    "rights", +    "title" +  ]; +static auto ptr_head_sub_classify +  = [ +    "dewey", +    "keywords", +    "loc", +    "subject", +    "topic_register" +  ]; +static auto ptr_head_sub_creator +  = [ +    "author", +    "author_email", +    "cover", +    "illustrator", +    "translator" +  ]; +static auto ptr_head_sub_date +  = [ +    "added_to_site", +    "available", +    "created", +    "issued", +    "modified", +    "published", +    "valid" +  ]; +static auto ptr_head_sub_identifier +  = [ +    "isbn", +    "oclc", +    "pg" +  ]; +/+ make +/ +static auto ptr_head_sub_make +  = [ +    "cover_image", +    "home_button_image", +    "home_button_text", +    "footer", "headings", +    "num_top", "num_depth", +    "breaks", +    "substitute", +    "bold", +    "italics", +    "emphasis", +    "texpdf_font", +    "css" +  ]; +static auto ptr_head_sub_notes +  = [ +    "abstract", +    "description" +  ]; +static auto ptr_head_sub_original +  = [ +    "language", +    "source", +    "title" +  ]; +static auto ptr_head_sub_publisher +  = [ "name" ]; +static auto ptr_head_sub_rights +  = [ +    "copyright", +    "cover", +    "illustrations", +    "license" +  ]; +static auto ptr_head_sub_title +  = [ +    "edition", +    "full", +    "language", +    "main", +    "note", +    "sub" +  ]; +auto config_jsonstr = `{ +}`; +#+END_SRC + +* 1. JSON to SiSUstruct +** 1. module json                      :module:sdp:meta_conf_make_meta_json: +*** 0. module template + +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_json.d +/++ +  json headers<BR> +  extract json header return json ++/ +module sdp.meta.conf_make_meta_json; +static template contentJSONtoSiSUstruct() { +  import +    std.exception, +    std.regex, +    std.stdio, +    std.string, +    std.traits, +    std.typecons, +    std.utf, +    std.conv : to; +  import +    sdp.meta.conf_make_meta_structs, +    sdp.meta.conf_make_meta_json, +    sdp.meta.rgx; +  ConfCompositePlus _struct_composite; +  auto contentJSONtoSiSUstruct(C, J)(C _struct_composite, J _json, string _identifier) { +    mixin SiSUrgxInit; +    static auto _rgx = Rgx(); +    debug (json) { +      writeln(">> --------------------------- >>"); +      foreach (tag0; _json.object.byKeyValue) { +        if (tag0.value.stringof == "string") { +          writeln(tag0.key, ": ", tag0.value); +        } else { +          // writeln(tag0.key, ":"); +          foreach (tag1; tag0.value.object.byKeyValue) { +            writeln(tag0.key, ":", tag1.key, ": ", tag1.value); +          } +        } +      } +      writeln("<< --------------------------- <<"); +    } +    confCompositeMakeBuild _mk; +    <<json_objects>> +    return _struct_composite; +  } +} +#+END_SRC + +***  make + +#+name: json_objects +#+BEGIN_SRC d +/+ make ------------------------------------------------------------------- +/ +if ("make" in _json.object) { +  if ("bold" in _json.object["make"]) { +    _struct_composite.make_str.bold  = _json.object["make"]["bold"].str; +  } +  if ("breaks" in _json.object["make"]) { +    _struct_composite.make_str.breaks  = _json.object["make"]["breaks"].str; +  } +  if ("cover_image" in _json.object["make"]) { +    _struct_composite.make_str.cover_image  = _json.object["make"]["cover_image"].str; +  } +  if ("css" in _json.object["make"]) { +    _struct_composite.make_str.css  = _json.object["make"]["css"].str; +  } +  if ("emphasis" in _json.object["make"]) { +    _struct_composite.make_str.emphasis  = _json.object["make"]["emphasis"].str; +  } +  if ("footer" in _json.object["make"]) { +    _struct_composite.make_str.footer  = _json.object["make"]["footer"].str; +  } +  if ("headings" in _json.object["make"]) { +    _struct_composite.make_str.headings  = _json.object["make"]["headings"].str; +  } +  if ("home_button_image" in _json.object["make"]) { +    _struct_composite.make_str.home_button_image  = _json.object["make"]["home_button_image"].str; +  } +  if ("home_button_text" in _json.object["make"]) { +    _struct_composite.make_str.home_button_text  = _json.object["make"]["home_button_text"].str; +  } +  if ("italics" in _json.object["make"]) { +    _struct_composite.make_str.italics  = _json.object["make"]["italics"].str; +  } +  if ("num_top" in _json.object["make"]) { +    _struct_composite.make_str.num_top  = _json.object["make"]["num_top"].str; +  } +  if ("num_depth" in _json.object["make"]) { +    _struct_composite.make_str.num_depth  = _json.object["num_depth"][""].str; +  } +  if ("substitute" in _json.object["make"]) { +    _struct_composite.make_str.substitute  = _json.object["make"]["substitute"].str; +  } +  if ("texpdf_font" in _json.object["make"]) { +    _struct_composite.make_str.texpdf_font  = _json.object["make"]["texpdf_font"].str; +  } +  _struct_composite.make.bold_rgxmatch                  = _mk.bold_rgxmatch(_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_rgxmatch              = _mk.emphasis_rgxmatch(_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_rgxmatch               = _mk.italics_rgxmatch(_struct_composite.make_str.italics); +  _struct_composite.make.num_top                        = _mk.num_top(_struct_composite.make_str.num_top); +  _struct_composite.make.num_depth                      = _mk.num_depth(_struct_composite.make_str.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: json_objects +#+BEGIN_SRC d +/+ conf ------------------------------------------------------------------- +/ +if ("webserv" in _json.object) { +  if ("url_root" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_url_root = _json.object["webserv"]["url_root"].str; +  } +  if ("path" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_path = _json.object["webserv"]["path"].str; +  } +  if ("images" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_images = _json.object["webserv"]["images"].str; +  } +  if ("cgi" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_cgi = _json.object["webserv"]["cgi"].str; +  } +  if ("cgi_host" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_cgi_host = _json.object["webserv"]["cgi_host"].str; +  } +  if ("cgi_host_path" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_cgi_host_path = _json.object["webserv"]["cgi_host_path"].str; +  } +  if ("cgi_port" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_cgi_port = _json.object["webserv"]["cgi_port"].str; +  } +  if ("cgi_user" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_cgi_user = _json.object["webserv"]["cgi_user"].str; +  } +  if ("cgi_file_links" in _json.object["webserv"]) { +    _struct_composite.conf.webserv_cgi_file_links = _json.object["webserv"]["cgi_file_links"].str; +  } +} +if ("processing" in _json.object) { // TODO check & match logic with sdlang +  if ("path" in _json.object["processing"]) { +    _struct_composite.conf.processing_path = _json.object["processing"]["path"].str; +  } +  if ("dir" in _json.object["processing"]) { +    _struct_composite.conf.processing_dir = _json.object["processing"]["dir"].str; +  } +  if ("concord_max" in _json.object["processing"]) { +    _struct_composite.conf.processing_concord_max = _json.object["processing"]["concord_max"].str; +  } +} +if ("flag" in _json.object) { +  if ("act0" in _json.object["flag"]) { +    _struct_composite.conf.flag_act0 = _json.object["flag"]["act0"].str; +  } +  if ("act1" in _json.object["flag"]) { +    _struct_composite.conf.flag_act1 = _json.object["flag"]["act1"].str; +  } +  if ("act2" in _json.object["flag"]) { +    _struct_composite.conf.flag_act2 = _json.object["flag"]["act2"].str; +  } +  if ("act3" in _json.object["flag"]) { +    _struct_composite.conf.flag_act3 = _json.object["flag"]["act3"].str; +  } +  if ("act4" in _json.object["flag"]) { +    _struct_composite.conf.flag_act4 = _json.object["flag"]["act4"].str; +  } +  if ("act5" in _json.object["flag"]) { +    _struct_composite.conf.flag_act5 = _json.object["flag"]["act5"].str; +  } +  if ("act6" in _json.object["flag"]) { +    _struct_composite.conf.flag_act6 = _json.object["flag"]["act6"].str; +  } +  if ("act7" in _json.object["flag"]) { +    _struct_composite.conf.flag_act7 = _json.object["flag"]["act7"].str; +  } +  if ("act8" in _json.object["flag"]) { +    _struct_composite.conf.flag_act8 = _json.object["flag"]["act8"].str; +  } +  if ("act9" in _json.object["flag"]) { +    _struct_composite.conf.flag_act9 = _json.object["flag"]["act9"].str; +  } +} +if ("default" in _json.object) { +  if ("papersize" in _json.object["default"]) { +    _struct_composite.conf.default_papersize = _json.object["default"]["papersize"].str; +  } +  if ("text_wrap" in _json.object["default"]) { +    _struct_composite.conf.default_text_wrap = _json.object["default"]["text_wrap"].str; +  } +  if ("emphasis" in _json.object["default"]) { +    _struct_composite.conf.default_emphasis = _json.object["default"]["emphasis"].str; +  } +  if ("language" in _json.object["default"]) { +    _struct_composite.conf.default_language = _json.object["default"]["language"].str; +  } +  if ("digest" in _json.object["default"]) { +    _struct_composite.conf.default_digest = _json.object["default"]["digest"].str; +  } +} +if ("search" in _json.object) { +  if ("flag" in _json.object["search"]) { +    _struct_composite.conf.search_flag = _json.object["search"]["flag"].str; +  } +  if ("action" in _json.object["search"]) { +    _struct_composite.conf.search_action = _json.object["search"]["action"].str; +  } +  if ("db" in _json.object["search"]) { +    _struct_composite.conf.search_db = _json.object["search"]["db"].str; +  } +  if ("title" in _json.object["search"]) { +    _struct_composite.conf.search_title = _json.object["search"]["title"].str; +  } +} +#+END_SRC + +***  meta + +#+name: json_objects +#+BEGIN_SRC d +/+ meta ------------------------------------------------------------------- +/ +if ("classify" in _json.object) { +  if ("dewey" in _json.object["classify"]) { +    _struct_composite.meta.classify_dewey = _json.object["classify"]["dewey"].str; +  } +  if ("keywords" in _json.object["classify"]) { +    _struct_composite.meta.classify_keywords = _json.object["classify"]["keywords"].str; +  } +  if ("loc" in _json.object["classify"]) { +    _struct_composite.meta.classify_loc = _json.object["classify"]["loc"].str; +  } +  if ("subject" in _json.object["classify"]) { +    _struct_composite.meta.classify_subject = _json.object["classify"]["subject"].str; +  } +  if ("topic_register" in _json.object["classify"]) { +    _struct_composite.meta.classify_topic_register = _json.object["classify"]["topic_register"].str; +  } +} +if ("date" in _json.object) { +  if ("added_to_site" in _json.object["date"]) { +    _struct_composite.meta.date_added_to_site = _json.object["date"]["added_to_site"].str; +  } +  if ("available" in _json.object["date"]) { +    _struct_composite.meta.date_available = _json.object["date"]["available"].str; +  } +  if ("created" in _json.object["date"]) { +    _struct_composite.meta.date_created = _json.object["date"]["created"].str; +  } +  if ("issued" in _json.object["date"]) { +    _struct_composite.meta.date_issued = _json.object["date"]["issued"].str; +  } +  if ("modified" in _json.object["date"]) { +    _struct_composite.meta.date_modified = _json.object["date"]["modified"].str; +  } +  if ("published" in _json.object["date"]) { +    _struct_composite.meta.date_published = _json.object["date"]["published"].str; +  } +  if ("valid" in _json.object["date"]) { +    _struct_composite.meta.date_valid = _json.object["date"]["valid"].str; +  } +} +if ("links" in _json.object) { +  // if ("" in _json.object["links"]) { +  //   _struct_composite.meta.links_ = _json.object["links"][""].str; +  // } +} +if ("notes" in _json.object) { +  if ("abstract" in _json.object["notes"]) { +    _struct_composite.meta.notes_abstract = _json.object["notes"]["abstract"].str; +  } +  if ("description" in _json.object["notes"]) { +    _struct_composite.meta.notes_description = _json.object["notes"]["description"].str; +  } +} +if ("original" in _json.object) { +  if ("language" in _json.object["original"]) { +    _struct_composite.meta.original_language = _json.object["original"]["language"].str; +  } +  if ("language_char" in _json.object["original"]) { +    _struct_composite.meta.original_language_char = _json.object["original"]["language_char"].str; +  } +  if ("source" in _json.object["original"]) { +    _struct_composite.meta.original_source = _json.object["original"]["source"].str; +  } +  if ("title" in _json.object["original"]) { +    _struct_composite.meta.original_title = _json.object["original"]["title"].str; +  } +} +if ("publisher" in _json.object) { +  // if ("" in _json.object["publisher"]) { +  //   _struct_composite.meta.publisher = _json.object["publisher"][""].str; +  // } +} +if ("rights" in _json.object) { +  if ("copyright" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright = _json.object["rights"]["copyright"].str; +  } +  if ("copyright_text" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright_text = _json.object["rights"]["copyright_text"].str; +  } +  if ("copyright_audio" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright_audio = _json.object["rights"]["copyright_audio"].str; +  } +  if ("copyright_cover" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright_cover = _json.object["rights"]["copyright_cover"].str; +  } +  if ("copyright_illustrations" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright_illustrations = _json.object["rights"]["copyright_illustrations"].str; +  } +  if ("copyright_photographs" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright_photographs = _json.object["rights"]["copyright_photographs"].str; +  } +  if ("copyright_translation" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright_translation = _json.object["rights"]["copyright_translation"].str; +  } +  if ("copyright_video" in _json.object["rights"]) { +    _struct_composite.meta.rights_copyright_video = _json.object["rights"]["copyright_video"].str; +  } +  if ("license" in _json.object["rights"]) { +    _struct_composite.meta.rights_license = _json.object["rights"]["license"].str; +  } +} +if (_struct_composite.meta.creator_author.empty) { +  if ("creator" in _json.object) { +    if ("author" in _json.object["creator"]) { +      _struct_composite.meta.creator_author = _json.object["creator"]["author"].str; +    } +    if ("email" in _json.object["creator"]) { +      _struct_composite.meta.creator_author_email = _json.object["creator"]["email"].str; +    } +    if ("illustrator" in _json.object["creator"]) { +      _struct_composite.meta.creator_illustrator = _json.object["creator"]["illustrator"].str; +    } +    if ("translator" in _json.object["creator"]) { +      _struct_composite.meta.creator_translator = _json.object["creator"]["translator"].str; +    } +  } +  // dochead_meta["creator"]["author_raw"] = dochead_meta["creator"]["author"]; +  string[] authors_arr; +  auto authors_raw_arr = _struct_composite.meta.creator_author.split(_rgx.arr_delimiter); +  foreach (author_raw; authors_raw_arr) { +    authors_arr ~= author_raw.replace(_rgx.raw_author_munge, "$2 $1"); +  } +  _struct_composite.meta.creator_author = join(authors_arr, ", ").chomp.chomp; +} +if (_struct_composite.meta.title_main.empty) { +  if ("title" in _json.object) { +    if ((_json.object["title"].type().to!string) == "STRING") { +      _struct_composite.meta.title_main                     = _json.object["title"].str; +    } else { +      if ("edition" in _json.object["title"]) { +        _struct_composite.meta.title_edition                = _json.object["title"]["edition"].str; +      } +      if ("full" in _json.object["title"]) { +        // _struct_composite.meta.title_full                  = _json.object["title"]["full"].str; +      } +      if ("language" in _json.object["title"]) { +        _struct_composite.meta.title_language               = _json.object["title"]["language"].str; +      } +      if ("main" in _json.object["title"]) { +        _struct_composite.meta.title_main                   = _json.object["title"]["main"].str; +      } +      if ("note" in _json.object["title"]) { +        _struct_composite.meta.title_note                   = _json.object["title"]["note"].str; +      } +      if ("sub" in _json.object["title"]) { +        _struct_composite.meta.title_sub                    = _json.object["title"]["sub"].str; +      } +      if ("subtitle" in _json.object["title"]) { +        _struct_composite.meta.title_subtitle               = _json.object["title"]["subtitle"].str; +      } +    } +  } +  if ((!(_struct_composite.meta.title_subtitle.empty)) +  && (_struct_composite.meta.title_sub.empty)) { +    _struct_composite.meta.title_sub = _struct_composite.meta.title_subtitle; +  } +  _struct_composite.meta.title_full = (_struct_composite.meta.title_sub.empty) +  ? _struct_composite.meta.title_main +  : format( +      "%s - %s", +      _struct_composite.meta.title_main, +      _struct_composite.meta.title_sub, +    ); +} +#+END_SRC + +* 2. TOML returns SiSUstruct (via JSON)      :module:sdp:meta_conf_make_meta: +** 0. parse TOML config return JSON + +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_toml.d +/++ +  extract native/orig header return associative array<BR> + +  the header is passed as text (lopped off top of a sisu markup file until the +  required first heading ^A~), determine whether is a native header or sdlang one +  with a regex check if whether it contains the "native header" required tag/field +  @title: then process accordingly as a "native header" or "sdlang header" +  converting the metadata and make instructions to a common json format used by +  program internally. Moved to associative array. ++/ +module sdp.meta.conf_make_meta_toml; +static template configParseTOMLreturnJSON() { +  import +    toml, +    toml.json; +  auto configParseTOMLreturnJSON(T)( +    T _text +  ){ +    TOMLDocument _doc; +    _doc = parseTOML(cast(string)(_text.content)); +    auto _doc_json = toJSON(_doc); +    return _doc_json; +  } +} +#+END_SRC + +** 1. parse TOML config to JSON return SiSUstruct + +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_toml.d +static template configParseTOMLreturnSiSUstruct() { +  import +    toml, +    toml.json; +  import +    sdp.meta.conf_make_meta_structs, +    sdp.meta.conf_make_meta_json; +  mixin contentJSONtoSiSUstruct; +  auto configParseTOMLreturnSiSUstruct(CCm, T)( +    CCm     _make_and_meta_struct, +    T       _document_struct +  ){ +    TOMLDocument _doc = parseTOML(cast(string)(_document_struct.content)); +    auto _doc_json = toJSON(_doc); +    _make_and_meta_struct = contentJSONtoSiSUstruct!()(_make_and_meta_struct, _doc_json, _document_struct.filename); // struct from json +    return _make_and_meta_struct; +  } +} +#+END_SRC + +** 2. parse TOML header to JSON then Struct + +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_toml.d +static template docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct() { +  import +    std.exception, +    std.regex, +    std.stdio, +    std.traits, +    std.typecons, +    std.utf, +    std.conv : to; +  import +    toml, +    toml.json; +  import +    sdp.meta.conf_make_meta_structs, +    sdp.meta.conf_make_meta_json, +    sdp.meta.rgx; +  mixin SiSUrgxInit; +  mixin contentJSONtoSiSUstruct; +  static auto rgx = Rgx(); +  auto docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct(CCm, Src)( +    CCm     _make_and_meta_struct, +    Src     header_src, +  ) { +    TOMLDocument _doc; +    if (header_src.match(rgx.sdlang_header_meta_title)) { +      writeln("WARNING >>> document header is sdlang (in wrong location JSON)"); +    } else if (header_src.match(rgx.toml_header_meta_title)) { +      debug (json) { +        writeln(">>> document header is toml, convert to JSON"); +      } +      _doc = parseTOML(cast(string)(header_src)); +    } +    auto _doc_json = toJSON(_doc); +    auto _header_and_make_and_meta_struct = contentJSONtoSiSUstruct!()(_make_and_meta_struct, _doc_json, "header"); +    return _header_and_make_and_meta_struct; +  } +} +#+END_SRC + +* 3. SDLang to SiSUstruct +** 1. header extract (sdlang) to Struct     :module:sdp:meta_conf_make_meta: + +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_sdlang.d  /++    extract native/orig header return associative array<BR> @@ -29,8 +894,8 @@    converting the metadata and make instructions to a common json format used by    program internally. Moved to associative array.  +/ -module sdp.meta.conf_make_meta; -static template docHeaderMakeAndMetaTupExtractAndConvertToStruct() { +module sdp.meta.conf_make_meta_sdlang; +static template docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct() {    import      std.exception,      std.regex, @@ -46,11 +911,11 @@ static template docHeaderMakeAndMetaTupExtractAndConvertToStruct() {    mixin SiSUrgxInit;    mixin SiSUextractSDLang;    static auto rgx = Rgx(); -  auto docHeaderMakeAndMetaTupExtractAndConvertToStruct(CCm, Src)( +  auto docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct(CCm, Src)(      CCm     conf_composite_make,      Src     header_src,    ) { -    auto header_sdlang_tag = (!(header_src.match(rgx.native_header_meta_title))) +    auto header_sdlang_tag = (header_src.match(rgx.sdlang_header_meta_title))      ? extractSDL().docHeaderSDLtagGet(header_src) // sdlang.ast.Tag      : null;      auto header_make_and_meta_struct = extractSDL().docSDLtoStruct(conf_composite_make, header_sdlang_tag); @@ -59,15 +924,14 @@ static template docHeaderMakeAndMetaTupExtractAndConvertToStruct() {  }  #+END_SRC -* A. module sdlang                      :module:sdp:meta_conf_make_meta_sdlang: -** 0. module template - +** 2. module sdlang                  :module:sdp:meta_conf_make_meta_sdlang: +*** 0. module template +**** 1. extract sdlang  #+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_sdlang.d  /++    sdlang headers<BR>    extract sdlang header return sdlang  +/ -module sdp.meta.conf_make_meta_sdlang;  static template SiSUextractSDLang() {    import      std.exception, @@ -79,20 +943,43 @@ static template SiSUextractSDLang() {      std.utf,      std.conv : to;    import -    sdp.meta.defaults, +    sdp.meta.conf_make_meta_structs,      sdp.meta.rgx;    struct extractSDL { -    mixin SiSUregisters; +    mixin SiSUmakeMetaStructsSDLang;      mixin SiSUrgxInit;      static auto rgx = Rgx(); -    <<meta_conf_make_meta_sdl>> +    <<meta_conf_make_meta_sdl_extract>> +    private auto docSDLtoStruct(C,Tag)(C _conf_composite, Tag header_sdlang) { // work on +      <<meta_conf_make_meta_sdl>> +      return _conf_composite; +    }    }  }  #+END_SRC -** 1. sdlang header _extract root Tag_                       :sdlang:root:tag: +**** 2. extract sdlang -#+name: meta_conf_make_meta_sdl +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_sdlang.d +static template parseSDLangConfig() { +  import +    std.exception, +    std.regex, +    std.stdio, +    std.string, +    std.traits, +    std.typecons, +    std.utf, +    std.conv : to; +  import sdlang; +  <<meta_config_file_sdlang_test>> +} +#+END_SRC + +*** 1. sdlang root tag _extract root Tag_                   :sdlang:root:tag: +**** 1. header + +#+name: meta_conf_make_meta_sdl_extract  #+BEGIN_SRC d  private auto docHeaderSDLtagGet(Hs)(Hs src_header) {    debug(asserts){ @@ -145,184 +1032,222 @@ private auto docHeaderSDLtagGet(Hs)(Hs src_header) {  }  #+END_SRC -** 2a. _sdlang to struct_ +**** 2. conf & make + +#+name: meta_config_file_sdlang_test +#+BEGIN_SRC d +auto parseSDLangConfig(string configuration, string conf_sdl_filename) { +  Tag sdl_root_conf; +  try { +    sdl_root_conf = parseSource(configuration); +  } +  catch(ParseException e) { +    stderr.writeln("SDLang problem with content for ", conf_sdl_filename); +    stderr.writeln(e.msg); +  } +  return sdl_root_conf; +} +#+END_SRC + +*** 2. _sdlang to struct_ +****  make  #+name: meta_conf_make_meta_sdl  #+BEGIN_SRC d -private auto docSDLtoStruct(C,Tag)(C _conf_composite, Tag header_sdlang) { -  mixin SiSUregisters; -  /+ make +/ -  if ("make" in header_sdlang.maybe.tags) { -    _conf_composite.make_str.bold              = _conf_composite.make.bold              = extractSDLangTabOrAttrib(header_sdlang, "make", "bold"); -    _conf_composite.make_str.breaks            = _conf_composite.make.breaks            = extractSDLangTabOrAttrib(header_sdlang, "make", "breaks"); -    _conf_composite.make_str.cover_image       = _conf_composite.make.cover_image       = extractSDLangTabOrAttrib(header_sdlang, "make", "cover_image"); -    _conf_composite.make_str.css               = _conf_composite.make.css               = extractSDLangTabOrAttrib(header_sdlang, "make", "css"); -    _conf_composite.make_str.emphasis          = _conf_composite.make.emphasis          = extractSDLangTabOrAttrib(header_sdlang, "make", "emphasis"); -    _conf_composite.make_str.footer            = _conf_composite.make.footer            = extractSDLangTabOrAttrib(header_sdlang, "make", "footer"); -    _conf_composite.make_str.headings          = _conf_composite.make.headings          = extractSDLangTabOrAttrib(header_sdlang, "make", "headings"); -    _conf_composite.make_str.home_button_image = _conf_composite.make.home_button_image = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_image"); -    _conf_composite.make_str.home_button_text  = _conf_composite.make.home_button_text  = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_text"); -    _conf_composite.make_str.italics           = _conf_composite.make.italics           = extractSDLangTabOrAttrib(header_sdlang, "make", "italics"); -    _conf_composite.make_str.num_top           = _conf_composite.make.num_top           = extractSDLangTabOrAttrib(header_sdlang, "make", "num_top"); -    _conf_composite.make_str.num_depth         = _conf_composite.make.num_depth         = extractSDLangTabOrAttrib(header_sdlang, "make", "num_depth"); -    _conf_composite.make_str.substitute        = _conf_composite.make.substitute        = extractSDLangTabOrAttrib(header_sdlang, "make", "substitute"); -    _conf_composite.make_str.texpdf_font       = _conf_composite.make.texpdf_font       = extractSDLangTabOrAttrib(header_sdlang, "make", "texpdf_font"); -  } -  /+ conf +/ -  if ("webserv" in header_sdlang.maybe.tags) { -    _conf_composite.conf.webserv_url_root        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "url_root"); -    _conf_composite.conf.webserv_path            = extractSDLangTabOrAttrib(header_sdlang, "webserv", "path"); -    _conf_composite.conf.webserv_images          = extractSDLangTabOrAttrib(header_sdlang, "webserv", "images"); -    _conf_composite.conf.webserv_cgi             = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi"); -    _conf_composite.conf.webserv_cgi_host        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host"); -    _conf_composite.conf.webserv_cgi_host_path   = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host_path"); -    _conf_composite.conf.webserv_cgi_port        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_port"); -    _conf_composite.conf.webserv_cgi_user        = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_user"); -    _conf_composite.conf.webserv_cgi_file_links  = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_file_links"); -  } -  if ("processing" in header_sdlang.maybe.tags) { -    _conf_composite.conf.processing_path         = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_path"); -    _conf_composite.conf.processing_dir          = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_dir"); -    _conf_composite.conf.processing_concord_max  = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_concord_max"); -  } -  if("flag" in header_sdlang.maybe.tags) { -    _conf_composite.conf.flag_act0               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act0"); -    _conf_composite.conf.flag_act1               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act1"); -    _conf_composite.conf.flag_act2               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act2"); -    _conf_composite.conf.flag_act3               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act3"); -    _conf_composite.conf.flag_act4               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act4"); -    _conf_composite.conf.flag_act5               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act5"); -    _conf_composite.conf.flag_act6               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act6"); -    _conf_composite.conf.flag_act7               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act7"); -    _conf_composite.conf.flag_act8               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act8"); -    _conf_composite.conf.flag_act9               = extractSDLangTabOrAttrib(header_sdlang, "flag", "act9"); -  } -  if ("default" in header_sdlang.maybe.tags) { -    _conf_composite.conf.default_papersize       = extractSDLangTabOrAttrib(header_sdlang, "default", "papersize"); -    _conf_composite.conf.default_text_wrap       = extractSDLangTabOrAttrib(header_sdlang, "default", "text_wrap"); -    _conf_composite.conf.default_emphasis        = extractSDLangTabOrAttrib(header_sdlang, "default", "emphasis"); -    _conf_composite.conf.default_language        = extractSDLangTabOrAttrib(header_sdlang, "default", "language"); -    _conf_composite.conf.default_digest          = extractSDLangTabOrAttrib(header_sdlang, "default", "digest"); -  } -  if ("search" in header_sdlang.maybe.tags) { -    _conf_composite.conf.search_flag             = extractSDLangTabOrAttrib(header_sdlang, "search", "flag"); -    _conf_composite.conf.search_action           = extractSDLangTabOrAttrib(header_sdlang, "search", "action"); -    _conf_composite.conf.search_db               = extractSDLangTabOrAttrib(header_sdlang, "search", "db"); -    _conf_composite.conf.search_title            = extractSDLangTabOrAttrib(header_sdlang, "search", "title"); -  } -  /+ meta +/ -  if ("classify" in header_sdlang.maybe.tags) { -    _conf_composite.meta.classify_dewey          = extractSDLangTabOrAttrib(header_sdlang, "classify", "dewey"); -    _conf_composite.meta.classify_keywords       = extractSDLangTabOrAttrib(header_sdlang, "classify", "keywords"); -    _conf_composite.meta.classify_loc            = extractSDLangTabOrAttrib(header_sdlang, "classify", "loc"); -    _conf_composite.meta.classify_subject        = extractSDLangTabOrAttrib(header_sdlang, "classify", "subject"); -    _conf_composite.meta.classify_topic_register = extractSDLangTabOrAttrib(header_sdlang, "classify", "topic_register"); -  } -  if ("date" in header_sdlang.maybe.tags) { -    _conf_composite.meta.date_added_to_site      = extractSDLangTabOrAttrib(header_sdlang, "date", "added_to_site"); -    _conf_composite.meta.date_available          = extractSDLangTabOrAttrib(header_sdlang, "date", "available"); -    _conf_composite.meta.date_created            = extractSDLangTabOrAttrib(header_sdlang, "date", "created"); -    _conf_composite.meta.date_issued             = extractSDLangTabOrAttrib(header_sdlang, "date", "issued"); -    _conf_composite.meta.date_modified           = extractSDLangTabOrAttrib(header_sdlang, "date", "modified"); -    _conf_composite.meta.date_published          = extractSDLangTabOrAttrib(header_sdlang, "date", "published"); -    _conf_composite.meta.date_valid              = extractSDLangTabOrAttrib(header_sdlang, "date", "valid"); -  } -  if("identifier" in header_sdlang.maybe.tags) { -    _conf_composite.meta.identifier_isbn         = extractSDLangTabOrAttrib(header_sdlang, "identifier", "isbn"); -    _conf_composite.meta.identifier_oclc         = extractSDLangTabOrAttrib(header_sdlang, "identifier", "oclc"); -    _conf_composite.meta.identifier_pg           = extractSDLangTabOrAttrib(header_sdlang, "identifier", "pg"); -  } -  if ("links" in header_sdlang.maybe.tags) { -    // _conf_composite.meta.links                   = extractSDLangTabOrAttrib(header_sdlang, "links", ""); -  } -  if ("notes" in header_sdlang.maybe.tags) { -    _conf_composite.meta.notes_abstract          = extractSDLangTabOrAttrib(header_sdlang, "notes", "abstract"); -    _conf_composite.meta.notes_description       = extractSDLangTabOrAttrib(header_sdlang, "notes", "description"); -  } -  if ("original" in header_sdlang.maybe.tags) { -    _conf_composite.meta.original_language       = extractSDLangTabOrAttrib(header_sdlang, "original", "language"); -    _conf_composite.meta.original_language_char  = extractSDLangTabOrAttrib(header_sdlang, "original", "language_char"); -    _conf_composite.meta.original_source         = extractSDLangTabOrAttrib(header_sdlang, "original", "source"); -    _conf_composite.meta.original_title          = extractSDLangTabOrAttrib(header_sdlang, "original", "title"); -  } -  if ("publisher" in header_sdlang.maybe.tags) { -    // _conf_composite.meta.publisher               = extractSDLangTabOrAttrib(header_sdlang, "publisher", ""); -  } -  if ("rights" in header_sdlang.maybe.tags) { -    _conf_composite.meta.rights_copyright               = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright"); -    _conf_composite.meta.rights_copyright_text          = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_text"); -    _conf_composite.meta.rights_copyright_audio         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_audio"); -    _conf_composite.meta.rights_copyright_cover         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_cover"); -    _conf_composite.meta.rights_copyright_illustrations = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_illustrations"); -    _conf_composite.meta.rights_copyright_photographs   = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_photographs"); -    _conf_composite.meta.rights_copyright_translation   = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_translation"); -    _conf_composite.meta.rights_copyright_video         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_video"); -    _conf_composite.meta.rights_license                 = extractSDLangTabOrAttrib(header_sdlang, "rights", "license"); -  } -  if (_conf_composite.meta.creator_author.empty) { -    if ("creator" in header_sdlang.maybe.tags) { -      _conf_composite.meta.creator_author          = extractSDLangTabOrAttrib(header_sdlang, "creator", "author"); -      _conf_composite.meta.creator_author_email    = extractSDLangTabOrAttrib(header_sdlang, "creator", "author_email"); -      _conf_composite.meta.creator_illustrator     = extractSDLangTabOrAttrib(header_sdlang, "creator", "illustrator"); -      _conf_composite.meta.creator_translator      = extractSDLangTabOrAttrib(header_sdlang, "creator", "translator"); -    } -    // dochead_meta["creator"]["author_raw"] = dochead_meta["creator"]["author"]; -    string[] authors_arr; -    auto authors_raw_arr = _conf_composite.meta.creator_author.split(rgx.arr_delimiter); -    foreach (author_raw; authors_raw_arr) { -      authors_arr ~= author_raw.replace(rgx.raw_author_munge, "$2 $1"); -    } -    _conf_composite.meta.creator_author = join(authors_arr, ", ").chomp.chomp; +/+ make ------------------------------------------------------------------- +/ +if ("make" in header_sdlang.maybe.tags) { +  confCompositeMakeBuild _mk; +  _conf_composite.make_str.bold                       = extractSDLangTabOrAttrib(header_sdlang, "make", "bold"); // TODO +  _conf_composite.make_str.breaks                     = extractSDLangTabOrAttrib(header_sdlang, "make", "breaks"); +  _conf_composite.make_str.cover_image                = extractSDLangTabOrAttrib(header_sdlang, "make", "cover_image"); +  _conf_composite.make_str.css                        = extractSDLangTabOrAttrib(header_sdlang, "make", "css"); +  _conf_composite.make_str.emphasis                   = extractSDLangTabOrAttrib(header_sdlang, "make", "emphasis"); // TODO +  _conf_composite.make_str.footer                     = extractSDLangTabOrAttrib(header_sdlang, "make", "footer"); +  _conf_composite.make_str.headings                   = extractSDLangTabOrAttrib(header_sdlang, "make", "headings"); +  _conf_composite.make_str.home_button_image          = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_image"); +  _conf_composite.make_str.home_button_text           = extractSDLangTabOrAttrib(header_sdlang, "make", "home_button_text"); +  _conf_composite.make_str.italics                    = extractSDLangTabOrAttrib(header_sdlang, "make", "italics"); // TODO +  _conf_composite.make_str.num_top                    = extractSDLangTabOrAttrib(header_sdlang, "make", "num_top"); +  _conf_composite.make_str.num_depth                  = extractSDLangTabOrAttrib(header_sdlang, "make", "num_depth"); +  _conf_composite.make_str.substitute                 = extractSDLangTabOrAttrib(header_sdlang, "make", "substitute"); // TODO +  _conf_composite.make_str.texpdf_font                = extractSDLangTabOrAttrib(header_sdlang, "make", "texpdf_font"); +  _conf_composite.make.bold_rgxmatch                  = _mk.bold_rgxmatch(_conf_composite.make_str.bold); +  _conf_composite.make.breaks                         = _mk.breaks(_conf_composite.make_str.breaks); +  _conf_composite.make.cover_image                    = _mk.cover_image(_conf_composite.make_str.cover_image); +  _conf_composite.make.css                            = _mk.css(_conf_composite.make_str.css); +  _conf_composite.make.emphasis_rgxmatch              = _mk.emphasis_rgxmatch(_conf_composite.make_str.emphasis); +  _conf_composite.make.footer                         = _mk.footer(_conf_composite.make_str.footer); +  _conf_composite.make.headings                       = _mk.headings(_conf_composite.make_str.headings); +  _conf_composite.make.home_button_image              = _mk.home_button_image(_conf_composite.make_str.home_button_image); +  _conf_composite.make.home_button_text               = _mk.home_button_text(_conf_composite.make_str.home_button_text); +  _conf_composite.make.italics_rgxmatch               = _mk.italics_rgxmatch(_conf_composite.make_str.italics); +  _conf_composite.make.num_top                        = _mk.num_top(_conf_composite.make_str.num_top); +  _conf_composite.make.num_depth                      = _mk.num_depth(_conf_composite.make_str.num_depth); +  _conf_composite.make.substitute                     = _mk.substitute(_conf_composite.make_str.substitute); +  _conf_composite.make.texpdf_font                    = _mk.texpdf_font(_conf_composite.make_str.texpdf_font); +} +#+END_SRC + +****  conf + +#+name: meta_conf_make_meta_sdl +#+BEGIN_SRC d +/+ conf ------------------------------------------------------------------- +/ +if ("webserv" in header_sdlang.maybe.tags) { +  _conf_composite.conf.webserv_url_root               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "url_root"); +  _conf_composite.conf.webserv_path                   = extractSDLangTabOrAttrib(header_sdlang, "webserv", "path"); +  _conf_composite.conf.webserv_images                 = extractSDLangTabOrAttrib(header_sdlang, "webserv", "images"); +  _conf_composite.conf.webserv_cgi                    = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi"); +  _conf_composite.conf.webserv_cgi_host               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host"); +  _conf_composite.conf.webserv_cgi_host_path          = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_host_path"); +  _conf_composite.conf.webserv_cgi_port               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_port"); +  _conf_composite.conf.webserv_cgi_user               = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_user"); +  _conf_composite.conf.webserv_cgi_file_links         = extractSDLangTabOrAttrib(header_sdlang, "webserv", "cgi_file_links"); +} +if ("processing" in header_sdlang.maybe.tags) { +  _conf_composite.conf.processing_path                = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_path"); +  _conf_composite.conf.processing_dir                 = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_dir"); +  _conf_composite.conf.processing_concord_max         = extractSDLangTabOrAttrib(header_sdlang, "webserv", "processing_concord_max"); +} +if ("flag" in header_sdlang.maybe.tags) { +  _conf_composite.conf.flag_act0                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act0"); +  _conf_composite.conf.flag_act1                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act1"); +  _conf_composite.conf.flag_act2                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act2"); +  _conf_composite.conf.flag_act3                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act3"); +  _conf_composite.conf.flag_act4                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act4"); +  _conf_composite.conf.flag_act5                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act5"); +  _conf_composite.conf.flag_act6                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act6"); +  _conf_composite.conf.flag_act7                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act7"); +  _conf_composite.conf.flag_act8                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act8"); +  _conf_composite.conf.flag_act9                      = extractSDLangTabOrAttrib(header_sdlang, "flag", "act9"); +} +if ("default" in header_sdlang.maybe.tags) { +  _conf_composite.conf.default_papersize              = extractSDLangTabOrAttrib(header_sdlang, "default", "papersize"); +  _conf_composite.conf.default_text_wrap              = extractSDLangTabOrAttrib(header_sdlang, "default", "text_wrap"); +  _conf_composite.conf.default_emphasis               = extractSDLangTabOrAttrib(header_sdlang, "default", "emphasis"); +  _conf_composite.conf.default_language               = extractSDLangTabOrAttrib(header_sdlang, "default", "language"); +  _conf_composite.conf.default_digest                 = extractSDLangTabOrAttrib(header_sdlang, "default", "digest"); +} +if ("search" in header_sdlang.maybe.tags) { +  _conf_composite.conf.search_flag                    = extractSDLangTabOrAttrib(header_sdlang, "search", "flag"); +  _conf_composite.conf.search_action                  = extractSDLangTabOrAttrib(header_sdlang, "search", "action"); +  _conf_composite.conf.search_db                      = extractSDLangTabOrAttrib(header_sdlang, "search", "db"); +  _conf_composite.conf.search_title                   = extractSDLangTabOrAttrib(header_sdlang, "search", "title"); +} +#+END_SRC + +****  meta + +#+name: meta_conf_make_meta_sdl +#+BEGIN_SRC d +/+ meta ------------------------------------------------------------------- +/ +if ("classify" in header_sdlang.maybe.tags) { +  _conf_composite.meta.classify_dewey                 = extractSDLangTabOrAttrib(header_sdlang, "classify", "dewey"); +  _conf_composite.meta.classify_keywords              = extractSDLangTabOrAttrib(header_sdlang, "classify", "keywords"); +  _conf_composite.meta.classify_loc                   = extractSDLangTabOrAttrib(header_sdlang, "classify", "loc"); +  _conf_composite.meta.classify_subject               = extractSDLangTabOrAttrib(header_sdlang, "classify", "subject"); +  _conf_composite.meta.classify_topic_register        = extractSDLangTabOrAttrib(header_sdlang, "classify", "topic_register"); +} +if ("date" in header_sdlang.maybe.tags) { +  _conf_composite.meta.date_added_to_site             = extractSDLangTabOrAttrib(header_sdlang, "date", "added_to_site"); +  _conf_composite.meta.date_available                 = extractSDLangTabOrAttrib(header_sdlang, "date", "available"); +  _conf_composite.meta.date_created                   = extractSDLangTabOrAttrib(header_sdlang, "date", "created"); +  _conf_composite.meta.date_issued                    = extractSDLangTabOrAttrib(header_sdlang, "date", "issued"); +  _conf_composite.meta.date_modified                  = extractSDLangTabOrAttrib(header_sdlang, "date", "modified"); +  _conf_composite.meta.date_published                 = extractSDLangTabOrAttrib(header_sdlang, "date", "published"); +  _conf_composite.meta.date_valid                     = extractSDLangTabOrAttrib(header_sdlang, "date", "valid"); +} +if ("identifier" in header_sdlang.maybe.tags) { +  _conf_composite.meta.identifier_isbn                = extractSDLangTabOrAttrib(header_sdlang, "identifier", "isbn"); +  _conf_composite.meta.identifier_oclc                = extractSDLangTabOrAttrib(header_sdlang, "identifier", "oclc"); +  _conf_composite.meta.identifier_pg                  = extractSDLangTabOrAttrib(header_sdlang, "identifier", "pg"); +} +if ("links" in header_sdlang.maybe.tags) { +  // _conf_composite.meta.links                         = extractSDLangTabOrAttrib(header_sdlang, "links", ""); +} +if ("notes" in header_sdlang.maybe.tags) { +  _conf_composite.meta.notes_abstract                 = extractSDLangTabOrAttrib(header_sdlang, "notes", "abstract"); +  _conf_composite.meta.notes_description              = extractSDLangTabOrAttrib(header_sdlang, "notes", "description"); +} +if ("original" in header_sdlang.maybe.tags) { +  _conf_composite.meta.original_language              = extractSDLangTabOrAttrib(header_sdlang, "original", "language"); +  _conf_composite.meta.original_language_char         = extractSDLangTabOrAttrib(header_sdlang, "original", "language_char"); +  _conf_composite.meta.original_source                = extractSDLangTabOrAttrib(header_sdlang, "original", "source"); +  _conf_composite.meta.original_title                 = extractSDLangTabOrAttrib(header_sdlang, "original", "title"); +} +if ("publisher" in header_sdlang.maybe.tags) { +  // _conf_composite.meta.publisher                     = extractSDLangTabOrAttrib(header_sdlang, "publisher", ""); +} +if ("rights" in header_sdlang.maybe.tags) { +  _conf_composite.meta.rights_copyright               = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright"); +  _conf_composite.meta.rights_copyright_text          = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_text"); +  _conf_composite.meta.rights_copyright_audio         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_audio"); +  _conf_composite.meta.rights_copyright_cover         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_cover"); +  _conf_composite.meta.rights_copyright_illustrations = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_illustrations"); +  _conf_composite.meta.rights_copyright_photographs   = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_photographs"); +  _conf_composite.meta.rights_copyright_translation   = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_translation"); +  _conf_composite.meta.rights_copyright_video         = extractSDLangTabOrAttrib(header_sdlang, "rights", "copyright_video"); +  _conf_composite.meta.rights_license                 = extractSDLangTabOrAttrib(header_sdlang, "rights", "license"); +} +if (_conf_composite.meta.creator_author.empty) { +  if ("creator" in header_sdlang.maybe.tags) { +    _conf_composite.meta.creator_author               = extractSDLangTabOrAttrib(header_sdlang, "creator", "author"); +    _conf_composite.meta.creator_author_email         = extractSDLangTabOrAttrib(header_sdlang, "creator", "author_email"); +    _conf_composite.meta.creator_illustrator          = extractSDLangTabOrAttrib(header_sdlang, "creator", "illustrator"); +    _conf_composite.meta.creator_translator           = extractSDLangTabOrAttrib(header_sdlang, "creator", "translator"); +  } +  // dochead_meta["creator"]["author_raw"] = dochead_meta["creator"]["author"]; +  string[] authors_arr; +  auto authors_raw_arr = _conf_composite.meta.creator_author.split(rgx.arr_delimiter); +  foreach (author_raw; authors_raw_arr) { +    authors_arr ~= author_raw.replace(rgx.raw_author_munge, "$2 $1"); +  } +  _conf_composite.meta.creator_author = join(authors_arr, ", ").chomp.chomp; +} +if (_conf_composite.meta.title_main.empty) { +  if ("title" in header_sdlang.maybe.tags) { +    _conf_composite.meta.title_edition                = extractSDLangTabOrAttrib(header_sdlang, "title", "edition"); +    // _conf_composite.meta.title_full                  = extractSDLangTabOrAttrib(header_sdlang, "title", "full"); +    _conf_composite.meta.title_language               = extractSDLangTabOrAttrib(header_sdlang, "title", "language"); +    _conf_composite.meta.title_main                   = extractSDLangTabOrAttrib(header_sdlang, "title", "main"); +    _conf_composite.meta.title_note                   = extractSDLangTabOrAttrib(header_sdlang, "title", "note"); +    _conf_composite.meta.title_sub                    = extractSDLangTabOrAttrib(header_sdlang, "title", "sub"); +    _conf_composite.meta.title_subtitle               = extractSDLangTabOrAttrib(header_sdlang, "title", "subtitle");    }    if (_conf_composite.meta.title_main.empty) { -    if ("title" in header_sdlang.maybe.tags) { -      _conf_composite.meta.title_edition           = extractSDLangTabOrAttrib(header_sdlang, "title", "edition"); -      _conf_composite.meta.title_language          = extractSDLangTabOrAttrib(header_sdlang, "title", "language"); -      _conf_composite.meta.title_main              = extractSDLangTabOrAttrib(header_sdlang, "title", "main"); -      _conf_composite.meta.title_note              = extractSDLangTabOrAttrib(header_sdlang, "title", "note"); -      _conf_composite.meta.title_sub               = extractSDLangTabOrAttrib(header_sdlang, "title", "sub"); -      _conf_composite.meta.title_subtitle          = extractSDLangTabOrAttrib(header_sdlang, "title", "subtitle"); -    } -    if (_conf_composite.meta.title_main.empty) { -      Tag _maintag = header_sdlang.getTag("title"); -      if (_maintag !is null) { -        if ("main" in _maintag.maybe.tags) { -          _conf_composite.meta.title_main -            = to!string(_maintag.getTagValues("main")); -        } else if ("main" !in _maintag.maybe.attributes) { -          writeln(_maintag.values[0]); // document title -          _conf_composite.meta.title_main -            = (_maintag.values[0]).to!string; // test that this exists -        } +    Tag _maintag = header_sdlang.getTag("title"); +    if (_maintag !is null) { +      if ("main" in _maintag.maybe.tags) { +        _conf_composite.meta.title_main +          = to!string(_maintag.getTagValues("main")); +      } else if ("main" !in _maintag.maybe.attributes) { +        _conf_composite.meta.title_main +          = (_maintag.values[0]).to!string; // test that this exists        }      } -    if ((!(_conf_composite.meta.title_subtitle.empty)) -    && (_conf_composite.meta.title_sub.empty)) { -      _conf_composite.meta.title_sub = _conf_composite.meta.title_subtitle; -    } -    if (_conf_composite.meta.title_sub.empty) { -      _conf_composite.meta.title_full = _conf_composite.meta.title_main; -    } else { -      _conf_composite.meta.title_full = format( -        "%s - %s", -        _conf_composite.meta.title_main, -        _conf_composite.meta.title_sub, -      ); -    }    } -  return _conf_composite; +  if ((!(_conf_composite.meta.title_subtitle.empty)) +  && (_conf_composite.meta.title_sub.empty)) { +    _conf_composite.meta.title_sub = _conf_composite.meta.title_subtitle; +  } +  _conf_composite.meta.title_full = (_conf_composite.meta.title_sub.empty) +  ? _conf_composite.meta.title_main +  : format( +      "%s - %s", +      _conf_composite.meta.title_main, +      _conf_composite.meta.title_sub, +    );  }  #+END_SRC -* C. module conf files make composite -** TODO 0. module template +** 3. module conf files make composite +*** TODO 0. module template -#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_composite.d +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_sdlang.d  /++    return composite make from config files  +/ -module sdp.meta.conf_make_meta_composite; -<<meta_conf_make_meta_composite_struct>> +<<meta_conf_make_meta_sdl_to_composite_struct>>  template confFilesSDLtoStruct() {    import      std.exception, @@ -334,48 +1259,255 @@ template confFilesSDLtoStruct() {      std.utf,      std.conv : to;    import -    sdp.meta.defaults, +    sdp.meta.conf_make_meta_structs,      sdp.meta.rgx; -  <<meta_conf_make_meta_composite>> +  <<meta_conf_make_meta_sdl_to_composite>>  }  #+END_SRC -** module template +*** _sdlang to parse_ composite make -#+name: meta_conf_make_meta_composite +#+name: meta_conf_make_meta_sdl_to_composite +#+BEGIN_SRC d +auto configParseSDL(T)( +  T _text +){ +  Tag sdl_root; +  try { +    sdl_root = parseSource(_text.to!string); +  } +  catch(ParseException e) { +    stderr.writeln("SDLang problem with this document header:"); +    stderr.writeln(_src_header); +    // Error messages of the form: +    // myFile.sdl(5:28): Error: Invalid integer suffix. +    stderr.writeln(e.msg); +  } +  debug(sdlang) { +    writeln("header SDL:"); +    writeln(__LINE__, ": ",  sdl_root.toSDLDocument()); +    writeln(__LINE__, ": ",  sdl_root.maybe.namespaces); +    writeln("header make sdlang: ", sdl_root.toSDLDocument()); +    writeln(__LINE__, ": ", sdl_root.getTagValues("title")); +    writeln(__LINE__, ": ", sdl_root.getTagValues("creator")); +    Tag creator = sdl_root.getTag("creator"); +    if (creator !is null) { +      if ("author" in creator.maybe.tags) { +        writeln(__LINE__, ": ", creator.getTagValues("author")); +      } else if ("author" in creator.maybe.attributes) { +        writeln(__LINE__, ": ", creator.maybe.attributes["author"][0].value); +      } +    } +  } +  return sdl_root; // sdlang.ast.Tag +} +#+END_SRC + +*** _sdlang to struct_ composite make + +#+name: meta_conf_make_meta_sdl_to_composite  #+BEGIN_SRC d  auto confFilesSDLtoStruct(S,L)(    S sdl_root_config_share,    L sdl_root_config_local,  ){ -  mixin SiSUregisters; +  mixin SiSUmakeMetaStructsSDLang;    ConfCompositePlus _conf_composite;    foreach (conf_sdlang; [sdl_root_config_share, sdl_root_config_local]) {      if ("make" in conf_sdlang.maybe.tags) { -       _conf_composite.make_str.bold              = _conf_composite.make.bold              = extractSDLangTabOrAttrib(conf_sdlang, "make", "bold"); -       _conf_composite.make_str.breaks            = _conf_composite.make.breaks            = extractSDLangTabOrAttrib(conf_sdlang, "make", "breaks"); -       _conf_composite.make_str.cover_image       = _conf_composite.make.cover_image       = extractSDLangTabOrAttrib(conf_sdlang, "make", "cover_image"); -       _conf_composite.make_str.css               = _conf_composite.make.css               = extractSDLangTabOrAttrib(conf_sdlang, "make", "css"); -       _conf_composite.make_str.emphasis          = _conf_composite.make.emphasis          = extractSDLangTabOrAttrib(conf_sdlang, "make", "emphasis"); -       _conf_composite.make_str.footer            = _conf_composite.make.footer            = extractSDLangTabOrAttrib(conf_sdlang, "make", "footer"); -       _conf_composite.make_str.headings          = _conf_composite.make.headings          = extractSDLangTabOrAttrib(conf_sdlang, "make", "headings"); -       _conf_composite.make_str.home_button_image = _conf_composite.make.home_button_image = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_image"); -       _conf_composite.make_str.home_button_text  = _conf_composite.make.home_button_text  = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_text"); -       _conf_composite.make_str.italics           = _conf_composite.make.italics           = extractSDLangTabOrAttrib(conf_sdlang, "make", "italics"); -       _conf_composite.make_str.num_top           = _conf_composite.make.num_top           = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_top"); -       _conf_composite.make_str.num_depth         = _conf_composite.make.num_depth         = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_depth"); -       _conf_composite.make_str.substitute        = _conf_composite.make.substitute        = extractSDLangTabOrAttrib(conf_sdlang, "make", "substitute"); -       _conf_composite.make_str.texpdf_font       = _conf_composite.make.texpdf_font       = extractSDLangTabOrAttrib(conf_sdlang, "make", "texpdf_font"); +      confCompositeMakeBuild _mk; +      _conf_composite.make_str.bold               = extractSDLangTabOrAttrib(conf_sdlang, "make", "bold"); // TODO +      _conf_composite.make_str.breaks             = extractSDLangTabOrAttrib(conf_sdlang, "make", "breaks"); +      _conf_composite.make_str.cover_image        = extractSDLangTabOrAttrib(conf_sdlang, "make", "cover_image"); +      _conf_composite.make_str.css                = extractSDLangTabOrAttrib(conf_sdlang, "make", "css"); +      _conf_composite.make_str.emphasis           = extractSDLangTabOrAttrib(conf_sdlang, "make", "emphasis"); // TODO +      _conf_composite.make_str.footer             = extractSDLangTabOrAttrib(conf_sdlang, "make", "footer"); +      _conf_composite.make_str.headings           = extractSDLangTabOrAttrib(conf_sdlang, "make", "headings"); +      _conf_composite.make_str.home_button_image  = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_image"); +      _conf_composite.make_str.home_button_text   = extractSDLangTabOrAttrib(conf_sdlang, "make", "home_button_text"); +      _conf_composite.make_str.italics            = extractSDLangTabOrAttrib(conf_sdlang, "make", "italics"); // TODO +      _conf_composite.make_str.num_top            = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_top"); +      _conf_composite.make_str.num_depth          = extractSDLangTabOrAttrib(conf_sdlang, "make", "num_depth"); +      _conf_composite.make_str.substitute         = extractSDLangTabOrAttrib(conf_sdlang, "make", "substitute"); // TODO +      _conf_composite.make_str.texpdf_font        = extractSDLangTabOrAttrib(conf_sdlang, "make", "texpdf_font"); +      _conf_composite.make.bold_rgxmatch          = _mk.bold_rgxmatch(_conf_composite.make_str.bold); // +      _conf_composite.make.breaks                 = _mk.breaks(_conf_composite.make_str.breaks); +      _conf_composite.make.cover_image            = _mk.cover_image(_conf_composite.make_str.cover_image); +      _conf_composite.make.css                    = _mk.css(_conf_composite.make_str.css); +      _conf_composite.make.emphasis_rgxmatch      = _mk.emphasis_rgxmatch(_conf_composite.make_str.emphasis); +      _conf_composite.make.footer                 = _mk.footer(_conf_composite.make_str.footer); +      _conf_composite.make.headings               = _mk.headings(_conf_composite.make_str.headings); +      _conf_composite.make.home_button_image      = _mk.home_button_image(_conf_composite.make_str.home_button_image); +      _conf_composite.make.home_button_text       = _mk.home_button_text(_conf_composite.make_str.home_button_text); +      _conf_composite.make.italics_rgxmatch       = _mk.italics_rgxmatch(_conf_composite.make_str.italics); +      _conf_composite.make.num_top                = _mk.num_top(_conf_composite.make_str.num_top); +      _conf_composite.make.num_depth              = _mk.num_depth(_conf_composite.make_str.num_depth); +      _conf_composite.make.substitute             = _mk.substitute(_conf_composite.make_str.substitute); // TODO +      _conf_composite.make.texpdf_font            = _mk.texpdf_font(_conf_composite.make_str.texpdf_font);      }    }    return _conf_composite;  }  #+END_SRC -** initialize / imports +** 4. SDLang default make meta structs            :module:sdp:meta_defaults: + +#+name: tangle_defaults +#+BEGIN_SRC d :tangle ../src/sdp/meta/conf_make_meta_sdlang.d +/++ +  default settings ++/ +template SiSUmakeMetaStructsSDLang() { +  <<meta_defaults_imports>> +  string extractSDLangTabOrAttrib(S)( +    S conf_sdlang, +    string maintab, +    string atab +  ) { +    string _conf_composite_string = ""; +    if (maintab in conf_sdlang.maybe.tags) { +      auto _maintag = conf_sdlang.getTag(maintab); +      if ( +        (atab in _maintag.maybe.tags) +        && (_maintag.getTagValues(atab).length > 0) +      ) { +        debug(configsdlang) { +          writeln( +            "  ", __LINE__, +            ": sdl tag, ", +            maintab, ":", atab, ": ", +            _maintag.getTagValues(atab)[0] +          ); +        } +        if (_maintag.getTagValues(atab).length == 1) { +          writeln((_maintag.getTagValues(atab)[0]).to!string); +          _conf_composite_string +            = (_maintag.getTagValues(atab)[0]).to!string; +        } else if (_maintag.getTagValues(atab).length > 1) { +          string _tmp = ""; +          foreach (st; _maintag.getTagValues(atab)) { +            writeln(st.to!string, ";"); +            _tmp ~= st.to!string ~ ";"; +          } +          _conf_composite_string = _tmp; +        } +      } else if ( +        (atab in _maintag.maybe.attributes) +        && (_maintag.attributes[atab][0].value.length > 0) +      ) { +        debug(configsdlang) { +          writeln( +            "  ", __LINE__, +            ": sdl attrib, ", +            maintab, ":", atab, ": ", +            _maintag.attributes[atab][0].value +          ); +        } +        _conf_composite_string +          = (_maintag.attributes[atab][0].value).to!string; +      } +    } +    return _conf_composite_string; +  } +} +#+END_SRC + +* __END__ +** notes headers -#+name: imports  #+BEGIN_SRC d -import sdp.meta; -import std.array; +/+ +  /+ +    unify internal representation of header info for native & sdlang document headers +    represent either using struct, hashes or possibly json +    sdp internal representation should be identical for native & sdlang variants +  +/ +header. +  ├── make                         // make instructions +  │   ├── bold +  │   ├── breaks +  │   ├── cover_image +  │   ├── css +  │   ├── emphasis +  │   ├── footer +  │   ├── headings +  │   ├── home_button_image +  │   ├── home_button_text +  │   ├── italics +  │   ├── num_top +  │   ├── substitute +  │   └── texpdf_font +  └── meta                         // metadata +     ├── author                    // move author to creator:author +     ├── classify +     │   ├── dewey +     │   ├── keyword +     │   ├── loc +     │   ├── subject +     │   └── topic_register +     ├── creator +     │   ├── author +     │   │     ├── [ [first_name: x0, last_name: y0], [first_name: x1, last_name: y1] ] +     │   │     └── [ full_name0, full_name1 ] +     │   ├── author_email +     │   ├── illustrator +     │   └── translator +     ├── date +     │   ├── added_to_site +     │   ├── available +     │   ├── created +     │   ├── issued +     │   ├── modified +     │   ├── published +     │   └── valid +     ├── identifier +     │   ├── isbn +     │   ├── oclc +     │   └── pg +     ├── links +     ├── notes +     │   ├── abstract +     │   └── description +     ├── original +     │   ├── language +     │   ├── source +     │   └── title +     ├── publisher +     │   └── name +     ├── rights +     │   ├── copyright +     │   ├── cover +     │   ├── illustrations +     │   └── license +     └── title                    // move title: to title:main +         ├── edition +         ├── [ full (main + sub) ] +         ├── language +         ├── main +         ├── note +         ├── sub +         └── subtitle              // move title:subtitle to title:sub + +61 leaves ++/ +#+END_SRC + +** dlang rgx example + +#+BEGIN_SRC d +import std.conv, std.regex, std.range, std.file, std.stdio; +import std.string : format; +void main(string[] argv) { +  immutable ratio = 1.5824;  // UK pounds to US dollar as of this writing +  auto toDollars(Captures!string price) { +    real value = to!real(price["integer"]); +    if (!price["fraction"].empty) +      value += 0.01*to!real(price["fraction"]); +    return format("$%.2f",value * ratio); +  } +  string text = std.file.readText(argv[1]); +  auto converted = replaceAll!toDollars(text, +    regex(r"£\s*(?P<integer>[0-9]+)(\.(?P<fraction>[0-9]{2}))?","g")); +  write(converted); +}  #+END_SRC diff --git a/org/meta_debugs.org b/org/meta_debugs.org index d11b64b..e624181 100644 --- a/org/meta_debugs.org +++ b/org/meta_debugs.org @@ -111,8 +111,7 @@ debug(parent) {  #+BEGIN_SRC d  debug(dumpdoc) {    writefln( -    "%s\n%s:%s", -    "-------------------------------", +    "> %s:%s",      __FILE__,      __LINE__,    ); @@ -478,8 +477,7 @@ debug(blurb_section) {  #+BEGIN_SRC d  debug(objects) {    writefln( -    "%s\n%s:%s", -    "-------------------------------", +    "> %s:%s",      __FILE__,      __LINE__,    ); @@ -662,8 +660,7 @@ debug(headermetadatajson) {  #+BEGIN_SRC d  debug(anchor) {    writefln( -    "%s\n%s:%s", -    "-------------------------------", +    "> %s:%s",      __FILE__,      __LINE__,    ); @@ -711,8 +708,7 @@ debug(heading) {                         // heading  #+BEGIN_SRC d  debug(headings) {    writefln( -    "%s\n%s:%s", -    "-------------------------------", +    "> %s:%s",      __FILE__,      __LINE__,    ); diff --git a/org/meta_read_source_files.org b/org/meta_read_source_files.org index 3bf02b1..b97eb36 100644 --- a/org/meta_read_source_files.org +++ b/org/meta_read_source_files.org @@ -38,19 +38,126 @@ import  module sdp.meta.read_config_files;  <<meta_config_file_in>>  <<meta_config_file_sdl>> +<<meta_config_file_toml>>  <<meta_config_file_hub>>  #+END_SRC -** 1. read config file, (conf.sdl & sisu_document_make)        :file:config: +*** 0. read config files (config_local_site & sisu_document_make) toml or sdlang +**** 1. site configuration + +#+name: meta_config_file_hub +#+BEGIN_SRC d +static template readConfigSite() { +  <<imports_std>> +  final auto readConfigSite(M,E)(M _manifest, E _env) { +    string config_file_str; +    string conf_filename = "NONE"; +    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env); +    auto possible_config_path_locations = _conf_file_details.possible_config_path_locations.config_local_site; +    foreach(conf_fn; [_conf_file_details.config_filename_site_toml, _conf_file_details.config_filename_site_sdl]) { +      foreach(pth; possible_config_path_locations) { +        auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_fn)).array; +        conf_filename = conf_fn; +        if (config_file_str.length > 0) { +          // conf_filename = conf_fn; +          break; +        } +        try { +          if (exists(conf_file)) { +            debug(io) { +              writeln("WARNING (io debug) in config file found: ", conf_file); +              // writeln(__LINE__, ": found: ", conf_file, " in ", pth); +            } +            config_file_str = conf_file.readText; +            break; +          } +        } +        catch (ErrnoException ex) { +        } +        catch (FileException ex) { +        } +      } +      if (config_file_str.length > 0) { break; } +    } +    struct _ConfContent { +      string filename() { +        return conf_filename; +      } +      string filetype() { +        return conf_filename.extension.chompPrefix("."); +      } +      auto content() { +        return config_file_str; +      } +    } +    return _ConfContent(); +  } +} +#+END_SRC + +**** 2. document make/config + +#+name: meta_config_file_hub +#+BEGIN_SRC d +static template readConfigDoc() { +  <<imports_std>> +  final auto readConfigDoc(M,E)(M _manifest, E _env) { +    string config_file_str; +    string conf_filename = "NONE"; +    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env); +    auto possible_config_path_locations = _conf_file_details.possible_config_path_locations.sisu_document_make; +    foreach(conf_fn; [_conf_file_details.config_filename_document_toml, _conf_file_details.config_filename_document_sdl]) { +      foreach(pth; possible_config_path_locations) { +        auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_fn)).array; +        conf_filename = conf_fn; +        if (config_file_str.length > 0) { +          // conf_filename = conf_fn; +          break; +        } +        try { +          if (exists(conf_file)) { +            debug(io) { +              writeln("WARNING (io debug) in config file found: ", conf_file); +            } +            config_file_str = conf_file.readText; +            break; +          } +        } +        catch (ErrnoException ex) { +        } +        catch (FileException ex) { +        } +      } +      if (config_file_str.length > 0) { break; } +    } +    struct _ConfContent { +      string filename() { +        return conf_filename; +      } +      string filetype() { +        return conf_filename.extension.chompPrefix("."); +      } +      auto content() { +        return config_file_str; +      } +    } +    return _ConfContent(); +  } +} +#+END_SRC + +** A. SDLang +*** 1. SDLang read config files (config_local_site & sisu_document_make) :file:config: +**** SDLang config_local_site  #+name: meta_config_file_in  #+BEGIN_SRC d -static template configInSite() { +static template configReadInSiteSDL() {    <<imports_std>> -  final string configInSite(M,E)(M manifest, E env) { +  final string configReadInSiteSDL(M,E)(M manifest, E env) {      auto conf_file_details = ConfigFilePaths!()(manifest, env); -    string conf_sdl = conf_file_details.possible_config_path_locations.config_filename_site; -    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.local_site; +    string conf_sdl = conf_file_details.config_filename_site_sdl; +    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.config_local_site;      string config_file_str;      debug(io) {        writeln("WARNING (io debug) in config filename: ", conf_sdl); @@ -80,14 +187,16 @@ static template configInSite() {  }  #+END_SRC +**** SDLang sisu_document_make +  #+name: meta_config_file_in  #+BEGIN_SRC d -static template configInDoc() { +static template configReadInDocSDL() {    <<imports_std>> -  final string configInDoc(M,E)(M manifest, E env) { +  final string configReadInDocSDL(M,E)(M manifest, E env) {      auto conf_file_details = ConfigFilePaths!()(manifest, env); -    string conf_sdl = conf_file_details.config_filename_document; -    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.document; +    string conf_sdl = conf_file_details.config_filename_document_sdl; +    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.sisu_document_make;      string config_file_str;      debug(io) {        writeln("WARNING (io debug) in config filename: ", conf_sdl); @@ -117,85 +226,181 @@ static template configInDoc() {  }  #+END_SRC -** 2. config files get sdlang root tag -*** 0. template +*** 2. SDLang config files get (sdlang root tag) +  #+name: meta_config_file_sdl  #+BEGIN_SRC d -/+ - -+/ -static template ConfigSDLang() { +static template configSDLang() {    import sdlang;    <<imports_std>> -  <<meta_config_file_sdlang>> +  auto configSDLang(string configuration, string conf_sdl_filename) { +    Tag sdl_root_conf; +    try { +      sdl_root_conf = parseSource(configuration); +    } +    catch(ParseException e) { +      stderr.writeln("SDLang problem with content for ", conf_sdl_filename); +      stderr.writeln(e.msg); +    } +    return sdl_root_conf; +  }  }  #+END_SRC -*** config file get sdl root tag                         :file:conf:sdlang: +*** 3. SDLang config (config_local_site & sisu_document_make) :file:config:hub: -#+name: meta_config_file_sdlang +#+name: meta_config_file_hub  #+BEGIN_SRC d -auto ConfigSDLang(string configuration, string conf_sdl_filename) { -  Tag sdl_root_conf; -  try { -    sdl_root_conf = parseSource(configuration); +static template configReadSiteSDLang() { +  <<imports_std>> +  import sdlang; +  final auto configReadSiteSDLang(M,E)(M manifest, E env) { +    auto configuration = configReadInSiteSDL!()(manifest, env); +    auto conf_file_details = ConfigFilePaths!()(manifest, env); +    string conf_sdl = conf_file_details.config_filename_site_sdl; +    auto sdl_root = configSDLang!()(configuration, conf_sdl); +    return sdl_root;    } -  catch(ParseException e) { -    stderr.writeln("SDLang problem with content for ", conf_sdl_filename); -    stderr.writeln(e.msg); +} +static template configReadDocSDLang() { +  <<imports_std>> +  import sdlang; +  final auto configReadDocSDLang(M,E)(M manifest, E env) { +    auto configuration = configReadInDocSDL!()(manifest, env); +    auto conf_file_details = ConfigFilePaths!()(manifest, env); +    string conf_sdl = conf_file_details.config_filename_document_sdl; +    auto sdl_root = configSDLang!()(configuration, conf_sdl); +    return sdl_root;    } -  return sdl_root_conf;  }  #+END_SRC -** 3. config file (conf.sdl & sisu_document_make)          :file:config:hub: -*** 0. template +** B. TOML +*** 1. TOML read config files (config_local_site & sisu_document_make) :file:config: +**** TOML config_local_site -#+name: meta_config_file_hub +#+name: meta_config_file_in  #+BEGIN_SRC d -/+ -+/ -static template configReadSite() { -  <<imports_std>> -  <<meta_config_file_import_sdlang>> -  <<meta_config_file_sdlang_hub_site>> -} -static template configReadDoc() { +static template configReadInSiteTOML() {    <<imports_std>> -  <<meta_config_file_import_sdlang>> -  <<meta_config_file_sdlang_hub_doc>> +  final string configReadInSiteTOML(M,E)(M manifest, E env) { +    auto conf_file_details = ConfigFilePaths!()(manifest, env); +    string conf_toml = conf_file_details.config_filename_site_toml; +    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.config_local_site; +    string config_file_str; +    debug(io) { +      writeln("WARNING (io debug) in config filename: ", conf_toml); +      writeln("WARNING (io debug) in config possible path locations: ", possible_config_path_locations); +    } +    foreach(pth; possible_config_path_locations) { +      auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_toml)).array; +      if (config_file_str.length > 0) { +        break; +      } +      try { +        if (exists(conf_file)) { +          debug(io) { +            writeln("WARNING (io debug) in config file found: ", conf_file); +          } +          config_file_str = conf_file.readText; +          break; +        } +      } +      catch (ErrnoException ex) { +      } +      catch (FileException ex) { +      } +    } +    return config_file_str; +  }  }  #+END_SRC -*** config hub _import sdlang_ -#+name: meta_config_file_import_mixin +**** TOML sisu_document_make + +#+name: meta_config_file_in  #+BEGIN_SRC d -import sdlang; +static template configReadInDocTOML() { +  <<imports_std>> +  final string configReadInDocTOML(M,E)(M manifest, E env) { +    auto conf_file_details = ConfigFilePaths!()(manifest, env); +    string conf_toml = conf_file_details.config_filename_document_toml; +    auto possible_config_path_locations = conf_file_details.possible_config_path_locations.sisu_document_make; +    string config_file_str; +    debug(io) { +      writeln("WARNING (io debug) in config filename: ", conf_toml); +      writeln("WARNING (io debug) in config possible path locations: ", possible_config_path_locations); +    } +    foreach(pth; possible_config_path_locations) { +      auto conf_file = asNormalizedPath(chainPath(to!string(pth), conf_toml)).array; +      if (config_file_str.length > 0) { +        break; +      } +      try { +        if (exists(conf_file)) { +          debug(io) { +            writeln("WARNING (io debug) in config file found: ", conf_file); +          } +          config_file_str = conf_file.readText; +          break; +        } +      } +      catch (ErrnoException ex) { +      } +      catch (FileException ex) { +      } +    } +    return config_file_str; +  } +}  #+END_SRC -*** config hub function read makes for site & doc - -Read in sdl config file name given, and return sdl root +*** 2. TOML config files get -#+name: meta_config_file_sdlang_hub_site +#+name: meta_config_file_toml  #+BEGIN_SRC d -final auto configReadSite(M,E)(M manifest, E env) { -  auto configuration = configInSite!()(manifest, env); -  auto conf_file_details = ConfigFilePaths!()(manifest, env); -  string conf_sdl = conf_file_details.possible_config_path_locations.config_filename_site; -  auto sdl_root = ConfigSDLang!()(configuration, conf_sdl); -  return sdl_root; +static template configTOML() { +  import toml; // +  <<imports_std>> +  auto configTOML(string configuration, string conf_toml_filename) { +    TOMLDocument _toml_conf; +    try { +      _toml_conf = parseTOML(configuration); // parseTOML(cast(string)(configuration)); +    } +    catch(ErrnoException e) { +      stderr.writeln("Toml problem with content for ", conf_toml_filename); +      stderr.writeln(e.msg); +    } +    return _toml_conf; +  }  }  #+END_SRC -#+name: meta_config_file_sdlang_hub_doc +*** 3. TOML config (config_local_site & sisu_document_make) :file:config:hub: + +#+name: meta_config_file_hub  #+BEGIN_SRC d -final auto configReadDoc(M,E)(M manifest, E env) { -  auto configuration = configInDoc!()(manifest, env); -  auto conf_file_details = ConfigFilePaths!()(manifest, env); -  string conf_sdl = conf_file_details.config_filename_document; -  auto sdl_root = ConfigSDLang!()(configuration, conf_sdl); -  return sdl_root; +static template configReadSiteTOML() { +  <<imports_std>> +  import toml; +  final auto configReadSiteTOML(M,E)(M _manifest, E _env) { +    auto _configuration = configReadInSiteTOML!()(_manifest, _env); +    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env); +    string _conf_toml = _conf_file_details.config_filename_site_toml; +    auto _toml_conf = configTOML!()(_configuration, _conf_toml); +    return _toml_conf; +  } +} +static template configReadDocTOML() { +  <<imports_std>> +  import toml; +  final auto configReadDocTOML(M,E)(M _manifest, E _env) { +    auto _configuration = configReadInDocTOML!()(_manifest, _env); +    auto _conf_file_details = ConfigFilePaths!()(_manifest, _env); +    string _conf_toml = _conf_file_details.config_filename_document_toml; +    auto _toml_conf = configTOML!()(_configuration, _conf_toml); +    return _toml_conf; +  }  }  #+END_SRC @@ -280,7 +485,7 @@ static template SiSUrawMarkupContent() {      <<meta_markup_source_raw_get_insert_source_line_array>>    }    struct Inserts { -    import sdp.meta.defaults; +    import sdp.meta.conf_make_meta_sdlang;      auto scan_subdoc_source(O)(        O        _opt_action,        char[][] markup_sourcefile_insert_content, @@ -311,7 +516,7 @@ static template SiSUrawMarkupContent() {  #+END_SRC  ** get markup source, read file                              :source:markup: -*** [#A] read file, source string                                  :string: +*** read file, source string                                  :string:  #+name: meta_markup_source_raw_read_file_source_string  #+BEGIN_SRC d @@ -343,12 +548,7 @@ final private string readInMarkupSource(in char[] fn_src) {  }  #+END_SRC -**** notes -source_txt_str = readText(fn_src); // ok -catch (ErrnoException ex) { -} - -*** [#A] document header & content, array.length == 2               :array: +*** document header & content, array.length == 2               :array:  here you split document header and body, an array.length == 2  split is on first match of level A~ (which is required) @@ -599,10 +799,6 @@ if (type["curly_code"] == 1) {      insert_file_list ~= to!string(fn_src_insert);    auto raw = MarkupRawUnit();    /+ TODO +/ -  if (auto ma = line.match(rgx.src_fn_text)) { -    /+ .sst when inserted, not used: headers and heading level ^:?A~ so remove +/ -    writeln(__LINE__); writeln(ma); -  }    auto markup_sourcefile_insert_content      = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts);    debug(insert_file) { diff --git a/org/output_sisupod.org b/org/output_sisupod.org index 82e654b..7af3573 100644 --- a/org/output_sisupod.org +++ b/org/output_sisupod.org @@ -152,34 +152,36 @@ auto fn_sisupod = pths_sisupod.sisupod_filename(doc_matters.src.filename).zpod;      }    }  } { /+ bundle sisu_document_make +/ -  auto fn_src_in = ((doc_matters.src.is_pod) -    ? doc_matters.src.conf_dir_path -    : pth_sisudoc_src.conf_root).to!string -    ~ "/" ~ "sisu_document_make"; -  auto fn_src_out_sisupod_zip_base -    = pths_sisupod.conf_root(doc_matters.src.filename).zpod.to!string ~ "/" ~ "sisu_document_make"; -  auto fn_src_out_filesystem -    = pths_sisupod.conf_root(doc_matters.src.filename).filesystem_open_zpod.to!string -    ~ "/" ~ "sisu_document_make"; // TODO -  if (exists(fn_src_in)) { -    debug(io) { -      writeln("WARNING (io debug) src out found: ", fn_src_in); -    } -    if (doc_matters.opt.action.source) { -      fn_src_in.copy(fn_src_out_filesystem); -    } -    if (doc_matters.opt.action.sisupod) { -      auto zip_arc_member_file = new ArchiveMember(); -      zip_arc_member_file.name = fn_src_out_sisupod_zip_base; -      auto zip_data = new OutBuffer(); -      zip_data.write((fn_src_in).readText); -      zip_arc_member_file.expandedData = zip_data.toBytes(); -      zip.addMember(zip_arc_member_file); -    } -  } else { -    if (doc_matters.opt.action.verbose -    || doc_matters.opt.action.debug_do) { -      writeln("WARNING (io) src out NOT found (document make): ", fn_src_in); +  foreach (extension; [".sdl", ".toml"]) { +    auto fn_src_in = ((doc_matters.src.is_pod) +      ? doc_matters.src.conf_dir_path +      : pth_sisudoc_src.conf_root).to!string +      ~ "/" ~ "sisu_document_make" ~ extension; +    auto fn_src_out_sisupod_zip_base +      = pths_sisupod.conf_root(doc_matters.src.filename).zpod.to!string ~ "/" ~ "sisu_document_make"; +    auto fn_src_out_filesystem +      = pths_sisupod.conf_root(doc_matters.src.filename).filesystem_open_zpod.to!string +      ~ "/" ~ "sisu_document_make" ~ extension; // TODO +    if (exists(fn_src_in)) { +      debug(io) { +        writeln("WARNING (io debug) src out found: ", fn_src_in); +      } +      if (doc_matters.opt.action.source) { +        fn_src_in.copy(fn_src_out_filesystem); +      } +      if (doc_matters.opt.action.sisupod) { +        auto zip_arc_member_file = new ArchiveMember(); +        zip_arc_member_file.name = fn_src_out_sisupod_zip_base; +        auto zip_data = new OutBuffer(); +        zip_data.write((fn_src_in).readText); +        zip_arc_member_file.expandedData = zip_data.toBytes(); +        zip.addMember(zip_arc_member_file); +      } +    } else { +      if (doc_matters.opt.action.verbose +      || doc_matters.opt.action.debug_do) { +        writeln("WARNING (io) src out NOT found (document make): ", fn_src_in); +      }      }    }  } { /+ TODO bundle primary file +/ diff --git a/org/sdp.org b/org/sdp.org index d277ec0..dbc5cda 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -26,7 +26,7 @@ struct Version {    int minor;    int patch;  } -enum ver = Version(0, 23, 3); +enum ver = Version(0, 24, 0);  #+END_SRC  ** compilation restrictions (supported compilers) @@ -116,10 +116,10 @@ import    sdp.meta,    sdp.meta.metadoc_summary,    sdp.meta.metadoc_from_src, -  sdp.meta.conf_make_meta, -  // sdp.meta.conf_make_meta_native, +  sdp.meta.conf_make_meta_structs,    sdp.meta.conf_make_meta_sdlang, -  sdp.meta.conf_make_meta_composite, +  sdp.meta.conf_make_meta_toml, +  sdp.meta.conf_make_meta_json,    sdp.meta.defaults,    sdp.meta.doc_debugs,    sdp.meta.read_config_files, @@ -160,6 +160,10 @@ sdlang.exceptions;  std.conv,  std.variant, +- https://code.dlang.org/packages/toml +- https://github.com/toml-lang/toml +- https://github.com/toml-lang/toml/blob/master/README.md +  **** mixins                                                        :mixin:  ***** version.txt                                               :version: @@ -179,8 +183,9 @@ mixin CompileTimeInfo;  #+NAME: sdp_mixin  #+BEGIN_SRC d  mixin SiSUrgxInit; -mixin SiSUregisters; +mixin SiSUmakeMetaStructsSDLang;  mixin SiSUextractSDLang; +mixin contentJSONtoSiSUstruct;  mixin SiSUnode;  mixin SiSUbiblio;  mixin SiSUrgxInitFlags; @@ -270,6 +275,7 @@ bool[string] opts = [  ];  string[string] settings = [    "output-dir"         : "", +  "site-config-dir"    : "",    "lang"               : "all",  ];  auto helpInfo = getopt(args, @@ -313,6 +319,7 @@ auto helpInfo = getopt(args,    "backmatter",         "--section-backmatter process document backmatter (default)", &opts["backmatter"],    "skip-output",        "--skip-output",                                              &opts["skip-output"],    "output-dir",         "--output-dir=[dir path]",                                    &settings["output-dir"], +  "site-config-dir",    "--site-config-dir=[dir path]",                               &settings["site-config-dir"],    "lang",               "--lang=[lang code e.g. =en or =en,es]",                      &settings["lang"],  );  if (helpInfo.helpWanted) { @@ -522,13 +529,26 @@ foreach(arg; args[1..$]) {  }  #+END_SRC -**** TODO config files (load & read) (so far only SDLang)   :config:files: +**** config files load & read (toml or sdlang)  #+NAME: sdp_conf_files  #+BEGIN_SRC d -auto sdl_root_config_document = configReadDoc!()(_manifest, _env); // document config file -auto sdl_root_config_local_site = configReadSite!()(_manifest, _env); // local site config -auto conf_files_composite_make = confFilesSDLtoStruct!()(sdl_root_config_document, sdl_root_config_local_site); +auto _config_document_struct = readConfigDoc!()(_manifest, _env); // document config file +auto _config_local_site_struct = readConfigSite!()(_manifest, _env); // local site config +ConfCompositePlus _make_and_meta_struct; +switch (_config_local_site_struct.filetype) { +case "toml" : +  _make_and_meta_struct = configParseTOMLreturnSiSUstruct!()(_make_and_meta_struct, _config_document_struct); +  _make_and_meta_struct = configParseTOMLreturnSiSUstruct!()(_make_and_meta_struct, _config_local_site_struct); +  break; +case "sdl" : +  auto sdl_root_config_document = parseSDLangConfig!()(_config_document_struct.content, _config_document_struct.filename); +  auto sdl_root_config_local_site = parseSDLangConfig!()(_config_local_site_struct.content, _config_local_site_struct.filename); +  _make_and_meta_struct = confFilesSDLtoStruct!()(sdl_root_config_document, sdl_root_config_local_site); +  break; +default : +  break; +}  #+END_SRC  ** 2a. actions independent of processing files @@ -731,7 +751,8 @@ debug(header_and_body) {  }  #+END_SRC -** 2. _document metadata_ & _make instructions_       :doc:header:metadata:make: +** 2. _document metadata_ & _make instructions_ (struct from toml or sdlang)        >> +header: toml or sdlang  - [[./meta_conf_make_meta.org][meta_conf_make_meta]]  - read _document header_, split into: @@ -750,9 +771,14 @@ debug(header_and_body) {  debug(steps) {    writeln("step2 commence → (read document header - toml or sdlang, return struct)");  } -auto _make_and_meta_struct -  = docHeaderMakeAndMetaTupExtractAndConvertToStruct!()( -    conf_files_composite_make, +_make_and_meta_struct = +((_header_body_insertfilelist_imagelist[headBody.header]).match(rgx.toml_header_meta_title)) +? docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct!()( +    _make_and_meta_struct, +    _header_body_insertfilelist_imagelist[headBody.header] +  ) +: docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct!()( +    _make_and_meta_struct,      _header_body_insertfilelist_imagelist[headBody.header]    );  debug(steps) { | 
