#+TITLE:       sdp abstraction summary and debugs
#+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:meta:
#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)

[[./sdp.org][sdp]]  [[./][org/]]
* 1. abstraction debugs                            :module:sdp:meta_doc_debugs:
** 0. module template

#+BEGIN_SRC d :tangle ../src/sdp/meta/doc_debugs.d
/++
  output debugs
+/
module sdp.meta.doc_debugs;
template SiSUdebugs() {
  <<debug_imports>>
  auto SiSUdebugs(S,T)(
    auto return ref const S  contents,
    auto return ref T        doc_matters,
  ) {
    mixin SiSUrgxInit;
    mixin InternalMarkup;
    <<initialize>>
    <<meta_output_debugs>>
    debug(checkdoc) {
      if ((doc_matters.opt_action.do_debug)) {
        <<meta_output_debugs_summary>>
        <<meta_output_debugs_checkdoc>>
      }
    }
  }
}
#+END_SRC

** imports

#+name: debug_imports
#+BEGIN_SRC d
import
  sdp.meta.defaults,
  sdp.meta.rgx;
import
  std.algorithm,
  std.array,
  std.container,
  std.exception,
  std.json,
  std.stdio,
  std.file,
  std.path,
  std.range,
  std.regex,
  std.string,
  std.traits,
  std.typecons,
  std.utf,
  std.conv : to;
#+END_SRC

** initialize                                                       :report:

#+name: initialize
#+BEGIN_SRC d
static auto rgx = Rgx();
auto markup = InlineMarkup();
string key;
#+END_SRC

** (parent)                                                         :parent:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(parent) {
  writefln(
    "%s:%s",
    __FILE__,
    __LINE__,
  );
  foreach (key; doc_matters.keys_seq.seg) {
    foreach (obj; contents[key]) {
      if (obj.of_part != "empty") {
        if (obj.is_a == "heading") {
          writefln(
            "%s node: %s heading: %s %s",
            obj.obj_cite_number,
            obj.node,
            obj.heading_lev_markup,
            obj.text,
          );
        }
      }
    }
  }
}
#+END_SRC

** (dumpdoc)                                                       :objects:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(dumpdoc) {
  writefln(
    "%s\n%s:%s",
    "-------------------------------",
    __FILE__,
    __LINE__,
  );
  foreach (obj; contents[key]) {
    if (obj.of_part != "empty") {
      writefln(
        "[%s][%s]\n%s",
        obj.obj_cite_number,
        obj.is_a,
        obj.text
      );
    }
  }
}
#+END_SRC

** (segnames)                                                      :objects:

#+name: meta_output_debugs_checkdoc
#+BEGIN_SRC d
debug(checkdoc) {
  void out_segnames(S,T)(
    auto return ref const S  contents,
    auto return ref T        doc_matters,
  ) {
    foreach (key; doc_matters.keys_seq.seg) {
      if (contents[key].length > 1) {
        foreach (obj; contents[key]) {
          if (obj.heading_lev_markup == 4) {
            writeln(obj.ptr_html_segnames, ". (", doc_matters.segnames[obj.ptr_html_segnames], ") -> ",  obj.text);
          }
        }
      }
    }
  }
}
#+END_SRC

** shared output section arrange
*** out toc

#+name: meta_output_debugs_checkdoc
#+BEGIN_SRC d
debug(checkdoc) {
  void out_toc(S)(
    auto return ref const S  contents,
    string                   key,
  ) {
    if (contents[key].length > 1) {
      string indent_spaces;
      foreach (obj; contents[key]) {
        indent_spaces=markup.indent_by_spaces_provided(obj.indent_hang);
        writefln(
          "%s%s",
          indent_spaces,
          obj.text
        );
      }
    }
  }
}
#+END_SRC

*** out endnotes                                                 :endnotes:

#+name: meta_output_debugs_checkdoc
#+BEGIN_SRC d
debug(checkdoc) {
  void out_endnotes(S)(
    auto return ref const S  contents,
    string                   key,
  ) {
    if (contents[key].length > 1) {
      foreach (obj; contents[key]) {
        writefln(
          "[%s]\n%s",
          obj.is_a,
          obj.text
        );
      }
    }
  }
}
#+END_SRC

*** out bookindex                                               :bookindex:

