From bdb43e4e7d34ba178ec3bbc351d059c63e162d4b Mon Sep 17 00:00:00 2001 From: Ralph Amissah Date: Thu, 8 Mar 2018 16:58:10 -0500 Subject: footnotes fontface; home button text and links --- src/sdp/meta/conf_make_meta_json.d | 50 ++++++++++++++++++++------ src/sdp/meta/conf_make_meta_structs.d | 65 +++++++++++++++++++++++++-------- src/sdp/meta/defaults.d | 1 + src/sdp/meta/metadoc_from_src.d | 67 +++++++++++++++++++++-------------- src/sdp/meta/rgx.d | 3 +- 5 files changed, 134 insertions(+), 52 deletions(-) (limited to 'src/sdp/meta') diff --git a/src/sdp/meta/conf_make_meta_json.d b/src/sdp/meta/conf_make_meta_json.d index e192c70..3a47f20 100644 --- a/src/sdp/meta/conf_make_meta_json.d +++ b/src/sdp/meta/conf_make_meta_json.d @@ -66,7 +66,17 @@ static template contentJSONtoSiSUstruct() { if ("footer" in _json.object["make"] && (_json.object["make"]["footer"].type().to!string == "STRING") ) { - _struct_composite.make_str.footer = _json.object["make"]["footer"].str; + 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[]); + } else if ("footer" in _json.object["make"] + && _json.object["make"]["footer"].type().to!string == "ARRAY") { + string[] _match_footer_array; + foreach (_match_heading; _json.object["make"]["footer"].arrayNoRef) { + _match_footer_array ~= _match_heading.str; + } + _struct_composite.make_str.footer = _match_footer_array; } if ("headings" in _json.object["make"] && (_json.object["make"]["headings"].type().to!string == "STRING") @@ -86,12 +96,32 @@ static template contentJSONtoSiSUstruct() { if ("home_button_image" in _json.object["make"] && (_json.object["make"]["home_button_image"].type().to!string == "STRING") ) { - _struct_composite.make_str.home_button_image = _json.object["make"]["home_button_image"].str; + char[][] __match_home_button_image_array + = (cast(char[]) _json.object["make"]["home_button_image"].str) + .split(_rgx.make_heading_delimiter); + _struct_composite.make_str.home_button_image = __match_home_button_image_array.to!(string[]); + } else if ("home_button_image" in _json.object["make"] + && _json.object["make"]["home_button_image"].type().to!string == "ARRAY") { + string[] _match_home_button_image_array; + foreach (_match_heading; _json.object["make"]["home_button_image"].arrayNoRef) { + _match_home_button_image_array ~= _match_heading.str; + } + _struct_composite.make_str.home_button_image = _match_home_button_image_array; } if ("home_button_text" in _json.object["make"] && (_json.object["make"]["home_button_text"].type().to!string == "STRING") ) { - _struct_composite.make_str.home_button_text = _json.object["make"]["home_button_text"].str; + char[][] __match_home_button_text_array + = (cast(char[]) _json.object["make"]["home_button_text"].str) + .split(_rgx.make_heading_delimiter); + _struct_composite.make_str.home_button_text = __match_home_button_text_array.to!(string[]); + } else if ("home_button_text" in _json.object["make"] + && _json.object["make"]["home_button_text"].type().to!string == "ARRAY") { + string[] _match_home_button_text_array; + foreach (_match_heading; _json.object["make"]["home_button_text"].arrayNoRef) { + _match_home_button_text_array ~= _match_heading.str; + } + _struct_composite.make_str.home_button_text = _match_home_button_text_array; } if ("italics" in _json.object["make"] && (_json.object["make"]["italics"].type().to!string == "STRING") @@ -130,14 +160,14 @@ static template contentJSONtoSiSUstruct() { break; } } - if ("num_depth" in _json.object["make"] - && (_json.object["make"]["num_depth"].type().to!string == "INTEGER") + if ("auto_num_depth" in _json.object["make"] + && (_json.object["make"]["auto_num_depth"].type().to!string == "INTEGER") ) { - _struct_composite.make_str.num_depth = _json.object["make"]["num_depth"].integer.to!int; - } else if ("num_depth" in _json.object["make"] - && (_json.object["make"]["num_depth"].type().to!string == "STRING") + _struct_composite.make_str.auto_num_depth = _json.object["make"]["auto_num_depth"].integer.to!int; + } else if ("auto_num_depth" in _json.object["make"] + && (_json.object["make"]["auto_num_depth"].type().to!string == "STRING") ) { - _struct_composite.make_str.num_depth = _json.object["make"]["num_depth"].str.to!int; + _struct_composite.make_str.auto_num_depth = _json.object["make"]["auto_num_depth"].str.to!int; } if ("substitute" in _json.object["make"]) { string[][] _sub; @@ -180,7 +210,7 @@ static template contentJSONtoSiSUstruct() { _struct_composite.make.italics = _mk.italics(_struct_composite.make_str.italics); _struct_composite.make.auto_num_top_at_level = _mk.auto_num_top_at_level(_struct_composite.make_str.auto_num_top_at_level); _struct_composite.make.auto_num_top_lv = _mk.auto_num_top_lv(_struct_composite.make_str.auto_num_top_lv); - _struct_composite.make.num_depth = _mk.num_depth(_struct_composite.make_str.num_depth); + _struct_composite.make.auto_num_depth = _mk.auto_num_depth(_struct_composite.make_str.auto_num_depth); _struct_composite.make.substitute = _mk.substitute(_struct_composite.make_str.substitute); _struct_composite.make.texpdf_font = _mk.texpdf_font(_struct_composite.make_str.texpdf_font); } diff --git a/src/sdp/meta/conf_make_meta_structs.d b/src/sdp/meta/conf_make_meta_structs.d index 41af6ba..a5d2c15 100644 --- a/src/sdp/meta/conf_make_meta_structs.d +++ b/src/sdp/meta/conf_make_meta_structs.d @@ -9,20 +9,45 @@ import std.typecons, std.utf, std.conv : to; +import + sdp.meta.defaults, + sdp.meta.rgx; +mixin SiSUrgxInit; +static auto _rgx = Rgx(); +mixin InternalMarkup; +auto _mkup = InlineMarkup(); +auto url_markup(string line) { + auto line_ = (line) + .replaceAll( + _rgx.inline_link_markup_regular, + ("$1" + ~ _mkup.lnk_o ~ "$2" ~ _mkup.lnk_c + ~ _mkup.url_o ~ "$3" ~ _mkup.url_c + ~ "$4") // ("$1{ $2 }$3$4") + ) + .replaceAll( + _rgx.inline_link_naked_url, + ("$1" + ~ _mkup.lnk_o ~ "$2" ~ _mkup.lnk_c + ~ _mkup.url_o ~ "$2" ~ _mkup.url_c + ~ "$3") // ("$1{ $2 }$2$3") + ); + return line_; +} struct ConfCompositeMakeStr { string bold; string breaks; string cover_image; string css; string emphasis; - string footer; + string[] footer; string[] headings; - string home_button_image; - string home_button_text; + string[] home_button_image; + string[] home_button_text; string italics; string auto_num_top_at_level; int auto_num_top_lv = 9; - int num_depth = 2; + int auto_num_depth = 2; string[][] substitute; string texpdf_font; } @@ -50,17 +75,27 @@ struct confCompositeMakeBuild { } return _out; } - auto footer(string _mk) { - return _mk; + auto footer(string[] _mk) { + string line_; + string[] _mk2; + foreach (line; _mk) { + _mk2 ~= url_markup(line); + } + return _mk2; } auto headings(string[] _mk) { return _mk; } - auto home_button_image(string _mk) { + auto home_button_image(string[] _mk) { return _mk; } - auto home_button_text(string _mk) { - return _mk; + auto home_button_text(string[] _mk) { + string line_; + string[] _mk2; + foreach (line; _mk) { + _mk2 ~= url_markup(line); + } + return _mk2; } auto italics(string _mk) { string[] _out; @@ -75,7 +110,7 @@ struct confCompositeMakeBuild { auto auto_num_top_lv(int _mk) { return _mk; } - auto num_depth(int _mk) { + auto auto_num_depth(int _mk) { return _mk; } auto substitute(string[][] _mk) { @@ -91,14 +126,14 @@ struct ConfCompositeMakeInit { string cover_image; string css; string[] emphasis; - string footer; + string[] footer; string[] headings; - string home_button_image; - string home_button_text; + string[] home_button_image; + string[] home_button_text; string[] italics; string auto_num_top_at_level; int auto_num_top_lv = 9; - int num_depth = 2; + int auto_num_depth = 2; string[][] substitute; string texpdf_font; } @@ -248,7 +283,7 @@ static auto ptr_head_sub_make "home_button_image", "home_button_text", "footer", "headings", - "auto_num_top_at_level", "auto_num_top_lv", "num_depth", + "auto_num_top_at_level", "auto_num_top_lv", "auto_num_depth", "breaks", "substitute", "bold", diff --git a/src/sdp/meta/defaults.d b/src/sdp/meta/defaults.d index 13bf312..f0137cb 100644 --- a/src/sdp/meta/defaults.d +++ b/src/sdp/meta/defaults.d @@ -122,6 +122,7 @@ template SiSUbiblio() { } } template InternalMarkup() { + import std.array; static struct InlineMarkup { auto en_a_o = "【"; auto en_a_c = "】"; auto en_b_o = "〖"; auto en_b_c = "〗"; diff --git a/src/sdp/meta/metadoc_from_src.d b/src/sdp/meta/metadoc_from_src.d index 6035825..784991c 100644 --- a/src/sdp/meta/metadoc_from_src.d +++ b/src/sdp/meta/metadoc_from_src.d @@ -3767,7 +3767,7 @@ template SiSUdocAbstraction() { static struct ObjInlineMarkupMunge { string[string] obj_txt; int n_foot, n_foot_reg, n_foot_sp_asterisk, n_foot_sp_plus; - string asterisks_; + string asterisks_, plus_; string obj_txt_out, tail, note; static auto rgx = Rgx(); static auto mkup = InlineMarkup(); @@ -3785,6 +3785,7 @@ template SiSUdocAbstraction() { static auto mng = InlineMarkup(); obj_txt_in = obj_txt_in.replaceAll(rgx.inline_mono, (mng.mono ~ "{$1}" ~ mng.mono)); /+ url matched +/ + obj_txt_in = obj_txt_in.replaceAll(rgx.inline_notes_al_special, ""); // TODO reinstate when special footnotes are implemented if (obj_txt_in.match(rgx.inline_url_generic)) { /+ link: naked url: http://url +/ if (obj_txt_in.match(rgx.inline_link_naked_url)) { @@ -3802,22 +3803,23 @@ template SiSUdocAbstraction() { { link which includes url as footnote }http://url~{ { http://url }http://url }~ +/ if (obj_txt_in.match(rgx.inline_link_endnote_url_helper)) { - obj_txt_in = (obj_txt_in).replaceAll( - rgx.inline_link_endnote_url_helper_punctuated, - (mkup.lnk_o ~ "$1" ~ mkup.lnk_c - ~ mkup.url_o ~ "$2" ~ mkup.url_c - ~ "~{ " ~ mkup.lnk_o ~ " $2 " ~ mkup.lnk_c - ~ mkup.url_o ~ "$2" ~ mkup.url_c - ~ " }~$3") // ("{ $1 }$2~{ { $2 }$2 }~$3") - ); - obj_txt_in = (obj_txt_in).replaceAll( - rgx.inline_link_endnote_url_helper, - (mkup.lnk_o ~ "$1" ~ mkup.lnk_c - ~ mkup.url_o ~ "$2" ~ mkup.url_c - ~ "~{ " ~ mkup.lnk_o ~ " $2 " ~ mkup.lnk_c - ~ mkup.url_o ~ "$2" ~ mkup.url_c - ~ " }~") // ("{ $1 }$2~{ { $2 }$2 }~") - ); + obj_txt_in = (obj_txt_in) + .replaceAll( + rgx.inline_link_endnote_url_helper_punctuated, + (mkup.lnk_o ~ "$1" ~ mkup.lnk_c + ~ mkup.url_o ~ "$2" ~ mkup.url_c + ~ "~{ " ~ mkup.lnk_o ~ " $2 " ~ mkup.lnk_c + ~ mkup.url_o ~ "$2" ~ mkup.url_c + ~ " }~$3") // ("{ $1 }$2~{ { $2 }$2 }~$3") + ) + .replaceAll( + rgx.inline_link_endnote_url_helper, + (mkup.lnk_o ~ "$1" ~ mkup.lnk_c + ~ mkup.url_o ~ "$2" ~ mkup.url_c + ~ "~{ " ~ mkup.lnk_o ~ " $2 " ~ mkup.lnk_c + ~ mkup.url_o ~ "$2" ~ mkup.url_c + ~ " }~") // ("{ $1 }$2~{ { $2 }$2 }~") + ); } /+ link with regular markup: { linked text or image }http://url @@ -3842,6 +3844,7 @@ template SiSUdocAbstraction() { /+ endnotes (regular) +/ bool flg_notes_reg = false; bool flg_notes_star = false; + bool flg_notes_plus = false; obj_txt_in = (obj_txt_in).replaceAll( rgx.inline_notes_curly, (mkup.en_a_o ~ " $1" ~ mkup.en_a_c) @@ -3868,6 +3871,15 @@ template SiSUdocAbstraction() { rgx.inline_al_delimiter_open_symbol_star, (mkup.en_a_o ~ replicate(asterisks_, n_foot_sp_asterisk) ~ " ") ) ~ "\n"; + } else if (n.hit.to!string.match(rgx.inline_al_delimiter_open_symbol_plus)) { + flg_notes_plus = true; + ++n_foot_sp_plus; + plus_ = "*"; + n_foot=n_foot_sp_plus; + obj_txt_out ~= n.hit.to!string.replaceFirst( + rgx.inline_al_delimiter_open_symbol_plus, + (mkup.en_a_o ~ replicate(plus_, n_foot_sp_plus) ~ " ") + ) ~ "\n"; } else if (n.hit.to!string.match(rgx.inline_al_delimiter_open_regular)) { flg_notes_reg = true; ++n_foot_reg; @@ -3888,6 +3900,7 @@ template SiSUdocAbstraction() { obj_txt_out, flg_notes_reg, flg_notes_star, + flg_notes_plus, ); return t; } @@ -3933,6 +3946,7 @@ template SiSUdocAbstraction() { obj_txt_out, ftn[1], ftn[2], + ftn[3], urls, ); return t; @@ -4143,7 +4157,8 @@ template SiSUdocAbstraction() { obj_txt["munge"] = x[0]; obj_notes_and_links["notes_reg"] = x[1]; obj_notes_and_links["notes_star"] = x[2]; - obj_notes_and_links["links"] = x[3]; + obj_notes_and_links["notes_plus"] = x[3]; + obj_notes_and_links["links"] = x[4]; break; } auto t = tuple( @@ -4360,7 +4375,7 @@ template SiSUdocAbstraction() { heading_num[3] = 0; heading_number_auto_composite = ""; } - /+ num_depth minimum 0 + /+ auto_num_depth minimum 0 (1.) default 2 (1.1.1) max 3 (1.1.1.1) implement +/ if ( conf_make_meta.make.auto_num_top_lv @@ -4398,7 +4413,7 @@ template SiSUdocAbstraction() { } if (heading_num[3] > 0) { heading_number_auto_composite - = (conf_make_meta.make.num_depth.to!uint == 3) + = (conf_make_meta.make.auto_num_depth.to!uint == 3) ? ( heading_num[0].to!string ~ "." ~ heading_num[1].to!string ~ "." ~ heading_num[2].to!string ~ "." @@ -4407,8 +4422,8 @@ template SiSUdocAbstraction() { : ""; } else if (heading_num[2] > 0) { heading_number_auto_composite - = ((conf_make_meta.make.num_depth.to!uint >= 2) - && (conf_make_meta.make.num_depth.to!uint <= 3)) + = ((conf_make_meta.make.auto_num_depth.to!uint >= 2) + && (conf_make_meta.make.auto_num_depth.to!uint <= 3)) ? ( heading_num[0].to!string ~ "." ~ heading_num[1].to!string ~ "." ~ heading_num[2].to!string @@ -4416,16 +4431,16 @@ template SiSUdocAbstraction() { : ""; } else if (heading_num[1] > 0) { heading_number_auto_composite - = ((conf_make_meta.make.num_depth.to!uint >= 1) - && (conf_make_meta.make.num_depth.to!uint <= 3)) + = ((conf_make_meta.make.auto_num_depth.to!uint >= 1) + && (conf_make_meta.make.auto_num_depth.to!uint <= 3)) ? ( heading_num[0].to!string ~ "." ~ heading_num[1].to!string ) : ""; } else if (heading_num[0] > 0) { heading_number_auto_composite - = ((conf_make_meta.make.num_depth.to!uint >= 0) - && (conf_make_meta.make.num_depth.to!uint <= 3)) + = ((conf_make_meta.make.auto_num_depth.to!uint >= 0) + && (conf_make_meta.make.auto_num_depth.to!uint <= 3)) ? (heading_num[0].to!string) : ""; } else { diff --git a/src/sdp/meta/rgx.d b/src/sdp/meta/rgx.d index 4cc1fe1..9fdcb99 100644 --- a/src/sdp/meta/rgx.d +++ b/src/sdp/meta/rgx.d @@ -64,7 +64,7 @@ static template SiSUrgxInit() { static native_subhead_identifier = ctRegex!(`^(?:oclc|pg|isbn)$`, "m"); static native_subhead_notes = ctRegex!(`^(?:abstract|description)$`, "m"); static native_subhead_publisher = ctRegex!(`^(?:name)$`, "m"); - static native_subhead_make = ctRegex!(`^(?:cover_image|home_button_image|home_button_text|footer|headings|num_top|num_depth|breaks|substitute|bold|italics|emphasis|texpdf_font|css)$`, "m"); + static native_subhead_make = ctRegex!(`^(?:cover_image|home_button_image|home_button_text|footer|headings|num_top|auto_num_depth|breaks|substitute|bold|italics|emphasis|texpdf_font|css)$`, "m"); /+ heading & paragraph operators +/ static heading_a = ctRegex!(`^:?[A][~] `, "m"); static heading = ctRegex!(`^:?([A-D1-4])[~]([a-z0-9_.-]*[?]?)\s+`,"i"); @@ -220,6 +220,7 @@ static template SiSUrgxInit() { static src_formalised_file_path_parts = ctRegex!(`(?P(?:[/a-zA-Z0-9._-]+?)(?P[a-zA-Z0-9._-]+))(?:/media/text/[a-z]{2})$`); // formalizes dir structure /+ inline markup footnotes endnotes +/ static inline_notes_al = ctRegex!(`【(?:[*+]\s+|\s*)(.+?)】`, "mg"); + static inline_notes_al_special = ctRegex!(`【(?:[*+]\s+)(.+?)】`, "mg"); // TODO remove match when special footnotes are implemented static inline_notes_al_gen = ctRegex!(`【.+?】`, "m"); static inline_notes_al_gen_text = ctRegex!(`【(?P.+?)】`, "m"); static inline_notes_al_gen_ref = ctRegex!(`【(?P[*+]\s+)\s*(?P.+?)】`, "mg"); -- cgit v1.2.3