diff options
Diffstat (limited to 'src/sdp/output/xmls.d')
| -rw-r--r-- | src/sdp/output/xmls.d | 800 | 
1 files changed, 800 insertions, 0 deletions
diff --git a/src/sdp/output/xmls.d b/src/sdp/output/xmls.d new file mode 100644 index 0000000..7a057ad --- /dev/null +++ b/src/sdp/output/xmls.d @@ -0,0 +1,800 @@ +module sdp.output.xmls; +template outputXHTMLs() { +  import sdp.output; +  import +    std.digest.sha, +    std.file, +    std.outbuffer, +    std.zip, +    std.conv : to; +  import +    sdp.output.create_zip_file, +    sdp.output.xmls, +    sdp.output.xmls_css; +  mixin SiSUoutputRgxInit; +  struct outputXHTMLs { +    auto rgx = Rgx(); +    string special_characters(O)( +      auto return ref const O    obj, +      string                     _txt +    ){ +      _txt = (_txt) +        .replaceAll(rgx.xhtml_ampersand,    "&") +        .replaceAll(rgx.xhtml_quotation,    """) +        .replaceAll(rgx.xhtml_less_than,    "<") +        .replaceAll(rgx.xhtml_greater_than, ">") +        .replaceAll(rgx.nbsp_char,          " "); +      if (!(obj.is_a == "code")) { +        _txt = (_txt) +          .replaceAll(rgx.xhtml_line_break,   "<br />"); +      } +      return _txt; +    } +    string font_face(string _txt){ +      _txt = (_txt) +        .replaceAll(rgx.inline_emphasis,    ("<em>$1</em>")) +        .replaceAll(rgx.inline_bold,        ("<b>$1</b>")) +        .replaceAll(rgx.inline_underscore,  ("<u>$1</u>")) +        .replaceAll(rgx.inline_italics,     ("<i>$1</i>")) +        .replaceAll(rgx.inline_superscript, ("<sup>$1</sup>")) +        .replaceAll(rgx.inline_subscript,   ("<sub>$1</sub>")) +        .replaceAll(rgx.inline_strike,      ("<del>$1</del>")) +        .replaceAll(rgx.inline_insert,      ("<ins>$1</ins>")) +        .replaceAll(rgx.inline_mono,        ("<tt>$1</tt>")) +        .replaceAll(rgx.inline_cite,        ("<cite>$1</cite>")); +      return _txt; +    } +    string _xhtml_anchor_tags(const(string[]) anchor_tags) { +      string tags=""; +      if (anchor_tags.length > 0) { +        foreach (tag; anchor_tags) { +          if (!(tag.empty)) { +            tags ~= "<a name=\"" ~ tag ~ "\"></a>"; +          } +        } +      } +      return tags; +    } +    auto html_scroll_head(Dm)( +      Dm doc_matters, +    ) { +      string o; +      o = format(q"¶<!DOCTYPE html> +    <html> +    <head> +      <meta charset="utf-8"> +        <title> +          %s%s +        </title> +        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +        <meta name="dc.title" content="Title" /> +        <meta name="dc.author" content="Author" /> +        <meta name="dc.publisher" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> +        <meta name="dc.date" content="year" /> +        <meta name="dc.date.created" content="year" /> +        <meta name="dc.date.issued" content="year" /> +        <meta name="dc.date.available" content="year" /> +        <meta name="dc.date.valid" content="year" /> +        <meta name="dc.date.modified" content="year" /> +        <meta name="dc.language" content="US" /> +        <meta name="dc.rights" content="Copyright: Copyright (C) year holder /> +        <meta name="generator" content="sdp [SiSU 7.1.8 of 2016w08/5 (2016-02-26)] (n*x and D)" /> +      </meta> +      <link rel="generator" href="http://www.sisudoc.org/" /> +      <link rel="shortcut icon" href="../../image/rb7.ico" /> +      <link href="../../css/html.css" rel="stylesheet" /> +      <link href="../../../css/html.css" rel="stylesheet" /> +    </head> +    <body lang="%s"> +    <a name="top" id="top"></a>¶", +        doc_matters.dochead_meta["title"]["full"], +        (doc_matters.dochead_meta["creator"]["author"].empty) ? "" : ", " ~ doc_matters.dochead_meta["creator"]["author"], +        doc_matters.language, +      ); +      return o; +    } +    auto html_seg_head(Dm)( +      Dm doc_matters, +    ) { +      string o; +      o = format(q"¶<!DOCTYPE html> +    <html> +    <head> +      <meta charset="utf-8"> +        <title> +          %s%s +        </title> +        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +        <meta name="dc.title" content="Title" /> +        <meta name="dc.author" content="Author" /> +        <meta name="dc.publisher" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> +        <meta name="dc.date" content="year" /> +        <meta name="dc.date.created" content="year" /> +        <meta name="dc.date.issued" content="year" /> +        <meta name="dc.date.available" content="year" /> +        <meta name="dc.date.valid" content="year" /> +        <meta name="dc.date.modified" content="year" /> +        <meta name="dc.language" content="US" /> +        <meta name="dc.rights" content="Copyright: Copyright (C) year holder" /> +        <meta name="generator" content="sdp [SiSU 7.1.8 of 2016w08/5 (2016-02-26)] (n*x and D)" /> +      </meta> +      <link rel="generator" href="http://www.sisudoc.org/" /> +      <link rel="shortcut icon" href="../../image/rb7.ico" /> +      <link href="../../css/html.css" rel="stylesheet" /> +      <link href="../../../css/html.css" rel="stylesheet" /> +    </head> +    <body lang="%s"> +    <a name="top" id="top"></a>¶", +        doc_matters.dochead_meta["title"]["full"], +        (doc_matters.dochead_meta["creator"]["author"].empty) ? "" +          : ", " ~ doc_matters.dochead_meta["creator"]["author"], +        doc_matters.language, +      ); +      return o; +    } +    auto epub3_seg_head(Dm)( +      Dm doc_matters, +    ) { +      string html_base = format(q"¶<!DOCTYPE html> +    <html>¶", +    ); +      string html_simple = format(q"¶<!DOCTYPE html> +    <html +      xmlns="http://www.w3.org/1999/xhtml" +      xmlns:epub="http://www.idpf.org/2007/ops" +      lang="%s" xml:lang="%s">¶", +        doc_matters.language, +        doc_matters.language, +      ); +      string html_strict = format(q"¶<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +    <html xmlns="http://www.w3.org/1999/xhtml" +      xmlns:epub="http://www.idpf.org/2007/ops" +      lang="%s" xml:lang="%s">¶", +        doc_matters.language, +        doc_matters.language, +      ); +      string o; +      o = format(q"¶%s +    <head> +      <title> +        %s%s +      </title> +      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> +      <meta name="dc.title" content="%s" /> +      <meta name="dc.author" content="%s" /> +      <meta name="dc.publisher" content="SiSU http://www.jus.uio.no/sisu (this copy)" /> +      <meta name="dc.date" content="year" /> +      <meta name="dc.date.created" content="year" /> +      <meta name="dc.date.issued" content="year" /> +      <meta name="dc.date.available" content="year" /> +      <meta name="dc.date.valid" content="year" /> +      <meta name="dc.date.modified" content="year" /> +      <meta name="dc.language" content="US" /> +      <meta name="dc.rights" content="Copyright: Copyright (C) year holder" /> +      <meta name="generator" content="sdp [SiSU 7.1.8 of 2016w08/5 (2016-02-26)] (n*x and D)" /> +      <link rel="generator" href="http://www.sisudoc.org/" /> +      <link rel="shortcut icon" href="../_sisu/image/rb7.ico" /> +      <link rel="stylesheet" href="css/epub.css" type="text/css" id="main-css" /> +    </head> +    <body lang="%s"> +    <a name="top" id="top"></a>¶", +        html_simple, +        doc_matters.dochead_meta["title"]["full"], +        (doc_matters.dochead_meta["creator"]["author"].empty) ? "" +          : ", " ~ doc_matters.dochead_meta["creator"]["author"], +        doc_matters.dochead_meta["title"]["full"], +        (doc_matters.dochead_meta["creator"]["author"].empty) ? "" +          : ", " ~ doc_matters.dochead_meta["creator"]["author"], +        doc_matters.language, +      ); +      return o; +    } +    auto tail() { +      string o; +      o = format(q"¶  <a name="bottom" id="bottom"></a> +      <a name="end" id="end"></a> +    </body> +    </html>¶"); +      return o; +    } +    auto inline_links(O)( +      auto return ref const O obj, +      string                  _txt, +      string                  _suffix    = ".html", +      string                  seg_scroll = "seg", +    ) { +      if (obj.inline_links) { +        if ((seg_scroll == "scroll") +        && _txt.match(rgx.mark_internal_site_lnk)) { +          _txt = (_txt).replaceAll( +            rgx.inline_seg_link, +            "$1"); +        } +        _txt = (_txt).replaceAll( +          rgx.inline_link_fn_suffix, +          ("$1" ~ _suffix)); +        _txt = (_txt).replaceAll( +          rgx.inline_link, +          ("<a href=\"$2\">$1</a>")); +        _txt = (_txt).replaceAll( +          rgx.mark_internal_site_lnk, +          "" +        ); +      } +      debug(markup_links) { +        if (_txt.match(rgx.inline_link)) { +          writeln(__LINE__, +            " (missed) markup link identified (", +            obj.inline_links, +            "): ", obj.is_a, ": ", +            obj.text +          ); +        } +      } +      debug(markup) { +        if (_txt.match(rgx.inline_link)) { +          writeln(__LINE__, +            " (missed) markup link identified (", +            obj.inline_links, +            "): ", obj.is_a, ": ", +            obj.text +          ); +        } +      } +      return _txt; +    } +    auto inline_notes_scroll(O)( +      auto return ref const O   obj, +      string                    _txt, +    ) { +      if (obj.inline_notes_reg) { +        _txt = (_txt).replaceAll( +          rgx.inline_notes_delimiter_al_regular_number_note, +          ("<a href=\"#note_$1\"><note id=\"noteref_$1\"> <sup>$1</sup> </note></a>") +        ); +      } +      debug(markup_endnotes) { +        if (_txt.match(rgx.inline_notes_delimiter_al_regular_number_note)) { +          writeln(__LINE__, " (missed) markup endnote: ", obj.is_a, ": ", obj.text); +        } +      } +      debug(markup) { +        if (_txt.match(rgx.inline_notes_delimiter_al_regular_number_note)) { +          writeln(__LINE__, " (missed) markup endnote: ", obj.is_a, ": ", obj.text); +        } +      } +      return _txt; +    } +    auto inline_notes_seg(O)( +      auto return ref const O     obj, +      string                      _txt, +    ) { +      string[] _endnotes; +      if (obj.inline_notes_reg) { +        /+ need markup for text, and separated footnote +/ +        foreach(m; _txt.matchAll(rgx.inline_notes_delimiter_al_regular_number_note)) { +          _endnotes ~= format( +            "%s%s%s%s\n  %s%s%s%s%s\n  %s\n%s", +            "<p class=\"endnote\">", +            "<a href=\"#noteref_", +            m.captures[1], +            "\">", +            "<note id=\"note_", +            m.captures[1], +            "\"> <sup>", +            m.captures[1], +            ".</sup></note></a>", +            m.captures[2], +            "</p>" +          ); +        } +        _txt = (_txt).replaceAll( +          rgx.inline_notes_delimiter_al_regular_number_note, +          ("<a href=\"#note_$1\"><note id=\"noteref_$1\"> <sup>$1</sup> </note></a>") +        ); +      } else if (_txt.match(rgx.inline_notes_delimiter_al_regular_number_note)) { +        debug(markup) { +          writeln(__LINE__, " endnote: ", obj.is_a, ": ", obj.text); +        } +      } +      auto t = tuple( +        _txt, +        _endnotes, +      ); +      return t; +    } +    auto inline_markup_scroll(O)( +      auto return ref const O  obj, +      string                   _txt, +      string                   _suffix = ".html", +    ) { +      _txt = inline_links(obj, _txt, _suffix, "scroll"); +      _txt = inline_notes_scroll(obj, _txt); +      return _txt; +    } +    auto inline_markup_seg(O)( +      auto return ref const O  obj, +      string                   _txt, +      string                   _suffix = ".html", +    ) { +      _txt = inline_links(obj, _txt, _suffix, "seg"); +      auto t = inline_notes_seg(obj, _txt); +      return t; +    } +    auto toc_seg(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      string o; +      o = format(q"¶  <div class="substance"> +      <p class="%s" indent="h%si%s"> +        %s +      </p> +    </div>¶", +      obj.is_a, +      obj.indent_hang, +      obj.indent_base, +      _txt, +      ); +      return o; +    } +    auto heading(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _type="html", +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      string _horizontal_rule = "<hr />"; +      if ((_type != "html") +      || (obj.heading_lev_markup == 0 || obj.heading_lev_markup > 4)) { +        _horizontal_rule = ""; +      } +      string o; +      if (obj.obj_cite_number.empty) { +        o = format(q"¶%s +      <div class="substance"> +        <h%s class="%s">%s +          %s +        </h%s> +      </div>¶", +          _horizontal_rule, +          obj.heading_lev_markup, +          obj.is_a, +          tags, +          _txt, +          obj.heading_lev_markup, +        ); +      } else { +        o = format(q"¶%s +      <div class="substance"> +        <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +        <h%s class="%s" id="%s"><a name="%s"></a>%s +          %s +        </h%s> +      </div>¶", +        _horizontal_rule, +        obj.obj_cite_number, +        obj.obj_cite_number, +        obj.heading_lev_markup, +        obj.is_a, +        obj.obj_cite_number, +        obj.obj_cite_number, +        tags, +        _txt, +        obj.heading_lev_markup, +        ); +      } +      return o; +    } +    auto heading_scroll(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = inline_markup_scroll(obj, _txt, _suffix); +      string o = heading(obj, _txt); +      return o; +    } +    auto heading_seg(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +      string                     _type = "html", +    ) { +      auto t = inline_markup_seg(obj, _txt, _suffix); +      _txt = t[0]; +      string[] _endnotes = t[1]; +      string o = heading(obj, _txt, _type); +      auto u = tuple( +        o, +        _endnotes, +      ); +      return u; +    } +    auto para(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = font_face(_txt); +      string o; +      _txt = (obj.bullet) ? ("●  " ~ _txt) : _txt; +      if (obj.obj_cite_number.empty) { +        o = format(q"¶  <div class="substance"> +      <p class="%s" indent="h%si%s">%s +        %s +      </p> +    </div>¶", +          obj.is_a, +          obj.indent_hang, +          obj.indent_base, +          tags, +          _txt +        ); +      } else { +        o = format(q"¶  <div class="substance"> +      <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +      <p class="%s" indent="h%si%s" id="%s">%s +        %s +      </p> +    </div>¶", +          obj.obj_cite_number, +          obj.obj_cite_number, +          obj.is_a, +          obj.indent_hang, +          obj.indent_base, +          obj.obj_cite_number, +          tags, +          _txt +        ); +      } +      return o; +    } +    auto para_scroll(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = inline_markup_scroll(obj, _txt, _suffix); +      string o = para(obj, _txt); +      return o; +    } +    auto para_seg(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto t = inline_markup_seg(obj, _txt, _suffix); +      _txt = to!string(t[0]); +      string[] _endnotes = t[1]; +      string o = para(obj, _txt); +      auto u = tuple( +        o, +        _endnotes, +      ); +      return u; +    } +    auto quote(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      _txt = font_face(_txt); +      string o; +      if (obj.obj_cite_number.empty) { +        o = format(q"¶  <div class="substance"> +      <p class="%s"> +        %s +      </p> +    </div>¶", +          obj.is_a, +          _txt +        ); +      } else { +        o = format(q"¶  <div class="substance"> +      <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +      <p class="%s" id="%s"> +        %s +      </p> +    </div>¶", +          obj.obj_cite_number, +          obj.obj_cite_number, +          obj.is_a, +          obj.obj_cite_number, +          _txt +        ); +      } +      return o; +    } +    auto quote_scroll(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = inline_markup_scroll(obj, _txt, _suffix); +      string o = quote(obj, _txt); +      return o; +    } +    auto quote_seg(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto t = inline_markup_seg(obj, _txt, _suffix); +      _txt = to!string(t[0]); +      string[] _endnotes = t[1]; +      string o = quote(obj, _txt); +      auto u = tuple( +        o, +        _endnotes, +      ); +      return u; +    } +    auto group(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      _txt = font_face(_txt); +      string o; +      if (obj.obj_cite_number.empty) { +        o = format(q"¶  <div class="substance"> +      <p class="%s"> +        %s +      </p> +    </div>¶", +          obj.is_a, +          _txt +        ); +      } else { +        o = format(q"¶  <div class="substance"> +      <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +      <p class="%s" id="%s"> +        %s +      </p> +    </div>¶", +          obj.obj_cite_number, +          obj.obj_cite_number, +          obj.is_a, +          obj.obj_cite_number, +          _txt +        ); +      } +      return o; +    } +    auto group_scroll(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = inline_markup_scroll(obj, _txt, _suffix); +      string o = group(obj, _txt); +      return o; +    } +    auto group_seg(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto t = inline_markup_seg(obj, _txt, _suffix); +      _txt = to!string(t[0]); +      string[] _endnotes = t[1]; +      string o = group(obj, _txt); +      auto u = tuple( +        o, +        _endnotes, +      ); +      return u; +    } +    auto block(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      _txt = font_face(_txt); +      string o; +      if (obj.obj_cite_number.empty) { +        o = format(q"¶  <div class="substance"> +      <p class="%s">%s</p> +    </div>¶", +          obj.is_a, +          _txt.stripRight +        ); +      } else { +        o = format(q"¶  <div class="substance"> +      <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +      <p class="%s" id="%s">%s</p> +    </div>¶", +          obj.obj_cite_number, +          obj.obj_cite_number, +          obj.is_a, +          obj.obj_cite_number, +          _txt.stripRight +        ); +      } +      return o; +    } +    auto block_scroll(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = inline_markup_scroll(obj, _txt, _suffix); +      string o = block(obj, _txt); +      return o; +    } +    auto block_seg(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto t = inline_markup_seg(obj, _txt, _suffix); +      _txt = to!string(t[0]); +      string[] _endnotes = t[1]; +      string o = block(obj, _txt); +      auto u = tuple( +        o, +        _endnotes, +      ); +      return u; +    } +    auto verse(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      _txt = font_face(_txt); +      string o; +      if (obj.obj_cite_number.empty) { +          o = format(q"¶  <div class="substance"> +            <p class="%s">%s</p> +        </div>¶", +          obj.is_a, +          _txt +        ); +      } else { +        o = format(q"¶  <div class="substance"> +          <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +          <p class="%s" id="%s">%s</p> +        </div>¶", +          obj.obj_cite_number, +          obj.obj_cite_number, +          obj.is_a, +          obj.obj_cite_number, +          _txt +        ); +      } +      return o; +    } +    auto verse_scroll(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = inline_markup_scroll(obj, _txt, _suffix); +      string o = verse(obj, _txt); +      return o; +    } +    auto verse_seg(O)( +      auto return ref const O    obj, +      string                     _txt, +      string                     _suffix = ".html", +    ) { +      auto t = inline_markup_seg(obj, _txt, _suffix); +      _txt = to!string(t[0]); +      string[] _endnotes = t[1]; +      string o = verse(obj, _txt); +      auto u = tuple( +        o, +        _endnotes, +      ); +      return u; +    } +    auto tablarize(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      string[] _table_rows = (_txt).split(rgx.table_delimiter_row); +      string[] _table_cols; +      string _table; +      string _tablenote; +      foreach(row_idx, row; _table_rows) { +        _table_cols = row.split(rgx.table_delimiter_col); +          _table ~= "<tr>"; +          foreach(col_idx, cell; _table_cols) { +            if ((_table_cols.length == 1) +            && (_table_rows.length <= row_idx+2)) { +              _tablenote ~= cell; +            } else { +              string _col_is = (row_idx == 0 && obj.table_heading) ? "th" : "td"; +              string _align = ("style=\"text-align:" +              ~ ((obj.table_column_aligns[col_idx] == "l") +              ? "left\"" : "right\"")); +              _table ~= "<" ~ _col_is ~ " width=\"" ~ obj.table_column_widths[col_idx].to!string ~ "%\" " ~ _align ~ ">"; +              _table ~= cell; +              _table ~= "</" ~ _col_is ~ ">"; +            } +          } +          _table ~= "</tr>"; +        } +      auto t = tuple( +        _table, +        _tablenote, +      ); +      return t; +    } +    auto table(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      auto tags = _xhtml_anchor_tags(obj.anchor_tags); +      _txt = font_face(_txt); +      auto t = tablarize(obj, _txt); +      _txt = t[0]; +      string _note = t[1]; +      string o; +      o = format(q"¶  <div class="substance"> +      <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +      <p class="%s" id="%s">%s +        <table summary="normal text css" width="95%%" border="0" bgcolor="white" cellpadding="2" align="center"> +          %s +        </table> +        %s +      </p> +    </div>¶", +        obj.obj_cite_number, +        obj.obj_cite_number, +        obj.is_a, +        obj.obj_cite_number, +        tags, +        _txt, +        _note +      ); +      return o; +    } +    auto endnote(O)( +      auto return ref const O    obj, +      string                     _txt, +    ) { +      string o; +      o = format(q"¶    <p class="%s" indent="h%si%s"> +      %s +    </p>¶", +        obj.is_a, +        obj.indent_hang, +        obj.indent_base, +        _txt +      ); +      return o; +    } +    auto code(O)( +      auto return ref const O  obj, +      string                   _txt, +    ) { +      string o; +      if (obj.obj_cite_number.empty) { +          o = format(q"¶  <div class="substance"> +        <p class="%s">%s</p> +    </div>¶", +          obj.is_a, +          _txt +        ); +      } else { +        o = format(q"¶  <div class="substance"> +      <label class="ocn"><a href="#%s" class="lnkocn">%s</a></label> +      <p class="%s" id="%s">%s</p> +    </div>¶", +          obj.obj_cite_number, +          obj.obj_cite_number, +          obj.is_a, +          obj.obj_cite_number, +          _txt +        ); +      } +      return o; +    } +  } +}  | 
