diff options
| -rw-r--r-- | dub.sdl | 8 | ||||
| -rw-r--r-- | maker.org | 8 | ||||
| -rw-r--r-- | org/default_paths.org | 22 | ||||
| -rw-r--r-- | org/default_regex.org | 2 | ||||
| -rw-r--r-- | org/meta_abstraction.org | 244 | ||||
| -rw-r--r-- | org/output_sqlite.org | 31 | ||||
| -rw-r--r-- | org/output_xmls.org | 27 | ||||
| -rw-r--r-- | org/output_xmls_css.org | 5 | ||||
| -rw-r--r-- | org/sdp.org | 3 | ||||
| -rw-r--r-- | src/sdp/meta/metadoc.d | 1 | ||||
| -rw-r--r-- | src/sdp/meta/metadoc_from_src.d | 60 | ||||
| -rw-r--r-- | src/sdp/meta/object_setter.d | 89 | ||||
| -rw-r--r-- | src/sdp/meta/rgx.d | 2 | ||||
| -rw-r--r-- | src/sdp/output/html.d | 4 | ||||
| -rw-r--r-- | src/sdp/output/paths_source.d | 22 | ||||
| -rw-r--r-- | src/sdp/output/rgx.d | 1 | ||||
| -rw-r--r-- | src/sdp/output/sqlite.d | 49 | ||||
| -rw-r--r-- | src/sdp/output/xmls.d | 23 | ||||
| -rw-r--r-- | src/sdp/output/xmls_css.d | 3 | ||||
| -rw-r--r-- | views/version.txt | 2 | 
20 files changed, 337 insertions, 269 deletions
| @@ -8,12 +8,12 @@ targetPath          "./bin"  #sourcePath          "./src/sdp"  stringImportPaths   "./views"  buildRequirements   "allowWarnings" -dependency          "toml"         version="~>0.4.0-rc.2" # https://code.dlang.org/packages/toml       https://github.com/toml-lang/toml/wiki +dependency          "toml"         version="~>0.4.0-rc.2" # https://code.dlang.org/packages/toml          https://github.com/toml-lang/toml/wiki  dependency          "toml:json"    version="~>0.4.0-rc.2" -dependency          "d2sqlite3"    version="~>0.16.1"     # https://code.dlang.org/packages/d2sqlite3  http://biozic.github.io/d2sqlite3/d2sqlite3.html +dependency          "d2sqlite3"    version="~>0.16.1"     # https://code.dlang.org/packages/d2sqlite3     http://biozic.github.io/d2sqlite3/d2sqlite3.html    subconfiguration  "d2sqlite3"   "all-included" -dependency          "archive"      version="~>0.6.0"      # http://code.dlang.org/packages/archive     https://github.com/rcythr/archive -dependency          "imageformats" version="~>7.0.0" +dependency          "archive"      version="~>0.6.0"      # http://code.dlang.org/packages/archive        https://github.com/rcythr/archive +dependency          "imageformats" version="~>7.0.0"      # https://code.dlang.org/packages/imageformats  https://github.com/lgvz/imageformats  configuration "reggae" {    name                 "build"    targetType           "executable" @@ -819,12 +819,12 @@ targetPath          "./bin"  #sourcePath          "./src/sdp"  stringImportPaths   "./views"  buildRequirements   "allowWarnings" -dependency          "toml"         version="~>0.4.0-rc.2" # https://code.dlang.org/packages/toml       https://github.com/toml-lang/toml/wiki +dependency          "toml"         version="~>0.4.0-rc.2" # https://code.dlang.org/packages/toml          https://github.com/toml-lang/toml/wiki  dependency          "toml:json"    version="~>0.4.0-rc.2" -dependency          "d2sqlite3"    version="~>0.16.1"     # https://code.dlang.org/packages/d2sqlite3  http://biozic.github.io/d2sqlite3/d2sqlite3.html +dependency          "d2sqlite3"    version="~>0.16.1"     # https://code.dlang.org/packages/d2sqlite3     http://biozic.github.io/d2sqlite3/d2sqlite3.html    subconfiguration  "d2sqlite3"   "all-included" -dependency          "archive"      version="~>0.6.0"      # http://code.dlang.org/packages/archive     https://github.com/rcythr/archive -dependency          "imageformats" version="~>7.0.0" +dependency          "archive"      version="~>0.6.0"      # http://code.dlang.org/packages/archive        https://github.com/rcythr/archive +dependency          "imageformats" version="~>7.0.0"      # https://code.dlang.org/packages/imageformats  https://github.com/lgvz/imageformats  #+END_SRC  ** generic                                                         :generic: diff --git a/org/default_paths.org b/org/default_paths.org index 16dcfaf..b8ff2a4 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -348,18 +348,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/org/default_regex.org b/org/default_regex.org index 6b535a0..a018c1b 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -272,6 +272,7 @@ static image                                           = ctRegex!(`([a-zA-Z0-9._  static smid_image_generic                              = ctRegex!(`(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*)\S+\.(?:png|gif|jpg).+?\}(?:image|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)[;:!,?.]?(?:[ )\]]|$)`, "mg");  static smid_image_with_dimensions                      = ctRegex!(`(?P<pre>(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*))(?P<image>\S+\.(?:png|gif|jpg))\s+(?P<width>\d+)x(?P<height>\d+)\s*(?P<post>(?:.+?)\s*\}(?:image|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?:[;:!,?.]?(?:[ )\]]|$)))`, "mg");  static smid_image                                      = ctRegex!(`(?P<pre>(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*))(?P<image>\S+\.(?:png|gif|jpg))\s*(?P<post>(?:.+?)\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");  #+END_SRC  *** inline markup book index                             :inline:bookindex: @@ -489,6 +490,7 @@ static inline_text_and_note_al_                       = ctRegex!(`(.+?(?:【[*+]  #+BEGIN_SRC d  /+ 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                                    = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>.+?)├`, "mg");  static inline_link_clean                              = ctRegex!(`┤(?:.+?)├|[┥┝]`, "mg");  static inline_a_url                                   = ctRegex!(`(┤)(\S+?)(├)`, "mg"); diff --git a/org/meta_abstraction.org b/org/meta_abstraction.org index 43cd85d..f74c8d6 100644 --- a/org/meta_abstraction.org +++ b/org/meta_abstraction.org @@ -36,10 +36,11 @@ template SiSUdocAbstraction() {    /+ ↓ abstraction struct init +/    <<abs_top_init_struct>>    /+ ↓ 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) { @@ -49,7 +50,7 @@ template SiSUdocAbstraction() {      <<abs_init_rest>>      /+ abstraction init ↑ +/      <<make_tests>> -    /+ ↓ 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 @@ -84,6 +85,7 @@ template SiSUdocAbstraction() {      } /+ ← closed: loop markup document/text line by line +/      /+ ↓ post loop markup document/text +/      <<abs_post>> +    <<abs_return_tuple>>      /+ post loop markup document/text ↑ +/    } /+ ← closed: abstract doc source +/    /+ ↓ abstraction functions +/ @@ -409,7 +411,7 @@ string[][string][string] bookindex_unordered_hashes;  /+ 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 }  #+END_SRC  *** scope @@ -566,8 +568,8 @@ debug (substitutions) {  }  #+END_SRC -** 2. _loop: process document body_ [+6]                                :loop: -*** loop scope                                                      :scope: +** 2. ↻ *LOOP* _loop: process document body_ [+6]                         :loop: +*** Loop scope                                                      :scope:  #+name: abs_in_loop_body_00  #+BEGIN_SRC d @@ -1297,6 +1299,7 @@ if ((obj_type_status["heading"] == State.on)    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=[ @@ -1782,11 +1785,11 @@ the_document_head_section ~= the_document_body_section[0];  the_document_body_section=the_document_body_section[1..$];  #+END_SRC -*** _post main-loop loops_                                           :post: -**** 1. _loop backmatter:_ loop up to lev4, extract html_segnames, set pointers +*** ↻ *LOOPs* _post main-loop loops_                                     :post: +**** 1. ↻ _Loop backmatter:_ loop up to lev4, extract html_segnames, set pointers -this extra loop is needed to determine pre and (in particular) next segment for -html, that is then used in a subsequent loop +this extra loop is used/needed to determine pre and (in particular) next segment +for html, that is then used in a subsequent loop  NOTE there are issues attempting to do this on first pass as:    - backmatter is created out of sequence and @@ -1795,10 +1798,9 @@ NOTE there are issues attempting to do this on first pass as:    - it is quite neat to have all in one place as we have here    - could optimise a bit by -    - skipping second (and third) loop unless the html seg or epub output is -      selected +    - skipping this loop unless the html seg or epub output is selected -***** section: endnotes +***** ↻ Loop section: endnotes  #+name: abs_post  #+BEGIN_SRC d @@ -1815,7 +1817,7 @@ if (the_endnotes_section.length > 1) {  }  #+END_SRC -***** section: glossary +***** ↻ Loop section: glossary  #+name: abs_post  #+BEGIN_SRC d @@ -1832,7 +1834,7 @@ if (the_glossary_section.length > 1) {  }  #+END_SRC -***** section: bibliography +***** ↻ Loop section: bibliography  #+name: abs_post  #+BEGIN_SRC d @@ -1849,7 +1851,7 @@ if (the_bibliography_section.length > 1) {  }  #+END_SRC -***** section: book index +***** ↻ Loop section: book index  #+name: abs_post  #+BEGIN_SRC d @@ -1872,7 +1874,7 @@ if (the_bookindex_section["scroll"].length > 1) {  }  #+END_SRC -***** section: blurb +***** ↻ Loop section: blurb  #+name: abs_post  #+BEGIN_SRC d @@ -1889,7 +1891,7 @@ if (the_blurb_section.length > 1) {  }  #+END_SRC -**** 2. _loop all objects:_ encode _structural relationships_ (sections, segments, objects) +**** 2. ↻ _Loop all objects:_ encode _structural relationships_ (sections, segments, objects)  needed for DOM structure, segnames & subtoc, backmatter pointers & unique image  list @@ -1898,25 +1900,36 @@ if used minimally only for DOM structure, segnames, subtoc, could optimise by  - skipping second and third pass unless the output html seg or epub is being    made! -or could conveniently be used more extensively for ancestors as well (though -this can be extracted earlier) +- this loop could conveniently be used more extensively for ancestors as well +  (though this information can be extracted earlier)  Build here:  - DOM structure -- ancestors and decendants -  - ancestors could be determined earlier, but convenient to have here -  - descendants could be in the form of: headings contained under current -    heading, and/or; the range of objects under the current heading -- you could decide on a sequential object list, containing all objects (both -  substantive and non-substantive objects), in addition to ocn, which are for -  substantive/ citable objects within the document +  - ancestors & decendants +    - ancestors could be determined earlier, but convenient to have here +    - descendants could be in the form of: headings contained under current +      heading, and/or; the range of objects under the current heading +- numbering +  - already given +    - substantive object numbers +    - endnote +  - provide +    - glossary +    - bibliography +    - book index +    - blurb +    - other non-substantive objects (prefix & other stuff) +  - you could also decide on a sequential object list, containing all objects +    (both substantive and non-substantive objects), in addition to ocn, which +    are for substantive/ citable objects within the document  (as needed) up to document heading 1~, lev4 html: -during the third pass all previous and next segment names are known -next are not yet known for backmatter during the second pass +- during this (the third) pass all previous and next segment names are known +- next are not yet known for backmatter during the second pas -***** images +***** Methods +****** images: extract  #+name: abs_post  #+BEGIN_SRC d @@ -1931,7 +1944,47 @@ auto extract_images(S)(S content_block) {  string[] segnames_0_4;  #+END_SRC -***** section: head +****** images: dimensions + +#+name: abs_post +#+BEGIN_SRC d +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; +} +#+END_SRC + +***** ↻ Loop section: head  #+name: abs_post  #+BEGIN_SRC d @@ -1968,7 +2021,7 @@ foreach (ref obj; the_document_head_section) {  }  #+END_SRC -***** section: toc +***** ↻ Loop section: toc  #+name: abs_post  #+BEGIN_SRC d @@ -2029,7 +2082,7 @@ if (the_table_of_contents_section["scroll"].length > 1) {  }  #+END_SRC -***** section: document body +***** ↻ Loop section: document body  #+name: abs_post  #+BEGIN_SRC d @@ -2066,13 +2119,16 @@ if (the_document_body_section.length > 1) {        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);      }    }  }  auto images=uniq(_images.sort());  #+END_SRC -***** section: endnotes +***** ↻ Loop section: endnotes + +- endnotes have their own number, (also use in node) and they belong to calling object  #+name: abs_post  #+BEGIN_SRC d @@ -2118,7 +2174,9 @@ if (the_endnotes_section.length > 1) {  }  #+END_SRC -***** section: glossary +***** ↻ Loop section: glossary + +- add glossary numbering, (also use in node) no need to show in text  #+name: abs_post  #+BEGIN_SRC d @@ -2164,7 +2222,9 @@ if (the_glossary_section.length > 1) {  }  #+END_SRC -***** section: bibliography +***** ↻ Loop section: bibliography + +- add bibliography numbering, (also use in node) no need to show in text  #+name: abs_post  #+BEGIN_SRC d @@ -2210,7 +2270,9 @@ if (the_bibliography_section.length > 1) {  }  #+END_SRC -***** section: book index (scroll, seg) +***** ↻ Loop section: book index (scroll, seg) + +- add book index numbering?, (also use in node) no need to show in text  #+name: abs_post  #+BEGIN_SRC d @@ -2305,7 +2367,7 @@ if (the_bookindex_section["scroll"].length > 1) {  }  #+END_SRC -***** section: blurb +***** ↻ Loop section: blurb  #+name: abs_post  #+BEGIN_SRC d @@ -2449,6 +2511,7 @@ if ((opt_action.html)    document_section_keys_sequenced["seg"]    ~= "tail";    document_section_keys_sequenced["scroll"] ~= "tail";  } +auto sequenced_document_keys = docSectKeysSeq!()(document_section_keys_sequenced);  #+END_SRC  *** dup @@ -2487,11 +2550,11 @@ dom_collapsed_buffer = [ 0, 0, 0, 0, 0, 0, 0, 0, 0,];  *** [#A] _return document tuple_                               :return:tuple: -#+name: abs_post +#+name: abs_return_tuple  #+BEGIN_SRC d  auto t = tuple(    document_the, -  docSectKeysSeq!()(document_section_keys_sequenced), +  sequenced_document_keys,    segnames,    segnames_0_4,    images, @@ -4940,6 +5003,7 @@ static struct ObjInlineMarkupMunge {    body {      obj_txt_out = "";      bool urls = false; +    bool images_without_dimensions = false;      tail = "";      /+ special endnotes +/      obj_txt_in = obj_txt_in.replaceAll( @@ -4954,6 +5018,9 @@ static struct ObjInlineMarkupMunge {      /+ 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)) { @@ -4979,6 +5046,7 @@ static struct ObjInlineMarkupMunge {        ftn[2],        ftn[3],        urls, +      images_without_dimensions,      );      return t;    } @@ -5249,9 +5317,10 @@ static struct ObjInlineMarkup {      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 = ""; @@ -5300,6 +5369,7 @@ static struct ObjInlineMarkup {        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( @@ -5308,6 +5378,7 @@ static struct ObjInlineMarkup {        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; @@ -7311,50 +7382,51 @@ struct HeadingAttrib {  #+BEGIN_SRC d  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;  }  #+END_SRC diff --git a/org/output_sqlite.org b/org/output_sqlite.org index fe76db4..c7b6571 100644 --- a/org/output_sqlite.org +++ b/org/output_sqlite.org @@ -1016,16 +1016,13 @@ foreach (part; doc_matters.xml.keys_seq.sql) {        }        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; @@ -1086,7 +1083,7 @@ return _insert_doc_objects.join.to!(char[]).toUTF8;  #+END_SRC  ** 5. SQL statements -*** drop tables +*** drop index and tables  **** DROP INDEX IF EXISTS  #+name: sqlite_statement_drop_existing_index @@ -1118,7 +1115,7 @@ DROP TABLE IF EXISTS doc_objects;  DROP TABLE IF EXISTS urls;  #+END_SRC -*** create tables +*** create tables and index  **** CREATE TABLE metadata_and_text  #+name: sqlite_statement_create_table_metadata_and_src_txt @@ -1223,24 +1220,9 @@ CREATE TABLE doc_objects (    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, @@ -1259,13 +1241,6 @@ CREATE INDEX idx_ocn ON doc_objects(ocn);  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/org/output_xmls.org b/org/output_xmls.org index ec2e5d8..7b86093 100644 --- a/org/output_xmls.org +++ b/org/output_xmls.org @@ -172,8 +172,8 @@ string _xhtml_anchor_tags(const(string[]) anchor_tags) {  #+name: xhtml_format_objects  #+BEGIN_SRC d -auto header_metadata(Dm)( -  Dm doc_matters, +auto header_metadata(M)( +  M  doc_matters,  ) {    string _title="Title";    string _author="Author"; @@ -227,8 +227,8 @@ auto header_metadata(Dm)(  #+name: xhtml_format_objects  #+BEGIN_SRC d -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) { @@ -257,8 +257,8 @@ auto site_info_button(Dm)(  #+name: xhtml_format_objects  #+BEGIN_SRC d -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"; @@ -287,8 +287,8 @@ auto inline_search_form(Dm)(  #+name: xhtml_format_objects  #+BEGIN_SRC d -auto html_head(Dm)( -  Dm doc_matters, +auto html_head(M)( +  M  doc_matters,    string type,  ) {    string o; @@ -340,8 +340,8 @@ auto html_head(Dm)(  #+name: xhtml_format_objects  #+BEGIN_SRC d -auto epub3_seg_head(Dm)( -  Dm doc_matters, +auto epub3_seg_head(M)( +  M  doc_matters,  ) {    string html_base = format(q"¶<!DOCTYPE html>  <html>¶", @@ -435,8 +435,7 @@ auto inline_images(O)(      _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<img src=\""            ~ _img_pth @@ -1535,9 +1534,9 @@ void scroll_write_output(M,C)(  #+name: output_html_seg  #+BEGIN_SRC d -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/org/output_xmls_css.org b/org/output_xmls_css.org index 82e5083..31041c7 100644 --- a/org/output_xmls_css.org +++ b/org/output_xmls_css.org @@ -252,6 +252,11 @@ template SiSUcss() {    }  #+END_SRC +#+name: css_shared +#+BEGIN_SRC css +  img { max-width: 100%; height: auto; } +#+END_SRC +  ***** paragraph general  #+name: css_shared diff --git a/org/sdp.org b/org/sdp.org index 0f75c66..442fa7d 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -26,7 +26,7 @@ struct Version {    int minor;    int patch;  } -enum ver = Version(0, 26, 1); +enum ver = Version(0, 26, 2);  #+END_SRC  ** compilation restrictions (supported compilers) @@ -792,6 +792,7 @@ auto da = SiSUdocAbstraction!()(    _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.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<pre>(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*))(?P<image>\S+\.(?:png|gif|jpg))\s+(?P<width>\d+)x(?P<height>\d+)\s*(?P<post>(?:.+?)\s*\}(?:image|(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?:[;:!,?.]?(?:[ )\]]|$)))`, "mg");      static smid_image                                      = ctRegex!(`(?P<pre>(?:^|[ ]|[^\S]?)\{(?:~\^\s+|\s*))(?P<image>\S+\.(?:png|gif|jpg))\s*(?P<post>(?:.+?)\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<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                                    = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>.+?)├`, "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<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                                    = ctRegex!(`┥(?P<text>.+?)┝┤(?P<link>.+?)├`, "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"¶<!DOCTYPE html>      <html>¶", @@ -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<img src=\""                ~ _img_pth diff --git a/src/sdp/output/xmls_css.d b/src/sdp/output/xmls_css.d index 37d6cec..dc8d274 100644 --- a/src/sdp/output/xmls_css.d +++ b/src/sdp/output/xmls_css.d @@ -172,6 +172,7 @@ template SiSUcss() {      margin-top: 0.8em;      margin-bottom: 0.8em;    } +  img { max-width: 100%; height: auto; }    /* spaced */    p.spaced { white-space: pre; }    p.block { @@ -1193,6 +1194,7 @@ template SiSUcss() {      margin-top: 0.8em;      margin-bottom: 0.8em;    } +  img { max-width: 100%; height: auto; }    /* spaced */    p.spaced { white-space: pre; }    p.block { @@ -2159,6 +2161,7 @@ template SiSUcss() {      margin-top: 0.8em;      margin-bottom: 0.8em;    } +  img { max-width: 100%; height: auto; }    /* spaced */    p.spaced { white-space: pre; }    p.block { diff --git a/views/version.txt b/views/version.txt index e143575..1c0b9d5 100644 --- a/views/version.txt +++ b/views/version.txt @@ -4,7 +4,7 @@ struct Version {    int minor;    int patch;  } -enum ver = Version(0, 26, 1); +enum ver = Version(0, 26, 2);  version (Posix) {    version (DigitalMars) {    } else version (LDC) { | 
