-*- mode: org -*- #+TITLE: sisudoc spine (doc_reform) metadata (document curate) #+DESCRIPTION: documents - structuring, publishing in multiple formats & search #+FILETAGS: :spine:output:metadata: #+AUTHOR: Ralph Amissah #+EMAIL: [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]] #+COPYRIGHT: Copyright (C) 2015 - 2024 Ralph Amissah #+LANGUAGE: en #+STARTUP: content hideblocks hidestars noindent entitiespretty #+PROPERTY: header-args :exports code #+PROPERTY: header-args+ :noweb yes #+PROPERTY: header-args+ :results no #+PROPERTY: header-args+ :cache no #+PROPERTY: header-args+ :padline no #+PROPERTY: header-args+ :mkdirp yes #+OPTIONS: H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t - [[./doc-reform.org][doc-reform.org]] [[./][org/]] * document curate _summary_ :module:spine:metadoc_show_summary: ** _module template_ metadoc document metadata #+HEADER: :tangle "../src/sisudoc/io_out/metadata.d" #+HEADER: :noweb yes #+BEGIN_SRC d <> module sisudoc.io_out.metadata; @safe: template outputMetadata() { void outputMetadata(T)( T doc_matters) { <> <> <> <> <> <> <> <> <> <> } } #+END_SRC ** imports #+NAME: output_imports #+BEGIN_SRC d import std.digest.crc, std.digest.sha, std.file, std.format; import sisudoc.io_out; mixin InternalMarkup; char[] metadata_; #+END_SRC ** metadata #+NAME: output_metadata #+BEGIN_SRC d static auto mkup = InlineMarkup(); import sisudoc.io_out.html_snippet; mixin htmlSnippet; if (doc_matters.opt.action.debug_do) { writeln(doc_matters.src.filename_base); writeln("Title: ", doc_matters.conf_make_meta.meta.title_full); writeln(" Author: ", doc_matters.conf_make_meta.meta.creator_author); writeln(" Published: ", doc_matters.conf_make_meta.meta.date_published); writeln(" Copyright: ", doc_matters.conf_make_meta.meta.rights_copyright); writeln(" License: ", special_characters_text(doc_matters.conf_make_meta.meta.rights_license)); if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) { 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) { writeln(" ", subject_tree[0]); } if (subject_tree.length > 1) { writeln(" ", subject_tree[1]); } if (subject_tree.length > 2) { writeln(" ", subject_tree[2]); } if (subject_tree.length > 3) { writeln(" ", subject_tree[3]); } if (subject_tree.length > 4) { writeln(" ", subject_tree[4]); } } } } auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language); auto pth_epub = spinePathsEPUB!()(doc_matters.output_path, doc_matters.src.language); auto pth_pdf = spinePathsPDF!()(doc_matters); auto pth_pod = spinePathsPods!()(doc_matters); metadata_ ~= format(q"┃ ┃"); metadata_ ~= "
"; if (doc_matters.opt.action.html_link_curate) { metadata_ ~= format(q"┃

[  HOME  |  ≅ Collection ]  [  🖋 Authors  |  ⌘ Topics ]

┃", (doc_matters.opt.action.webserver_url_doc_root.length > 0) ? doc_matters.opt.action.webserver_url_doc_root : doc_matters.conf_make_meta.conf.w_srv_data_root_url , // HOME index.html equivalent _cfg.www_url_doc_root, ); } else { metadata_ ~= format(q"┃

[ ≅ HOME   ≅ Collection ] ┃"); } metadata_ ~= "

" ~ inline_search_form(doc_matters) ~ "

"; if (!(doc_matters.conf_make_meta.meta.title_full.empty)) { metadata_ ~= "

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_ ~= "

source: " ~ doc_matters.src.filename_base ~ "

"; if (doc_matters.opt.action.html_link_markup_source) { metadata_ ~= "

●  markup source:  the pod [" ~ " 🫛 zipped | " ~ "" ~ " 🫛 tree ] "; } 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_ ~= "

"; metadata_ ~= "

Digests:

"; metadata_ ~= "

" ~ doc_matters.doc_digest.markup_doc.toHexString ~ " - src doc digest" ~ "

" ~ "

" ~ doc_matters.doc_digest.header.toHexString ~ " - doc header" ~ "

" ~ "

" ~ doc_matters.doc_digest.text.toHexString ~ " - doc text" ~ "

"; 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_ ~= "

" ~ subject_tree[0] ~ "

"; } 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_ ~= "

" ~ subject_tree[1] ~ "

"; } 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_ ~= "

" ~ subject_tree[2] ~ "

"; } 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_ ~= "

" ~ subject_tree[3] ~ "

"; } 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_ ~= "

" ~ subject_tree[4] ~ "

"; } 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_); #+END_SRC ** metadata write output #+NAME: output_metadata_write #+BEGIN_SRC d void metadata_write_output(M)(M doc_matters, char[] metadata_) { auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language); try { if (!exists(pth_html.base)) { pth_html.base.mkdirRecurse; } { auto f = File(pth_html.fn_scroll("metadata." ~ doc_matters.src.filename), "w"); foreach (o; metadata_) { f.write(o); } } if (!exists(pth_html.base ~ "/index.html")) { import sisudoc.io_out.html_snippet; mixin htmlSnippet; auto f = File(pth_html.base ~"/index.html", "w"); f.writeln(format_html_blank_page_guide_home( "../../css/html_scroll.css", (doc_matters.opt.action.webserver_url_doc_root.length > 0) ? doc_matters.opt.action.webserver_url_doc_root : doc_matters.conf_make_meta.conf.w_srv_data_root_url, "../../index.html", )); } } catch (ErrnoException ex) { // Handle error } if (doc_matters.opt.action.vox_gt0) { writeln(" ", pth_html.fn_scroll("metadata." ~ doc_matters.src.filename)); } } #+END_SRC *** themes **** head #+NAME: curated_html_themes_0 #+BEGIN_SRC css 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; } ┃"); #+END_SRC **** levels #+NAME: curated_html_themes_1 #+BEGIN_SRC css 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; } ┃"); #+END_SRC *** curated topics html head #+NAME: curated_topics_html_head_1 #+BEGIN_SRC d metadata_ ~= format(q"┃ ⌘ Curated metadata - Topics #+END_SRC #+NAME: curated_topics_html_head_2 #+BEGIN_SRC d #+END_SRC *** curated html head #+NAME: curated_html_head #+BEGIN_SRC d #+END_SRC *** curated html bottom #+NAME: curated_html_bottom #+BEGIN_SRC d ~= format(q"┃
┃") ~ "\n"; #+END_SRC *** curated topics html head theme insert #+NAME: curated_topics_html_head_theme #+BEGIN_SRC d ┃", doc_matters.opt.action.css_theme_default ? theme_light_0 : theme_dark_0, doc_matters.opt.action.css_theme_default ? theme_light_1 : theme_dark_1, ) ~ "\n"; #+END_SRC *** search form #+NAME: curated_html_search #+BEGIN_SRC d string inline_search_form(M)( M doc_matters, ) { string o; string _form; if (doc_matters.opt.action.html_link_search) { o = format(q"┃
  %s  %s
┃", 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; } #+END_SRC * document header including copyright & license #+NAME: doc_header_including_copyright_and_license #+HEADER: :noweb yes #+BEGIN_SRC emacs-lisp <<./sisudoc_spine_version_info_and_doc_header_including_copyright_and_license.org:spine_doc_header_including_copyright_and_license()>> #+END_SRC * __END__