From ae23669169b32d4986af06c1ae9483cc9c52d39d Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Sat, 7 Jul 2018 13:55:43 -0400 Subject: 0.26.4 file renames, cleaning, reorganisation --- .gitignore | 3 +- makefile | 3 +- maker.org | 6 +- org/default_paths.org | 155 +++---- org/imports.org | 2 +- org/meta_debugs.org | 14 +- org/meta_read_source_files.org | 733 -------------------------------- org/output_sqlite.org | 9 +- org/output_xmls.org | 190 ++++----- org/sdp.org | 16 +- org/source_files_read.org | 733 ++++++++++++++++++++++++++++++++ src/sdp/meta/conf_make_meta_sdlang.d | 474 --------------------- src/sdp/meta/doc_debugs.d | 14 +- src/sdp/meta/metadoc.d | 8 +- src/sdp/meta/read_config_files.d | 226 ---------- src/sdp/meta/read_source_files.d | 354 ---------------- src/sdp/output/epub3.d | 4 +- src/sdp/output/html.d | 8 +- src/sdp/output/package.d | 2 +- src/sdp/output/paths_output.d | 22 +- src/sdp/output/paths_source.d | 791 ----------------------------------- src/sdp/output/sqlite.d | 14 +- src/sdp/output/xmls.d | 178 ++++---- src/sdp/sdp.d | 10 +- src/sdp/source/paths_source.d | 774 ++++++++++++++++++++++++++++++++++ src/sdp/source/read_config_files.d | 226 ++++++++++ src/sdp/source/read_source_files.d | 354 ++++++++++++++++ views/version.txt | 2 +- 28 files changed, 2404 insertions(+), 2921 deletions(-) delete mode 100644 org/meta_read_source_files.org create mode 100644 org/source_files_read.org delete mode 100644 src/sdp/meta/conf_make_meta_sdlang.d delete mode 100644 src/sdp/meta/read_config_files.d delete mode 100644 src/sdp/meta/read_source_files.d delete mode 100644 src/sdp/output/paths_source.d create mode 100644 src/sdp/source/paths_source.d create mode 100644 src/sdp/source/read_config_files.d create mode 100644 src/sdp/source/read_source_files.d diff --git a/.gitignore b/.gitignore index d74bba5..f2a7b11 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,8 @@ !conf.sdl !org !src -!src/* +!src/sdp +!src/sdp/* !data !data/* !data/sisupod/** diff --git a/makefile b/makefile index 52e1c71..bdacadc 100644 --- a/makefile +++ b/makefile @@ -139,9 +139,10 @@ ldc_rel_expunge_tangle: expunge skel tangle ldc_rel_tangle ldc_debug_tangle: tangle $(DUB) --compiler=ldc2 --config=sdp-ldc-debug skel: - mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/meta; \ mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/conf; \ + mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/meta; \ mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/output; \ + mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/source; \ mkdir -p $(PRG_SRCDIR)/$(PRG_NAME); \ mkdir -p $(PRG_BINDIR); init: skel diff --git a/maker.org b/maker.org index 158a239..6f64604 100644 --- a/maker.org +++ b/maker.org @@ -327,9 +327,10 @@ ldc_debug_tangle: tangle #+BEGIN_SRC makefile :tangle makefile skel: - mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/meta; \ mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/conf; \ + mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/meta; \ mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/output; \ + mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/source; \ mkdir -p $(PRG_SRCDIR)/$(PRG_NAME); \ mkdir -p $(PRG_BINDIR); init: skel @@ -1091,7 +1092,8 @@ mixin build!(_compile, _dub_conf); !conf.sdl !org !src -!src/* +!src/sdp +!src/sdp/* !data !data/* !data/sisupod/** diff --git a/org/default_paths.org b/org/default_paths.org index b8ff2a4..5b7141a 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -18,13 +18,13 @@ * 0. source paths :module:sdp:paths_source: ** 0. module template -#+BEGIN_SRC d :tangle ../src/sdp/output/paths_source.d +#+BEGIN_SRC d :tangle ../src/sdp/source/paths_source.d /++ read configuration files
- read config files
meta_config_files.d +/ -module sdp.output.paths_source; +module sdp.source.paths_source; import std.array, std.file, std.path, @@ -49,11 +49,10 @@ template PodManifest() { P _pth ) { struct ManifestFile_ { - auto pod_manifest_filename() { - string _manifest_file = "sisupod.manifest"; - return _manifest_file; + string pod_manifest_filename() { + return "sisupod.manifest"; } - auto pod_manifest_path() { + string pod_manifest_path() { string _manifest_path; if ((isValidPath(_pth) && exists(_pth)!=0 && _pth.isDir) && (exists(_pth.chainPath(pod_manifest_filename).array)!=0 @@ -115,11 +114,11 @@ sisupod template PathMatters() { mixin SiSUrgxInit; static auto rgx = Rgx(); - auto PathMatters(O,E,P,F)( - O _opt_actions, - E _env, - P _pth, - F _fns = "", + auto PathMatters(O,E)( + O _opt_actions, + E _env, + string _pth, + string _fns = "", char[][] _manifest_fn_list = [[]], ) { auto _manifest = PodManifest!()(_pth); @@ -145,15 +144,13 @@ template PathMatters() { } return Opt_(); } - auto src_is_pod() { - auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false; - return _src_is_pod; + bool src_is_pod() { + return (_manifest.pod_manifest_path.length > 0) ? true : false; } auto pod() { struct Pod_ { - auto src_is_pod() { - auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false; - return _src_is_pod; + bool src_is_pod() { + return (_manifest.pod_manifest_path.length > 0) ? true : false; } auto collection_root() { auto _collection_root = asNormalizedPath(chainPath(_manifest.pod_manifest_path, "..")).array; @@ -164,34 +161,34 @@ template PathMatters() { } return _collection_root; } - auto manifest_filename() { + string manifest_filename() { return _manifest.pod_manifest_filename; } - auto manifest_path() { + string manifest_path() { return _manifest.pod_manifest_path; } - auto pod_name() { // TODO decide what returned if src_is_pod == false + string pod_name() { return _manifest.pod_manifest_path.baseName; } - auto manifest_file_with_path() { + string manifest_file_with_path() { return _manifest.pod_manifest_file_with_path; } - auto config_sisu_document_make_dirs() { // TODO sisu_document_make + string[] config_sisu_document_make_dirs() { string[] _config_dirs; return _config_dirs; } - auto config_local_site_dirs() { // TODO sisu_document_make + string[] config_local_site_dirs() { string[] _config_dirs; return _config_dirs; } - auto image_dirs() { // TODO + string[] image_dirs() { string[] _image_dirs; return _image_dirs; } auto manifest_list_of_filenames() { return _manifest_fn_list; } - auto manifest_list_of_languages() { + string[] manifest_list_of_languages() { string[] _lngs; foreach (filename_; manifest_list_of_filenames) { string _k = "en"; @@ -211,41 +208,32 @@ template PathMatters() { auto _env = _env; string _sep = "␣"; struct SRC_ { - auto is_pod() { - auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false; - return _src_is_pod; + bool is_pod() { + return (_manifest.pod_manifest_path.length > 0) ? true : false; } - auto path_and_fn() { + string path_and_fn() { return _fns; } - auto pod_name() { /+ work on +/ - auto _pod_name = (is_pod) - ? _manifest.pod_manifest_path - : ""; - return _pod_name; + string pod_name() { + return (is_pod) ? _manifest.pod_manifest_path : ""; } - auto filename() { - auto _fn = (path_and_fn).baseName; - return _fn; + string filename() { + return path_and_fn.baseName; } - auto filename_base() { - auto _fn = filename.stripExtension; - return _fn; + string filename_base() { + return filename.stripExtension; } - auto filename_extension() { - auto _ext = filename.match(rgx.src_pth_sst_or_ssm).captures["extension"]; - return _ext; + string filename_extension() { + return filename.match(rgx.src_pth_sst_or_ssm).captures["extension"]; } - auto lng() { + string lng() { string _k; if (auto m = path_and_fn.match(rgx.language_code_and_filename)) { _k = m.captures[1]; - } else { - _k = "en"; - } + } else {_k = "en"; } return _k; } - auto docname_composite_unique_per_src_doc() { + string docname_composite_unique_per_src_doc() { /+ z pod name if any + src filename + lng code filename ~ "." ~ lng @@ -263,7 +251,7 @@ template PathMatters() { } return _fn; } - auto docname_composite_unique_per_src_pod() { + string docname_composite_unique_per_src_pod() { /+ z pod name if any + src filename (without lng code) filename ~ _sep ~ lng @@ -282,18 +270,16 @@ template PathMatters() { } return _fn; } - auto language() { + string language() { return lng(); } - auto file_with_absolute_path() { - string _pth = _env["pwd"].chainPath(path_and_fn).array; - return _pth; + string file_with_absolute_path() { + return _env["pwd"].chainPath(path_and_fn).array; } - auto absolute_path_to_src() { - string _pth = (_env["pwd"].chainPath(path_and_fn)).dirName.array; - return _pth; + string absolute_path_to_src() { + return (_env["pwd"].chainPath(path_and_fn)).dirName.array; } - auto base_dir() { + string base_dir() { string _dir; if ( // TODO this should catch generated --source sisupod, untested, needs manifest auto m = (absolute_path_to_src) @@ -311,7 +297,7 @@ template PathMatters() { } return _dir; } - auto base_parent_dir_path() { + string base_parent_dir_path() { string _dir; if ( // TODO this should catch generated --source sisupod, untested, needs manifest auto m = (absolute_path_to_src) @@ -323,7 +309,7 @@ template PathMatters() { } return _dir; } - auto base_dir_path() { // looks like there is work to do + string base_dir_path() { string _dir; if ( auto m = (absolute_path_to_src) @@ -343,11 +329,11 @@ template PathMatters() { } return _dir; } - auto media_dir_path() { // TODO rework, can base directly on src fn path + string media_dir_path() { string _dir = asNormalizedPath(base_dir_path.chainPath("media")).array; return _dir; } - auto image_dir_path() { + string image_dir_path() { string _paths; string[] _possible_img_pths = [ "./image", "../image", "../../image" ]; string _img_pth_found = ""; @@ -372,8 +358,7 @@ template PathMatters() { return _img_pth_found; } auto conf_dir_path() { - auto _dir = asNormalizedPath(base_dir_path.chainPath("conf")).array; - return _dir; + return asNormalizedPath(base_dir_path.chainPath("conf")).array; } auto base_parent_dir() { string _dir; @@ -390,18 +375,16 @@ template PathMatters() { } return _dir; } - auto config_dirs() { // TODO + string[] config_dirs() { string[] _config_dirs; if (is_pod) { - } else { - } + } else {} return _config_dirs; } - auto image_dirs() { // TODO + string[] image_dirs() { string[] _image_dirs; if (is_pod) { - } else { - } + } else {} return _image_dirs; } } @@ -453,15 +436,15 @@ template ConfigFilePaths() { E _env, ) { struct ConfFilePaths { - auto config_filename_document_toml() { + string config_filename_document_toml() { return "sisu_document_make"; } - auto config_filename_site_toml() { + string config_filename_site_toml() { return "config_local_site"; } auto possible_config_path_locations() { struct _ConfFilePaths { - auto sisu_document_make() { + string[] sisu_document_make() { /+ FIX clean up conf paths ↓ +/ /+ config local site (file system only, not in pod) +/ /+ return paths +/ @@ -504,7 +487,7 @@ template ConfigFilePaths() { +/ return _possible_config_path_locations; } - auto config_local_site() { + string[] 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; @@ -617,7 +600,7 @@ template SiSUpathsSRC() { auto pwd() { return _pwd; } - auto language() { + string language() { // use command line info as well? string _k; if (auto m = _fn_src_and_path.match(rgx.language_code_and_filename)) { @@ -627,7 +610,7 @@ template SiSUpathsSRC() { } return _k; } - auto doc_root() { + string doc_root() { return "sisudoc"; } auto media_root() { @@ -944,13 +927,9 @@ template SiSUoutPaths() { ) { struct _PathsStruct { string output_root() { - string out_root_; - if (output_pth_root.length > 0) { - out_root_ = output_pth_root; - } else { - out_root_ = "sisugen"; - } - return out_root_; + return (output_pth_root.length > 0) + ? output_pth_root + : "sisugen"; } string output_base() { return asNormalizedPath(output_root.chainPath(lng)).array; @@ -965,13 +944,9 @@ template SiSUoutPathSQLite() { ) { struct _PathsStruct { string output_root() { - string out_root_; - if (output_pth_root.length > 0) { - out_root_ = output_pth_root; - } else { - out_root_ = "sisugen"; - } - return out_root_; + return (output_pth_root.length > 0) + ? output_pth_root + : "sisugen"; } string output_base() { return asNormalizedPath(output_root).array; @@ -1006,7 +981,7 @@ template SiSUoutPathsFnPd() { - else if pod_name != file_name - pod_name.file_name +/ - auto _fn_src = fn_src_pth.baseName.stripExtension; + string _fn_src = fn_src_pth.baseName.stripExtension; string _output_base_name; if (!(pod_name.empty)) { if (pod_name == _fn_src) { diff --git a/org/imports.org b/org/imports.org index 64bc4c3..d82da9e 100644 --- a/org/imports.org +++ b/org/imports.org @@ -73,7 +73,7 @@ public import // std.uni, std.utf; public import - sdp.output.paths_source, + sdp.source.paths_source, sdp.output.defaults, sdp.output.paths_output, sdp.output.rgx; diff --git a/org/meta_debugs.org b/org/meta_debugs.org index 8542a32..1807ec8 100644 --- a/org/meta_debugs.org +++ b/org/meta_debugs.org @@ -26,8 +26,8 @@ module sdp.meta.doc_debugs; template SiSUdebugs() { <> auto SiSUdebugs(S,T)( - auto return ref const S contents, - auto return ref T doc_matters, + const S contents, + T doc_matters, ) { mixin SiSUrgxInit; mixin InternalMarkup; @@ -136,8 +136,8 @@ debug(dumpdoc) { #+BEGIN_SRC d debug(checkdoc) { void out_segnames(S,T)( - auto return ref const S contents, - auto return ref T doc_matters, + const S contents, + T doc_matters, ) { foreach (key; doc_matters.xml.keys_seq.seg) { if (contents[key].length > 1) { @@ -159,7 +159,7 @@ debug(checkdoc) { #+BEGIN_SRC d debug(checkdoc) { void out_toc(S)( - auto return ref const S contents, + const S contents, string key, ) { if (contents[key].length > 1) { @@ -183,7 +183,7 @@ debug(checkdoc) { #+BEGIN_SRC d debug(checkdoc) { void out_endnotes(S)( - auto return ref const S contents, + const S contents, string key, ) { if (contents[key].length > 1) { @@ -205,7 +205,7 @@ debug(checkdoc) { #+BEGIN_SRC d debug(checkdoc) { void out_bookindex(S)( - auto return ref const S contents, + const S contents, string key, ) { if (contents[key].length > 1) { diff --git a/org/meta_read_source_files.org b/org/meta_read_source_files.org deleted file mode 100644 index b726631..0000000 --- a/org/meta_read_source_files.org +++ /dev/null @@ -1,733 +0,0 @@ -#+TITLE: sdp markup source raw -#+AUTHOR: Ralph Amissah -#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] -#+DESCRIPTION: documents - structuring, publishing in multiple formats & search -#+KEYWORDS -#+LANGUAGE: en -#+STARTUP: indent content -#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t -#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc -#+OPTIONS: author:nil email:nil creator:nil timestamp:nil -#+PROPERTY: header-args :padline no :exports code :noweb yes -#+EXPORT_SELECT_TAGS: export -#+EXPORT_EXCLUDE_TAGS: noexport -#+FILETAGS: :sdp:rel:meta:read:file -#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) - -[[./sdp.org][sdp]] [[./][org/]] -* imports - -#+name: imports_std -#+BEGIN_SRC d -import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; -#+END_SRC - -* A. get _config file_ (read in) :module:sdp:meta_read_config_files: -** 0. module template - -#+BEGIN_SRC d :tangle ../src/sdp/meta/read_config_files.d -/++ - read configuration files
- - read config files
- meta_config_files.d -+/ -module sdp.meta.read_config_files; -<> -<> -<> -#+END_SRC - -*** 0. read config files (config_local_site & sisu_document_make) toml -**** 1. site configuration - -#+name: meta_config_file_hub -#+BEGIN_SRC d -static template readConfigSite() { - <> - 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]) { - foreach(pth; possible_config_path_locations) { - auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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() { - <> - 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]) { - foreach(pth; possible_config_path_locations) { - auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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. TOML -*** 1. TOML read config files (config_local_site & sisu_document_make) :file:config: -**** TOML config_local_site - -#+name: meta_config_file_in -#+BEGIN_SRC d -static template configReadInSiteTOML() { - <> - 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(pth.to!string, 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 - -**** TOML sisu_document_make - -#+name: meta_config_file_in -#+BEGIN_SRC d -static template configReadInDocTOML() { - <> - 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(pth.to!string, 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 - -*** 2. TOML config files get - -#+name: meta_config_file_toml -#+BEGIN_SRC d -static template configTOML() { - import toml; // - <> - 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 - -*** 3. TOML config (config_local_site & sisu_document_make) :file:config:hub: - -#+name: meta_config_file_hub -#+BEGIN_SRC d -static template configReadSiteTOML() { - <> - 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() { - <> - 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 - -* B. get _markup source_, read file :module:sdp:meta_read_source_files: -** 0. module template (includes tuple) - -#+BEGIN_SRC d :tangle ../src/sdp/meta/read_source_files.d -/++ - module meta_read_source_files;
- - open markup files
- - if master file scan for addional files to import/insert -+/ -module sdp.meta.read_source_files; -static template SiSUrawMarkupContent() { - import - sdp.meta.rgx; - <> - mixin SiSUrgxInit; - static auto rgx = Rgx(); - string[] _images=[]; - auto _extract_images(S)(S content_block) { - string[] images_; - auto _content_block = content_block.to!string; - if (auto m = _content_block.matchAll(rgx.image)) { - images_ ~= m.captures[1].to!string; - } - return images_; - } - auto rawsrc = RawMarkupContent(); - auto SiSUrawMarkupContent(O,Fn)(O _opt_action, Fn fn_src) { - auto _0_header_1_body_content_2_insert_filelist_tuple - = rawsrc.sourceContentSplitIntoHeaderAndBody(_opt_action, rawsrc.sourceContent(fn_src), fn_src); - return _0_header_1_body_content_2_insert_filelist_tuple; - } - struct RawMarkupContent { - final sourceContent(in string fn_src) { - auto raw = MarkupRawUnit(); - auto source_txt_str - = raw.markupSourceReadIn(fn_src); - return source_txt_str; - } - final auto sourceContentSplitIntoHeaderAndBody(O)(O _opt_action, in string source_txt_str, in string fn_src="") { - auto raw = MarkupRawUnit(); - string[] insert_file_list; - string[] images_list; - auto t - = raw.markupSourceHeaderContentRawLineTupleArray(source_txt_str); - auto header_raw = t[0]; - auto sourcefile_body_content = t[1]; - if (fn_src.match(rgx.src_fn_master)) { // filename with path needed if master file (.ssm) not otherwise - auto ins = Inserts(); - auto tu - = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); - static assert(!isTypeTuple!(tu)); - sourcefile_body_content = tu[0]; - insert_file_list = tu[1].dup; - images_list = tu[2].dup; - } else if (_opt_action.source || _opt_action.sisupod) { - auto ins = Inserts(); - auto tu - = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); - static assert(!isTypeTuple!(tu)); - images_list = tu[2].dup; - } - t = tuple( - header_raw, - sourcefile_body_content, - insert_file_list, - images_list - ); - static assert(t.length==4); - return t; - } - } - struct MarkupRawUnit { - import std.file; - <> - <> - <> - <> - <> - <> - } - struct Inserts { - auto scan_subdoc_source(O)( - O _opt_action, - char[][] markup_sourcefile_insert_content, - string fn_src - ) { - mixin SiSUrgxInitFlags; - <> - foreach (line; markup_sourcefile_insert_content) { - <> - } // end src subdoc (inserts) loop - <> - } - auto scan_master_src_for_insert_files_and_import_content(O)( - O _opt_action, - char[][] sourcefile_body_content, - string fn_src - ) { - import std.algorithm; - mixin SiSUrgxInitFlags; - <> - foreach (line; sourcefile_body_content) { - <> - } // end src doc loop - <> - } - } -} -#+END_SRC - -** get markup source, read file :source:markup: -*** read file, source string [#A] :string: - -#+name: meta_markup_source_raw_read_file_source_string -#+BEGIN_SRC d -final private string readInMarkupSource(in char[] fn_src) { - enforce( - exists(fn_src)!=0, - "file not found: «" ~ - fn_src ~ "»" - ); - string source_txt_str; - try { - if (exists(fn_src)) { - debug(io) { - writeln("in src, markup source file found: ", fn_src); - } - source_txt_str = fn_src.readText; - } - } - catch (ErrnoException ex) { - } - catch (UTFException ex) { - // Handle validation errors - } - catch (FileException ex) { - // Handle errors - } - std.utf.validate(source_txt_str); - return source_txt_str; -} -#+END_SRC - -*** document header & content, array.length == 2 [#A] :array: - -here you split document header and body, an array.length == 2 -split is on first match of level A~ (which is required) - -#+name: meta_markup_source_raw_doc_header_and_content_split -#+BEGIN_SRC d -final private char[][] header0Content1(in string src_text) { - /+ split string on _first_ match of "^:?A~\s" into [header, content] array/tuple +/ - char[][] header_and_content; - auto m = (cast(char[]) src_text).matchFirst(rgx.heading_a); - header_and_content ~= m.pre; - header_and_content ~= m.hit ~ m.post; - assert(header_and_content.length == 2, - "document markup is broken, header body split == " - ~ header_and_content.length.to!string - ~ "; (header / body array split should == 2 (split is on level A~))" - ); - return header_and_content; -} -#+END_SRC - -*** source line array :array: - -#+name: meta_markup_source_raw_source_line_array -#+BEGIN_SRC d -final private char[][] markupSourceLineArray(in char[] src_text) { - char[][] source_line_arr - = (cast(char[]) src_text).split(rgx.newline_eol_strip_preceding); - return source_line_arr; -} -#+END_SRC - -*** source content raw line array :array: -- used for regular .sst files; master .ssm files and; .ssi inserts -- regex is passed for relevant enforce match - -**** read in file - -#+name: meta_markup_source_raw_read_in_file -#+BEGIN_SRC d -auto markupSourceReadIn(in string fn_src) { - static auto rgx = Rgx(); - enforce( - fn_src.match(rgx.src_pth_sst_or_ssm), - "not a sisu markup filename: «" ~ - fn_src ~ "»" - ); - auto source_txt_str = readInMarkupSource(fn_src); - return source_txt_str; -} -#+END_SRC - -**** tuple (a) header, (b) body content, (c) file insert list & (d) image list? - -- header -- body content -- file insert list -- [image list?] - -#+name: meta_markup_source_raw_tuple_of_header_and_body -#+BEGIN_SRC d -auto markupSourceHeaderContentRawLineTupleArray(in string source_txt_str) { - string[] file_insert_list = []; - string[] images_list = []; - auto hc = header0Content1(source_txt_str); - auto header = hc[0]; - char[] source_txt = hc[1]; - auto source_line_arr = markupSourceLineArray(source_txt); - auto t = tuple( - header, - source_line_arr, - file_insert_list, - images_list - ); - return t; -} -#+END_SRC - -**** get insert source line array - -#+name: meta_markup_source_raw_get_insert_source_line_array -#+BEGIN_SRC d -final char[][] getInsertMarkupSourceContentRawLineArray( - in char[] fn_src_insert, - Regex!(char) rgx_file -) { - enforce( - fn_src_insert.match(rgx_file), - "not a sisu markup filename: «" ~ - fn_src_insert ~ "»" - ); - auto source_txt_str = readInMarkupSource(fn_src_insert); - auto source_line_arr = markupSourceLineArray(source_txt_str); - return source_line_arr; -} -#+END_SRC - -** get markup source, master file & inserts :masterfile:inserts: -[[./sdp.org][sdp]] [[./][org/]] - -*** scan inserts (sub-document) source :scan_insert_src: -**** scan subdoc source - -#+name: meta_inserts_scan -#+BEGIN_SRC d -char[][] contents_insert; -auto type1 = flags_type_init; -auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); -auto markup_src_file_path = fn_pth_full.captures[1]; -#+END_SRC - -**** loop insert (sub-document) - -#+name: meta_inserts_scan_loop -#+BEGIN_SRC d -if (type1["curly_code"] == 1) { - type1["header_make"] = 0; - type1["header_meta"] = 0; - if (line.matchFirst(rgx.block_curly_code_close)) { - type1["curly_code"] = 0; - } - contents_insert ~= line; -} else if (line.matchFirst(rgx.block_curly_code_open)) { - type1["curly_code"] = 1; - type1["header_make"] = 0; - type1["header_meta"] = 0; - contents_insert ~= line; -} else if (type1["tic_code"] == 1) { - type1["header_make"] = 0; - type1["header_meta"] = 0; - if (line.matchFirst(rgx.block_tic_close)) { - type1["tic_code"] = 0; - } - contents_insert ~= line; -} else if (line.matchFirst(rgx.block_tic_code_open)) { - type1["tic_code"] = 1; - type1["header_make"] = 0; - type1["header_meta"] = 0; - contents_insert ~= line; -} else if ( - (type1["header_make"] == 1) - && line.matchFirst(rgx.native_header_sub) -) { - type1["header_make"] = 1; - type1["header_meta"] = 0; -} else if ( - (type1["header_meta"] == 1) - && line.matchFirst(rgx.native_header_sub) -) { - type1["header_meta"] = 1; - type1["header_make"] = 0; -} else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { - type1["header_make"] = 0; - type1["header_meta"] = 0; - auto insert_fn = m.captures[2]; - auto insert_sub_pth = m.captures[1]; - auto fn_src_insert - = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; - auto raw = MarkupRawUnit(); - auto markup_sourcesubfile_insert_content - = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); - debug(insert_file) { - tell_l("red", line); - tell_l("red", fn_src_insert); - tell_l("fuchsia", "ERROR"); - writeln( - " length contents insert array: ", - markup_sourcesubfile_insert_content.length - ); - } - if (_opt_action.source || _opt_action.sisupod) { - _images ~= _extract_images(markup_sourcesubfile_insert_content); - } - auto ins = Inserts(); - /+ - - 1. load file - - 2. read lines - - 3. scan lines - - a. if filename insert, and insert filename - - repeat 1 - - b. else - - add line to new array; - - build image list, search for any image files to add to image list - +/ -} else { - type1["header_make"] = 0; - type1["header_meta"] = 0; - contents_insert ~= line; // images to extract for image list? - if (_opt_action.source || _opt_action.sisupod) { - auto _image_linelist = _extract_images(line); - if (_image_linelist.length > 0) { - _images ~= _image_linelist; - } - } -} -#+END_SRC - -**** post loop - -#+name: meta_inserts_scan_post -#+BEGIN_SRC d -auto t = tuple( - contents_insert, - _images -); -return t; -#+END_SRC - -*** scan document source :scan_src: -**** scan doc source - -#+name: meta_master_doc_scan_for_insert_filenames -#+BEGIN_SRC d -char[][] contents; -auto type = flags_type_init; -auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); -auto markup_src_file_path = fn_pth_full.captures[1]; -char[][] contents_insert; -string[] _images =[]; -string[] insert_file_list =[]; -#+END_SRC - -**** include inserts: _loop master_ scan for inserts (insert documents) - -#+name: meta_master_doc_scan_for_insert_filenames_loop -#+BEGIN_SRC d -if (type["curly_code"] == 1) { - if (line.matchFirst(rgx.block_curly_code_close)) { - type["curly_code"] = 0; - } - contents ~= line; -} else if (line.matchFirst(rgx.block_curly_code_open)) { - type["curly_code"] = 1; - contents ~= line; -} else if (type["tic_code"] == 1) { - if (line.matchFirst(rgx.block_tic_close)) { - type["tic_code"] = 0; - } - contents ~= line; -} else if (line.matchFirst(rgx.block_tic_code_open)) { - type["tic_code"] = 1; - contents ~= line; -} else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { - auto insert_fn = m.captures[2]; - auto insert_sub_pth = m.captures[1]; - auto fn_src_insert - = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; - insert_file_list ~= fn_src_insert.to!string; - auto raw = MarkupRawUnit(); - /+ TODO +/ - auto markup_sourcefile_insert_content - = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); - debug(insert_file) { - tell_l("red", line); - tell_l("red", fn_src_insert); - writeln( - " length contents insert array: ", - markup_sourcefile_insert_content.length - ); - } - auto ins = Inserts(); - auto contents_insert_tu = ins.scan_subdoc_source( - _opt_action, - markup_sourcefile_insert_content, - fn_src_insert.to!string - ); - contents ~= contents_insert_tu[0]; // images to extract for image list? - if (_opt_action.source || _opt_action.sisupod) { - auto _image_linelist = _extract_images(contents_insert_tu[0]); - if (_image_linelist.length > 0) { - _images ~= _image_linelist; - } - } - /+ - - 1. load file - - 2. read lines - - 3. scan lines - - a. if filename insert, and insert filename - - repeat 1 - - b. else - - add line to new array; - - build image list, search for any image files to add to image list - +/ -} else { - contents ~= line; - if (_opt_action.source || _opt_action.sisupod) { - auto _image_linelist = _extract_images(line); - if (_image_linelist.length > 0) { - _images ~= _image_linelist; - } - } -} -#+END_SRC - -**** post loop - -#+name: meta_master_doc_scan_for_insert_filenames_post -#+BEGIN_SRC d -string[] images = []; -foreach(i; uniq(_images.sort())) { - images ~= i; -} -debug(insert_file) { - writeln(__LINE__); - writeln(contents.length); -} -auto t = tuple( - contents, - insert_file_list, - images -); -return t; -#+END_SRC - -* __END__ diff --git a/org/output_sqlite.org b/org/output_sqlite.org index e8a29bf..dc76da4 100644 --- a/org/output_sqlite.org +++ b/org/output_sqlite.org @@ -1223,10 +1223,11 @@ CREATE TABLE doc_objects ( seg VARCHAR(256) NULL, lev_an VARCHAR(1), lev SMALLINT NULL, - t_of VARCHAR(16), - t_is VARCHAR(16), + is_of_type VARCHAR(16), + is_a VARCHAR(16), node VARCHAR(16) NULL, parent VARCHAR(16) NULL, + last_decendant VARCHAR(16) NULL, /* headings only */ digest_clean CHAR(256), digest_all CHAR(256), types CHAR(1) NULL @@ -1276,8 +1277,8 @@ _insert_doc_objects_row = format(q"¶ clean, body, lev, - t_of, - t_is + is_of_type, + is_a ) #+END_SRC diff --git a/org/output_xmls.org b/org/output_xmls.org index 122b15c..0aa50d5 100644 --- a/org/output_xmls.org +++ b/org/output_xmls.org @@ -98,8 +98,8 @@ string div_delimit( #+name: xhtml_format_objects #+BEGIN_SRC d string special_characters(O)( - auto ref const O obj, - string _txt + const O obj, + string _txt ){ _txt = (_txt) .replaceAll(rgx.xhtml_ampersand, "&") @@ -421,10 +421,10 @@ auto tail() { #+name: xhtml_format_objects #+BEGIN_SRC d auto inline_images(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "seg", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "seg", ) { string _img_pth; if (_xml_type == "epub") { @@ -450,10 +450,10 @@ auto inline_images(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto inline_links(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "seg", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "seg", ) { if (obj.has.inline_links) { if ((_txt.match(rgx.mark_internal_site_lnk)) @@ -502,8 +502,8 @@ auto inline_links(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto inline_notes_scroll(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { if (obj.has.inline_notes_reg) { _txt = font_face(_txt); @@ -531,8 +531,8 @@ auto inline_notes_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto inline_notes_seg(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string[] _endnotes; if (obj.has.inline_notes_reg) { @@ -576,9 +576,9 @@ auto inline_notes_seg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto inline_markup_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { _txt = inline_images(obj, _txt, _suffix, "scroll"); _txt = inline_links(obj, _txt, _suffix, "scroll"); @@ -592,10 +592,10 @@ auto inline_markup_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto inline_markup_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "seg", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "seg", ) { _txt = inline_images(obj, _txt, _suffix, _xml_type); _txt = inline_links(obj, _txt, _suffix, _xml_type); @@ -610,7 +610,7 @@ auto inline_markup_seg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d string lev4_heading_subtoc(O)( - auto ref const O obj, + const O obj, ) { char[] lev4_subtoc; lev4_subtoc ~= "
\n"; @@ -642,7 +642,7 @@ string lev4_heading_subtoc(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto nav_pre_next_svg(O)( - auto ref const O obj, + const O obj, ) { string prev, next, toc; if (obj.tags.segment_anchor_tag == "toc") { @@ -726,9 +726,9 @@ auto nav_pre_next_svg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto heading(O)( - auto ref const O obj, - string _txt, - string _xml_type = "html", + const O obj, + string _txt, + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); string _horizontal_rule = "
"; @@ -781,9 +781,9 @@ auto heading(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto heading_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -797,10 +797,10 @@ auto heading_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto heading_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0]; @@ -820,8 +820,8 @@ auto heading_seg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto para(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = font_face(_txt); @@ -865,9 +865,9 @@ auto para(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto para_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -881,10 +881,10 @@ auto para_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto para_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -904,8 +904,8 @@ auto para_seg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto quote(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -941,9 +941,9 @@ auto quote(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto quote_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -957,10 +957,10 @@ auto quote_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto quote_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -980,8 +980,8 @@ auto quote_seg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto group(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -1017,10 +1017,10 @@ auto group(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto group_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -1034,10 +1034,10 @@ auto group_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto group_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -1057,8 +1057,8 @@ auto group_seg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto block(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -1090,10 +1090,10 @@ auto block(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto block_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -1107,10 +1107,10 @@ auto block_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto block_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -1130,8 +1130,8 @@ auto block_seg(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto verse(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -1163,10 +1163,10 @@ auto verse(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto verse_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -1180,10 +1180,10 @@ auto verse_scroll(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto verse_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -1202,8 +1202,8 @@ auto verse_seg(O)( #+name: xhtml_format_objects_code #+BEGIN_SRC d auto code(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string o; if (obj.metainfo.object_number.empty) { @@ -1243,8 +1243,8 @@ align="left|right|center" #+name: xhtml_format_objects #+BEGIN_SRC d auto tablarize(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string[] _table_rows = (_txt).split(rgx.table_delimiter_row); string[] _table_cols; @@ -1282,8 +1282,8 @@ auto tablarize(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto table(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = font_face(_txt); @@ -1317,8 +1317,8 @@ auto table(O)( #+name: xhtml_format_objects #+BEGIN_SRC d auto endnote(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string o; o = format(q"¶

@@ -1354,8 +1354,8 @@ template outputHTML() { #+name: output_html_scroll #+BEGIN_SRC d void scroll(D,I)( - auto ref const D doc_abstraction, - auto ref I doc_matters, + const D doc_abstraction, + I doc_matters, ) { mixin SiSUoutputRgxInit; auto xhtml_format = outputXHTMLs(); @@ -1535,8 +1535,8 @@ void scroll_write_output(M,C)( #+name: output_html_seg #+BEGIN_SRC d void seg(D,M)( - auto ref const D doc_abstraction, - auto ref M doc_matters, + const D doc_abstraction, + M doc_matters, ) { mixin SiSUoutputRgxInit; auto rgx = Rgx(); @@ -2216,8 +2216,8 @@ string epub2_oebps_toc_ncx(D,I)(D doc_abstraction, I doc_matters) { #+name: output_epub3_xhtml_seg #+BEGIN_SRC d void outputEPub3(D,I)( - auto ref const D doc_abstraction, - auto ref I doc_matters, + const D doc_abstraction, + I doc_matters, ) { mixin SiSUoutputRgxInit; auto xhtml_format = outputXHTMLs(); diff --git a/org/sdp.org b/org/sdp.org index fe34840..b26f317 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -26,7 +26,7 @@ struct Version { int minor; int patch; } -enum ver = Version(0, 26, 3); +enum ver = Version(0, 26, 4); #+END_SRC ** compilation restrictions (supported compilers) @@ -120,11 +120,11 @@ import sdp.meta.conf_make_meta_json, sdp.meta.defaults, sdp.meta.doc_debugs, - sdp.meta.read_config_files, - sdp.meta.read_source_files, sdp.meta.rgx, - sdp.output.hub, - sdp.output.paths_source; + sdp.source.paths_source, + sdp.source.read_config_files, + sdp.source.read_source_files, + sdp.output.hub; #+END_SRC ****** notes @@ -141,7 +141,7 @@ import [[./meta_conf_make_meta.org][meta_conf_make_meta]] [[./meta_defaults.org][meta_defaults]] [[./meta_output_debugs.org][meta_output_debugs]] -[[./meta_read_source_files.org][meta_read_source_files]] +[[./source_read_files.org][source_read_files]] [[./compile_time_info.org][compile time info]] [[./output.org][output]] [[./sdp.org][sdp]] @@ -201,7 +201,7 @@ static auto rgx = Rgx(); scope(success) { debug(checkdoc) { writefln( - "~ run complete, ok ~ (sdp-%s.%s.%s, %s v%s, %s %s)", + "~ run complete, ok ~ (sdp-%s.%s.%s, %s D:%s, %s %s)", ver.major, ver.minor, ver.patch, __VENDOR__, __VERSION__, bits, os, @@ -740,7 +740,7 @@ template SiSUabstraction() { #+END_SRC ** 1. raw file content split, doc: _header_, _content_ +(lists: subdocs? images?) >> -- [[./meta_read_source_files.org][meta_read_source_files]] +- [[./source_read_files.org][source_read_files]] - read in the _marked up source document_ and - split the document into: diff --git a/org/source_files_read.org b/org/source_files_read.org new file mode 100644 index 0000000..899e628 --- /dev/null +++ b/org/source_files_read.org @@ -0,0 +1,733 @@ +#+TITLE: sdp markup source raw +#+AUTHOR: Ralph Amissah +#+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] +#+DESCRIPTION: documents - structuring, publishing in multiple formats & search +#+KEYWORDS +#+LANGUAGE: en +#+STARTUP: indent content +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t +#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc +#+OPTIONS: author:nil email:nil creator:nil timestamp:nil +#+PROPERTY: header-args :padline no :exports code :noweb yes +#+EXPORT_SELECT_TAGS: export +#+EXPORT_EXCLUDE_TAGS: noexport +#+FILETAGS: :sdp:rel:meta:read:file +#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) + +[[./sdp.org][sdp]] [[./][org/]] +* imports + +#+name: imports_std +#+BEGIN_SRC d +import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; +#+END_SRC + +* A. get _config file_ (read in) :module:sdp:source_read_config_files: +** 0. module template + +#+BEGIN_SRC d :tangle ../src/sdp/source/read_config_files.d +/++ + read configuration files
+ - read config files
+ meta_config_files.d ++/ +module sdp.source.read_config_files; +<> +<> +<> +#+END_SRC + +*** 0. read config files (config_local_site & sisu_document_make) toml +**** 1. site configuration + +#+name: meta_config_file_hub +#+BEGIN_SRC d +static template readConfigSite() { + <> + 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]) { + foreach(pth; possible_config_path_locations) { + auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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() { + <> + 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]) { + foreach(pth; possible_config_path_locations) { + auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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. TOML +*** 1. TOML read config files (config_local_site & sisu_document_make) :file:config: +**** TOML config_local_site + +#+name: meta_config_file_in +#+BEGIN_SRC d +static template configReadInSiteTOML() { + <> + 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(pth.to!string, 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 + +**** TOML sisu_document_make + +#+name: meta_config_file_in +#+BEGIN_SRC d +static template configReadInDocTOML() { + <> + 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(pth.to!string, 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 + +*** 2. TOML config files get + +#+name: meta_config_file_toml +#+BEGIN_SRC d +static template configTOML() { + import toml; // + <> + 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 + +*** 3. TOML config (config_local_site & sisu_document_make) :file:config:hub: + +#+name: meta_config_file_hub +#+BEGIN_SRC d +static template configReadSiteTOML() { + <> + 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() { + <> + 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 + +* B. get _markup source_, read file :module:sdp:source_read_source_files: +** 0. module template (includes tuple) + +#+BEGIN_SRC d :tangle ../src/sdp/source/read_source_files.d +/++ + module source_read_source_files;
+ - open markup files
+ - if master file scan for addional files to import/insert ++/ +module sdp.source.read_source_files; +static template SiSUrawMarkupContent() { + import + sdp.meta.rgx; + <> + mixin SiSUrgxInit; + static auto rgx = Rgx(); + string[] _images=[]; + auto _extract_images(S)(S content_block) { + string[] images_; + auto _content_block = content_block.to!string; + if (auto m = _content_block.matchAll(rgx.image)) { + images_ ~= m.captures[1].to!string; + } + return images_; + } + auto rawsrc = RawMarkupContent(); + auto SiSUrawMarkupContent(O,Fn)(O _opt_action, Fn fn_src) { + auto _0_header_1_body_content_2_insert_filelist_tuple + = rawsrc.sourceContentSplitIntoHeaderAndBody(_opt_action, rawsrc.sourceContent(fn_src), fn_src); + return _0_header_1_body_content_2_insert_filelist_tuple; + } + struct RawMarkupContent { + final sourceContent(in string fn_src) { + auto raw = MarkupRawUnit(); + auto source_txt_str + = raw.markupSourceReadIn(fn_src); + return source_txt_str; + } + final auto sourceContentSplitIntoHeaderAndBody(O)(O _opt_action, in string source_txt_str, in string fn_src="") { + auto raw = MarkupRawUnit(); + string[] insert_file_list; + string[] images_list; + auto t + = raw.markupSourceHeaderContentRawLineTupleArray(source_txt_str); + auto header_raw = t[0]; + auto sourcefile_body_content = t[1]; + if (fn_src.match(rgx.src_fn_master)) { // filename with path needed if master file (.ssm) not otherwise + auto ins = Inserts(); + auto tu + = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); + static assert(!isTypeTuple!(tu)); + sourcefile_body_content = tu[0]; + insert_file_list = tu[1].dup; + images_list = tu[2].dup; + } else if (_opt_action.source || _opt_action.sisupod) { + auto ins = Inserts(); + auto tu + = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); + static assert(!isTypeTuple!(tu)); + images_list = tu[2].dup; + } + t = tuple( + header_raw, + sourcefile_body_content, + insert_file_list, + images_list + ); + static assert(t.length==4); + return t; + } + } + struct MarkupRawUnit { + import std.file; + <> + <> + <> + <> + <> + <> + } + struct Inserts { + auto scan_subdoc_source(O)( + O _opt_action, + char[][] markup_sourcefile_insert_content, + string fn_src + ) { + mixin SiSUrgxInitFlags; + <> + foreach (line; markup_sourcefile_insert_content) { + <> + } // end src subdoc (inserts) loop + <> + } + auto scan_master_src_for_insert_files_and_import_content(O)( + O _opt_action, + char[][] sourcefile_body_content, + string fn_src + ) { + import std.algorithm; + mixin SiSUrgxInitFlags; + <> + foreach (line; sourcefile_body_content) { + <> + } // end src doc loop + <> + } + } +} +#+END_SRC + +** get markup source, read file :source:markup: +*** read file, source string [#A] :string: + +#+name: meta_markup_source_raw_read_file_source_string +#+BEGIN_SRC d +final private string readInMarkupSource(in char[] fn_src) { + enforce( + exists(fn_src)!=0, + "file not found: «" ~ + fn_src ~ "»" + ); + string source_txt_str; + try { + if (exists(fn_src)) { + debug(io) { + writeln("in src, markup source file found: ", fn_src); + } + source_txt_str = fn_src.readText; + } + } + catch (ErrnoException ex) { + } + catch (UTFException ex) { + // Handle validation errors + } + catch (FileException ex) { + // Handle errors + } + std.utf.validate(source_txt_str); + return source_txt_str; +} +#+END_SRC + +*** document header & content, array.length == 2 [#A] :array: + +here you split document header and body, an array.length == 2 +split is on first match of level A~ (which is required) + +#+name: meta_markup_source_raw_doc_header_and_content_split +#+BEGIN_SRC d +final private char[][] header0Content1(in string src_text) { + /+ split string on _first_ match of "^:?A~\s" into [header, content] array/tuple +/ + char[][] header_and_content; + auto m = (cast(char[]) src_text).matchFirst(rgx.heading_a); + header_and_content ~= m.pre; + header_and_content ~= m.hit ~ m.post; + assert(header_and_content.length == 2, + "document markup is broken, header body split == " + ~ header_and_content.length.to!string + ~ "; (header / body array split should == 2 (split is on level A~))" + ); + return header_and_content; +} +#+END_SRC + +*** source line array :array: + +#+name: meta_markup_source_raw_source_line_array +#+BEGIN_SRC d +final private char[][] markupSourceLineArray(in char[] src_text) { + char[][] source_line_arr + = (cast(char[]) src_text).split(rgx.newline_eol_strip_preceding); + return source_line_arr; +} +#+END_SRC + +*** source content raw line array :array: +- used for regular .sst files; master .ssm files and; .ssi inserts +- regex is passed for relevant enforce match + +**** read in file + +#+name: meta_markup_source_raw_read_in_file +#+BEGIN_SRC d +auto markupSourceReadIn(in string fn_src) { + static auto rgx = Rgx(); + enforce( + fn_src.match(rgx.src_pth_sst_or_ssm), + "not a sisu markup filename: «" ~ + fn_src ~ "»" + ); + auto source_txt_str = readInMarkupSource(fn_src); + return source_txt_str; +} +#+END_SRC + +**** tuple (a) header, (b) body content, (c) file insert list & (d) image list? + +- header +- body content +- file insert list +- [image list?] + +#+name: meta_markup_source_raw_tuple_of_header_and_body +#+BEGIN_SRC d +auto markupSourceHeaderContentRawLineTupleArray(in string source_txt_str) { + string[] file_insert_list = []; + string[] images_list = []; + auto hc = header0Content1(source_txt_str); + auto header = hc[0]; + char[] source_txt = hc[1]; + auto source_line_arr = markupSourceLineArray(source_txt); + auto t = tuple( + header, + source_line_arr, + file_insert_list, + images_list + ); + return t; +} +#+END_SRC + +**** get insert source line array + +#+name: meta_markup_source_raw_get_insert_source_line_array +#+BEGIN_SRC d +final char[][] getInsertMarkupSourceContentRawLineArray( + in char[] fn_src_insert, + Regex!(char) rgx_file +) { + enforce( + fn_src_insert.match(rgx_file), + "not a sisu markup filename: «" ~ + fn_src_insert ~ "»" + ); + auto source_txt_str = readInMarkupSource(fn_src_insert); + auto source_line_arr = markupSourceLineArray(source_txt_str); + return source_line_arr; +} +#+END_SRC + +** get markup source, master file & inserts :masterfile:inserts: +[[./sdp.org][sdp]] [[./][org/]] + +*** scan inserts (sub-document) source :scan_insert_src: +**** scan subdoc source + +#+name: meta_inserts_scan +#+BEGIN_SRC d +char[][] contents_insert; +auto type1 = flags_type_init; +auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); +auto markup_src_file_path = fn_pth_full.captures[1]; +#+END_SRC + +**** loop insert (sub-document) + +#+name: meta_inserts_scan_loop +#+BEGIN_SRC d +if (type1["curly_code"] == 1) { + type1["header_make"] = 0; + type1["header_meta"] = 0; + if (line.matchFirst(rgx.block_curly_code_close)) { + type1["curly_code"] = 0; + } + contents_insert ~= line; +} else if (line.matchFirst(rgx.block_curly_code_open)) { + type1["curly_code"] = 1; + type1["header_make"] = 0; + type1["header_meta"] = 0; + contents_insert ~= line; +} else if (type1["tic_code"] == 1) { + type1["header_make"] = 0; + type1["header_meta"] = 0; + if (line.matchFirst(rgx.block_tic_close)) { + type1["tic_code"] = 0; + } + contents_insert ~= line; +} else if (line.matchFirst(rgx.block_tic_code_open)) { + type1["tic_code"] = 1; + type1["header_make"] = 0; + type1["header_meta"] = 0; + contents_insert ~= line; +} else if ( + (type1["header_make"] == 1) + && line.matchFirst(rgx.native_header_sub) +) { + type1["header_make"] = 1; + type1["header_meta"] = 0; +} else if ( + (type1["header_meta"] == 1) + && line.matchFirst(rgx.native_header_sub) +) { + type1["header_meta"] = 1; + type1["header_make"] = 0; +} else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { + type1["header_make"] = 0; + type1["header_meta"] = 0; + auto insert_fn = m.captures[2]; + auto insert_sub_pth = m.captures[1]; + auto fn_src_insert + = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; + auto raw = MarkupRawUnit(); + auto markup_sourcesubfile_insert_content + = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); + debug(insert_file) { + tell_l("red", line); + tell_l("red", fn_src_insert); + tell_l("fuchsia", "ERROR"); + writeln( + " length contents insert array: ", + markup_sourcesubfile_insert_content.length + ); + } + if (_opt_action.source || _opt_action.sisupod) { + _images ~= _extract_images(markup_sourcesubfile_insert_content); + } + auto ins = Inserts(); + /+ + - 1. load file + - 2. read lines + - 3. scan lines + - a. if filename insert, and insert filename + - repeat 1 + - b. else + - add line to new array; + - build image list, search for any image files to add to image list + +/ +} else { + type1["header_make"] = 0; + type1["header_meta"] = 0; + contents_insert ~= line; // images to extract for image list? + if (_opt_action.source || _opt_action.sisupod) { + auto _image_linelist = _extract_images(line); + if (_image_linelist.length > 0) { + _images ~= _image_linelist; + } + } +} +#+END_SRC + +**** post loop + +#+name: meta_inserts_scan_post +#+BEGIN_SRC d +auto t = tuple( + contents_insert, + _images +); +return t; +#+END_SRC + +*** scan document source :scan_src: +**** scan doc source + +#+name: meta_master_doc_scan_for_insert_filenames +#+BEGIN_SRC d +char[][] contents; +auto type = flags_type_init; +auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); +auto markup_src_file_path = fn_pth_full.captures[1]; +char[][] contents_insert; +string[] _images =[]; +string[] insert_file_list =[]; +#+END_SRC + +**** include inserts: _loop master_ scan for inserts (insert documents) + +#+name: meta_master_doc_scan_for_insert_filenames_loop +#+BEGIN_SRC d +if (type["curly_code"] == 1) { + if (line.matchFirst(rgx.block_curly_code_close)) { + type["curly_code"] = 0; + } + contents ~= line; +} else if (line.matchFirst(rgx.block_curly_code_open)) { + type["curly_code"] = 1; + contents ~= line; +} else if (type["tic_code"] == 1) { + if (line.matchFirst(rgx.block_tic_close)) { + type["tic_code"] = 0; + } + contents ~= line; +} else if (line.matchFirst(rgx.block_tic_code_open)) { + type["tic_code"] = 1; + contents ~= line; +} else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { + auto insert_fn = m.captures[2]; + auto insert_sub_pth = m.captures[1]; + auto fn_src_insert + = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; + insert_file_list ~= fn_src_insert.to!string; + auto raw = MarkupRawUnit(); + /+ TODO +/ + auto markup_sourcefile_insert_content + = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); + debug(insert_file) { + tell_l("red", line); + tell_l("red", fn_src_insert); + writeln( + " length contents insert array: ", + markup_sourcefile_insert_content.length + ); + } + auto ins = Inserts(); + auto contents_insert_tu = ins.scan_subdoc_source( + _opt_action, + markup_sourcefile_insert_content, + fn_src_insert.to!string + ); + contents ~= contents_insert_tu[0]; // images to extract for image list? + if (_opt_action.source || _opt_action.sisupod) { + auto _image_linelist = _extract_images(contents_insert_tu[0]); + if (_image_linelist.length > 0) { + _images ~= _image_linelist; + } + } + /+ + - 1. load file + - 2. read lines + - 3. scan lines + - a. if filename insert, and insert filename + - repeat 1 + - b. else + - add line to new array; + - build image list, search for any image files to add to image list + +/ +} else { + contents ~= line; + if (_opt_action.source || _opt_action.sisupod) { + auto _image_linelist = _extract_images(line); + if (_image_linelist.length > 0) { + _images ~= _image_linelist; + } + } +} +#+END_SRC + +**** post loop + +#+name: meta_master_doc_scan_for_insert_filenames_post +#+BEGIN_SRC d +string[] images = []; +foreach(i; uniq(_images.sort())) { + images ~= i; +} +debug(insert_file) { + writeln(__LINE__); + writeln(contents.length); +} +auto t = tuple( + contents, + insert_file_list, + images +); +return t; +#+END_SRC + +* __END__ diff --git a/src/sdp/meta/conf_make_meta_sdlang.d b/src/sdp/meta/conf_make_meta_sdlang.d deleted file mode 100644 index 4ebe960..0000000 --- a/src/sdp/meta/conf_make_meta_sdlang.d +++ /dev/null @@ -1,474 +0,0 @@ -/++ - extract native/orig header return associative array
- - 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_sdlang; -static template docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct() { - import - std.exception, - std.regex, - std.stdio, - std.traits, - std.typecons, - std.utf, - std.conv : to; - import sdlang; - import - sdp.meta.conf_make_meta_sdlang, - sdp.meta.rgx; - mixin SiSUrgxInit; - mixin SiSUextractSDLang; - static auto rgx = Rgx(); - auto docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct(CCm, Src)( - CCm conf_composite_make, - Src header_src, - ) { - 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); - return header_make_and_meta_struct; - } -} -/++ - sdlang headers
- extract sdlang header return sdlang -+/ -static template SiSUextractSDLang() { - 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.rgx; - struct extractSDL { - mixin SiSUmakeMetaStructsSDLang; - mixin SiSUrgxInit; - static auto rgx = Rgx(); - private auto docHeaderSDLtagGet(Hs)(Hs src_header) { - debug(asserts){ - static assert(is(typeof(src_header) == char[])); - } - char[][] source_header_arr - = (cast(char[]) src_header).split(rgx.newline_eol_delimiter); - char[] _src_header; - foreach(header_line; source_header_arr) { - if (!match(header_line, rgx.comments)) { - _src_header ~= header_line ~ "\n"; - } - } - scope(failure) { - stderr.writefln( - "%s\n%s\n%s:%s failed here:\n _src_header: %s", - __MODULE__, __FUNCTION__, - __FILE__, __LINE__, - _src_header, - ); - } - Tag sdl_root_header; - try { - sdl_root_header = parseSource(_src_header.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_header.toSDLDocument()); - writeln(__LINE__, ": ", sdl_root_header.maybe.namespaces); - writeln("header make sdlang: ", sdl_root_header.toSDLDocument()); - writeln(__LINE__, ": ", sdl_root_header.getTagValues("title")); - writeln(__LINE__, ": ", sdl_root_header.getTagValues("creator")); - Tag creator = sdl_root_header.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_header; // sdlang.ast.Tag - } - private auto docSDLtoStruct(C,Tag)(C _conf_composite, Tag header_sdlang) { // work on - /+ 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); - } - /+ 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; - } - 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) { - 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; - } - _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, - ); - } - return _conf_composite; - } - } -} -static template parseSDLangConfig() { - import - std.exception, - std.regex, - std.stdio, - std.string, - std.traits, - std.typecons, - std.utf, - std.conv : to; - import sdlang; - 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; - } -} -/++ - return composite make from config files -+/ - -template confFilesSDLtoStruct() { - 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.rgx; - 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 - } - auto confFilesSDLtoStruct(S,L)( - S sdl_root_config_share, - L sdl_root_config_local, - ){ - mixin SiSUmakeMetaStructsSDLang; - ConfCompositePlus _conf_composite; - foreach (conf_sdlang; [sdl_root_config_share, sdl_root_config_local]) { - if ("make" in conf_sdlang.maybe.tags) { - 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; - } -} -/++ - default settings -+/ -template SiSUmakeMetaStructsSDLang() { - 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; - 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; - } -} diff --git a/src/sdp/meta/doc_debugs.d b/src/sdp/meta/doc_debugs.d index 89ca3a7..66b5f0e 100644 --- a/src/sdp/meta/doc_debugs.d +++ b/src/sdp/meta/doc_debugs.d @@ -23,8 +23,8 @@ template SiSUdebugs() { std.utf, std.conv : to; auto SiSUdebugs(S,T)( - auto return ref const S contents, - auto return ref T doc_matters, + const S contents, + T doc_matters, ) { mixin SiSUrgxInit; mixin InternalMarkup; @@ -595,8 +595,8 @@ template SiSUdebugs() { } debug(checkdoc) { void out_segnames(S,T)( - auto return ref const S contents, - auto return ref T doc_matters, + const S contents, + T doc_matters, ) { foreach (key; doc_matters.xml.keys_seq.seg) { if (contents[key].length > 1) { @@ -611,7 +611,7 @@ template SiSUdebugs() { } debug(checkdoc) { void out_toc(S)( - auto return ref const S contents, + const S contents, string key, ) { if (contents[key].length > 1) { @@ -629,7 +629,7 @@ template SiSUdebugs() { } debug(checkdoc) { void out_endnotes(S)( - auto return ref const S contents, + const S contents, string key, ) { if (contents[key].length > 1) { @@ -645,7 +645,7 @@ template SiSUdebugs() { } debug(checkdoc) { void out_bookindex(S)( - auto return ref const S contents, + const S contents, string key, ) { if (contents[key].length > 1) { diff --git a/src/sdp/meta/metadoc.d b/src/sdp/meta/metadoc.d index 8160010..29af49c 100644 --- a/src/sdp/meta/metadoc.d +++ b/src/sdp/meta/metadoc.d @@ -14,11 +14,11 @@ template SiSUabstraction() { sdp.meta.conf_make_meta_json, sdp.meta.defaults, sdp.meta.doc_debugs, - sdp.meta.read_config_files, - sdp.meta.read_source_files, sdp.meta.rgx, - sdp.output.hub, - sdp.output.paths_source; + sdp.source.paths_source, + sdp.source.read_config_files, + sdp.source.read_source_files, + sdp.output.hub; mixin SiSUrgxInit; mixin contentJSONtoSiSUstruct; mixin SiSUbiblio; diff --git a/src/sdp/meta/read_config_files.d b/src/sdp/meta/read_config_files.d deleted file mode 100644 index 22d285f..0000000 --- a/src/sdp/meta/read_config_files.d +++ /dev/null @@ -1,226 +0,0 @@ -/++ - read configuration files
- - read config files
- meta_config_files.d -+/ -module sdp.meta.read_config_files; -static template configReadInSiteTOML() { - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - 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(pth.to!string, 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; - } -} -static template configReadInDocTOML() { - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - 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(pth.to!string, 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; - } -} -static template configTOML() { - import toml; // - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - 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; - } -} -static template readConfigSite() { - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - 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]) { - foreach(pth; possible_config_path_locations) { - auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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(); - } -} -static template readConfigDoc() { - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - 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]) { - foreach(pth; possible_config_path_locations) { - auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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(); - } -} -static template configReadSiteTOML() { - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - 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() { - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - 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; - } -} diff --git a/src/sdp/meta/read_source_files.d b/src/sdp/meta/read_source_files.d deleted file mode 100644 index 135d8e8..0000000 --- a/src/sdp/meta/read_source_files.d +++ /dev/null @@ -1,354 +0,0 @@ -/++ - module meta_read_source_files;
- - open markup files
- - if master file scan for addional files to import/insert -+/ -module sdp.meta.read_source_files; -static template SiSUrawMarkupContent() { - import - sdp.meta.rgx; - import - sdp.meta, - sdp.output.paths_source, - std.file, - std.path; - mixin SiSUrgxInit; - static auto rgx = Rgx(); - string[] _images=[]; - auto _extract_images(S)(S content_block) { - string[] images_; - auto _content_block = content_block.to!string; - if (auto m = _content_block.matchAll(rgx.image)) { - images_ ~= m.captures[1].to!string; - } - return images_; - } - auto rawsrc = RawMarkupContent(); - auto SiSUrawMarkupContent(O,Fn)(O _opt_action, Fn fn_src) { - auto _0_header_1_body_content_2_insert_filelist_tuple - = rawsrc.sourceContentSplitIntoHeaderAndBody(_opt_action, rawsrc.sourceContent(fn_src), fn_src); - return _0_header_1_body_content_2_insert_filelist_tuple; - } - struct RawMarkupContent { - final sourceContent(in string fn_src) { - auto raw = MarkupRawUnit(); - auto source_txt_str - = raw.markupSourceReadIn(fn_src); - return source_txt_str; - } - final auto sourceContentSplitIntoHeaderAndBody(O)(O _opt_action, in string source_txt_str, in string fn_src="") { - auto raw = MarkupRawUnit(); - string[] insert_file_list; - string[] images_list; - auto t - = raw.markupSourceHeaderContentRawLineTupleArray(source_txt_str); - auto header_raw = t[0]; - auto sourcefile_body_content = t[1]; - if (fn_src.match(rgx.src_fn_master)) { // filename with path needed if master file (.ssm) not otherwise - auto ins = Inserts(); - auto tu - = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); - static assert(!isTypeTuple!(tu)); - sourcefile_body_content = tu[0]; - insert_file_list = tu[1].dup; - images_list = tu[2].dup; - } else if (_opt_action.source || _opt_action.sisupod) { - auto ins = Inserts(); - auto tu - = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); - static assert(!isTypeTuple!(tu)); - images_list = tu[2].dup; - } - t = tuple( - header_raw, - sourcefile_body_content, - insert_file_list, - images_list - ); - static assert(t.length==4); - return t; - } - } - struct MarkupRawUnit { - import std.file; - final private string readInMarkupSource(in char[] fn_src) { - enforce( - exists(fn_src)!=0, - "file not found: «" ~ - fn_src ~ "»" - ); - string source_txt_str; - try { - if (exists(fn_src)) { - debug(io) { - writeln("in src, markup source file found: ", fn_src); - } - source_txt_str = fn_src.readText; - } - } - catch (ErrnoException ex) { - } - catch (UTFException ex) { - // Handle validation errors - } - catch (FileException ex) { - // Handle errors - } - std.utf.validate(source_txt_str); - return source_txt_str; - } - final private char[][] header0Content1(in string src_text) { - /+ split string on _first_ match of "^:?A~\s" into [header, content] array/tuple +/ - char[][] header_and_content; - auto m = (cast(char[]) src_text).matchFirst(rgx.heading_a); - header_and_content ~= m.pre; - header_and_content ~= m.hit ~ m.post; - assert(header_and_content.length == 2, - "document markup is broken, header body split == " - ~ header_and_content.length.to!string - ~ "; (header / body array split should == 2 (split is on level A~))" - ); - return header_and_content; - } - final private char[][] markupSourceLineArray(in char[] src_text) { - char[][] source_line_arr - = (cast(char[]) src_text).split(rgx.newline_eol_strip_preceding); - return source_line_arr; - } - auto markupSourceReadIn(in string fn_src) { - static auto rgx = Rgx(); - enforce( - fn_src.match(rgx.src_pth_sst_or_ssm), - "not a sisu markup filename: «" ~ - fn_src ~ "»" - ); - auto source_txt_str = readInMarkupSource(fn_src); - return source_txt_str; - } - auto markupSourceHeaderContentRawLineTupleArray(in string source_txt_str) { - string[] file_insert_list = []; - string[] images_list = []; - auto hc = header0Content1(source_txt_str); - auto header = hc[0]; - char[] source_txt = hc[1]; - auto source_line_arr = markupSourceLineArray(source_txt); - auto t = tuple( - header, - source_line_arr, - file_insert_list, - images_list - ); - return t; - } - final char[][] getInsertMarkupSourceContentRawLineArray( - in char[] fn_src_insert, - Regex!(char) rgx_file - ) { - enforce( - fn_src_insert.match(rgx_file), - "not a sisu markup filename: «" ~ - fn_src_insert ~ "»" - ); - auto source_txt_str = readInMarkupSource(fn_src_insert); - auto source_line_arr = markupSourceLineArray(source_txt_str); - return source_line_arr; - } - } - struct Inserts { - auto scan_subdoc_source(O)( - O _opt_action, - char[][] markup_sourcefile_insert_content, - string fn_src - ) { - mixin SiSUrgxInitFlags; - char[][] contents_insert; - auto type1 = flags_type_init; - auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); - auto markup_src_file_path = fn_pth_full.captures[1]; - foreach (line; markup_sourcefile_insert_content) { - if (type1["curly_code"] == 1) { - type1["header_make"] = 0; - type1["header_meta"] = 0; - if (line.matchFirst(rgx.block_curly_code_close)) { - type1["curly_code"] = 0; - } - contents_insert ~= line; - } else if (line.matchFirst(rgx.block_curly_code_open)) { - type1["curly_code"] = 1; - type1["header_make"] = 0; - type1["header_meta"] = 0; - contents_insert ~= line; - } else if (type1["tic_code"] == 1) { - type1["header_make"] = 0; - type1["header_meta"] = 0; - if (line.matchFirst(rgx.block_tic_close)) { - type1["tic_code"] = 0; - } - contents_insert ~= line; - } else if (line.matchFirst(rgx.block_tic_code_open)) { - type1["tic_code"] = 1; - type1["header_make"] = 0; - type1["header_meta"] = 0; - contents_insert ~= line; - } else if ( - (type1["header_make"] == 1) - && line.matchFirst(rgx.native_header_sub) - ) { - type1["header_make"] = 1; - type1["header_meta"] = 0; - } else if ( - (type1["header_meta"] == 1) - && line.matchFirst(rgx.native_header_sub) - ) { - type1["header_meta"] = 1; - type1["header_make"] = 0; - } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { - type1["header_make"] = 0; - type1["header_meta"] = 0; - auto insert_fn = m.captures[2]; - auto insert_sub_pth = m.captures[1]; - auto fn_src_insert - = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; - auto raw = MarkupRawUnit(); - auto markup_sourcesubfile_insert_content - = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); - debug(insert_file) { - tell_l("red", line); - tell_l("red", fn_src_insert); - tell_l("fuchsia", "ERROR"); - writeln( - " length contents insert array: ", - markup_sourcesubfile_insert_content.length - ); - } - if (_opt_action.source || _opt_action.sisupod) { - _images ~= _extract_images(markup_sourcesubfile_insert_content); - } - auto ins = Inserts(); - /+ - - 1. load file - - 2. read lines - - 3. scan lines - - a. if filename insert, and insert filename - - repeat 1 - - b. else - - add line to new array; - - build image list, search for any image files to add to image list - +/ - } else { - type1["header_make"] = 0; - type1["header_meta"] = 0; - contents_insert ~= line; // images to extract for image list? - if (_opt_action.source || _opt_action.sisupod) { - auto _image_linelist = _extract_images(line); - if (_image_linelist.length > 0) { - _images ~= _image_linelist; - } - } - } - } // end src subdoc (inserts) loop - auto t = tuple( - contents_insert, - _images - ); - return t; - } - auto scan_master_src_for_insert_files_and_import_content(O)( - O _opt_action, - char[][] sourcefile_body_content, - string fn_src - ) { - import std.algorithm; - mixin SiSUrgxInitFlags; - char[][] contents; - auto type = flags_type_init; - auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); - auto markup_src_file_path = fn_pth_full.captures[1]; - char[][] contents_insert; - string[] _images =[]; - string[] insert_file_list =[]; - foreach (line; sourcefile_body_content) { - if (type["curly_code"] == 1) { - if (line.matchFirst(rgx.block_curly_code_close)) { - type["curly_code"] = 0; - } - contents ~= line; - } else if (line.matchFirst(rgx.block_curly_code_open)) { - type["curly_code"] = 1; - contents ~= line; - } else if (type["tic_code"] == 1) { - if (line.matchFirst(rgx.block_tic_close)) { - type["tic_code"] = 0; - } - contents ~= line; - } else if (line.matchFirst(rgx.block_tic_code_open)) { - type["tic_code"] = 1; - contents ~= line; - } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { - auto insert_fn = m.captures[2]; - auto insert_sub_pth = m.captures[1]; - auto fn_src_insert - = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; - insert_file_list ~= fn_src_insert.to!string; - auto raw = MarkupRawUnit(); - /+ TODO +/ - auto markup_sourcefile_insert_content - = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); - debug(insert_file) { - tell_l("red", line); - tell_l("red", fn_src_insert); - writeln( - " length contents insert array: ", - markup_sourcefile_insert_content.length - ); - } - auto ins = Inserts(); - auto contents_insert_tu = ins.scan_subdoc_source( - _opt_action, - markup_sourcefile_insert_content, - fn_src_insert.to!string - ); - contents ~= contents_insert_tu[0]; // images to extract for image list? - if (_opt_action.source || _opt_action.sisupod) { - auto _image_linelist = _extract_images(contents_insert_tu[0]); - if (_image_linelist.length > 0) { - _images ~= _image_linelist; - } - } - /+ - - 1. load file - - 2. read lines - - 3. scan lines - - a. if filename insert, and insert filename - - repeat 1 - - b. else - - add line to new array; - - build image list, search for any image files to add to image list - +/ - } else { - contents ~= line; - if (_opt_action.source || _opt_action.sisupod) { - auto _image_linelist = _extract_images(line); - if (_image_linelist.length > 0) { - _images ~= _image_linelist; - } - } - } - } // end src doc loop - string[] images = []; - foreach(i; uniq(_images.sort())) { - images ~= i; - } - debug(insert_file) { - writeln(__LINE__); - writeln(contents.length); - } - auto t = tuple( - contents, - insert_file_list, - images - ); - return t; - } - } -} diff --git a/src/sdp/output/epub3.d b/src/sdp/output/epub3.d index 9389e58..cde42d1 100644 --- a/src/sdp/output/epub3.d +++ b/src/sdp/output/epub3.d @@ -293,8 +293,8 @@ template outputEPub3() { } void outputEPub3(D,I)( - auto ref const D doc_abstraction, - auto ref I doc_matters, + const D doc_abstraction, + I doc_matters, ) { mixin SiSUoutputRgxInit; auto xhtml_format = outputXHTMLs(); diff --git a/src/sdp/output/html.d b/src/sdp/output/html.d index d783579..7024b0f 100644 --- a/src/sdp/output/html.d +++ b/src/sdp/output/html.d @@ -13,8 +13,8 @@ template outputHTML() { sdp.output.xmls_css; mixin outputXHTMLs; void scroll(D,I)( - auto ref const D doc_abstraction, - auto ref I doc_matters, + const D doc_abstraction, + I doc_matters, ) { mixin SiSUoutputRgxInit; auto xhtml_format = outputXHTMLs(); @@ -181,8 +181,8 @@ template outputHTML() { writeln(" ", pth_html.fn_scroll(doc_matters.src.filename)); } void seg(D,M)( - auto ref const D doc_abstraction, - auto ref M doc_matters, + const D doc_abstraction, + M doc_matters, ) { mixin SiSUoutputRgxInit; auto rgx = Rgx(); diff --git a/src/sdp/output/package.d b/src/sdp/output/package.d index 84bdfce..2aa6544 100644 --- a/src/sdp/output/package.d +++ b/src/sdp/output/package.d @@ -15,7 +15,7 @@ public import // std.uni, std.utf; public import - sdp.output.paths_source, + sdp.source.paths_source, sdp.output.defaults, sdp.output.paths_output, sdp.output.rgx; diff --git a/src/sdp/output/paths_output.d b/src/sdp/output/paths_output.d index cd4817b..8a4d623 100644 --- a/src/sdp/output/paths_output.d +++ b/src/sdp/output/paths_output.d @@ -14,13 +14,9 @@ template SiSUoutPaths() { ) { struct _PathsStruct { string output_root() { - string out_root_; - if (output_pth_root.length > 0) { - out_root_ = output_pth_root; - } else { - out_root_ = "sisugen"; - } - return out_root_; + return (output_pth_root.length > 0) + ? output_pth_root + : "sisugen"; } string output_base() { return asNormalizedPath(output_root.chainPath(lng)).array; @@ -35,13 +31,9 @@ template SiSUoutPathSQLite() { ) { struct _PathsStruct { string output_root() { - string out_root_; - if (output_pth_root.length > 0) { - out_root_ = output_pth_root; - } else { - out_root_ = "sisugen"; - } - return out_root_; + return (output_pth_root.length > 0) + ? output_pth_root + : "sisugen"; } string output_base() { return asNormalizedPath(output_root).array; @@ -70,7 +62,7 @@ template SiSUoutPathsFnPd() { - else if pod_name != file_name - pod_name.file_name +/ - auto _fn_src = fn_src_pth.baseName.stripExtension; + string _fn_src = fn_src_pth.baseName.stripExtension; string _output_base_name; if (!(pod_name.empty)) { if (pod_name == _fn_src) { diff --git a/src/sdp/output/paths_source.d b/src/sdp/output/paths_source.d deleted file mode 100644 index e7233f0..0000000 --- a/src/sdp/output/paths_source.d +++ /dev/null @@ -1,791 +0,0 @@ -/++ - read configuration files
- - read config files
- meta_config_files.d -+/ -module sdp.output.paths_source; -import std.array, - std.file, - std.path, - std.regex, - std.stdio, - std.conv : to; -import sdp.meta.rgx; -template PodManifest() { - mixin SiSUrgxInit; - static auto rgx = Rgx(); - auto PodManifest(P)( - P _pth - ) { - struct ManifestFile_ { - auto pod_manifest_filename() { - string _manifest_file = "sisupod.manifest"; - return _manifest_file; - } - auto pod_manifest_path() { - string _manifest_path; - if ((isValidPath(_pth) && exists(_pth)!=0 && _pth.isDir) - && (exists(_pth.chainPath(pod_manifest_filename).array)!=0 - && (_pth.chainPath(pod_manifest_filename).array).isFile)) { - _manifest_path = _pth; - } else if (_pth.match(rgx.src_pth_contents) - && exists(_pth)!=0 && _pth.isFile) { - _manifest_path = _pth.dirName; - } 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); // remove? - _manifest_path = null; // _manifest_path = ""; - } - return _manifest_path; - } - string pod_manifest_file_with_path() { - string _k; - if (exists(pod_manifest_path.chainPath(pod_manifest_filename).array)!=0) { - _k = pod_manifest_path.chainPath(pod_manifest_filename).array; - } else if (exists(pod_manifest_path)!=0) { - _k = pod_manifest_path; - } - if (exists(_k)==0) { - writeln("ERROR >> Processing Skipped! Manifest not found: ", _k); - _k = null; - } - return _k; - } - } - return ManifestFile_(); - } -} -template PathMatters() { - mixin SiSUrgxInit; - static auto rgx = Rgx(); - auto PathMatters(O,E,P,F)( - O _opt_actions, - E _env, - P _pth, - F _fns = "", - char[][] _manifest_fn_list = [[]], - ) { - auto _manifest = PodManifest!()(_pth); - struct ManifestMatters_ { - auto env() { - auto _env = _env; - struct Env_ { - auto pwd() { - return _env["pwd"]; - } - auto home() { - return _env["home"]; - } - } - return Env_(); - } - auto opt() { - auto _opt_actions = _opt_actions; - struct Opt_ { - auto action() { // redundant - return _opt_actions; - } - } - return Opt_(); - } - auto src_is_pod() { - auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false; - return _src_is_pod; - } - auto pod() { - struct Pod_ { - auto src_is_pod() { - 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; - } - auto manifest_path() { - return _manifest.pod_manifest_path; - } - auto pod_name() { // TODO decide what returned if src_is_pod == false - return _manifest.pod_manifest_path.baseName; - } - auto manifest_file_with_path() { - return _manifest.pod_manifest_file_with_path; - } - 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; - } - auto image_dirs() { // TODO - string[] _image_dirs; - return _image_dirs; - } - auto manifest_list_of_filenames() { - return _manifest_fn_list; - } - auto manifest_list_of_languages() { - string[] _lngs; - foreach (filename_; manifest_list_of_filenames) { - string _k = "en"; - if (auto m = (filename_).match(rgx.language_code_and_filename)) { - _k = m.captures[1].to!string; - } - _lngs ~= _k; // all the languages from the manifest list of filenames with paths - } - return _lngs; - } - } - return Pod_(); - } - auto src() { - string _fns = _fns; // required here by dmd & not by ldc (for D:2078) - auto _opt_actions = _opt_actions; - auto _env = _env; - string _sep = "␣"; - struct SRC_ { - auto is_pod() { - auto _src_is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false; - return _src_is_pod; - } - auto path_and_fn() { - return _fns; - } - auto pod_name() { /+ work on +/ - auto _pod_name = (is_pod) - ? _manifest.pod_manifest_path - : ""; - return _pod_name; - } - auto filename() { - auto _fn = (path_and_fn).baseName; - return _fn; - } - auto filename_base() { - auto _fn = filename.stripExtension; - return _fn; - } - auto filename_extension() { - auto _ext = filename.match(rgx.src_pth_sst_or_ssm).captures["extension"]; - return _ext; - } - auto lng() { - string _k; - if (auto m = path_and_fn.match(rgx.language_code_and_filename)) { - _k = m.captures[1]; - } else { - _k = "en"; - } - return _k; - } - auto docname_composite_unique_per_src_doc() { - /+ - z pod name if any + src filename + lng code - filename ~ "." ~ lng - * unique per src doc - used by - - sqlite discrete index (multilingual, each language of a document) - +/ - string _fn; - if (pod_name.baseName == filename_base) { - _fn = filename_base ~ _sep ~ filename_extension ~ _sep ~ lng; - } else if (!(pod_name.empty)) { - _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng; - } else { - _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng; - } - return _fn; - } - auto docname_composite_unique_per_src_pod() { - /+ - z pod name if any + src filename (without lng code) - filename ~ _sep ~ lng - * unique per src pod - used by - - sisupod (multilingual collection) - - sqlite discrete index (multilingual collection) - +/ - string _fn; - if (pod_name.baseName == filename_base) { - _fn = filename_base ~ _sep ~ filename_extension; - } else if (!(pod_name.empty)) { - _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension; - } else { - _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension; - } - return _fn; - } - auto language() { - return lng(); - } - auto file_with_absolute_path() { - string _pth = _env["pwd"].chainPath(path_and_fn).array; - return _pth; - } - auto absolute_path_to_src() { - string _pth = (_env["pwd"].chainPath(path_and_fn)).dirName.array; - return _pth; - } - auto base_dir() { - string _dir; - if ( // TODO this should catch generated --source sisupod, untested, needs manifest - auto m = (absolute_path_to_src) - .match(regex(r"[/](?P

(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) - ) { - _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array; - assert(_dir == m.captures["dir"]); - } else { - _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array; - assert(_dir == absolute_path_to_src - .match(rgx.src_base_parent_dir_name).captures["dir"]); - } - if ((_opt_actions.debug_do)) { - writeln("--> (base_dir) ", _dir); - } - return _dir; - } - auto base_parent_dir_path() { - string _dir; - if ( // TODO this should catch generated --source sisupod, untested, needs manifest - auto m = (absolute_path_to_src) - .match(regex(r"[/](?P(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) - ) { - _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array; - } else { - _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array; - } - return _dir; - } - auto base_dir_path() { // looks like there is work to do - string _dir; - if ( - auto m = (absolute_path_to_src) - .match(rgx.src_formalised_file_path_parts) - ) { - _dir = asNormalizedPath(m.captures["pth"]).array; - } else if ( // TODO this should catch generated --source sisupod, untested, needs manifest - auto m = (absolute_path_to_src) - .match(regex(r"[/](?P(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) - ) { - _dir = asNormalizedPath(path_and_fn.chainPath("../")).array; - } else { - _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array; - } - if ((_opt_actions.debug_do)) { - writeln("--> (base_dir_path) ", _dir); - } - return _dir; - } - auto media_dir_path() { // TODO rework, can base directly on src fn path - string _dir = asNormalizedPath(base_dir_path.chainPath("media")).array; - return _dir; - } - auto image_dir_path() { - string _paths; - string[] _possible_img_pths = [ "./image", "../image", "../../image" ]; - string _img_pth_found = ""; - if (is_pod) { - _img_pth_found = asNormalizedPath(file_with_absolute_path.dirName ~ "/../../image").array; - } else { - string _img_pth(string _possible_img_pth) { - return asNormalizedPath(file_with_absolute_path.dirName ~ "/" ~ _possible_img_pth).array; - } - foreach(_possible_img_pth; _possible_img_pths) { - if (exists(_img_pth(_possible_img_pth))) { - _img_pth_found = _img_pth(_possible_img_pth); - break; - } else { - _paths ~= " " ~ _img_pth(_possible_img_pth); - } - } - } - if (_img_pth_found.empty) { - writeln("WARNING not image path found, searched: ", _paths); - } - return _img_pth_found; - } - auto conf_dir_path() { - auto _dir = asNormalizedPath(base_dir_path.chainPath("conf")).array; - return _dir; - } - auto base_parent_dir() { - string _dir; - if ( // TODO this should catch generated --source sisupod, untested, needs manifest - auto m = (absolute_path_to_src) - .match(regex(r"[/](?P(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) - ) { - _dir = m.captures["dir"]; - } else { - _dir = (absolute_path_to_src).match(rgx.src_base_parent_dir_name).captures["dir"]; - } - if ((_opt_actions.debug_do)) { - writeln("--> (base_parent_dir) ", _dir); - } - return _dir; - } - auto config_dirs() { // TODO - string[] _config_dirs; - if (is_pod) { - } else { - } - return _config_dirs; - } - auto image_dirs() { // TODO - string[] _image_dirs; - if (is_pod) { - } else { - } - return _image_dirs; - } - } - return SRC_(); - } - auto output() { - auto _opt_actions = _opt_actions; - auto _env = _env; - struct Out_ { - auto path() { - auto _output_path = _env["pwd"]; - if ((_opt_actions.output_dir_set.length > 0) - && isValidPath(_opt_actions.output_dir_set) - ) { - _output_path = asNormalizedPath(_opt_actions.output_dir_set).array; - if (!exists(_output_path)) { - try { - _output_path.mkdirRecurse; - } - // catch (ErrnoException ex) { - catch (Exception ex) { - // Handle error - } - } - assert(_output_path.isDir, - "not a directory: " ~ _output_path); - // TODO always test that is a directory and it is writable - } - return _output_path; - } - } - return Out_(); - } - } - return ManifestMatters_(); - } -} -template ConfigFilePaths() { - mixin SiSUrgxInit; - static auto rgx = Rgx(); - auto ConfigFilePaths(M,E)( - M _manifest, - E _env, - ) { - struct ConfFilePaths { - auto config_filename_document_toml() { - return "sisu_document_make"; - } - auto config_filename_site_toml() { - return "config_local_site"; - } - auto possible_config_path_locations() { - struct _ConfFilePaths { - auto sisu_document_make() { - /+ FIX clean up conf paths ↓ +/ - /+ config local site (file system only, not in pod) +/ - /+ return paths +/ - string[] _possible_config_path_locations; - if (_manifest.src.is_pod) { - /+ config document in pod +/ - string _sisudoc_conf_pod; // - string _sisudoc_conf_pod_text; // - _sisudoc_conf_pod = asNormalizedPath(chainPath( - to!string(_env["pwd"]), - _manifest.pod.manifest_path ~ "/conf" - )).array; - _sisudoc_conf_pod_text = asNormalizedPath(chainPath( - to!string(_env["pwd"]), - _manifest.pod.manifest_path ~ "/media/text/" ~ _manifest.src.lng ~ "/conf" - )).array; - /+ return paths +/ - _possible_config_path_locations = [ - _sisudoc_conf_pod_text, - _sisudoc_conf_pod, - ]; - } else { - /+ config document (& or local site) on filesystem +/ - string _sisudoc_conf_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about - string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array; - string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array; - string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array; - string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array; - /+ return paths +/ - _possible_config_path_locations = [ - _sisudoc_conf_pwd, - _sisudoc_conf_pwd_a, - _sisudoc_conf_pwd_b, - _sisudoc_conf_pwd_c, - _sisudoc_conf_pwd_d, - ]; - } - /+ FIX clean up conf paths ↑ - (compare pwd to doc path location, and build config path) - +/ - return _possible_config_path_locations; - } - 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; - string _underscore_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "_sisu")).array; - string _dot_home = asNormalizedPath(chainPath(to!string(_env["home"]), ".sisu")).array; - /+ 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", - _collection_root_a, // set priority higher? - _collection_root_b // set priority higher? - ]; - } else { - /+ config document (& or local site) on filesystem +/ - string _sisudoc_conf_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about - string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array; - string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array; - string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array; - string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array; - _possible_config_path_locations = [ - _sisudoc_conf_pwd, - _sisudoc_conf_pwd_a, - _sisudoc_conf_pwd_b, - _sisudoc_conf_pwd_c, - _sisudoc_conf_pwd_d, - _dot_pwd, - _underscore_pwd, - _dot_home, - "/etc/sisu" - ]; - } - /+ FIX clean up conf paths ↑ - (compare pwd to doc path location, and build config path) - +/ - return _possible_config_path_locations; - } - } - return _ConfFilePaths(); - } - } - return ConfFilePaths(); - } -} -template SiSUpathsSRC() { - mixin SiSUrgxInit; - static auto rgx = Rgx(); - auto SiSUpathsSRC(D,Fn)( - D _pwd, - Fn _fn_src_and_path, - ) { - struct SisuSrcPaths { - auto pwd() { - return _pwd; - } - auto language() { - // use command line info as well? - string _k; - if (auto m = _fn_src_and_path.match(rgx.language_code_and_filename)) { - _k = m.captures[1]; - } else { /+ unknown until doc_meta read, (could provide & use command line info?) +/ - _k = "xx"; // original default was "en" but is not known - } - return _k; - } - auto doc_root() { - return "sisudoc"; - } - auto media_root() { - return asNormalizedPath(doc_root.chainPath("media")).array; - } - auto conf_root() { - return asNormalizedPath(doc_root.chainPath("conf")).array; - } - auto text_root() { - return asNormalizedPath(media_root.chainPath("text")).array; - } - auto image_root() { - return asNormalizedPath(media_root.chainPath("image")).array; - } - auto doc_src_fn_with_path_for_text_root_and_lng() { - return asNormalizedPath(text_root.chainPath(language)).array; - } - auto doc_src_fn() { - return asNormalizedPath(_fn_src_and_path.baseName).array; - } - auto doc_src_with_path() { - return asNormalizedPath(pwd.chainPath(_fn_src_and_path)).array; - } - } - return SisuSrcPaths(); - } -} - - -template SiSUpathsSisupods() { - mixin SiSUrgxInit; - static auto rgx = Rgx(); - string _suffix = ".zip"; - auto SiSUpathsSisupods(Dm)(Dm doc_matters) { - string _base_dir_pod = (doc_matters.output_path.length > 0) - ? doc_matters.output_path ~ "/sisupod" - : "/sisupod"; - string _base_dir_doc = "sisudoc"; - struct _PodPaths { - string base_filename_(string fn_src) { - auto pth = fn_src.baseName.stripExtension; - return pth; - } - string sisupod_dir_() { - auto pth = _base_dir_pod; - return pth; - } - string sisudoc_dir_() { - auto pth = _base_dir_doc; - return pth; - } - string sisupod_filename_(string fn_src) { - string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array; - return pth; - } - string base_filesystem_(string fn_src) { - string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; - assert(pth == _base_dir_pod ~ "/" ~ base_filename_(fn_src), - pth ~ " == " ~ _base_dir_pod ~ "/" ~ base_filename_(fn_src) ~ "?"); - return pth; - } - string base_pod_(string fn_src) { - string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this - return pth; - } - auto base_filename(string fn_src) { - auto pth_1_ = base_filename_(fn_src); - auto pth_2_ = base_filename_(fn_src); - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - return pth_2_; - } - } - return _pods(); - } - auto sisupod_filename(string fn_src) { - auto pth_1_ = sisupod_filename_(fn_src); - auto pth_2_ = sisupod_filename_(fn_src); - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - return pth_2_; - } - } - return _pods(); - } - auto base(string fn_src) { - auto pth_1_ = ""; - auto pth_2_ = base_filesystem_(fn_src); - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - return pth_2_; - } - } - return _pods(); - } - auto pod_root(string fn_src) { - auto pth_1_ = ""; - auto pth_2_ = asNormalizedPath(base(fn_src).filesystem_open_zpod.chainPath("")).array; // "sisudoc" - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - return pth_2_; - } - } - return _pods(); - } - auto conf_root(string fn_src) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = "conf"; - auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("conf")).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto css(string fn_src) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = asNormalizedPath(conf_root(fn_src).zpod.chainPath("css")).array; - auto pth_2_ = asNormalizedPath(conf_root(fn_src).filesystem_open_zpod.chainPath("css")).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto media_root(string fn_src) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = "media"; - auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("media")).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto text_root(string fn_src) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("text")).array; - auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("text")).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto doc(string fn_src) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = text_root(fn_src).zpod; - auto pth_2_ = text_root(fn_src).filesystem_open_zpod; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto doc_lng(string fn_src, string lng) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = asNormalizedPath(text_root(fn_src).zpod.chainPath(lng)).array; - auto pth_2_ = asNormalizedPath(text_root(fn_src).filesystem_open_zpod.chainPath(lng)).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto image_root(string fn_src) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("image")).array; - auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("image")).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto fn_pod_filelist(string fn_src) { - auto pod_root_ = pod_root(fn_src); - auto _manifest = PodManifest!()(fn_src).pod_manifest_filename; - auto pth_1_ = _manifest; - auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath(_manifest)).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto fn_doc(string fn_src, string lng) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_src.baseName)).array; - auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_src.baseName)).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - auto fn_doc_insert(string fn_src, string fn_insert, string lng) { - auto pod_root_ = pod_root(fn_src); - auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_insert.baseName)).array; - auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_insert.baseName)).array; - struct _pods { - auto zpod() { - return pth_1_; - } - auto filesystem_open_zpod() { - assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); - return pth_2_; - } - } - return _pods(); - } - } - return _PodPaths(); - } -} diff --git a/src/sdp/output/sqlite.d b/src/sdp/output/sqlite.d index f805392..faff29b 100644 --- a/src/sdp/output/sqlite.d +++ b/src/sdp/output/sqlite.d @@ -685,10 +685,11 @@ template SQLiteTablesReCreate() { seg VARCHAR(256) NULL, lev_an VARCHAR(1), lev SMALLINT NULL, - t_of VARCHAR(16), - t_is VARCHAR(16), + is_of_type VARCHAR(16), + is_a VARCHAR(16), node VARCHAR(16) NULL, parent VARCHAR(16) NULL, + last_decendant VARCHAR(16) NULL, /* headings only */ digest_clean CHAR(256), digest_all CHAR(256), types CHAR(1) NULL @@ -874,8 +875,8 @@ template SQLiteInsertDocObjectsLoop() { clean, body, lev, - t_of, - t_is + is_of_type, + is_a ) VALUES ( %d, @@ -1173,10 +1174,11 @@ template SQLiteTablesCreate() { seg VARCHAR(256) NULL, lev_an VARCHAR(1), lev SMALLINT NULL, - t_of VARCHAR(16), - t_is VARCHAR(16), + is_of_type VARCHAR(16), + is_a VARCHAR(16), node VARCHAR(16) NULL, parent VARCHAR(16) NULL, + last_decendant VARCHAR(16) NULL, /* headings only */ digest_clean CHAR(256), digest_all CHAR(256), types CHAR(1) NULL diff --git a/src/sdp/output/xmls.d b/src/sdp/output/xmls.d index e389c5c..874329f 100644 --- a/src/sdp/output/xmls.d +++ b/src/sdp/output/xmls.d @@ -51,8 +51,8 @@ template outputXHTMLs() { return delimit; } string special_characters(O)( - auto ref const O obj, - string _txt + const O obj, + string _txt ){ _txt = (_txt) .replaceAll(rgx.xhtml_ampersand, "&") @@ -312,10 +312,10 @@ template outputXHTMLs() { return o; } auto inline_images(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "seg", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "seg", ) { string _img_pth; if (_xml_type == "epub") { @@ -335,10 +335,10 @@ template outputXHTMLs() { return _txt; } auto inline_links(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "seg", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "seg", ) { if (obj.has.inline_links) { if ((_txt.match(rgx.mark_internal_site_lnk)) @@ -381,8 +381,8 @@ template outputXHTMLs() { return _txt; } auto inline_notes_scroll(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { if (obj.has.inline_notes_reg) { _txt = font_face(_txt); @@ -404,8 +404,8 @@ template outputXHTMLs() { return _txt; } auto inline_notes_seg(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string[] _endnotes; if (obj.has.inline_notes_reg) { @@ -443,9 +443,9 @@ template outputXHTMLs() { return t; } auto inline_markup_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { _txt = inline_images(obj, _txt, _suffix, "scroll"); _txt = inline_links(obj, _txt, _suffix, "scroll"); @@ -453,10 +453,10 @@ template outputXHTMLs() { return _txt; } auto inline_markup_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "seg", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "seg", ) { _txt = inline_images(obj, _txt, _suffix, _xml_type); _txt = inline_links(obj, _txt, _suffix, _xml_type); @@ -464,7 +464,7 @@ template outputXHTMLs() { return t; } string lev4_heading_subtoc(O)( - auto ref const O obj, + const O obj, ) { char[] lev4_subtoc; lev4_subtoc ~= "
\n"; @@ -490,7 +490,7 @@ template outputXHTMLs() { return lev4_subtoc.to!string; } auto nav_pre_next_svg(O)( - auto ref const O obj, + const O obj, ) { string prev, next, toc; if (obj.tags.segment_anchor_tag == "toc") { @@ -567,9 +567,9 @@ template outputXHTMLs() { return bar(); } auto heading(O)( - auto ref const O obj, - string _txt, - string _xml_type = "html", + const O obj, + string _txt, + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); string _horizontal_rule = "
"; @@ -616,9 +616,9 @@ template outputXHTMLs() { return o; } auto heading_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -626,10 +626,10 @@ template outputXHTMLs() { return o; } auto heading_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0]; @@ -642,8 +642,8 @@ template outputXHTMLs() { return u; } auto para(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = font_face(_txt); @@ -681,9 +681,9 @@ template outputXHTMLs() { return o; } auto para_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -691,10 +691,10 @@ template outputXHTMLs() { return o; } auto para_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -707,8 +707,8 @@ template outputXHTMLs() { return u; } auto quote(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -738,9 +738,9 @@ template outputXHTMLs() { return o; } auto quote_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", + const O obj, + string _txt, + string _suffix = ".html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -748,10 +748,10 @@ template outputXHTMLs() { return o; } auto quote_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -764,8 +764,8 @@ template outputXHTMLs() { return u; } auto group(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -795,10 +795,10 @@ template outputXHTMLs() { return o; } auto group_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -806,10 +806,10 @@ template outputXHTMLs() { return o; } auto group_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -822,8 +822,8 @@ template outputXHTMLs() { return u; } auto block(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -849,10 +849,10 @@ template outputXHTMLs() { return o; } auto block_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -860,10 +860,10 @@ template outputXHTMLs() { return o; } auto block_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -876,8 +876,8 @@ template outputXHTMLs() { return u; } auto verse(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { _txt = font_face(_txt); string o; @@ -903,10 +903,10 @@ template outputXHTMLs() { return o; } auto verse_scroll(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = inline_markup_scroll(obj, _txt, _suffix); @@ -914,10 +914,10 @@ template outputXHTMLs() { return o; } auto verse_seg(O)( - auto ref const O obj, - string _txt, - string _suffix = ".html", - string _xml_type = "html", + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "html", ) { auto t = inline_markup_seg(obj, _txt, _suffix, _xml_type); _txt = t[0].to!string; @@ -930,8 +930,8 @@ template outputXHTMLs() { return u; } auto tablarize(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string[] _table_rows = (_txt).split(rgx.table_delimiter_row); string[] _table_cols; @@ -963,8 +963,8 @@ template outputXHTMLs() { return t; } auto table(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { auto tags = _xhtml_anchor_tags(obj.tags.anchor_tags); _txt = font_face(_txt); @@ -992,8 +992,8 @@ template outputXHTMLs() { return o; } auto endnote(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string o; o = format(q"¶

@@ -1007,8 +1007,8 @@ template outputXHTMLs() { return o; } auto code(O)( - auto ref const O obj, - string _txt, + const O obj, + string _txt, ) { string o; if (obj.metainfo.object_number.empty) { diff --git a/src/sdp/sdp.d b/src/sdp/sdp.d index 0c2c271..b703838 100755 --- a/src/sdp/sdp.d +++ b/src/sdp/sdp.d @@ -17,11 +17,11 @@ import sdp.meta.conf_make_meta_json, sdp.meta.defaults, sdp.meta.doc_debugs, - sdp.meta.read_config_files, - sdp.meta.read_source_files, sdp.meta.rgx, - sdp.output.hub, - sdp.output.paths_source; + sdp.source.paths_source, + sdp.source.read_config_files, + sdp.source.read_source_files, + sdp.output.hub; mixin(import("version.txt")); mixin CompileTimeInfo; /++ @@ -42,7 +42,7 @@ void main(string[] args) { scope(success) { debug(checkdoc) { writefln( - "~ run complete, ok ~ (sdp-%s.%s.%s, %s v%s, %s %s)", + "~ run complete, ok ~ (sdp-%s.%s.%s, %s D:%s, %s %s)", ver.major, ver.minor, ver.patch, __VENDOR__, __VERSION__, bits, os, diff --git a/src/sdp/source/paths_source.d b/src/sdp/source/paths_source.d new file mode 100644 index 0000000..8d3aefe --- /dev/null +++ b/src/sdp/source/paths_source.d @@ -0,0 +1,774 @@ +/++ + read configuration files
+ - read config files
+ meta_config_files.d ++/ +module sdp.source.paths_source; +import std.array, + std.file, + std.path, + std.regex, + std.stdio, + std.conv : to; +import sdp.meta.rgx; +template PodManifest() { + mixin SiSUrgxInit; + static auto rgx = Rgx(); + auto PodManifest(P)( + P _pth + ) { + struct ManifestFile_ { + string pod_manifest_filename() { + return "sisupod.manifest"; + } + string pod_manifest_path() { + string _manifest_path; + if ((isValidPath(_pth) && exists(_pth)!=0 && _pth.isDir) + && (exists(_pth.chainPath(pod_manifest_filename).array)!=0 + && (_pth.chainPath(pod_manifest_filename).array).isFile)) { + _manifest_path = _pth; + } else if (_pth.match(rgx.src_pth_contents) + && exists(_pth)!=0 && _pth.isFile) { + _manifest_path = _pth.dirName; + } 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); // remove? + _manifest_path = null; // _manifest_path = ""; + } + return _manifest_path; + } + string pod_manifest_file_with_path() { + string _k; + if (exists(pod_manifest_path.chainPath(pod_manifest_filename).array)!=0) { + _k = pod_manifest_path.chainPath(pod_manifest_filename).array; + } else if (exists(pod_manifest_path)!=0) { + _k = pod_manifest_path; + } + if (exists(_k)==0) { + writeln("ERROR >> Processing Skipped! Manifest not found: ", _k); + _k = null; + } + return _k; + } + } + return ManifestFile_(); + } +} +template PathMatters() { + mixin SiSUrgxInit; + static auto rgx = Rgx(); + auto PathMatters(O,E)( + O _opt_actions, + E _env, + string _pth, + string _fns = "", + char[][] _manifest_fn_list = [[]], + ) { + auto _manifest = PodManifest!()(_pth); + struct ManifestMatters_ { + auto env() { + auto _env = _env; + struct Env_ { + auto pwd() { + return _env["pwd"]; + } + auto home() { + return _env["home"]; + } + } + return Env_(); + } + auto opt() { + auto _opt_actions = _opt_actions; + struct Opt_ { + auto action() { // redundant + return _opt_actions; + } + } + return Opt_(); + } + bool src_is_pod() { + return (_manifest.pod_manifest_path.length > 0) ? true : false; + } + auto pod() { + struct Pod_ { + bool src_is_pod() { + return (_manifest.pod_manifest_path.length > 0) ? true : false; + } + 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; + } + string manifest_filename() { + return _manifest.pod_manifest_filename; + } + string manifest_path() { + return _manifest.pod_manifest_path; + } + string pod_name() { + return _manifest.pod_manifest_path.baseName; + } + string manifest_file_with_path() { + return _manifest.pod_manifest_file_with_path; + } + string[] config_sisu_document_make_dirs() { + string[] _config_dirs; + return _config_dirs; + } + string[] config_local_site_dirs() { + string[] _config_dirs; + return _config_dirs; + } + string[] image_dirs() { + string[] _image_dirs; + return _image_dirs; + } + auto manifest_list_of_filenames() { + return _manifest_fn_list; + } + string[] manifest_list_of_languages() { + string[] _lngs; + foreach (filename_; manifest_list_of_filenames) { + string _k = "en"; + if (auto m = (filename_).match(rgx.language_code_and_filename)) { + _k = m.captures[1].to!string; + } + _lngs ~= _k; // all the languages from the manifest list of filenames with paths + } + return _lngs; + } + } + return Pod_(); + } + auto src() { + string _fns = _fns; // required here by dmd & not by ldc (for D:2078) + auto _opt_actions = _opt_actions; + auto _env = _env; + string _sep = "␣"; + struct SRC_ { + bool is_pod() { + return (_manifest.pod_manifest_path.length > 0) ? true : false; + } + string path_and_fn() { + return _fns; + } + string pod_name() { + return (is_pod) ? _manifest.pod_manifest_path : ""; + } + string filename() { + return path_and_fn.baseName; + } + string filename_base() { + return filename.stripExtension; + } + string filename_extension() { + return filename.match(rgx.src_pth_sst_or_ssm).captures["extension"]; + } + string lng() { + string _k; + if (auto m = path_and_fn.match(rgx.language_code_and_filename)) { + _k = m.captures[1]; + } else {_k = "en"; } + return _k; + } + string docname_composite_unique_per_src_doc() { + /+ + z pod name if any + src filename + lng code + filename ~ "." ~ lng + * unique per src doc + used by + - sqlite discrete index (multilingual, each language of a document) + +/ + string _fn; + if (pod_name.baseName == filename_base) { + _fn = filename_base ~ _sep ~ filename_extension ~ _sep ~ lng; + } else if (!(pod_name.empty)) { + _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng; + } else { + _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension ~ _sep ~ lng; + } + return _fn; + } + string docname_composite_unique_per_src_pod() { + /+ + z pod name if any + src filename (without lng code) + filename ~ _sep ~ lng + * unique per src pod + used by + - sisupod (multilingual collection) + - sqlite discrete index (multilingual collection) + +/ + string _fn; + if (pod_name.baseName == filename_base) { + _fn = filename_base ~ _sep ~ filename_extension; + } else if (!(pod_name.empty)) { + _fn = pod_name.baseName ~ _sep ~ filename_base ~ _sep ~ filename_extension; + } else { + _fn = "_" ~ _sep ~ filename_base ~ _sep ~ filename_extension; + } + return _fn; + } + string language() { + return lng(); + } + string file_with_absolute_path() { + return _env["pwd"].chainPath(path_and_fn).array; + } + string absolute_path_to_src() { + return (_env["pwd"].chainPath(path_and_fn)).dirName.array; + } + string base_dir() { + string _dir; + if ( // TODO this should catch generated --source sisupod, untested, needs manifest + auto m = (absolute_path_to_src) + .match(regex(r"[/](?P

(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) + ) { + _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array; + assert(_dir == m.captures["dir"]); + } else { + _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array; + assert(_dir == absolute_path_to_src + .match(rgx.src_base_parent_dir_name).captures["dir"]); + } + if ((_opt_actions.debug_do)) { + writeln("--> (base_dir) ", _dir); + } + return _dir; + } + string base_parent_dir_path() { + string _dir; + if ( // TODO this should catch generated --source sisupod, untested, needs manifest + auto m = (absolute_path_to_src) + .match(regex(r"[/](?P(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) + ) { + _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array; + } else { + _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array; + } + return _dir; + } + string base_dir_path() { + string _dir; + if ( + auto m = (absolute_path_to_src) + .match(rgx.src_formalised_file_path_parts) + ) { + _dir = asNormalizedPath(m.captures["pth"]).array; + } else if ( // TODO this should catch generated --source sisupod, untested, needs manifest + auto m = (absolute_path_to_src) + .match(regex(r"[/](?P(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) + ) { + _dir = asNormalizedPath(path_and_fn.chainPath("../")).array; + } else { + _dir = asNormalizedPath(path_and_fn.chainPath("../../")).array; + } + if ((_opt_actions.debug_do)) { + writeln("--> (base_dir_path) ", _dir); + } + return _dir; + } + string media_dir_path() { + string _dir = asNormalizedPath(base_dir_path.chainPath("media")).array; + return _dir; + } + string image_dir_path() { + string _paths; + string[] _possible_img_pths = [ "./image", "../image", "../../image" ]; + string _img_pth_found = ""; + if (is_pod) { + _img_pth_found = asNormalizedPath(file_with_absolute_path.dirName ~ "/../../image").array; + } else { + string _img_pth(string _possible_img_pth) { + return asNormalizedPath(file_with_absolute_path.dirName ~ "/" ~ _possible_img_pth).array; + } + foreach(_possible_img_pth; _possible_img_pths) { + if (exists(_img_pth(_possible_img_pth))) { + _img_pth_found = _img_pth(_possible_img_pth); + break; + } else { + _paths ~= " " ~ _img_pth(_possible_img_pth); + } + } + } + if (_img_pth_found.empty) { + writeln("WARNING not image path found, searched: ", _paths); + } + return _img_pth_found; + } + auto conf_dir_path() { + return asNormalizedPath(base_dir_path.chainPath("conf")).array; + } + auto base_parent_dir() { + string _dir; + if ( // TODO this should catch generated --source sisupod, untested, needs manifest + auto m = (absolute_path_to_src) + .match(regex(r"[/](?P(?:[a-zA-Z0-9._-]+))/sisupod/" ~ filename.stripExtension)) + ) { + _dir = m.captures["dir"]; + } else { + _dir = (absolute_path_to_src).match(rgx.src_base_parent_dir_name).captures["dir"]; + } + if ((_opt_actions.debug_do)) { + writeln("--> (base_parent_dir) ", _dir); + } + return _dir; + } + string[] config_dirs() { + string[] _config_dirs; + if (is_pod) { + } else {} + return _config_dirs; + } + string[] image_dirs() { + string[] _image_dirs; + if (is_pod) { + } else {} + return _image_dirs; + } + } + return SRC_(); + } + auto output() { + auto _opt_actions = _opt_actions; + auto _env = _env; + struct Out_ { + auto path() { + auto _output_path = _env["pwd"]; + if ((_opt_actions.output_dir_set.length > 0) + && isValidPath(_opt_actions.output_dir_set) + ) { + _output_path = asNormalizedPath(_opt_actions.output_dir_set).array; + if (!exists(_output_path)) { + try { + _output_path.mkdirRecurse; + } + // catch (ErrnoException ex) { + catch (Exception ex) { + // Handle error + } + } + assert(_output_path.isDir, + "not a directory: " ~ _output_path); + // TODO always test that is a directory and it is writable + } + return _output_path; + } + } + return Out_(); + } + } + return ManifestMatters_(); + } +} +template ConfigFilePaths() { + mixin SiSUrgxInit; + static auto rgx = Rgx(); + auto ConfigFilePaths(M,E)( + M _manifest, + E _env, + ) { + struct ConfFilePaths { + string config_filename_document_toml() { + return "sisu_document_make"; + } + string config_filename_site_toml() { + return "config_local_site"; + } + auto possible_config_path_locations() { + struct _ConfFilePaths { + string[] sisu_document_make() { + /+ FIX clean up conf paths ↓ +/ + /+ config local site (file system only, not in pod) +/ + /+ return paths +/ + string[] _possible_config_path_locations; + if (_manifest.src.is_pod) { + /+ config document in pod +/ + string _sisudoc_conf_pod; // + string _sisudoc_conf_pod_text; // + _sisudoc_conf_pod = asNormalizedPath(chainPath( + to!string(_env["pwd"]), + _manifest.pod.manifest_path ~ "/conf" + )).array; + _sisudoc_conf_pod_text = asNormalizedPath(chainPath( + to!string(_env["pwd"]), + _manifest.pod.manifest_path ~ "/media/text/" ~ _manifest.src.lng ~ "/conf" + )).array; + /+ return paths +/ + _possible_config_path_locations = [ + _sisudoc_conf_pod_text, + _sisudoc_conf_pod, + ]; + } else { + /+ config document (& or local site) on filesystem +/ + string _sisudoc_conf_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about + string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array; + string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array; + string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array; + string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array; + /+ return paths +/ + _possible_config_path_locations = [ + _sisudoc_conf_pwd, + _sisudoc_conf_pwd_a, + _sisudoc_conf_pwd_b, + _sisudoc_conf_pwd_c, + _sisudoc_conf_pwd_d, + ]; + } + /+ FIX clean up conf paths ↑ + (compare pwd to doc path location, and build config path) + +/ + return _possible_config_path_locations; + } + string[] 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; + string _underscore_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "_sisu")).array; + string _dot_home = asNormalizedPath(chainPath(to!string(_env["home"]), ".sisu")).array; + /+ 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", + _collection_root_a, // set priority higher? + _collection_root_b // set priority higher? + ]; + } else { + /+ config document (& or local site) on filesystem +/ + string _sisudoc_conf_pwd = asNormalizedPath(chainPath(to!string(_env["pwd"]), "sisudoc/conf")).array; // think about + string _sisudoc_conf_pwd_a = asNormalizedPath(chainPath(to!string(_env["pwd"]), "conf")).array; + string _sisudoc_conf_pwd_b = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../conf")).array; + string _sisudoc_conf_pwd_c = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../conf")).array; + string _sisudoc_conf_pwd_d = asNormalizedPath(chainPath(to!string(_env["pwd"]), "../../../conf")).array; + _possible_config_path_locations = [ + _sisudoc_conf_pwd, + _sisudoc_conf_pwd_a, + _sisudoc_conf_pwd_b, + _sisudoc_conf_pwd_c, + _sisudoc_conf_pwd_d, + _dot_pwd, + _underscore_pwd, + _dot_home, + "/etc/sisu" + ]; + } + /+ FIX clean up conf paths ↑ + (compare pwd to doc path location, and build config path) + +/ + return _possible_config_path_locations; + } + } + return _ConfFilePaths(); + } + } + return ConfFilePaths(); + } +} +template SiSUpathsSRC() { + mixin SiSUrgxInit; + static auto rgx = Rgx(); + auto SiSUpathsSRC(D,Fn)( + D _pwd, + Fn _fn_src_and_path, + ) { + struct SisuSrcPaths { + auto pwd() { + return _pwd; + } + string language() { + // use command line info as well? + string _k; + if (auto m = _fn_src_and_path.match(rgx.language_code_and_filename)) { + _k = m.captures[1]; + } else { /+ unknown until doc_meta read, (could provide & use command line info?) +/ + _k = "xx"; // original default was "en" but is not known + } + return _k; + } + string doc_root() { + return "sisudoc"; + } + auto media_root() { + return asNormalizedPath(doc_root.chainPath("media")).array; + } + auto conf_root() { + return asNormalizedPath(doc_root.chainPath("conf")).array; + } + auto text_root() { + return asNormalizedPath(media_root.chainPath("text")).array; + } + auto image_root() { + return asNormalizedPath(media_root.chainPath("image")).array; + } + auto doc_src_fn_with_path_for_text_root_and_lng() { + return asNormalizedPath(text_root.chainPath(language)).array; + } + auto doc_src_fn() { + return asNormalizedPath(_fn_src_and_path.baseName).array; + } + auto doc_src_with_path() { + return asNormalizedPath(pwd.chainPath(_fn_src_and_path)).array; + } + } + return SisuSrcPaths(); + } +} + + +template SiSUpathsSisupods() { + mixin SiSUrgxInit; + static auto rgx = Rgx(); + string _suffix = ".zip"; + auto SiSUpathsSisupods(Dm)(Dm doc_matters) { + string _base_dir_pod = (doc_matters.output_path.length > 0) + ? doc_matters.output_path ~ "/sisupod" + : "/sisupod"; + string _base_dir_doc = "sisudoc"; + struct _PodPaths { + string base_filename_(string fn_src) { + auto pth = fn_src.baseName.stripExtension; + return pth; + } + string sisupod_dir_() { + auto pth = _base_dir_pod; + return pth; + } + string sisudoc_dir_() { + auto pth = _base_dir_doc; + return pth; + } + string sisupod_filename_(string fn_src) { + string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array; + return pth; + } + string base_filesystem_(string fn_src) { + string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; + assert(pth == _base_dir_pod ~ "/" ~ base_filename_(fn_src), + pth ~ " == " ~ _base_dir_pod ~ "/" ~ base_filename_(fn_src) ~ "?"); + return pth; + } + string base_pod_(string fn_src) { + string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this + return pth; + } + auto base_filename(string fn_src) { + auto pth_1_ = base_filename_(fn_src); + auto pth_2_ = base_filename_(fn_src); + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + return pth_2_; + } + } + return _pods(); + } + auto sisupod_filename(string fn_src) { + auto pth_1_ = sisupod_filename_(fn_src); + auto pth_2_ = sisupod_filename_(fn_src); + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + return pth_2_; + } + } + return _pods(); + } + auto base(string fn_src) { + auto pth_1_ = ""; + auto pth_2_ = base_filesystem_(fn_src); + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + return pth_2_; + } + } + return _pods(); + } + auto pod_root(string fn_src) { + auto pth_1_ = ""; + auto pth_2_ = asNormalizedPath(base(fn_src).filesystem_open_zpod.chainPath("")).array; // "sisudoc" + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + return pth_2_; + } + } + return _pods(); + } + auto conf_root(string fn_src) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = "conf"; + auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("conf")).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto css(string fn_src) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = asNormalizedPath(conf_root(fn_src).zpod.chainPath("css")).array; + auto pth_2_ = asNormalizedPath(conf_root(fn_src).filesystem_open_zpod.chainPath("css")).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto media_root(string fn_src) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = "media"; + auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath("media")).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto text_root(string fn_src) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("text")).array; + auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("text")).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto doc(string fn_src) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = text_root(fn_src).zpod; + auto pth_2_ = text_root(fn_src).filesystem_open_zpod; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto doc_lng(string fn_src, string lng) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = asNormalizedPath(text_root(fn_src).zpod.chainPath(lng)).array; + auto pth_2_ = asNormalizedPath(text_root(fn_src).filesystem_open_zpod.chainPath(lng)).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto image_root(string fn_src) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = asNormalizedPath(media_root(fn_src).zpod.chainPath("image")).array; + auto pth_2_ = asNormalizedPath(media_root(fn_src).filesystem_open_zpod.chainPath("image")).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto fn_pod_filelist(string fn_src) { + auto pod_root_ = pod_root(fn_src); + auto _manifest = PodManifest!()(fn_src).pod_manifest_filename; + auto pth_1_ = _manifest; + auto pth_2_ = asNormalizedPath(pod_root(fn_src).filesystem_open_zpod.chainPath(_manifest)).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto fn_doc(string fn_src, string lng) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_src.baseName)).array; + auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_src.baseName)).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + auto fn_doc_insert(string fn_src, string fn_insert, string lng) { + auto pod_root_ = pod_root(fn_src); + auto pth_1_ = asNormalizedPath(doc_lng(fn_src, lng).zpod.chainPath(fn_insert.baseName)).array; + auto pth_2_ = asNormalizedPath(doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_insert.baseName)).array; + struct _pods { + auto zpod() { + return pth_1_; + } + auto filesystem_open_zpod() { + assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_); + return pth_2_; + } + } + return _pods(); + } + } + return _PodPaths(); + } +} diff --git a/src/sdp/source/read_config_files.d b/src/sdp/source/read_config_files.d new file mode 100644 index 0000000..9d976a5 --- /dev/null +++ b/src/sdp/source/read_config_files.d @@ -0,0 +1,226 @@ +/++ + read configuration files
+ - read config files
+ meta_config_files.d ++/ +module sdp.source.read_config_files; +static template configReadInSiteTOML() { + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + 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(pth.to!string, 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; + } +} +static template configReadInDocTOML() { + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + 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(pth.to!string, 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; + } +} +static template configTOML() { + import toml; // + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + 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; + } +} +static template readConfigSite() { + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + 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]) { + foreach(pth; possible_config_path_locations) { + auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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(); + } +} +static template readConfigDoc() { + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + 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]) { + foreach(pth; possible_config_path_locations) { + auto conf_file = asNormalizedPath(chainPath(pth.to!string, 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(); + } +} +static template configReadSiteTOML() { + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + 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() { + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + 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; + } +} diff --git a/src/sdp/source/read_source_files.d b/src/sdp/source/read_source_files.d new file mode 100644 index 0000000..28a660a --- /dev/null +++ b/src/sdp/source/read_source_files.d @@ -0,0 +1,354 @@ +/++ + module source_read_source_files;
+ - open markup files
+ - if master file scan for addional files to import/insert ++/ +module sdp.source.read_source_files; +static template SiSUrawMarkupContent() { + import + sdp.meta.rgx; + import + sdp.meta, + sdp.source.paths_source, + std.file, + std.path; + mixin SiSUrgxInit; + static auto rgx = Rgx(); + string[] _images=[]; + auto _extract_images(S)(S content_block) { + string[] images_; + auto _content_block = content_block.to!string; + if (auto m = _content_block.matchAll(rgx.image)) { + images_ ~= m.captures[1].to!string; + } + return images_; + } + auto rawsrc = RawMarkupContent(); + auto SiSUrawMarkupContent(O,Fn)(O _opt_action, Fn fn_src) { + auto _0_header_1_body_content_2_insert_filelist_tuple + = rawsrc.sourceContentSplitIntoHeaderAndBody(_opt_action, rawsrc.sourceContent(fn_src), fn_src); + return _0_header_1_body_content_2_insert_filelist_tuple; + } + struct RawMarkupContent { + final sourceContent(in string fn_src) { + auto raw = MarkupRawUnit(); + auto source_txt_str + = raw.markupSourceReadIn(fn_src); + return source_txt_str; + } + final auto sourceContentSplitIntoHeaderAndBody(O)(O _opt_action, in string source_txt_str, in string fn_src="") { + auto raw = MarkupRawUnit(); + string[] insert_file_list; + string[] images_list; + auto t + = raw.markupSourceHeaderContentRawLineTupleArray(source_txt_str); + auto header_raw = t[0]; + auto sourcefile_body_content = t[1]; + if (fn_src.match(rgx.src_fn_master)) { // filename with path needed if master file (.ssm) not otherwise + auto ins = Inserts(); + auto tu + = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); + static assert(!isTypeTuple!(tu)); + sourcefile_body_content = tu[0]; + insert_file_list = tu[1].dup; + images_list = tu[2].dup; + } else if (_opt_action.source || _opt_action.sisupod) { + auto ins = Inserts(); + auto tu + = ins.scan_master_src_for_insert_files_and_import_content(_opt_action, sourcefile_body_content, fn_src); + static assert(!isTypeTuple!(tu)); + images_list = tu[2].dup; + } + t = tuple( + header_raw, + sourcefile_body_content, + insert_file_list, + images_list + ); + static assert(t.length==4); + return t; + } + } + struct MarkupRawUnit { + import std.file; + final private string readInMarkupSource(in char[] fn_src) { + enforce( + exists(fn_src)!=0, + "file not found: «" ~ + fn_src ~ "»" + ); + string source_txt_str; + try { + if (exists(fn_src)) { + debug(io) { + writeln("in src, markup source file found: ", fn_src); + } + source_txt_str = fn_src.readText; + } + } + catch (ErrnoException ex) { + } + catch (UTFException ex) { + // Handle validation errors + } + catch (FileException ex) { + // Handle errors + } + std.utf.validate(source_txt_str); + return source_txt_str; + } + final private char[][] header0Content1(in string src_text) { + /+ split string on _first_ match of "^:?A~\s" into [header, content] array/tuple +/ + char[][] header_and_content; + auto m = (cast(char[]) src_text).matchFirst(rgx.heading_a); + header_and_content ~= m.pre; + header_and_content ~= m.hit ~ m.post; + assert(header_and_content.length == 2, + "document markup is broken, header body split == " + ~ header_and_content.length.to!string + ~ "; (header / body array split should == 2 (split is on level A~))" + ); + return header_and_content; + } + final private char[][] markupSourceLineArray(in char[] src_text) { + char[][] source_line_arr + = (cast(char[]) src_text).split(rgx.newline_eol_strip_preceding); + return source_line_arr; + } + auto markupSourceReadIn(in string fn_src) { + static auto rgx = Rgx(); + enforce( + fn_src.match(rgx.src_pth_sst_or_ssm), + "not a sisu markup filename: «" ~ + fn_src ~ "»" + ); + auto source_txt_str = readInMarkupSource(fn_src); + return source_txt_str; + } + auto markupSourceHeaderContentRawLineTupleArray(in string source_txt_str) { + string[] file_insert_list = []; + string[] images_list = []; + auto hc = header0Content1(source_txt_str); + auto header = hc[0]; + char[] source_txt = hc[1]; + auto source_line_arr = markupSourceLineArray(source_txt); + auto t = tuple( + header, + source_line_arr, + file_insert_list, + images_list + ); + return t; + } + final char[][] getInsertMarkupSourceContentRawLineArray( + in char[] fn_src_insert, + Regex!(char) rgx_file + ) { + enforce( + fn_src_insert.match(rgx_file), + "not a sisu markup filename: «" ~ + fn_src_insert ~ "»" + ); + auto source_txt_str = readInMarkupSource(fn_src_insert); + auto source_line_arr = markupSourceLineArray(source_txt_str); + return source_line_arr; + } + } + struct Inserts { + auto scan_subdoc_source(O)( + O _opt_action, + char[][] markup_sourcefile_insert_content, + string fn_src + ) { + mixin SiSUrgxInitFlags; + char[][] contents_insert; + auto type1 = flags_type_init; + auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); + auto markup_src_file_path = fn_pth_full.captures[1]; + foreach (line; markup_sourcefile_insert_content) { + if (type1["curly_code"] == 1) { + type1["header_make"] = 0; + type1["header_meta"] = 0; + if (line.matchFirst(rgx.block_curly_code_close)) { + type1["curly_code"] = 0; + } + contents_insert ~= line; + } else if (line.matchFirst(rgx.block_curly_code_open)) { + type1["curly_code"] = 1; + type1["header_make"] = 0; + type1["header_meta"] = 0; + contents_insert ~= line; + } else if (type1["tic_code"] == 1) { + type1["header_make"] = 0; + type1["header_meta"] = 0; + if (line.matchFirst(rgx.block_tic_close)) { + type1["tic_code"] = 0; + } + contents_insert ~= line; + } else if (line.matchFirst(rgx.block_tic_code_open)) { + type1["tic_code"] = 1; + type1["header_make"] = 0; + type1["header_meta"] = 0; + contents_insert ~= line; + } else if ( + (type1["header_make"] == 1) + && line.matchFirst(rgx.native_header_sub) + ) { + type1["header_make"] = 1; + type1["header_meta"] = 0; + } else if ( + (type1["header_meta"] == 1) + && line.matchFirst(rgx.native_header_sub) + ) { + type1["header_meta"] = 1; + type1["header_make"] = 0; + } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { + type1["header_make"] = 0; + type1["header_meta"] = 0; + auto insert_fn = m.captures[2]; + auto insert_sub_pth = m.captures[1]; + auto fn_src_insert + = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; + auto raw = MarkupRawUnit(); + auto markup_sourcesubfile_insert_content + = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); + debug(insert_file) { + tell_l("red", line); + tell_l("red", fn_src_insert); + tell_l("fuchsia", "ERROR"); + writeln( + " length contents insert array: ", + markup_sourcesubfile_insert_content.length + ); + } + if (_opt_action.source || _opt_action.sisupod) { + _images ~= _extract_images(markup_sourcesubfile_insert_content); + } + auto ins = Inserts(); + /+ + - 1. load file + - 2. read lines + - 3. scan lines + - a. if filename insert, and insert filename + - repeat 1 + - b. else + - add line to new array; + - build image list, search for any image files to add to image list + +/ + } else { + type1["header_make"] = 0; + type1["header_meta"] = 0; + contents_insert ~= line; // images to extract for image list? + if (_opt_action.source || _opt_action.sisupod) { + auto _image_linelist = _extract_images(line); + if (_image_linelist.length > 0) { + _images ~= _image_linelist; + } + } + } + } // end src subdoc (inserts) loop + auto t = tuple( + contents_insert, + _images + ); + return t; + } + auto scan_master_src_for_insert_files_and_import_content(O)( + O _opt_action, + char[][] sourcefile_body_content, + string fn_src + ) { + import std.algorithm; + mixin SiSUrgxInitFlags; + char[][] contents; + auto type = flags_type_init; + auto fn_pth_full = fn_src.match(rgx.src_pth_sst_or_ssm); + auto markup_src_file_path = fn_pth_full.captures[1]; + char[][] contents_insert; + string[] _images =[]; + string[] insert_file_list =[]; + foreach (line; sourcefile_body_content) { + if (type["curly_code"] == 1) { + if (line.matchFirst(rgx.block_curly_code_close)) { + type["curly_code"] = 0; + } + contents ~= line; + } else if (line.matchFirst(rgx.block_curly_code_open)) { + type["curly_code"] = 1; + contents ~= line; + } else if (type["tic_code"] == 1) { + if (line.matchFirst(rgx.block_tic_close)) { + type["tic_code"] = 0; + } + contents ~= line; + } else if (line.matchFirst(rgx.block_tic_code_open)) { + type["tic_code"] = 1; + contents ~= line; + } else if (auto m = line.match(rgx.insert_src_fn_ssi_or_sst)) { + auto insert_fn = m.captures[2]; + auto insert_sub_pth = m.captures[1]; + auto fn_src_insert + = chainPath(markup_src_file_path, insert_sub_pth ~ insert_fn).array; + insert_file_list ~= fn_src_insert.to!string; + auto raw = MarkupRawUnit(); + /+ TODO +/ + auto markup_sourcefile_insert_content + = raw.getInsertMarkupSourceContentRawLineArray(fn_src_insert, rgx.src_fn_find_inserts); + debug(insert_file) { + tell_l("red", line); + tell_l("red", fn_src_insert); + writeln( + " length contents insert array: ", + markup_sourcefile_insert_content.length + ); + } + auto ins = Inserts(); + auto contents_insert_tu = ins.scan_subdoc_source( + _opt_action, + markup_sourcefile_insert_content, + fn_src_insert.to!string + ); + contents ~= contents_insert_tu[0]; // images to extract for image list? + if (_opt_action.source || _opt_action.sisupod) { + auto _image_linelist = _extract_images(contents_insert_tu[0]); + if (_image_linelist.length > 0) { + _images ~= _image_linelist; + } + } + /+ + - 1. load file + - 2. read lines + - 3. scan lines + - a. if filename insert, and insert filename + - repeat 1 + - b. else + - add line to new array; + - build image list, search for any image files to add to image list + +/ + } else { + contents ~= line; + if (_opt_action.source || _opt_action.sisupod) { + auto _image_linelist = _extract_images(line); + if (_image_linelist.length > 0) { + _images ~= _image_linelist; + } + } + } + } // end src doc loop + string[] images = []; + foreach(i; uniq(_images.sort())) { + images ~= i; + } + debug(insert_file) { + writeln(__LINE__); + writeln(contents.length); + } + auto t = tuple( + contents, + insert_file_list, + images + ); + return t; + } + } +} diff --git a/views/version.txt b/views/version.txt index 45dcb3b..805de17 100644 --- a/views/version.txt +++ b/views/version.txt @@ -4,7 +4,7 @@ struct Version { int minor; int patch; } -enum ver = Version(0, 26, 3); +enum ver = Version(0, 26, 4); version (Posix) { version (DigitalMars) { } else version (LDC) { -- cgit v1.2.3