#+TITLE:       sdp hub
#+AUTHOR:      Ralph Amissah
#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
#+DESCRIPTION: documents - structuring, publishing in multiple formats & search
#+KEYWORDS
#+LANGUAGE:    en
#+STARTUP:     indent content
#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
#+OPTIONS:     TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+OPTIONS:     author:nil email:nil creator:nil timestamp:nil
#+PROPERTY:    header-args :padline no :exports code :noweb yes
#+EXPORT_SELECT_TAGS:  export
#+EXPORT_EXCLUDE_TAGS: noexport
#+FILETAGS:            :sdp:rel:hub:
#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)

[[../maker.org][maker.org makefile]]  [[./][org/]]
* 0. version.txt (set version)                                      :version:
** set program version

#+NAME: version_txt
#+BEGIN_SRC d  :tangle ../views/version.txt
/+ obt - org generated file +/
struct Version {
  int major;
  int minor;
  int patch;
}
enum ver = Version(0, 24, 0);
#+END_SRC

** compilation restrictions (supported compilers)

http://dlang.org/spec/version.html#predefined-versions

#+BEGIN_SRC d  :tangle ../views/version.txt
version (Posix) {
  version (DigitalMars) {
  } else version (LDC) {
  } else version (GNU) {
  } else {
    static assert (0, "Unsupported D compiler");
  }
} else {
  static assert (0, "Unsupported D compiler");
}
#+END_SRC

* 1. sdp (sisu document parser)                                         :sdp:

- deal with imports
- get options
  - get command line instructions
  - read config instructions
- process files as instructed by options
  - read in file
  - process file
  - output

** 0. sdp src/sdp                                                 :template:

- process files (act according to requirements of each type)
  - by sourcefilename
  - by sourcefiles contents identifier
  - by zip filename

#+BEGIN_SRC d  :tangle ../src/sdp/sdp.d :shebang #!/usr/bin/env rdmd
module sdp.sisu_document_parser;
import
  sdp.conf.compile_time_info,
  sdp.meta.metadoc;
<<imports_sdp>>
<<mixin_sdp_version>>
<<mixin_pre_main>>
/++
name        "sdp"
description "A SiSU inspired document parser writen in D."
homepage    "http://sisudoc.org"
+/
void main(string[] args) {
  <<sdp_mixin>>
  <<sdp_args>>
  <<sdp_env>>
  <<sdp_do_selected>>
  if (_manifests.length > 1) { // _manifests[0] initialized dummy element
    foreach(manifest; _manifests[1..$]) {
      if (!empty(manifest.src.filename)) {
        <<sdp_each_file_do_scope>>
        <<sdp_each_file_do_abstraction>>
        <<sdp_each_file_do_debugs_checkdoc>>
        <<sdp_each_file_do_selected_output>>
        <<sdp_each_file_do_scope_exit>>
      } else {
        <<sdp_no_filename_provided>>
      }
    }
  }
}
unittest {
}
#+END_SRC

** 1. pre-loop init                                                   :init:
*** init
**** imports                                                      :import:
***** sdp                                                           :sdp:

#+NAME: imports_sdp
#+BEGIN_SRC d
import
  std.getopt,
  std.file,
  std.path,
  std.process;
import
  sdp.meta,
  sdp.meta.metadoc_summary,
  sdp.meta.metadoc_from_src,
  sdp.meta.conf_make_meta_structs,
  sdp.meta.conf_make_meta_sdlang,
  sdp.meta.conf_make_meta_toml,
  sdp.meta.conf_make_meta_json,
  sdp.meta.defaults,
  sdp.meta.doc_debugs,
  sdp.meta.read_config_files,
  sdp.meta.read_source_files,
  sdp.meta.rgx,
  sdp.output.hub,
  sdp.output.paths_source;
#+END_SRC

****** notes
├── src
│   ├── sdp.d
│   └── sdp
│       ├── conf
│       ├── meta
│       └── output
└── views
    └── version.txt

[[./meta_abstraction.org][meta_abstraction]]
[[./meta_conf_make_meta.org][meta_conf_make_meta]]
[[./meta_defaults.org][meta_defaults]]
[[./meta_output_debugs.org][meta_output_debugs]]
[[./meta_read_source_files.org][meta_read_source_files]]
[[./compile_time_info.org][compile time info]]
[[./output.org][output]]
[[./sdp.org][sdp]]

keep up to date, configuration in ../maker.org

check:
- http://github.com/Abscissa/SDLang-D
- https://github.com/abscissa/libInputVisitor

sdlang.parser,
sdlang.exceptions;

std.conv,
std.variant,

- https://code.dlang.org/packages/toml
- https://github.com/toml-lang/toml
- https://github.com/toml-lang/toml/blob/master/README.md

**** mixins                                                        :mixin:
***** version.txt                                               :version:

#+NAME: mixin_sdp_version
#+BEGIN_SRC d
mixin(import("version.txt"));
#+END_SRC

***** pre main mixins
#+NAME: mixin_pre_main
#+BEGIN_SRC d
mixin CompileTimeInfo;
#+END_SRC

***** sdp "main" mixins                                             :sdp:

#+NAME: sdp_mixin
#+BEGIN_SRC d
mixin SiSUrgxInit;
mixin SiSUmakeMetaStructsSDLang;
mixin SiSUextractSDLang;
mixin contentJSONtoSiSUstruct;
mixin SiSUnode;
mixin SiSUbiblio;
mixin SiSUrgxInitFlags;
mixin outputHub;
#+END_SRC

**** init                                                           :init:

#+NAME: sdp_args
#+BEGIN_SRC d
string flag_action;
string arg_unrecognized;
enum dAM { abstraction, matters }
static auto rgx = Rgx();
#+END_SRC

*** scope (run complete)                                            :scope:

#+NAME: sdp_args
#+BEGIN_SRC d
scope(success) {
  debug(checkdoc) {
    writefln(
      "~ run complete, ok ~ (sdp-%s.%s.%s, %s v%s, %s %s)",
      ver.major, ver.minor, ver.patch,
      __VENDOR__, __VERSION__,
      bits, os,
    );
  }
}
scope(failure) {
  debug(checkdoc) {
    stderr.writefln(
      "run failure",
    );
  }
}
#+END_SRC

