From 5bd8cbc86ab1236d4e891e0711e9a3623f0c51a7 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph.amissah@gmail.com>
Date: Sun, 3 Apr 2022 18:06:45 -0400
Subject: generated-by header, latex, html, epub

- consider, implementation quite messy
---
 src/doc_reform/io_out/hub.d   | 21 ++++++++++++---
 src/doc_reform/io_out/latex.d | 62 ++++++++++++++++++++++++++++---------------
 src/doc_reform/io_out/xmls.d  |  2 +-
 src/doc_reform/meta/metadoc.d | 12 ++++-----
 src/doc_reform/spine.d        | 21 ++++++++++++++-
 5 files changed, 85 insertions(+), 33 deletions(-)

(limited to 'src')

diff --git a/src/doc_reform/io_out/hub.d b/src/doc_reform/io_out/hub.d
index d0f5d3c..4c5254b 100644
--- a/src/doc_reform/io_out/hub.d
+++ b/src/doc_reform/io_out/hub.d
@@ -119,7 +119,12 @@ template outputHub() {
         if ((isValidPath(doc_matters.output_path ~ "/latex/sty"))
           && (!(exists(doc_matters.output_path ~ "/latex/sty")))
         ) {
-          outputLaTeXstyInit!()(doc_matters.output_path);
+          outputLaTeXstyInit!()(
+            doc_matters.output_path,
+            doc_matters.opt.action.generated_by,
+            doc_matters.generator_program.name_version_and_compiler,
+            doc_matters.generator_program.time_output_generated,
+          );
         }
         outputLaTeX!()(doc_abstraction, doc_matters);
         msg.vv("latex done");
@@ -167,16 +172,24 @@ template outputHubInitialize() {
   import doc_reform.io_out,
     doc_reform.io_out.metadata,
     doc_reform.io_out.paths_output;
-  @system void outputHubInitialize(O)(O opt_action) {
+  @system void outputHubInitialize(O,I)(
+    O opt_action,
+    I program_info
+  ) {
     if (
       opt_action.latex_document_header_sty
       || (
         opt_action.latex
         && opt_action.output_dir_set.length > 0
         && !(isValidPath(opt_action.output_dir_set ~ "/latex/sty")))
-    ) { // .sty need to be produced only once (if unchanged per output-dir of which there usually will be one)
+    ) { // .sty need to be produced only once (if unchanged per output-dir of which there usually will be only one)
       import doc_reform.io_out.latex;
-      outputLaTeXstyInit!()(opt_action.output_dir_set);
+      outputLaTeXstyInit!()(
+        opt_action.output_dir_set,
+        opt_action.generated_by,
+        program_info.name_version_and_compiler,
+        program_info.time_output_generated,
+      );
     }
     writeln(opt_action.latex);
   }
diff --git a/src/doc_reform/io_out/latex.d b/src/doc_reform/io_out/latex.d
index f54bb1a..992887d 100644
--- a/src/doc_reform/io_out/latex.d
+++ b/src/doc_reform/io_out/latex.d
@@ -1139,14 +1139,13 @@ template outputLaTeX() {
     ){
       links_mono_or_color_set = links.mono.strip;
     }
-    string _latex_head = format(q"┃%%%% spine LaTeX output%s%s%s
+    string _latex_head = format(q"┃%%%% spine LaTeX output%s%s
 %%%% %s %s
 %s
 %s
     ┃",
-      doc_matters.opt.action.generated_by ? " " ~ doc_matters.generator_program.name_and_version.strip : "",
-      doc_matters.opt.action.generated_by ? " (" ~ doc_matters.generator_program.compiler.strip ~ ")" : "",
-      doc_matters.opt.action.generated_by ? " (LaTeX output last Generated on: " ~  doc_matters.generator_program.stime.strip ~ ")" : "",
+      doc_matters.opt.action.generated_by ? " " ~ doc_matters.generator_program.name_version_and_compiler : "",
+      doc_matters.opt.action.generated_by ? " (generated " ~  doc_matters.generator_program.time_output_generated ~ ")" : "",
       doc_matters.generator_program.project_name.strip,
       doc_matters.generator_program.url_home.strip,
       paper_size_orientation_latex.strip,
@@ -1405,38 +1404,43 @@ template outputLaTeXstyInit() {
       }
     }
   }
-  void outputLaTeXstyInit()(string output_dir,) {
-    string latex_sty = outputLaTeXstyStatic!();
+  void outputLaTeXstyInit()(
+    string output_dir,
+    bool   generated_by,
+    string name_version_and_compiler,
+    string time_output_generated,
+  ) {
+    string latex_sty = outputLaTeXstyStatic!()(generated_by, name_version_and_compiler, time_output_generated);
     latex_sty.writeOutputLaTeXstyStatic(output_dir, "spineShared.sty");
     auto sty_a4p      = paper.a4.portrait;
-    auto latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a4p);
+    auto latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a4p, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_a4p.stylesheet ~ ".sty");
     auto sty_a4l      = paper.a4.landscape;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a4l);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a4l, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_a4l.stylesheet ~ ".sty");
     auto sty_b4p      = paper.b4.portrait;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_b4p);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_b4p, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_b4p.stylesheet ~ ".sty");
     auto sty_b4l      = paper.b4.landscape;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_b4l);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_b4l, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_b4l.stylesheet ~ ".sty");
     auto sty_a5p      = paper.a5.portrait;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a5p);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a5p, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_a5p.stylesheet ~ ".sty");
     auto sty_a5l      = paper.a5.landscape;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a5l);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_a5l, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_a5l.stylesheet ~ ".sty");
     auto sty_letter_p  = paper.letter.portrait;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_letter_p);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_letter_p, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_letter_p.stylesheet ~ ".sty");
     auto sty_letter_l  = paper.letter.landscape;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_letter_l);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_letter_l, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_letter_l.stylesheet ~ ".sty");
     auto sty_legal_p   = paper.legal.portrait;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_legal_p);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_legal_p, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_legal_p.stylesheet ~ ".sty");
     auto sty_legal_l   = paper.legal.landscape;
