/++
  default settings
+/
template SiSUregisters() {
  string[string][string] conf_aa() {
    auto conf_ = [
      "webserv": [
         "url_root"         : "",
         "path"             : "~/sdp_www" ,
         "images"           : "" ,
         "cgi"              : "/usr/local/lib/sdp-cgi"
      ],
      "webserv_cgi": [
         "host"             : "localhost",
         "base_path"        : "",
         "port"             : "8081",
         "user"             : "",
         "file_links"       : "www.sisudoc.org"
      ],
      "processing": [
         "path"             : "~",
         "dir"              : "_sisu_processing",
         "concord_max"      : "400000"
      ],
      "flag": [
         "act0"             : "--digest --qrcode --text --html --epub --concordance --pdf --odf --docbook --xhtml --xml-sax --xml-dom --sqlite --manifest --verbose",
         "act1"             : "--digest --text --html --manifest",
         "act2"             : "--digest --text --html --epub --pdf --manifest",
         "act3"             : "--digest --qrcode --text --html --epub --concordance --pdf --manifest",
         "act4"             : "--digest --qrcode --text --html --epub --concordance --pdf --odf --docbook --manifest",
         "act5"             : "--digest --qrcode --text --html --epub --concordance --pdf --odf --docbook --sqlite --manifest",
         "act6"             : "--digest --qrcode --text --html --epub --concordance --pdf --odf --docbook --xhtml --xml-sax --xml-dom --sqlite --manifest",
         "act7"             : "--digest --qrcode --text --html --epub --concordance --pdf --odf --docbook --xhtml --xml-sax --xml-dom --sqlite --source --sisupod --manifest",
         "act8"             : "--digest --qrcode --text --html --epub --concordance --pdf --odf --docbook --xhtml --xml-sax --xml-dom --pg --update --manifest",
         "act9"             : "--digest --qrcode --text --html --epub --concordance --pdf --odf --docbook --xhtml --xml-sax --xml-dom --pg --update --source --sisupod --manifest"
      ],
      "default": [
         "papersize"        : "a4,letter",
         "text_wrap"        : "78",
         "emphasis"         : "bold",
         "language"         : "en",
         "digest"           : "sha256"
      ],
      "permission": [
         "share_source"     : ""
       ],
      "program_select": [
         "editor"           : "vim",
         "epub_viewer"      : "ebook-viewer",
         "html_viewer"      : "xombrero",
         "odf_viewer"       : "lowriter",
         "pdf_viewer"       : "evince",
         "xml_viewer"       : "xml-viewer"
      ],
      "search": [
         "flag"             : "",
         "action"           : "",
         "db"               : "",
         "title"            : ""
      ]
    ];
    return conf_;
  }
  string[string][string] make_aa() {
    auto make_ = [
      "make": [
        "bold"              : "",
        "breaks"            : "",
        "cover_image"       : "",
        "css"               : "",
        "emphasis"          : "",
        "footer"            : "",
        "headings"          : "",
        "home_button_image" : "",
        "home_button_text"  : "",
        "italics"           : "",
        "num_top"           : "",
        "num_depth"         : "",
        "substitute"        : "",
        "texpdf_font"       : ""
      ]
    ];
    return make_;
  }
  string[string][string] meta_aa() {
    auto meta_ = [
      "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"          : ""
      ]
    ];
    return meta_;
  }
  auto ptr_head_main =
    [
      "classify",
      "creator",
      "date",
      "identifier",
      "links",
      "make",             /+ make +/
      "original",
      "notes",
      "rights",
      "title"
    ];
  auto ptr_head_sub_classify =
    [
      "dewey",
      "keywords",
      "loc",
      "subject",
      "topic_register"
    ];
  auto ptr_head_sub_creator =
    [
      "author",
      "author_email",
      "cover",
      "illustrator",
      "translator"
    ];
  auto ptr_head_sub_date =
    [
      "added_to_site",
      "available",
      "created",
      "issued",
      "modified",
      "published",
      "valid"
    ];
  auto ptr_head_sub_identifier =
    [
      "isbn",
      "oclc",
      "pg"
    ];
  /+ make +/
  auto ptr_head_sub_make =
    [
      "cover_image",
      "home_button_image",
      "home_button_text",
      "footer", "headings",
      "num_top", "num_depth",
      "breaks",
      "substitute",
      "bold",
      "italics",
      "emphasis",
      "texpdf_font",
      "css"
    ];
  auto ptr_head_sub_notes =
    [
      "abstract",
      "description"
    ];
  auto ptr_head_sub_original =
    [
      "language",
      "source",
      "title"
    ];
  auto ptr_head_sub_publisher =
    [ "name" ];
  auto ptr_head_sub_rights =
    [
      "copyright",
      "cover",
      "illustrations",
      "license"
    ];
  auto ptr_head_sub_title =
    [
      "edition",
      "full",
      "language",
      "main",
      "note",
      "sub"
    ];
  auto config_jsonstr = `{
  }`;
}
/+
  /+
    unify internal representation of header info for native & sdlang document headers
    represent either using struct, hashes or possibly json
    sdp internal representation should be identical for native & sdlang variants
  +/
