From 265176e24a7aa64d6bcd11c04d3e6020f629023b Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Thu, 21 May 2026 14:14:38 -0400 Subject: decouple abstraction phase0:2 phase0 step2: move curation modules from meta/ to io_out/curate/ Curation modules moved to src/sisudoc/io_out/curate/, module declarations renamed sisudoc.io_out.curate.metadoc_curate* from sisudoc.meta.metadoc_curate* and updated spine.d imports. File contents are otherwise unchanged. Completes phase0: meta/ now has zero io_out imports - the abstraction core's outgoing deps are now only: meta/ internals + io_in/ + ext_depends/D-YAML (assisted by Claude-Code) --- src/sisudoc/io_out/curate/metadoc_curate.d | 90 +++ src/sisudoc/io_out/curate/metadoc_curate_authors.d | 528 ++++++++++++++++ src/sisudoc/io_out/curate/metadoc_curate_topics.d | 691 +++++++++++++++++++++ src/sisudoc/meta/metadoc_curate.d | 90 --- src/sisudoc/meta/metadoc_curate_authors.d | 528 ---------------- src/sisudoc/meta/metadoc_curate_topics.d | 691 --------------------- src/sisudoc/spine.d | 6 +- 7 files changed, 1312 insertions(+), 1312 deletions(-) create mode 100644 src/sisudoc/io_out/curate/metadoc_curate.d create mode 100644 src/sisudoc/io_out/curate/metadoc_curate_authors.d create mode 100644 src/sisudoc/io_out/curate/metadoc_curate_topics.d delete mode 100644 src/sisudoc/meta/metadoc_curate.d delete mode 100644 src/sisudoc/meta/metadoc_curate_authors.d delete mode 100644 src/sisudoc/meta/metadoc_curate_topics.d (limited to 'src') diff --git a/src/sisudoc/io_out/curate/metadoc_curate.d b/src/sisudoc/io_out/curate/metadoc_curate.d new file mode 100644 index 0000000..8e87167 --- /dev/null +++ b/src/sisudoc/io_out/curate/metadoc_curate.d @@ -0,0 +1,90 @@ +/+ +- 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 (continuously updated, current 2026) 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.curate.metadoc_curate; +@safe: +template spineMetaDocCurate() { + auto spineMetaDocCurate(T,H)( + T doc_matters, + H hvst, + ) { + import sisudoc.meta.defaults; + import sisudoc.meta.rgx; + import std.array; + import std.exception; + import std.regex; + import std.stdio; + import std.string; + import std.typecons; + import std.uni; + import std.utf; + import std.conv : to; + mixin InternalMarkup; + static auto mkup = InlineMarkup(); + import sisudoc.io_out.paths_output; + auto pth_html_abs = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language); + auto pth_html_rel = spineDocRootTreeHTML!()(doc_matters.src.language); + hvst.curate.title = doc_matters.conf_make_meta.meta.title_full; + hvst.curate.author = doc_matters.conf_make_meta.meta.creator_author; + hvst.curate.author_surname = doc_matters.conf_make_meta.meta.creator_author_surname; + hvst.curate.author_surname_fn = doc_matters.conf_make_meta.meta.creator_author_surname_fn; + hvst.curate.author_arr = doc_matters.conf_make_meta.meta.creator_author_arr; + hvst.curate.language_original = doc_matters.conf_make_meta.meta.original_language; + hvst.curate.language = doc_matters.src.language; + hvst.curate.uid = doc_matters.src.doc_uid; + hvst.curate.date_published = doc_matters.conf_make_meta.meta.date_published; + hvst.curate.topic_register_arr = doc_matters.conf_make_meta.meta.classify_topic_register_arr; + hvst.curate.path_html_metadata = pth_html_rel.fn_metadata(doc_matters.src.filename); + hvst.curate.path_html_scroll = pth_html_rel.fn_scroll(doc_matters.src.filename); + hvst.curate.path_html_segtoc = pth_html_rel.fn_seg(doc_matters.src.filename, "toc"); + hvst.curate.path_abs_html_scroll = pth_html_abs.fn_scroll(doc_matters.src.filename); + hvst.curate.path_abs_html_segtoc = pth_html_abs.fn_seg(doc_matters.src.filename, "toc"); + return hvst.curate; + } +} diff --git a/src/sisudoc/io_out/curate/metadoc_curate_authors.d b/src/sisudoc/io_out/curate/metadoc_curate_authors.d new file mode 100644 index 0000000..6a356e7 --- /dev/null +++ b/src/sisudoc/io_out/curate/metadoc_curate_authors.d @@ -0,0 +1,528 @@ +/+ +- 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 (continuously updated, current 2026) 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.curate.metadoc_curate_authors; +@safe: + import std.algorithm; + import std.array; + import std.exception; + import std.regex; + import std.stdio; + import std.string; + import std.conv : to; + import sisudoc.meta.defaults; + import sisudoc.meta.rgx; + mixin spineCurateMetadata; + mixin InternalMarkup; +template spineMetaDocCuratesAuthors() { + static auto mkup = InlineMarkup(); + void spineMetaDocCuratesAuthors(H,M,O)( + H curates, + M _make_and_meta_struct, + O _opt_action, + ) { + string inline_search_form(M)( + M _make_and_meta_truct, + ) { + string o; + string _form; + if (_opt_action.html_link_search) { + o = format(q"┃ +
+ + + +
┃", + _make_and_meta_struct.conf.w_srv_cgi_action, + (_make_and_meta_struct.conf.w_srv_db_sqlite_filename.empty) + ? "" + : "\n ", + ); + } else { + o = ""; + } + return o; + } +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.lev0:hover { + color : #FFFFFF; + background-color : #000000; + } + a.lev1:hover { + color : #FFFFFF; + background : #333333; + } + a.lev2:hover { + color : #FFFFFF; + background : #555555; + } + a.lev3:hover { + color : #FFFFFF; + background : #777777; + } + 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, select, textarea { + font-size : 150%%; + } + 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.lev0:hover { + color : #000000; + background-color : #FFFFFF; + } + a.lev1:hover { + color : #FFFFFF; + background : #444444; + } + a.lev2:hover { + background : #888888; + } + a.lev3:hover { + background : #BBBBBB; + } + 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, select, textarea { + font-size : 150%%; + } + input { + color : #000000; + background-color : #FFFFFF; + } +┃"); +string theme_dark_1 = format(q"┃ + h1 { + color : #FFFFFF; + background : #000000; + } + p.letter { + color : #FFFFFF; + background : #333333; + } + p.lev0 { + color : #FFFFFF; + background : #000000; + } + p.lev1 { + color : #FFFFFF; + background : #333333; + } + p.lev2 { + background : #555555; + } + p.lev3 { + background : #777777; + } + p.lev4 { + background : #AAAAAA; + } + p.lev5 { + } +┃"); +string theme_light_1 = format(q"┃ + h1 { + color : #FFFFFF; + background : #1A3A7A; + } + p.letter { + color : #FFFFFF; + background : #1A3A7A; + } + p.lev0 { + color : #FFFFFF; + background : #000000; + } + p.lev1 { + color : #FFFFFF; + background : #444444; + } + p.lev2 { + background : #888888; + } + p.lev3 { + background : #BBBBBB; + } + p.lev4 { + background : #EEEEEE; + } + p.lev5 { + } +┃"); + string[] authors = []; + authors ~= format(q"┃ + + + + +⌘ Curated metadata - 🖋 Authors + + + + + + + + + + + + + +

⌘ Curated metadata - 🖋 Authors (output organised by language & filetype)

+
+ +%s +
+

+
+

ABCDEFGHIJKLMNOPQRSTUVWXYZ,  +┃", + _opt_action.css_theme_default ? theme_light_0 : theme_dark_0, + _opt_action.css_theme_default ? theme_light_1 : theme_dark_1, + inline_search_form(_make_and_meta_struct), +) ~ "\n"; + string[string] _au; + string[] _auth_date_title; + string[] _author_date_title; + string _prev_auth = ""; + char _prev_k = "_".to!char; + foreach(doc_curate; + curates + .multiSort!( + "toUpper(a.author_surname_fn) < toUpper(b.author_surname_fn)", + "a.date_published < b.date_published", + "a.title < b.title", + SwapStrategy.unstable + ) + ) { + if (doc_curate.author_surname_fn != _prev_auth) { + _au[doc_curate.author_surname_fn] + = format(q"┃

%s

%s "%s" [ %s ]

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

%s "%s" [ %s ]

┃", + (doc_curate.date_published.length > 0) + ? doc_curate.date_published : "", + doc_curate.path_html_segtoc, + doc_curate.title, + doc_curate.path_html_metadata, + doc_curate.language, + ); + } + _author_date_title ~= format(q"┃%s %s "%s" [ %s ]%s┃", + doc_curate.author_surname_fn, + (doc_curate.date_published.length > 0) + ? "(" ~ doc_curate.date_published ~ ")" : "", + doc_curate.title, + doc_curate.path_html_metadata, + doc_curate.language, + (_opt_action.show_curate_authors) ? "\n " ~ doc_curate.path_abs_html_scroll : "", + ); + } + foreach (k; _au.keys.sort) { + if (k.toUpper.to!(char[])[0] != _prev_k) { + authors ~= format(q"┃

%s

┃", + k.toUpper.to!(char[])[0], + k.toUpper.to!(char[])[0], + ); + _prev_k = k.toUpper.to!(char[])[0]; + } + authors ~= _au[k]; + } + authors + ~= format(q"┃ +
+ + + + + + + + +┃") ~ "\n"; + import sisudoc.io_out.paths_output; + auto out_pth = spinePathsHTML!()(_make_and_meta_struct.conf.output_path, ""); + try { + auto f = File(out_pth.curate("authors.html"), "w"); + foreach (o; authors) { + f.writeln(o); + } + } catch (ErrnoException ex) { + // Handle error + } + if (_opt_action.show_curate_authors) { + foreach(_adt; _author_date_title.sort) { + writeln(_adt); + } + } + } +} diff --git a/src/sisudoc/io_out/curate/metadoc_curate_topics.d b/src/sisudoc/io_out/curate/metadoc_curate_topics.d new file mode 100644 index 0000000..05643b9 --- /dev/null +++ b/src/sisudoc/io_out/curate/metadoc_curate_topics.d @@ -0,0 +1,691 @@ +/+ +- 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 (continuously updated, current 2026) 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.curate.metadoc_curate_topics; +@safe: + import std.algorithm; + import std.array; + import std.exception; + import std.regex; + import std.stdio; + import std.string; + import std.conv : to; + import sisudoc.meta.defaults; + import sisudoc.meta.rgx; + mixin spineCurateMetadata; + mixin InternalMarkup; +template spineMetaDocCuratesTopics() { + static auto mkup = InlineMarkup(); + void spineMetaDocCuratesTopics(H,M,O)( + H hvst, + M _make_and_meta_struct, + O _opt_action, + ) { + string inline_search_form(M)( + M _make_and_meta_truct, + ) { + string o; + string _form; + if (_opt_action.html_link_search) { + o = format(q"┃ +
+ + + +
┃", + _make_and_meta_struct.conf.w_srv_cgi_action, + (_make_and_meta_struct.conf.w_srv_db_sqlite_filename.empty) + ? "" + : "\n ", + ); + } else { + o = ""; + } + return o; + } + auto min_repeat_number = 42; + string[] _document_topic_register; + string[] _topic_register; + string[] _sub_topic_register; + string[] topics = []; + string _auth = ""; + foreach(k, doc_curate; hvst.curates) { + _topic_register = []; + foreach(topic; doc_curate.topic_register_arr.sort) { + _sub_topic_register = []; + string _spaces; + string[] subject_tree = topic.split(mkup.sep); + switch (subject_tree.length) { + case 1: + hvst.subject_trees[subject_tree[0]]["_a"]["_a"]["_a"] ~= doc_curate; + break; + case 2: + hvst.subject_trees[subject_tree[0]][subject_tree[1]]["_a"]["_a"] ~= doc_curate; + break; + case 3: + hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]]["_a"] ~= doc_curate; + break; + case 4: + hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]][subject_tree[3]] ~= doc_curate; + break; + default: + break; + } + _topic_register ~= _sub_topic_register.join("\n"); + } + auto char_repeat_number = (doc_curate.title.length + + doc_curate.author.length + 16); + char_repeat_number = (char_repeat_number > min_repeat_number) + ? char_repeat_number + : min_repeat_number; + _document_topic_register ~= format( + "\"%s\", %s%s\n%s", + doc_curate.title, + doc_curate.author, + (doc_curate.date_published.length > 0) ? " (" ~ doc_curate.date_published ~ ")" : "", + _topic_register.sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable).release.join("\n"), + ); + } +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.lev0:hover { + color : #FFFFFF; + background-color : #000000; + } + a.lev1:hover { + color : #FFFFFF; + background : #333333; + } + a.lev2:hover { + color : #FFFFFF; + background : #555555; + } + a.lev3:hover { + color : #FFFFFF; + background : #777777; + } + 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, select, textarea { + font-size : 150%%; + } + 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.lev0:hover { + color : #000000; + background-color : #FFFFFF; + } + a.lev1:hover { + color : #FFFFFF; + background : #444444; + } + a.lev2:hover { + background : #888888; + } + a.lev3:hover { + background : #BBBBBB; + } + 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, select, textarea { + font-size : 150%%; + } + input { + color : #000000; + background-color : #FFFFFF; + } +┃"); +string theme_dark_1 = format(q"┃ + h1 { + color : #FFFFFF; + background : #000000; + } + p.letter { + color : #FFFFFF; + background : #333333; + } + p.lev0 { + color : #FFFFFF; + background : #000000; + } + p.lev1 { + color : #FFFFFF; + background : #333333; + } + p.lev2 { + background : #555555; + } + p.lev3 { + background : #777777; + } + p.lev4 { + background : #AAAAAA; + } + p.lev5 { + } +┃"); +string theme_light_1 = format(q"┃ + h1 { + color : #FFFFFF; + background : #1A3A7A; + } + p.letter { + color : #FFFFFF; + background : #1A3A7A; + } + p.lev0 { + color : #FFFFFF; + background : #000000; + } + p.lev1 { + color : #FFFFFF; + background : #444444; + } + p.lev2 { + background : #888888; + } + p.lev3 { + background : #BBBBBB; + } + p.lev4 { + background : #EEEEEE; + } + p.lev5 { + } +┃"); + topics ~= format(q"┃ + + + +⌘ Curated metadata - ⌘ Topics + + + + + + + + + + + + + +

⌘ Curated metadata - ⌘ Topics (output organised by language & filetype)

+
+ + %s +
+

ABCDEFGHIJKLMNOPQRSTUVWXYZ,  +

+
+┃", + _opt_action.css_theme_default ? theme_light_0 : theme_dark_0, + _opt_action.css_theme_default ? theme_light_1 : theme_dark_1, + inline_search_form(_make_and_meta_struct), +) ~ "\n"; + char _prev_k = "_".to!char; + int _kn; + foreach(k0; + hvst.subject_trees.keys + .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) + ) { + if (k0.toUpper.to!(char[])[0] != _prev_k) { + topics ~= format(q"┃

%s

┃", + k0.toUpper.to!(char[])[0], + k0.toUpper.to!(char[])[0], + ); + _prev_k = k0.toUpper.to!(char[])[0]; + } + if (k0 != "_a") { + topics ~= format(q"┃

%s

┃", + k0.translate([' ' : "_"]), k0,) ~ "\n"; + if (_opt_action.show_curate_topics) { + writeln("", k0); + } + if ("_a" in hvst.subject_trees[k0]) { + foreach (t_a_; + hvst.subject_trees[k0]["_a"]["_a"]["_a"] + .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) + ) { + _auth = []; + if (t_a_.author_arr.length < 2) { + _auth = format(q"┃ %s┃", + t_a_.author_surname.translate([' ' : "_"]), + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ %s,┃", + t_a_.author_surname.translate([' ' : "_"]), + a, + ); + } + } + 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.show_curate_topics) { + writeln("- ", t_a_.title, " - ", t_a_.author); + } + } + } + foreach(k1; + hvst.subject_trees[k0].keys + .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) + ) { + if (k1 != "_a") { + topics ~= format(q"┃

%s

┃", + k0.translate([' ' : "_"]), + k1.translate([' ' : "_"]), k1,) ~ "\n"; + if (_opt_action.show_curate_topics) { + writeln(" ", k1); + } + if ("_a" in hvst.subject_trees[k0][k1]) { + foreach (t_a_; + hvst.subject_trees[k0][k1]["_a"]["_a"] + .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) + ) { + _auth = []; + if (t_a_.author_arr.length < 2) { + _auth = format(q"┃ %s┃", + t_a_.author_surname.translate([' ' : "_"]), + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ %s,┃", + t_a_.author_surname.translate([' ' : "_"]), + a, + ); + } + } + 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.show_curate_topics) { + writeln(" - ", t_a_.title, " - ", t_a_.author); + } + } + } + } + foreach(k2; + hvst.subject_trees[k0][k1].keys + .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) + ) { + if (k2 != "_a") { + topics ~= format(q"┃

%s

┃", + k0.translate([' ' : "_"]), k1.translate([' ' : "_"]), + k2.translate([' ' : "_"]), k2,) ~ "\n"; + if (_opt_action.show_curate_topics) { + writeln(" ", k2); + } + if ("_a" in hvst.subject_trees[k0][k1][k2]) { + foreach (t_a_; + hvst.subject_trees[k0][k1][k2]["_a"] + .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) + ) { + _auth = []; + if (t_a_.author_arr.length < 2) { + _auth = format(q"┃ %s┃", + t_a_.author_surname.translate([' ' : "_"]), + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ %s,┃", + t_a_.author_surname.translate([' ' : "_"]), + a, + ); + } + } + 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.show_curate_topics) { + writeln(" - ", t_a_.title, " - ", t_a_.author); + } + } + } + } + foreach(k3; + hvst.subject_trees[k0][k1][k2].keys + .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) + ) { + if (k3 != "_a") { + topics ~= format(q"┃

%s

┃", + k0.translate([' ' : "_"]), k1.translate([' ' : "_"]), k2.translate([' ' : "_"]), + k3.translate([' ' : "_"]), k3,) ~ "\n"; + if (_opt_action.show_curate_topics) { + writeln(" ", k3); + } + { + foreach (t_a_; + hvst.subject_trees[k0][k1][k2][k3] + .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) + ) { + _auth = []; + if (t_a_.author_arr.length < 2) { + _auth = format(q"┃%s┃", + t_a_.author_surname.translate([' ' : "_"]), + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ %s,┃", + t_a_.author_surname.translate([' ' : "_"]), + a, + ); + } + } + 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.show_curate_topics) { + writeln(" - ", t_a_.title, " - ", t_a_.author); + } + } + } + } + } + } + } + } + } + topics + ~= format(q"┃ +


+ + + + + + + + +┃") ~ "\n"; + import sisudoc.io_out.paths_output; + auto out_pth = spinePathsHTML!()(_make_and_meta_struct.conf.output_path, ""); + try { + auto f = File(out_pth.curate("topics.html"), "w"); + foreach (o; topics) { + f.writeln(o); + } + } catch (ErrnoException ex) { + // Handle error + } + } +} diff --git a/src/sisudoc/meta/metadoc_curate.d b/src/sisudoc/meta/metadoc_curate.d deleted file mode 100644 index 32df377..0000000 --- a/src/sisudoc/meta/metadoc_curate.d +++ /dev/null @@ -1,90 +0,0 @@ -/+ -- 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 (continuously updated, current 2026) 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_curate; -@safe: -template spineMetaDocCurate() { - auto spineMetaDocCurate(T,H)( - T doc_matters, - H hvst, - ) { - import sisudoc.meta.defaults; - import sisudoc.meta.rgx; - import std.array; - import std.exception; - import std.regex; - import std.stdio; - import std.string; - import std.typecons; - import std.uni; - import std.utf; - import std.conv : to; - mixin InternalMarkup; - static auto mkup = InlineMarkup(); - import sisudoc.io_out.paths_output; - auto pth_html_abs = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language); - auto pth_html_rel = spineDocRootTreeHTML!()(doc_matters.src.language); - hvst.curate.title = doc_matters.conf_make_meta.meta.title_full; - hvst.curate.author = doc_matters.conf_make_meta.meta.creator_author; - hvst.curate.author_surname = doc_matters.conf_make_meta.meta.creator_author_surname; - hvst.curate.author_surname_fn = doc_matters.conf_make_meta.meta.creator_author_surname_fn; - hvst.curate.author_arr = doc_matters.conf_make_meta.meta.creator_author_arr; - hvst.curate.language_original = doc_matters.conf_make_meta.meta.original_language; - hvst.curate.language = doc_matters.src.language; - hvst.curate.uid = doc_matters.src.doc_uid; - hvst.curate.date_published = doc_matters.conf_make_meta.meta.date_published; - hvst.curate.topic_register_arr = doc_matters.conf_make_meta.meta.classify_topic_register_arr; - hvst.curate.path_html_metadata = pth_html_rel.fn_metadata(doc_matters.src.filename); - hvst.curate.path_html_scroll = pth_html_rel.fn_scroll(doc_matters.src.filename); - hvst.curate.path_html_segtoc = pth_html_rel.fn_seg(doc_matters.src.filename, "toc"); - hvst.curate.path_abs_html_scroll = pth_html_abs.fn_scroll(doc_matters.src.filename); - hvst.curate.path_abs_html_segtoc = pth_html_abs.fn_seg(doc_matters.src.filename, "toc"); - return hvst.curate; - } -} diff --git a/src/sisudoc/meta/metadoc_curate_authors.d b/src/sisudoc/meta/metadoc_curate_authors.d deleted file mode 100644 index e8d44c4..0000000 --- a/src/sisudoc/meta/metadoc_curate_authors.d +++ /dev/null @@ -1,528 +0,0 @@ -/+ -- 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 (continuously updated, current 2026) 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_curate_authors; -@safe: - import std.algorithm; - import std.array; - import std.exception; - import std.regex; - import std.stdio; - import std.string; - import std.conv : to; - import sisudoc.meta.defaults; - import sisudoc.meta.rgx; - mixin spineCurateMetadata; - mixin InternalMarkup; -template spineMetaDocCuratesAuthors() { - static auto mkup = InlineMarkup(); - void spineMetaDocCuratesAuthors(H,M,O)( - H curates, - M _make_and_meta_struct, - O _opt_action, - ) { - string inline_search_form(M)( - M _make_and_meta_truct, - ) { - string o; - string _form; - if (_opt_action.html_link_search) { - o = format(q"┃ -
- - - -
┃", - _make_and_meta_struct.conf.w_srv_cgi_action, - (_make_and_meta_struct.conf.w_srv_db_sqlite_filename.empty) - ? "" - : "\n ", - ); - } else { - o = ""; - } - return o; - } -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.lev0:hover { - color : #FFFFFF; - background-color : #000000; - } - a.lev1:hover { - color : #FFFFFF; - background : #333333; - } - a.lev2:hover { - color : #FFFFFF; - background : #555555; - } - a.lev3:hover { - color : #FFFFFF; - background : #777777; - } - 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, select, textarea { - font-size : 150%%; - } - 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.lev0:hover { - color : #000000; - background-color : #FFFFFF; - } - a.lev1:hover { - color : #FFFFFF; - background : #444444; - } - a.lev2:hover { - background : #888888; - } - a.lev3:hover { - background : #BBBBBB; - } - 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, select, textarea { - font-size : 150%%; - } - input { - color : #000000; - background-color : #FFFFFF; - } -┃"); -string theme_dark_1 = format(q"┃ - h1 { - color : #FFFFFF; - background : #000000; - } - p.letter { - color : #FFFFFF; - background : #333333; - } - p.lev0 { - color : #FFFFFF; - background : #000000; - } - p.lev1 { - color : #FFFFFF; - background : #333333; - } - p.lev2 { - background : #555555; - } - p.lev3 { - background : #777777; - } - p.lev4 { - background : #AAAAAA; - } - p.lev5 { - } -┃"); -string theme_light_1 = format(q"┃ - h1 { - color : #FFFFFF; - background : #1A3A7A; - } - p.letter { - color : #FFFFFF; - background : #1A3A7A; - } - p.lev0 { - color : #FFFFFF; - background : #000000; - } - p.lev1 { - color : #FFFFFF; - background : #444444; - } - p.lev2 { - background : #888888; - } - p.lev3 { - background : #BBBBBB; - } - p.lev4 { - background : #EEEEEE; - } - p.lev5 { - } -┃"); - string[] authors = []; - authors ~= format(q"┃ - - - - -⌘ Curated metadata - 🖋 Authors - - - - - - - - - - - - - -

⌘ Curated metadata - 🖋 Authors (output organised by language & filetype)

-
- -%s -
-

-
-

ABCDEFGHIJKLMNOPQRSTUVWXYZ,  -┃", - _opt_action.css_theme_default ? theme_light_0 : theme_dark_0, - _opt_action.css_theme_default ? theme_light_1 : theme_dark_1, - inline_search_form(_make_and_meta_struct), -) ~ "\n"; - string[string] _au; - string[] _auth_date_title; - string[] _author_date_title; - string _prev_auth = ""; - char _prev_k = "_".to!char; - foreach(doc_curate; - curates - .multiSort!( - "toUpper(a.author_surname_fn) < toUpper(b.author_surname_fn)", - "a.date_published < b.date_published", - "a.title < b.title", - SwapStrategy.unstable - ) - ) { - if (doc_curate.author_surname_fn != _prev_auth) { - _au[doc_curate.author_surname_fn] - = format(q"┃

%s

%s "%s" [ %s ]

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

%s "%s" [ %s ]

┃", - (doc_curate.date_published.length > 0) - ? doc_curate.date_published : "", - doc_curate.path_html_segtoc, - doc_curate.title, - doc_curate.path_html_metadata, - doc_curate.language, - ); - } - _author_date_title ~= format(q"┃%s %s "%s" [ %s ]%s┃", - doc_curate.author_surname_fn, - (doc_curate.date_published.length > 0) - ? "(" ~ doc_curate.date_published ~ ")" : "", - doc_curate.title, - doc_curate.path_html_metadata, - doc_curate.language, - (_opt_action.show_curate_authors) ? "\n " ~ doc_curate.path_abs_html_scroll : "", - ); - } - foreach (k; _au.keys.sort) { - if (k.toUpper.to!(char[])[0] != _prev_k) { - authors ~= format(q"┃

%s

┃", - k.toUpper.to!(char[])[0], - k.toUpper.to!(char[])[0], - ); - _prev_k = k.toUpper.to!(char[])[0]; - } - authors ~= _au[k]; - } - authors - ~= format(q"┃ -
- - - - - - - - -┃") ~ "\n"; - import sisudoc.io_out.paths_output; - auto out_pth = spinePathsHTML!()(_make_and_meta_struct.conf.output_path, ""); - try { - auto f = File(out_pth.curate("authors.html"), "w"); - foreach (o; authors) { - f.writeln(o); - } - } catch (ErrnoException ex) { - // Handle error - } - if (_opt_action.show_curate_authors) { - foreach(_adt; _author_date_title.sort) { - writeln(_adt); - } - } - } -} diff --git a/src/sisudoc/meta/metadoc_curate_topics.d b/src/sisudoc/meta/metadoc_curate_topics.d deleted file mode 100644 index 1873666..0000000 --- a/src/sisudoc/meta/metadoc_curate_topics.d +++ /dev/null @@ -1,691 +0,0 @@ -/+ -- 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 (continuously updated, current 2026) 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_curate_topics; -@safe: - import std.algorithm; - import std.array; - import std.exception; - import std.regex; - import std.stdio; - import std.string; - import std.conv : to; - import sisudoc.meta.defaults; - import sisudoc.meta.rgx; - mixin spineCurateMetadata; - mixin InternalMarkup; -template spineMetaDocCuratesTopics() { - static auto mkup = InlineMarkup(); - void spineMetaDocCuratesTopics(H,M,O)( - H hvst, - M _make_and_meta_struct, - O _opt_action, - ) { - string inline_search_form(M)( - M _make_and_meta_truct, - ) { - string o; - string _form; - if (_opt_action.html_link_search) { - o = format(q"┃ -
- - - -
┃", - _make_and_meta_struct.conf.w_srv_cgi_action, - (_make_and_meta_struct.conf.w_srv_db_sqlite_filename.empty) - ? "" - : "\n ", - ); - } else { - o = ""; - } - return o; - } - auto min_repeat_number = 42; - string[] _document_topic_register; - string[] _topic_register; - string[] _sub_topic_register; - string[] topics = []; - string _auth = ""; - foreach(k, doc_curate; hvst.curates) { - _topic_register = []; - foreach(topic; doc_curate.topic_register_arr.sort) { - _sub_topic_register = []; - string _spaces; - string[] subject_tree = topic.split(mkup.sep); - switch (subject_tree.length) { - case 1: - hvst.subject_trees[subject_tree[0]]["_a"]["_a"]["_a"] ~= doc_curate; - break; - case 2: - hvst.subject_trees[subject_tree[0]][subject_tree[1]]["_a"]["_a"] ~= doc_curate; - break; - case 3: - hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]]["_a"] ~= doc_curate; - break; - case 4: - hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]][subject_tree[3]] ~= doc_curate; - break; - default: - break; - } - _topic_register ~= _sub_topic_register.join("\n"); - } - auto char_repeat_number = (doc_curate.title.length - + doc_curate.author.length + 16); - char_repeat_number = (char_repeat_number > min_repeat_number) - ? char_repeat_number - : min_repeat_number; - _document_topic_register ~= format( - "\"%s\", %s%s\n%s", - doc_curate.title, - doc_curate.author, - (doc_curate.date_published.length > 0) ? " (" ~ doc_curate.date_published ~ ")" : "", - _topic_register.sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable).release.join("\n"), - ); - } -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.lev0:hover { - color : #FFFFFF; - background-color : #000000; - } - a.lev1:hover { - color : #FFFFFF; - background : #333333; - } - a.lev2:hover { - color : #FFFFFF; - background : #555555; - } - a.lev3:hover { - color : #FFFFFF; - background : #777777; - } - 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, select, textarea { - font-size : 150%%; - } - 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.lev0:hover { - color : #000000; - background-color : #FFFFFF; - } - a.lev1:hover { - color : #FFFFFF; - background : #444444; - } - a.lev2:hover { - background : #888888; - } - a.lev3:hover { - background : #BBBBBB; - } - 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, select, textarea { - font-size : 150%%; - } - input { - color : #000000; - background-color : #FFFFFF; - } -┃"); -string theme_dark_1 = format(q"┃ - h1 { - color : #FFFFFF; - background : #000000; - } - p.letter { - color : #FFFFFF; - background : #333333; - } - p.lev0 { - color : #FFFFFF; - background : #000000; - } - p.lev1 { - color : #FFFFFF; - background : #333333; - } - p.lev2 { - background : #555555; - } - p.lev3 { - background : #777777; - } - p.lev4 { - background : #AAAAAA; - } - p.lev5 { - } -┃"); -string theme_light_1 = format(q"┃ - h1 { - color : #FFFFFF; - background : #1A3A7A; - } - p.letter { - color : #FFFFFF; - background : #1A3A7A; - } - p.lev0 { - color : #FFFFFF; - background : #000000; - } - p.lev1 { - color : #FFFFFF; - background : #444444; - } - p.lev2 { - background : #888888; - } - p.lev3 { - background : #BBBBBB; - } - p.lev4 { - background : #EEEEEE; - } - p.lev5 { - } -┃"); - topics ~= format(q"┃ - - - -⌘ Curated metadata - ⌘ Topics - - - - - - - - - - - - - -

⌘ Curated metadata - ⌘ Topics (output organised by language & filetype)

-
- - %s -
-

ABCDEFGHIJKLMNOPQRSTUVWXYZ,  -

-
-┃", - _opt_action.css_theme_default ? theme_light_0 : theme_dark_0, - _opt_action.css_theme_default ? theme_light_1 : theme_dark_1, - inline_search_form(_make_and_meta_struct), -) ~ "\n"; - char _prev_k = "_".to!char; - int _kn; - foreach(k0; - hvst.subject_trees.keys - .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) - ) { - if (k0.toUpper.to!(char[])[0] != _prev_k) { - topics ~= format(q"┃

%s

┃", - k0.toUpper.to!(char[])[0], - k0.toUpper.to!(char[])[0], - ); - _prev_k = k0.toUpper.to!(char[])[0]; - } - if (k0 != "_a") { - topics ~= format(q"┃

%s

┃", - k0.translate([' ' : "_"]), k0,) ~ "\n"; - if (_opt_action.show_curate_topics) { - writeln("", k0); - } - if ("_a" in hvst.subject_trees[k0]) { - foreach (t_a_; - hvst.subject_trees[k0]["_a"]["_a"]["_a"] - .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) - ) { - _auth = []; - if (t_a_.author_arr.length < 2) { - _auth = format(q"┃ %s┃", - t_a_.author_surname.translate([' ' : "_"]), - t_a_.author, - ); - } else { - foreach (a; t_a_.author_arr) { - _auth ~= format(q"┃ %s,┃", - t_a_.author_surname.translate([' ' : "_"]), - a, - ); - } - } - 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.show_curate_topics) { - writeln("- ", t_a_.title, " - ", t_a_.author); - } - } - } - foreach(k1; - hvst.subject_trees[k0].keys - .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) - ) { - if (k1 != "_a") { - topics ~= format(q"┃

%s

┃", - k0.translate([' ' : "_"]), - k1.translate([' ' : "_"]), k1,) ~ "\n"; - if (_opt_action.show_curate_topics) { - writeln(" ", k1); - } - if ("_a" in hvst.subject_trees[k0][k1]) { - foreach (t_a_; - hvst.subject_trees[k0][k1]["_a"]["_a"] - .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) - ) { - _auth = []; - if (t_a_.author_arr.length < 2) { - _auth = format(q"┃ %s┃", - t_a_.author_surname.translate([' ' : "_"]), - t_a_.author, - ); - } else { - foreach (a; t_a_.author_arr) { - _auth ~= format(q"┃ %s,┃", - t_a_.author_surname.translate([' ' : "_"]), - a, - ); - } - } - 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.show_curate_topics) { - writeln(" - ", t_a_.title, " - ", t_a_.author); - } - } - } - } - foreach(k2; - hvst.subject_trees[k0][k1].keys - .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) - ) { - if (k2 != "_a") { - topics ~= format(q"┃

%s

┃", - k0.translate([' ' : "_"]), k1.translate([' ' : "_"]), - k2.translate([' ' : "_"]), k2,) ~ "\n"; - if (_opt_action.show_curate_topics) { - writeln(" ", k2); - } - if ("_a" in hvst.subject_trees[k0][k1][k2]) { - foreach (t_a_; - hvst.subject_trees[k0][k1][k2]["_a"] - .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) - ) { - _auth = []; - if (t_a_.author_arr.length < 2) { - _auth = format(q"┃ %s┃", - t_a_.author_surname.translate([' ' : "_"]), - t_a_.author, - ); - } else { - foreach (a; t_a_.author_arr) { - _auth ~= format(q"┃ %s,┃", - t_a_.author_surname.translate([' ' : "_"]), - a, - ); - } - } - 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.show_curate_topics) { - writeln(" - ", t_a_.title, " - ", t_a_.author); - } - } - } - } - foreach(k3; - hvst.subject_trees[k0][k1][k2].keys - .sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable) - ) { - if (k3 != "_a") { - topics ~= format(q"┃

%s

┃", - k0.translate([' ' : "_"]), k1.translate([' ' : "_"]), k2.translate([' ' : "_"]), - k3.translate([' ' : "_"]), k3,) ~ "\n"; - if (_opt_action.show_curate_topics) { - writeln(" ", k3); - } - { - foreach (t_a_; - hvst.subject_trees[k0][k1][k2][k3] - .multiSort!("toUpper(a.title) < toUpper(b.title)", "a.author < b.author", SwapStrategy.unstable) - ) { - _auth = []; - if (t_a_.author_arr.length < 2) { - _auth = format(q"┃%s┃", - t_a_.author_surname.translate([' ' : "_"]), - t_a_.author, - ); - } else { - foreach (a; t_a_.author_arr) { - _auth ~= format(q"┃ %s,┃", - t_a_.author_surname.translate([' ' : "_"]), - a, - ); - } - } - 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.show_curate_topics) { - writeln(" - ", t_a_.title, " - ", t_a_.author); - } - } - } - } - } - } - } - } - } - topics - ~= format(q"┃ -


- - - - - - - - -┃") ~ "\n"; - import sisudoc.io_out.paths_output; - auto out_pth = spinePathsHTML!()(_make_and_meta_struct.conf.output_path, ""); - try { - auto f = File(out_pth.curate("topics.html"), "w"); - foreach (o; topics) { - f.writeln(o); - } - } catch (ErrnoException ex) { - // Handle error - } - } -} diff --git a/src/sisudoc/spine.d b/src/sisudoc/spine.d index e710281..b00469a 100755 --- a/src/sisudoc/spine.d +++ b/src/sisudoc/spine.d @@ -63,9 +63,9 @@ import std.process; import sisudoc.conf.compile_time_info; import sisudoc.meta; import sisudoc.meta.metadoc; -import sisudoc.meta.metadoc_curate; -import sisudoc.meta.metadoc_curate_authors; -import sisudoc.meta.metadoc_curate_topics; +import sisudoc.io_out.curate.metadoc_curate; +import sisudoc.io_out.curate.metadoc_curate_authors; +import sisudoc.io_out.curate.metadoc_curate_topics; import sisudoc.meta.metadoc_from_src; import sisudoc.meta.conf_make_meta_structs; import sisudoc.meta.conf_make_meta_json; -- cgit v1.2.3