-*- mode: org -*-
#+TITLE:       spine (doc_reform) metadata (multidocument) curates
#+DESCRIPTION: documents - structuring, various output representations & search
#+FILETAGS:    :spine:hub:
#+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/]]

* document abstraction _summary_ :module:spine:metadoc_show_summary:
** _module template_ metadoc summary
- document summary from abstraction

#+HEADER: :tangle "../src/doc_reform/meta/metadoc_show_summary.d"
#+HEADER: :noweb yes
#+BEGIN_SRC d
<<doc_header_including_copyright_and_license>>
module doc_reform.meta.metadoc_show_summary;
template spineMetaDocSummary() {
  @safe void spineMetaDocSummary(S,T)(
    const S  doc_abstraction,
          T  doc_matters,
  ) {
    <<metadoc_show_summary_imports>>
    <<metadoc_show_imports_shared>>
    mixin InternalMarkup;
    <<metadoc_show_initialize>>
    if (doc_matters.opt.action.vox_gt1
    || doc_matters.opt.action.show_summary) {
      <<meta_metadoc_show_summary_document_check_counts>>
      <<meta_metadoc_show_summary_document>>
    }
  }
}
#+END_SRC

** (last ocn)

#+NAME: meta_metadoc_show_summary_document_check_counts
#+BEGIN_SRC d
string[string] check = [
  "last_object_number" : "NA [debug \"checkdoc\" not run]",
  "last_object_number_body"  : "0",
  "last_object_number_book_index" : "0",
];
foreach (k; doc_matters.has.keys_seq.seg) {
  foreach (obj; doc_abstraction[k]) {
    if (obj.metainfo.is_of_part != "empty") {
      if (!empty(obj.metainfo.object_number)) {
        if (k == "body") {
          check["last_object_number_body"] = obj.metainfo.object_number;
        }
        if (!(obj.metainfo.object_number.empty)) {
          check["last_object_number"] = obj.metainfo.object_number;
        }
      }
      if (k == "bookindex") {
        if (obj.metainfo.object_number_type == 2) {
          check["last_object_number_book_index"] = obj.metainfo.object_number_book_index;
        }
      }
    }
  }
}
#+END_SRC

** document summary

#+NAME: meta_metadoc_show_summary_document
#+BEGIN_SRC d
writefln(
  "%s\n\"%s\", %s\n%s [%s]\n%s\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%40-s%10-d\n%s",
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  doc_matters.conf_make_meta.meta.title_full,
  doc_matters.conf_make_meta.meta.creator_author,
  doc_matters.src.filename,
  doc_matters.src.language,
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  "- toc arr length:",
  to!int(doc_abstraction["toc"].length),
  "- doc_abstraction arr length:",
  to!int(doc_abstraction["body"].length),
  "  doc body last obj on.#:",
  to!int(check["last_object_number_body"]),
  "  - number of tables:",
  doc_matters.has.tables,
  "  - number of codeblocks:",
  doc_matters.has.codeblocks,
  "  - number of poems:",
  doc_matters.has.poems,
  "  - number of blocks:",
  doc_matters.has.blocks,
  "  - number of groups:",
  doc_matters.has.groups,
  "  - number of images:",
  doc_matters.has.images,
  "- endnotes length:",                                // subtract headings
  (doc_abstraction["endnotes"].length > 2)
  ? (to!int(doc_abstraction["endnotes"].length - 2))
  : 0,
  "- glossary length:",
  (doc_abstraction["glossary"].length > 1)
  ? (to!int(doc_abstraction["glossary"].length))
  : 0,
  "- biblio length:",
  (doc_abstraction["bibliography"].length > 1)
  ? (to!int(doc_abstraction["bibliography"].length))
  : 0,
  "- bookindex length:",
  (doc_abstraction["bookindex"].length > 1)
  ? (to!int(doc_abstraction["bookindex"].length))
  : 0,
  "  book idx last obj on.#:",
  to!int(check["last_object_number_book_index"]),
  "- blurb length:",
  (doc_abstraction["blurb"].length > 1)
  ? (to!int(doc_abstraction["blurb"].length))
  : 0,
  "* last obj on.#:",
  to!int(check["last_object_number"]),
  "number of segments:",
  (doc_matters.has.segnames_lv4.length > 1)
  ? (to!int(doc_matters.has.segnames_lv4.length))
  : 0,
  markup.repeat_character_by_number_provided("-", min_repeat_number),
);
#+END_SRC

