From b861bbb5810c95fe7079c853453ea698ca01f336 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph.amissah@gmail.com>
Date: Tue, 27 Jun 2023 16:53:20 -0400
Subject: icon chars, usability / cosmetic minor fix

---
 org/default_shared.org          | 113 --------------------------
 org/default_shared_snippets.org | 175 ++++++++++++++++++++++++++++++++++++++++
 org/out_curate_metadata.org     |  45 +++++++++--
 org/out_metadata.org            |  66 +++++++++++----
 org/out_xmls.org                |  73 ++---------------
 org/out_xmls_css.org            |  28 +++++++
 6 files changed, 300 insertions(+), 200 deletions(-)
 delete mode 100644 org/default_shared.org
 create mode 100644 org/default_shared_snippets.org

(limited to 'org')

diff --git a/org/default_shared.org b/org/default_shared.org
deleted file mode 100644
index 8e3cbca..0000000
--- a/org/default_shared.org
+++ /dev/null
@@ -1,113 +0,0 @@
--*- mode: org -*-
-#+TITLE:       spine (doc_reform) shared
-#+DESCRIPTION: documents - structuring, publishing in multiple formats & search
-#+FILETAGS:    :spine:default:shared:
-#+AUTHOR:      Ralph Amissah
-#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
-#+COPYRIGHT:   Copyright (C) 2015 - 2023 Ralph Amissah
-#+LANGUAGE:    en
-#+STARTUP:     content hideblocks hidestars noindent entitiespretty
-#+PROPERTY:    header-args  :exports code
-#+PROPERTY:    header-args+ :noweb yes
-#+PROPERTY:    header-args+ :results no
-#+PROPERTY:    header-args+ :cache no
-#+PROPERTY:    header-args+ :padline no
-#+PROPERTY:    header-args+ :mkdirp yes
-#+OPTIONS:     H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
-
-- [[./doc-reform.org][doc-reform.org]]  [[./][org/]]
-
-* shared
-** _module template_ :module:shared:
-
-#+HEADER: :tangle "../src/doc_reform/share/defaults.d"
-#+HEADER: :noweb yes
-#+BEGIN_SRC d
-<<doc_header_including_copyright_and_license>>
-/++
-  shared default settings
-+/
-module doc_reform.share.defaults;
-<<shared_messages>>
-#+END_SRC
-
-** template: messages :messages:
-
-#+NAME: shared_messages
-#+BEGIN_SRC d
-template Msg() {
-  import std.stdio;
-  @safe auto Msg(I)(I doc_matters) {
-    struct Msg_ {
-      void v()(string message) {
-        if (doc_matters.opt.action.vox_gt1) {
-          writeln(message);
-        }
-      }
-      void vv()(string message) {
-        if (doc_matters.opt.action.vox_gt2) {
-          writeln(message);
-        }
-      }
-    }
-    return Msg_();
-  }
-}
-#+END_SRC
-
-* document header including copyright & license
-
-#+NAME: doc_header_including_copyright_and_license
-#+BEGIN_SRC txt
-/+
-- Name: 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 - 2023 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.doc_reform.org]
-    [https://www.sisudoc.org]
-
-  - Git
-    [https://git.sisudoc.org/projects/?p=software/spine.git;a=summary]
-
-+/
-#+END_SRC
-
-* __END__
diff --git a/org/default_shared_snippets.org b/org/default_shared_snippets.org
new file mode 100644
index 0000000..9c3d2cd
--- /dev/null
+++ b/org/default_shared_snippets.org
@@ -0,0 +1,175 @@
+-*- mode: org -*-
+#+TITLE:       spine (doc_reform) shared
+#+DESCRIPTION: documents - structuring, publishing in multiple formats & search
+#+FILETAGS:    :spine:default:shared:
+#+AUTHOR:      Ralph Amissah
+#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
+#+COPYRIGHT:   Copyright (C) 2015 - 2023 Ralph Amissah
+#+LANGUAGE:    en
+#+STARTUP:     content hideblocks hidestars noindent entitiespretty
+#+PROPERTY:    header-args  :exports code
+#+PROPERTY:    header-args+ :noweb yes
+#+PROPERTY:    header-args+ :results no
+#+PROPERTY:    header-args+ :cache no
+#+PROPERTY:    header-args+ :padline no
+#+PROPERTY:    header-args+ :mkdirp yes
+#+OPTIONS:     H:3 num:nil toc:t \n:t ::t |:t ^:nil -:t f:t *:t
+
+- [[./doc-reform.org][doc-reform.org]]  [[./][org/]]
+
+* html snippet
+** _module template_ :module:
+
+#+HEADER: :tangle "../src/doc_reform/io_out/html_snippet.d"
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+<<doc_header_including_copyright_and_license>>
+module doc_reform.io_out.html_snippet;
+template htmlSnippet() {
+  import
+    std.file,
+    std.outbuffer,
+    std.format,
+    std.uri,
+    std.conv : to;
+  import
+    doc_reform.io_out.rgx,
+    doc_reform.meta.rgx_files,
+    doc_reform.io_out.rgx_xhtml;
+  auto format_html_blank_page_guide_home()(
+    string css_style,
+    string home_url,
+    string collection_home_path
+  ) {
+    auto html_blank_default = format(q"┃<!DOCTYPE html>
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/plain; charset=UTF-8" />
+    <link href="%s" rel="stylesheet" />
+  </head>
+  <body>
+    <p class="icons">
+      <a href="%s" class="lnkicon">⟰&nbsp;</a>&nbsp;
+      <a href="%s" class="lnkicon">&nbsp;≅&nbsp;</a>
+    </p>
+  </body>
+</html>┃",
+      css_style,
+      home_url,
+      collection_home_path
+    );
+    return html_blank_default;
+  }
+  @safe string special_characters_text(string _txt) {
+    mixin spineRgxOut;
+    mixin spineRgxXHTML;
+    static auto rgx = RgxO();
+    static auto rgx_xhtml = RgxXHTML();
+    _txt = _txt
+      .replaceAll(rgx_xhtml.ampersand,    "&amp;")  // "&#38;"
+      .replaceAll(rgx_xhtml.quotation,    "&quot;") // "&#34;"
+      .replaceAll(rgx_xhtml.less_than,    "&lt;")   // "&#60;"
+      .replaceAll(rgx_xhtml.greater_than, "&gt;")   // "&#62;"
+      .replaceAll(rgx.br_line,            "<br />")
+      .replaceAll(rgx.br_line_inline,     "<br />")
+      .replaceAll(rgx.br_line_spaced,     "<br />\n<br />")
+      .replaceAll(rgx.nbsp_char,          " ");
+    return _txt;
+  }
+}
+#+END_SRC
+
+* shared
+** _module template_ :module:shared:
+
+#+HEADER: :tangle "../src/doc_reform/share/defaults.d"
+#+HEADER: :noweb yes
+#+BEGIN_SRC d
+<<doc_header_including_copyright_and_license>>
+/++
+  shared default settings
++/
+module doc_reform.share.defaults;
+<<shared_messages>>
+#+END_SRC
+
+** template: messages :messages:
+
+#+NAME: shared_messages
+#+BEGIN_SRC d
+template Msg() {
+  import std.stdio;
+  @safe auto Msg(I)(I doc_matters) {
+    struct Msg_ {
+      void v()(string message) {
+        if (doc_matters.opt.action.vox_gt1) {
+          writeln(message);
+        }
+      }
+      void vv()(string message) {
+        if (doc_matters.opt.action.vox_gt2) {
+          writeln(message);
+        }
+      }
+    }
+    return Msg_();
+  }
+}
+#+END_SRC
+
+* document header including copyright & license
+
+#+NAME: doc_header_including_copyright_and_license
+#+BEGIN_SRC txt
+/+
+- Name: 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 - 2023 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.doc_reform.org]
+    [https://www.sisudoc.org]
+
+  - Git
+    [https://git.sisudoc.org/projects/?p=software/spine.git;a=summary]
+
++/
+#+END_SRC
+
+* __END__
diff --git a/org/out_curate_metadata.org b/org/out_curate_metadata.org
index 0dd74cd..8f94577 100644
--- a/org/out_curate_metadata.org
+++ b/org/out_curate_metadata.org
@@ -233,13 +233,13 @@ foreach(k, doc_curate; hvst.curates) {
 <h1>⌘ Curated metadata - ⌘ Topics (output organised by language &amp; filetype)</h1>
 <div class="flex-menu-bar">
 <div class="flex-menu-option">
-<p>[<a href="../../index.html">&nbsp;⟰&nbsp;HOME&nbsp;</a>&nbsp;|&nbsp;<a href="../index.html">&nbsp;≅&nbsp;Collection&nbsp;</a>]
- [<a href="authors.html">&nbsp;⌘&nbsp;Curated&nbsp;metadata&nbsp;-&nbsp;&#x1F58B;&nbsp;Authors&nbsp;</a>]
+<p class="icons">[<a href="../../index.html" class="lnkicon">&nbsp;⟰&nbsp;HOME&nbsp;</a>&nbsp;|&nbsp;<a href="../index.html" class="lnkicon">&nbsp;≅&nbsp;Collection&nbsp;</a>]
+ [<a href="authors.html" class="lnkicon">&nbsp;⌘&nbsp;Curated&nbsp;metadata&nbsp;-&nbsp;&#x1F58B;&nbsp;Authors&nbsp;</a>]
 </p>
 </div>
  %s
 </div>
-<p><a href="#A">A</a>,&nbsp;<a href="#B">B</a>,&nbsp;<a href="#C">C</a>,&nbsp;<a href="#D">D</a>,&nbsp;<a href="#E">E</a>,&nbsp;<a href="#F">F</a>,&nbsp;<a href="#G">G</a>,&nbsp;<a href="#H">H</a>,&nbsp;<a href="#I">I</a>,&nbsp;<a href="#J">J</a>,&nbsp;<a href="#K">K</a>,&nbsp;<a href="#L">L</a>,&nbsp;<a href="#M">M</a>,&nbsp;<a href="#N">N</a>,&nbsp;<a href="#O">O</a>,&nbsp;<a href="#P">P</a>,&nbsp;<a href="#Q">Q</a>,&nbsp;<a href="#R">R</a>,&nbsp;<a href="#S">S</a>,&nbsp;<a href="#T">T</a>,&nbsp;<a href="#U">U</a>,&nbsp;<a href="#V">V</a>,&nbsp;<a href="#W">W</a>,&nbsp;<a href="#X">X</a>,&nbsp;<a href="#Y">Y</a>,&nbsp;<a href="#Z">Z</a>,&nbsp;
+<p><a href="#A" class="lnkicon">A</a>,&nbsp;<a href="#B" class="lnkicon">B</a>,&nbsp;<a href="#C" class="lnkicon">C</a>,&nbsp;<a href="#D" class="lnkicon">D</a>,&nbsp;<a href="#E" class="lnkicon">E</a>,&nbsp;<a href="#F" class="lnkicon">F</a>,&nbsp;<a href="#G" class="lnkicon">G</a>,&nbsp;<a href="#H" class="lnkicon">H</a>,&nbsp;<a href="#I" class="lnkicon">I</a>,&nbsp;<a href="#J" class="lnkicon">J</a>,&nbsp;<a href="#K" class="lnkicon">K</a>,&nbsp;<a href="#L" class="lnkicon">L</a>,&nbsp;<a href="#M" class="lnkicon">M</a>,&nbsp;<a href="#N" class="lnkicon">N</a>,&nbsp;<a href="#O" class="lnkicon">O</a>,&nbsp;<a href="#P" class="lnkicon">P</a>,&nbsp;<a href="#Q" class="lnkicon">Q</a>,&nbsp;<a href="#R" class="lnkicon">R</a>,&nbsp;<a href="#S" class="lnkicon">S</a>,&nbsp;<a href="#T" class="lnkicon">T</a>,&nbsp;<a href="#U" class="lnkicon">U</a>,&nbsp;<a href="#V" class="lnkicon">V</a>,&nbsp;<a href="#W" class="lnkicon">W</a>,&nbsp;<a href="#X" class="lnkicon">X</a>,&nbsp;<a href="#Y" class="lnkicon" class="lnkicon">Y</a>,&nbsp;<a href="#Z" class="lnkicon">Z</a>,&nbsp;
 <p></p>
 <hr />
 #+END_SRC
@@ -528,14 +528,14 @@ template spineMetaDocCuratesAuthors() {
 <h1>⌘ Curated metadata - &#x1F58B; Authors (output organised by language &amp; filetype)</h1>
 <div class="flex-menu-bar">
 <div class="flex-menu-option">
-<p>[<a href="../../index.html">&nbsp;⟰&nbsp;HOME&nbsp;</a>&nbsp;|&nbsp;<a href="../index.html">&nbsp;≅&nbsp;Collection&nbsp;</a>]
- [<a href="topics.html">&nbsp;⌘&nbsp;Curated&nbsp;metadata&nbsp;-&nbsp;⌘&nbsp;Topics&nbsp;</a>] </p>
+<p class="icons">[<a href="../../index.html" class="lnkicon">&nbsp;⟰&nbsp;HOME&nbsp;</a>&nbsp;|&nbsp;<a href="../index.html" class="lnkicon">&nbsp;≅&nbsp;Collection&nbsp;</a>]
+ [<a href="topics.html" class="lnkicon">&nbsp;⌘&nbsp;Curated&nbsp;metadata&nbsp;-&nbsp;⌘&nbsp;Topics&nbsp;</a>] </p>
 </div>
 %s
 </div>
 <p></p>
 <hr />
-<p><a href="#A">A</a>,&nbsp;<a href="#B">B</a>,&nbsp;<a href="#C">C</a>,&nbsp;<a href="#D">D</a>,&nbsp;<a href="#E">E</a>,&nbsp;<a href="#F">F</a>,&nbsp;<a href="#G">G</a>,&nbsp;<a href="#H">H</a>,&nbsp;<a href="#I">I</a>,&nbsp;<a href="#J">J</a>,&nbsp;<a href="#K">K</a>,&nbsp;<a href="#L">L</a>,&nbsp;<a href="#M">M</a>,&nbsp;<a href="#N">N</a>,&nbsp;<a href="#O">O</a>,&nbsp;<a href="#P">P</a>,&nbsp;<a href="#Q">Q</a>,&nbsp;<a href="#R">R</a>,&nbsp;<a href="#S">S</a>,&nbsp;<a href="#T">T</a>,&nbsp;<a href="#U">U</a>,&nbsp;<a href="#V">V</a>,&nbsp;<a href="#W">W</a>,&nbsp;<a href="#X">X</a>,&nbsp;<a href="#Y">Y</a>,&nbsp;<a href="#Z">Z</a>,&nbsp;
+<p><a href="#A" class="lnkicon">A</a>,&nbsp;<a href="#B" class="lnkicon">B</a>,&nbsp;<a href="#C" class="lnkicon">C</a>,&nbsp;<a href="#D" class="lnkicon">D</a>,&nbsp;<a href="#E" class="lnkicon">E</a>,&nbsp;<a href="#F" class="lnkicon">F</a>,&nbsp;<a href="#G" class="lnkicon">G</a>,&nbsp;<a href="#H" class="lnkicon">H</a>,&nbsp;<a href="#I" class="lnkicon">I</a>,&nbsp;<a href="#J" class="lnkicon">J</a>,&nbsp;<a href="#K" class="lnkicon">K</a>,&nbsp;<a href="#L" class="lnkicon">L</a>,&nbsp;<a href="#M" class="lnkicon">M</a>,&nbsp;<a href="#N" class="lnkicon">N</a>,&nbsp;<a href="#O" class="lnkicon">O</a>,&nbsp;<a href="#P" class="lnkicon">P</a>,&nbsp;<a href="#Q" class="lnkicon">Q</a>,&nbsp;<a href="#R" class="lnkicon">R</a>,&nbsp;<a href="#S" class="lnkicon">S</a>,&nbsp;<a href="#T" class="lnkicon">T</a>,&nbsp;<a href="#U" class="lnkicon">U</a>,&nbsp;<a href="#V" class="lnkicon">V</a>,&nbsp;<a href="#W" class="lnkicon">W</a>,&nbsp;<a href="#X" class="lnkicon">X</a>,&nbsp;<a href="#Y" class="lnkicon">Y</a>,&nbsp;<a href="#Z" class="lnkicon">Z</a>,&nbsp;
 #+END_SRC
 
 *** curated authors html theme inserts
@@ -675,6 +675,18 @@ string theme_dark_0 = format(q"┃
     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%%;
   }
@@ -722,6 +734,18 @@ string theme_light_0 = format(q"┃
   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%%;
   }
@@ -908,6 +932,15 @@ string theme_light_1 = format(q"┃
     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;
diff --git a/org/out_metadata.org b/org/out_metadata.org
index 457fbd1..7002117 100644
--- a/org/out_metadata.org
+++ b/org/out_metadata.org
@@ -90,9 +90,9 @@ metadata_ ~= format(q"┃<body lang="en" xml:lang="en">
 ┃");
 metadata_ ~= "<div class=\"flex-menu-bar\"><div class=\"flex-menu-option\">";
 if (doc_matters.opt.action.html_link_curate) {
-  metadata_ ~= format(q"┃<p>[<a href="%s">&nbsp;<b>⟰</b>&nbsp;HOME&nbsp;</a>&nbsp;|&nbsp;<a href="../../index.html">&nbsp;≅&nbsp;Collection&nbsp;</a>]&nbsp;&nbsp;[
-   <a href="../../authors.html">&nbsp;&#x1F58B;&nbsp;Authors&nbsp;</a> |
-   <a href="../../topics.html">&nbsp;⌘&nbsp;Topics&nbsp;</a>]</p>
+  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
@@ -100,7 +100,7 @@ if (doc_matters.opt.action.html_link_curate) {
   , // HOME index.html equivalent _cfg.www_url_doc_root,
 );
 } else {
-  metadata_ ~= format(q"┃<p>[<a href="../../../index.html">&nbsp;≅&nbsp;<b>HOME</b>&nbsp;</a>&nbsp;<a href="../../index.html">&nbsp;≅&nbsp;Collection&nbsp;</a>]
+  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 />";
@@ -138,35 +138,35 @@ if (!(doc_matters.conf_make_meta.meta.notes_summary.empty)) {
 }
 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\">"
+  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 ~ "/\">"
+               ~ "<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\">"
+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\">"
+             ~ "|<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\">"
+             ~ "[<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\">"
+             ~ "." ~ 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\">"
+             ~ "." ~ 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\">"
+             ~ "." ~ 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\">"
+             ~ "." ~ doc_matters.src.language ~ ".letter.portrait.pdf\" class=\"lnkicon\">"
              ~ "&nbsp;□&nbsp;pdf&nbsp;(U.S.&nbsp;letter)&nbsp;</a>]&nbsp";
 }
 metadata_ ~=  "</p>";
@@ -337,6 +337,18 @@ string theme_dark_0 = format(q"┃
     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;
@@ -367,6 +379,18 @@ string theme_light_0 = format(q"┃
     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;
@@ -491,6 +515,15 @@ string theme_light_1 = format(q"┃
     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;
@@ -589,7 +622,7 @@ string theme_light_1 = 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">&#x1f50e;&nbsp;
+      &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">
@@ -613,6 +646,11 @@ string theme_light_1 = format(q"┃
 <!-- 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=\""
diff --git a/org/out_xmls.org b/org/out_xmls.org
index 7cec142..06fd5d8 100644
--- a/org/out_xmls.org
+++ b/org/out_xmls.org
@@ -23,67 +23,6 @@
 2023
 #+END_SRC
 
-* html snippet
-** _module template_ :module:
-
-#+HEADER: :tangle "../src/doc_reform/io_out/html_snippet.d"
-#+HEADER: :noweb yes
-#+BEGIN_SRC d
-<<doc_header_including_copyright_and_license>>
-module doc_reform.io_out.html_snippet;
-template htmlSnippet() {
-  import
-    std.file,
-    std.outbuffer,
-    std.format,
-    std.uri,
-    std.conv : to;
-  import
-    doc_reform.io_out.rgx,
-    doc_reform.meta.rgx_files,
-    doc_reform.io_out.rgx_xhtml;
-  auto format_html_blank_page_guide_home()(
-    string css_style,
-    string home_url,
-    string collection_home_path
-  ) {
-    auto html_blank_default = format(q"┃<!DOCTYPE html>
-<html>
-  <head>
-    <meta http-equiv="Content-Type" content="text/plain; charset=UTF-8" />
-    <link href="%s" rel="stylesheet" />
-  </head>
-  <body>
-    <p class="heading">
-      <a href="%s">⟰&nbsp;</a>&nbsp;
-      <a href="%s">&nbsp;≅&nbsp;</a>
-    </p>
-  </body>
-</html>┃",
-      css_style,
-      home_url,
-      collection_home_path
-    );
-    return html_blank_default;
-  }
-  @safe string special_characters_text(string _txt) {
-    mixin spineRgxOut;
-    mixin spineRgxXHTML;
-    static auto rgx = RgxO();
-    static auto rgx_xhtml = RgxXHTML();
-    _txt = _txt
-      .replaceAll(rgx_xhtml.ampersand,    "&amp;")  // "&#38;"
-      .replaceAll(rgx_xhtml.quotation,    "&quot;") // "&#34;"
-      .replaceAll(rgx_xhtml.less_than,    "&lt;")   // "&#60;"
-      .replaceAll(rgx_xhtml.greater_than, "&gt;")   // "&#62;"
-      .replaceAll(rgx.br_line,            "<br />")
-      .replaceAll(rgx.br_line_inline,     "<br />")
-      .replaceAll(rgx.br_line_spaced,     "<br />\n<br />")
-      .replaceAll(rgx.nbsp_char,          " ");
-    return _txt;
-  }
-}
-#+END_SRC
 
 * xml offspring (xhtml html epub)
 ** format xhtml objects :format:
@@ -406,13 +345,13 @@ import
     _locations = (doc_matters.conf_make_meta.make.home_button_text)
       .replaceAll(
         rgx.inline_link,
-        ("<p class=\"tiny_left\"><a href=\"$2\">$1</a></p>"))
+        ("<p class=\"tiny_left\"><a href=\"$2\" class=\"lnkicon\">$1</a></p>"))
       .replaceAll(
         rgx.br_line, "")
       .replaceAll(
         rgx.br_line_inline, "");
   } else {
-     _locations = "<p class=\"tiny_left\"><a href=\"https://www.doc-reform.org\">spine</a></p>\n<p class=\"tiny_left\"><a href=\"https://git.sisudoc.org/software/spine/\">sources / git</a></p>\n<p class=\"tiny_left\"><a href=\"https://www.sisudoc.org\">www.sisudoc.org</a></p>";
+     _locations = "<p class=\"icons\"><a href=\"https://www.doc-reform.org\" class=\"lnkicon\">spine</a></p>\n<p class=\"icons\"><a href=\"https://git.sisudoc.org/software/spine/\" class=\"lnkicon\">sources / git</a></p>\n<p class=\"icons\"><a href=\"https://www.sisudoc.org\" class=\"lnkicon\">www.sisudoc.org</a></p>";
   }
   string o;
   o = format(q"┃<div class="flex-menu-option">
@@ -501,7 +440,7 @@ import
 ) {
   string o;
   string metadata_links = ((doc_matters.opt.action.html_link_curate)
-    ? format(q"┃<p class="small"><a href="%s">⟰&nbsp;</a>&nbsp;[<a href="%s">&nbsp;%s&nbsp;</a><a href="%sepub/%s.%s.epub">&nbsp;◆&nbsp;</a>%s%s<a href="%smetadata.%s.html">&nbsp;ℹ&nbsp;</a>]&nbsp;&nbsp;<a href="%s../../index.html">&nbsp;≅&nbsp;</a>|<a href="%s../../authors.html">&nbsp;&#x1F58B;&nbsp;</a>|<a href="%s../../topics.html">&nbsp;⌘&nbsp;</a>|</p>┃",
+    ? format(q"┃<p class="icons"><a href="%s" class="lnkicon">⟰&nbsp;</a>&nbsp;[<a href="%s" class="lnkicon">&nbsp;%s&nbsp;</a><a href="%sepub/%s.%s.epub" class="lnkicon">&nbsp;◆&nbsp;</a>%s%s<a href="%smetadata.%s.html" class="lnkicon">&nbsp;ℹ&nbsp;</a>]&nbsp;&nbsp;<a href="%s../../index.html" class="lnkicon">&nbsp;≅&nbsp;</a>|<a href="%s../../authors.html" class="lnkicon">&nbsp;&#x1F58B;&nbsp;</a>|<a href="%s../../topics.html" class="lnkicon">&nbsp;⌘&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
@@ -520,7 +459,7 @@ import
           ~ doc_matters.src.filename_base
           ~  "."
           ~ doc_matters.src.lng
-          ~ ".a4.portrait.pdf\">&nbsp;□&nbsp;</a>")
+          ~ ".a4.portrait.pdf\" class=\"lnkicon\">&nbsp;□&nbsp;</a>")
         : "",
         (doc_matters.opt.action.html_link_pdf || doc_matters.opt.action.html_link_pdf_letter)
         ? ("<a href=\""
@@ -529,7 +468,7 @@ import
           ~ doc_matters.src.filename_base
           ~  "."
           ~ doc_matters.src.lng
-          ~ ".letter.portrait.pdf\">&nbsp;□&nbsp;</a>")
+          ~ ".letter.portrait.pdf\" class=\"lnkicon\">&nbsp;□&nbsp;</a>")
         : "",
         (type == "seg") ? "../" : "",
         doc_matters.src.filename_base,
@@ -686,7 +625,7 @@ import
   <hr />
   <div class="generator">
     <p class="small_center" id="sisu_spine"><a name="sisu_spine"></a>
-      <a href="https://sisudoc.org">≅ SiSU Spine ፨</a> (object numbering &amp; object search)
+      <a href="https://sisudoc.org" class="lnkicon">≅ SiSU Spine ፨</a> (object numbering &amp; object search)
     </p>
     <p class="small_center" id="sisu_spine"><a name="sisu_spine"></a>
       (web 1993, object numbering 1997, object search 2002 ...) <<year>>
diff --git a/org/out_xmls_css.org b/org/out_xmls_css.org
index db73643..5c050eb 100644
--- a/org/out_xmls_css.org
+++ b/org/out_xmls_css.org
@@ -226,6 +226,15 @@ a.lnkocn:hover {
   color                    : #777777;
   font-size                : 1.8rem;
 }
+a.lnkicon:link {
+  text-decoration          : none;
+}
+a.lnkicon:visited {
+  text-decoration          : none;
+}
+a.lnkicon:hover {
+  font-size                : 160%%;
+}
 a:hover img {
   background-color         : #FFFFFF;
 }
@@ -545,6 +554,15 @@ p.tiny_center {
   margin-right             : 0px;
   text-align               : center;
 }
+p.icons, .icons_center {
+  font-size                : 100%%;
+  margin-top               : 0px;
+  margin-bottom            : 0px;
+  margin-right             : 6px;
+}
+p.icons {
+  text-align               : left;
+}
 p.concordance_word {
   line-height              : 150%%;
   font-weight              : bold;
@@ -1150,6 +1168,16 @@ a.lnkocn:hover {
   color                    : #BBBBBB;
   font-size                : 1.8rem;
 }
+a.lnkicon:link {
+  text-decoration          : none;
+}
+a.lnkicon:visited {
+  text-decoration          : none;
+}
+a.lnkicon:hover {
+  color                    : #BBBBBB;
+  font-size                : 120%%;
+}
 a:hover img {
   background-color         : #000000;
 }
-- 
cgit v1.2.3