diff options
Diffstat (limited to 'src/sisudoc/meta/metadoc.d')
-rw-r--r-- | src/sisudoc/meta/metadoc.d | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/src/sisudoc/meta/metadoc.d b/src/sisudoc/meta/metadoc.d new file mode 100644 index 0000000..a1899da --- /dev/null +++ b/src/sisudoc/meta/metadoc.d @@ -0,0 +1,296 @@ +/+ +- Name: SisuDoc Spine, Doc Reform [a part of] + - Description: documents, structuring, processing, publishing, search + - static content generator + + - Author: Ralph Amissah + [ralph.amissah@gmail.com] + + - Copyright: (C) 2015 - 2024 Ralph Amissah, All Rights Reserved. + + - License: AGPL 3 or later: + + Spine (SiSU), a framework for document structuring, publishing and + search + + Copyright (C) Ralph Amissah + + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU AFERO General Public License as published by the + Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along with + this program. If not, see [https://www.gnu.org/licenses/]. + + If you have Internet connection, the latest version of the AGPL should be + available at these locations: + [https://www.fsf.org/licensing/licenses/agpl.html] + [https://www.gnu.org/licenses/agpl.html] + + - Spine (by Doc Reform, related to SiSU) uses standard: + - docReform markup syntax + - standard SiSU markup syntax with modified headers and minor modifications + - docReform object numbering + - standard SiSU object citation numbering & system + + - Homepages: + [https://www.sisudoc.org] + [https://www.doc-reform.org] + + - Git + [https://git.sisudoc.org/] + ++/ +module sisudoc.meta.metadoc; +@safe: +template spineAbstraction() { + import + std.datetime; + import + sisudoc.meta, + sisudoc.meta.metadoc_from_src, + sisudoc.meta.conf_make_meta_structs, + sisudoc.meta.conf_make_meta_json, + sisudoc.meta.defaults, + sisudoc.io_in.paths_source, + sisudoc.io_in.read_config_files, + sisudoc.io_in.read_source_files, + sisudoc.io_out.hub; + mixin spineBiblio; + mixin outputHub; + enum headBody { header, body_content, insert_file_list, image_list } + enum makeMeta { make, meta } + enum docAbst { doc_abstract_obj, doc_has } + @system auto spineAbstraction(E,P,O,Cfg,M,S)( + E _env, + P program_info, + O _opt_action, + Cfg _cfg, + M _manifest, + S _make_and_meta_struct + ){ + { /+ document config/make file +/ + auto _config_document_struct = readConfigDoc!()(_manifest, _env); + import sisudoc.meta.conf_make_meta_yaml; + _make_and_meta_struct = _config_document_struct.configParseYAMLreturnSpineStruct!()(_make_and_meta_struct, _manifest, _opt_action, _cfg); + } + /+ ↓ read file (filename with path) +/ + /+ ↓ file tuple of header and content +/ + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("step1 commence → (get document header & body & insert file list & if needed image list) [", _manifest.src.filename, "]"); + } + auto _header_body_insertfilelist_imagelist + = spineRawMarkupContent!()(_opt_action, _manifest.src.path_and_fn); + static assert(_header_body_insertfilelist_imagelist.length==4); + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("- step1 complete for [", _manifest.src.filename, "]"); + } + debug(header_and_body) { + writeln(header); + writeln(_header_body_insertfilelist_imagelist.length); + writeln(_header_body_insertfilelist_imagelist.length[headBody.body_content][0]); + } + /+ ↓ split header into make and meta +/ + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("step2 commence → (read document header (yaml) return struct) [", _manifest.src.filename, "]"); + } + import sisudoc.meta.conf_make_meta_yaml; + _make_and_meta_struct = + docHeaderMakeAndMetaTupYamlExtractAndConvertToStruct!()( + _header_body_insertfilelist_imagelist[headBody.header], + _make_and_meta_struct, + _manifest, + _opt_action, + _cfg, + ); + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("- step2 complete for [", _manifest.src.filename, "]"); + } + /+ ↓ document abstraction: process document, return abstraction as tuple +/ + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("step3 commence → (document abstraction (da); da keys; segnames; doc_matters) [", _manifest.src.filename, "]"); + } + auto da = docAbstraction!()( + _header_body_insertfilelist_imagelist[headBody.body_content], + _make_and_meta_struct, + _opt_action, + _manifest, + true, + ); + auto doc_abstraction = da.document_the; + auto _doc_has_struct = da.doc_has; + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("- step3 complete for [", _manifest.src.filename, "]"); + } + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("step4 commence → (doc_matters) [", _manifest.src.filename, "]"); + } + struct DocumentMatters { + auto generator_program() { + struct Prog_ { + string project_name() { + return "spine"; + } + string name() { + return program_info.name; + } + string ver() { + return program_info.ver; + } + @trusted string name_and_version() { + return program_info.name_and_version; + } + @trusted string name_version_and_compiler() { + return program_info.name_version_and_compiler; + } + string url_home() { + return "https://sisudoc.org"; + } + string url_git() { + return "https://git.sisudoc.org/projects/"; + } + auto compiler() { + return program_info.compiler; + } + auto time_output_generated() { + return program_info.time_output_generated; + } + } + return Prog_(); + } + auto generated_time() { + auto _st = Clock.currTime(UTC()); + auto _time = _st.year.to!string + ~ "-" ~ _st.month.to!int.to!string // prefer as month number + ~ "-" ~ _st.day.to!string + ~ " [" ~ _st.isoWeek.to!string ~ "/" ~ _st.dayOfWeek.to!int.to!string ~ "]" + ~ " " ~ _st.hour.to!string + ~ ":" ~ _st.minute.to!string + ~ ":" ~ _st.second.to!string; + return _time; + } + auto conf_make_meta() { + return _make_and_meta_struct; + } + auto has() { + return _doc_has_struct; + } + auto env() { + struct Env_ { + auto pwd() { + return _manifest.env.pwd; + } + auto home() { + return _manifest.env.home; + } + } + return Env_(); + } + auto opt() { + struct Opt_ { + auto action() { + /+ getopt options, commandline instructions, raw + - processing instructions --epub --html etc. + - command line config instructions --output + +/ + return _opt_action; + } + } + return Opt_(); + } + auto src() { + return _manifest.src; + } + auto src_path_info() { + return spinePathsSRC!()(_manifest.env.pwd, _manifest.src.file_with_absolute_path); // would like (to have and use) relative path + } + auto pod() { + return _manifest.pod; + } + auto sqlite() { + struct SQLite_ { + string filename() { + string _fn = ""; + string _pth = ""; + if (_opt_action.sqliteDB_filename.length > 0) { + _fn = _opt_action.sqliteDB_filename; + } else if (_make_and_meta_struct.conf.w_srv_db_sqlite_filename.length > 0) { + _fn = _make_and_meta_struct.conf.w_srv_db_sqlite_filename; + } + return _fn; + } + string path() { + string _pth = ""; + if (_opt_action.sqliteDB_path.length > 0) { + _pth = _opt_action.sqliteDB_path; + } else if (_make_and_meta_struct.conf.w_srv_db_sqlite_path.length > 0) { + _pth = _make_and_meta_struct.conf.w_srv_db_sqlite_path; + } + return _pth; + } + string cgi_filename() { + string _fn = ""; + if (_opt_action.cgi_sqlite_search_filename.length > 0) { + _fn = _opt_action.cgi_sqlite_search_filename; + } else if (_make_and_meta_struct.conf.w_srv_cgi_search_script.length > 0) { + _fn = _make_and_meta_struct.conf.w_srv_cgi_search_script; + } + return _fn; + } + string cgi_filename_d() { + string _fn = ""; + if (_opt_action.cgi_sqlite_search_filename_d.length > 0) { + _fn = _opt_action.cgi_sqlite_search_filename_d; + } else if (_make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d.length > 0) { + _fn = _make_and_meta_struct.conf.w_srv_cgi_search_script_raw_fn_d; + } + return _fn; + } + } + return SQLite_(); + } + auto output_path() { + return _make_and_meta_struct.conf.output_path; + } + auto srcs() { + struct SRC_ { + auto file_insert_list() { + return _header_body_insertfilelist_imagelist[headBody.insert_file_list]; + } + auto image_list() { + return _doc_has_struct.imagelist; + } + } + return SRC_(); + } + } + auto doc_matters = DocumentMatters(); + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("- step4 complete for [", _manifest.src.filename, "]"); + } + auto t = tuple(doc_abstraction, doc_matters); + return t; + } +} |