* show config
** _module template_ show config
*** _show config tangle

#+HEADER: :tangle "../src/doc_reform/meta/metadoc_show_config.d"
#+HEADER: :noweb yes
#+BEGIN_SRC d
<<doc_header_including_copyright_and_license>>
<<spine_show_site_config>>
<<spine_show_config>>
#+END_SRC

*** _show site config
--show-config (show config)

#+NAME: spine_show_site_config
#+HEADER: :noweb yes
#+BEGIN_SRC d
module doc_reform.meta.metadoc_show_config;
template spineShowSiteConfig() {
  @safe void spineShowSiteConfig(O,T)(
    O opt_action,
    T config,
  ) {
    <<metadoc_show_summary_imports>>
    <<metadoc_show_imports_shared>>
    mixin InternalMarkup;
    auto markup = InlineMarkup();
    auto char_repeat_number = 66;
    if (opt_action.show_config) {
      <<meta_metadoc_show_site_config>>
    }
  }
}
#+END_SRC

*** show site config

#+NAME: meta_metadoc_show_site_config
#+BEGIN_SRC d
writefln(
  "\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  "- webserv host name:",
  config.conf.w_srv_host,
  "- webserv doc root (part):",
  config.conf.w_srv_data_root_part,
  "- webserv doc path:",
  config.conf.w_srv_data_root_path,
  "- webserv images (location):",
  config.conf.w_srv_images_root_part,
  "- webserv doc root url:",
  config.conf.w_srv_data_root_url,
  "- webserv cgi host (host):",
  config.conf.w_srv_cgi_host,
  "- webserv cgi host path:",
  config.conf.w_srv_cgi_bin_path,
  "- webserv cgi host (part):",
  config.conf.w_srv_cgi_bin_subpath,
  "- webserv cgi search script:",
  config.conf.w_srv_cgi_search_script,
  "- webserv cgi search script in d:",
  config.conf.w_srv_cgi_search_script_raw_fn_d,
  "- webserv cgi port:",
  config.conf.w_srv_cgi_port,
  "- webserv cgi user:",
  config.conf.w_srv_cgi_user,
  "- webserv cgi url:",
  config.conf.w_srv_cgi_bin_url,
  "- webserv cgi action:",
  config.conf.w_srv_cgi_action,
  "- webserv cgi title:",
  config.conf.w_srv_cgi_search_form_title,
  // "- webserv cgi file links:",
  // config.conf.w_srv_cgi_file_links,
  "- webserv sqlite db:",
  config.conf.w_srv_db_sqlite_filename,
  "- output path:",
  config.conf.output_path,
  "- processing concordance max:",
  config.conf.processing_concord_max,
  // "- flag act0:",
  // config.conf.flag_act0,
  "- default papersize:",
  config.conf.set_papersize,
  "- default text wrap:",
  config.conf.set_text_wrap,
  "- default emphasis markup symbol:",
  config.conf.set_emphasis,
  "- default language:",
  config.conf.set_language,
  "- default hash digest:",
  config.conf.set_digest,
  "- search flag:",
  config.conf.search_flag,
  "- search action:",
  config.conf.search_action,
  "- search db:",
  config.conf.search_db,
  "- search title:",
  config.conf.search_title,
);
#+END_SRC

*** show (per document) config