-    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_legal_l);
+    latex_papersize_and_orientation = outputLaTeXstyPaperSizeAndOrientation!()(sty_legal_l, generated_by, name_version_and_compiler, time_output_generated);
     latex_papersize_and_orientation.writeOutputLaTeXstyStatic(output_dir, sty_legal_l.stylesheet ~ ".sty");
   }
 }
@@ -1444,8 +1448,13 @@ template outputLaTeXstyStatic() {
   import
     std.format,
     std.conv : to;
-  string outputLaTeXstyStatic() {
-    string latex_sty = format(q"┃%% - called by the .sty containing the paper dimensions (size and orientation) to be used
+  string outputLaTeXstyStatic(
+    bool   generated_by,
+    string name_version_and_compiler,
+    string time_output_generated,
+  ) {
+    string latex_sty = format(q"┃%%%% spine LaTeX output%s%s
+%% - called by the .sty containing the paper dimensions (size and orientation) to be used
 %% - spineShared.sty used by all spine documents (called indirectly)
 \ProvidesPackage{./sty/spineShared}
 \usepackage{multicol}
@@ -1671,7 +1680,10 @@ template outputLaTeXstyStatic() {
 %% \widowpenalty=300
 %% \usepackage{atbegshi} %% http://ctan.org/pkg/atbegshi         %% (BUG tmp FIX deal with problem, remove first page which is blank)
 %% \AtBeginDocument{\AtBeginShipoutNext{\AtBeginShipoutDiscard}} %% (BUG tmp FIX deal with problem, remove first page which is blank)
-┃");
+┃",
+  generated_by ? " " ~ name_version_and_compiler : "",
+  generated_by ? " (generated " ~  time_output_generated ~ ")" : "",
+);
     return latex_sty;
   }
 }
@@ -1679,8 +1691,14 @@ template outputLaTeXstyPaperSizeAndOrientation() {
   import
     std.format,
     std.conv : to;
-  auto outputLaTeXstyPaperSizeAndOrientation(P)(P doc_sty_info) {
-    string latex_sty = format(q"┃%% - called by .tex document to set paper dimensions (size and orientation)
+  auto outputLaTeXstyPaperSizeAndOrientation(P)(
+    P      doc_sty_info,
+    bool   generated_by,
+    string name_version_and_compiler,
+    string time_output_generated,
+  ) {
+    string latex_sty = format(q"┃%%%% spine LaTeX output%s%s
+%% - called by .tex document to set paper dimensions (size and orientation)
 %% - calls spineShared.sty used/shared by all spine documents
 \ProvidesPackage{./sty/%s}
 \usepackage{geometry}
@@ -1693,6 +1711,8 @@ template outputLaTeXstyPaperSizeAndOrientation() {
   bottom=%s,
 }
 \usepackage{./sty/spineShared}┃",
+  generated_by ? " " ~ name_version_and_compiler : "",
+  generated_by ? " (generated " ~  time_output_generated ~ ")" : "",
   doc_sty_info.stylesheet,
   doc_sty_info.papersize,
   doc_sty_info.orient,
diff --git a/src/doc_reform/io_out/xmls.d b/src/doc_reform/io_out/xmls.d
index 534ab94..62d8842 100644
--- a/src/doc_reform/io_out/xmls.d
+++ b/src/doc_reform/io_out/xmls.d
@@ -222,7 +222,7 @@ template outputXHTMLs() {
         special_characters_text(doc_matters.conf_make_meta.meta.date_modified),
         doc_matters.src.language,
         special_characters_text(doc_matters.conf_make_meta.meta.rights_copyright),
-        doc_matters.opt.action.debug_do_xmls ? "" : special_characters_text(doc_matters.generator_program.name_and_version),
+        doc_matters.opt.action.generated_by ? special_characters_text(doc_matters.generator_program.name_and_version) : "",
         special_characters_text(doc_matters.generator_program.url_home),
       );
       return o;
diff --git a/src/doc_reform/meta/metadoc.d b/src/doc_reform/meta/metadoc.d
index 194890f..16cc6e7 100644
--- a/src/doc_reform/meta/metadoc.d
+++ b/src/doc_reform/meta/metadoc.d
@@ -112,10 +112,10 @@ template spineAbstraction() {
             return program_info.ver;
           }
           @trusted string name_and_version() {
-            return format("%s-%s",
-              name,
-              ver,
-            );
+            return program_info.name_and_version;
+          }
+          @trusted string name_version_and_compiler() {
+            return program_info.name_version_and_compiler;
           }
           @safe string url_home() {
             return "https://sisudoc.org";
@@ -126,8 +126,8 @@ template spineAbstraction() {
           @safe auto compiler() {
             return program_info.compiler;
           }
-          @safe auto stime() {
-            return Clock.currTime(UTC()).toSimpleString();
+          @safe auto time_output_generated() {
+            return program_info.time_output_generated;
           }
         }
         return Prog_();
diff --git a/src/doc_reform/spine.d b/src/doc_reform/spine.d
index 563de48..06b483c 100755
--- a/src/doc_reform/spine.d
+++ b/src/doc_reform/spine.d
@@ -762,6 +762,25 @@ string program_name = "spine";
           bits, os,
         );
       }
+      @trusted string name_and_version() {
+        return format("%s-%s", name, ver);
+      }
+      @trusted string name_version_and_compiler() {
+        return format("%s-%s (%s)", name, ver, compiler);
+      }
+      @safe auto time_output_generated() {
+        auto _st = Clock.currTime(UTC());
+        auto _t  = TimeOfDay(_st.hour, _st.minute, _st.second);
+        auto _time = _st.year.to!string
+          ~ "-" ~ _st.month.to!int.to!string // prefer as month number
+          ~ "-" ~ _st.day.to!string
+          ~ " [" ~ _st.isoWeek.to!string ~ "/" ~ _st.dayOfWeek.to!int.to!string ~ "]"
+          ~ " - " ~ _t.toISOExtString
+          // ~ " " ~ _st.hour.to!string ~ ":" ~ _st.minute.to!string ~ ":" ~ _st.second.to!string
+          ~ " UTC";
+        return _time;
+        // return _st.toISOExtString();
+      }
     }
     return ProgramInfo();
   }
@@ -978,7 +997,7 @@ string program_name = "spine";
   && _opt_action.abstraction) {
     /+ ↓ output hub +/
     if (!(_opt_action.skip_output)) {
-      outputHubInitialize!()(_opt_action);
+      outputHubInitialize!()(_opt_action, program_info);
     }
     if (_opt_action.parallelise) {                     // see else
       import std.parallelism;
-- 
cgit v1.2.3