diff options
Diffstat (limited to 'src/sisudoc/ocda/meta/metadoc.d')
| -rw-r--r-- | src/sisudoc/ocda/meta/metadoc.d | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/src/sisudoc/ocda/meta/metadoc.d b/src/sisudoc/ocda/meta/metadoc.d new file mode 100644 index 0000000..421ff78 --- /dev/null +++ b/src/sisudoc/ocda/meta/metadoc.d @@ -0,0 +1,307 @@ +/+ +- 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 (continuously updated, current 2026) 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 std.digest.crc; + import std.digest.sha; + import sisudoc.meta; + import sisudoc.meta.metadoc_from_src; + import sisudoc.meta.conf_make_meta_structs; + import sisudoc.meta.conf_make_meta_json; + import sisudoc.meta.defaults; + import sisudoc.io_in.paths_source; + import sisudoc.io_in.read_config_files; + import sisudoc.io_in.read_source_files; + mixin spineBiblio; + enum makeMeta { make, meta } + enum docAbst { doc_abstract_obj, doc_has } + @system auto spineAbstraction(E,P,O,Cfg,M)( + E _env, + P program_info, + O _opt_action, + Cfg _cfg, + M _manifest, + ConfComposite _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); + auto doc_digests = _header_body_insertfilelist_imagelist.doc_digest; // CHECK, REVIEW, discard likely, other route taken + 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.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.header_raw, + _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.sourcefile_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 ST_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; + } + ConfComposite conf_make_meta() { + return _make_and_meta_struct; + } + auto doc_digest() { + return doc_digests; + } + 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.insert_file_list; + } + auto image_list() { + return _doc_has_struct.imagelist; + } + } + return SRC_(); + } + } + auto doc_matters = ST_DocumentMatters(); + if ((_opt_action.debug_do) + || (_opt_action.debug_do_stages) + ) { + writeln("- step4 complete for [", _manifest.src.filename, "]"); + } + auto theDOC() { + struct ST_DOC { + const auto abstraction() { + return doc_abstraction; + } + auto matters() { + return doc_matters; + } + } + return ST_DOC(); + } + auto the_doc = theDOC(); + return the_doc; + } +} |