#+NAME: spine_show_config
#+HEADER: :noweb yes
#+BEGIN_SRC d
template spineShowConfig() {
  @safe void spineShowConfig(T)(
    T  doc_matters,
  ) {
    <<metadoc_show_summary_imports>>
    <<metadoc_show_imports_shared>>
    mixin InternalMarkup;
    <<metadoc_show_initialize>>
    if (doc_matters.opt.action.show_config
      && doc_matters.opt.action.debug_do
    ) {
      writeln(doc_matters.conf_make_meta.conf);
    }
    if (doc_matters.opt.action.show_config) {
      <<meta_metadoc_show_config>>
    }
  }
}
#+END_SRC

** show config

#+NAME: meta_metadoc_show_config
#+BEGIN_SRC d
writefln(
  "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  doc_matters.conf_make_meta.meta.title_full,
  doc_matters.conf_make_meta.meta.creator_author,
  doc_matters.src.filename,
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  "- webserv host name:",
  doc_matters.conf_make_meta.conf.w_srv_host,
  "- webserv doc root (part):",
  doc_matters.conf_make_meta.conf.w_srv_data_root_part,
  "- webserv doc path:",
  doc_matters.conf_make_meta.conf.w_srv_data_root_path,
  "- webserv images (location):",
  doc_matters.conf_make_meta.conf.w_srv_images_root_part,
  "- webserv doc root url:",
  doc_matters.conf_make_meta.conf.w_srv_data_root_url,
  "- webserv cgi host (host):",
  doc_matters.conf_make_meta.conf.w_srv_cgi_host,
  "- webserv cgi host path:",
  doc_matters.conf_make_meta.conf.w_srv_cgi_bin_path,
  "- webserv cgi host (part):",
  doc_matters.conf_make_meta.conf.w_srv_cgi_bin_subpath,
  "- webserv cgi search script:",
  doc_matters.conf_make_meta.conf.w_srv_cgi_search_script,
  "- webserv cgi search script in d:",
  doc_matters.conf_make_meta.conf.w_srv_cgi_search_script_raw_fn_d,
  "- webserv cgi url:",
  doc_matters.conf_make_meta.conf.w_srv_cgi_bin_url,
  "- webserv cgi action:",
  doc_matters.conf_make_meta.conf.w_srv_cgi_action,
  // "- webserv cgi file links:",
  // doc_matters.conf_make_meta.conf.w_srv_cgi_file_links,
  "- webserv sqlite db:",
  doc_matters.conf_make_meta.conf.w_srv_db_sqlite_filename,
  "- output path:",
  doc_matters.conf_make_meta.conf.output_path,
  "- processing concordance max:",
  doc_matters.conf_make_meta.conf.processing_concord_max,
  // "- flag act0:",
  // doc_matters.conf_make_meta.conf.flag_act0,
  "- default papersize:",
  doc_matters.conf_make_meta.conf.set_papersize,
  "- default text wrap:",
  doc_matters.conf_make_meta.conf.set_text_wrap,
  "- default emphasis markup symbol:",
  doc_matters.conf_make_meta.conf.set_emphasis,
  "- default language:",
  doc_matters.conf_make_meta.conf.set_language,
  "- default hash digest:",
  doc_matters.conf_make_meta.conf.set_digest,
  "- search flag:",
  doc_matters.conf_make_meta.conf.search_flag,
  "- search action:",
  doc_matters.conf_make_meta.conf.search_action,
  "- search db:",
  doc_matters.conf_make_meta.conf.search_db,
  "- search title:",
  doc_matters.conf_make_meta.conf.search_title,
);
#+END_SRC

* show make
** _module template_ show make
--show-make (show document make)

