diff options
Diffstat (limited to 'org')
-rw-r--r-- | org/default_paths.org | 9 | ||||
-rw-r--r-- | org/default_regex.org | 4 | ||||
-rw-r--r-- | org/meta_abstraction.org | 29 | ||||
-rw-r--r-- | org/output_sqlite.org | 230 | ||||
-rw-r--r-- | org/output_xmls.org | 8 |
5 files changed, 269 insertions, 11 deletions
diff --git a/org/default_paths.org b/org/default_paths.org index 932b034..806b0f7 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -1054,6 +1054,15 @@ template DocReformPathsHTML() { string fn_seg(string fn_src, string seg_filename) { return asNormalizedPath(seg(fn_src).chainPath(seg_filename ~ suffix)).array; } + string tail_seg(string fn_src) { + return lng ~ "/html/" ~ base_filename(fn_src); + } + string tail_fn_scroll(string fn_src) { + return lng ~ "/html/" ~ base_filename(fn_src) ~ suffix; + } + string tail_fn_seg(string fn_src, string seg_filename) { + return lng ~ "/html/" ~ seg(fn_src) ~ "/" ~ seg_filename ~ suffix; + } } return _PathsStruct(); } diff --git a/org/default_regex.org b/org/default_regex.org index 65d7cf6..02f5c0d 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -144,7 +144,7 @@ static heading_a = ctRegex!(`^:?[A][~] `, " static heading = ctRegex!(`^:?([A-D1-4])[~]([a-z0-9_.-]*[?]?)\s+`,"i"); static heading_seg_and_above = ctRegex!(`^:?([A-D1])[~]([a-z0-9_.-]*[?]?)\s+`,"i"); static heading_marker = ctRegex!(`^:?([A-D1-4])[~]`); -static heading_anchor_tag = ctRegex!(`^:?[A-D1-4][~]([a-z0-9_.-]+) `,"i"); +static heading_anchor_tag = ctRegex!(`^:?[A-D1-4][~](?P<anchor>[a-z0-9_.-]+) `,"i"); static heading_identify_anchor_tag = ctRegex!(`^:?[A-D1-4][~]\s+(?:(?:(?:chapter|article|section|clause)\s+[0-9.]+)|(?:[0-9]+))`,"i"); static heading_extract_named_anchor_tag = ctRegex!(`^:?[A-D1-4][~]\s+(chapter|article|section|clause)\s+((?:[0-9]+[.:])*[0-9]+)(?=[.:;, ]|$)`,"i"); static heading_extract_unnamed_anchor_tag = ctRegex!(`^:?[A-D1-4][~]\s+((?:[0-9]+.)*[0-9]+)(?=[.:;, ]|$)`); @@ -165,6 +165,7 @@ static para_bullet_indent = ctRegex!(`^_([1-9])[*] ` static para_indent = ctRegex!(`^_([1-9]) `); static para_indent_hang = ctRegex!(`^_([0-9])_([0-9]) `); static para_attribs = ctRegex!(`^_(?:(?:[0-9])(?:_([0-9]))?|(?:[1-9])?[*]) `); +static para_inline_link_anchor = ctRegex!(`\*[~](?P<anchor>[a-z0-9_.-]+)(?= |$)`,"i"); #+END_SRC ** blocked markup @@ -493,6 +494,7 @@ static inline_text_and_note_al_ = ctRegex!(`(.+?(?:【[*+] /+ inline markup footnotes endnotes +/ static inline_image = ctRegex!(`(?P<pre>┥)☼(?P<imginf>(?P<img>\S+?\.(?:jpg|gif|png)),w(?P<width>\d+)h(?P<height>\d+))\s*(?P<post>.*?┝┤.+?├)`, "mg"); static inline_image_without_dimensions = ctRegex!(`(?P<pre>┥)☼(?P<imginf>(?P<img>\S+?\.(?:jpg|gif|png)),w(?P<width>0)h(?P<height>0))\s*(?P<post>.*?┝┤.+?├)`, "mg"); +static inline_link_anchor = ctRegex!(`┋(?P<anchor>\S+?)┋`, "mg"); static inline_link = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>\S+?)├`, "mg"); static inline_link_hash = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>#(?P<segname>\S+?))├`, "mg"); static inline_link_clean = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg"); diff --git a/org/meta_abstraction.org b/org/meta_abstraction.org index 2a447bc..1b98b2e 100644 --- a/org/meta_abstraction.org +++ b/org/meta_abstraction.org @@ -34,6 +34,7 @@ template DocReformDocAbstraction() { <<abs_top_mixins>> /+ ↓ abstraction struct init +/ <<abs_top_init_struct>> + <<abs_inline_para_tag_associations>> /+ ↓ abstract marked up document +/ auto DocReformDocAbstraction(Src,CMM,Opt,Mfst)( Src markup_sourcefile_content, @@ -418,6 +419,23 @@ auto node_construct = NodeStructureMetadata(); enum sObj { content, anchor_tag, notes_reg, notes_star, links, image_no_dimensions } #+END_SRC +*** inline para tag associations + +#+name: abs_inline_para_tag_associations +#+BEGIN_SRC d +auto inline_para_link_anchor(O,St,TA)(O an_object, St segment_anchor_tag_that_object_belongs_to, TA tag_assoc) { + static auto rgx = Rgx(); + if (auto m = an_object["substantive"].match(rgx.inline_link_anchor)) { + if (m.captures[1] !in tag_assoc) { + tag_assoc[(m.captures[1])] = [segment_anchor_tag_that_object_belongs_to]; // follow figure out how to use for text inline anchor tags + } else { + writeln("a tag named already exists, check text line\n ", an_object["substantive"]); + } + } + return tag_assoc; +} +#+END_SRC + *** scope #+name: abs_init_rest @@ -1294,6 +1312,7 @@ if ((obj_type_status["heading"] == State.on) = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, false); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; + tag_assoc = inline_para_link_anchor(an_object, segment_anchor_tag_that_object_belongs_to, tag_assoc); comp_obj_para = comp_obj_para.init; comp_obj_para.metainfo.is_of_part = "body"; comp_obj_para.metainfo.is_of_section = "body"; @@ -3782,6 +3801,7 @@ void _poem_block_(L,O,T,C,N,CMM,Ts)( = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, false); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; + tag_assoc = inline_para_link_anchor(an_object, segment_anchor_tag_that_object_belongs_to, tag_assoc); comp_obj_block = comp_obj_block.init; comp_obj_block.metainfo.is_of_part = "body"; comp_obj_block.metainfo.is_of_section = "body"; @@ -3842,6 +3862,7 @@ void _poem_block_(L,O,T,C,N,CMM,Ts)( = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, false); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; + tag_assoc = inline_para_link_anchor(an_object, segment_anchor_tag_that_object_belongs_to, tag_assoc); comp_obj_block = comp_obj_block.init; comp_obj_block.metainfo.is_of_part = "body"; comp_obj_block.metainfo.is_of_section = "body"; @@ -3885,6 +3906,7 @@ void _poem_block_(L,O,T,C,N,CMM,Ts)( = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, false); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; + tag_assoc = inline_para_link_anchor(an_object, segment_anchor_tag_that_object_belongs_to, tag_assoc); comp_obj_block = comp_obj_block.init; comp_obj_block.metainfo.is_of_part = "body"; comp_obj_block.metainfo.is_of_section = "body"; @@ -3945,6 +3967,7 @@ void _poem_block_(L,O,T,C,N,CMM,Ts)( = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, false); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; + tag_assoc = inline_para_link_anchor(an_object, segment_anchor_tag_that_object_belongs_to, tag_assoc); comp_obj_block = comp_obj_block.init; comp_obj_block.metainfo.is_of_part = "body"; comp_obj_block.metainfo.is_of_section = "body"; @@ -4167,6 +4190,7 @@ void _block_flag_line_empty_(B,N,CMM,Ts)( = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, false); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; + tag_assoc = inline_para_link_anchor(an_object, segment_anchor_tag_that_object_belongs_to, tag_assoc); comp_obj_block = comp_obj_block.init; comp_obj_block.metainfo.is_of_part = "body"; comp_obj_block.metainfo.is_of_section = "body"; @@ -4219,6 +4243,7 @@ void _block_flag_line_empty_(B,N,CMM,Ts)( = obj_im.obj_inline_markup_and_anchor_tags_and_misc(an_object, an_object_key, conf_make_meta, false); an_object["substantive"] = substantive_obj_misc_tuple[sObj.content]; anchor_tag = substantive_obj_misc_tuple[sObj.anchor_tag]; + tag_assoc = inline_para_link_anchor(an_object, segment_anchor_tag_that_object_belongs_to, tag_assoc); comp_obj_block = comp_obj_block.init; comp_obj_block.metainfo.is_of_part = "body"; comp_obj_block.metainfo.is_of_section = "body"; @@ -5433,6 +5458,10 @@ static struct ObjInlineMarkupMunge { urls = true; obj_txt_in = url_links(obj_txt_in); } + if (auto m = obj_txt_in.match(rgx.para_inline_link_anchor)) { + obj_txt_in = (obj_txt_in) + .replaceAll(rgx.para_inline_link_anchor, "┋$1┋"); + } auto ftn = footnotes_endnotes_markup_and_number_or_stars(obj_txt_in, reset_note_numbers); obj_txt_out = ftn[0]; debug(footnotes) { diff --git a/org/output_sqlite.org b/org/output_sqlite.org index 566b960..e456fe7 100644 --- a/org/output_sqlite.org +++ b/org/output_sqlite.org @@ -420,11 +420,6 @@ auto munge_html(M,O)( } _txt = _txt.replaceAll(rgx.inline_notes_al_gen_ref, "<sup>$1</sup> "); } - if (_txt.matchFirst(rgx.inline_link)) { - foreach (m; _txt.matchAll(rgx.inline_link)) { - } - _txt = _txt.replaceAll(rgx.inline_link_clean, ""); - } if (_notes.length > 0) { _txt ~= _notes; } @@ -486,6 +481,229 @@ string html_font_face(string _txt){ } #+END_SRC +****** inline markup +******* images + +#+name: sanitize_and_munge_inline_html +#+BEGIN_SRC d +auto inline_images(M,O)( + M doc_matters, + const O obj, + string _txt, + string _suffix = ".html", + string _xml_type = "seg", +) { + string _img_pth; + if (_xml_type == "epub") { + _img_pth = "image/"; + } else if (_xml_type == "scroll") { + _img_pth = "../../image/"; + } else if (_xml_type == "seg") { + _img_pth = "../../../image/"; + } + if (_txt.match(rgx.inline_image)) { + _txt = _txt.replaceAll( // TODO bug where image dimensions (w or h) not given & consequently set to 0; should not be used (calculate earlier, abstraction) + rgx.inline_image, + ("$1<img src=\"" + ~ _img_pth + ~ "$3\" width=\"$4\" height=\"$5\" naturalsizeflag=\"0\" align=\"bottom\" border=\"0\" /> $6")); + } + return _txt; +} +#+END_SRC + +******* links +******** scroll, seg, epub + +#+name: sanitize_and_munge_inline_html +#+BEGIN_SRC d +auto inline_links(M,O)( + M doc_matters, + const O obj, + string _txt, + string _xml_type = "seg", +) { + if (obj.has.inline_links) { + if ((_txt.match(rgx.mark_internal_site_lnk)) + && (_xml_type == "scroll")) { // conditions reversed to avoid: gdc compiled program run segfault + _txt = (_txt).replaceAll( + rgx.inline_seg_link, + "$1"); + } + auto pth_html = DocReformPathsHTML!()(doc_matters.output_path, doc_matters.src.language); + if (_xml_type == "seg") { + foreach (m; _txt.match(rgx.inline_link_hash)) { + if (m.captures[3] in doc_matters.xml.tag_associations) { + if (m.captures[3] == doc_matters.xml.tag_associations[(m.captures[3])][0]) { + _txt = _txt.replaceFirst( + rgx.inline_link_hash, + "┥$1┝┤" + ~ doc_matters.conf_make_meta.conf.webserv_url_doc_root + ~ "/" + ~ pth_html.tail_fn_seg(doc_matters.src.filename, "$3.html") + ~ "├" + ); + } else { + _txt = _txt.replaceFirst( + rgx.inline_link_hash, + "┥$1┝┤" + ~ doc_matters.conf_make_meta.conf.webserv_url_doc_root + ~ "/" + ~ doc_matters.xml.tag_associations[(m.captures[3])][0] + ~ ".html" + ~ "#" ~ "$3" + ~ "├" + ); + } + } else { + writeln( + "WARNING on internal document links, anchor to link not found in document, " + ~ "anchor: " ~ m.captures[3] + ~ " document: " ~ doc_matters.src.filename + ); + } + } + } else { + if (auto m = _txt.match(rgx.inline_link_hash)) { + _txt = _txt.replaceFirst( + rgx.inline_link_hash, + "┥$1┝┤" + ~ doc_matters.conf_make_meta.conf.webserv_url_doc_root + ~ "/" + ~ pth_html.tail_fn_scroll(doc_matters.src.filename) + ~ "#" ~ "$3" + ~ "├" + ); + } + } + _txt = (_txt) + .replaceAll( + rgx.inline_link_fn_suffix, + ("$1.html")) + .replaceAll( + rgx.inline_link, + ("<a href=\"$2\">$1</a>")) + .replaceAll( + rgx.mark_internal_site_lnk, + ""); + } + debug(markup_links) { + if (_txt.match(rgx.inline_link)) { + writeln(__LINE__, + " (missed) markup link identified (", + obj.has.inline_links, + "): ", obj.metainfo.is_a, ": ", + obj.text + ); + } + } + debug(markup) { + if (_txt.match(rgx.inline_link)) { + writeln(__LINE__, + " (missed) markup link identified (", + obj.has.inline_links, + "): ", obj.metainfo.is_a, ": ", + obj.text + ); + } + } + return _txt; +} +#+END_SRC + +******* notes +******** scroll + +#+name: sanitize_and_munge_inline_html +#+BEGIN_SRC d +auto inline_notes_scroll(M,O)( + M doc_matters, + const O obj, + string _txt, +) { + if (obj.has.inline_notes_reg) { + // _txt = font_face(_txt); + _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.metainfo.is_a, ": ", obj.text); + } + } + debug(markup) { + if (_txt.match(rgx.inline_notes_delimiter_al_regular_number_note)) { + writeln(__LINE__, " (missed) markup endnote: ", obj.metainfo.is_a, ": ", obj.text); + } + } + return _txt; +} +#+END_SRC + +******** seg + +#+name: sanitize_and_munge_inline_html +#+BEGIN_SRC d +auto inline_notes_seg(M,O)( + M doc_matters, + const O obj, + string _txt, +) { + string[] _endnotes; + if (obj.has.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.metainfo.is_a, ": ", obj.text); + } + } + auto t = tuple( + _txt, + _endnotes, + ); + return t; +} +#+END_SRC + +******* inline markup + +#+name: sanitize_and_munge_inline_html +#+BEGIN_SRC d +string xml_type="seg"; /+ set html document type to be linked to here (seg|scroll) +/ +auto inline_markup(M,O)( + M doc_matters, + const O obj, + string _txt, +) { + _txt = inline_images(doc_matters, obj, _txt, xml_type); + _txt = inline_links(doc_matters, obj, _txt, xml_type); + _txt = inline_notes_scroll(doc_matters, obj, _txt); + return _txt; +} +#+END_SRC + ***** objects ****** heading @@ -496,6 +714,7 @@ auto html_heading(M,O)( auto ref const O obj, ) { string _txt = munge_html(doc_matters, obj); + _txt = inline_markup(doc_matters, obj, _txt); string o = format(q"¶<p class="%s"><b> %s </b></p>¶", @@ -538,6 +757,7 @@ auto html_para(M,O)( ) { string _txt = munge_html(doc_matters, obj); _txt = (obj.attrib.bullet) ? ("●  " ~ _txt) : _txt; + _txt = inline_markup(doc_matters, obj, _txt); string o = format(q"¶<p class="%s" indent="h%si%s"> %s </p>¶", diff --git a/org/output_xmls.org b/org/output_xmls.org index cb7830a..a1b166e 100644 --- a/org/output_xmls.org +++ b/org/output_xmls.org @@ -466,7 +466,7 @@ auto inline_links(M,O)( "$1"); } if (_xml_type == "seg" || _xml_type == "epub") { - if (auto m = _txt.match(rgx.inline_link_hash)) { + foreach (m; _txt.match(rgx.inline_link_hash)) { if (m.captures[3] in doc_matters.xml.tag_associations) { if (m.captures[3] == doc_matters.xml.tag_associations[(m.captures[3])][0]) { _txt = _txt.replaceFirst( @@ -770,7 +770,6 @@ auto heading(M,O)( string _xml_type = "html", ) { auto tags = _xhtml_anchor_tags(obj); - string seg_anchor_tag; string heading_lev_anchor_tag; string _horizontal_rule = "<hr />"; if ((_xml_type != "html") @@ -779,9 +778,6 @@ auto heading(M,O)( } _txt = font_face(_txt); string o; - seg_anchor_tag = (obj.tags.segment_anchor_tag.empty) - ? "" - : "<a name=\"" ~ obj.tags.segment_anchor_tag ~ "\"></a>"; heading_lev_anchor_tag = (obj.tags.heading_lev_anchor_tag.empty) ? "" : "<a name=\"" ~ obj.tags.heading_lev_anchor_tag ~ "\"></a>"; @@ -879,6 +875,8 @@ auto para(M,O)( _txt = font_face(_txt); string o; _txt = (obj.attrib.bullet) ? ("●  " ~ _txt) : _txt; + _txt = _txt.replaceFirst(rgx.inline_link_anchor, + "<a name=\"$1\"></a>"); if (obj.metainfo.object_number.empty) { o = format(q"¶ <div class="substance"> <p class="%s" indent="h%si%s">%s |