header.
  ├── make                         // make instructions
  │   ├── bold
  │   ├── breaks
  │   ├── cover_image
  │   ├── css
  │   ├── emphasis
  │   ├── footer
  │   ├── headings
  │   ├── home_button_image
  │   ├── home_button_text
  │   ├── italics
  │   ├── num_top
  │   ├── substitute
  │   └── texpdf_font
  └── meta                         // metadata
     ├── author                    // move author to creator:author
     ├── classify
     │   ├── dewey
     │   ├── keyword
     │   ├── loc
     │   ├── subject
     │   └── topic_register
     ├── creator
     │   ├── author
     │   │     ├── [ [first_name: x0, last_name: y0], [first_name: x1, last_name: y1] ]
     │   │     └── [ full_name0, full_name1 ]
     │   ├── author_email
     │   ├── illustrator
     │   └── translator
     ├── date
     │   ├── added_to_site
     │   ├── available
     │   ├── created
     │   ├── issued
     │   ├── modified
     │   ├── published
     │   └── valid
     ├── identifier
     │   ├── isbn
     │   ├── oclc
     │   └── pg
     ├── links
     ├── notes
     │   ├── abstract
     │   └── description
     ├── original
     │   ├── language
     │   ├── source
     │   └── title
     ├── publisher
     │   └── name
     ├── rights
     │   ├── copyright
     │   ├── cover
     │   ├── illustrations
     │   └── license
     └── title                    // move title: to title:main
         ├── edition
         ├── [ full (main + sub) ]
         ├── language
         ├── main
         ├── note
         ├── sub
         └── subtitle              // move title:subtitle to title:sub

