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.d | 1 + src/sdp/meta/metadoc_from_src.d | 60 +++++++++++++++++++++++---- src/sdp/meta/object_setter.d | 89 +++++++++++++++++++++-------------------- src/sdp/meta/rgx.d | 2 + src/sdp/output/html.d | 4 +- src/sdp/output/paths_source.d | 22 +++++----- src/sdp/output/rgx.d | 1 + src/sdp/output/sqlite.d | 49 +---------------------- src/sdp/output/xmls.d | 23 +++++------ src/sdp/output/xmls_css.d | 3 ++ 10 files changed, 132 insertions(+), 122 deletions(-) (limited to 'src/sdp') diff --git a/src/sdp/meta/metadoc.d b/src/sdp/meta/metadoc.d index 37545f0..4aaafce 100644 --- a/src/sdp/meta/metadoc.d +++ b/src/sdp/meta/metadoc.d @@ -77,6 +77,7 @@ template SiSUabstraction() { _header_body_insertfilelist_imagelist[headBody.body_content], _make_and_meta_struct, _opt_action, + _manifest, ); static assert(!isTypeTuple!(da)); static assert(da.length==5); 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; diff --git a/src/sdp/meta/object_setter.d b/src/sdp/meta/object_setter.d index e4bb05f..380bab7 100644 --- a/src/sdp/meta/object_setter.d +++ b/src/sdp/meta/object_setter.d @@ -17,50 +17,51 @@ template ObjectSetter() { } struct ObjGenericComposite { // size_t id; - string of_part = ""; - string of_section = ""; - string is_of = ""; - string is_a = ""; - string text = ""; - string obj_cite_number = ""; - string obj_cite_number_off = ""; - string obj_cite_number_bkidx = ""; - int obj_cite_number_type = 0; - string[] anchor_tags = []; - int indent_base = 0; - int indent_hang = 0; - bool bullet = false; - bool inline_links = false; - bool inline_notes_reg = false; - bool inline_notes_star = false; - string language = ""; // not implemented, consider - string code_block_syntax = ""; - int table_number_of_columns = 0; - double[] table_column_widths = []; - string[] table_column_aligns = []; - bool table_heading = false; - bool table_walls = false; // not implemented - int ocn = 0; - string segment_anchor_tag = ""; - string segname_prev = ""; - string segname_next = ""; - int parent_lev_markup = 0; - int parent_ocn = 0; - int[] ancestors = []; - string marked_up_level = "9"; - int heading_lev_markup = 9; - int heading_lev_collapsed = 9; - int[] dom_markedup = [ 0, 0, 0, 0, 0, 0, 0, 0,]; - int[] dom_collapsed = [ 0, 0, 0, 0, 0, 0, 0, 0,]; - int[] heading_ancestors = [ 0, 0, 0, 0, 0, 0, 0, 0,]; - string[] heading_ancestors_text = [ "", "", "", "", "", "", "", "", ]; - string[] lev4_subtoc = []; - int heading_array_ptr = 0; - int ptr_doc_object = 0; - int ptr_html_segnames = 0; - int ptr_heading = 0; - int array_ptr = 0; - int heading_array_ptr_segments = 0; + string of_part = ""; + string of_section = ""; + string is_of = ""; + string is_a = ""; + string text = ""; + string obj_cite_number = ""; + string obj_cite_number_off = ""; + string obj_cite_number_bkidx = ""; + int obj_cite_number_type = 0; + string[] anchor_tags = []; + int indent_base = 0; + int indent_hang = 0; + bool bullet = false; + bool inline_links = false; + bool inline_notes_reg = false; + bool inline_notes_star = false; + bool contains_image_without_dimensions = false; + string language = ""; // not implemented, consider + string code_block_syntax = ""; + int table_number_of_columns = 0; + double[] table_column_widths = []; + string[] table_column_aligns = []; + bool table_heading = false; + bool table_walls = false; // not implemented + int ocn = 0; + string segment_anchor_tag = ""; + string segname_prev = ""; + string segname_next = ""; + int parent_lev_markup = 0; + int parent_ocn = 0; + int[] ancestors = []; + string marked_up_level = "9"; + int heading_lev_markup = 9; + int heading_lev_collapsed = 9; + int[] dom_markedup = [ 0, 0, 0, 0, 0, 0, 0, 0,]; + int[] dom_collapsed = [ 0, 0, 0, 0, 0, 0, 0, 0,]; + int[] heading_ancestors = [ 0, 0, 0, 0, 0, 0, 0, 0,]; + string[] heading_ancestors_text = [ "", "", "", "", "", "", "", "", ]; + string[] lev4_subtoc = []; + int heading_array_ptr = 0; + int ptr_doc_object = 0; + int ptr_html_segnames = 0; + int ptr_heading = 0; + int array_ptr = 0; + int heading_array_ptr_segments = 0; string[string][string] node; } struct TheObjects { diff --git a/src/sdp/meta/rgx.d b/src/sdp/meta/rgx.d index 8b6f4d2..869728f 100644 --- a/src/sdp/meta/rgx.d +++ b/src/sdp/meta/rgx.d @@ -153,6 +153,7 @@ static template SiSUrgxInit() { static smid_image_generic = ctRegex!(`(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*)\S+\.(?:png|gif|jpg).+?\}(?:image|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)[;:!,?.]?(?:[ )\]]|$)`, "mg"); static smid_image_with_dimensions = ctRegex!(`(?P
(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*))(?P\S+\.(?:png|gif|jpg))\s+(?P\d+)x(?P\d+)\s*(?P(?:.+?)\s*\}(?:image|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?:[;:!,?.]?(?:[ )\]]|$)))`, "mg");
     static smid_image                                      = ctRegex!(`(?P
(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*))(?P\S+\.(?:png|gif|jpg))\s*(?P(?:.+?)\s*\}(?:image|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?:[;:!,?.]?(?:[ )\]]|$)))`, "mg");
+    static smid_mod_image_without_dimensions               = ctRegex!(`\{(?:~\^\s+|\s*)☼\S+\.(?:png|gif|jpg),w0h0\s+(?:.+?)\s*\}(?:image|(?:https?|git):\/\/\S+?)(?:[;:!,?.]?(?:[ )\]]|$))`, "mg");
     /+ inline markup book index +/
     static book_index                                     = ctRegex!(`^=\{\s*(.+?)\}$`, "m");
     static book_index_open                                = ctRegex!(`^=\{\s*([^}]+?)$`);
@@ -248,6 +249,7 @@ static template SiSUrgxInit() {
     static inline_text_and_note_al_                       = ctRegex!(`(.+?(?:【[*+]*\s+.+?】|$))`, "mg");
     /+ inline markup footnotes endnotes +/
     static inline_image                                   = ctRegex!(`(?P
┥)☼(?P(?P\S+?\.(?:jpg|gif|png)),w(?P\d+)h(?P\d+))\s*(?P.*?┝┤.+?├)`, "mg");
+    static inline_image_without_dimensions                = ctRegex!(`(?P
┥)☼(?P(?P\S+?\.(?:jpg|gif|png)),w(?P0)h(?P0))\s*(?P.*?┝┤.+?├)`, "mg");
     static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P.+?)├`, "mg");
     static inline_link_clean                              = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");
     static inline_a_url                                   = ctRegex!(`(┤)(\S+?)(├)`, "mg");
