aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sdp/meta/metadoc_from_src.d
diff options
context:
space:
mode:
Diffstat (limited to 'src/sdp/meta/metadoc_from_src.d')
-rw-r--r--src/sdp/meta/metadoc_from_src.d60
1 files changed, 53 insertions, 7 deletions
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;