61 leaves
+/
template SiSUlanguageCodes() {
  /+ language codes +/
  struct Lang {
    string[string][string] codes() {
      auto _lang_codes = [
        "am":    [ "c": "am",    "n": "Amharic",           "t": "Amharic",                   "xlp": "amharic"      ],
        "bg":    [ "c": "bg",    "n": "Bulgarian",         "t": "Български (Bəlgarski)",     "xlp": "bulgarian"    ],
        "bn":    [ "c": "bn",    "n": "Bengali",           "t": "Bengali",                   "xlp": "bengali"      ],
        "br":    [ "c": "br",    "n": "Breton",            "t": "Breton",                    "xlp": "breton"       ],
        "ca":    [ "c": "ca",    "n": "Catalan",           "t": "catalan",                   "xlp": "catalan"      ],
        "cs":    [ "c": "cs",    "n": "Czech",             "t": "česky",                     "xlp": "czech"        ],
        "cy":    [ "c": "cy",    "n": "Welsh",             "t": "Welsh",                     "xlp": "welsh"        ],
        "da":    [ "c": "da",    "n": "Danish",            "t": "dansk",                     "xlp": "danish"       ],
        "de":    [ "c": "de",    "n": "German",            "t": "Deutsch",                   "xlp": "german"       ],
        "el":    [ "c": "el",    "n": "Greek",             "t": "Ελληνικά (Ellinika)",       "xlp": "greek"        ],
        "en":    [ "c": "en",    "n": "English",           "t": "English",                   "xlp": "english"      ],
        "eo":    [ "c": "eo",    "n": "Esperanto",         "t": "Esperanto",                 "xlp": "esperanto"    ],
        "es":    [ "c": "es",    "n": "Spanish",           "t": "español",                   "xlp": "spanish"      ],
        "et":    [ "c": "et",    "n": "Estonian",          "t": "Estonian",                  "xlp": "estonian"     ],
        "eu":    [ "c": "eu",    "n": "Basque",            "t": "basque",                    "xlp": "basque"       ],
        "fi":    [ "c": "fi",    "n": "Finnish",           "t": "suomi",                     "xlp": "finnish"      ],
        "fr":    [ "c": "fr",    "n": "French",            "t": "français",                  "xlp": "french"       ],
        "ga":    [ "c": "ga",    "n": "Irish",             "t": "Irish",                     "xlp": "irish"        ],
        "gl":    [ "c": "gl",    "n": "Galician",          "t": "Galician",                  "xlp": "galician"     ],
        "he":    [ "c": "he",    "n": "Hebrew",            "t": "Hebrew",                    "xlp": "hebrew"       ],
        "hi":    [ "c": "hi",    "n": "Hindi",             "t": "Hindi",                     "xlp": "hindi"        ],
        "hr":    [ "c": "hr",    "n": "Croatian",          "t": "Croatian",                  "xlp": "croatian"     ],
        "hy":    [ "c": "hy",    "n": "Armenian",          "t": "Armenian",                  "xlp": "armenian"     ],
        "ia":    [ "c": "ia",    "n": "Interlingua",       "t": "Interlingua",               "xlp": "interlingua"  ],
        "is":    [ "c": "is",    "n": "Icelandic",         "t": "Icelandic",                 "xlp": "icelandic"    ],
        "it":    [ "c": "it",    "n": "Italian",           "t": "Italiano",                  "xlp": "italian"      ],
        "ja":    [ "c": "ja",    "n": "Japanese",          "t": "日本語 (Nihongo)",         "xlp": "japanese"      ],
        "ko":    [ "c": "ko",    "n": "Korean",            "t": "Korean",                    "xlp": "korean"       ],
        "la":    [ "c": "la",    "n": "Latin",             "t": "Latin",                     "xlp": "latin"        ],
        "lo":    [ "c": "lo",    "n": "Lao",               "t": "Lao",                       "xlp": "lao"          ],
        "lt":    [ "c": "lt",    "n": "Lithuanian",        "t": "Lithuanian",                "xlp": "lithuanian"   ],
        "lv":    [ "c": "lv",    "n": "Latvian",           "t": "Latvian",                   "xlp": "latvian"      ],
        "ml":    [ "c": "ml",    "n": "Malayalam",         "t": "Malayalam",                 "xlp": "malayalam"    ],
        "mr":    [ "c": "mr",    "n": "Marathi",           "t": "Marathi",                   "xlp": "marathi"      ],
        "nl":    [ "c": "nl",    "n": "Dutch",             "t": "Nederlands",                "xlp": "dutch"        ],
        "no":    [ "c": "no",    "n": "Norwegian",         "t": "norsk",                     "xlp": "norsk"        ],
        "nn":    [ "c": "nn",    "n": "Norwegian Nynorsk", "t": "nynorsk",                   "xlp": "nynorsk"      ],
        "oc":    [ "c": "oc",    "n": "Occitan",           "t": "Occitan",                   "xlp": "occitan"      ],
        "pl":    [ "c": "pl",    "n": "Polish",            "t": "polski",                    "xlp": "polish"       ],
        "pt":    [ "c": "pt",    "n": "Portuguese",        "t": "Português",                 "xlp": "portuges"     ],
        "pt_BR": [ "c": "pt_BR", "n": "Portuguese Brazil", "t": "Brazilian Português",       "xlp": "brazilian"    ],
        "ro":    [ "c": "ro",    "n": "Romanian",          "t": "română",                    "xlp": "romanian"     ],
        "ru":    [ "c": "ru",    "n": "Russian",           "t": "Русский (Russkij)",         "xlp": "russian"      ],
        "sa":    [ "c": "sa",    "n": "Sanskrit",          "t": "Sanskrit",                  "xlp": "sanskrit"     ],
        "se":    [ "c": "se",    "n": "Sami",              "t": "Samin",                     "xlp": "samin"        ],
        "sk":    [ "c": "sk",    "n": "Slovak",            "t": "slovensky",                 "xlp": "slovak"       ],
        "sl":    [ "c": "sl",    "n": "Slovenian",         "t": "Slovenian",                 "xlp": "slovenian"    ],
        "sq":    [ "c": "sq",    "n": "Albanian",          "t": "Albanian",                  "xlp": "albanian"     ],
        "sr":    [ "c": "sr",    "n": "Serbian",           "t": "Serbian",                   "xlp": "serbian"      ],
        "sv":    [ "c": "sv",    "n": "Swedish",           "t": "svenska",                   "xlp": "swedish"      ],
        "ta":    [ "c": "ta",    "n": "Tamil",             "t": "Tamil",                     "xlp": "tamil"        ],
        "te":    [ "c": "te",    "n": "Telugu",            "t": "Telugu",                    "xlp": "telugu"       ],
        "th":    [ "c": "th",    "n": "Thai",              "t": "Thai",                      "xlp": "thai"         ],
        "tk":    [ "c": "tk",    "n": "Turkmen",           "t": "Turkmen",                   "xlp": "turkmen"      ],
        "tr":    [ "c": "tr",    "n": "Turkish",           "t": "Türkçe",                    "xlp": "turkish"      ],
        "uk":    [ "c": "uk",    "n": "Ukranian",          "t": "українська (ukrajins\"ka)", "xlp": "ukrainian"    ],
        "ur":    [ "c": "ur",    "n": "Urdu",              "t": "Urdu",                      "xlp": "urdu"         ],
        "us":    [ "c": "en",    "n": "English (American)","t": "English",                   "xlp": "english"      ],
        "vi":    [ "c": "vi",    "n": "Vietnamese",        "t": "Vietnamese",                "xlp": "vietnamese"   ],
        "zh":    [ "c": "zh",    "n": "Chinese",           "t": "中文",                     "xlp": "chinese"       ],
        "en":    [ "c": "en",    "n": "English",           "t": "English",                   "xlp": "english"      ],
        "xx":    [ "c": "xx",    "n": "Default",           "t": "English",                   "xlp": "english"      ],
      ];
      return _lang_codes;
    }
    string[] code_arr_ptr() {
      auto _lang_codes = ["am", "bg", "bn", "br", "ca", "cs", "cy", "da", "de", "el", "en", "eo", "es", "et", "eu", "fi", "fr", "ga", "gl", "he", "hi", "hr", "hy", "ia", "is", "it", "ja", "ko", "la", "lo", "lt", "lv", "ml", "mr", "nl", "no", "nn", "oc", "pl", "pt", "pt_BR", "ro", "ru", "sa", "se", "sk", "sl", "sq", "sr", "sv", "ta", "te", "th", "tk", "tr", "uk", "ur", "us", "vi", "zh", "en", "xx",];
      return _lang_codes;
    }
    string[] code_arr() {
      auto _lang_codes = ["am", "bg", "bn", "br", "ca", "cs", "cy", "da", "de", "el", "en", "eo", "es", "et", "eu", "fi", "fr", "ga", "gl", "he", "hi", "hr", "hy", "ia", "is", "it", "ja", "ko", "la", "lo", "lt", "lv", "ml", "mr", "nl", "no", "nn", "oc", "pl", "pt", "pt_BR", "ro", "ru", "sa", "se", "sk", "sl", "sq", "sr", "sv", "ta", "te", "th", "tk", "tr", "uk", "ur", "vi", "zh"];
      return _lang_codes;
    }
    auto codes_() {
      // return join(code_arr,"|");
      return "(" ~ join(code_arr,"|") ~ ")";
    }
    auto codes_regex() {
      return regex(codes_);
    }
  }
}
/+ regex flags +/
template SiSUrgxInitFlags() {
  int[string] flags_type_init() {
    int[string] flags_type_init = [
      "make_headings"        : 0,
      "header_make"          : 0,
      "header_meta"          : 0,
      "heading"              : 0,
      "biblio_section"       : 0,
      "glossary_section"     : 0,
      "blurb_section"        : 0,
      "para"                 : 0,
      "blocks"               : 0, // 0..2 generic
      "code"                 : 0, // 0..2
      "poem"                 : 0, // 0..2
      "table"                : 0, // 0..2
      "group"                : 0, // 0..2
      "block"                : 0, // 0..2
      "quote"                : 0, // 0..2
      "verse_new"            : 0,
      "curly_code"           : 0,
      "curly_poem"           : 0,
      "curly_table"          : 0,
      "curly_group"          : 0,
      "curly_block"          : 0,
      "curly_quote"          : 0,
      "tic_code"             : 0,
      "tic_poem"             : 0,
      "tic_table"            : 0,
      "tic_group"            : 0,
      "tic_block"            : 0,
      "tic_quote"            : 0,
      "ocn_status"           : 0, // 0 obj_cite_number; 1 no obj_cite_number; 2 no obj_cite_number & dummy headings
      "ocn_status_multi_obj" : 0, // 0 obj_cite_number; 1 no obj_cite_number; 2 no obj_cite_number & dummy headings
      "book_index"           : 0,
    ];
    return flags_type_init;
  }
}
template SiSUnode() {
  string[string] node_metadata_heading_str() {
    auto _node = [
        "is"                            : "",
        "ocn"                           : "",
        "marked_up_lev"                 : "",
        "segment_anchor_tag"            : "",
        "attrib"                        : "",
    ];
    return _node;
  }
  int[string] node_metadata_heading_int() {
    auto _node = [
        "ocn"                           : 0, // decide whether to use or keep?
        "ptr_doc_object"                : 0,
        "ptr_html_segnames"             : 0,
        "ptr_heading"                   : 0,
        "heading_lev_markup"            : 9,
        "heading_lev_collapsed"         : 9,
        "parent_ocn"                    : 0,
        "parent_lev_markup"             : 9,
    ];
    return _node;
  }
  string[string] node_metadata_para_str() {
    auto _node = [
        "is"                            : "",
        "ocn"                           : "",
        "attrib"                        : "",
        // "segment_anchor_tag"            : "",
    ];
    return _node;
  }
  int[string] node_metadata_para_int() {
    auto _node = [
        "ocn"                           : 0,
        "indent_base"                   : 0,
        "indent_hang"                   : 0,
        "bullet"                        : 0, // bool (0|1)
    ];
    return _node;
  }
}
template SiSUbiblio() {
  // required: deemed_author (author || editor); year; fulltitle;
  auto biblio_entry_tags_jsonstr =  `{
    "is"                   : "",
    "sortby_deemed_author_year_title"  : "",
    "deemed_author"                    : "",
    "author_raw"                       : "",
    "author"                           : "",
    "author_arr"                       : [ "" ],
    "editor_raw"                       : "",
    "editor"                           : "",
    "editor_arr"                       : [ "" ],
    "title"                            : "",
    "subtitle"                         : "",
    "fulltitle"                        : "",
    "language"                         : "",
    "trans"                            : "",
    "src"                              : "",
    "journal"                          : "",
    "in"                               : "",
    "volume"                           : "",
    "edition"                          : "",
    "year"                             : "",
    "place"                            : "",
    "publisher"                        : "",
    "url"                              : "",
    "pages"                            : "",
    "note"                             : "",
    "short_name"                       : "",
    "id"                               : ""
  }`; // is: book, article, magazine, newspaper, blog, other
}
template SiSUpaths() {
  string _base_filename(string fn_src) {
    string _fn_base = "";
    if (extension(fn_src) == ".sst") {
      _fn_base = baseName(fn_src, ".sst");
    } else if (extension(fn_src) == ".ssm") {
      _fn_base = baseName(fn_src, ".ssm");
    }
    return _fn_base;
  }
  struct DirPaths {
    string base_filename(string fn_src) {
      return _base_filename(fn_src);
    }
  }
  struct SiSUpodPaths {
    string base_filename(string fn_src) {
      return _base_filename(fn_src);
    }
    string base(string fn_src) {
      return chainPath("sisupod", _base_filename(fn_src)).array;
    }
    string doc(string fn_src) {
      return chainPath(base(fn_src), "doc").array;
    }
    string doc_lng(string fn_src, string lng) {
      return chainPath(doc(fn_src), lng).array;
    }
    string image(string fn_src) {
      return chainPath(base(fn_src), "image").array;
    }
    string conf(string fn_src) {
      return chainPath(base(fn_src), "conf").array;
    }
    string css(string fn_src) {
      return chainPath(base(fn_src), "css").array;
    }
    string fn_doc(string fn_src, string lng) {
      return chainPath((doc_lng(fn_src, lng)), baseName(fn_src)).array;
    }
  }
  struct HtmlPaths {
    string base_filename(string fn_src) {
      return _base_filename(fn_src);
    }
    string base() {
      return chainPath("en", "html").array;
    }
    string seg(string fn_src) {
      return chainPath(base, _base_filename(fn_src)).array;
    }
    string fn_scroll(string fn_src) {
      return chainPath(base, _base_filename(fn_src) ~ ".html").array;
    }
    string fn_seg(string fn_src, string seg_filename) {
      return chainPath(seg(fn_src), seg_filename ~ ".html").array;
    }
    // string fn_css(string fn_src) {
    //   // // return chainPath(seg(fn_src), "html.css").array;
    // }
  }
  struct EpubPaths {
    string base_filename(string fn_src) {
      return _base_filename(fn_src);
    }
    string base() {
      return chainPath("en", "epub").array;
    }
    string doc(string fn_src) {
      return chainPath(base, _base_filename(fn_src)).array;
      // return chainPath(base, base_fn).array;
    }
    string doc_meta_inf(string fn_src) {
      return chainPath(doc(fn_src), "META-INF").array;
    }
    string doc_oebps(string fn_src) {
      return chainPath(doc(fn_src), "OEBPS").array;
    }
    string doc_oebps_css(string fn_src) {
      return chainPath(doc_oebps(fn_src), "css").array;
    }
    string doc_oebps_image(string fn_src) {
      return chainPath(doc_oebps(fn_src), "image").array;
    }
    string fn_mimetypes(string fn_src) {
      return chainPath(doc(fn_src), "mimetypes").array;
    }
    string fn_dmi_container_xml(string fn_src) {
      return chainPath(doc_meta_inf(fn_src), "container.xml").array;
    }
    string fn_oebps_toc_ncx(string fn_src) {
      return chainPath(doc_oebps(fn_src), "toc.ncx").array;
    }
    string fn_oebps_content_opf(string fn_src) {
      return chainPath(doc_oebps(fn_src), "content.opf").array;
    }
    string fn_oebps_content_xhtml(string fn_src, string seg_filename) {
      return chainPath(doc_oebps(fn_src), seg_filename ~ ".xhtml").array;
    }
  }
}
template InternalMarkup() {
  struct InlineMarkup {
    auto en_a_o = "【";      auto en_a_c = "】";   // endnote en_a_o: '~{'; en_a_c: '}~';
    auto en_b_o = "〖";      auto en_b_c = "〗";   // endnote en_b_o: '~['; en_b_c: ']~';
    auto lnk_o = "┥";        auto lnk_c = "┝";
    auto url_o = "┤";        auto url_c = "├";
    auto nbsp = "░";
    auto br_line = "┘";
    auto br_nl = "┙";
    auto br_paragraph = "┚";
    auto br_obj = "break_obj";
    auto br_page_line = "┼";
    auto br_page = "┿";
    auto br_page_new = "╂";
    string indent_by_spaces_provided(int indent) {
      auto _indent_spaces ="░░";   // auto nbsp = "░";
      _indent_spaces = replicate(_indent_spaces, indent);
      return _indent_spaces;
    }
  }
}