diff --git a/src/sdp/output/html.d b/src/sdp/output/html.d
index d4770e7..ddd3c9f 100644
--- a/src/sdp/output/html.d
+++ b/src/sdp/output/html.d
@@ -180,9 +180,9 @@ template outputHTML() {
     }
     writeln(" ", pth_html.fn_scroll(doc_matters.src.filename));
   }
-  void seg(D,I)(
+  void seg(D,M)(
     auto return ref const D    doc_abstraction,
-    auto return ref I          doc_matters,
+    auto ref              M    doc_matters,
   ) {
     mixin SiSUoutputRgxInit;
     auto rgx = Rgx();
diff --git a/src/sdp/output/paths_source.d b/src/sdp/output/paths_source.d
index 8f14b8e..e7233f0 100644
--- a/src/sdp/output/paths_source.d
+++ b/src/sdp/output/paths_source.d
@@ -295,18 +295,22 @@ template PathMatters() {
             return _dir;
           }
           auto image_dir_path() {
-            string _img_pth(string _possible_img_pth) {
-              return asNormalizedPath(file_with_absolute_path.dirName ~ "/" ~ _possible_img_pth).array;
-            }
             string _paths;
             string[] _possible_img_pths = [ "./image", "../image", "../../image" ];
             string _img_pth_found = "";
-            foreach(_possible_img_pth; _possible_img_pths) {
-              if (exists(_img_pth(_possible_img_pth))) {
-                _img_pth_found = _img_pth(_possible_img_pth);
-                break;
-              } else {
-                _paths ~= " " ~ _img_pth(_possible_img_pth);
+            if (is_pod) {
+              _img_pth_found = asNormalizedPath(file_with_absolute_path.dirName ~ "/../../image").array;
+            } else {
+              string _img_pth(string _possible_img_pth) {
+                return asNormalizedPath(file_with_absolute_path.dirName ~ "/" ~ _possible_img_pth).array;
+              }
+              foreach(_possible_img_pth; _possible_img_pths) {
+                if (exists(_img_pth(_possible_img_pth))) {
+                  _img_pth_found = _img_pth(_possible_img_pth);
+                  break;
+                } else {
+                  _paths ~= " " ~ _img_pth(_possible_img_pth);
+                }
               }
             }
             if (_img_pth_found.empty) {
diff --git a/src/sdp/output/rgx.d b/src/sdp/output/rgx.d
index 60f15cf..a62791c 100644
--- a/src/sdp/output/rgx.d
+++ b/src/sdp/output/rgx.d
@@ -62,6 +62,7 @@ static template SiSUoutputRgxInit() {
     static inline_text_and_note_al_                       = ctRegex!(`(.+?(?:【[*+]*\s+.+?】|$))`, "mg");
     /+ inline markup footnotes endnotes +/
     static inline_image                                   = ctRegex!(`(?P
┥)☼(?P(?P\S+?\.(?:jpg|gif|png)),w(?P\d+)h(?P\d+))\s*(?P.*?┝┤.+?├)`, "mg");
+    static inline_image_without_dimensions                = ctRegex!(`(?P
┥)☼(?P(?P\S+?\.(?:jpg|gif|png)),w(?P0)h(?P0))\s*(?P.*?┝┤.+?├)`, "mg");
     static inline_link                                    = ctRegex!(`┥(?P.+?)┝┤(?P.+?)├`, "mg");
     static inline_link_clean                              = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");
     static inline_a_url                                   = ctRegex!(`(┤)(\S+?)(├)`, "mg");
diff --git a/src/sdp/output/sqlite.d b/src/sdp/output/sqlite.d
index fc1843f..e9667ae 100644
--- a/src/sdp/output/sqlite.d
+++ b/src/sdp/output/sqlite.d
@@ -682,24 +682,9 @@ template SQLiteTablesReCreate() {
         ocns                             VARCHAR(6),
         clean                            TEXT NULL,
         body                             TEXT NULL,
-        book_idx                         TEXT NULL,
         seg                              VARCHAR(256) NULL,
         lev_an                           VARCHAR(1),
         lev                              SMALLINT NULL,
-        lev0                             SMALLINT,
-        lev1                             SMALLINT,
-        lev2                             SMALLINT,
-        lev3                             SMALLINT,
-        lev4                             SMALLINT,
-        lev5                             SMALLINT,
-        lev6                             SMALLINT,
-        lev7                             SMALLINT,
-        en_a                             SMALLINT NULL,
-        en_z                             SMALLINT NULL,
-        en_a_asterisk                    SMALLINT NULL,
-        en_z_asterisk                    SMALLINT NULL,
-        en_a_plus                        SMALLINT NULL,
-        en_z_plus                        SMALLINT NULL,
         t_of                             VARCHAR(16),
         t_is                             VARCHAR(16),
         node                             VARCHAR(16) NULL,
@@ -712,13 +697,6 @@ template SQLiteTablesReCreate() {
       CREATE INDEX idx_digest_clean ON doc_objects(digest_clean);
       CREATE INDEX idx_digest_all ON doc_objects(digest_all);
       CREATE INDEX idx_clean ON doc_objects(clean);
-      CREATE INDEX idx_lev0 ON doc_objects(lev0);
-      CREATE INDEX idx_lev1 ON doc_objects(lev1);
-      CREATE INDEX idx_lev2 ON doc_objects(lev2);
-      CREATE INDEX idx_lev3 ON doc_objects(lev3);
-      CREATE INDEX idx_lev4 ON doc_objects(lev4);
-      CREATE INDEX idx_lev5 ON doc_objects(lev5);
-      CREATE INDEX idx_lev6 ON doc_objects(lev6);
       CREATE INDEX idx_title ON metadata_and_text(title);
       CREATE INDEX idx_author ON metadata_and_text(creator_author);
       CREATE INDEX idx_filename ON metadata_and_text(src_filename);
@@ -1006,16 +984,13 @@ template SQLiteInsertDocObjectsLoop() {
           }
           break;
         case "backmatter":
-          assert(part == "endnotes" || "glossary" || "bibliography" || "bookindex_seg" || "blurb" || "tail", part);
+          assert(part == "glossary" || "bibliography" || "bookindex_seg" || "blurb" || "tail", part);
           switch (obj.is_of) {
           case "para":
             switch (obj.is_a) {
             case "heading":
               obj_txt = format_and_sqlite_load.heading(obj);
               break;
-            case "endnote":              assert(part == "endnotes", part);
-              obj_txt = format_and_sqlite_load.para(obj);
-              break;
             case "glossary":             assert(part == "glossary", part);
               obj_txt = format_and_sqlite_load.para(obj);
               break;
@@ -1195,24 +1170,9 @@ template SQLiteTablesCreate() {
             ocns                             VARCHAR(6),
             clean                            TEXT NULL,
             body                             TEXT NULL,
-            book_idx                         TEXT NULL,
             seg                              VARCHAR(256) NULL,
             lev_an                           VARCHAR(1),
             lev                              SMALLINT NULL,
-            lev0                             SMALLINT,
-            lev1                             SMALLINT,
-            lev2                             SMALLINT,
-            lev3                             SMALLINT,
-            lev4                             SMALLINT,
-            lev5                             SMALLINT,
-            lev6                             SMALLINT,
-            lev7                             SMALLINT,
-            en_a                             SMALLINT NULL,
-            en_z                             SMALLINT NULL,
-            en_a_asterisk                    SMALLINT NULL,
-            en_z_asterisk                    SMALLINT NULL,
-            en_a_plus                        SMALLINT NULL,
-            en_z_plus                        SMALLINT NULL,
             t_of                             VARCHAR(16),
             t_is                             VARCHAR(16),
             node                             VARCHAR(16) NULL,
@@ -1225,13 +1185,6 @@ template SQLiteTablesCreate() {
           CREATE INDEX idx_digest_clean ON doc_objects(digest_clean);
           CREATE INDEX idx_digest_all ON doc_objects(digest_all);
           CREATE INDEX idx_clean ON doc_objects(clean);
-          CREATE INDEX idx_lev0 ON doc_objects(lev0);
-          CREATE INDEX idx_lev1 ON doc_objects(lev1);
-          CREATE INDEX idx_lev2 ON doc_objects(lev2);
-          CREATE INDEX idx_lev3 ON doc_objects(lev3);
-          CREATE INDEX idx_lev4 ON doc_objects(lev4);
-          CREATE INDEX idx_lev5 ON doc_objects(lev5);
-          CREATE INDEX idx_lev6 ON doc_objects(lev6);
           CREATE INDEX idx_title ON metadata_and_text(title);
           CREATE INDEX idx_author ON metadata_and_text(creator_author);
           CREATE INDEX idx_filename ON metadata_and_text(src_filename);
diff --git a/src/sdp/output/xmls.d b/src/sdp/output/xmls.d
index 1621732..785d87e 100644
--- a/src/sdp/output/xmls.d
+++ b/src/sdp/output/xmls.d
@@ -100,8 +100,8 @@ template outputXHTMLs() {
       }
       return tags;
     }
-    auto header_metadata(Dm)(
-      Dm doc_matters,
+    auto header_metadata(M)(
+      M  doc_matters,
     ) {
       string _title="Title";
       string _author="Author";
@@ -149,8 +149,8 @@ template outputXHTMLs() {
       );
       return o;
     }
-    auto site_info_button(Dm)(
-      Dm doc_matters,
+    auto site_info_button(M)(
+      M  doc_matters,
     ) {
       string _locations;
       if (doc_matters.conf_make_meta.make.home_button_text.length > 0) {
@@ -173,8 +173,8 @@ template outputXHTMLs() {
       );
       return o;
     }
-    auto inline_search_form(Dm)(
-      Dm doc_matters,
+    auto inline_search_form(M)(
+      M  doc_matters,
     ) {
       string _action="http://www.sisudoc.org/cgi-bin/search.cgi";
       string _db="SiSU.7a.manual";
@@ -197,8 +197,8 @@ template outputXHTMLs() {
       );
       return o;
     }
-    auto html_head(Dm)(
-      Dm doc_matters,
+    auto html_head(M)(
+      M  doc_matters,
       string type,
     ) {
       string o;
@@ -244,8 +244,8 @@ template outputXHTMLs() {
       );
       return o;
     }
-    auto epub3_seg_head(Dm)(
-      Dm doc_matters,
+    auto epub3_seg_head(M)(
+      M  doc_matters,
     ) {
       string html_base = format(q"¶
     ¶",
@@ -326,8 +326,7 @@ template outputXHTMLs() {
         _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)
+        _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