diff options
-rw-r--r-- | org/default_misc.org | 6 | ||||
-rw-r--r-- | org/default_paths.org | 66 | ||||
-rw-r--r-- | org/default_regex.org | 11 | ||||
-rw-r--r-- | org/meta_conf_make_meta.org | 2 | ||||
-rw-r--r-- | org/output_sqlite.org | 52 | ||||
-rw-r--r-- | org/output_sqlite_discrete.org | 182 | ||||
-rw-r--r-- | org/output_xmls.org | 2 | ||||
-rw-r--r-- | org/sdp.org | 8 | ||||
-rw-r--r-- | src/sdp/meta/conf_make_meta_json.d | 2 | ||||
-rw-r--r-- | src/sdp/meta/rgx.d | 5 | ||||
-rw-r--r-- | src/sdp/output/paths_output.d | 38 | ||||
-rw-r--r-- | src/sdp/output/paths_source.d | 14 | ||||
-rw-r--r-- | src/sdp/output/rgx.d | 3 | ||||
-rw-r--r-- | src/sdp/output/sqlite.d | 52 | ||||
-rw-r--r-- | src/sdp/output/sqlite_discrete.d | 166 | ||||
-rw-r--r-- | src/sdp/output/xmls.d | 2 | ||||
-rwxr-xr-x | src/sdp/sdp.d | 6 | ||||
-rw-r--r-- | views/version.txt | 2 |
18 files changed, 317 insertions, 302 deletions
diff --git a/org/default_misc.org b/org/default_misc.org index a2a6a72..d021565 100644 --- a/org/default_misc.org +++ b/org/default_misc.org @@ -211,6 +211,12 @@ import ** defaults shared by meta & output (generic) *** template: internal markup :markup: +21 special characters used: + +#+BEGIN_SRC text +【】〖〗┥┝┤├¤░┘┙┚┼┿╂┊┏┚┆■ +#+END_SRC + #+name: defaults_template_markup #+BEGIN_SRC d template InternalMarkup() { diff --git a/org/default_paths.org b/org/default_paths.org index ff14d50..cc78c46 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -46,7 +46,7 @@ template PodManifest() { mixin SiSUrgxInit; static auto rgx = Rgx(); auto PodManifest(P)( - P _pth = "", + P _pth ) { struct ManifestFile_ { auto pod_manifest_filename() { @@ -68,8 +68,8 @@ template PodManifest() { _manifest_path = m.captures["podpath"]; } } else { - writeln("WARNING, issue with manifest_path: ", _pth); - _manifest_path = _pth; // _manifest_path = null; + writeln("WARNING, issue with manifest_path: ", _pth); // remove? + _manifest_path = null; // _manifest_path = ""; } return _manifest_path; } @@ -118,7 +118,7 @@ template PathMatters() { auto PathMatters(O,E,P,F)( O _opt_actions, E _env, - P _pth = "", + P _pth, F _fns = "", char[][] _manifest_fn_list = [[]], ) { @@ -168,6 +168,9 @@ template PathMatters() { auto manifest_path() { return _manifest.pod_manifest_path; } + auto pod_name() { // TODO decide what returned if src_is_pod == false + return _manifest.pod_manifest_path.baseName; + } auto manifest_file_with_path() { return _manifest.pod_manifest_file_with_path; } @@ -243,7 +246,8 @@ template PathMatters() { assert(_dir == m.captures["dir"]); } else { _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array; - assert(_dir == absolute_path_to_src.match(rgx.src_base_parent_dir_name).captures["dir"]); + assert(_dir == absolute_path_to_src + .match(rgx.src_base_parent_dir_name).captures["dir"]); } if ((_opt_actions.debug_do)) { writeln("--> (base_dir) ", _dir); @@ -843,6 +847,14 @@ import sdp.meta.rgx; #+END_SRC ** shared out path, base directory :out: +- output paths for content, minimize chance of filename/directory collisions + in particular pods can contain markup that is published under a name that may + be used elsewere + - if the pod directory has a different name from the file append the pod + directory name to the output file name: pod_directory.markup_filename e.g. + sisu-manual.sisu_markup + - if pod and file have same name, keep name (makes no sense to repeat pod + name) NO sisu_markup.sisu_markup should be sisu_markup #+name: template_paths_out #+BEGIN_SRC d @@ -870,6 +882,50 @@ template SiSUoutPaths() { } #+END_SRC +** set + +#+name: template_paths_out +#+BEGIN_SRC d +template SiSUoutPathsFnPd() { + /+ TODO stuff to work out here +/ + auto SiSUoutPathsFnPd(Fn,Pn)( + Fn fn_src_pth, + Pn pod_name + // Pn pod_name = "", + ) { + struct _PathsStruct { + string base_filename() { + return fn_src_pth.baseName.stripExtension; + } + string base_pod_and_filename() { // TODO + /+ + - if pod, + - pod_name + - file_name + - if pod_name == file_name + - file_name + - else if pod_name != file_name + - pod_name.file_name + +/ + auto _fn_src = fn_src_pth.baseName.stripExtension; + string _output_base_name; + if (!(pod_name.empty)) { + if (pod_name == _fn_src) { + _output_base_name = _fn_src; + } else { + _output_base_name = pod_name ~ "." ~ _fn_src; + } + } else { + _output_base_name = _fn_src; + } + return _output_base_name; + } + } + return _PathsStruct(); + } +} +#+END_SRC + ** _html_ :html: #+name: template_paths_html diff --git a/org/default_regex.org b/org/default_regex.org index 9dbab82..c848109 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -22,6 +22,12 @@ http://dlang.org/phobos/std_regex.html - Regex!char (wchar/dchar) that contains a pattern in the form of compiled bytecode. - StaticRegex!char (wchar/dchar) that contains a pattern in the form of compiled native machine code. +21 special characters used: + +#+BEGIN_SRC text +【】〖〗┥┝┤├¤░┘┙┚┼┿╂┊┏┚┆■ +#+END_SRC + ** 0. module template #+name: tangle_meta_rgx @@ -251,7 +257,7 @@ static note_ref = ctRegex!(`^\S+?noteref_( #+BEGIN_SRC d static inline_url_generic = ctRegex!(`(?:^|[}(\[ ])(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_#]`, "mg"); static inline_url = ctRegex!(`((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_]\S*)`, "mg"); -static inline_link_naked_url = ctRegex!(`(?P<before>^|[ ])(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?P<after>[.,;:?!'"]?(?:[ ]|$))`, "mg"); +static inline_link_naked_url = ctRegex!(`(?P<before>^|[ ])(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤)\S+?)(?P<after>[.,;:?!'"]?(?:[ ]|$))`, "mg"); static inline_link_markup_regular = ctRegex!(`(?P<before>^|[ ])\{\s*(?P<content>.+?)\s*\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?P<after>(?:[,;:? ]|[!.]?(?:[ ]|$)))`, "mg"); static inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(?P<content>.+?)\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?P<after>[.,;:?!]?(?:[ ]|$))`, "mg"); static inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(?P<content>.+?)\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+)`, "mg"); @@ -407,6 +413,7 @@ static nbsp_char = ctRegex!(`░`, "mg"); static nbsp_chars_line_start = ctRegex!(`^░+`, "mg"); static nbsp_and_space = ctRegex!(` [ ]`, "mg"); static nbsp_char_and_space = ctRegex!(`░[ ]`, "mg"); +static special_markup_chars = ctRegex!(`[【】〖〗┥┝┤├¤░┘┙┚┼┿╂┊┏┚┆■]`, "mg"); #+END_SRC ** filename (& path) (including insert file) :insert:file:path:filename: @@ -486,6 +493,8 @@ static fn_suffix = ctRegex!(`\.fnSuffix`, " static inline_link_fn_suffix = ctRegex!(`¤(.+?)(\.fnSuffix)`, "mg"); static inline_seg_link = ctRegex!(`(¤)(?:.+?)\.fnSuffix`, "mg"); static mark_internal_site_lnk = ctRegex!(`¤`, "mg"); +static quotation_mark_sql_insert_delimiter = ctRegex!("[']", "mg"); +static quotation_mark_various = ctRegex!(q"¶['‘’“”"`´¨]¶", "mg"); #+END_SRC *** inline markup font face mod :inline:font:face: diff --git a/org/meta_conf_make_meta.org b/org/meta_conf_make_meta.org index fba8663..9438d25 100644 --- a/org/meta_conf_make_meta.org +++ b/org/meta_conf_make_meta.org @@ -501,7 +501,7 @@ if ("make" in _json.object) { if ("footer" in _json.object["make"] && (_json.object["make"]["footer"].type().to!string == "STRING") ) { - char[][] __match_footer_array + char[][] __match_footer_array = (cast(char[]) _json.object["make"]["footer"].str) .split(_rgx.make_heading_delimiter); _struct_composite.make_str.footer = __match_footer_array.to!(string[]); diff --git a/org/output_sqlite.org b/org/output_sqlite.org index 82b4310..0e7f125 100644 --- a/org/output_sqlite.org +++ b/org/output_sqlite.org @@ -158,7 +158,7 @@ auto munge_html(O)( auto return ref const O obj, ) { string _html_special_characters(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -168,17 +168,17 @@ auto munge_html(O)( return _txt; } string _html_font_face(string _txt){ - _txt = (_txt) - .replaceAll(rgx.inline_emphasis, ("<em>$1</em>")) - .replaceAll(rgx.inline_bold, ("<b>$1</b>")) - .replaceAll(rgx.inline_underscore, ("<u>$1</u>")) - .replaceAll(rgx.inline_italics, ("<i>$1</i>")) - .replaceAll(rgx.inline_superscript, ("<sup>$1</sup>")) - .replaceAll(rgx.inline_subscript, ("<sub>$1</sub>")) - .replaceAll(rgx.inline_strike, ("<del>$1</del>")) - .replaceAll(rgx.inline_insert, ("<ins>$1</ins>")) - .replaceAll(rgx.inline_mono, ("<tt>$1</tt>")) - .replaceAll(rgx.inline_cite, ("<cite>$1</cite>")); + _txt = _txt + .replaceAll(rgx.inline_emphasis, "<em>$1</em>") + .replaceAll(rgx.inline_bold, "<b>$1</b>") + .replaceAll(rgx.inline_underscore, "<u>$1</u>") + .replaceAll(rgx.inline_italics, "<i>$1</i>") + .replaceAll(rgx.inline_superscript, "<sup>$1</sup>") + .replaceAll(rgx.inline_subscript, "<sub>$1</sub>") + .replaceAll(rgx.inline_strike, "<del>$1</del>") + .replaceAll(rgx.inline_insert, "<ins>$1</ins>") + .replaceAll(rgx.inline_mono, "<tt>$1</tt>") + .replaceAll(rgx.inline_cite, "<cite>$1</cite>"); return _txt; } string _notes; @@ -210,7 +210,7 @@ auto munge_html(O)( #+name: sanitize_and_munge_inline_html #+BEGIN_SRC d string html_special_characters(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -226,7 +226,7 @@ string html_special_characters(string _txt){ #+name: sanitize_and_munge_inline_html #+BEGIN_SRC d string html_special_characters_code(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -241,17 +241,17 @@ string html_special_characters_code(string _txt){ #+name: sanitize_and_munge_inline_html #+BEGIN_SRC d string html_font_face(string _txt){ - _txt = (_txt) - .replaceAll(rgx.inline_emphasis, ("<em>$1</em>")) - .replaceAll(rgx.inline_bold, ("<b>$1</b>")) - .replaceAll(rgx.inline_underscore, ("<u>$1</u>")) - .replaceAll(rgx.inline_italics, ("<i>$1</i>")) - .replaceAll(rgx.inline_superscript, ("<sup>$1</sup>")) - .replaceAll(rgx.inline_subscript, ("<sub>$1</sub>")) - .replaceAll(rgx.inline_strike, ("<del>$1</del>")) - .replaceAll(rgx.inline_insert, ("<ins>$1</ins>")) - .replaceAll(rgx.inline_mono, ("<tt>$1</tt>")) - .replaceAll(rgx.inline_cite, ("<cite>$1</cite>")); + _txt = _txt + .replaceAll(rgx.inline_emphasis, "<em>$1</em>") + .replaceAll(rgx.inline_bold, "<b>$1</b>") + .replaceAll(rgx.inline_underscore, "<u>$1</u>") + .replaceAll(rgx.inline_italics, "<i>$1</i>") + .replaceAll(rgx.inline_superscript, "<sup>$1</sup>") + .replaceAll(rgx.inline_subscript, "<sub>$1</sub>") + .replaceAll(rgx.inline_strike, "<del>$1</del>") + .replaceAll(rgx.inline_insert, "<ins>$1</ins>") + .replaceAll(rgx.inline_mono, "<tt>$1</tt>") + .replaceAll(rgx.inline_cite, "<cite>$1</cite>"); return _txt; } #+END_SRC @@ -413,7 +413,7 @@ auto html_table(O)( auto return ref const O obj, string _txt, ) { - string[] _table_rows = (_txt).split(rgx.table_delimiter_row); + string[] _table_rows = _txt.split(rgx.table_delimiter_row); string[] _table_cols; string _table; string _tablenote; diff --git a/org/output_sqlite_discrete.org b/org/output_sqlite_discrete.org index c659441..fced21d 100644 --- a/org/output_sqlite_discrete.org +++ b/org/output_sqlite_discrete.org @@ -45,7 +45,8 @@ template SQLiteDiscreteBuildTablesAndPopulate() { } } template SQLiteInstruct() { - Statement SQLiteInstruct(I)( + void SQLiteInstruct(Db,I)( + Db db, auto ref I doc_matters, ) { <<sqlite_db_initialize>> @@ -56,13 +57,13 @@ template SQLiteDiscreteBuildTablesAndPopulate() { <<sqlite_close_initialize>> <<sqlite_insert_metadata_and_src_text>> //<<sqlite_insert_urls>> - <<sqlite_insert_doc_objects>> } } template SQLiteObjectsLoop() { void SQLiteObjectsLoop(P)( auto ref P doc_parts, ) { + <<sqlite_insert_doc_objects>> <<sqlite_objects_loop>> } } @@ -112,7 +113,6 @@ auto generic_munge_sanitize_text_for_search( ) { string _notes; string _urls; - _txt = _txt.replaceAll(rgx.inline_fontface_clean, ""); if (_txt.matchFirst(rgx.inline_notes_al_gen)) { foreach (m; _txt.matchAll(rgx.inline_notes_al_gen_text)) { _notes ~= "\n" ~ m["text"]; @@ -210,7 +210,7 @@ auto munge_html(O)( #+name: sanitize_and_munge_inline_html #+BEGIN_SRC d string html_special_characters(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -226,7 +226,7 @@ string html_special_characters(string _txt){ #+name: sanitize_and_munge_inline_html #+BEGIN_SRC d string html_special_characters_code(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -241,7 +241,7 @@ string html_special_characters_code(string _txt){ #+name: sanitize_and_munge_inline_html #+BEGIN_SRC d string html_font_face(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.inline_emphasis, "<em>$1</em>") .replaceAll(rgx.inline_bold, "<b>$1</b>") .replaceAll(rgx.inline_underscore, "<u>$1</u>") @@ -474,10 +474,6 @@ auto html_table(O)( #+name: sqlite_db_initialize #+BEGIN_SRC d -auto pth_sqlite = SiSUpathsSQLiteDiscrete!()(doc_matters.output_path, doc_matters.src.language); -pth_sqlite.base.mkdirRecurse; -auto db = Database(pth_sqlite.sqlite_file(doc_matters.src.filename)); -// auto db = Database(":memory:"); // open database in memory db.run(" #+END_SRC @@ -896,7 +892,6 @@ insert_metadata.bind(":rights_license", doc_matters.conf_make // insert_metadata.bind(":links", doc_matters.conf_make_meta.meta.links); insert_metadata.execute(); insert_metadata.reset(); /+ watch +/ -writeln(" ", pth_sqlite.sqlite_file(doc_matters.src.filename)); if ((doc_matters.opt.action.verbose)) { writeln("sql statement executed"); } @@ -920,15 +915,22 @@ insert_metadata.inject( #+END_SRC ****** 2. _doc objects_ (used with doc_objects in document loop) -******* prepare sql statement +******* prepare sql statement, sql utf8 ******** d { sql statement #+name: sqlite_insert_doc_objects #+BEGIN_SRC d -Statement _insert_doc_objects = db.prepare(" +string insertDocObjectsRow(O)(O obj) { + auto sql_insert_delimiter(string _txt) { + _txt = _txt + .replaceAll(rgx.quotation_mark_sql_insert_delimiter, "$0$0"); + return _txt; + } + string _insert_doc_objects_row; + _insert_doc_objects_row = format(q"¶ #+END_SRC -********* sql insert into +********* sql statement: formatted lid unique, increment by 1 per object, not ocn @@ -937,90 +939,54 @@ either: - increment by adding 1 for each document, - make hash of document filename or url and use? +********** INSERT INTO + #+name: sqlite_insert_doc_objects #+BEGIN_SRC sql - INSERT INTO doc_objects ( - lid, - metadata_tid, - ocn, - ocnd, - ocns, - clean, - body, - book_idx, - seg, - lev_an, - lev, - lev0, - lev1, - lev2, - lev3, - lev4, - lev5, - lev6, - lev7, - en_a, - en_z, - en_a_asterisk, - en_z_asterisk, - en_a_plus, - en_z_plus, - t_of, - t_is, - node, - parent, - digest_clean, - digest_all, - types - ) + INSERT INTO doc_objects ( + ocn, + clean, + body, + lev, + t_of, + t_is + ) #+END_SRC -********* sql values +********** VALUES #+name: sqlite_insert_doc_objects #+BEGIN_SRC sql - VALUES ( - :lid, - :metadata_tid, - :ocn, - :ocnd, - :ocns, - :clean, - :body, - :book_idx, - :seg, - :lev_an, - :lev, - :lev0, - :lev1, - :lev2, - :lev3, - :lev4, - :lev5, - :lev6, - :lev7, - :en_a, - :en_z, - :en_a_asterisk, - :en_z_asterisk, - :en_a_plus, - :en_z_plus, - :t_of, - :t_is, - :node, - :parent, - :digest_clean, - :digest_all, - :types - ) + VALUES ( + %s, + '%s', + '%s', + %s, + '%s', + '%s' + ); +#+END_SRC + +********* sql statement: values for formatting + +#+name: sqlite_insert_doc_objects +#+BEGIN_SRC sql + ¶", + obj.ocn, + sql_insert_delimiter(obj_txt["text"]), + sql_insert_delimiter(obj_txt["html"]), + obj.heading_lev_markup, + obj.is_of, + obj.is_a, + ); #+END_SRC ******** d } #+name: sqlite_insert_doc_objects #+BEGIN_SRC d -"); -return _insert_doc_objects; + return _insert_doc_objects_row; +} #+END_SRC ******* TODO (within loop not here - insert doc objects @@ -1273,10 +1239,15 @@ auto table(O)( #+name: sqlite_objects_loop #+BEGIN_SRC d -Statement insert_doc_objects = SQLiteInstruct!()(doc_matters); +auto pth_sqlite = SiSUpathsSQLiteDiscrete!()(doc_matters.output_path, doc_matters.src.language); +pth_sqlite.base.mkdirRecurse; +auto db = Database(pth_sqlite.sqlite_file(doc_matters.src.filename)); +SQLiteInstruct!()(db, doc_matters); // consider best location, need to feed individual objects for sqlite table: doc_objects, possibly a separate template? auto format_and_sqlite_load = SQLiteFormatAndLoadObject!()(doc_matters); string[string] obj_txt; string doc_text; +string[] _insert_doc_objects; +_insert_doc_objects ~= "BEGIN;\n"; foreach (part; doc_parts) { foreach (obj; doc_abstraction[part]) { switch (obj.of_part) { @@ -1421,36 +1392,17 @@ foreach (part; doc_parts) { ); } } - insert_doc_objects.bind(":t_of", obj.is_of); - insert_doc_objects.bind(":t_is", obj.is_a); - insert_doc_objects.bind(":ocn", obj.ocn); - insert_doc_objects.bind(":clean", obj_txt["text"]); // consider whether book index info should be made available within clear text for search - insert_doc_objects.bind(":body", obj_txt["html"]); - // insert_doc_objects.bind(":book_idx", ""); // not needed, but, consider whether should be made available within object for clear text search - insert_doc_objects.bind(":lev", obj.heading_lev_markup); - // // insert_doc_objects.bind(":dom_markedup", ""); // should make lev sequence below obsolete - // // insert_doc_objects.bind(":dom_collapsed", ""); // should add info - // insert_doc_objects.bind(":lev0", ""); - // insert_doc_objects.bind(":lev1", ""); - // insert_doc_objects.bind(":lev2", ""); - // insert_doc_objects.bind(":lev3", ""); - // insert_doc_objects.bind(":lev4", ""); - // insert_doc_objects.bind(":lev5", ""); - // insert_doc_objects.bind(":lev6", ""); - // insert_doc_objects.bind(":lev7", ""); - // insert_doc_objects.bind(":node", ""); - // insert_doc_objects.bind(":type", ""); - // insert_doc_objects.bind(":parent_ocn", ""); - // insert_doc_objects.bind(":ancestors", ""); - // insert_doc_objects.bind(":heading_lev_markup", ""); - // insert_doc_objects.bind(":heading_lev_collapsed", ""); - // insert_doc_objects.bind(":parent_lev_markup", ""); - // insert_doc_objects.bind(":heading_ancestors", ""); - // insert_doc_objects.bind(":node", ""); - insert_doc_objects.execute(); insert_doc_objects.reset(); - } + if (!(obj.is_a == "comment")) { + _insert_doc_objects ~= insertDocObjectsRow(obj); + } + } // loop closes +} +_insert_doc_objects ~= "COMMIT"; +debug(sql_statement) { + writeln("#+BEGIN_SRC sql\n", _insert_doc_objects.join, "\n#+END_SRC"); } -insert_doc_objects.finalize(); +std.utf.validate(_insert_doc_objects.join); // TODO +db.run(_insert_doc_objects.join.to!(char[]).toUTF8); #+END_SRC * __END__ diff --git a/org/output_xmls.org b/org/output_xmls.org index 0c79bf9..5855d65 100644 --- a/org/output_xmls.org +++ b/org/output_xmls.org @@ -241,7 +241,7 @@ auto site_info_button(Dm)( .replaceAll( rgx.br_nl, ""); } else { - writeln("WARNING home button text expected"); + _locations = "<p class=\"tiny_left\"><a href=\"http://www.sisudoc.org\">SiSU</a></p>\n<p class=\"tiny_left\"><a href=\"http://www.sisudoc.org\">www.sisudoc.org</a></p>\n<p class=\"tiny_left\"><a href=\"http://git.sisudoc.org/gitweb/\">sources / git</a></p>"; } string o; o = format(q"¶<div class="flex-menu-option"> diff --git a/org/sdp.org b/org/sdp.org index 202bf9b..4057d96 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -26,7 +26,7 @@ struct Version { int minor; int patch; } -enum ver = Version(0, 25, 0); +enum ver = Version(0, 26, 0); #+END_SRC ** compilation restrictions (supported compilers) @@ -449,8 +449,8 @@ auto _env = [ "pwd" : environment["PWD"], "home" : environment["HOME"], ]; -auto _manifest_start = PodManifest!()(); -auto _manifest_matter = PathMatters!()(_opt_action, _env); +auto _manifest_start = PodManifest!()(""); +auto _manifest_matter = PathMatters!()(_opt_action, _env, ""); auto _manifests = [ _manifest_matter ]; foreach(arg; args[1..$]) { _manifest_start = PodManifest!()(arg); @@ -504,7 +504,7 @@ foreach(arg; args[1..$]) { if (_opt_action.languages_set[0] == "all" || (contents_location_pth_).match(lang_rgx_) ) { - auto _fns = (((tmp_dir_).chainPath(contents_location_pth_)).array).to!(string); + auto _fns = (((tmp_dir_).chainPath(contents_location_pth_)).array).to!string; _manifest_matter = PathMatters!()(_opt_action, _env, arg, _fns, contents_locations_arr); _manifests ~= _manifest_matter; // TODO how to capture? } diff --git a/src/sdp/meta/conf_make_meta_json.d b/src/sdp/meta/conf_make_meta_json.d index d88dda2..a496f07 100644 --- a/src/sdp/meta/conf_make_meta_json.d +++ b/src/sdp/meta/conf_make_meta_json.d @@ -66,7 +66,7 @@ static template contentJSONtoSiSUstruct() { if ("footer" in _json.object["make"] && (_json.object["make"]["footer"].type().to!string == "STRING") ) { - char[][] __match_footer_array + char[][] __match_footer_array = (cast(char[]) _json.object["make"]["footer"].str) .split(_rgx.make_heading_delimiter); _struct_composite.make_str.footer = __match_footer_array.to!(string[]); diff --git a/src/sdp/meta/rgx.d b/src/sdp/meta/rgx.d index 1595263..0f60847 100644 --- a/src/sdp/meta/rgx.d +++ b/src/sdp/meta/rgx.d @@ -145,7 +145,7 @@ static template SiSUrgxInit() { static note_ref = ctRegex!(`^\S+?noteref_([0-9]+)`, "mg"); // {^{73.}^}#noteref_73 static inline_url_generic = ctRegex!(`(?:^|[}(\[ ])(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_#]`, "mg"); static inline_url = ctRegex!(`((?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)[a-zA-Z0-9_]\S*)`, "mg"); - static inline_link_naked_url = ctRegex!(`(?P<before>^|[ ])(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?P<after>[.,;:?!'"]?(?:[ ]|$))`, "mg"); + static inline_link_naked_url = ctRegex!(`(?P<before>^|[ ])(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤)\S+?)(?P<after>[.,;:?!'"]?(?:[ ]|$))`, "mg"); static inline_link_markup_regular = ctRegex!(`(?P<before>^|[ ])\{\s*(?P<content>.+?)\s*\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?P<after>(?:[,;:? ]|[!.]?(?:[ ]|$)))`, "mg"); static inline_link_endnote_url_helper_punctuated = ctRegex!(`\{~\^\s+(?P<content>.+?)\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+?)(?P<after>[.,;:?!]?(?:[ ]|$))`, "mg"); static inline_link_endnote_url_helper = ctRegex!(`\{~\^\s+(?P<content>.+?)\}(?P<link>(?:(?:https?|git):\/\/|¤?\.\.\/|¤?\.\/|¤|#)\S+)`, "mg"); @@ -198,6 +198,7 @@ static template SiSUrgxInit() { static nbsp_chars_line_start = ctRegex!(`^░+`, "mg"); static nbsp_and_space = ctRegex!(` [ ]`, "mg"); static nbsp_char_and_space = ctRegex!(`░[ ]`, "mg"); + static special_markup_chars = ctRegex!(`[【】〖〗┥┝┤├¤░┘┙┚┼┿╂┊┏┚┆■]`, "mg"); static src_pth_sst_or_ssm = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`); static src_pth_pod_sst_or_ssm = ctRegex!(`^(?P<podpath>[/]?(?:[a-zA-Z0-9._-]+/)*)media/text/[a-z]{2}/(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`); static src_pth_contents = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisupod[.]manifest$`); @@ -252,6 +253,8 @@ static template SiSUrgxInit() { static inline_link_fn_suffix = ctRegex!(`¤(.+?)(\.fnSuffix)`, "mg"); static inline_seg_link = ctRegex!(`(¤)(?:.+?)\.fnSuffix`, "mg"); static mark_internal_site_lnk = ctRegex!(`¤`, "mg"); + static quotation_mark_sql_insert_delimiter = ctRegex!("[']", "mg"); + static quotation_mark_various = ctRegex!(q"¶['‘’“”"`´¨]¶", "mg"); /+ inline markup font face mod +/ static inline_faces = ctRegex!(`(?P<markup>(?P<mod>[*!_^,+#-])\{(?P<text>.+?)\}[*!_^,+#-])`, "mg"); static inline_emphasis = ctRegex!(`\*\{(?P<text>.+?)\}\*`, "mg"); diff --git a/src/sdp/output/paths_output.d b/src/sdp/output/paths_output.d index 1db74d9..d58b990 100644 --- a/src/sdp/output/paths_output.d +++ b/src/sdp/output/paths_output.d @@ -29,6 +29,44 @@ template SiSUoutPaths() { return _PathsStruct(); } } +template SiSUoutPathsFnPd() { + /+ TODO stuff to work out here +/ + auto SiSUoutPathsFnPd(Fn,Pn)( + Fn fn_src_pth, + Pn pod_name + // Pn pod_name = "", + ) { + struct _PathsStruct { + string base_filename() { + return fn_src_pth.baseName.stripExtension; + } + string base_pod_and_filename() { // TODO + /+ + - if pod, + - pod_name + - file_name + - if pod_name == file_name + - file_name + - else if pod_name != file_name + - pod_name.file_name + +/ + auto _fn_src = fn_src_pth.baseName.stripExtension; + string _output_base_name; + if (!(pod_name.empty)) { + if (pod_name == _fn_src) { + _output_base_name = _fn_src; + } else { + _output_base_name = pod_name ~ "." ~ _fn_src; + } + } else { + _output_base_name = _fn_src; + } + return _output_base_name; + } + } + return _PathsStruct(); + } +} template SiSUpathsHTML() { mixin SiSUrgxInit; static auto rgx = Rgx(); diff --git a/src/sdp/output/paths_source.d b/src/sdp/output/paths_source.d index 59cb618..c420d7e 100644 --- a/src/sdp/output/paths_source.d +++ b/src/sdp/output/paths_source.d @@ -15,7 +15,7 @@ template PodManifest() { mixin SiSUrgxInit; static auto rgx = Rgx(); auto PodManifest(P)( - P _pth = "", + P _pth ) { struct ManifestFile_ { auto pod_manifest_filename() { @@ -37,8 +37,8 @@ template PodManifest() { _manifest_path = m.captures["podpath"]; } } else { - writeln("WARNING, issue with manifest_path: ", _pth); - _manifest_path = _pth; // _manifest_path = null; + writeln("WARNING, issue with manifest_path: ", _pth); // remove? + _manifest_path = null; // _manifest_path = ""; } return _manifest_path; } @@ -65,7 +65,7 @@ template PathMatters() { auto PathMatters(O,E,P,F)( O _opt_actions, E _env, - P _pth = "", + P _pth, F _fns = "", char[][] _manifest_fn_list = [[]], ) { @@ -115,6 +115,9 @@ template PathMatters() { auto manifest_path() { return _manifest.pod_manifest_path; } + auto pod_name() { // TODO decide what returned if src_is_pod == false + return _manifest.pod_manifest_path.baseName; + } auto manifest_file_with_path() { return _manifest.pod_manifest_file_with_path; } @@ -190,7 +193,8 @@ template PathMatters() { assert(_dir == m.captures["dir"]); } else { _dir = asNormalizedPath(path_and_fn.chainPath("../../../")).array; - assert(_dir == absolute_path_to_src.match(rgx.src_base_parent_dir_name).captures["dir"]); + assert(_dir == absolute_path_to_src + .match(rgx.src_base_parent_dir_name).captures["dir"]); } if ((_opt_actions.debug_do)) { writeln("--> (base_dir) ", _dir); diff --git a/src/sdp/output/rgx.d b/src/sdp/output/rgx.d index adadf9e..d559491 100644 --- a/src/sdp/output/rgx.d +++ b/src/sdp/output/rgx.d @@ -15,6 +15,7 @@ static template SiSUoutputRgxInit() { static nbsp_chars_line_start = ctRegex!(`^░+`, "mg"); static nbsp_and_space = ctRegex!(` [ ]`, "mg"); static nbsp_char_and_space = ctRegex!(`░[ ]`, "mg"); + static special_markup_chars = ctRegex!(`[【】〖〗┥┝┤├¤░┘┙┚┼┿╂┊┏┚┆■]`, "mg"); static src_pth_sst_or_ssm = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`); static src_pth_pod_sst_or_ssm = ctRegex!(`^(?P<podpath>[/]?(?:[a-zA-Z0-9._-]+/)*)media/text/[a-z]{2}/(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`); static src_pth_contents = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisupod[.]manifest$`); @@ -69,6 +70,8 @@ static template SiSUoutputRgxInit() { static inline_link_fn_suffix = ctRegex!(`¤(.+?)(\.fnSuffix)`, "mg"); static inline_seg_link = ctRegex!(`(¤)(?:.+?)\.fnSuffix`, "mg"); static mark_internal_site_lnk = ctRegex!(`¤`, "mg"); + static quotation_mark_sql_insert_delimiter = ctRegex!("[']", "mg"); + static quotation_mark_various = ctRegex!(q"¶['‘’“”"`´¨]¶", "mg"); /+ inline markup font face mod +/ static inline_faces = ctRegex!(`(?P<markup>(?P<mod>[*!_^,+#-])\{(?P<text>.+?)\}[*!_^,+#-])`, "mg"); static inline_emphasis = ctRegex!(`\*\{(?P<text>.+?)\}\*`, "mg"); diff --git a/src/sdp/output/sqlite.d b/src/sdp/output/sqlite.d index 25940cc..480c317 100644 --- a/src/sdp/output/sqlite.d +++ b/src/sdp/output/sqlite.d @@ -56,7 +56,7 @@ template SQLiteBuildTablesAndPopulate() { auto return ref const O obj, ) { string _html_special_characters(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -66,17 +66,17 @@ template SQLiteBuildTablesAndPopulate() { return _txt; } string _html_font_face(string _txt){ - _txt = (_txt) - .replaceAll(rgx.inline_emphasis, ("<em>$1</em>")) - .replaceAll(rgx.inline_bold, ("<b>$1</b>")) - .replaceAll(rgx.inline_underscore, ("<u>$1</u>")) - .replaceAll(rgx.inline_italics, ("<i>$1</i>")) - .replaceAll(rgx.inline_superscript, ("<sup>$1</sup>")) - .replaceAll(rgx.inline_subscript, ("<sub>$1</sub>")) - .replaceAll(rgx.inline_strike, ("<del>$1</del>")) - .replaceAll(rgx.inline_insert, ("<ins>$1</ins>")) - .replaceAll(rgx.inline_mono, ("<tt>$1</tt>")) - .replaceAll(rgx.inline_cite, ("<cite>$1</cite>")); + _txt = _txt + .replaceAll(rgx.inline_emphasis, "<em>$1</em>") + .replaceAll(rgx.inline_bold, "<b>$1</b>") + .replaceAll(rgx.inline_underscore, "<u>$1</u>") + .replaceAll(rgx.inline_italics, "<i>$1</i>") + .replaceAll(rgx.inline_superscript, "<sup>$1</sup>") + .replaceAll(rgx.inline_subscript, "<sub>$1</sub>") + .replaceAll(rgx.inline_strike, "<del>$1</del>") + .replaceAll(rgx.inline_insert, "<ins>$1</ins>") + .replaceAll(rgx.inline_mono, "<tt>$1</tt>") + .replaceAll(rgx.inline_cite, "<cite>$1</cite>"); return _txt; } string _notes; @@ -102,7 +102,7 @@ template SQLiteBuildTablesAndPopulate() { return _txt; } string html_special_characters(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -112,7 +112,7 @@ template SQLiteBuildTablesAndPopulate() { return _txt; } string html_special_characters_code(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -121,17 +121,17 @@ template SQLiteBuildTablesAndPopulate() { return _txt; } string html_font_face(string _txt){ - _txt = (_txt) - .replaceAll(rgx.inline_emphasis, ("<em>$1</em>")) - .replaceAll(rgx.inline_bold, ("<b>$1</b>")) - .replaceAll(rgx.inline_underscore, ("<u>$1</u>")) - .replaceAll(rgx.inline_italics, ("<i>$1</i>")) - .replaceAll(rgx.inline_superscript, ("<sup>$1</sup>")) - .replaceAll(rgx.inline_subscript, ("<sub>$1</sub>")) - .replaceAll(rgx.inline_strike, ("<del>$1</del>")) - .replaceAll(rgx.inline_insert, ("<ins>$1</ins>")) - .replaceAll(rgx.inline_mono, ("<tt>$1</tt>")) - .replaceAll(rgx.inline_cite, ("<cite>$1</cite>")); + _txt = _txt + .replaceAll(rgx.inline_emphasis, "<em>$1</em>") + .replaceAll(rgx.inline_bold, "<b>$1</b>") + .replaceAll(rgx.inline_underscore, "<u>$1</u>") + .replaceAll(rgx.inline_italics, "<i>$1</i>") + .replaceAll(rgx.inline_superscript, "<sup>$1</sup>") + .replaceAll(rgx.inline_subscript, "<sub>$1</sub>") + .replaceAll(rgx.inline_strike, "<del>$1</del>") + .replaceAll(rgx.inline_insert, "<ins>$1</ins>") + .replaceAll(rgx.inline_mono, "<tt>$1</tt>") + .replaceAll(rgx.inline_cite, "<cite>$1</cite>"); return _txt; } auto html_heading(O)( @@ -223,7 +223,7 @@ template SQLiteBuildTablesAndPopulate() { auto return ref const O obj, string _txt, ) { - string[] _table_rows = (_txt).split(rgx.table_delimiter_row); + string[] _table_rows = _txt.split(rgx.table_delimiter_row); string[] _table_cols; string _table; string _tablenote; diff --git a/src/sdp/output/sqlite_discrete.d b/src/sdp/output/sqlite_discrete.d index 541c4d8..443fb3b 100644 --- a/src/sdp/output/sqlite_discrete.d +++ b/src/sdp/output/sqlite_discrete.d @@ -23,7 +23,6 @@ template SQLiteDiscreteBuildTablesAndPopulate() { ) { string _notes; string _urls; - _txt = _txt.replaceAll(rgx.inline_fontface_clean, ""); if (_txt.matchFirst(rgx.inline_notes_al_gen)) { foreach (m; _txt.matchAll(rgx.inline_notes_al_gen_text)) { _notes ~= "\n" ~ m["text"]; @@ -102,7 +101,7 @@ template SQLiteDiscreteBuildTablesAndPopulate() { return _txt; } string html_special_characters(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -112,7 +111,7 @@ template SQLiteDiscreteBuildTablesAndPopulate() { return _txt; } string html_special_characters_code(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.xhtml_ampersand, "&") .replaceAll(rgx.xhtml_quotation, """) .replaceAll(rgx.xhtml_less_than, "<") @@ -121,7 +120,7 @@ template SQLiteDiscreteBuildTablesAndPopulate() { return _txt; } string html_font_face(string _txt){ - _txt = (_txt) + _txt = _txt .replaceAll(rgx.inline_emphasis, "<em>$1</em>") .replaceAll(rgx.inline_bold, "<b>$1</b>") .replaceAll(rgx.inline_underscore, "<u>$1</u>") @@ -461,13 +460,10 @@ template SQLiteDiscreteBuildTablesAndPopulate() { } } template SQLiteInstruct() { - Statement SQLiteInstruct(I)( + void SQLiteInstruct(Db,I)( + Db db, auto ref I doc_matters, ) { - auto pth_sqlite = SiSUpathsSQLiteDiscrete!()(doc_matters.output_path, doc_matters.src.language); - pth_sqlite.base.mkdirRecurse; - auto db = Database(pth_sqlite.sqlite_file(doc_matters.src.filename)); - // auto db = Database(":memory:"); // open database in memory db.run(" DROP TABLE IF EXISTS metadata_and_text; DROP TABLE IF EXISTS doc_objects; @@ -824,93 +820,60 @@ template SQLiteDiscreteBuildTablesAndPopulate() { // insert_metadata.bind(":links", doc_matters.conf_make_meta.meta.links); insert_metadata.execute(); insert_metadata.reset(); /+ watch +/ - writeln(" ", pth_sqlite.sqlite_file(doc_matters.src.filename)); if ((doc_matters.opt.action.verbose)) { writeln("sql statement executed"); } assert(db.totalChanges == 1); // - Statement _insert_doc_objects = db.prepare(" - INSERT INTO doc_objects ( - lid, - metadata_tid, - ocn, - ocnd, - ocns, - clean, - body, - book_idx, - seg, - lev_an, - lev, - lev0, - lev1, - lev2, - lev3, - lev4, - lev5, - lev6, - lev7, - en_a, - en_z, - en_a_asterisk, - en_z_asterisk, - en_a_plus, - en_z_plus, - t_of, - t_is, - node, - parent, - digest_clean, - digest_all, - types - ) - VALUES ( - :lid, - :metadata_tid, - :ocn, - :ocnd, - :ocns, - :clean, - :body, - :book_idx, - :seg, - :lev_an, - :lev, - :lev0, - :lev1, - :lev2, - :lev3, - :lev4, - :lev5, - :lev6, - :lev7, - :en_a, - :en_z, - :en_a_asterisk, - :en_z_asterisk, - :en_a_plus, - :en_z_plus, - :t_of, - :t_is, - :node, - :parent, - :digest_clean, - :digest_all, - :types - ) - "); - return _insert_doc_objects; } } template SQLiteObjectsLoop() { void SQLiteObjectsLoop(P)( auto ref P doc_parts, ) { - Statement insert_doc_objects = SQLiteInstruct!()(doc_matters); + string insertDocObjectsRow(O)(O obj) { + auto sql_insert_delimiter(string _txt) { + _txt = _txt + .replaceAll(rgx.quotation_mark_sql_insert_delimiter, "$0$0"); + return _txt; + } + string _insert_doc_objects_row; + _insert_doc_objects_row = format(q"¶ + INSERT INTO doc_objects ( + ocn, + clean, + body, + lev, + t_of, + t_is + ) + VALUES ( + %s, + '%s', + '%s', + %s, + '%s', + '%s' + ); + ¶", + obj.ocn, + sql_insert_delimiter(obj_txt["text"]), + sql_insert_delimiter(obj_txt["html"]), + obj.heading_lev_markup, + obj.is_of, + obj.is_a, + ); + return _insert_doc_objects_row; + } + auto pth_sqlite = SiSUpathsSQLiteDiscrete!()(doc_matters.output_path, doc_matters.src.language); + pth_sqlite.base.mkdirRecurse; + auto db = Database(pth_sqlite.sqlite_file(doc_matters.src.filename)); + SQLiteInstruct!()(db, doc_matters); // consider best location, need to feed individual objects for sqlite table: doc_objects, possibly a separate template? auto format_and_sqlite_load = SQLiteFormatAndLoadObject!()(doc_matters); string[string] obj_txt; string doc_text; + string[] _insert_doc_objects; + _insert_doc_objects ~= "BEGIN;\n"; foreach (part; doc_parts) { foreach (obj; doc_abstraction[part]) { switch (obj.of_part) { @@ -1055,36 +1018,17 @@ template SQLiteDiscreteBuildTablesAndPopulate() { ); } } - insert_doc_objects.bind(":t_of", obj.is_of); - insert_doc_objects.bind(":t_is", obj.is_a); - insert_doc_objects.bind(":ocn", obj.ocn); - insert_doc_objects.bind(":clean", obj_txt["text"]); // consider whether book index info should be made available within clear text for search - insert_doc_objects.bind(":body", obj_txt["html"]); - // insert_doc_objects.bind(":book_idx", ""); // not needed, but, consider whether should be made available within object for clear text search - insert_doc_objects.bind(":lev", obj.heading_lev_markup); - // // insert_doc_objects.bind(":dom_markedup", ""); // should make lev sequence below obsolete - // // insert_doc_objects.bind(":dom_collapsed", ""); // should add info - // insert_doc_objects.bind(":lev0", ""); - // insert_doc_objects.bind(":lev1", ""); - // insert_doc_objects.bind(":lev2", ""); - // insert_doc_objects.bind(":lev3", ""); - // insert_doc_objects.bind(":lev4", ""); - // insert_doc_objects.bind(":lev5", ""); - // insert_doc_objects.bind(":lev6", ""); - // insert_doc_objects.bind(":lev7", ""); - // insert_doc_objects.bind(":node", ""); - // insert_doc_objects.bind(":type", ""); - // insert_doc_objects.bind(":parent_ocn", ""); - // insert_doc_objects.bind(":ancestors", ""); - // insert_doc_objects.bind(":heading_lev_markup", ""); - // insert_doc_objects.bind(":heading_lev_collapsed", ""); - // insert_doc_objects.bind(":parent_lev_markup", ""); - // insert_doc_objects.bind(":heading_ancestors", ""); - // insert_doc_objects.bind(":node", ""); - insert_doc_objects.execute(); insert_doc_objects.reset(); - } + if (!(obj.is_a == "comment")) { + _insert_doc_objects ~= insertDocObjectsRow(obj); + } + } // loop closes + } + _insert_doc_objects ~= "COMMIT"; + debug(sql_statement) { + writeln("#+BEGIN_SRC sql\n", _insert_doc_objects.join, "\n#+END_SRC"); } - insert_doc_objects.finalize(); + std.utf.validate(_insert_doc_objects.join); // TODO + db.run(_insert_doc_objects.join.to!(char[]).toUTF8); } } SQLiteObjectsLoop!()(doc_matters.xml.keys_seq.sql); diff --git a/src/sdp/output/xmls.d b/src/sdp/output/xmls.d index 952c9cd..58ae237 100644 --- a/src/sdp/output/xmls.d +++ b/src/sdp/output/xmls.d @@ -163,7 +163,7 @@ template outputXHTMLs() { .replaceAll( rgx.br_nl, ""); } else { - writeln("WARNING home button text expected"); + _locations = "<p class=\"tiny_left\"><a href=\"http://www.sisudoc.org\">SiSU</a></p>\n<p class=\"tiny_left\"><a href=\"http://www.sisudoc.org\">www.sisudoc.org</a></p>\n<p class=\"tiny_left\"><a href=\"http://git.sisudoc.org/gitweb/\">sources / git</a></p>"; } string o; o = format(q"¶<div class="flex-menu-option"> diff --git a/src/sdp/sdp.d b/src/sdp/sdp.d index bddcc64..a50b0e9 100755 --- a/src/sdp/sdp.d +++ b/src/sdp/sdp.d @@ -264,8 +264,8 @@ void main(string[] args) { "pwd" : environment["PWD"], "home" : environment["HOME"], ]; - auto _manifest_start = PodManifest!()(); - auto _manifest_matter = PathMatters!()(_opt_action, _env); + auto _manifest_start = PodManifest!()(""); + auto _manifest_matter = PathMatters!()(_opt_action, _env, ""); auto _manifests = [ _manifest_matter ]; foreach(arg; args[1..$]) { _manifest_start = PodManifest!()(arg); @@ -319,7 +319,7 @@ void main(string[] args) { if (_opt_action.languages_set[0] == "all" || (contents_location_pth_).match(lang_rgx_) ) { - auto _fns = (((tmp_dir_).chainPath(contents_location_pth_)).array).to!(string); + auto _fns = (((tmp_dir_).chainPath(contents_location_pth_)).array).to!string; _manifest_matter = PathMatters!()(_opt_action, _env, arg, _fns, contents_locations_arr); _manifests ~= _manifest_matter; // TODO how to capture? } diff --git a/views/version.txt b/views/version.txt index ca8d62e..b3b647a 100644 --- a/views/version.txt +++ b/views/version.txt @@ -4,7 +4,7 @@ struct Version { int minor; int patch; } -enum ver = Version(0, 25, 0); +enum ver = Version(0, 26, 0); version (Posix) { version (DigitalMars) { } else version (LDC) { |