#+HEADER: :tangle "../src/doc_reform/meta/metadoc_show_make.d"
#+HEADER: :noweb yes
#+BEGIN_SRC d
<<doc_header_including_copyright_and_license>>
module doc_reform.meta.metadoc_show_make;
template spineShowMake() {
  @safe void spineShowMake(T)(
    T  doc_matters,
  ) {
    <<metadoc_show_summary_imports>>
    <<metadoc_show_imports_shared>>
    mixin InternalMarkup;
    <<metadoc_show_initialize>>
    if (doc_matters.opt.action.show_make
      && doc_matters.opt.action.debug_do
    ) {
      writeln(doc_matters.conf_make_meta.make);
    }
    if (doc_matters.opt.action.show_make) {
      <<meta_metadoc_show_make>>
    }
  }
}
#+END_SRC

** show make

#+NAME: meta_metadoc_show_make
#+BEGIN_SRC d
writefln(
  "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  doc_matters.conf_make_meta.meta.title_full,
  doc_matters.conf_make_meta.meta.creator_author,
  doc_matters.src.filename,
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  "- bold:",
  doc_matters.conf_make_meta.make.bold,
  "- breaks:",
  doc_matters.conf_make_meta.make.breaks,
  "- cover image:",
  doc_matters.conf_make_meta.make.cover_image,
  "- css:",
  doc_matters.conf_make_meta.make.css,
  "- emphasis:",
  doc_matters.conf_make_meta.make.emphasis,
  "- css:",
  doc_matters.conf_make_meta.make.css,
  "- footer:",
  doc_matters.conf_make_meta.make.footer,
  "- headings:",
  doc_matters.conf_make_meta.make.headings,
  "- home button image:",
  doc_matters.conf_make_meta.make.home_button_image,
  "- home button text:",
  doc_matters.conf_make_meta.make.home_button_text,
  "- italics:",
  doc_matters.conf_make_meta.make.italics,
  "- auto num top at level:",
  doc_matters.conf_make_meta.make.auto_num_top_at_level,
  "- auto num top level:",
  doc_matters.conf_make_meta.make.auto_num_top_lv,
  "- auto num depth:",
  doc_matters.conf_make_meta.make.auto_num_depth,
  "- texpdf font:",
  doc_matters.conf_make_meta.make.texpdf_font,
);
#+END_SRC

* show metadata
** _module template_ show metadata
--show-metadata (show document metadata)

#+HEADER: :tangle "../src/doc_reform/meta/metadoc_show_metadata.d"
#+HEADER: :noweb yes
#+BEGIN_SRC d
<<doc_header_including_copyright_and_license>>
module doc_reform.meta.metadoc_show_metadata;
template spineShowMetaData() {
  @safe void spineShowMetaData(T)(
    T  doc_matters,
  ) {
    <<metadoc_show_summary_imports>>
    <<metadoc_show_imports_shared>>
    mixin InternalMarkup;
    <<metadoc_show_initialize>>
    if (doc_matters.opt.action.show_metadata
      && doc_matters.opt.action.debug_do
    ) {
      writeln(doc_matters.conf_make_meta.meta);
    }
    if (doc_matters.opt.action.show_metadata) {
      <<meta_metadoc_show_metadata>>
    }
  }
}
#+END_SRC

** show metadata

