From 0c4b3cb3707c3b16cd171620427e651d71182813 Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Fri, 13 Dec 2019 09:09:24 -0500 Subject: present per document metadata --- org/default_misc.org | 3 +- org/default_paths.org | 42 ++- org/meta_conf_make_meta.org | 7 + org/out_harvest_metadata.org | 34 +- org/out_metadata.org | 486 +++++++++++++++++++++++++ org/out_xmls.org | 6 +- org/output_hub.org | 11 + src/doc_reform/io_in/paths_source.d | 21 +- src/doc_reform/io_out/hub.d | 6 + src/doc_reform/io_out/metadata.d | 385 ++++++++++++++++++++ src/doc_reform/io_out/paths_output.d | 21 ++ src/doc_reform/io_out/xmls.d | 6 +- src/doc_reform/meta/conf_make_meta_structs.d | 1 + src/doc_reform/meta/conf_make_meta_yaml.d | 6 + src/doc_reform/meta/defaults.d | 3 +- src/doc_reform/meta/metadoc_harvest.d | 1 + src/doc_reform/meta/metadoc_harvests_authors.d | 13 +- src/doc_reform/meta/metadoc_harvests_topics.d | 20 +- 18 files changed, 1014 insertions(+), 58 deletions(-) create mode 100644 org/out_metadata.org create mode 100644 src/doc_reform/io_out/metadata.d diff --git a/org/default_misc.org b/org/default_misc.org index b38a7b2..cc4083e 100644 --- a/org/default_misc.org +++ b/org/default_misc.org @@ -149,8 +149,9 @@ template spineHarvest() { string uid = ""; string date_published = ""; string[] topic_register_arr = []; - string path_html_segtoc = ""; + string path_html_metadata = ""; string path_html_scroll = ""; + string path_html_segtoc = ""; string path_epub = ""; string path_abs_html_segtoc = ""; string path_abs_html_scroll = ""; diff --git a/org/default_paths.org b/org/default_paths.org index 1e09455..f458887 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -708,20 +708,19 @@ template spinePathsPods() { string _base_dir_doc = "dr_doc"; struct _PodPaths { string base_filename_(string fn_src) { - auto pth = fn_src.baseName.stripExtension; - return pth; + return fn_src.baseName.stripExtension; + } + string internal_base() { + return "pod"; } string pod_dir_() { - auto pth = _base_dir_pod; - return pth; + return _base_dir_pod; } string dr_doc_dir_() { - auto pth = _base_dir_doc; - return pth; + return _base_dir_doc; } string pod_filename_(string fn_src) { - string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array; - return pth; + return _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array; } string base_filesystem_(string fn_src) { string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; @@ -730,12 +729,10 @@ template spinePathsPods() { return pth; } string output_pod_manifest_file(string fn_src) { - string pth = base_filesystem_(fn_src).chainPath("pod.manifest").array; - return pth; + return base_filesystem_(fn_src).chainPath("pod.manifest").array; } string base_pod_(string fn_src) { - string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this - return pth; + return _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this } auto base_filename(string fn_src) { auto pth_1_ = base_filename_(fn_src); @@ -1008,6 +1005,9 @@ template spineOutPaths() { string output_base() { return ((output_root.chainPath(lng)).asNormalizedPath).array; } + string internal_base() { + return lng.asNormalizedPath.array; + } } return _PathsStruct(); } @@ -1116,6 +1116,9 @@ template spineDocRootTreeHTML() { string seg(string fn_src) { return ((base.chainPath(base_filename_seg(fn_src))).asNormalizedPath).array; } + string fn_metadata(string fn_src) { + return ((base.chainPath("metadata." ~ base_filename_scroll(fn_src) ~ suffix)).asNormalizedPath).array; + } string fn_scroll(string fn_src) { return ((base.chainPath(base_filename_scroll(fn_src) ~ suffix)).asNormalizedPath).array; } @@ -1158,6 +1161,9 @@ template spinePathsHTML() { string harvest(string fn_harvest) { return doc_root ~ "/" ~ fn_harvest; } + string internal_base() { + return ((doc_tree.base).asNormalizedPath).array; + } string base() { return ((output_path_root.chainPath(doc_tree.base)).asNormalizedPath).array; } @@ -1176,6 +1182,9 @@ template spinePathsHTML() { string seg(string fn_src) { return ((output_path_root.chainPath(doc_tree.seg(fn_src))).asNormalizedPath).array; } + string fn_metadata(string fn_src) { + return ((output_path_root.chainPath(doc_tree.fn_metadata(fn_src))).asNormalizedPath).array; + } string fn_scroll(string fn_src) { return ((output_path_root.chainPath(doc_tree.fn_scroll(fn_src))).asNormalizedPath).array; } @@ -1258,6 +1267,12 @@ template spineUrlsHTML() { ((doc_tree.seg(fn_src)).asNormalizedPath).array, ); } + string fn_metadata(string fn_src) { + return format(q"┃%s/%s┃", + url_doc_root, + ((doc_tree.fn_metadata(fn_src)).asNormalizedPath).array, + ); + } string fn_scroll(string fn_src) { return format(q"┃%s/%s┃", url_doc_root, @@ -1313,6 +1328,9 @@ template spinePathsEPUB() { auto out_pth = spineOutPaths!()(output_pth_root, lng); string base_dir = "epub"; struct _PathsStruct { + string internal_base() { + return (((out_pth.internal_base).chainPath(base_dir)).asNormalizedPath).array; + } string base() { return (((out_pth.output_base).chainPath(base_dir)).asNormalizedPath).array; } diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org index 7075995..4b270e0 100644 --- a/org/meta_conf_make_meta.org +++ b/org/meta_conf_make_meta.org @@ -286,6 +286,7 @@ struct MetaComposite { string links; string notes_abstract; string notes_description; + string notes_summary; string original_language; string original_language_char; string original_publisher; @@ -1041,6 +1042,12 @@ if ("notes" in _yaml ) { _struct_composite.meta.notes_description = _yaml["notes"]["description"].get!string; } + if ("summary" in _yaml["notes"] + && _yaml["notes"]["summary"].type.string + && _yaml["notes"]["summary"].tag.match(rgx.yaml_tag_is_str) + ) { + _struct_composite.meta.notes_summary = _yaml["notes"]["summary"].get!string; + } } } if ("original" in _yaml diff --git a/org/out_harvest_metadata.org b/org/out_harvest_metadata.org index ebea75a..9c954a0 100644 --- a/org/out_harvest_metadata.org +++ b/org/out_harvest_metadata.org @@ -100,6 +100,7 @@ hvst.harvest.language = doc_matters.src.language; hvst.harvest.uid = doc_matters.src.doc_uid; hvst.harvest.date_published = doc_matters.conf_make_meta.meta.date_published; hvst.harvest.topic_register_arr = doc_matters.conf_make_meta.meta.classify_topic_register_arr; +hvst.harvest.path_html_metadata = pth_html_rel.fn_metadata(doc_matters.src.filename); hvst.harvest.path_html_scroll = pth_html_rel.fn_scroll(doc_matters.src.filename); hvst.harvest.path_html_segtoc = pth_html_rel.fn_seg(doc_matters.src.filename, "toc"); hvst.harvest.path_abs_html_scroll = pth_html_abs.fn_scroll(doc_matters.src.filename); @@ -217,12 +218,10 @@ foreach(k, doc_harvest; hvst.harvests) {

Metadata Harvest - Topics (output organised by language & filetype)

-

[ HOME ] also see Metadata Harvest - Authors

+

[ HOME ] [ Metadata Harvest - Authors ]

ABCDEFGHIJKLMNOPQRSTUVWXYZ


-

English   

-
#+END_SRC *** harvested topics html head theme insert @@ -277,10 +276,12 @@ foreach(k0; ); } } - topics ~= format(q"┃

"%s" -%s┃", + topics ~= format(q"┃

"%s" - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln("- ", t_a_.title, " - ", t_a_.author); @@ -317,10 +318,12 @@ foreach(k0; ); } } - topics ~= format(q"┃

%s -%s┃", + topics ~= format(q"┃

%s - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln(" - ", t_a_.title, " - ", t_a_.author); @@ -358,10 +361,12 @@ foreach(k0; ); } } - topics ~= format(q"┃

%s -%s┃", + topics ~= format(q"┃

%s - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln(" - ", t_a_.title, " - ", t_a_.author); @@ -399,10 +404,12 @@ foreach(k0; ); } } - topics ~= format(q"┃

%s -%s┃", + topics ~= format(q"┃

%s - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln(" - ", t_a_.title, " - ", t_a_.author); @@ -494,11 +501,9 @@ template spineMetaDocHarvestsAuthors() {

Metadata Harvest - Authors (output organised by language & filetype)

-

[ HOME ] also see Metadata Harvest - Topics

+

[ HOME ] [ Metadata Harvest - Topics ]


-

English   

-

ABCDEFGHIJKLMNOPQRSTUVWXYZ,  #+END_SRC @@ -526,31 +531,34 @@ template spineMetaDocHarvestsAuthors() { ) { if (doc_harvest.author_surname_fn != _prev_auth) { _au[doc_harvest.author_surname_fn] - = format(q"┃

%s

%s "%s" [%s]

┃", + = format(q"┃

%s

%s "%s" [ %s ]

┃", doc_harvest.author_surname.translate([' ' : "_"]), doc_harvest.author_surname_fn, (doc_harvest.date_published.length > 0) ? doc_harvest.date_published : "", doc_harvest.path_html_segtoc, doc_harvest.title, + doc_harvest.path_html_metadata, doc_harvest.language, ); _prev_auth = doc_harvest.author_surname_fn; } else { _au[doc_harvest.author_surname_fn] - ~= format(q"┃

%s "%s" [%s]

┃", + ~= format(q"┃

%s "%s" [ %s ]

┃", (doc_harvest.date_published.length > 0) ? doc_harvest.date_published : "", doc_harvest.path_html_segtoc, doc_harvest.title, + doc_harvest.path_html_metadata, doc_harvest.language, ); } - _author_date_title ~= format(q"┃%s %s "%s" [%s]%s┃", + _author_date_title ~= format(q"┃%s %s "%s" [ %s ]%s┃", doc_harvest.author_surname_fn, (doc_harvest.date_published.length > 0) ? "(" ~ doc_harvest.date_published ~ ")" : "", doc_harvest.title, + doc_harvest.path_html_metadata, doc_harvest.language, (_opt_action.very_verbose) ? "\n " ~ doc_harvest.path_abs_html_scroll : "", ); 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 { + <> +<> +<> +<> +<> +<> + <> + <> + } +} +#+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"┃ + + + +┃"); +if (doc_matters.opt.action.harvest_link) { + metadata_ ~= format(q"┃

[ HOME ] Metadata Harvest + [ Authors ] + [ Topics ]

+
+┃"); +} else { + metadata_ ~= format(q"┃

[ HOME ] +


+┃"); +} +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.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_ ~= "

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.very_verbose) { + 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: " ~ doc_matters.conf_make_meta.meta.rights_copyright ~ "

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

License: " ~ doc_matters.conf_make_meta.meta.rights_license ~ "

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

Summary:

" ~ 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); +} +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.harvest_link) { + 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.harvest_link) { + 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.harvest_link) { + 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.harvest_link) { + 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.harvest_link) { + 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_ ~= "

source: " ~ doc_matters.src.filename_base ~ "

"; +metadata_ ~= "

markup source: [" + ~ " zipped pod ] " + ~ "[" + ~ " pod tree ]

"; +metadata_ ~= "

outputs: [" + ~ " html scroll ] " + ~ "[" + ~ " html seg ]" + ~ "[" + ~ " epub ]

"; +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"┃ + + + +Metadata Harvest - Topics +#+END_SRC + +#+NAME: harvested_topics_html_head_2 +#+BEGIN_SRC d + +#+END_SRC + +*** harvested html head + +#+NAME: harvested_html_head +#+BEGIN_SRC d + + + + + + + + +#+END_SRC + +*** harvested html bottom + +#+NAME: harvested_html_bottom +#+BEGIN_SRC d + ~= format(q"┃ +
+ + + + + + + + +┃") ~ "\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 diff --git a/org/out_xmls.org b/org/out_xmls.org index 52a0ac1..8821cca 100644 --- a/org/out_xmls.org +++ b/org/out_xmls.org @@ -169,7 +169,7 @@ string header_metadata(M)( ) @safe { string _publisher="Publisher"; // TODO string o; - o = format(q"┃ + o = format(q"┃ @@ -184,7 +184,7 @@ string header_metadata(M)( -┃", +┃", doc_matters.conf_make_meta.meta.title_full, doc_matters.conf_make_meta.meta.creator_author, _publisher, @@ -757,7 +757,7 @@ auto nav_pre_next_svg(O,M)( ) @safe { string prev, next, toc; string harvest_link = (doc_matters.opt.action.harvest_link) - ? format(q"┃

[ T | A ]

┃") + ? format(q"┃

[ m | A | T ]

┃", doc_matters.src.filename_base) : ""; if (obj.tags.segment_anchor_tag_epub == "toc") { toc = ""; diff --git a/org/output_hub.org b/org/output_hub.org index 90464a3..aad6240 100644 --- a/org/output_hub.org +++ b/org/output_hub.org @@ -69,6 +69,7 @@ template outputHubOp() { #+name: output_imports #+BEGIN_SRC d import doc_reform.io_out, + doc_reform.io_out.metadata, doc_reform.io_out.xmls, doc_reform.io_out.odt, doc_reform.io_out.create_zip_file, @@ -113,6 +114,16 @@ if (sched == outTask.epub) { #+END_SRC **** html :html: +***** metadata :metadata: + +#+name: output_scheduled_task +#+BEGIN_SRC d +if (sched == outTask.html_stuff) { + outputMetadata!()(doc_matters); + msg.vv("html metadata done"); +} +#+END_SRC + ***** scroll :scroll: #+name: output_scheduled_task diff --git a/src/doc_reform/io_in/paths_source.d b/src/doc_reform/io_in/paths_source.d index a460f7b..3896751 100644 --- a/src/doc_reform/io_in/paths_source.d +++ b/src/doc_reform/io_in/paths_source.d @@ -592,20 +592,19 @@ template spinePathsPods() { string _base_dir_doc = "dr_doc"; struct _PodPaths { string base_filename_(string fn_src) { - auto pth = fn_src.baseName.stripExtension; - return pth; + return fn_src.baseName.stripExtension; + } + string internal_base() { + return "pod"; } string pod_dir_() { - auto pth = _base_dir_pod; - return pth; + return _base_dir_pod; } string dr_doc_dir_() { - auto pth = _base_dir_doc; - return pth; + return _base_dir_doc; } string pod_filename_(string fn_src) { - string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array; - return pth; + return _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array; } string base_filesystem_(string fn_src) { string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; @@ -614,12 +613,10 @@ template spinePathsPods() { return pth; } string output_pod_manifest_file(string fn_src) { - string pth = base_filesystem_(fn_src).chainPath("pod.manifest").array; - return pth; + return base_filesystem_(fn_src).chainPath("pod.manifest").array; } string base_pod_(string fn_src) { - string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this - return pth; + return _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this } auto base_filename(string fn_src) { auto pth_1_ = base_filename_(fn_src); diff --git a/src/doc_reform/io_out/hub.d b/src/doc_reform/io_out/hub.d index 8de07d8..a43c28a 100644 --- a/src/doc_reform/io_out/hub.d +++ b/src/doc_reform/io_out/hub.d @@ -5,6 +5,7 @@ module doc_reform.io_out.hub; template outputHub() { import doc_reform.io_out, + doc_reform.io_out.metadata, doc_reform.io_out.xmls, doc_reform.io_out.odt, doc_reform.io_out.create_zip_file, @@ -40,6 +41,10 @@ template outputHub() { doc_abstraction.outputEPub3!()(doc_matters); msg.vv("epub3 done"); } + if (sched == outTask.html_stuff) { + outputMetadata!()(doc_matters); + msg.vv("html metadata done"); + } if (sched == outTask.html_scroll) { msg.v("html scroll processing... "); import doc_reform.io_out.html; @@ -104,6 +109,7 @@ template outputHub() { } template outputHubOp() { import doc_reform.io_out, + doc_reform.io_out.metadata, doc_reform.io_out.xmls, doc_reform.io_out.odt, doc_reform.io_out.create_zip_file, diff --git a/src/doc_reform/io_out/metadata.d b/src/doc_reform/io_out/metadata.d new file mode 100644 index 0000000..f3b6176 --- /dev/null +++ b/src/doc_reform/io_out/metadata.d @@ -0,0 +1,385 @@ +module spine.io_out.metadata; +template outputMetadata() { + void outputMetadata(T)( T doc_matters) @safe { + import std.file; + import std.format; + import spine.io_out; + mixin InternalMarkup; + string[] 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; + } +┃"); +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; + } +┃"); +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; + } +┃"); + metadata_ ~= format(q"┃ + + + +Metadata Harvest - Topics + + + + + + + + + +┃", + 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"; + 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)); + } + } + 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"┃ + + + + ┃"); + if (doc_matters.opt.action.harvest_link) { + metadata_ ~= format(q"┃

[ HOME ] Metadata Harvest + [ Authors ] + [ Topics ]

+
+ ┃"); + } else { + metadata_ ~= format(q"┃

[ HOME ] +


+ ┃"); + } + 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.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_ ~= "

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.very_verbose) { + 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: " ~ doc_matters.conf_make_meta.meta.rights_copyright ~ "

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

License: " ~ doc_matters.conf_make_meta.meta.rights_license ~ "

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

Summary:

" ~ 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); + } + 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.harvest_link) { + 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.harvest_link) { + 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.harvest_link) { + 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.harvest_link) { + 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.harvest_link) { + 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_ ~= "

source: " ~ doc_matters.src.filename_base ~ "

"; + metadata_ ~= "

markup source: [" + ~ " zipped pod ] " + ~ "[" + ~ " pod tree ]

"; + metadata_ ~= "

outputs: [" + ~ " html scroll ] " + ~ "[" + ~ " html seg ]" + ~ "[" + ~ " epub ]

"; + metadata_write_output(doc_matters, metadata_); + } +} diff --git a/src/doc_reform/io_out/paths_output.d b/src/doc_reform/io_out/paths_output.d index 5f474a6..23c4624 100644 --- a/src/doc_reform/io_out/paths_output.d +++ b/src/doc_reform/io_out/paths_output.d @@ -20,6 +20,9 @@ template spineOutPaths() { string output_base() { return ((output_root.chainPath(lng)).asNormalizedPath).array; } + string internal_base() { + return lng.asNormalizedPath.array; + } } return _PathsStruct(); } @@ -116,6 +119,9 @@ template spineDocRootTreeHTML() { string seg(string fn_src) { return ((base.chainPath(base_filename_seg(fn_src))).asNormalizedPath).array; } + string fn_metadata(string fn_src) { + return ((base.chainPath("metadata." ~ base_filename_scroll(fn_src) ~ suffix)).asNormalizedPath).array; + } string fn_scroll(string fn_src) { return ((base.chainPath(base_filename_scroll(fn_src) ~ suffix)).asNormalizedPath).array; } @@ -152,6 +158,9 @@ template spinePathsHTML() { string harvest(string fn_harvest) { return doc_root ~ "/" ~ fn_harvest; } + string internal_base() { + return ((doc_tree.base).asNormalizedPath).array; + } string base() { return ((output_path_root.chainPath(doc_tree.base)).asNormalizedPath).array; } @@ -170,6 +179,9 @@ template spinePathsHTML() { string seg(string fn_src) { return ((output_path_root.chainPath(doc_tree.seg(fn_src))).asNormalizedPath).array; } + string fn_metadata(string fn_src) { + return ((output_path_root.chainPath(doc_tree.fn_metadata(fn_src))).asNormalizedPath).array; + } string fn_scroll(string fn_src) { return ((output_path_root.chainPath(doc_tree.fn_scroll(fn_src))).asNormalizedPath).array; } @@ -246,6 +258,12 @@ template spineUrlsHTML() { ((doc_tree.seg(fn_src)).asNormalizedPath).array, ); } + string fn_metadata(string fn_src) { + return format(q"┃%s/%s┃", + url_doc_root, + ((doc_tree.fn_metadata(fn_src)).asNormalizedPath).array, + ); + } string fn_scroll(string fn_src) { return format(q"┃%s/%s┃", url_doc_root, @@ -295,6 +313,9 @@ template spinePathsEPUB() { auto out_pth = spineOutPaths!()(output_pth_root, lng); string base_dir = "epub"; struct _PathsStruct { + string internal_base() { + return (((out_pth.internal_base).chainPath(base_dir)).asNormalizedPath).array; + } string base() { return (((out_pth.output_base).chainPath(base_dir)).asNormalizedPath).array; } diff --git a/src/doc_reform/io_out/xmls.d b/src/doc_reform/io_out/xmls.d index 74ebf82..4cb7507 100644 --- a/src/doc_reform/io_out/xmls.d +++ b/src/doc_reform/io_out/xmls.d @@ -95,7 +95,7 @@ template outputXHTMLs() { ) @safe { string _publisher="Publisher"; // TODO string o; - o = format(q"┃ + o = format(q"┃ @@ -110,7 +110,7 @@ template outputXHTMLs() { - ┃", + ┃", doc_matters.conf_make_meta.meta.title_full, doc_matters.conf_make_meta.meta.creator_author, _publisher, @@ -600,7 +600,7 @@ template outputXHTMLs() { ) @safe { string prev, next, toc; string harvest_link = (doc_matters.opt.action.harvest_link) - ? format(q"┃

[ T | A ]

┃") + ? format(q"┃

[ m | A | T ]

┃", doc_matters.src.filename_base) : ""; if (obj.tags.segment_anchor_tag_epub == "toc") { toc = ""; diff --git a/src/doc_reform/meta/conf_make_meta_structs.d b/src/doc_reform/meta/conf_make_meta_structs.d index 91ecab7..7f220aa 100644 --- a/src/doc_reform/meta/conf_make_meta_structs.d +++ b/src/doc_reform/meta/conf_make_meta_structs.d @@ -206,6 +206,7 @@ struct MetaComposite { string links; string notes_abstract; string notes_description; + string notes_summary; string original_language; string original_language_char; string original_publisher; diff --git a/src/doc_reform/meta/conf_make_meta_yaml.d b/src/doc_reform/meta/conf_make_meta_yaml.d index 5576b1c..1467fea 100644 --- a/src/doc_reform/meta/conf_make_meta_yaml.d +++ b/src/doc_reform/meta/conf_make_meta_yaml.d @@ -679,6 +679,12 @@ static template contentYAMLtoSpineStruct() { ) { _struct_composite.meta.notes_description = _yaml["notes"]["description"].get!string; } + if ("summary" in _yaml["notes"] + && _yaml["notes"]["summary"].type.string + && _yaml["notes"]["summary"].tag.match(rgx.yaml_tag_is_str) + ) { + _struct_composite.meta.notes_summary = _yaml["notes"]["summary"].get!string; + } } } if ("original" in _yaml diff --git a/src/doc_reform/meta/defaults.d b/src/doc_reform/meta/defaults.d index 847dcb9..b3f6bba 100644 --- a/src/doc_reform/meta/defaults.d +++ b/src/doc_reform/meta/defaults.d @@ -101,8 +101,9 @@ template spineHarvest() { string uid = ""; string date_published = ""; string[] topic_register_arr = []; - string path_html_segtoc = ""; + string path_html_metadata = ""; string path_html_scroll = ""; + string path_html_segtoc = ""; string path_epub = ""; string path_abs_html_segtoc = ""; string path_abs_html_scroll = ""; diff --git a/src/doc_reform/meta/metadoc_harvest.d b/src/doc_reform/meta/metadoc_harvest.d index 704e960..362ba34 100644 --- a/src/doc_reform/meta/metadoc_harvest.d +++ b/src/doc_reform/meta/metadoc_harvest.d @@ -33,6 +33,7 @@ template spineMetaDocHarvest() { hvst.harvest.uid = doc_matters.src.doc_uid; hvst.harvest.date_published = doc_matters.conf_make_meta.meta.date_published; hvst.harvest.topic_register_arr = doc_matters.conf_make_meta.meta.classify_topic_register_arr; + hvst.harvest.path_html_metadata = pth_html_rel.fn_metadata(doc_matters.src.filename); hvst.harvest.path_html_scroll = pth_html_rel.fn_scroll(doc_matters.src.filename); hvst.harvest.path_html_segtoc = pth_html_rel.fn_seg(doc_matters.src.filename, "toc"); hvst.harvest.path_abs_html_scroll = pth_html_abs.fn_scroll(doc_matters.src.filename); diff --git a/src/doc_reform/meta/metadoc_harvests_authors.d b/src/doc_reform/meta/metadoc_harvests_authors.d index f733a80..19ed583 100644 --- a/src/doc_reform/meta/metadoc_harvests_authors.d +++ b/src/doc_reform/meta/metadoc_harvests_authors.d @@ -270,11 +270,9 @@ string theme_light_1 = format(q"┃

Metadata Harvest - Authors (output organised by language & filetype)

-

[ HOME ] also see Metadata Harvest - Topics

+

[ HOME ] [ Metadata Harvest - Topics ]


-

English   

-

ABCDEFGHIJKLMNOPQRSTUVWXYZ,  ┃", _opt_action.css_theme_default ? theme_light_0 : theme_dark_0, @@ -296,31 +294,34 @@ string theme_light_1 = format(q"┃ ) { if (doc_harvest.author_surname_fn != _prev_auth) { _au[doc_harvest.author_surname_fn] - = format(q"┃

%s

%s "%s" [%s]

┃", + = format(q"┃

%s

%s "%s" [ %s ]

┃", doc_harvest.author_surname.translate([' ' : "_"]), doc_harvest.author_surname_fn, (doc_harvest.date_published.length > 0) ? doc_harvest.date_published : "", doc_harvest.path_html_segtoc, doc_harvest.title, + doc_harvest.path_html_metadata, doc_harvest.language, ); _prev_auth = doc_harvest.author_surname_fn; } else { _au[doc_harvest.author_surname_fn] - ~= format(q"┃

%s "%s" [%s]

┃", + ~= format(q"┃

%s "%s" [ %s ]

┃", (doc_harvest.date_published.length > 0) ? doc_harvest.date_published : "", doc_harvest.path_html_segtoc, doc_harvest.title, + doc_harvest.path_html_metadata, doc_harvest.language, ); } - _author_date_title ~= format(q"┃%s %s "%s" [%s]%s┃", + _author_date_title ~= format(q"┃%s %s "%s" [ %s ]%s┃", doc_harvest.author_surname_fn, (doc_harvest.date_published.length > 0) ? "(" ~ doc_harvest.date_published ~ ")" : "", doc_harvest.title, + doc_harvest.path_html_metadata, doc_harvest.language, (_opt_action.very_verbose) ? "\n " ~ doc_harvest.path_abs_html_scroll : "", ); diff --git a/src/doc_reform/meta/metadoc_harvests_topics.d b/src/doc_reform/meta/metadoc_harvests_topics.d index 82601fc..5e11b7e 100644 --- a/src/doc_reform/meta/metadoc_harvests_topics.d +++ b/src/doc_reform/meta/metadoc_harvests_topics.d @@ -311,12 +311,10 @@ string theme_light_1 = format(q"┃

Metadata Harvest - Topics (output organised by language & filetype)

-

[ HOME ] also see Metadata Harvest - Authors

+

[ HOME ] [ Metadata Harvest - Authors ]

ABCDEFGHIJKLMNOPQRSTUVWXYZ


-

English   

-
┃", _opt_action.css_theme_default ? theme_light_0 : theme_dark_0, _opt_action.css_theme_default ? theme_light_1 : theme_dark_1, @@ -359,10 +357,12 @@ string theme_light_1 = format(q"┃ ); } } - topics ~= format(q"┃

"%s" -%s┃", + topics ~= format(q"┃

"%s" - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln("- ", t_a_.title, " - ", t_a_.author); @@ -399,10 +399,12 @@ string theme_light_1 = format(q"┃ ); } } - topics ~= format(q"┃

%s -%s┃", + topics ~= format(q"┃

%s - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln(" - ", t_a_.title, " - ", t_a_.author); @@ -440,10 +442,12 @@ string theme_light_1 = format(q"┃ ); } } - topics ~= format(q"┃

%s -%s┃", + topics ~= format(q"┃

%s - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln(" - ", t_a_.title, " - ", t_a_.author); @@ -481,10 +485,12 @@ string theme_light_1 = format(q"┃ ); } } - topics ~= format(q"┃

%s -%s┃", + topics ~= format(q"┃

%s - %s [ %s ]┃", t_a_.path_html_segtoc, t_a_.title, _auth, + t_a_.path_html_metadata, + t_a_.language, ) ~ "\n"; if (_opt_action.very_verbose) { writeln(" - ", t_a_.title, " - ", t_a_.author); -- cgit v1.2.3