*** config files and command line arguements
**** getopt args for loop                                    :args:getopt:

look into using getopt
[[http://dlang.org/phobos/std_getopt.html][getopt]]
[[http://dlang.org/library/std/getopt.html][getopt]]

***** getopt

#+NAME: sdp_args
#+BEGIN_SRC d
bool[string] opts = [
  "assertions"         : false,
  "concordance"        : false,
  "debug"              : false,
  "digest"             : false,
  "docbook"            : false,
  "epub"               : false,
  "html"               : false,
  "html-seg"           : false,
  "html-scroll"        : false,
  "manifest"           : false,
  "ocn"                : true,
  "odt"                : false,
  "pdf"                : false,
  "postgresql"         : false,
  "qrcode"             : false,
  "sisupod"            : false,
  "source"             : false,
  "sqlite-discrete"    : false,
  "sqlite-update"      : false,
  "sqlite-create"      : false,
  "sqlite-drop"        : false,
  "text"               : false,
  "verbose"            : false,
  "xhtml"              : false,
  "xml-dom"            : false,
  "xml-sax"            : false,
  "section_toc"        : true,
  "section_body"       : true,
  "section_endnotes"   : true,
  "section_glossary"   : true,
  "section_biblio"     : true,
  "section_bookindex"  : true,
  "section_blurb"      : true,
  "backmatter"         : true,
  "skip-output"        : false,
];
string[string] settings = [
  "output-dir"         : "",
  "site-config-dir"    : "",
  "lang"               : "all",
];
auto helpInfo = getopt(args,
  std.getopt.config.passThrough,
  "assert",             "--assert set optional assertions on",                        &opts["assertions"],
  "concordance",        "--concordance file for document",                            &opts["concordance"],
  "debug",              "--debug only relevant when debug options compiled in",       &opts["debug"],
  "digest",             "--digest hash digest for each object",                       &opts["digest"],
  "docbook",            "--docbook process docbook output",                           &opts["docbook"],
  "epub",               "--epub process epub output",                                 &opts["epub"],
  "html",               "--html process html output",                                 &opts["html"],
  "html-seg",           "--html-seg process html output",                             &opts["html-seg"],
  "html-scroll",        "--html-seg process html output",                             &opts["html-scroll"],
  "manifest",           "--manifest process manifest output",                         &opts["manifest"],
  "ocn",                "--ocn object cite numbers (default)",                        &opts["ocn"],
  "odf",                "--odf process odf:odt output",                               &opts["odt"],
  "odt",                "--odt process odf:odt output",                               &opts["odt"],
  "pdf",                "--pdf process pdf output",                                   &opts["pdf"],
  "pg",                 "--pg process postgresql output",                             &opts["postgresql"],
  "postgresql",         "--postgresql process postgresql output",                     &opts["postgresql"],
  "qrcode",             "--qrcode with document metadata",                            &opts["qrcode"],
  "sisupod",            "--sisupod sisupod source content bundled",                   &opts["sisupod"],
  "source",             "--source markup source text content",                        &opts["source"],
  "sqlite-discrete",    "--sqlite process discrete sqlite output",                    &opts["sqlite-discrete"],
  "sqlite-create",      "--sqlite-create create db, create tables",                   &opts["sqlite-create"],
  "sqlite-drop",        "--sqlite-drop drop tables & db",                             &opts["sqlite-drop"],
  "sqlite-update",      "--sqlite process sqlite output",                             &opts["sqlite-update"],
  "text",               "--text process text output",                                 &opts["text"],
  "txt",                "--txt process text output",                                  &opts["text"],
  "verbose|v",          "--verbose output to terminal",                               &opts["verbose"],
  "xhtml",              "--xhtml process xhtml output",                               &opts["xhtml"],
  "xml-dom",            "--xml-dom process xml dom output",                           &opts["xml-dom"],
  "xml-sax",            "--xml-sax process xml sax output",                           &opts["xml-sax"],
  "section-toc",        "--section-toc process table of contents (default)",          &opts["section_toc"],
  "section-body",       "--section-body process document body (default)",             &opts["section_body"],
  "section-endnotes",   "--section-endnotes process document endnotes (default)",     &opts["section_endnotes"],
  "section-glossary",   "--section-glossary process document glossary (default)",     &opts["section_glossary"],
  "section-biblio",     "--section-biblio process document biblio (default)",         &opts["section_biblio"],
  "section-bookindex",  "--section-bookindex process document bookindex (default)",   &opts["section_bookindex"],
  "section-blurb",      "--section-blurb process document blurb (default)",           &opts["section_blurb"],
  "backmatter",         "--section-backmatter process document backmatter (default)", &opts["backmatter"],
  "skip-output",        "--skip-output",                                              &opts["skip-output"],
  "output-dir",         "--output-dir=[dir path]",                                    &settings["output-dir"],
  "site-config-dir",    "--site-config-dir=[dir path]",                               &settings["site-config-dir"],
  "lang",               "--lang=[lang code e.g. =en or =en,es]",                      &settings["lang"],
);
if (helpInfo.helpWanted) {
  defaultGetoptPrinter("Some information about the program.", helpInfo.options);
}
#+END_SRC

***** getopt hash to struct

#+NAME: sdp_args
#+BEGIN_SRC d
struct OptActions {
  auto assertions() {
    return opts["assertions"];
  }
  auto concordance() {
    return opts["concordance"];
  }
  auto debug_do() {
    return opts["debug"];
  }
  auto digest() {
    return opts["digest"];
  }
  auto docbook() {
    return opts["docbook"];
  }
  auto epub() {
    return opts["epub"];
  }
  auto html() {
    return opts["html"];
  }
  auto html_seg() {
    return opts["html-seg"];
  }
  auto html_scroll() {
    return opts["html-scroll"];
  }
  auto manifest() {
    return opts["manifest"];
  }
  auto ocn() {
    return opts["ocn"];
  }
  auto odt() {
    return opts["odt"];
  }
  auto pdf() {
    return opts["pdf"];
  }
  auto postgresql() {
    return opts["postgresql"];
  }
  auto qrcode() {
    return opts["qrcode"];
  }
  auto sisupod() {
    return opts["sisupod"];
  }
  auto source() {
    return opts["source"];
  }
  auto sqlite_discrete() {
    return opts["sqlite-discrete"];
  }
  auto sqlite_update() {
    return opts["sqlite-update"];
  }
  auto sqlite_create() {
    return opts["sqlite-create"];
  }
  auto sqlite_drop() {
    return opts["sqlite-drop"];
  }
  auto text() {
    return opts["text"];
  }
  auto verbose() {
    return opts["verbose"];
  }
  auto xhtml() {
    return opts["xhtml"];
  }
  auto xml_dom() {
    return opts["xml-dom"];
  }
  auto xml_sax() {
    return opts["xml-sax"];
  }
  auto section_toc() {
    return opts["section_toc"];
  }
  auto section_body() {
    return opts["section_body"];
  }
  auto section_endnotes() {
    return opts["section_endnotes"];
  }
  auto section_glossary() {
    return opts["section_glossary"];
  }
  auto section_biblio() {
    return opts["section_biblio"];
  }
  auto section_bookindex() {
    return opts["section_bookindex"];
  }
  auto section_blurb() {
    return opts["section_blurb"];
  }
  auto backmatter() {
    return opts["backmatter"];
  }
  auto skip_output() {
    return opts["skip-output"];
  }
  auto languages_set() {
    return settings["lang"].split(",");
  }
  auto output_dir_set() {
    return settings["output-dir"];
  }
}
auto _opt_action = OptActions();
#+END_SRC

***** getopt processing path, _manifest[]                                                  >>

#+NAME: sdp_args
#+BEGIN_SRC d
auto _env = [
  "pwd" : environment["PWD"],
  "home" : environment["HOME"],
];
auto _manifest_start = PodManifest!()();
auto _manifest_matter = PathMatters!()(_opt_action, _env);
auto _manifests = [ _manifest_matter ];
foreach(arg; args[1..$]) {
  _manifest_start = PodManifest!()(arg);
  if (arg.match(rgx.flag_action)) {
    flag_action ~= " " ~ arg;   // flags not taken by getopt
  } else if (
    !(arg.match(rgx.src_pth_sst_or_ssm))
    && _manifest_start.pod_manifest_file_with_path
  ) {
    string contents_location_raw_;
    string contents_location_;
    string sisudoc_txt_ = _manifest_start.pod_manifest_file_with_path;
    enforce(
      exists(sisudoc_txt_)!=0,
      "file not found: «" ~
      sisudoc_txt_ ~ "»"
    );
    if (exists(sisudoc_txt_)) {
      try {
        if (exists(sisudoc_txt_)) {
          contents_location_raw_ = sisudoc_txt_.readText;
        }
      }
      catch (ErrnoException ex) {
      }
      catch (FileException ex) {
        // Handle errors
      }
      if (contents_location_raw_.match(rgx.pod_content_location)) { // (file name followed by language codes \n)+
        foreach (m; contents_location_raw_.matchAll(rgx.pod_content_location)) {
          foreach (n; m.captures[2].matchAll(rgx.language_codes)) {
            contents_location_ ~= "media/text/" ~ n.captures[1].to!string ~ "/" ~ m.captures[1].to!string ~ "\n";
          }
        }
      } else {
        contents_location_ = contents_location_raw_;
      }
    } else {
      writeln("manifest not found: ", sisudoc_txt_);
    }
    auto contents_locations_arr
      = (cast(char[]) contents_location_).split;
    auto tmp_dir_ = (sisudoc_txt_).dirName.array;
    foreach (contents_location; contents_locations_arr) {
      assert(contents_location.match(rgx.src_pth_sst_or_ssm),
        "not a recognised file: «" ~
        contents_location ~ "»"
      );
      auto contents_location_pth_ = (contents_location).to!string;
      auto lang_rgx_ = regex(r"/(" ~ _opt_action.languages_set.join("|") ~ ")/");
      if (_opt_action.languages_set[0] == "all"
        || (contents_location_pth_).match(lang_rgx_)
      ) {
        auto _fns = (((tmp_dir_).chainPath(contents_location_pth_)).array).to!(string);
        _manifest_matter = PathMatters!()(_opt_action, _env, arg, _fns, contents_locations_arr);
        _manifests ~= _manifest_matter; // TODO how to capture?
      }
    }
  } else if (arg.match(rgx.src_pth_sst_or_ssm)) {
    if (exists(arg)==0) {
      writeln("ERROR >> Processing Skipped! File not found: ", arg);
    } else {
      _manifests ~= PathMatters!()(_opt_action, _env, arg, arg); // gather input markup source file names for processing
    }
  } else if (arg.match(rgx.src_pth_zip)) {
    // fns_src ~= arg;             // gather input markup source file names for processing
  } else {                      // anything remaining, unused
    arg_unrecognized ~= " " ~ arg;
  }
}
#+END_SRC

**** config files load & read (toml or sdlang)

#+NAME: sdp_conf_files
#+BEGIN_SRC d
auto _config_document_struct = readConfigDoc!()(_manifest, _env); // document config file
auto _config_local_site_struct = readConfigSite!()(_manifest, _env); // local site config
ConfCompositePlus _make_and_meta_struct;
switch (_config_local_site_struct.filetype) {
case "toml" :
  _make_and_meta_struct = configParseTOMLreturnSiSUstruct!()(_make_and_meta_struct, _config_document_struct);
  _make_and_meta_struct = configParseTOMLreturnSiSUstruct!()(_make_and_meta_struct, _config_local_site_struct);
  break;
case "sdl" :
  auto sdl_root_config_document = parseSDLangConfig!()(_config_document_struct.content, _config_document_struct.filename);
  auto sdl_root_config_local_site = parseSDLangConfig!()(_config_local_site_struct.content, _config_local_site_struct.filename);
  _make_and_meta_struct = confFilesSDLtoStruct!()(sdl_root_config_document, sdl_root_config_local_site);
  break;
default :
  break;
}
#+END_SRC

** 2a. actions independent of processing files
#+NAME: sdp_do_selected
#+BEGIN_SRC d
if (!(_opt_action.skip_output)) {
  debug(steps) {
    writeln("step0 commence → (without processing files)");
  }
  outputHubOp!()(_opt_action);
  debug(steps) {
    writeln("- step0 complete");
  }
}
#+END_SRC

** _2b. processing: (loop each file)_ [+2]                       :loop:files:
*** scope (loop)                                                    :scope:

#+NAME: sdp_each_file_do_scope
#+BEGIN_SRC d
scope(success) {
  debug(checkdoc) {
    writefln(
      "%s\n%s",
      "~ document complete, ok ~",
      "------------------------------------------------------------------",
    );
  }
}
scope(failure) {
  debug(checkdoc) {
    stderr.writefln(
      "~ document run failure ~ (%s  v%s)\n\t%s",
      __VENDOR__, __VERSION__,
      manifest.src.filename
    );
  }
}
enforce(
  manifest.src.filename.match(rgx.src_pth_types),
  "not a sisu markup filename: «" ~
  manifest.src.filename ~ "»"
);
#+END_SRC

*** 1. _document abstraction_ [#A]

- return tuple of:
  - doc_abstraction (the document)
  - doc_matters

#+NAME: sdp_each_file_do_abstraction
#+BEGIN_SRC d
auto t = SiSUabstraction!()(_env, _opt_action, manifest);
static assert(!isTypeTuple!(t));
static assert(t.length==2);
auto doc_abstraction = t[dAM.abstraction];
auto doc_matters = t[dAM.matters];
#+END_SRC

*** 2. _output processing_ (post abstraction processing)                          >>
**** 0. abstraction _print summary_                    :abstraction:summary:

#+NAME: sdp_each_file_do_debugs_checkdoc
#+BEGIN_SRC d
/+ ↓ debugs +/
if (doc_matters.opt.action.verbose) {
  SiSUabstractionSummary!()(doc_abstraction, doc_matters);
}
#+END_SRC

**** 1. _debug_ (document parts, checkdoc)                  :debug:checkdoc:
- [[./meta_output_debugs.org][meta_output_debugs]]

#+NAME: sdp_each_file_do_debugs_checkdoc
#+BEGIN_SRC d
/+ ↓ debugs +/
if ((doc_matters.opt.action.debug_do)
|| (doc_matters.opt.action.verbose)
) {
  SiSUdebugs!()(doc_abstraction, doc_matters);
}
#+END_SRC

**** 2. _process outputs_                                          :outputs:
- [[./output_hub.org][output_hub]]

#+NAME: sdp_each_file_do_selected_output
#+BEGIN_SRC d
/+ ↓ output hub +/
if (!(doc_matters.opt.action.skip_output)) {
  debug(steps) {
    writeln("step5 commence → (process outputs)");
  }
  outputHub!()(doc_abstraction, doc_matters);
  debug(steps) {
    writeln("- step5 complete");
  }
}
#+END_SRC

*** scope (on loop exit)                                       :scope:exit:

#+NAME: sdp_each_file_do_scope_exit
#+BEGIN_SRC d
scope(exit) {
  debug(checkdoc) {
    writefln(
      "processed file: %s",
      manifest.src.filename
    );
  }
  destroy(manifest);
}
#+END_SRC

** +2c. no valid filename provided+
#+NAME: sdp_no_filename_provided
#+BEGIN_SRC d
/+ no recognized filename provided +/
writeln("no recognized filename");
break; // terminate, stop
#+END_SRC

* 2. _document abstraction functions_                  :module:sdp:abstraction:
** 0. module template

#+BEGIN_SRC d  :tangle ../src/sdp/meta/metadoc.d
module sdp.meta.metadoc;
template SiSUabstraction() {
  <<imports_sdp>>
  <<sdp_mixin>>
  enum headBody { header, body_content, insert_file_list, image_list }
  enum makeMeta { make, meta }
  enum docAbst  { doc_abstraction, section_keys, segnames, segnames_0_4, images }
  static auto rgx = Rgx();
  auto SiSUabstraction(E,O,M)(
    E _env,
    O _opt_action,
    M _manifest,
  ){
    <<sdp_conf_files>>
    <<sdp_each_file_do_read_and_split_sisu_markup_file_content_into_header_and_body>>
    <<sdp_each_file_do_split_sisu_markup_file_header_into_make_and_meta>>
    <<sdp_each_file_do_document_abstraction>>
    <<sdp_each_file_do_document_matters>>
    auto t = tuple(doc_abstraction, doc_matters);
    static assert(t.length==2);
    return t;
  }
}
#+END_SRC

** 1. raw file content split, doc: _header_, _content_ +(lists: subdocs? images?)   >>
- [[./meta_read_source_files.org][meta_read_source_files]]

- read in the _marked up source document_ and
  - split the document into:
    - document header
    - document body
      - from markup source
      - if master document from sub documents content
  - if a master document
    - make a list of insert files
  - if build source pod requested
    - scan for list of images
      (action avoided if not needed at this stage)

- _return a tuple of_:
  - header
  - body
  - insert file list
  - image list (if build source pod requested)

if build source pod requested all information needed to build it available at this point
  - manifest related information  _manifest
  - insert file list              _header_body_insertfilelist_imagelist[headBody.insert_file_list]
  - image list                    _header_body_insertfilelist_imagelist[headBody.image_list]

#+NAME: sdp_each_file_do_read_and_split_sisu_markup_file_content_into_header_and_body
#+BEGIN_SRC d
/+ ↓ read file (filename with path) +/
/+ ↓ file tuple of header and content +/
debug(steps) {
  writeln("step1 commence → (get document header & body & insert file list & if needed image list)"
  );
}
auto _header_body_insertfilelist_imagelist
  = SiSUrawMarkupContent!()(_opt_action, _manifest.src.path_and_fn);
static assert(!isTypeTuple!(_header_body_insertfilelist_imagelist));
static assert(_header_body_insertfilelist_imagelist.length==4);
debug(steps) {
  writeln("- step1 complete");
}
debug(header_and_body) {
  writeln(header);
  writeln(_header_body_insertfilelist_imagelist.length);
  writeln(_header_body_insertfilelist_imagelist.length[headBody.body_content][0]);
}
#+END_SRC

** 2. _document metadata_ & _make instructions_ (struct from toml or sdlang)        >>
header: toml or sdlang
- [[./meta_conf_make_meta.org][meta_conf_make_meta]]

- read _document header_, split into:
  - metadata
  - make instructions
- read config files
  - consolidate make instructions
- _return tuple of_:
  - document metadata
  - make instructions (from configuration files & document header make
    instructions)

#+NAME: sdp_each_file_do_split_sisu_markup_file_header_into_make_and_meta
#+BEGIN_SRC d
/+ ↓ split header into make and meta +/
debug(steps) {
  writeln("step2 commence → (read document header - toml or sdlang, return struct)");
}
_make_and_meta_struct =
((_header_body_insertfilelist_imagelist[headBody.header]).match(rgx.toml_header_meta_title))
? docHeaderMakeAndMetaTupTomlExtractAndConvertToStruct!()(
    _make_and_meta_struct,
    _header_body_insertfilelist_imagelist[headBody.header]
  )
: docHeaderMakeAndMetaTupSDLangExtractAndConvertToStruct!()(
    _make_and_meta_struct,
    _header_body_insertfilelist_imagelist[headBody.header]
  );
debug(steps) {
  writeln("- step2 complete");
}
#+END_SRC

** 3. _document abstraction, tuple_ (output-pre-processing)                       >>
- [[./meta_abstraction.org][meta_abstraction]]

- prepare the document abstraction used in downstream processing

- _return tuple of_:
  - document abstraction (_the_document_ or doc_abstraction)
  - document abstraction keys
    - (head, toc, body, endnotes, glossary, bibliography, bookindex, blurb,
      tail)
    - (transfer to _doc_matters_)
  - segnames for html epub (transfer to _doc_matters_)
  - image list (transfer to _doc_matters_)

#+NAME: sdp_each_file_do_document_abstraction
#+BEGIN_SRC d
/+ ↓ document abstraction: process document, return abstraction as tuple +/
debug(steps) {
  writeln("step3 commence → (document abstraction (da); da keys; segnames; doc_matters)");
}
auto da = SiSUdocAbstraction!()(
  _header_body_insertfilelist_imagelist[headBody.body_content],
  _make_and_meta_struct,
  _opt_action,
);
static assert(!isTypeTuple!(da));
static assert(da.length==5);
auto doc_abstraction = da[docAbst.doc_abstraction]; /+ head ~ toc ~ body ~ endnotes_seg ~ glossary ~ bibliography ~ bookindex ~ blurb; +/
auto _document_section_keys_sequenced = da[docAbst.section_keys];
string[] _doc_html_segnames = da[docAbst.segnames];
string[] _doc_epub_segnames_0_4 = da[docAbst.segnames_0_4];
auto _images = da[docAbst.images];
debug(steps) {
  writeln("- step3 complete");
}
#+END_SRC

** 4. _document matters_ (doc info gathered, various sources)                     >>

- prepare document_matters, miscellany about processing and the document of use
  in downstream processing

#+NAME: sdp_each_file_do_document_matters
#+BEGIN_SRC d
debug(steps) {
  writeln("step4 commence → (doc_matters)");
}
struct DocumentMatters {
  auto conf_make_meta() { // TODO meld with all make instructions
    return _make_and_meta_struct;
  }
  auto env() {
    struct Env_ {
      auto pwd() {
        return _manifest.env.pwd;
      }
      auto home() {
        return _manifest.env.home;
      }
    }
    return Env_();
  }
  auto opt() {
    struct Opt_ {
      auto action() {
        /+ getopt options, commandline instructions, raw
         - processing instructions --epub --html etc.
         - command line config instructions --output-path
        +/
        return _opt_action;
      }
    }
    return Opt_();
  }
  auto src() {
    return _manifest.src;
  }
  auto src_path_info() {
    return SiSUpathsSRC!()(_manifest.env.pwd, _manifest.src.file_with_absolute_path); // would like (to have and use) relative path
  }
  auto srcs() {
    struct SRC_ {
      auto file_insert_list() {
        return _header_body_insertfilelist_imagelist[headBody.insert_file_list];
      }
      auto image_list() {
        return _images;
      }
    }
    return SRC_();
  }
  auto pod() {
    return _manifest.pod;
  }
  auto xml() {
    struct XML_ {
      auto keys_seq() {
        /+ contains .seg & .scroll sequences +/
        return _document_section_keys_sequenced;
      }
      string[] segnames() {
        return _doc_html_segnames;
      }
      string[] segnames_lv_0_to_4() {
        return _doc_epub_segnames_0_4;
      }
    }
    return XML_();
  }
  auto output_path() {
    return _manifest.output.path;
  }
}
auto doc_matters = DocumentMatters();
debug(steps) {
  writeln("- step4 complete");
}
#+END_SRC

* 3. document abstraction _summary_                :module:sdp:metadoc_summary:
** 0. module template

#+BEGIN_SRC d :tangle ../src/sdp/meta/metadoc_summary.d
module sdp.meta.metadoc_summary;
template SiSUabstractionSummary() {
  auto SiSUabstractionSummary(S,T)(
    auto return ref const S  doc_abstraction,
    auto return ref       T  doc_matters,
  ) {
    <<metadoc_summary_imports>>
    mixin InternalMarkup;
    <<metadoc_summary_initialize>>
    if (doc_matters.opt.action.verbose) {
      <<meta_metadoc_summary>>
    }
  }
}
#+END_SRC

** init
*** imports

#+name: metadoc_summary_imports
#+BEGIN_SRC d
import
  sdp.meta.defaults,
  sdp.meta.rgx;
import
  std.array,
  std.exception,
  std.regex,
  std.stdio,
  std.string,
  std.traits,
  std.typecons,
  std.uni,
  std.utf,
  std.conv : to;
#+END_SRC

*** initialize                                                     :report:

#+name: metadoc_summary_initialize
#+BEGIN_SRC d
auto markup = InlineMarkup();
#+END_SRC

** (last ocn)

#+name: meta_metadoc_summary
#+BEGIN_SRC d
string[string] check = [
  "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
  "last_obj_cite_number_body"  : "0",
  "last_obj_cite_number_bkidx" : "0",
];
foreach (k; doc_matters.xml.keys_seq.seg) {
  foreach (obj; doc_abstraction[k]) {
    if (obj.of_part != "empty") {
      if (!empty(obj.obj_cite_number)) {
        if (k == "body") {
          check["last_obj_cite_number_body"] = obj.obj_cite_number;
        }
        if (!(obj.obj_cite_number.empty)) {
          check["last_obj_cite_number"] = obj.obj_cite_number;
        }
      }
      if (k == "bookindex_seg") {
        if (obj.obj_cite_number_type == 2) {
          check["last_obj_cite_number_bkidx"] = obj.obj_cite_number_bkidx;
        }
      }
    }
  }
}
#+END_SRC

** summary

#+name: meta_metadoc_summary
#+BEGIN_SRC d
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;
writefln(
  "%s\n\"%s\", %s\n%s\n%s\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n%30-s%10-d\n(%s: %s)\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,
  markup.repeat_character_by_number_provided("-", char_repeat_number),
  "length toc arr:",
  to!int(doc_abstraction["toc_seg"].length),
  "length doc_abstraction arr:",
  to!int(doc_abstraction["body"].length),
  "last doc body ocn:",
  to!int(check["last_obj_cite_number_body"]),
  "last obj_cite_number:",
  to!int(check["last_obj_cite_number"]),
  "length endnotes:",                                // subtract headings
  (doc_abstraction["endnotes"].length > 2)
  ? (to!int(doc_abstraction["endnotes"].length - 2))
  : 0,
  "length glossary:",
  (doc_abstraction["glossary"].length > 1)
  ? (to!int(doc_abstraction["glossary"].length))
  : 0,
  "length biblio:",
  (doc_abstraction["bibliography"].length > 1)
  ? (to!int(doc_abstraction["bibliography"].length))
  : 0,
  "length bookindex:",
  (doc_abstraction["bookindex_seg"].length > 1)
  ? (to!int(doc_abstraction["bookindex_seg"].length))
  : 0,
  "  last book idx ocn:",
  to!int(check["last_obj_cite_number_bkidx"]),
  "length blurb:",
  (doc_abstraction["blurb"].length > 1)
  ? (to!int(doc_abstraction["blurb"].length))
  : 0,
  __FILE__,
  __LINE__,
  markup.repeat_character_by_number_provided("-", min_repeat_number),
);
#+END_SRC

* __END__
dev notes

** sdp glossary / terms

|------+-------------------------------------|
| sdp  | sisu document parser                |
|------+-------------------------------------|
| dmso | document markup, structure, objects |
|------+-------------------------------------|
| meta | meta document, document abstraction |
| mda  | meta, meta document abstraction     |
| adr  | abstract document representation    |
| dar  | document abstract representation    |
| (da) | (document abstraction)              |
|      | (code representation of document)   |
|------+-------------------------------------|
| ao   | abstract objects                    |
|      | (code representation of objects)    |
|------+-------------------------------------|

consider
|-------+----------------------------------------------|
| dao   | document abstraction, objects                |
|-------+----------------------------------------------|
| daso  | document abstraction, structure, objects     |
|-------+----------------------------------------------|
| drso  | document representation, structure, objects  |
|-------+----------------------------------------------|
| daows | document abstraction, objects with structure |
|-------+----------------------------------------------|

** the document notes
*** document sections
**** summary

|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
| section      | part         | opt. |   | objects                                          | ocn                            |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
| front matter | head         | *    |   |                                                  | no                             |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
| toc          | toc          |      |   | generated from headings                          | no                             |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
| body         | body         | *    |   | default section                                  | yes                            |   |   |
|              |              |      |   | - headings                                       |                                |   |   |
|              |              |      |   | - paras                                          |                                |   |   |
|              |              |      |   | - code                                           |                                |   |   |
|              |              |      |   | - poem                                           |                                |   |   |
|              |              |      |   | - group                                          |                                |   |   |
|              |              |      |   | - block                                          |                                |   |   |
|              |              |      |   | - quote                                          |                                |   |   |
|              |              |      |   | - table                                          |                                |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
| back matter  | endnote      |      |   | generated from inline note markup                | no (each endnote belongs to    |   |   |
|              |              |      |   |                                                  | a (body) object)               |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
|              | glossary     |      |   | identified section, limited markup               | possibly, to make searchable   |   |   |
|              |              |      |   | - heading                                        | hidden                         |   |   |
|              |              |      |   | - paras                                          |                                |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
|              | bibliography |      |   | generated from inline special markup             | possibly, to make searchable   |   |   |
|              |              |      |   | appended to paragraphs contained in body section | hidden                         |   |   |
|              |              |      |   | - heading                                        |                                |   |   |
|              |              |      |   | - paras                                          |                                |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
|              | book index   |      |   | generated from inline special markup             | possibly, special numbering or |   |   |
|              |              |      |   | - heading                                        | could use term as anchor?      |   |   |
|              |              |      |   | - paras                                          | to make searchable             |   |   |
|              |              |      |   |                                                  | hidden                         |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|
|              | blurb        |      |   | identified section, limited markup               | no (unless non-substantive     |   |   |
|              |              |      |   | - heading                                        | given special numbering)       |   |   |
|              |              |      |   | - paras                                          |                                |   |   |
|--------------+--------------+------+---+--------------------------------------------------+--------------------------------+---+---|

**** on abstraction

- abstract for downstream processing
  - identify document structure and objects
    - identify document structure (headings/levels/sections)
    - identify objects (headings, paragraphs, tables, code blocks, verse ...)
  - set document, generate common abstraction for downstream parsing
    - set different _document sections_:
      - _head_, toc, _body_, endnotes, glossary, bibliography, book index, blurb
    - _object numbers_, heading/ chapter numbering etc, endnote numbers
      - _regular ocn_
        - body objects
        - glossary objects
        - bibliography objects
      - _special ocn_
        - non substantive text (provide special numbers)
          - blurb objects
        - book index
      - special (_exceptions_)
        - endnotes
  - unify object representations
    - multiple markups for same object type given single representation
  - extract object attributes
  - unify inline markup on objects
    - inline markup made easier to identify

- simplify downstream parsing

*** objects
**** summary

|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
|       |              | identified by              | object notes             | attributes     | inline          | embedded       | special    |
|       |              |                            |                          |                |                 | appended       | characters |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
| para  | heading      | level markers              |                          |                | - italics       | - endnotes     |            |
|       |              | at start of line           |                          |                |                 | - bibliography |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
|       | paragraph    | delimited by two new lines | default object           | - indent       | - bold          | - endnotes     |            |
|       |              |                            | [discard leading &       | - bullet       | - italics       | - bibliography |            |
|       |              |                            | newline whitespace]      |                | - underscore    |                |            |
|       |              |                            |                          |                | - strikethrough |                |            |
|       |              |                            |                          |                | - superscript   |                |            |
|       |              |                            |                          |                | - subscript     |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
| block |              | open and close tags        |                          |                |                 |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
| TODO  | quote        |                            |                          | - language?    |                 |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
| TODO  | group        |                            | - inline markup applied  | - language?    | as paragraph    | - endnotes     |            |
|       |              |                            | - [discard leading &     |                |                 | - bibliography |            |
|       |              |                            | newline whitespace]      |                |                 |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
| TODO  | block        |                            | - inline markup applied  |                | as paragraph    | - endnotes     |            |
|       |              |                            | - whitespace indentation |                |                 | - bibliography |            |
|       |              |                            | & newlines               |                |                 |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
|       | poem / verse | open and close tags        | verse is the object      |                |                 | - endnotes     |            |
|       |              |                            | - inline markup applied  |                |                 | - bibliography |            |
|       |              | (for poem)                 | - whitespace indentation |                |                 |                |            |
|       |              |                            | & newlines               |                |                 |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
|       | code         |                            | - contents untouched     | - syntax       |                 |                |            |
|       |              |                            | - whitespace indentation | - numbered     |                 |                |            |
|       |              |                            | & newlines               |                |                 |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|
|       | table        |                            |                          | - column width |                 |                |            |
|       |              |                            |                          | - heading row  |                 |                |            |
|-------+--------------+----------------------------+--------------------------+----------------+-----------------+----------------+------------|

**** ocn

|-------------+-----------------------+-----------------------+----------------+------|
| *objects     | section / part        | ocn described         | how used*       | type |
|-------------+-----------------------+-----------------------+----------------+------|
| regular ocn |                       |                       |                |      |
|-------------+-----------------------+-----------------------+----------------+------|
|             | body objects          | seq. digit            | anchor         | ocn  |
|             |                       | [0-9]+                | visible        |      |
|-------------+-----------------------+-----------------------+----------------+------|
|             | glossary objects      | seq. digit            | anchor         | ocn  |
|             |                       | [0-9]+                | not-visible    |      |
|             |                       |                       | (for search)   |      |
|-------------+-----------------------+-----------------------+----------------+------|
|             | bibliography objects  | seq. digit            | anchor         | ocn  |
|             |                       | [0-9]+                | not-visible    |      |
|             |                       |                       | (for search)   |      |
|-------------+-----------------------+-----------------------+----------------+------|
| special ocn |                       |                       |                |      |
|-------------+-----------------------+-----------------------+----------------+------|
|             | non-substantive text  | x char + seq. digit   | anchor         | non  |
|             | (within body & blurb) | x[0-9]+               | not-visible    |      |
|             |                       |                       | (for search)   |      |
|-------------+-----------------------+-----------------------+----------------+------|
|             | book index            | i char + seq. digit   | anchor         | idx  |
|             |                       | i[0-9]+               | not-visible    |      |
|             |                       |                       | (for search)   |      |
|-------------+-----------------------+-----------------------+----------------+------|
| without ocn |                       |                       |                |      |
|-------------+-----------------------+-----------------------+----------------+------|
|             | endnotes              | ocn of parent object  | no ocn         | fn   |
|             |                       | + footnote seq. digit | anchor visible |      |
|-------------+-----------------------+-----------------------+----------------+------|

** make config - _composite make_

work on composite make a unification of make instructions for each document run

extract instructions from all config files, unify the make instructions and
provide the result as a single set of make instructions for each document parsed

- 1. general, document_make config file (to be applied to all documents unless
  overridden by document or command line instruction)
- 2. local, site specific (site local instructions such as the site's url, cgi
  location etc.)
- 3. each document header, make (the document header contains metadata and may
  include make instructions for that document)
  - make
  - meta
- 4. command line instruction, make (some make instructions may be passed
  through the command line)

*** instruction sources

|----+---------------------------------+----------------------------------------+---------------------+---|
|    | make instruction source         |                                        | varies (applies to) |   |
|----+---------------------------------+----------------------------------------+---------------------+---|
| 0. | unify the following as a single | take into account all the instructions |                     |   |
|    | set of make instructions        | provided below, provide interface      |                     |   |
|----+---------------------------------+----------------------------------------+---------------------+---|
| 1. | document_make file              | to be applied to all documents         | per directory       |   |
|    | "config_document"               | (unless subsequently overridden)       | (all docs within)   |   |
|----+---------------------------------+----------------------------------------+---------------------+---|
| 2. | config file                     | local site specific                    | per directory       |   |
|    | "config_local_site"             |                                        | (all docs within)   |   |
|----+---------------------------------+----------------------------------------+---------------------+---|
| 3. | document header make            | make instructions contained            | per document        |   |
|    |                                 | in document header                     | (single doc)        |   |
|----+---------------------------------+----------------------------------------+---------------------+---|
| 4. | command line instruction        | make instruction passed                | each command        |   |
|    |                                 |                                        | (all docs within)   |   |
|----+---------------------------------+----------------------------------------+---------------------+---|

*** config & metadata (from instruction sources)

|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     | 1. document make file    | 2. config file             | 3. document header     | 4. command line instruction |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
| comment, fixed:     | per dir (sisupod)        | per dir                    | per document (sisupod) | per command instruction     |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     | sdl_root_config_document | sdl_root_config_local_site |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
| local site specific |                          | *                          |                        | *?                          |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | webserv                    |                        |                             |
|                     |                          | - url_root                 |                        |                             |
|                     |                          | - path                     |                        |                             |
|                     |                          | - images                   |                        |                             |
|                     |                          | - cgi                      |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | webserv_cgi                |                        |                             |
|                     |                          | - host                     |                        |                             |
|                     |                          | - base_path                |                        |                             |
|                     |                          | - port                     |                        |                             |
|                     |                          | - user                     |                        |                             |
|                     |                          | - file_links               |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | processing                 |                        |                             |
|                     |                          | - path                     |                        |                             |
|                     |                          | - dir                      |                        |                             |
|                     |                          | - concord_max              |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | flag (configure)           |                        | (call)                      |
|                     |                          | - act0                     |                        | act0                        |
|                     |                          | - act1                     |                        | act1                        |
|                     |                          | - act2                     |                        | act2                        |
|                     |                          | - act3                     |                        | act3                        |
|                     |                          | - act4                     |                        | act4                        |
|                     |                          | - act5                     |                        | act5                        |
|                     |                          | - act6                     |                        | act6                        |
|                     |                          | - act7                     |                        | act7                        |
|                     |                          | - act8                     |                        | act8                        |
|                     |                          | - act9                     |                        | act9                        |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | default                    |                        |                             |
|                     |                          | - papersize                |                        |                             |
|                     |                          | - text_wrap                |                        |                             |
|                     |                          | - emphasis                 |                        |                             |
|                     |                          | - language                 |                        |                             |
|                     |                          | - digest                   |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | permission                 |                        |                             |
|                     |                          | - share_source             |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | program_select             |                        |                             |
|                     |                          | - editor                   |                        |                             |
|                     |                          | - epub_viewer              |                        |                             |
|                     |                          | - html_viewer              |                        |                             |
|                     |                          | - odf_viewer               |                        |                             |
|                     |                          | - pdf_viewer               |                        |                             |
|                     |                          | - xml_viewer               |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          | search                     |                        |                             |
|                     |                          | - flag                     |                        |                             |
|                     |                          | - action                   |                        |                             |
|                     |                          | - db                       |                        |                             |
|                     |                          | - title                    |                        |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
| make instruction    | **                       | omit or override share?    | **                     | *?                          |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     | make                     | make                       | make                   |                             |
|                     | - bold                   | - bold                     | - bold                 |                             |
|                     | - breaks                 | - breaks                   | - breaks               |                             |
|                     | - cover_image            | - cover_image              | - cover_image          |                             |
|                     | - css                    | - css                      | - css                  |                             |
|                     | - emphasis               | - emphasis                 | - emphasis             |                             |
|                     | - footer                 | - footer                   | - footer               |                             |
|                     | - headings               | - headings                 | - headings             |                             |
|                     | - home_button_image      | - home_button_image        | - home_button_image    |                             |
|                     | - home_button_text       | - home_button_text         | - home_button_text     |                             |
|                     | - italics                | - italics                  | - italics              |                             |
|                     | - num_top                | - num_top                  | - num_top              |                             |
|                     | - num_depth              | - num_depth                | - num_depth            |                             |
|                     | - substitute             | - substitute               | - substitute           |                             |
|                     | - texpdf_font            | - texpdf_font              | - texpdf_font          |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
| actions             |                          |                            |                        | *                           |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            |                        | assertions                  |
|                     |                          |                            |                        | concordance                 |
|                     |                          |                            |                        | debug                       |
|                     |                          |                            |                        | digest                      |
|                     |                          |                            |                        | docbook                     |
|                     |                          |                            |                        | epub                        |
|                     |                          |                            |                        | html                        |
|                     |                          |                            |                        | html-seg                    |
|                     |                          |                            |                        | html-scroll                 |
|                     |                          |                            |                        | manifest                    |
|                     |                          |                            |                        | ocn                         |
|                     |                          |                            |                        | odt                         |
|                     |                          |                            |                        | pdf                         |
|                     |                          |                            |                        | postgresql                  |
|                     |                          |                            |                        | qrcode                      |
|                     |                          |                            |                        | sisupod                     |
|                     |                          |                            |                        | source                      |
|                     |                          |                            |                        | sqlite                      |
|                     |                          |                            |                        | sqlite-create               |
|                     |                          |                            |                        | sqlite-drop                 |
|                     |                          |                            |                        | text                        |
|                     |                          |                            |                        | verbose                     |
|                     |                          |                            |                        | xhtml                       |
|                     |                          |                            |                        | xml-dom                     |
|                     |                          |                            |                        | xml-sax                     |
|                     |                          |                            |                        | section_toc                 |
|                     |                          |                            |                        | section_body                |
|                     |                          |                            |                        | section_endnotes            |
|                     |                          |                            |                        | section_glossary            |
|                     |                          |                            |                        | section_biblio              |
|                     |                          |                            |                        | section_bookindex           |
|                     |                          |                            |                        | section_blurb               |
|                     |                          |                            |                        | backmatter                  |
|                     |                          |                            |                        | skip-output                 |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
| metadata            |                          |                            | *                      |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | classify               |                             |
|                     |                          |                            | - dewey                |                             |
|                     |                          |                            | - keywords             |                             |
|                     |                          |                            | - loc                  |                             |
|                     |                          |                            | - subject              |                             |
|                     |                          |                            | - topic_register       |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | creator                |                             |
|                     |                          |                            | - author               |                             |
|                     |                          |                            | - author_email         |                             |
|                     |                          |                            | - illustrator          |                             |
|                     |                          |                            | - translator           |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | date                   |                             |
|                     |                          |                            | - added_to_site        |                             |
|                     |                          |                            | - available            |                             |
|                     |                          |                            | - created              |                             |
|                     |                          |                            | - issued               |                             |
|                     |                          |                            | - modified             |                             |
|                     |                          |                            | - published            |                             |
|                     |                          |                            | - valid                |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | identifier             |                             |
|                     |                          |                            | - isbn                 |                             |
|                     |                          |                            | - oclc                 |                             |
|                     |                          |                            | - pg                   |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | links                  |                             |
|                     |                          |                            | - link                 |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | notes                  |                             |
|                     |                          |                            | - abstract             |                             |
|                     |                          |                            | - description          |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | original               |                             |
|                     |                          |                            | - language             |                             |
|                     |                          |                            | - source               |                             |
|                     |                          |                            | - title                |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | publisher              |                             |
|                     |                          |                            | - name                 |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | rights                 |                             |
|                     |                          |                            | - copyright            |                             |
|                     |                          |                            | - cover                |                             |
|                     |                          |                            | - illustrations        |                             |
|                     |                          |                            | - license              |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|
|                     |                          |                            | title                  |                             |
|                     |                          |                            | - edition              |                             |
|                     |                          |                            | - full                 |                             |
|                     |                          |                            | - language             |                             |
|                     |                          |                            | - main                 |                             |
|                     |                          |                            | - note                 |                             |
|                     |                          |                            | - sub                  |                             |
|                     |                          |                            | - subtitle             |                             |
|---------------------+--------------------------+----------------------------+------------------------+-----------------------------|