diff options
Diffstat (limited to 'src/doc_reform/meta')
-rw-r--r-- | src/doc_reform/meta/defaults.d | 28 | ||||
-rw-r--r-- | src/doc_reform/meta/metadoc.d | 4 | ||||
-rw-r--r-- | src/doc_reform/meta/metadoc_harvest.d | 30 | ||||
-rw-r--r-- | src/doc_reform/meta/metadoc_harvests_authors.d | 255 | ||||
-rw-r--r-- | src/doc_reform/meta/metadoc_harvests_topics.d | 408 |
5 files changed, 709 insertions, 16 deletions
diff --git a/src/doc_reform/meta/defaults.d b/src/doc_reform/meta/defaults.d index fc5e5d1..4a4ae8f 100644 --- a/src/doc_reform/meta/defaults.d +++ b/src/doc_reform/meta/defaults.d @@ -87,6 +87,34 @@ template DocReformNode() { return _node; } } +template DocReformHarvest() { + auto DocReformHarvest() { + struct _Harvest { + struct Harvest { + string title = ""; + string[] author_arr = []; + string author = ""; + string author_surname = ""; + string author_surname_fn = ""; + string language = ""; + string language_original = ""; + string uid = ""; + string date_published = ""; + string[] topic_register_arr = []; + string path_html_seg = ""; + string path_html_scroll = ""; + string path_epub = ""; + string url_html_seg = ""; + string url_html_scroll = ""; + string url_epub = ""; + } + Harvest harvest; + Harvest[] harvests; + Harvest[][string][string][string][string] subject_trees; + } + return _Harvest(); + } +} template DocReformBiblio() { // required: deemed_author (author || editor); year; fulltitle; struct BibJsnStr { diff --git a/src/doc_reform/meta/metadoc.d b/src/doc_reform/meta/metadoc.d index a26756b..88c4a2b 100644 --- a/src/doc_reform/meta/metadoc.d +++ b/src/doc_reform/meta/metadoc.d @@ -8,6 +8,8 @@ template DocReformAbstraction() { std.process; import doc_reform.meta, + doc_reform.meta.metadoc_harvests_authors, + doc_reform.meta.metadoc_harvests_topics, doc_reform.meta.metadoc_summary, doc_reform.meta.metadoc_harvest, doc_reform.meta.metadoc_from_src, @@ -147,7 +149,7 @@ template DocReformAbstraction() { ~ ":" ~ _st.second.to!string; return _time; } - auto conf_make_meta() { // TODO meld with all make instructions + auto conf_make_meta() { return _make_and_meta_struct; } auto has() { diff --git a/src/doc_reform/meta/metadoc_harvest.d b/src/doc_reform/meta/metadoc_harvest.d index 26f2b38..2a83814 100644 --- a/src/doc_reform/meta/metadoc_harvest.d +++ b/src/doc_reform/meta/metadoc_harvest.d @@ -2,7 +2,7 @@ module doc_reform.meta.metadoc_harvest; template DocReformMetaDocHarvest() { auto DocReformMetaDocHarvest(T,H)( T doc_matters, - H harvest, + H hvst, ) { import doc_reform.meta.defaults, @@ -21,19 +21,19 @@ template DocReformMetaDocHarvest() { mixin InternalMarkup; auto markup = InlineMarkup(); import doc_reform.output.paths_output; - auto pth_html = DocReformPathsHTML!()(doc_matters.output_path, doc_matters.src.language); - harvest.title = doc_matters.conf_make_meta.meta.title_full; - harvest.author = doc_matters.conf_make_meta.meta.creator_author; - harvest.author_surname = doc_matters.conf_make_meta.meta.creator_author_surname; - harvest.author_surname_fn = doc_matters.conf_make_meta.meta.creator_author_surname_fn; - harvest.author_arr = doc_matters.conf_make_meta.meta.creator_author_arr; - harvest.language_original = doc_matters.conf_make_meta.meta.original_language; - harvest.language = doc_matters.src.language; - harvest.uid = doc_matters.src.doc_uid; - harvest.date_published = doc_matters.conf_make_meta.meta.date_published; - harvest.topic_register_arr = doc_matters.conf_make_meta.meta.classify_topic_register_arr; - harvest.path_html_scroll = pth_html.fn_scroll(doc_matters.src.filename); - harvest.path_html_seg = pth_html.fn_seg(doc_matters.src.filename, "toc"); - return harvest; + auto pth_html = DocReformPathsHTML!()(doc_matters.output_path, doc_matters.src.language); + hvst.harvest.title = doc_matters.conf_make_meta.meta.title_full; + hvst.harvest.author = doc_matters.conf_make_meta.meta.creator_author; + hvst.harvest.author_surname = doc_matters.conf_make_meta.meta.creator_author_surname; + hvst.harvest.author_surname_fn = doc_matters.conf_make_meta.meta.creator_author_surname_fn; + hvst.harvest.author_arr = doc_matters.conf_make_meta.meta.creator_author_arr; + hvst.harvest.language_original = doc_matters.conf_make_meta.meta.original_language; + 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_scroll = pth_html.fn_scroll(doc_matters.src.filename); + hvst.harvest.path_html_seg = pth_html.fn_seg(doc_matters.src.filename, "toc"); + return hvst.harvest; } } diff --git a/src/doc_reform/meta/metadoc_harvests_authors.d b/src/doc_reform/meta/metadoc_harvests_authors.d new file mode 100644 index 0000000..d780221 --- /dev/null +++ b/src/doc_reform/meta/metadoc_harvests_authors.d @@ -0,0 +1,255 @@ +module doc_reform.meta.metadoc_harvests_authors; + import + std.algorithm, + std.array, + std.exception, + std.regex, + std.stdio, + std.string, + std.conv : to; + import + doc_reform.meta.defaults, + doc_reform.meta.rgx; + mixin DocReformHarvest; + mixin InternalMarkup; + mixin DocReformRgxInit; +template DocReformMetaDocHarvestsAuthors() { + auto mkup = InlineMarkup(); + void DocReformMetaDocHarvestsAuthors(H,O)( + H harvests, + O _opt_action, + ) { + string[] authors = []; + authors ~= format(q"┃ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>Metadata Harvest - Authors</title> +<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="doc_reform" /> +<link rel="generator" href="http://sisudoc.org" /> +<link href="../../_sisu/css/harvest.css" rel="stylesheet"> +<style TYPE="text/css"> +/* DocReform harvest css default stylesheet */ + body { + color: black; + 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; + } + + .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; + } + h1 { + font-size: 120%%; + font-weight: bold; + color: white; + 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; + color: white; + background: #880000; + } + p.lev0 { + font-size: 120%%; + margin-left: 1em; + color: white; + background: #000000; + } + + p.lev1 { + font-size: 110%%; + margin-left: 2em; + color: white; + background: #444444; + } + p.lev2 { + font-size: 100%%; + margin-left: 3em; + background: #888888; + } + p.lev3 { + font-size: 90%%; + margin-left: 4em; + background: #bbbbbb; + } + p.lev4 { + font-size: 80%%; + margin-left: 5em; + background: #eeeeee; + } + p.lev5 { + font-size: 80%%; + margin-left: 6em; + } +</style> +<link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> +</head> +<body lang="en" xml:lang="en"> +<a name="top" id="top"></a> +<a name="up" id="up"></a> +<a name="start" id="start"></a> +<h1>Metadata Harvest - Authors (output organised by language & filetype)</h1> +<p>[<a href="../../index.html"> HOME </a>] also see <a href="topics.html">Metadata Harvest - Topics</a></p> +<p></p> +<hr /> +<p class="tiny"><a href="../../en/manifest/authors.html">English</a> </p> +<hr /> +<p><a href="#A">A</a>, <a href="#B">B</a>, <a href="#C">C</a>, <a href="#D">D</a>, <a href="#E">E</a>, <a href="#F">F</a>, <a href="#G">G</a>, <a href="#H">H</a>, <a href="#I">I</a>, <a href="#J">J</a>, <a href="#K">K</a>, <a href="#L">L</a>, <a href="#M">M</a>, <a href="#N">N</a>, <a href="#O">O</a>, <a href="#P">P</a>, <a href="#Q">Q</a>, <a href="#R">R</a>, <a href="#S">S</a>, <a href="#T">T</a>, <a href="#U">U</a>, <a href="#V">V</a>, <a href="#W">W</a>, <a href="#X">X</a>, <a href="#Y">Y</a>, <a href="#Z">Z</a>, +┃") ~ "\n"; + string[string] _au; + string[] _auth_date_title; + string[] _author_date_title; + string _prev_auth = ""; + char _prev_k = "_".to!char; + foreach(doc_harvest; + harvests + .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_harvest.author_surname_fn != _prev_auth) { + _au[doc_harvest.author_surname_fn] + = format(q"┃<p class="author"><a name="%s">%s</a></p> <p class="publication">%s "<a href="%s">%s</a>" [%s]</p>┃", + doc_harvest.author_surname, + doc_harvest.author_surname_fn, + (doc_harvest.date_published.length > 0) + ? doc_harvest.date_published : "", + "url", + doc_harvest.title, + doc_harvest.language, + ); + _prev_auth = doc_harvest.author_surname_fn; + } else { + _au[doc_harvest.author_surname_fn] + ~= format(q"┃<p class="publication">%s "<a href="%s">%s</a>" [%s]</p>┃", + (doc_harvest.date_published.length > 0) + ? doc_harvest.date_published : "", + "url", + doc_harvest.title, + doc_harvest.language, + ); + } + _author_date_title ~= format(q"┃%s %s "%s" [%s]┃", + doc_harvest.author_surname_fn, + (doc_harvest.date_published.length > 0) + ? "(" ~ doc_harvest.date_published ~ ")" : "", + doc_harvest.title, + doc_harvest.language, + ); + } + foreach (k; _au.keys.sort) { + if (k.toUpper.to!(char[])[0] != _prev_k) { + authors ~= format(q"┃<p class="letter"><a name="%s">%s</a></p><p class="book_index_lev1"><a name="a"></a></p>┃", + k.toUpper.to!(char[])[0], + k.toUpper.to!(char[])[0], + ); + _prev_k = k.toUpper.to!(char[])[0]; + } + authors ~= _au[k]; + } + authors + ~= 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"; + try { + auto f = File("authors.html", "w"); + foreach (o; authors) { + f.writeln(o); + } + } catch (ErrnoException ex) { + // Handle error + } + if (_opt_action.verbose + || _opt_action.very_verbose + ) { + foreach(_adt; _author_date_title.sort) { + writeln(_adt); + } + } + } +} diff --git a/src/doc_reform/meta/metadoc_harvests_topics.d b/src/doc_reform/meta/metadoc_harvests_topics.d new file mode 100644 index 0000000..f0aed57 --- /dev/null +++ b/src/doc_reform/meta/metadoc_harvests_topics.d @@ -0,0 +1,408 @@ +module doc_reform.meta.metadoc_harvests_topics; + import + std.algorithm, + std.array, + std.exception, + std.regex, + std.stdio, + std.string, + std.conv : to; + import + doc_reform.meta.defaults, + doc_reform.meta.rgx; + mixin DocReformHarvest; + mixin InternalMarkup; + mixin DocReformRgxInit; +template DocReformMetaDocHarvestsTopics() { + auto mkup = InlineMarkup(); + void DocReformMetaDocHarvestsTopics(H,O)( + H hvst, + O _opt_action, + ) { + auto min_repeat_number = 42; + string[] _document_topic_register; + string[] _topic_register; + string[] _sub_topic_register; + string[] topics = []; + string _auth = ""; + foreach(k, doc_harvest; hvst.harvests) { + _topic_register = []; + foreach(topic; doc_harvest.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_harvest; + break; + case 2: + hvst.subject_trees[subject_tree[0]][subject_tree[1]]["_a"]["_a"] ~= doc_harvest; + break; + case 3: + hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]]["_a"] ~= doc_harvest; + break; + case 4: + hvst.subject_trees[subject_tree[0]][subject_tree[1]][subject_tree[2]][subject_tree[3]] ~= doc_harvest; + break; + default: + break; + } + _topic_register ~= _sub_topic_register.join("\n"); + } + auto char_repeat_number = (doc_harvest.title.length + + doc_harvest.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_harvest.title, + doc_harvest.author, + (doc_harvest.date_published.length > 0) ? " (" ~ doc_harvest.date_published ~ ")" : "", + _topic_register.sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable).release.join("\n"), + ); + } + topics ~= format(q"┃<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>Metadata Harvest - Topics</title> +<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="doc_reform" /> +<link rel="generator" href="http://sisudoc.org" /> +<link href="../../_sisu/css/harvest.css" rel="stylesheet"> +<style TYPE="text/css"> +/* DocReform harvest css default stylesheet */ + body { + color: black; + 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; + } + + .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; + } + h1 { + font-size: 120%%; + font-weight: bold; + color: white; + 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; + color: white; + background: #880000; + } + p.lev0 { + font-size: 120%%; + margin-left: 1em; + color: white; + background: #000000; + } + + p.lev1 { + font-size: 110%%; + margin-left: 2em; + color: white; + background: #444444; + } + p.lev2 { + font-size: 100%%; + margin-left: 3em; + background: #888888; + } + p.lev3 { + font-size: 90%%; + margin-left: 4em; + background: #bbbbbb; + } + p.lev4 { + font-size: 80%%; + margin-left: 5em; + background: #eeeeee; + } + p.lev5 { + font-size: 80%%; + margin-left: 6em; + } +</style> +<link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> +</head> +<body lang="en" xml:lang="en"> +<a name="top" id="top"></a> +<a name="up" id="up"></a> +<a name="start" id="start"></a> +<h1>Metadata Harvest - Topics (output organised by language & filetype)</h1> +<p>[<a href="../../index.html"> HOME </a>] also see <a href="authors.html">Metadata Harvest - Authors</a></p> +<p><a href="#A">A</a>, <a href="#B">B</a>, <a href="#C">C</a>, <a href="#D">D</a>, <a href="#E">E</a>, <a href="#F">F</a>, <a href="#G">G</a>, <a href="#H">H</a>, <a href="#I">I</a>, <a href="#J">J</a>, <a href="#K">K</a>, <a href="#L">L</a>, <a href="#M">M</a>, <a href="#N">N</a>, <a href="#O">O</a>, <a href="#P">P</a>, <a href="#Q">Q</a>, <a href="#R">R</a>, <a href="#S">S</a>, <a href="#T">T</a>, <a href="#U">U</a>, <a href="#V">V</a>, <a href="#W">W</a>, <a href="#X">X</a>, <a href="#Y">Y</a>, <a href="#Z">Z</a>, +<p></p> +<hr /> +<p class="tiny"><a href="../../en/manifest/topics.html">English</a> </p> +<hr /> +┃") ~ "\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"┃<p class="letter"><a name="%s">%s</a></p><p class="book_index_lev1"><a name="a"></a></p>┃", + k0.toUpper.to!(char[])[0], + k0.toUpper.to!(char[])[0], + ); + _prev_k = k0.toUpper.to!(char[])[0]; + } + if (k0 != "_a") { + topics ~= format(q"┃<p class="lev0"><a name="%s">%s</a></p>┃", + k0, k0,) ~ "\n"; + if (_opt_action.very_verbose) { + 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"┃ <a href="authors.html#%s">%s</a>┃", + t_a_.author_surname, + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃", + t_a_.author_surname, + a, + ); + } + } + topics ~= format(q"┃<p class="work"><a href="%s">"%s"</a> -%s┃", + "url", + t_a_.title, + _auth, + ) ~ "\n"; + if (_opt_action.very_verbose) { + 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"┃<p class="lev1"><a name="%s">%s</a></p>┃", + k1, k1,) ~ "\n"; + if (_opt_action.very_verbose) { + 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"┃ <a href="authors.html#%s">%s</a>┃", + t_a_.author_surname, + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃", + t_a_.author_surname, + a, + ); + } + } + topics ~= format(q"┃<p class="work"><a href="%s">%s</a> -%s┃", + "url", + t_a_.title, + _auth, + ) ~ "\n"; + if (_opt_action.very_verbose) { + 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"┃<p class="lev2"><a name="%s">%s</a></p>┃", + k2, k2,) ~ "\n"; + if (_opt_action.very_verbose) { + 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"┃ <a href="authors.html#%s">%s</a>┃", + t_a_.author_surname, + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃", + t_a_.author_surname, + a, + ); + } + } + topics ~= format(q"┃<p class="work"><a href="%s">%s</a> -%s┃", + "url", + t_a_.title, + _auth, + ) ~ "\n"; + if (_opt_action.very_verbose) { + 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"┃<p class="lev3"><a name="%s">%s</a></p>┃", + k3, k3,) ~ "\n"; + if (_opt_action.very_verbose) { + 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"┃<a href="authors.html#%s">%s</a>┃", + t_a_.author_surname, + t_a_.author, + ); + } else { + foreach (a; t_a_.author_arr) { + _auth ~= format(q"┃ <a href="authors.html#%s">%s</a>,┃", + t_a_.author_surname, + a, + ); + } + } + topics ~= format(q"┃ <p class="work"><a href="%s">%s</a> -%s┃", + "url", + t_a_.title, + _auth, + ) ~ "\n"; + if (_opt_action.very_verbose) { + writeln(" - ", t_a_.title, " - ", t_a_.author); + } + } + } + } + } + } + } + } + } + topics + ~= 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"; + try { + auto f = File("topics.html", "w"); + foreach (o; topics) { + f.writeln(o); + } + } catch (ErrnoException ex) { + // Handle error + } + } +} |