/+ - 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.io_out.metadata; // @safe: template outputMetadata() { void outputMetadata(T)(T doc_matters) { string inline_search_form(M)( M doc_matters, ) { string o; string _form; if (doc_matters.opt.action.html_link_search) { o = format(q"┃
┃", doc_matters.conf_make_meta.conf.w_srv_cgi_action, (doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename.empty) ? "" : "\n 🔎 ", (doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename.empty) ? "" : "\n ", doc_matters.src.filename_base, doc_matters.conf_make_meta.conf.w_srv_cgi_action, (doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename.empty) ? "" : "\n ", doc_matters.src.filename_base, ); } else { o = ""; } return o; } import std.digest.crc, std.digest.sha, std.file, std.format; import sisudoc.io_out; mixin InternalMarkup; char[] metadata_; string theme_dark_0 = format(q"┃ body { color : #CCCCCC; background : #000000; background-color : #000000; } a:link { color : #FFFFFF; text-decoration : none; } a:visited { color : #999999; text-decoration : none; } a:hover { color : #000000; background-color : #555555; } a:hover img { background-color : #000000; } a:active { color : #888888; text-decoration : underline; } a.lnkicon:link { text-decoration : none; } a.lnkicon:visited { text-decoration : none; } a.lnkicon:hover { font-size : 160%%; } a:hover img { background-color : #FFFFFF; } input { color : #FFFFFF; background-color : #777777; } ┃"); string theme_light_0 = format(q"┃ body { color : #000000; background : #FFFFFF; background-color : #FFFFFF; } a:link { color : #003399; text-decoration : none; } a:visited { color : #003399; text-decoration : none; } a:hover { color : #000000; background-color : #f9f9aa; } a:hover img { background-color : #FFFFFF; } a:active { color : #003399; text-decoration : underline; } a.lnkicon:link { text-decoration : none; } a.lnkicon:visited { text-decoration : none; } a.lnkicon:hover { font-size : 160%%; } a:hover img { background-color : #FFFFFF; } input { color : #000000; background-color : #FFFFFF; } ┃"); string theme_dark_1 = format(q"┃ h1 { color : #FFFFFF; background : #000000; } p.letter { color : #FFFFFF; background : #333333; } ┃"); string theme_light_1 = format(q"┃ h1 { color : #FFFFFF; background : #1A3A7A; } p.letter { color : #FFFFFF; background : #1A3A7A; } ┃"); metadata_ ~= format(q"┃Title: " ~ doc_matters.conf_make_meta.meta.title_full ~ "
"; } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) { writeln("ERROR no Title information provided in document header ", doc_matters.src.filename_base); } if (!(doc_matters.conf_make_meta.meta.creator_author.empty)) { if (doc_matters.opt.action.html_link_curate) { metadata_ ~= "Author: " ~ doc_matters.conf_make_meta.meta.creator_author ~ "
"; } else { metadata_ ~= "Author: " ~ doc_matters.conf_make_meta.meta.creator_author ~ "
"; } } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) { writeln("ERROR no Author information provided in document header ", doc_matters.src.filename_base); } metadata_ ~= "Published: " ~ doc_matters.conf_make_meta.meta.date_published ~ "
"; if (!(doc_matters.conf_make_meta.meta.rights_copyright.empty)) { metadata_ ~= "Copyright: " ~ special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright) ~ "
"; } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) { writeln("WARNING no Copyright information provided in document header ", doc_matters.src.filename_base); } if (!(doc_matters.conf_make_meta.meta.rights_license.empty)) { metadata_ ~= "License: " ~ special_characters_text(doc_matters.conf_make_meta.meta.rights_license) ~ "
"; } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) { writeln("WARNING no License information provided in document header ", doc_matters.src.filename_base); } if (!(doc_matters.conf_make_meta.meta.notes_summary.empty)) { metadata_ ~= "Summary:
" ~ special_characters_text(doc_matters.conf_make_meta.meta.notes_summary) ~ "
"; } else if (doc_matters.opt.action.debug_do) { writeln("WARNING no summary of text provided in document header ", doc_matters.src.filename_base); } metadata_ ~= "● outputs: [ html: " ~ " ▤ scroll " ~ "|" ~ " ※ seg ] " ~ "[" ~ " ◆ epub ] "; if ((doc_matters.opt.action.html_link_pdf) || (doc_matters.opt.action.html_link_pdf_a4)) { metadata_ ~= "[ pdf: " ~ " □ a4  " ~ "|" ~ " □ U.S. letter ] "; } else if (doc_matters.opt.action.html_link_pdf_a4) { metadata_ ~= "[" ~ " □ pdf (a4) ] "; } else if (doc_matters.opt.action.html_link_pdf_letter) { metadata_ ~= "[" ~ " □ pdf (U.S. letter) ] "; } metadata_ ~= "
"; if (doc_matters.opt.action.html_link_markup_source) { metadata_ ~= "source: " ~ doc_matters.src.filename_base ~ "
"; metadata_ ~= "● markup source: the pod [" ~ " 🫛 zipped | " ~ "" ~ " 🫛 tree ] "; metadata_ ~= "
● source digests:" ~ " [ " ~ " # digests ]
"; auto pths_pod = spinePathsPods!()(doc_matters); auto fn_pod = pths_pod.pod_filename(doc_matters.src.filename).zpod; if (doc_matters.opt.action.pod) { try { // get sha digest for pod metadata_ ~= ""; auto data = (cast(byte[]) (fn_pod).read); // prevents code from being safe metadata_ ~= "" ~ data.sha256Of.toHexString ~ "::" ~ data.length.to!string ~ " - " ~ doc_matters.src.filename_base ~ ".zip"; metadata_ ~= "
"; } catch (Exception ex) { writeln("WARNING, source doc_matters.src.filename_base not found: ", doc_matters.src.filename_base, ".zip\n ", fn_pod); } } } metadata_ ~= "" ~ doc_matters.doc_digest.markup_doc.toHexString ~ " - " ~ doc_matters.src.filename ~ "
"; if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) { metadata_ ~= "Topics:
"; string[] _top = ["", "", "", "", ""]; foreach (topic; doc_matters.conf_make_meta.meta.classify_topic_register_arr.sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable)) { string[] subject_tree = topic.split(mkup.sep); if (subject_tree.length > 0) { if (subject_tree[0] != _top[0]) { _top[0] = subject_tree[0]; if (doc_matters.opt.action.html_link_curate) { metadata_ ~= ""; } else { metadata_ ~= "" ~ subject_tree[0] ~ "
"; } } if (subject_tree.length > 1) { if (subject_tree[1] != _top[1]) { _top[1] = subject_tree[1]; _top[2] = ""; _top[3] = ""; _top[4] = ""; if (doc_matters.opt.action.html_link_curate) { metadata_ ~= ""; } else { metadata_ ~= "" ~ subject_tree[1] ~ "
"; } } if (subject_tree.length > 2) { if (subject_tree[2] != _top[2]) { _top[2] = subject_tree[2]; _top[3] = ""; _top[4] = ""; if (doc_matters.opt.action.html_link_curate) { metadata_ ~= ""; } else { metadata_ ~= "" ~ subject_tree[2] ~ "
"; } } if (subject_tree.length > 3) { if (subject_tree[3] != _top[3]) { _top[3] = subject_tree[3]; _top[4] = ""; if (doc_matters.opt.action.html_link_curate) { metadata_ ~= ""; } else { metadata_ ~= "" ~ subject_tree[3] ~ "
"; } } if (subject_tree.length > 4) { if (subject_tree[4] != _top[4]) { _top[4] = subject_tree[4]; if (doc_matters.opt.action.html_link_curate) { metadata_ ~= ""; } else { metadata_ ~= "" ~ subject_tree[4] ~ "
"; } } } } } } } } } else if (doc_matters.opt.action.debug_do) { writeln("WARNING no topic_register classification of text provided in document header ", doc_matters.src.filename_base); } metadata_write_output(doc_matters, metadata_); } }