aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sisudoc/meta/metadoc.d
diff options
context:
space:
mode:
Diffstat (limited to 'src/sisudoc/meta/metadoc.d')
-rw-r--r--src/sisudoc/meta/metadoc.d296
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;
+ }
+}