#+NAME: meta_metadoc_show_metadata
#+BEGIN_SRC d
writefln(
  "%s\n\"%s\", %s\n%s\n%s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n%40-s%10-s\n",
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  doc_matters.conf_make_meta.meta.title_full,
  doc_matters.conf_make_meta.meta.creator_author,
  doc_matters.src.filename,
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  "- author:",
  doc_matters.conf_make_meta.meta.creator_author,
  "- author array:",
  doc_matters.conf_make_meta.meta.creator_author_arr,
  "- author surname:",
  doc_matters.conf_make_meta.meta.creator_author_surname,
  "- author email:",
  doc_matters.conf_make_meta.meta.creator_author_email,
  "- illustrator:",
  doc_matters.conf_make_meta.meta.creator_illustrator,
  "- translator:",
  doc_matters.conf_make_meta.meta.creator_translator,
  "- title full:",
  doc_matters.conf_make_meta.meta.title_full,
  "- title main:",
  doc_matters.conf_make_meta.meta.title_main,
  "- title sub:",
  doc_matters.conf_make_meta.meta.title_subtitle,
  "- title edition:",
  doc_matters.conf_make_meta.meta.title_edition,
  "- title language:",
  doc_matters.conf_make_meta.meta.title_language,
  "- title note:",
  doc_matters.conf_make_meta.meta.title_note,
  "- classify dewey:",
  doc_matters.conf_make_meta.meta.classify_dewey,
  "- classify library of congress:",
  doc_matters.conf_make_meta.meta.classify_loc,
  "- classify keywords:",
  doc_matters.conf_make_meta.meta.classify_keywords,
  "- classify topic register:",
  doc_matters.conf_make_meta.meta.classify_topic_register,
  "- date added to site:",
  doc_matters.conf_make_meta.meta.date_added_to_site,
  "- date available:",
  doc_matters.conf_make_meta.meta.date_available,
  "- date created:",
  doc_matters.conf_make_meta.meta.date_created,
  "- date issued:",
  doc_matters.conf_make_meta.meta.date_issued,
  "- date modified:",
  doc_matters.conf_make_meta.meta.date_modified,
  "- date published:",
  doc_matters.conf_make_meta.meta.date_published,
  "- date valid:",
  doc_matters.conf_make_meta.meta.date_valid,
  // links
  "- notes abstract:",
  doc_matters.conf_make_meta.meta.notes_abstract,
  "- notes description:",
  doc_matters.conf_make_meta.meta.notes_description,
  "- original language:",
  doc_matters.conf_make_meta.meta.original_language,
  "- original language character:",
  doc_matters.conf_make_meta.meta.original_language_char,
  "- original source:",
  doc_matters.conf_make_meta.meta.original_source,
  "- original title:",
  doc_matters.conf_make_meta.meta.original_title,
  // publisher
  "- rights copyright:",
  doc_matters.conf_make_meta.meta.rights_copyright,
  "- rights copyright text:",
  doc_matters.conf_make_meta.meta.rights_copyright_text,
  "- rights copyright audio:",
  doc_matters.conf_make_meta.meta.rights_copyright_audio,
  "- rights copyright cover:",
  doc_matters.conf_make_meta.meta.rights_copyright_cover,
  "- rights copyright illustrations:",
  doc_matters.conf_make_meta.meta.rights_copyright_illustrations,
  "- rights copyright photographs:",
  doc_matters.conf_make_meta.meta.rights_copyright_photographs,
  "- rights copyright translation:",
  doc_matters.conf_make_meta.meta.rights_copyright_translation,
  "- rights copyright video:",
  doc_matters.conf_make_meta.meta.rights_copyright_video,
  "- rights license:",
  doc_matters.conf_make_meta.meta.rights_license,
);
#+END_SRC

* shared init ?
** init

*** imports

#+NAME: metadoc_show_imports_shared
#+BEGIN_SRC d
import
  std.array,
  std.exception,
  std.regex,
  std.stdio,
  std.string,
  std.typecons,
  std.uni,
  std.utf,
  std.conv : to;
#+END_SRC

*** imports

#+NAME: metadoc_show_summary_imports
#+BEGIN_SRC d
import
  doc_reform.meta.defaults,
  doc_reform.meta.rgx;
#+END_SRC

*** initialize :report:

#+NAME: metadoc_show_initialize
#+BEGIN_SRC d
auto markup = InlineMarkup();
auto min_repeat_number = 66;
auto char_repeat_number = (doc_matters.conf_make_meta.meta.title_full.length
  + doc_matters.conf_make_meta.meta.creator_author.length + 4);
char_repeat_number = (char_repeat_number > min_repeat_number)
? char_repeat_number
: min_repeat_number;
#+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__