#+name: meta_output_debugs_checkdoc
#+BEGIN_SRC d
debug(checkdoc) {
  void out_bookindex(S)(
    auto return ref const S  contents,
    string                   key,
  ) {
    if (contents[key].length > 1) {
      foreach (obj; contents[key]) {
        writefln(
          "[%s][%s]\n%s",
          obj.obj_cite_number,
          obj.is_a,
          obj.text
        );
      }
    }
  }
}
#+END_SRC

** sections
*** heading_section                                               :heading:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_head) {
  key="head";
  if (contents[key].length > 1) {
    foreach (obj; contents[key]) {
      writefln(
        "[%s][%s]\n%s",
        obj.obj_cite_number,
        obj.is_a,
        obj.text
      );
    }
  }
}
#+END_SRC

*** toc_section (seg & scroll)
**** toc

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_toc) {
  key="toc_seg";
  out_toc(contents, key);
}
#+END_SRC

**** toc seg

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_toc_seg) {
  key="toc_seg";
  out_toc(contents, key);
}
#+END_SRC

**** toc scroll

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_toc_scroll) {
  key="toc_scroll";
  out_toc(contents, key);
}
#+END_SRC

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(segnames) {
  writeln(__LINE__);
  out_segnames(contents, doc_matters);
}
#+END_SRC

*** body_section                                                     :body:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_body) {
  key="body";
  if (contents[key].length > 1) {
    foreach (obj; contents[key]) {
      writefln(
        "[%s][%s]\n%s",
        obj.obj_cite_number,
        obj.is_a,
        obj.text
      );
    }
  }
}
#+END_SRC

*** dom structure                                                    :body:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(toc_nav_dom) {
  enum DomTags { none, open, close, close_and_open, open_still, }
  foreach (sect; doc_matters.keys_seq.seg) {
    foreach (obj; contents[sect]) {
      if (obj.is_a == "heading") {
        foreach_reverse (k; 0 .. 7) {
          switch (obj.dom_markedup[k]) {
          case DomTags.close :
            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
            break;
          case DomTags.close_and_open :
            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
            writeln(markup.indent_by_spaces_provided(k),
              "<", k, ">", obj.text,
              " file: ", obj.segment_anchor_tag, ".xhtml#", obj.ocn);
            break;
          case DomTags.open :
            writeln(markup.indent_by_spaces_provided(k),
              "<", k, ">", obj.text,
              " file: ", obj.segment_anchor_tag, ".xhtml#", obj.ocn);
            break;
          default :
            break;
          }
        }
      }
    }
  }
  writeln("--------------------");
  foreach (sect; doc_matters.keys_seq.seg) {
    foreach (obj; contents[sect]) {
      if (obj.is_a == "heading") {
        foreach_reverse (k; 0 .. 7) {
          switch (obj.dom_collapsed[k]) {
          case DomTags.close :
            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
            break;
          case DomTags.close_and_open :
            writeln(markup.indent_by_spaces_provided(k), "</", k, ">");
            writeln(markup.indent_by_spaces_provided(k),
              "<", k, ">", obj.text,
              " file: ", obj.segment_anchor_tag, ".xhtml#", obj.ocn);
            break;
          case DomTags.open :
            writeln(markup.indent_by_spaces_provided(k),
              "<", k, ">", obj.text,
              " file: ", obj.segment_anchor_tag, ".xhtml#", obj.ocn);
            break;
          default :
            break;
          }
        }
      }
    }
  }
}
#+END_SRC

*** endnotes_section (seg & scroll)                              :endnotes:
**** endnotes

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_endnotes) {
  key="endnotes";
  out_endnotes(contents, key);
}
#+END_SRC

**** endnotes seg

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_endnotes_seg) {
  key="endnotes";
  out_endnotes(contents, key);
}
#+END_SRC

*** glossary_section                                             :glossary:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_glossary) {
  key="glossary";
  if (contents[key].length > 1) {
    foreach (obj; contents[key]) {
      writefln(
        "[%s][%s]\n%s",
        obj.obj_cite_number,
        obj.is_a,
        obj.text
      );
    }
  }
}
#+END_SRC

