From 4bc9e4921afac5ddf9e84c2f1873639179be86ef Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Tue, 29 May 2018 18:11:26 -0400 Subject: 0.26.2 image(s) without dimensions --- src/sdp/meta/metadoc_from_src.d | 60 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 7 deletions(-) (limited to 'src/sdp/meta/metadoc_from_src.d') diff --git a/src/sdp/meta/metadoc_from_src.d b/src/sdp/meta/metadoc_from_src.d index b5fd5ab..8fb22be 100644 --- a/src/sdp/meta/metadoc_from_src.d +++ b/src/sdp/meta/metadoc_from_src.d @@ -234,12 +234,13 @@ template SiSUdocAbstraction() { /+ node +/ ObjGenericComposite comp_obj_heading, comp_obj_location, comp_obj_block, comp_obj_code, comp_obj_poem_ocn, comp_obj_comment; auto node_construct = NodeStructureMetadata(); - enum sObj { content, anchor_tags, notes_reg, notes_star, links } + enum sObj { content, anchor_tags, notes_reg, notes_star, links, image_no_dimensions } /+ ↓ abstract marked up document +/ - auto SiSUdocAbstraction(Src,CMM,Opt)( + auto SiSUdocAbstraction(Src,CMM,Opt,Mfst)( Src markup_sourcefile_content, CMM conf_make_meta, Opt opt_action, + Mfst manifest_matter, ) { static auto rgx = Rgx(); debug(asserts) { @@ -383,7 +384,7 @@ template SiSUdocAbstraction() { writeln("substitution to make: ", conf_make_meta.make.italics[Substitute.markup]); } } - /+ ↓ loop markup document/text line by line +/ + /+ ↓ ↻ loop markup document/text line by line +/ srcDocLoop: foreach (line; markup_sourcefile_content) { // "line" variable can be empty but should never be null @@ -970,6 +971,7 @@ template SiSUdocAbstraction() { comp_obj_para.inline_notes_reg = substantive_obj_misc_tuple[sObj.notes_reg]; comp_obj_para.inline_notes_star = substantive_obj_misc_tuple[sObj.notes_star]; comp_obj_para.inline_links = substantive_obj_misc_tuple[sObj.links]; + comp_obj_para.contains_image_without_dimensions = substantive_obj_misc_tuple[sObj.image_no_dimensions]; the_document_body_section ~= comp_obj_para; _common_reset_(line_occur, an_object, obj_type_status); indent=[ @@ -1421,6 +1423,40 @@ template SiSUdocAbstraction() { return images_; } string[] segnames_0_4; + auto _image_dimensions(M,O)(M manifest_matter, O obj) { + if (obj.contains_image_without_dimensions) { + import std.math; + import imageformats; + int w, h, chans; + real _w, _h; + int max_width = 640; + foreach (m; obj.text.matchAll(rgx.inline_image_without_dimensions)) { + debug(images) { + writeln(manifest_matter.src.image_dir_path ~ "/" ~ m.captures["img"]); + } + read_image_info(manifest_matter.src.image_dir_path ~ "/" ~ m.captures["img"], w, h, chans); + // calculate, decide max width and proportionally reduce to keep w & h within it + debug(images) { + writeln("width: ", w, ", height: ", h); + } + if (w > max_width) { + _w = max_width; + _h = round((max_width / w.to!real) * h.to!real); + } else { + _w = w; + _h = h; + } + obj.text = obj.text.replaceFirst( + rgx.inline_image_without_dimensions, + ("$1☼$3,w" ~ _w.to!string ~ "h" ~ _h.to!string ~ " $6") + ); + } + debug(images) { + writeln("image without dimensions: ", obj.text); + } + } + return obj; + } foreach (ref obj; the_document_head_section) { if (obj.is_a == "heading") { debug(dom) { @@ -1540,6 +1576,7 @@ template SiSUdocAbstraction() { obj = obj_heading_ancestors(obj, lv_ancestors_txt); } else if (obj.is_a == "para") { _images ~= extract_images(obj.text); + obj = _image_dimensions(manifest_matter, obj); } } } @@ -1874,6 +1911,7 @@ template SiSUdocAbstraction() { document_section_keys_sequenced["seg"] ~= "tail"; document_section_keys_sequenced["scroll"] ~= "tail"; } + auto sequenced_document_keys = docSectKeysSeq!()(document_section_keys_sequenced); auto segnames = html_segnames.dup; destroy(the_document_head_section); destroy(the_table_of_contents_section); @@ -1898,7 +1936,7 @@ template SiSUdocAbstraction() { dom_collapsed_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,]; auto t = tuple( document_the, - docSectKeysSeq!()(document_section_keys_sequenced), + sequenced_document_keys, segnames, segnames_0_4, images, @@ -3980,6 +4018,7 @@ template SiSUdocAbstraction() { body { obj_txt_out = ""; bool urls = false; + bool images_without_dimensions = false; tail = ""; /+ special endnotes +/ obj_txt_in = obj_txt_in.replaceAll( @@ -3994,6 +4033,9 @@ template SiSUdocAbstraction() { /+ image matched +/ if (obj_txt_in.match(rgx.smid_image_generic)) { obj_txt_in = images(obj_txt_in); + if (obj_txt_in.match(rgx.smid_mod_image_without_dimensions)) { + images_without_dimensions = true; + } } /+ url matched +/ if (obj_txt_in.match(rgx.smid_inline_url)) { @@ -4019,6 +4061,7 @@ template SiSUdocAbstraction() { ftn[2], ftn[3], urls, + images_without_dimensions, ); return t; } @@ -4179,9 +4222,10 @@ template SiSUdocAbstraction() { static __gshared string[] anchor_tags_ = []; auto x = munge.init; bool[string] obj_notes_and_links; - obj_notes_and_links["notes_reg"] = false; - obj_notes_and_links["notes_star"] = false; - obj_notes_and_links["links"] = false; + obj_notes_and_links["notes_reg"] = false; + obj_notes_and_links["notes_star"] = false; + obj_notes_and_links["links"] = false; + obj_notes_and_links["image_no_dimensions"] = false; switch (obj_["is"]) { case "heading": static __gshared string anchor_tag = ""; @@ -4230,6 +4274,7 @@ template SiSUdocAbstraction() { obj_notes_and_links["notes_star"] = x[2]; obj_notes_and_links["notes_plus"] = x[3]; obj_notes_and_links["links"] = x[4]; + obj_notes_and_links["image_no_dimensions"] = x[5]; break; } auto t = tuple( @@ -4238,6 +4283,7 @@ template SiSUdocAbstraction() { obj_notes_and_links["notes_reg"], obj_notes_and_links["notes_star"], obj_notes_and_links["links"], + obj_notes_and_links["image_no_dimensions"], ); anchor_tags_=[]; return t; -- cgit v1.2.3