diff options
Diffstat (limited to 'org/out_metadata.org')
-rw-r--r-- | org/out_metadata.org | 486 |
1 files changed, 486 insertions, 0 deletions
diff --git a/org/out_metadata.org b/org/out_metadata.org new file mode 100644 index 0000000..f48d6ac --- /dev/null +++ b/org/out_metadata.org @@ -0,0 +1,486 @@ +-*- mode: org -*- +#+TITLE: spine (doc_manifest) metadata (document harvest) +#+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 - 2019 Ralph Amissah +#+LANGUAGE: en +#+STARTUP: indent content hideblocks hidestars +#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t +#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc +#+OPTIONS: author:nil email:nil creator:nil timestamp:nil +#+PROPERTY: header-args :padline no :exports code :cache no :noweb yes +#+EXPORT_SELECT_TAGS: export +#+EXPORT_EXCLUDE_TAGS: noexport +#+TAGS: assert(a) class(c) debug(d) mixin(m) spine(s) tangle(T) template(t) WEB(W) noexport(n) + +* document harvest _summary_ :module:spine:metadoc_show_summary: + +** _module template_ metadoc document metadata + +#+BEGIN_SRC d :tangle "../src/spine/io_out/metadata.d" +module spine.io_out.metadata; +template outputMetadata() { + void outputMetadata(T)( T doc_matters) @safe { + <<output_imports>> +<<harvested_html_themes>> +<<harvested_topics_html_head_1>> +<<harvested_html_head>> +<<harvested_topics_html_head_2>> +<<harvested_topics_html_head_theme>> + <<output_metadata_write>> + <<output_metadata>> + } +} +#+END_SRC + +** imports + +#+name: output_imports +#+BEGIN_SRC d +import std.file; +import std.format; +import spine.io_out; +mixin InternalMarkup; +string[] metadata_; +#+END_SRC + +** metadata + +#+name: output_metadata +#+BEGIN_SRC d +static auto mkup = InlineMarkup(); +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: ", 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_pod = spinePathsPods!()(doc_matters); +metadata_ ~= format(q"┃<body lang="en" xml:lang="en"> +<a name="top" id="top"></a> +<a name="up" id="up"></a> +<a name="start" id="start"></a> +┃"); +if (doc_matters.opt.action.harvest_link) { + metadata_ ~= format(q"┃<p>[<a href="../../index.html"> HOME </a>] Metadata Harvest + [<a href="../../authors.html"> Authors </a>] + [<a href="../../topics.html"> Topics </a>]</p> +<hr /> +┃"); +} else { + metadata_ ~= format(q"┃<p>[<a href="../../index.html"> HOME </a>] +<hr /> +┃"); +} +if (!(doc_matters.conf_make_meta.meta.title_full.empty)) { + metadata_ ~= "<p class=\"lev0\">Title: <b><a href=\"" ~ doc_matters.src.filename_base ~ "/toc.html\">" ~ doc_matters.conf_make_meta.meta.title_full ~ "</a></b></p>"; +} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.very_verbose) { + 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.harvest_link) { + metadata_ ~= "<p class=\"lev1\">Author: <b><a href=\"../../authors.html#" ~ doc_matters.conf_make_meta.meta.creator_author_surname.translate([' ' : "_"]) ~ "\">" + ~ doc_matters.conf_make_meta.meta.creator_author ~ "</a></b></p>"; + } else { + metadata_ ~= "<p class=\"lev1\">Author: <b>" + ~ doc_matters.conf_make_meta.meta.creator_author ~ "</b></p>"; + } +} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.very_verbose) { + writeln("ERROR no Author information provided in document header ", doc_matters.src.filename_base); +} +metadata_ ~= "<p class=\"lev1\">Published: " ~ doc_matters.conf_make_meta.meta.date_published ~ "</p>"; +if (!(doc_matters.conf_make_meta.meta.rights_copyright.empty)) { + metadata_ ~= "<p class=\"lev1\">Copyright: " ~ doc_matters.conf_make_meta.meta.rights_copyright ~ "</p>"; +} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.very_verbose) { + 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_ ~= "<p class=\"lev1\">License: " ~ doc_matters.conf_make_meta.meta.rights_license ~ "</p>"; +} else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.very_verbose) { + 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_ ~= "<hr /><p class=\"lev0\">Summary:</p><p class=\"lev1\">" ~ doc_matters.conf_make_meta.meta.notes_summary ~ "</p>"; +} else if (doc_matters.opt.action.debug_do) { + writeln("WARNING no summary of text provided in document header ", doc_matters.src.filename_base); +} +if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) { + metadata_ ~= "<hr /><p class=\"lev0\">Topics:</p>"; + 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.harvest_link) { + metadata_ ~= + "<p class=\"lev1\"><a href=\"../../topics.html#" + ~ subject_tree[0].translate([' ' : "_"]) ~ "\">" + ~ subject_tree[0] + ~ "</a></p>"; + } else { + metadata_ ~= + "<p class=\"lev1\">" ~ subject_tree[0] ~ "</p>"; + } + } + 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.harvest_link) { + metadata_ ~= + "<p class=\"lev2\"><a href=\"../../topics.html#" + ~ subject_tree[0].translate([' ' : "_"]) ~ "." + ~ subject_tree[1].translate([' ' : "_"]) ~ "\">" + ~ subject_tree[1] + ~ "</a></p>"; + } else { + metadata_ ~= + "<p class=\"lev2\">" ~ subject_tree[1] ~ "</p>"; + } + } + 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.harvest_link) { + metadata_ ~= + "<p class=\"lev3\"><a href=\"../../topics.html#" + ~ subject_tree[0].translate([' ' : "_"]) ~ "." + ~ subject_tree[1].translate([' ' : "_"]) ~ "." + ~ subject_tree[2].translate([' ' : "_"]) ~ "\">" + ~ subject_tree[2] + ~ "</a></p>"; + } else { + metadata_ ~= + "<p class=\"lev3\">" ~ subject_tree[2] ~ "</p>"; + } + } + if (subject_tree.length > 3) { + if (subject_tree[3] != _top[3]) { + _top[3] = subject_tree[3]; + _top[4] = ""; + if (doc_matters.opt.action.harvest_link) { + metadata_ ~= + "<p class=\"lev4\"><a href=\"../../topics.html#" + ~ subject_tree[0].translate([' ' : "_"]) ~ "." + ~ subject_tree[1].translate([' ' : "_"]) ~ "." + ~ subject_tree[2].translate([' ' : "_"]) ~ "." + ~ subject_tree[3].translate([' ' : "_"]) ~ "\">" + ~ subject_tree[3] + ~ "</a></p>"; + } else { + metadata_ ~= + "<p class=\"lev4\">" ~ subject_tree[3] ~ "</p>"; + } + } + if (subject_tree.length > 4) { + if (subject_tree[4] != _top[4]) { + _top[4] = subject_tree[4]; + if (doc_matters.opt.action.harvest_link) { + metadata_ ~= + "<p class=\"lev5\"><a href=\"../../topics.html#" + ~ subject_tree[0].translate([' ' : "_"]) ~ "." + ~ subject_tree[1].translate([' ' : "_"]) ~ "." + ~ subject_tree[2].translate([' ' : "_"]) ~ "." + ~ subject_tree[3].translate([' ' : "_"]) ~ "." + ~ subject_tree[4].translate([' ' : "_"]) ~ "\">" + ~ subject_tree[4] + ~ "</a></p>"; + } else { + metadata_ ~= + "<p class=\"lev5\">" ~ subject_tree[4] ~ "</p>"; + } + } + } + } + } + } + } + } +} 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_ ~= "<hr /><p class=\"lev1\">source: " ~ doc_matters.src.filename_base ~ "</p>"; +metadata_ ~= "<p class=\"lev1\">markup source: [<a href=\"../../" ~ pth_pod.internal_base ~ "/" ~ doc_matters.src.filename_base ~ ".zip\">" + ~ " zipped pod </a>] " + ~ "[<a href=\"../../" ~ pth_pod.internal_base ~ "/" ~ doc_matters.src.filename_base ~ "/\">" + ~ " pod tree </a>]</p>"; +metadata_ ~= "<p class=\"lev1\">outputs: [<a href=\"" ~ doc_matters.src.filename_base ~ ".html\">" + ~ " html scroll </a>] " + ~ "[<a href=\"" ~ doc_matters.src.filename_base ~ "/toc.html\">" + ~ " html seg </a>]" + ~ "[<a href=\"../../" ~ pth_epub.internal_base ~ "/" ~ doc_matters.src.filename_base ~ "." ~ doc_matters.src.language ~ ".epub\">" + ~ " epub </a>]</p>"; +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, string[] metadata_) @trusted { + 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.writeln(o); + } + } catch (ErrnoException ex) { + // Handle error + } + if (!(doc_matters.opt.action.quiet)) { + writeln(" ", pth_html.fn_scroll("metadata." ~ doc_matters.src.filename)); + } +} +#+END_SRC + +*** themes +**** head + +#+NAME: harvested_html_themes +#+BEGIN_SRC d +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; + } +┃"); +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; + } +┃"); +#+END_SRC + +**** levels + +#+NAME: harvested_html_themes +#+BEGIN_SRC d +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 : #000088; + } + p.letter { + color : #FFFFFF; + background : #880000; + } +┃"); +#+END_SRC + +*** harvested topics html head + +#+NAME: harvested_topics_html_head_1 +#+BEGIN_SRC d + metadata_ ~= format(q"┃<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>Metadata Harvest - Topics</title> +#+END_SRC + +#+NAME: harvested_topics_html_head_2 +#+BEGIN_SRC d +</head> +#+END_SRC + +*** harvested html head + +#+NAME: harvested_html_head +#+BEGIN_SRC d +<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +<meta name="dc.title" content= "metadata harvest, Authors & Topics - information Structuring Universe, Structured information Serialised Units" /> +<meta name="dc.subject" content= "document structuring, ebook, publishing, PDF, LaTeX, XML, ODF, SQL, postgresql, sqlite, electronic book, electronic publishing, electronic document, electronic citation, data structure, citation systems, granular search, digital library" /> +<meta name="generator" content="spine" /> +<link rel="generator" href="http://sisudoc.org" /> +<link href="./css/harvest.css" rel="stylesheet"> +<style TYPE="text/css"> +/* spine harvest css default stylesheet */%s + .norm, .bold { + line-height : 150%%; + margin-left : 1em; + margin-right : 2em; + margin-top : 10px; + margin-bottom : 0px; + text-indent : 0mm; + } + p, h0, h1, h2, h3, h4, h5, h6, h7 { + display : block; + font-family : verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman; + font-size : 100%%; + font-weight : normal; + line-height : 150%%; + /* text-align : justify; */ + margin-left : 1em; + text-indent : 0mm; + margin-top : 2px; + margin-bottom : 2px; + margin-right : 6px; + text-align : left; + } + h0, h1, h2, h3, h4, h5, h6, h7 { text-shadow: .2em .2em .3em #999999; } + h1 { + font-size : 120%%; + font-weight : bold; + color : #FFFFFF; + background : #000088; + margin-left : 0em; + } + p.work { + font-size : 80%%; + margin-left : 5em; + margin-top : 0px; + margin-bottom : 0px; + margin-right : 6px; + text-align : left; + } + p.author { + font-size : 100%%; + margin-left : 2em; + margin-top : 0px; + margin-bottom : 0px; + margin-right : 6px; + text-align : left; + } + p.publication { + font-size : 80%%; + margin-left : 4em; + margin-top : 0px; + margin-bottom : 0px; + margin-right : 6px; + text-align : left; + } + p.letter { + font-weight : bold; + font-size : 60%%; + margin-left : 1em; + margin-top : 0px; + margin-bottom : 0px; + margin-right : 6px; + text-align : left; + } + p.lev0 { + font-size : 120%%; + margin-left : 1em; + } + p.lev1 { + font-size : 110%%; + margin-left : 2em; + } + p.lev2 { + font-size : 100%%; + margin-left : 3em; + } + p.lev3 { + font-size : 90%%; + margin-left : 4em; + } + p.lev4 { + font-size : 80%%; + margin-left : 5em; + } + p.lev5 { + font-size : 80%%; + margin-left : 6em; + }%s +</style> +<link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> +#+END_SRC + +*** harvested html bottom + +#+NAME: harvested_html_bottom +#+BEGIN_SRC d + ~= format(q"┃ +<hr /> +<a name="bottom" id="bottom"></a> +<a name="down" id="down"></a> +<a name="end" id="end"></a> +<a name="finish" id="finish"></a> +<a name="stop" id="stop"></a> +<a name="credits"></a> +</body> +</html> +┃") ~ "\n"; +#+END_SRC + +*** harvested topics html head theme insert + +#+NAME: harvested_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 |