diff options
| author | Ralph Amissah <ralph.amissah@gmail.com> | 2023-07-09 17:57:26 -0400 | 
|---|---|---|
| committer | Ralph Amissah <ralph.amissah@gmail.com> | 2023-07-10 16:20:52 -0400 | 
| commit | af80415a3a3e4b1717d0dbeefb1f9b97fb84b5e4 (patch) | |
| tree | 6063b4dce1ca9d92808eb587054ff449410a7f04 /src/doc_reform | |
| parent | flake nix build dub, set HOME, dub >= 1.31.0 fix (diff) | |
ocda, improve doc markup structure error messages
- ocda, metadoc_from_src
  workon doc markup structure error message, check
Diffstat (limited to 'src/doc_reform')
| -rw-r--r-- | src/doc_reform/meta/metadoc_from_src.d | 608 | 
1 files changed, 499 insertions, 109 deletions
| diff --git a/src/doc_reform/meta/metadoc_from_src.d b/src/doc_reform/meta/metadoc_from_src.d index 3962beb..59cbc0b 100644 --- a/src/doc_reform/meta/metadoc_from_src.d +++ b/src/doc_reform/meta/metadoc_from_src.d @@ -610,14 +610,13 @@ template docAbstraction() {      foreach (line; markup_sourcefile_content) {                                 /+ ↓ markup document/text line by line +/                                                                                  // "line" variable can be empty but should never be null        /+ scope +/ -      scope(exit) { -      } +      scope(exit) { }        scope(failure) {          stderr.writefln( -          "%s\n%s\n%s:%s failed here:\n  line: %s", +          "\n%s\n%s\n\n%s:%s\nFAILED while processing the file: ❮❮ %s ❯❯ on line with text:\n%s\n",            __MODULE__, __FUNCTION__,            __FILE__, __LINE__, -          line, +          manifested.src.filename, line,          );        }        debug(source) { @@ -625,10 +624,7 @@ template docAbstraction() {        }        debug(srclines) {          if (!line.empty) { -          writefln( -            "* %s", -            line -          ); +          writefln("* %s", line);          }        }        if (!line.empty) { @@ -1310,8 +1306,7 @@ template docAbstraction() {          }        }      }                                                                           /+ ← srcDocLoop closed: loop markup document/text line by line +/ -                                                                                /+ ↓ post loop markup document/text +/ -                                                                                /+ ↓ post loop markup document/text +/ +    /+ ↓ post loop markup document/text +/      { // EOF        comp_obj_heading_                                              = comp_obj_heading_.init;        comp_obj_heading_.metainfo.is_of_part                          = "backmatter"; @@ -4049,7 +4044,7 @@ template docAbstraction() {        }        an_object[an_object_key] ~= line ~= "\n";        an_object["lev"] ~= m.captures[1]; -      assertions_doc_structure(an_object, lv); // includes most of the logic for collapsed levels +      assertions_doc_structure(an_object, an_object_key, lv); // includes most of the logic for collapsed levels        switch (an_object["lev"]) {        case "A":                                // Title set          if ((an_object[an_object_key].match(rgx.variable_doc_title_author_date)) @@ -6165,173 +6160,568 @@ template docAbstraction() {                                                                                  /+ ↓ abstraction functions assertions +/    @safe pure void assertions_doc_structure()(      string[string]  an_object, +    string          an_object_key,      int[string]     lv    ) { +    string msg_error_doc_struct = "\nERROR in document structure, check markup (heading level relationships):\n";      if (lv["h3"] > eN.bi.off) { -      assert(lv["h0"] > eN.bi.off); -      assert(lv["h1"] > eN.bi.off); -      assert(lv["h2"] > eN.bi.off); +      assert(lv["h0"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h1"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h2"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else if (lv["h2"] > eN.bi.off) { -      assert(lv["h0"] > eN.bi.off); -      assert(lv["h1"] > eN.bi.off); -      assert(lv["h3"] == eN.bi.off); +      assert(lv["h0"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h1"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h3"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else if (lv["h1"] > eN.bi.off) { -      assert(lv["h0"] > eN.bi.off); -      assert(lv["h2"] == eN.bi.off); -      assert(lv["h3"] == eN.bi.off); +      assert(lv["h0"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h2"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h3"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else if (lv["h0"] > eN.bi.off) { -      assert(lv["h1"] == eN.bi.off); -      assert(lv["h2"] == eN.bi.off); -      assert(lv["h3"] == eN.bi.off); +      assert(lv["h1"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h2"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h3"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else { -      assert(lv["h0"] == eN.bi.off); -      assert(lv["h1"] == eN.bi.off); -      assert(lv["h2"] == eN.bi.off); -      assert(lv["h3"] == eN.bi.off); +      assert(lv["h0"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h1"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h2"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h3"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h7"] > eN.bi.off) { -      assert(lv["h4"] > eN.bi.off); -      assert(lv["h5"] > eN.bi.off); -      assert(lv["h6"] > eN.bi.off); +      assert(lv["h4"] > eN.bi.off, +        msg_error_doc_struct +        ~ "missing segment level 1~\n" +        ~ an_object[an_object_key] +      ); +      assert(lv["h5"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h6"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else if (lv["h6"] > eN.bi.off) { -      assert(lv["h4"] > eN.bi.off); -      assert(lv["h5"] > eN.bi.off); -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h4"] > eN.bi.off, +        msg_error_doc_struct +        ~ "missing segment level 1~\n" +        ~ an_object[an_object_key] +      ); +      assert(lv["h5"] > eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else if (lv["h5"] > eN.bi.off) { -      assert(lv["h4"] > eN.bi.off); -      assert(lv["h6"] == eN.bi.off); -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h4"] > eN.bi.off, +        msg_error_doc_struct +        ~ "missing segment level 1~\n" +        ~ an_object[an_object_key] +      ); +      assert(lv["h6"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else if (lv["h4"] > eN.bi.off) { -      assert(lv["h5"] == eN.bi.off); -      assert(lv["h6"] == eN.bi.off); -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h5"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h6"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      } else { -      assert(lv["h4"] == eN.bi.off); -      assert(lv["h5"] == eN.bi.off); -      assert(lv["h6"] == eN.bi.off); -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h4"] == eN.bi.off, +        msg_error_doc_struct +        ~ "missing segment level 1~\n" +        ~ an_object[an_object_key] +      ); +      assert(lv["h5"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h6"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h0"] == eN.bi.off) { -      assert(lv["h1"] == eN.bi.off); -      assert(lv["h2"] == eN.bi.off); -      assert(lv["h3"] == eN.bi.off); -      assert(lv["h4"] == eN.bi.off); -      assert(lv["h5"] == eN.bi.off); -      assert(lv["h6"] == eN.bi.off); -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h1"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h2"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h3"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h4"] == eN.bi.off, +        msg_error_doc_struct +        ~ "missing segment level 1~\n" +        ~ an_object[an_object_key] +      ); +      assert(lv["h5"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h6"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h1"] == eN.bi.off) { -      assert(lv["h2"] == eN.bi.off); -      assert(lv["h3"] == eN.bi.off); +      assert(lv["h2"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h3"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h2"] == eN.bi.off) { -      assert(lv["h3"] == eN.bi.off); +      assert(lv["h3"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h3"] == eN.bi.off) {      }      if (lv["h4"] == eN.bi.off) { -      assert(lv["h5"] == eN.bi.off); -      assert(lv["h6"] == eN.bi.off); -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h5"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h6"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h5"] == eN.bi.off) { -      assert(lv["h6"] == eN.bi.off); -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h6"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      ); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h6"] == eN.bi.off) { -      assert(lv["h7"] == eN.bi.off); +      assert(lv["h7"] == eN.bi.off, +        msg_error_doc_struct +        ~ an_object[an_object_key] +      );      }      if (lv["h7"] == eN.bi.off) {      }      switch ((an_object["lev"]).to!string) {      case "A":        if (lv["h0"] == eN.bi.off) { -        assert(lv["h1"] == eN.bi.off); -        assert(lv["h2"] == eN.bi.off); -        assert(lv["h3"] == eN.bi.off); -        assert(lv["h4"] == eN.bi.off); -        assert(lv["h5"] == eN.bi.off); -        assert(lv["h6"] == eN.bi.off); -        assert(lv["h7"] == eN.bi.off); +        assert(lv["h1"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h2"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h3"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] == eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~\n" +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h5"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h6"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h7"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        );        } else {                       // (lv["h0"] > eN.bi.off) -        assert(lv["h0"] == eN.bi.off,"error should not enter level A a second time"); +        assert(lv["h0"] == eN.bi.off, +          msg_error_doc_struct +          ~ "should not enter level A a second time\n" +          ~ "at level A~\n" +          ~ an_object[an_object_key] +        );        }        break;      case "B":        if (lv["h1"] == eN.bi.off) { -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h2"] == eN.bi.off); -        assert(lv["h3"] == eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level B~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h2"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level B~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h3"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level B~\n" +          ~ an_object[an_object_key] +        );        } else {                       // (lv["h1"] > eN.bi.off) -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h1"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level B~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h1"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level B~\n" +          ~ an_object[an_object_key] +        );        }        break;      case "C":        if (lv["h2"] == eN.bi.off) { -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h1"] > eN.bi.off); -        assert(lv["h3"] == eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level C~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h1"] > eN.bi.off, +          msg_error_doc_struct +          ~ "level C should not follow level A\n" +          ~ "at level C~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h3"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level C~\n" +          ~ an_object[an_object_key] +        );        } else {                       // (lv["h2"] > eN.bi.off) -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h1"] > eN.bi.off); -        assert(lv["h2"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level C~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h1"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level C~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h2"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level C~\n" +          ~ an_object[an_object_key] +        );        }        break;      case "D":        if (lv["h3"] == eN.bi.off) { -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h1"] > eN.bi.off); -        assert(lv["h2"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level D~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h1"] > eN.bi.off, +          msg_error_doc_struct +          ~ "level D should not follow level A\n" +          ~ "at level D~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h2"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level D~\n" +          ~ an_object[an_object_key] +        );        } else {                      // (lv["h3"] > eN.bi.off) -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h1"] > eN.bi.off); -        assert(lv["h2"] > eN.bi.off); -        assert(lv["h3"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level D~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h1"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level D~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h2"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level D~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h3"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level D~\n" +          ~ an_object[an_object_key] +        );        }        break;      case "1":        if (lv["h4"] == eN.bi.off) { -        assert(lv["h0"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 1~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h5"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level 1~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h6"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level 1~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h7"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level 1~\n" +          ~ an_object[an_object_key] +        );        } else {                      // (lv["h4"] > eN.bi.off) -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h4"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 1~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~ ?\n" +          ~ "at level 1~\n" +          ~ an_object[an_object_key] +        );        }        break;      case "2":        if (lv["h5"] == eN.bi.off) { -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h4"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 2~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~ ?\n" +          ~ "at level 2~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h6"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level 2~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h7"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level 2~\n" +          ~ an_object[an_object_key] +        );        } else {                      // (lv["h5"] > eN.bi.off) -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h4"] > eN.bi.off); -        assert(lv["h5"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 2~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~ ?\n" +          ~ "at level 2~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h5"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 2~\n" +          ~ an_object[an_object_key] +        );        }        break;      case "3":        if (lv["h6"] == eN.bi.off) { -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h4"] > eN.bi.off); -        assert(lv["h5"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~ ?\n" +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h5"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 2~ ?\n" +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h7"] == eN.bi.off, +          msg_error_doc_struct +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        );        } else {                      // (lv["h6"] > eN.bi.off) -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h4"] > eN.bi.off); -        assert(lv["h5"] > eN.bi.off); -        assert(lv["h6"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~ ?\n" +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h5"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h6"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 3~\n" +          ~ an_object[an_object_key] +        );        }        break;      case "4":        if (lv["h7"] == eN.bi.off) { -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h4"] > eN.bi.off); -        assert(lv["h5"] > eN.bi.off); -        assert(lv["h6"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~ ?\n" +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h5"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 2~ ?\n" +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h6"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 3~ ?\n" +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        );        } else {                      // (lv["h7"] > eN.bi.off) -        assert(lv["h0"] > eN.bi.off); -        assert(lv["h4"] > eN.bi.off); -        assert(lv["h5"] > eN.bi.off); -        assert(lv["h6"] > eN.bi.off); -        assert(lv["h7"] > eN.bi.off); +        assert(lv["h0"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h4"] > eN.bi.off, +          msg_error_doc_struct +          ~ "missing segment level 1~ ?\n" +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h5"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h6"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        ); +        assert(lv["h7"] > eN.bi.off, +          msg_error_doc_struct +          ~ "at level 4~\n" +          ~ an_object[an_object_key] +        );        }        break;      default: | 