*** bibliography_section (seg & scroll)                      :bibliography:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_bibliography) {
  key="bibliography";
  if (contents[key].length > 1) {
    foreach (obj; contents[key]) {
      writefln(
        "[%s][%s]\n%s",
        obj.obj_cite_number,
        obj.is_a,
        obj.text
      );
    }
  }
}
#+END_SRC

*** bookindex_section (seg & scroll)                            :bookindex:
**** bookindex

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_bookindex) {
  key="bookindex_seg";
  out_bookindex(contents, key);
}
#+END_SRC

**** bookindex seg

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_bookindex_seg) {
  key="bookindex_seg";
  out_bookindex(contents, key);
}
#+END_SRC

**** bookindex scroll

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(section_bookindex_scroll) {
  key="bookindex_scroll";
  out_bookindex(contents, key);
}
#+END_SRC

*** section_blurb                                                   :blurb:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(blurb_section) {
  key="blurb";
  if (contents[key].length > 1) {
    foreach (obj; contents[key]) {
      writefln(
        "[%s][%s]\n%s",
        obj.obj_cite_number,
        obj.is_a,
        obj.text
      );
    }
  }
}
#+END_SRC

** (objects)                                                       :objects:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(objects) {
  writefln(
    "%s\n%s:%s",
    "-------------------------------",
    __FILE__,
    __LINE__,
  );
  foreach (obj; contents[key]) {
    if (obj.of_part != "empty") {
      writefln(
        "* [%s][%s] %s",
        obj.obj_cite_number,
        obj.is_a,
        obj.text
      );
    }
  }
}
#+END_SRC

** (headermakejson)                                            :json:header:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(headermakejson) {
  writefln(
    "%s\n%s\n%s",
    "document header, metadata & make instructions:",
    doc_matters.conf_make_meta.meta,
    ptr_head_main,
  );
  foreach (main_header; ptr_head_main) {
    switch (main_header) {
    case "make":
      foreach (sub_header; ptr_head_sub_make) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    default:
      break;
    }
  }
}
#+END_SRC

** (headermetadatajson)                                        :json:header:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(headermetadatajson) {
  writefln(
    "%s\n%s\n%s",
    "document header, metadata & make instructions:",
    doc_matters.conf_make_meta.meta,
    ptr_head_main,
  );
  foreach (main_header; ptr_head_main) {
    switch (main_header) {
    case "creator":
      foreach (sub_header; ptr_head_sub_creator) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full,
          );
        }
      }
      break;
    case "title":
      foreach (sub_header; ptr_head_sub_title) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    case "rights":
      foreach (sub_header; ptr_head_sub_rights) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    case "date":
      foreach (sub_header; ptr_head_sub_date) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    case "original":
      foreach (sub_header; ptr_head_sub_original) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    case "classify":
      foreach (sub_header; ptr_head_sub_classify) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    case "identifier":
      foreach (sub_header; ptr_head_sub_identifier) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    case "notes":
      foreach (sub_header; ptr_head_sub_notes) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    case "publisher":
      foreach (sub_header; ptr_head_sub_publisher) {
        if (doc_matters.conf_make_meta.meta.title_full.to!string.length > 2) {
          writefln(
            "%s:%s: %s",
            main_header,
            sub_header,
            doc_matters.conf_make_meta.meta.title_full
          );
        }
      }
      break;
    default:
      break;
    }
  }
}
#+END_SRC

** anchor tags

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(anchor) {
  writefln(
    "%s\n%s:%s",
    "-------------------------------",
    __FILE__,
    __LINE__,
  );
  foreach (k; doc_matters.keys_seq.seg) {
    foreach (obj; contents[k]) {
      if (obj.is_a == "heading") {
        writefln(
          "%s~ [%s] %s %s",
          obj.marked_up_level,
          obj.obj_cite_number,
          obj.anchor_tags,
          // "[", obj["is"], "] ",
          obj.text
        );
      }
    }
  }
}
#+END_SRC

** (headings)                                                     :headings:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(heading) {                         // heading
  foreach (k; doc_matters.keys_seq.seg) {
    foreach (o; contents[k]) {
      if (o.is_a == "heading") {
        writefln(
          "%s* %s\n                (markup level: %s; collapsed level: %s)",
          replicate("  ", o.heading_lev_markup),
          strip(o.text),
          o.heading_lev_markup,
          o.heading_lev_collapsed,
        );
      }
    }
  }
}
#+END_SRC

