/+
- 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 - 2024 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.metadata;
@safe:
template outputMetadata() {
  void outputMetadata(T)( T  doc_matters) {
    string inline_search_form(M)(
      M  doc_matters,
    ) {
      string o;
      string _form;
      if (doc_matters.opt.action.html_link_search) {
        o = format(q"┃
        <div class="flex-menu-option">
          <!-- SiSU Spine Search -->
          <form action="%s" target="_top" method="POST" accept-charset="UTF-8" id="searchtxt">
          &nbsp;&nbsp;<font size="2">%s&nbsp;
          <input type="text" name="sf" size="24" maxlength="255">%s
          <input type="hidden" name="sml" value="1000">
          <input type="hidden" name="ec" value="on">
          <input type="hidden" name="url" value="on">
          <input type="hidden" name="rt" value="txt">
          <button type="submit" form="searchtxt" name="fn" value="%s">&nbsp;• ⚏&nbsp;</button>
          </font></form>
          <!-- SiSU Spine Search -->
        </div>
    <div class="flex-menu-option">
    <!-- SiSU Spine Search -->
    <form action="%s" target="_top" method="POST" accept-charset="UTF-8" id="search">
    <font size="2">
    <input type="text" name="sf" size="24" maxlength="255">%s
    <input type="hidden" name="sml" value="1000">
    <input type="hidden" name="ec" value="on">
    <input type="hidden" name="url" value="on">
    <button type="submit" form="search" name="fn" value="%s">• ፨</button>
    <button type="submit" form="search">㏈ ፨</button>
    </font></form>
    <!-- SiSU Spine Search -->
    </div>┃",
        doc_matters.conf_make_meta.conf.w_srv_cgi_action,
        (doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename.empty)
          ? ""
          : "\n    <a href=\""
            ~ doc_matters.conf_make_meta.conf.w_srv_cgi_action
            ~ "\">&#x1f50e;&nbsp;</a>",
        (doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename.empty)
          ? ""
          : "\n    <input type=\"hidden\" name=\"db\" value=\""
            ~ doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename
            ~ "\">",
        doc_matters.src.filename_base,
        doc_matters.conf_make_meta.conf.w_srv_cgi_action,
        (doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename.empty)
          ? ""
          : "\n    <input type=\"hidden\" name=\"db\" value=\""
            ~ doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename
            ~ "\">",
        doc_matters.src.filename_base,
        );
      } else {
        o = "";
      }
      return o;
    }
    import
      std.file,
      std.format;
    import sisudoc.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;
  }
  a.lnkicon:link {
    text-decoration          : none;
  }
  a.lnkicon:visited {
    text-decoration          : none;
  }
  a.lnkicon:hover {
    font-size                : 160%%;
  }
  a:hover img {
    background-color         : #FFFFFF;
  }
  input {
    color                    : #FFFFFF;
    background-color         : #777777;
  }
┃");
string theme_light_0 = format(q"┃
  body {
    color                    : #000000;
    background               : #FFFFFF;
    background-color         : #FFFFFF;
  }
  a:link {
    color                    : #003399;
    text-decoration          : none;
  }
  a:visited {
    color                    : #003399;
    text-decoration          : none;
  }
  a:hover {
    color                    : #000000;
    background-color         : #f9f9aa;
  }
  a:hover img {
    background-color         : #FFFFFF;
  }
  a:active {
    color                    : #003399;
    text-decoration          : underline;
  }
  a.lnkicon:link {
    text-decoration          : none;
  }
  a.lnkicon:visited {
    text-decoration          : none;
  }
  a.lnkicon:hover {
    font-size                : 160%%;
  }
  a:hover img {
    background-color         : #FFFFFF;
  }
  input {
    color                    : #000000;
    background-color         : #FFFFFF;
  }
┃");
string theme_dark_1 = format(q"┃
  h1 {
    color                    : #FFFFFF;
    background               : #000000;
  }
  p.letter {
    color                    : #FFFFFF;
    background               : #333333;
  }
┃");
string theme_light_1 = format(q"┃
  h1 {
    color                    : #FFFFFF;
    background               : #1A3A7A;
  }
  p.letter {
    color                    : #FFFFFF;
    background               : #1A3A7A;
  }
┃");
      metadata_ ~= format(q"┃<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>⌘ Curated metadata - Topics</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="dc.title" content= "metadata curate, Authors & Topics - information Structuring Universe, Structured information Serialised Units" />
<meta name="dc.subject" content= "document structuring, ebook, publishing, PDF, LaTeX, XML, ODF, SQL, postgresql, sqlite, electronic book, electronic publishing, electronic document, electronic citation, data structure, citation systems, granular search, digital library" />
<meta name="generator" content="spine" />
<link rel="generator" href="https://sisudoc.org" />
<link href="./css/curate.css" rel="stylesheet">
<style TYPE="text/css">
/* spine curate css default stylesheet */%s
  .norm, .bold {
    line-height              : 150%%;
    margin-left              : 1em;
    margin-right             : 2em;
    margin-top               : 10px;
    margin-bottom            : 0px;
    text-indent              : 0mm;
  }
  p, h0, h1, h2, h3, h4, h5, h6, h7 {
    display                  : block;
    font-family              : verdana, arial, georgia, tahoma, sans-serif, helvetica, times, roman;
    font-size                : 100%%;
    font-weight              : normal;
    line-height              : 150%%;
    /* text-align            : justify; */
    margin-left              : 1em;
    text-indent              : 0mm;
    margin-top               : 2px;
    margin-bottom            : 2px;
    margin-right             : 6px;
    text-align               : left;
  }
  h0, h1, h2, h3, h4, h5, h6, h7 { text-shadow: .2em .2em .3em #999999; }
  h1 {
    font-size                : 120%%;
    font-weight              : bold;
    color                    : #FFFFFF;
    background               : #000088;
    margin-left              : 0em;
  }
  p.work {
    font-size                : 80%%;
    margin-left              : 5em;
    margin-top               : 0px;
    margin-bottom            : 0px;
    margin-right             : 6px;
    text-align               : left;
  }
  p.author {
    font-size                : 100%%;
    margin-left              : 2em;
    margin-top               : 0px;
    margin-bottom            : 0px;
    margin-right             : 6px;
    text-align               : left;
  }
  p.publication {
    font-size                : 80%%;
    margin-left              : 4em;
    margin-top               : 0px;
    margin-bottom            : 0px;
    margin-right             : 6px;
    text-align               : left;
  }
  p.letter {
    font-weight              : bold;
    font-size                : 60%%;
    margin-left              : 1em;
    margin-top               : 0px;
    margin-bottom            : 0px;
    margin-right             : 6px;
    text-align               : left;
  }
  p.icons, .icons_center {
    font-size                : 100%%;
    margin-top               : 0px;
    margin-bottom            : 0px;
    margin-right             : 6px;
  }
  p.icons {
    text-align               : left;
  }
  p.lev0 {
    font-size                : 120%%;
    margin-left              : 1em;
  }
  p.lev1 {
    font-size                : 110%%;
    margin-left              : 2em;
  }
  p.lev2 {
    font-size                : 100%%;
    margin-left              : 3em;
  }
  p.lev3 {
    font-size                : 90%%;
    margin-left              : 4em;
  }
  p.lev4 {
    font-size                : 80%%;
    margin-left              : 5em;
  }
  p.lev5 {
    font-size                : 80%%;
    margin-left              : 6em;
  }%s
  /* flex */
  .flex-menu-bar {
    display                  : -webkit-flex;
    display                  : flex;
    -webkit-flex-wrap        : wrap;
    -webkit-align-items      : center;
    align-items              : center;
    width                    : 100%%;
    margin-left              : 0%%;
    margin-right             : 2%%;
    background-color         : inherited;
  }
  .flex-menu-option {
    background-color         : inherited;
    margin-right             : 4px;
  }
  .flex-list {
    display                  : -webkit-flex;
    display                  : flex;
    -webkit-align-items      : center;
    display                  : block;
    align-items              : center;
    width                    : 100%%;
    background-color         : inherited;
  }
  .flex-list-item {
    background-color         : inherited;
    margin                   : 4px;
  }
</style>
<link rel="shortcut icon" href="../_sisu/image/rb7.ico" />
</head>
┃",
  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_) {
      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);
          }
        }
        if (!exists(pth_html.base ~ "/index.html")) {
          import sisudoc.io_out.html_snippet;
          mixin htmlSnippet;
          auto f = File(pth_html.base ~"/index.html", "w");
          f.writeln(format_html_blank_page_guide_home(
            "../../css/html_scroll.css",
            (doc_matters.opt.action.webserver_url_doc_root.length > 0)
              ? doc_matters.opt.action.webserver_url_doc_root
              : doc_matters.conf_make_meta.conf.w_srv_data_root_url,
            "../../index.html",
          ));
        }
      } catch (ErrnoException ex) {
        // Handle error
      }
      if (doc_matters.opt.action.vox_gt0) {
        writeln(" ", pth_html.fn_scroll("metadata." ~ doc_matters.src.filename));
      }
    }
    static auto mkup = InlineMarkup();
    import sisudoc.io_out.html_snippet;
    mixin htmlSnippet;
    if (doc_matters.opt.action.debug_do) {
      writeln(doc_matters.src.filename_base);
      writeln("Title:       ", doc_matters.conf_make_meta.meta.title_full);
      writeln("  Author:    ", doc_matters.conf_make_meta.meta.creator_author);
      writeln("  Published: ", doc_matters.conf_make_meta.meta.date_published);
      writeln("  Copyright: ", doc_matters.conf_make_meta.meta.rights_copyright);
      writeln("  License:   ", special_characters_text(doc_matters.conf_make_meta.meta.rights_license));
      if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) {
        foreach (topic; doc_matters.conf_make_meta.meta.classify_topic_register_arr.sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable)) {
          string[] subject_tree = topic.split(mkup.sep);
          if (subject_tree.length > 0) { writeln("  ",         subject_tree[0]); }
          if (subject_tree.length > 1) { writeln("    ",       subject_tree[1]); }
          if (subject_tree.length > 2) { writeln("      ",     subject_tree[2]); }
          if (subject_tree.length > 3) { writeln("        ",   subject_tree[3]); }
          if (subject_tree.length > 4) { writeln("          ", subject_tree[4]); }
        }
      }
    }
    auto pth_html = spinePathsHTML!()(doc_matters.output_path, doc_matters.src.language);
    auto pth_epub = spinePathsEPUB!()(doc_matters.output_path, doc_matters.src.language);
    auto pth_pdf  = spinePathsPDF!()(doc_matters);
    auto pth_pod =  spinePathsPods!()(doc_matters);
    metadata_ ~= format(q"┃<body lang="en" xml:lang="en">
    <a name="top" id="top"></a>
    <a name="up" id="up"></a>
    <a name="start" id="start"></a>
    ┃");
    metadata_ ~= "<div class=\"flex-menu-bar\"><div class=\"flex-menu-option\">";
    if (doc_matters.opt.action.html_link_curate) {
      metadata_ ~= format(q"┃<p class="icons">[<a href="%s" class="lnkicon">&nbsp;<b>⟰</b>&nbsp;HOME&nbsp;</a>&nbsp;|&nbsp;<a href="../../index.html" class="lnkicon">&nbsp;≅&nbsp;Collection&nbsp;</a>]&nbsp;&nbsp;[
       <a href="../../authors.html" class="lnkicon">&nbsp;&#x1F58B;&nbsp;Authors&nbsp;</a> |
       <a href="../../topics.html" class="lnkicon">&nbsp;⌘&nbsp;Topics&nbsp;</a>]</p>
    ┃",
    (doc_matters.opt.action.webserver_url_doc_root.length > 0)
      ? doc_matters.opt.action.webserver_url_doc_root
      : doc_matters.conf_make_meta.conf.w_srv_data_root_url
      , // HOME index.html equivalent _cfg.www_url_doc_root,
    );
    } else {
      metadata_ ~= format(q"┃<p class="icons">[<a href="../../../index.html" class="lnkicon">&nbsp;≅&nbsp;<b>HOME</b>&nbsp;</a>&nbsp;<a href="../../index.html" class="lnkicon">&nbsp;≅&nbsp;Collection&nbsp;</a>]
    ┃");
    }
    metadata_ ~= "</div>" ~ inline_search_form(doc_matters) ~ "</div><hr />";
    if (!(doc_matters.conf_make_meta.meta.title_full.empty)) {
      metadata_ ~= "<p class=\"lev0\">Title: <b><a href=\"" ~ doc_matters.src.filename_base ~ "/toc.html\">" ~ doc_matters.conf_make_meta.meta.title_full       ~ "</a></b></p>";
    } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
      writeln("ERROR no Title information provided in document header ", doc_matters.src.filename_base);
    }
    if (!(doc_matters.conf_make_meta.meta.creator_author.empty)) {
      if (doc_matters.opt.action.html_link_curate) {
        metadata_ ~= "<p class=\"lev1\">Author: <b><a href=\"../../authors.html#" ~ doc_matters.conf_make_meta.meta.creator_author_surname.translate([' ' : "_"]) ~ "\">"
                                                   ~ doc_matters.conf_make_meta.meta.creator_author   ~ "</a></b></p>";
      } else {
        metadata_ ~= "<p class=\"lev1\">Author: <b>"
                                                   ~ doc_matters.conf_make_meta.meta.creator_author   ~ "</b></p>";
      }
    } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
      writeln("ERROR no Author information provided in document header ", doc_matters.src.filename_base);
    }
    metadata_ ~= "<p class=\"lev1\">Published: "   ~ doc_matters.conf_make_meta.meta.date_published   ~ "</p>";
    if (!(doc_matters.conf_make_meta.meta.rights_copyright.empty)) {
      metadata_ ~= "<p class=\"lev1\">Copyright: "   ~ special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright) ~ "</p>";
    } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
      writeln("WARNING no Copyright information provided in document header ", doc_matters.src.filename_base);
    }
    if (!(doc_matters.conf_make_meta.meta.rights_license.empty)) {
      metadata_ ~= "<p class=\"lev1\">License:   "   ~ special_characters_text(doc_matters.conf_make_meta.meta.rights_license) ~ "</p>";
    } else if (doc_matters.opt.action.debug_do || doc_matters.opt.action.vox_gt2) {
      writeln("WARNING no License information provided in document header ", doc_matters.src.filename_base);
    }
    if (!(doc_matters.conf_make_meta.meta.notes_summary.empty)) {
      metadata_ ~= "<hr /><p class=\"lev0\">Summary:</p><p class=\"lev1\">"   ~ special_characters_text(doc_matters.conf_make_meta.meta.notes_summary) ~ "</p>";
    } else if (doc_matters.opt.action.debug_do) {
      writeln("WARNING no summary of text provided in document header ", doc_matters.src.filename_base);
    }
    metadata_ ~= "<hr /><p class=\"lev1\">source: "      ~ doc_matters.src.filename_base ~ "</p>";
    if (doc_matters.opt.action.html_link_markup_source) {
      metadata_ ~= "<p class=\"lev1\">●&nbsp;&nbsp;markup source:&nbsp;&nbsp;the&nbsppod&nbsp[<a href=\"../../" ~ pth_pod.internal_base ~ "/" ~ doc_matters.src.filename_base ~ ".zip\" class=\"lnkicon\">"
                   ~ "&nbsp;🫛&nbsp;zipped&nbsp;</a>|&nbsp;"
                   ~ "<a href=\"../../" ~ pth_pod.internal_base ~ "/" ~ doc_matters.src.filename_base ~ "/\" class=\"lnkicon\">"
                   ~ "&nbsp;🫛&nbsp;tree&nbsp;</a>]&nbsp;";
    }
    metadata_ ~= "<p class=\"lev1\">●&nbsp;&nbsp;outputs:&nbsp;&nbsp;[&nbsp;html:&nbsp;<a href=\""    ~ doc_matters.src.filename_base ~ ".html\" class=\"lnkicon\">"
                 ~ "&nbsp;▤&nbsp;scroll&nbsp;</a>&nbsp;"
                 ~ "|<a href=\""    ~ doc_matters.src.filename_base ~ "/toc.html\" class=\"lnkicon\">"
                 ~ "&nbsp;※&nbsp;seg&nbsp;</a>]&nbsp;&nbsp;&nbsp;"
                 ~ "[<a href=\"../../" ~ pth_epub.internal_base ~ "/" ~ doc_matters.src.filename_base ~ "." ~ doc_matters.src.language ~ ".epub\" class=\"lnkicon\">"
                 ~ "&nbsp;◆&nbsp;epub&nbsp;</a>]&nbsp;&nbsp;&nbsp;";
    if ((doc_matters.opt.action.html_link_pdf) || (doc_matters.opt.action.html_link_pdf_a4)) {
      metadata_ ~=  "[&nbsp;pdf:&nbsp;<a href=\"../../pdf/"
                 ~ doc_matters.src.filename_base
                 ~ "." ~ doc_matters.src.language ~ ".a4.portrait.pdf\" class=\"lnkicon\">"
                 ~ "&nbsp;□&nbsp;a4&nbsp;</a>&nbsp"
                 ~ "|<a href=\"../../pdf/"
                 ~ doc_matters.src.filename_base
                 ~ "." ~ doc_matters.src.language ~ ".letter.portrait.pdf\" class=\"lnkicon\">"
                 ~ "&nbsp;□&nbsp;U.S.&nbsp;letter&nbsp;</a>]&nbsp";
    } else if (doc_matters.opt.action.html_link_pdf_a4) {
      metadata_ ~=  "[<a href=\"../../pdf/"
                 ~ doc_matters.src.filename_base
                 ~ "." ~ doc_matters.src.language ~ ".a4.portrait.pdf\" class=\"lnkicon\">"
                 ~ "&nbsp;□&nbsp;pdf&nbsp;(a4)&nbsp;</a>]&nbsp";
    } else if (doc_matters.opt.action.html_link_pdf_letter) {
      metadata_ ~=  "[<a href=\"../../pdf/"
                 ~ doc_matters.src.filename_base
                 ~ "." ~ doc_matters.src.language ~ ".letter.portrait.pdf\" class=\"lnkicon\">"
                 ~ "&nbsp;□&nbsp;pdf&nbsp;(U.S.&nbsp;letter)&nbsp;</a>]&nbsp";
    }
    metadata_ ~=  "</p>";
    if (doc_matters.conf_make_meta.meta.classify_topic_register_arr.length > 0) {
      metadata_ ~= "<hr /><p class=\"lev0\">Topics:</p>";
      string[] _top = ["", "", "", "", ""];
      foreach (topic; doc_matters.conf_make_meta.meta.classify_topic_register_arr.sort!("toUpper(a) < toUpper(b)", SwapStrategy.unstable)) {
        string[] subject_tree = topic.split(mkup.sep);
        if (subject_tree.length > 0) {
          if (subject_tree[0] != _top[0]) {
            _top[0] = subject_tree[0];
            if (doc_matters.opt.action.html_link_curate) {
              metadata_ ~=
                "<p class=\"lev1\"><a href=\"../../topics.html#"
                  ~ subject_tree[0].translate([' ' : "_"]) ~ "\">"
                  ~ subject_tree[0]
                  ~ "</a></p>";
            } else {
              metadata_ ~=
                "<p class=\"lev1\">"  ~ subject_tree[0] ~ "</p>";
            }
          }
          if (subject_tree.length > 1) {
            if (subject_tree[1] != _top[1]) {
              _top[1] = subject_tree[1];
              _top[2] = ""; _top[3] = ""; _top[4] = "";
              if (doc_matters.opt.action.html_link_curate) {
                metadata_ ~=
                  "<p class=\"lev2\"><a href=\"../../topics.html#"
                    ~ subject_tree[0].translate([' ' : "_"]) ~ "."
                    ~ subject_tree[1].translate([' ' : "_"]) ~ "\">"
                    ~ subject_tree[1]
                    ~ "</a></p>";
              } else {
                metadata_ ~=
                  "<p class=\"lev2\">"  ~ subject_tree[1] ~ "</p>";
              }
            }
            if (subject_tree.length > 2) {
              if (subject_tree[2] != _top[2]) {
                _top[2] = subject_tree[2];
                _top[3] = ""; _top[4] = "";
                if (doc_matters.opt.action.html_link_curate) {
                  metadata_ ~=
                    "<p class=\"lev3\"><a href=\"../../topics.html#"
                      ~ subject_tree[0].translate([' ' : "_"]) ~ "."
                      ~ subject_tree[1].translate([' ' : "_"]) ~ "."
                      ~ subject_tree[2].translate([' ' : "_"]) ~ "\">"
                      ~ subject_tree[2]
                      ~ "</a></p>";
                } else {
                  metadata_ ~=
                    "<p class=\"lev3\">"  ~ subject_tree[2] ~ "</p>";
                }
              }
              if (subject_tree.length > 3) {
                if (subject_tree[3] != _top[3]) {
                  _top[3] = subject_tree[3];
                  _top[4] = "";
                  if (doc_matters.opt.action.html_link_curate) {
                    metadata_ ~=
                      "<p class=\"lev4\"><a href=\"../../topics.html#"
                        ~ subject_tree[0].translate([' ' : "_"]) ~ "."
                        ~ subject_tree[1].translate([' ' : "_"]) ~ "."
                        ~ subject_tree[2].translate([' ' : "_"]) ~ "."
                        ~ subject_tree[3].translate([' ' : "_"]) ~ "\">"
                        ~ subject_tree[3]
                        ~ "</a></p>";
                  } else {
                    metadata_ ~=
                      "<p class=\"lev4\">"  ~ subject_tree[3] ~ "</p>";
                  }
                }
                if (subject_tree.length > 4) {
                  if (subject_tree[4] != _top[4]) {
                    _top[4] = subject_tree[4];
                    if (doc_matters.opt.action.html_link_curate) {
                      metadata_ ~=
                        "<p class=\"lev5\"><a href=\"../../topics.html#"
                          ~ subject_tree[0].translate([' ' : "_"]) ~ "."
                          ~ subject_tree[1].translate([' ' : "_"]) ~ "."
                          ~ subject_tree[2].translate([' ' : "_"]) ~ "."
                          ~ subject_tree[3].translate([' ' : "_"]) ~ "."
                          ~ subject_tree[4].translate([' ' : "_"]) ~ "\">"
                          ~ subject_tree[4]
                          ~ "</a></p>";
                    } else {
                      metadata_ ~=
                        "<p class=\"lev5\">"  ~ subject_tree[4] ~ "</p>";
                    }
                  }
                }
              }
            }
          }
        }
      }
    } else if (doc_matters.opt.action.debug_do) {
      writeln("WARNING no topic_register classification of text provided in document header ", doc_matters.src.filename_base);
    }
    metadata_write_output(doc_matters, metadata_);
  }
}