** (summary) [+1]                                                  :summary:

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(headings) {
  writefln(
    "%s\n%s:%s",
    "-------------------------------",
    __FILE__,
    __LINE__,
  );
  foreach (k; doc_matters.keys_seq.seg) {
    foreach (obj; contents[k]) {
      if (obj.is_a == "heading") {
        writefln(
          "%s~ [%s] %s",
          obj.marked_up_level,
          obj.obj_cite_number,
          // "[", obj["is"], "] ",
          obj.text
        );
      }
    }
  }
}
#+END_SRC

#+name: meta_output_debugs
#+BEGIN_SRC d
debug(summary) {
  string[string] check = [
    "last_obj_cite_number" : "NA [debug \"checkdoc\" not run]",
  ];
}
#+END_SRC

*** compare number of obj_cite_number for known sisu markup output (checkdoc)

#+name: meta_output_debugs_summary
#+BEGIN_SRC d
debug(checkdoc) {
  if (auto mfn=match(doc_matters.source_filename, rgx.src_fn)) {
    if (doc_matters.opt_action.assertions) {
      switch (mfn.captures[2]) {
      // live manual:
      case "live-manual.ssm":
        assert(check["last_obj_cite_number"] ==
          "1019","last obj_cite_number should be: 1019 (check test, document is frequently updated)"); // ok
        break;
      // sisu_markup:
      case "sisu_markup.sst":
        assert(check["last_obj_cite_number"] ==
          "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]); // ok
        // assert(check["last_obj_cite_number"] == "297","last obj_cite_number expected to be: 297 rather than " ~ check["last_obj_cite_number"]);
        // notes for first divergance study sisu headings 247 250
        // sisu has issue with code that contains heading 1~ which results in no obj_cite_number! ??
        // sisu currently has incorrect last body obj_cite_number of 294!
        // bug in sisu? attend
        break;
      // sisu-markup-samples:
      case "accelerando.charles_stross.sst":
        assert(check["last_obj_cite_number"] ==
          "2861","last obj_cite_number expected to be: 2861 rather than " ~ check["last_obj_cite_number"]); // ok
        break;
      case "alices_adventures_in_wonderland.lewis_carroll.sst":
        assert(check["last_obj_cite_number"] ==
          "805","last obj_cite_number expected to be: 805 rather than " ~ check["last_obj_cite_number"]); // 808
        break;
      case "autonomy_markup0.sst":
        assert(check["last_obj_cite_number"] ==
          "77","last obj_cite_number expected to be: 77 rather than " ~ check["last_obj_cite_number"]); // ok endnotes
        // assert(check["last_obj_cite_number"] == "78","last obj_cite_number expected to be: 78 rather than " ~ check["last_obj_cite_number"]);
        break;
      case "content.cory_doctorow.sst":
        assert(check["last_obj_cite_number"] ==
          "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]); // 1007 way off, check obj_cite_number off switches
        // assert(check["last_obj_cite_number"] == "953","last obj_cite_number expected to be: 953 rather than " ~ check["last_obj_cite_number"]);
        break;
      case "democratizing_innovation.eric_von_hippel.sst":
        // fixed ERROR! range violation, broken check! endnotes, bookindex, biblio
        // error in bookindex ... (ch1; ch6; ch8 )
        assert(check["last_obj_cite_number"] ==
          "905","last obj_cite_number expected to be: 905 rather than " ~ check["last_obj_cite_number"]); // 911
        break;
      case "down_and_out_in_the_magic_kingdom.cory_doctorow.sst":
        assert(check["last_obj_cite_number"] ==
          "1417","last obj_cite_number expected to be: 1417 rather than " ~ check["last_obj_cite_number"]); // 1455 check obj_cite_number off switches
        break;
      case "for_the_win.cory_doctorow.sst":
        assert(check["last_obj_cite_number"] ==
          "3510","last obj_cite_number expected to be: 3510 rather than " ~ check["last_obj_cite_number"]); // 3569 check obj_cite_number off switches
        break;
      case "free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst":
        assert(check["last_obj_cite_number"] ==
          "1082","last obj_cite_number expected to be: 1082 rather than " ~ check["last_obj_cite_number"]); // check 1079 too few
        break;
      case "free_culture.lawrence_lessig.sst":
        assert(check["last_obj_cite_number"] ==
          "1330","last obj_cite_number expected to be: 1330 rather than " ~ check["last_obj_cite_number"]); // 1312
        // fixed ERROR! range violation, broken check!
        // error in bookindex ... sections piracy (ch1) & property (ch10 market concentration) fixed
        break;
      case "free_for_all.peter_wayner.sst": // endnotes, bookindex, biblio
        assert(check["last_obj_cite_number"] ==
          "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]); // 1560, check obj_cite_number off switches, has endnotes so 2 too many
        // assert(check["last_obj_cite_number"] == "1559","last obj_cite_number expected to be: 1559 rather than " ~ check["last_obj_cite_number"]);
        break;
      case "gpl2.fsf.sst":
        assert(check["last_obj_cite_number"] ==
          "65","last obj_cite_number expected to be: 65 rather than " ~ check["last_obj_cite_number"]); // ok endnotes? check
        // assert(check["last_obj_cite_number"] == "66","last obj_cite_number expected to be: 66 rather than " ~ check["last_obj_cite_number"]);
        break;
      case "gpl3.fsf.sst":
        assert(check["last_obj_cite_number"] ==
          "123","last obj_cite_number expected to be: 123 rather than " ~ check["last_obj_cite_number"]); // ok
        break;
      case "gullivers_travels.jonathan_swift.sst":
        assert(check["last_obj_cite_number"] ==
          "668","last obj_cite_number expected to be: 668 rather than " ~ check["last_obj_cite_number"]); // 674
        break;
      case "little_brother.cory_doctorow.sst":
        assert(check["last_obj_cite_number"] ==
          "3130","last obj_cite_number expected to be: 3130 rather than " ~ check["last_obj_cite_number"]); // 3204, check obj_cite_number off switches
        break;
      case "the_cathedral_and_the_bazaar.eric_s_raymond.sst":
        assert(check["last_obj_cite_number"] ==
          "258","last obj_cite_number expected to be: 258 rather than " ~ check["last_obj_cite_number"]); // ok
        break;
      case "the_public_domain.james_boyle.sst":
        assert(check["last_obj_cite_number"] ==
          "970","last obj_cite_number expected to be: 970 rather than " ~ check["last_obj_cite_number"]); // 978
        break;
      case "the_wealth_of_networks.yochai_benkler.sst": // endnotes, bookindex
        assert(check["last_obj_cite_number"] ==
          "829","last obj_cite_number expected to be: 829 rather than " ~ check["last_obj_cite_number"]); // ok
        // assert(check["last_obj_cite_number"] == "832","last obj_cite_number expected to be: 832 rather than " ~ check["last_obj_cite_number"]);
        // has endnotes and bookindex, issue with sisu.rb
        break;
      case "through_the_looking_glass.lewis_carroll.sst":
        assert(check["last_obj_cite_number"] ==
          "949","last obj_cite_number expected to be: 949 rather than " ~ check["last_obj_cite_number"]); // 955
        break;
      case "two_bits.christopher_kelty.sst": // endnotes, bookindex, biblio
        assert(check["last_obj_cite_number"] ==
          "1190","last obj_cite_number expected to be: 1190 rather than " ~ check["last_obj_cite_number"]); // 1191
        // assert(check["last_obj_cite_number"] == "1193","last obj_cite_number expected to be: 1193 rather than " ~ check["last_obj_cite_number"]); // 1191 ok?
        // has endnotes and bookindex, issue with sisu.rb
        break;
        // fixed ERROR! range violation!
        // error in bookindex ... (ch3 the movement)
      case "un_contracts_international_sale_of_goods_convention_1980.sst":
        assert(check["last_obj_cite_number"] ==
          "377","last obj_cite_number expected to be: 377 rather than " ~ check["last_obj_cite_number"]); // ok
        break;
      case "viral_spiral.david_bollier.sst": // endnotes, bookindex
        assert(check["last_obj_cite_number"] ==
          "1078","last obj_cite_number expected to be: 1078 rather than " ~ check["last_obj_cite_number"]); // 1100
        // fixed ERROR! range violation!
        // error in bookindex ... (ch7 ... building the cc machine, an extra semi colon)
        break;
      default:
        writeln(doc_matters.source_filename);
        break;
      }
    }
  }
}
#+END_SRC