diff --git a/100_core/src_110_primitive/gplx/Bry_bfr.java b/100_core/src_110_primitive/gplx/Bry_bfr.java index 5d2c8489f..90ecc6471 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr.java @@ -120,10 +120,12 @@ public class Bry_bfr { return this; } public Bry_bfr Add_byte_eq() {return Add_byte(Byte_ascii.Eq);} - public Bry_bfr Add_byte_pipe() {return Add_byte(Byte_ascii.Pipe);} - public Bry_bfr Add_byte_apos() {return Add_byte(Byte_ascii.Apos);} - public Bry_bfr Add_byte_quote() {return Add_byte(Byte_ascii.Quote);} - public Bry_bfr Add_byte_space() {return Add_byte(Byte_ascii.Space);} + public Bry_bfr Add_byte_pipe() {return Add_byte(Byte_ascii.Pipe);} + public Bry_bfr Add_byte_comma() {return Add_byte(Byte_ascii.Comma);} + public Bry_bfr Add_byte_apos() {return Add_byte(Byte_ascii.Apos);} + public Bry_bfr Add_byte_backslash() {return Add_byte(Byte_ascii.Backslash);} + public Bry_bfr Add_byte_quote() {return Add_byte(Byte_ascii.Quote);} + public Bry_bfr Add_byte_space() {return Add_byte(Byte_ascii.Space);} public Bry_bfr Add_byte_nl() {return Add_byte(Byte_ascii.NewLine);} public Bry_bfr Add_byte(byte val) { int newPos = bfr_len + 1; diff --git a/100_core/src_110_primitive/gplx/Bry_finder.java b/100_core/src_110_primitive/gplx/Bry_finder.java index 765f8f776..bc9237182 100644 --- a/100_core/src_110_primitive/gplx/Bry_finder.java +++ b/100_core/src_110_primitive/gplx/Bry_finder.java @@ -100,6 +100,16 @@ public class Bry_finder { } return rv; } + public static int Find_bwd_ws(byte[] src, int cur, int end) { + for (int i = cur; i > -1; --i) { + byte b = src[i]; + switch (b) { + case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: + return i; + } + } + return Bry_finder.Not_found; + } public static int Find_fwd_last_ws(byte[] src, int cur) { int end = src.length; if (cur >= end) return Bry_finder.Not_found; @@ -165,6 +175,18 @@ public class Bry_finder { cur++; } } + public static int Find_fwd_until_space_or_tab(byte[] src, int cur, int end) { + while (true) { + if (cur == end) return Bry_finder.Not_found; + switch (src[cur]) { + case Byte_ascii.Space: case Byte_ascii.Tab: + return cur; + default: + ++cur; + break; + } + } + } public static int Find_fwd_while_space_or_tab(byte[] src, int cur, int end) { while (true) { if (cur == end) return cur; diff --git a/100_core/src_110_primitive/gplx/Byte_ascii.java b/100_core/src_110_primitive/gplx/Byte_ascii.java index de567314e..052ccf085 100644 --- a/100_core/src_110_primitive/gplx/Byte_ascii.java +++ b/100_core/src_110_primitive/gplx/Byte_ascii.java @@ -76,7 +76,9 @@ public class Byte_ascii { , Lt_bry = new byte[] {Byte_ascii.Lt} , Gt_bry = new byte[] {Byte_ascii.Gt} , Brack_bgn_bry = new byte[] {Byte_ascii.Brack_bgn} + , Brack_end_bry = new byte[] {Byte_ascii.Brack_end} , Apos_bry = new byte[] {Byte_ascii.Apos} + , Quote_bry = new byte[] {Byte_ascii.Quote} , Pipe_bry = new byte[] {Byte_ascii.Pipe} , Underline_bry = new byte[] {Byte_ascii.Underline} , Asterisk_bry = new byte[] {Byte_ascii.Asterisk} diff --git a/100_core/src_110_primitive/gplx/Int_.java b/100_core/src_110_primitive/gplx/Int_.java index 34b1260a4..fe54fc711 100644 --- a/100_core/src_110_primitive/gplx/Int_.java +++ b/100_core/src_110_primitive/gplx/Int_.java @@ -43,6 +43,7 @@ public class Int_ implements GfoInvkAble { rv[i] = bgn + i; return rv; } + public static boolean Bounds_chk(int bgn, int end, int len) {return bgn > -1 && end < len;} public static final int MinValue = Integer.MIN_VALUE , MaxValue = Integer.MAX_VALUE diff --git a/100_core/src_110_primitive/gplx/String_.java b/100_core/src_110_primitive/gplx/String_.java index 5666e73f0..3632c28f4 100644 --- a/100_core/src_110_primitive/gplx/String_.java +++ b/100_core/src_110_primitive/gplx/String_.java @@ -152,7 +152,7 @@ public class String_ implements GfoInvkAble { rv[i] = (int)s.charAt(i); return rv; } - public static String Coalesce(String s, String alt) {return Len(s) == 0 ? alt : s;} + public static String Coalesce(String s, String alt) {return Len_eq_0(s) ? alt : s;} public static boolean In(String s, String... ary) { for (String itm : ary) if (String_.Eq(s, itm)) return true; diff --git a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java index 5d85976ae..b3b4bcccd 100644 --- a/150_gfui/src_700_env/gplx/gfui/Swt_kit.java +++ b/150_gfui/src_700_env/gplx/gfui/Swt_kit.java @@ -186,11 +186,17 @@ public class Swt_kit implements Gfui_kit { public Gfui_mnu_grp New_mnu_bar(String key, GfuiWin owner) {return Swt_popup_grp.new_bar(key, owner);} public float Calc_font_height(GfuiElem elem, String s) { if (String_.Len_eq_0(s)) return 8; - String old_text = elem.Text(); - elem.Text_(s); - float rv = ((Swt_text_w_border)(elem.UnderElem())).Under_text().getFont().getFontData()[0].height; - shell.setText(old_text); - return rv; + try { + String old_text = elem.Text(); + elem.Text_(s); + float rv = ((Swt_text_w_border)(elem.UnderElem())).Under_text().getFont().getFontData()[0].height; + elem.Text_(old_text); // was shell.setText(old_text); DATE:2014-07-25 + return rv; + } + catch (Exception e) { + Gfo_usr_dlg_._.Warn_many("", "", "error while calculating font height; err=~{0}", Err_.Message_gplx_brief(e)); + return 8; + } } public void Set_mnu_popup(GfuiElem owner, Gfui_mnu_grp grp) { Control control = Swt_control_.cast_or_fail(owner).Under_menu_control(); diff --git a/400_xowa/.classpath b/400_xowa/.classpath index a16e8f691..5395ffd93 100644 --- a/400_xowa/.classpath +++ b/400_xowa/.classpath @@ -19,16 +19,11 @@ - - - - - diff --git a/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java b/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java index baa8b870c..30bb9f3d1 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_mnt_mgr.java @@ -111,9 +111,10 @@ public class Fsdb_mnt_mgr implements GfoInvkAble { public static final int Mnt_idx_main = 0, Mnt_idx_user = 1, Insert_to_bin_null = -1; public static void Patch(Fsdb_mnt_mgr mnt_mgr) { mnt_mgr.Abc_mgr_at(Fsdb_mnt_mgr.Mnt_idx_main).Cfg_mgr() - .Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_fix_defaults, "y") - .Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_packed, "y") - .Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_upright_patch, "y") + .Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_fix_defaults , "y") + .Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_gallery_packed , "y") + .Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_upright_use_thumb_w , "y") + .Update(Xof_fsdb_mgr_cfg.Grp_xowa, Xof_fsdb_mgr_cfg.Key_upright_fix_default , "y") ; } } diff --git a/400_xowa/src/gplx/html/Html_entity_.java b/400_xowa/src/gplx/html/Html_entity_.java index 6d4c51aa2..b3b883265 100644 --- a/400_xowa/src/gplx/html/Html_entity_.java +++ b/400_xowa/src/gplx/html/Html_entity_.java @@ -29,6 +29,6 @@ public class Html_entity_ { , Nl_bry = Bry_.new_ascii_(Nl_str), Space_bry = Bry_.new_ascii_(" ") , Pipe_bry = Bry_.new_ascii_("|") , Colon_bry = Bry_.new_ascii_(":"), Underline_bry = Bry_.new_ascii_("_"), Asterisk_bry = Bry_.new_ascii_("*") - , Brack_bgn_bry = Bry_.new_ascii_("[") + , Brack_bgn_bry = Bry_.new_ascii_("["), Brack_end_bry = Bry_.new_ascii_("]") ; } diff --git a/400_xowa/src/gplx/html/Html_tag_.java b/400_xowa/src/gplx/html/Html_tag_.java index 612cbeae9..c19165806 100644 --- a/400_xowa/src/gplx/html/Html_tag_.java +++ b/400_xowa/src/gplx/html/Html_tag_.java @@ -21,8 +21,12 @@ public class Html_tag_ { Ul_name_bry = Bry_.new_ascii_("ul") ; public static final byte[] - Body_lhs = Bry_.new_ascii_("") - , Body_rhs = Bry_.new_ascii_("") + Br_inl = Bry_.new_ascii_("
") + , Hr_inl = Bry_.new_ascii_("
") + , Body_lhs = Bry_.new_ascii_("") , Body_rhs = Bry_.new_ascii_("") + , B_lhs = Bry_.new_ascii_("") , B_rhs = Bry_.new_ascii_("") + , I_lhs = Bry_.new_ascii_("") , I_rhs = Bry_.new_ascii_("") + , P_lhs = Bry_.new_ascii_("

") , P_rhs = Bry_.new_ascii_("

") , Html_rhs = Bry_.new_ascii_("") , Head_lhs_bgn = Bry_.new_ascii_("") @@ -31,7 +35,6 @@ public class Html_tag_ { , Script_lhs = Bry_.new_ascii_("") - , Hr_bry = Bry_.new_ascii_("
") ; public static final String Comm_bgn_str = "") - , Br = Bry_.new_ascii_("
") - - , B_bgn = Bry_.new_ascii_(""), B_end = Bry_.new_ascii_("") - , I_bgn = Bry_.new_ascii_(""), I_end = Bry_.new_ascii_("") - , P_bgn = Bry_.new_ascii_("

"), P_end = Bry_.new_ascii_("

") , A_bgn = Bry_.new_ascii_("") - , A_bgn_lnke_0_xowa = Bry_.new_ascii_("\">") , A_end = Bry_.new_ascii_("") , Div_bgn_open = Bry_.new_ascii_("
") - , Img_bgn = Bry_.new_ascii_("") , Span_bgn = Bry_.new_ascii_("") diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java index 2157b0ad4..6223c3d9f 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java @@ -17,21 +17,25 @@ along with this program. If not, see . */ package gplx.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.core.btries.*; import gplx.html.*; import gplx.xowa.wikis.*; import gplx.xowa.net.*; -import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; +import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.dynamicPageList.*; import gplx.xowa.xtns.math.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.xtns.cite.*; public class Xoh_html_wtr { private Xow_wiki wiki; private Xoa_app app; private Xoa_page page; private Xop_xatr_whitelist_mgr whitelist_mgr; public Xoh_html_wtr(Xow_wiki wiki, Xow_html_mgr html_mgr) { this.wiki = wiki; this.app = wiki.App(); this.whitelist_mgr = app.Html_mgr().Whitelist_mgr(); + this.html_mgr = html_mgr; lnki_wtr = new Xoh_lnki_wtr(this, wiki, html_mgr, cfg); ref_wtr = new Ref_html_wtr(wiki); + lnke_wtr = new Xoh_lnke_wtr(wiki); } public void Init_by_wiki(Xow_wiki wiki) { cfg.Toc_show_(true).Lnki_title_(true).Lnki_visited_(true).Lnki_id_(true); // NOTE: set during Init_by_wiki, b/c all tests assume these are false ref_wtr.Init_by_wiki(wiki); } + public Xow_html_mgr Html_mgr() {return html_mgr;} private Xow_html_mgr html_mgr; public Xoh_html_wtr_cfg Cfg() {return cfg;} private Xoh_html_wtr_cfg cfg = new Xoh_html_wtr_cfg(); public Xoh_lnki_wtr Lnki_wtr() {return lnki_wtr;} private Xoh_lnki_wtr lnki_wtr; + public Xoh_lnke_wtr Lnke_wtr() {return lnke_wtr;} private Xoh_lnke_wtr lnke_wtr; public Ref_html_wtr Ref_wtr() {return ref_wtr;} private Ref_html_wtr ref_wtr; public void Init_by_page(Xop_ctx ctx, Xoa_page page) {this.page = page; lnki_wtr.Init_by_page(ctx, page);} public void Write_all(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xop_root_tkn root) {Write_all(bfr, ctx, Xoh_html_wtr_ctx.Basic, src, root);} @@ -68,7 +72,7 @@ public class Xoh_html_wtr { case Xop_tkn_itm_.Tid_hr: Hr(ctx, hctx, bfr, src, (Xop_hr_tkn)tkn); break; case Xop_tkn_itm_.Tid_hdr: Hdr(ctx, hctx, bfr, src, (Xop_hdr_tkn)tkn); break; case Xop_tkn_itm_.Tid_apos: Apos(ctx, hctx, bfr, src, (Xop_apos_tkn)tkn); break; - case Xop_tkn_itm_.Tid_lnke: Lnke(ctx, hctx, bfr, src, (Xop_lnke_tkn)tkn); break; + case Xop_tkn_itm_.Tid_lnke: lnke_wtr.Write_all(bfr, this, hctx, ctx, src, (Xop_lnke_tkn)tkn); break; case Xop_tkn_itm_.Tid_lnki: lnki_wtr.Write(bfr, hctx, src, (Xop_lnki_tkn)tkn); break; case Xop_tkn_itm_.Tid_list: List(ctx, hctx, bfr, src, (Xop_list_tkn)tkn); break; case Xop_tkn_itm_.Tid_xnde: Xnde(ctx, hctx, bfr, src, (Xop_xnde_tkn)tkn); break; @@ -134,66 +138,22 @@ public class Xoh_html_wtr { if (literal_apos > 0) bfr.Add_byte_repeat(Byte_ascii.Apos, literal_apos); switch (apos.Apos_cmd()) { - case Xop_apos_tkn_.Cmd_b_bgn: bfr.Add(Xoh_consts.B_bgn); break; - case Xop_apos_tkn_.Cmd_b_end: bfr.Add(Xoh_consts.B_end); break; - case Xop_apos_tkn_.Cmd_i_bgn: bfr.Add(Xoh_consts.I_bgn); break; - case Xop_apos_tkn_.Cmd_i_end: bfr.Add(Xoh_consts.I_end); break; - case Xop_apos_tkn_.Cmd_bi_bgn: bfr.Add(Xoh_consts.B_bgn).Add(Xoh_consts.I_bgn); break; - case Xop_apos_tkn_.Cmd_ib_end: bfr.Add(Xoh_consts.I_end).Add(Xoh_consts.B_end); break; - case Xop_apos_tkn_.Cmd_ib_bgn: bfr.Add(Xoh_consts.I_bgn).Add(Xoh_consts.B_bgn); break; - case Xop_apos_tkn_.Cmd_bi_end: bfr.Add(Xoh_consts.B_end).Add(Xoh_consts.I_end);; break; - case Xop_apos_tkn_.Cmd_bi_end__b_bgn: bfr.Add(Xoh_consts.B_end).Add(Xoh_consts.I_end).Add(Xoh_consts.B_bgn); break; - case Xop_apos_tkn_.Cmd_ib_end__i_bgn: bfr.Add(Xoh_consts.I_end).Add(Xoh_consts.B_end).Add(Xoh_consts.I_bgn); break; - case Xop_apos_tkn_.Cmd_b_end__i_bgn: bfr.Add(Xoh_consts.B_end).Add(Xoh_consts.I_bgn); break; - case Xop_apos_tkn_.Cmd_i_end__b_bgn: bfr.Add(Xoh_consts.I_end).Add(Xoh_consts.B_bgn); break; + case Xop_apos_tkn_.Cmd_b_bgn: bfr.Add(Html_tag_.B_lhs); break; + case Xop_apos_tkn_.Cmd_b_end: bfr.Add(Html_tag_.B_rhs); break; + case Xop_apos_tkn_.Cmd_i_bgn: bfr.Add(Html_tag_.I_lhs); break; + case Xop_apos_tkn_.Cmd_i_end: bfr.Add(Html_tag_.I_rhs); break; + case Xop_apos_tkn_.Cmd_bi_bgn: bfr.Add(Html_tag_.B_lhs).Add(Html_tag_.I_lhs); break; + case Xop_apos_tkn_.Cmd_ib_end: bfr.Add(Html_tag_.I_rhs).Add(Html_tag_.B_rhs); break; + case Xop_apos_tkn_.Cmd_ib_bgn: bfr.Add(Html_tag_.I_lhs).Add(Html_tag_.B_lhs); break; + case Xop_apos_tkn_.Cmd_bi_end: bfr.Add(Html_tag_.B_rhs).Add(Html_tag_.I_rhs);; break; + case Xop_apos_tkn_.Cmd_bi_end__b_bgn: bfr.Add(Html_tag_.B_rhs).Add(Html_tag_.I_rhs).Add(Html_tag_.B_lhs); break; + case Xop_apos_tkn_.Cmd_ib_end__i_bgn: bfr.Add(Html_tag_.I_rhs).Add(Html_tag_.B_rhs).Add(Html_tag_.I_lhs); break; + case Xop_apos_tkn_.Cmd_b_end__i_bgn: bfr.Add(Html_tag_.B_rhs).Add(Html_tag_.I_lhs); break; + case Xop_apos_tkn_.Cmd_i_end__b_bgn: bfr.Add(Html_tag_.I_rhs).Add(Html_tag_.B_lhs); break; case Xop_apos_tkn_.Cmd_nil: break; default: throw Err_.unhandled(apos.Apos_cmd()); } } - private void Lnke(Xop_ctx ctx, Xoh_html_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_lnke_tkn lnke) { - int lnke_bgn = lnke.Lnke_bgn(), lnke_end = lnke.Lnke_end(); - byte[] lnke_xwiki_wiki = lnke.Lnke_xwiki_wiki(); - boolean proto_is_xowa = lnke.Proto_tid() == Xoo_protocol_itm.Tid_xowa; - if (!hctx.Mode_is_alt()) { - if (lnke_xwiki_wiki == null) { - if (lnke.Lnke_relative()) // relative; EX: //a.org - bfr.Add(Xoh_consts.A_bgn).Add(app.Url_parser().Url_parser().Relative_url_protocol_bry()).Add_mid(src, lnke_bgn, lnke_end).Add(Xoh_consts.A_bgn_lnke_0); - else { // xowa or regular; EX: http://a.org - if (proto_is_xowa) { - bfr.Add(Xoh_consts.A_bgn).Add(Xop_lnke_wkr.Bry_xowa_protocol); - ctx.App().Encoder_mgr().Gfs().Encode(bfr, src, lnke_bgn, lnke_end); - bfr.Add(Xoh_consts.A_bgn_lnke_0_xowa); - } - else // regular; add href - bfr.Add(Xoh_consts.A_bgn).Add_mid(src, lnke_bgn, lnke_end).Add(Xoh_consts.A_bgn_lnke_0); - } - } - else { // xwiki - Url_encoder href_encoder = ctx.App().Encoder_mgr().Href_quotes(); - bfr.Add(Xoh_consts.A_bgn).Add(Xoh_href_parser.Href_site_bry).Add(lnke_xwiki_wiki).Add(Xoh_href_parser.Href_wiki_bry) - .Add(href_encoder.Encode(lnke.Lnke_xwiki_page())); // NOTE: must encode page; EX:%22%3D -> '">' which will end attribute; PAGE:en.w:List_of_Category_A_listed_buildings_in_West_Lothian DATE:2014-07-15 - if (lnke.Lnke_xwiki_qargs() != null) - Xoa_url_arg_hash.Concat_bfr(bfr, href_encoder, lnke.Lnke_xwiki_qargs()); // NOTE: must encode args - bfr.Add(Xoh_consts.__end_quote); - } - } - int subs_len = lnke.Subs_len(); - if (subs_len == 0) { // no text; auto-number; EX: "[1]" - if (lnke.Lnke_typ() == Xop_lnke_tkn.Lnke_typ_text) - bfr.Add_mid(src, lnke.Lnke_bgn(), lnke.Lnke_end()); - else - bfr.Add_byte(Byte_ascii.Brack_bgn).Add_int_variable(page.Html_data().Lnke_autonumber_next()).Add_byte(Byte_ascii.Brack_end); - } - else { // text available - for (int i = 0; i < subs_len; i++) - Write_tkn(bfr, ctx, hctx, src, lnke, i, lnke.Subs_get(i)); - } - if (!hctx.Mode_is_alt()) { - if (proto_is_xowa) // add - bfr.Add(Xoh_consts.Img_bgn).Add(wiki.Html_mgr().Img_xowa_protocol()).Add(Xoh_consts.__inline_quote); - bfr.Add(Xoh_consts.A_end); - } - } public static byte[] Ttl_to_title(byte[] ttl) {return ttl;} // FUTURE: swap html chars? public void List(Xop_ctx ctx, Xoh_html_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_list_tkn list) { if (hctx.Mode_is_alt()) { // alt; add literally; EX: "*" for "\n*"; note that \n is added in NewLine() @@ -373,16 +333,8 @@ public class Xoh_html_wtr { case Xop_xnde_tag_.Tid_table: case Xop_xnde_tag_.Tid_tr: case Xop_xnde_tag_.Tid_td: case Xop_xnde_tag_.Tid_th: case Xop_xnde_tag_.Tid_caption: case Xop_xnde_tag_.Tid_tbody: case Xop_xnde_tag_.Tid_ruby: case Xop_xnde_tag_.Tid_rt: case Xop_xnde_tag_.Tid_rb: case Xop_xnde_tag_.Tid_rp: case Xop_xnde_tag_.Tid_time: case Xop_xnde_tag_.Tid_bdi: case Xop_xnde_tag_.Tid_data: case Xop_xnde_tag_.Tid_mark: case Xop_xnde_tag_.Tid_wbr: case Xop_xnde_tag_.Tid_bdo: // HTML 5: write literally and let browser handle them - { -// byte[] name = tag.Name_bry(); -// bfr.Add_byte(Tag__bgn).Add(name); -// if (xnde.Atrs_bgn() > Xop_tblw_wkr.Atrs_ignore_check) Xnde_atrs(tag_id, hctx, src, xnde.Atrs_bgn(), xnde.Atrs_end(), xnde.Atrs_ary(), bfr); -// bfr.Add_byte(Tag__end); -// Xnde_subs(hctx, bfr, src, xnde, depth); // NOTE: do not escape;

, etc may have nested nodes -// bfr.Add(Tag__end_bgn).Add(name).Add_byte(Tag__end); // NOTE: inline is never written as ; will be written as ; SEE: NOTE_1 Write_xnde(bfr, ctx, hctx, xnde, tag, tag_id, src); break; - } case Xop_xnde_tag_.Tid_pre: { if (xnde.Tag_open_end() == xnde.Tag_close_bgn()) return; // ignore empty tags, else blank pre line will be printed; DATE:2014-03-12 byte[] name = tag.Name_bry(); diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr_tst.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr_tst.java index 08c4d1585..d15f8fee4 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr_tst.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.html; import gplx.*; import gplx.xowa.*; import org.junit.*; -public class Xoh_html_wtr_tst { +public class Xoh_html_wtr_tst { private Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_(); fxt.Reset();} @Test public void Hr_basic() {fxt.Test_parse_page_wiki_str("----" , "
");} @@ -57,19 +57,6 @@ public class Xoh_html_wtr_tst { @Test public void Apos_ib() {fxt.Test_parse_page_wiki_str("'''''a'''''" , "a");} @Test public void Html_ent() {fxt.Test_parse_page_wiki_str("!" , "!");} @Test public void Html_ref() {fxt.Test_parse_page_wiki_str(">" , ">");} - @Test public void Lnke_basic() {fxt.Test_parse_page_wiki_str("[irc://a]" , "[1]");} - @Test public void Lnke_autonumber() {fxt.Test_parse_page_wiki_str("[irc://a] [irc://b]" , "[1] [2]");} - @Test public void Lnke_caption() {fxt.Test_parse_page_wiki_str("[irc://a b]" , "b");} - @Test public void Lnke_caption_fmt() {fxt.Test_parse_page_wiki_str("[irc://a ''b'']" , "b");} - @Test public void Lnke_xowa() { - String img = ""; - fxt.Wiki().Sys_cfg().Xowa_proto_enabled_(true); - fxt.Test_parse_page_wiki_str("[xowa-cmd:\"a\" z]" , "z" + img + ""); - fxt.Test_parse_page_wiki_str("[xowa-cmd:\"a.b('c_d');\" z]" , "z" + img + ""); - fxt.Test_parse_page_wiki_str("[xowa-cmd:*\"a\"b*c\"* z]" , "z" + img + ""); - fxt.Wiki().Sys_cfg().Xowa_proto_enabled_(false); - fxt.Test_parse_page_wiki_str("[xowa-cmd:\"a\" b]" , "[xowa-cmd:"a" b]"); // protocol is disabled: literalize String (i.e.: don't make it an anchor) - } @Test public void List_1_itm() { fxt.Test_parse_page_wiki_str("*a", String_.Concat_lines_nl_skip_last ( "
    " diff --git a/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wkr.java b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wkr.java new file mode 100644 index 000000000..d50465225 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wkr.java @@ -0,0 +1,31 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.html; import gplx.*; import gplx.xowa.*; +import gplx.xowa.files.*; +public interface Xoh_lnki_file_wkr { + void Write_img_full(Bry_bfr bfr, Xof_xfer_itm xfer_itm, int elem_id, byte[] link_ref, byte[] html_view_src, int html_w, int html_h, byte[] lnki_alt_text, byte[] lnki_ttl, byte[] anchor_cls, byte[] anchor_rel, byte[] anchor_title, byte[] itm_cls); +} +class Xoh_lnki_file_wkr_basic implements Xoh_lnki_file_wkr { + private Bry_fmtr img_full_fmtr; + public void Init(Bry_fmtr img_full_fmtr) { + this.img_full_fmtr = img_full_fmtr; + } + public void Write_img_full(Bry_bfr bfr, Xof_xfer_itm xfer_itm, int elem_id, byte[] lnki_href, byte[] html_view_src, int html_w, int html_h, byte[] lnki_alt_text, byte[] lnki_ttl, byte[] anchor_cls, byte[] anchor_rel, byte[] anchor_title, byte[] itm_cls) { + img_full_fmtr.Bld_bfr_many(bfr, elem_id, lnki_href, html_view_src, html_w, html_h, lnki_alt_text, lnki_ttl, anchor_cls, anchor_rel, anchor_title, itm_cls); + } +} diff --git a/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java index c00b59619..8a16bca33 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_lnki_file_wtr.java @@ -17,11 +17,13 @@ along with this program. If not, see . */ package gplx.xowa.html; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; -import gplx.xowa.parsers.lnkis.*; +import gplx.xowa.parsers.lnkis.*; public class Xoh_lnki_file_wtr { + private Xoh_lnki_file_wkr_basic lnki_file_wkr_basic = new Xoh_lnki_file_wkr_basic(); public Xoh_lnki_file_wtr(Xow_wiki wiki, Xow_html_mgr html_mgr, Xoh_html_wtr html_wtr) { this.html_mgr = html_mgr; this.wiki = wiki; this.html_wtr = html_wtr; bfr_mkr = wiki.Utl_bry_bfr_mkr(); + lnki_file_wkr_basic.Init(html_mgr.Lnki_full_image()); } private Xow_html_mgr html_mgr; private boolean lnki_title_enabled; private Xow_wiki wiki; private Xoh_html_wtr html_wtr; private Xoh_lnki_txt_fmtr media_alt_fmtr = new Xoh_lnki_txt_fmtr(), caption_fmtr = new Xoh_lnki_txt_fmtr(); private Bry_bfr_mkr bfr_mkr; @@ -42,7 +44,7 @@ public class Xoh_lnki_file_wtr { public Xof_xfer_itm Lnki_eval(Xop_ctx ctx, Xof_xfer_queue queue, byte[] lnki_ttl, byte lnki_type, int lnki_w, int lnki_h, double lnki_upright, double lnki_thumbtime, int lnki_page, boolean lnki_is_media_ns, Bool_obj_ref queue_add_ref) { this.ctx = ctx; queue_add_ref.Val_n_(); - tmp_xfer_itm.Clear().Atrs_by_ttl(lnki_ttl, Bry_.Empty).Atrs_by_lnki(lnki_type, lnki_w, lnki_h, lnki_upright, lnki_thumbtime, lnki_page); + tmp_xfer_itm.Clear().Init_by_lnki(lnki_ttl, Bry_.Empty, lnki_type, lnki_w, lnki_h, lnki_upright, lnki_thumbtime, lnki_page); boolean found = Find_file(ctx, tmp_xfer_itm); boolean file_queue_add = File_queue_add(wiki, tmp_xfer_itm, lnki_is_media_ns, found); Xof_xfer_itm rv = tmp_xfer_itm; @@ -102,7 +104,7 @@ public class Xoh_lnki_file_wtr { byte[] html_orig_src = xfer_itm.Html_orig_src(); byte[] html_view_src = xfer_itm.Html_view_src(); byte[] content = Bry_.Empty; - byte[] lnki_ttl = lnki.Ttl().Page_txt(); + byte[] lnki_ttl = lnki.Ttl().Page_txt(); Xof_ext lnki_ext = xfer_itm.Lnki_ext(); if ( html_mgr.Img_suppress_missing_src() // option to suppress src when file is missing && !xfer_itm.Html_pass() // file is missing; wipe values and wait for "correct" info before regenerating; mostly to handle unknown redirects @@ -152,9 +154,10 @@ public class Xoh_lnki_file_wtr { byte[] anchor_title = lnki_title_enabled ? Make_anchor_title(tmp_bfr, src, lnki, lnki_ttl, anchor_title_wkr) // NOTE: Make_anchor_title should only be called if there is no caption, else refs may not show; DATE:2014-03-05 : Bry_.Empty; + Xoh_lnki_file_wkr lnki_file_wkr = lnki.Lnki_file_wkr(); if (lnki_file_wkr == null) lnki_file_wkr = lnki_file_wkr_basic; if (Xop_lnki_type.Id_is_thumbable(lnki.Lnki_type())) { // is "thumb" if (bfr.Len() > 0) bfr.Add_byte_nl(); - content = Image_thumb(src, hctx, lnki, xfer_itm, elem_id, lnki_href, html_view_src, html_orig_src, lnki_alt_text, lnki_ttl, anchor_title); + content = Image_thumb(lnki_file_wkr, src, hctx, lnki, xfer_itm, elem_id, lnki_href, html_view_src, html_orig_src, lnki_alt_text, lnki_ttl, anchor_title); html_mgr.Lnki_thumb_core().Bld_bfr_many(bfr, div_width, lnki_halign_bry, content, elem_id); } else { @@ -164,7 +167,6 @@ public class Xoh_lnki_file_wtr { Caption(src, lnki, Xoh_html_wtr_ctx.Alt, html_orig_src).XferAry(tmp_bfr, 0); lnki_alt_text = tmp_bfr.XtoAryAndClear(); } -// if (lnki_img_type == Xop_lnki_type.Id_none) bfr.Add(Bry_div_float_none).Add_byte_nl(); switch (lnki.Align_h()) { case Xop_lnki_align_h.Left: bfr.Add(Bry_div_float_left).Add_byte_nl(); break; case Xop_lnki_align_h.Right: bfr.Add(Bry_div_float_right).Add_byte_nl(); break; @@ -172,7 +174,7 @@ public class Xoh_lnki_file_wtr { } Arg_nde_tkn lnki_link_tkn = lnki.Link_tkn(); if (lnki_link_tkn == Arg_nde_tkn.Null) - html_mgr.Lnki_full_image().Bld_bfr_many(bfr, elem_id, lnki_href, html_view_src, xfer_itm.Html_w(), xfer_itm.Html_h(), lnki_alt_text, lnki_ttl, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, Img_cls(lnki)); + lnki_file_wkr.Write_img_full(bfr, xfer_itm, elem_id, lnki_href, html_view_src, xfer_itm.Html_w(), xfer_itm.Html_h(), lnki_alt_text, lnki_ttl, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, Img_cls(lnki)); else { Arg_itm_tkn link_tkn = lnki_link_tkn.Val_tkn(); byte[] link_ref = link_tkn.Dat_to_bry(src); @@ -180,7 +182,7 @@ public class Xoh_lnki_file_wtr { link_ref = link_ref_new == null ? lnki_href: link_ref_new; // if parse fails, then assign to lnki_href; EX:link={{{1}}} link_ref = ctx.App().Encoder_mgr().Href_quotes().Encode(link_ref); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16 lnki_ttl = Bry_.Coalesce(lnki_ttl, tmp_link_parser.Html_xowa_ttl()); - html_mgr.Lnki_full_image().Bld_bfr_many(bfr, elem_id, link_ref, html_view_src, xfer_itm.Html_w(), xfer_itm.Html_h(), lnki_alt_text, lnki_ttl, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, Img_cls(lnki)); + lnki_file_wkr.Write_img_full(bfr, xfer_itm, elem_id, link_ref, html_view_src, xfer_itm.Html_w(), xfer_itm.Html_h(), lnki_alt_text, lnki_ttl, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, Img_cls(lnki)); } switch (lnki.Align_h()) { case Xop_lnki_align_h.Left: @@ -220,13 +222,13 @@ public class Xoh_lnki_file_wtr { html_mgr.Lnki_thumb_file_video().Bld_bfr_many(tmp_bfr, Play_btn(elem_id, play_btn_width, play_btn_width, html_orig_src, lnki.Ttl().Page_txt()), Img_thumb(lnki, xfer_itm, elem_id, lnki_href, html_view_src, lnki_alt_text), Bry_.Empty, Bry_.Empty); return tmp_bfr.Mkr_rls().XtoAryAndClear(); } - private byte[] Image_thumb(byte[] src, Xoh_html_wtr_ctx hctx, Xop_lnki_tkn lnki, Xof_xfer_itm xfer_itm, int elem_id, byte[] lnki_href, byte[] html_view_src, byte[] html_orig_src, byte[] lnki_alt_text, byte[] lnki_ttl, byte[] anchor_title) { + private byte[] Image_thumb(Xoh_lnki_file_wkr lnki_file_wkr, byte[] src, Xoh_html_wtr_ctx hctx, Xop_lnki_tkn lnki, Xof_xfer_itm xfer_itm, int elem_id, byte[] lnki_href, byte[] html_view_src, byte[] html_orig_src, byte[] lnki_alt_text, byte[] lnki_ttl, byte[] anchor_title) { byte[] lnki_alt_html = Alt_html(src, lnki); Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); byte[] lnki_class = xfer_itm.Html_pass() ? Xow_html_mgr.Bry_img_class_thumbimage : Xow_html_mgr.Bry_img_class_none; - html_mgr.Lnki_full_image().Bld_bfr_many(tmp_bfr, elem_id, lnki_href, html_view_src, xfer_itm.Html_w(), xfer_itm.Html_h(), lnki_alt_text, lnki_ttl, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_class); + lnki_file_wkr.Write_img_full(tmp_bfr, xfer_itm, elem_id, lnki_href, html_view_src, xfer_itm.Html_w(), xfer_itm.Html_h(), lnki_alt_text, lnki_ttl, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_class); byte[] thumb = tmp_bfr.XtoAryAndClear(); if (!wiki.Html_mgr().Imgs_mgr().Alt_in_caption().Val()) lnki_alt_html = Bry_.Empty; html_mgr.Lnki_thumb_file_image().Bld_bfr_many(tmp_bfr, thumb, Caption_div(src, lnki, html_orig_src, lnki_href), lnki_alt_html); diff --git a/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java index fef09a4c4..195a692c7 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_lnki_wtr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html; import gplx.*; import gplx.xowa.*; -import gplx.xowa.files.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.users.history.*; import gplx.xowa.xtns.pfuncs.ttls.*; +import gplx.html.*; import gplx.xowa.files.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.users.history.*; import gplx.xowa.xtns.pfuncs.ttls.*; public class Xoh_lnki_wtr { private Xoa_app app; private Xow_wiki wiki; private Xoa_page page; private Xop_ctx ctx; private Xoh_html_wtr_cfg cfg; @@ -72,14 +72,17 @@ public class Xoh_lnki_wtr { public void Write_plain_by_tkn(Bry_bfr bfr, Xoh_html_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xoa_ttl lnki_ttl) { Write_plain(bfr, hctx, src, lnki, lnki_ttl, caption_tkn_wtr); } + public void Write_caption(Bry_bfr bfr, Xoh_html_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xoa_ttl lnki_ttl) { + Write_caption(bfr, ctx, hctx, src, lnki, lnki.Ttl_ary(), true, caption_tkn_wtr); + } private void Write_plain(Bry_bfr bfr, Xoh_html_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xoa_ttl lnki_ttl, Xop_lnki_caption_wtr caption_wkr) { byte[] ttl_bry = lnki.Ttl_ary(); if (Bry_.Len_eq_0(ttl_bry)) ttl_bry = lnki_ttl.Full_txt_raw(); // NOTE: handles ttls like [[fr:]] and [[:fr;]] which have an empty Page_txt, but a valued Full_txt_raw if (Bry_.Eq(lnki_ttl.Full_txt(), page.Ttl().Full_txt())) { // lnki is same as pagename; bold; SEE: Month widget on day pages will bold current day; PAGE:en.w:January 1 if (lnki_ttl.Anch_bgn() == -1 && Bry_.Eq(lnki_ttl.Wik_txt(), page.Ttl().Wik_txt())) { // only bold if lnki is not pointing to anchor on same page; PAGE:en.w:Comet; [[Comet#Physical characteristics|ion tail]] - bfr.Add(Xoh_consts.B_bgn); + bfr.Add(Html_tag_.B_lhs); Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); - bfr.Add(Xoh_consts.B_end); + bfr.Add(Html_tag_.B_rhs); return; } } diff --git a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java index 7f31e99d4..48a946cbd 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_page_wtr_wkr_.java @@ -21,7 +21,7 @@ public class Xoh_page_wtr_wkr_ { public static byte[] Bld_page_content_sub(Xoa_app app, Xow_wiki wiki, Xoa_page page, Bry_bfr tmp_bfr) { byte[] page_content_sub = page.Html_data().Content_sub(); // contentSub exists; SEE: {{#isin}} byte[] redirect_msg = Xop_redirect_mgr.Bld_redirect_msg(app, wiki, page); - return tmp_bfr.Concat_skip_empty(Xoh_consts.Br, page_content_sub, redirect_msg).XtoAryAndClear(); + return tmp_bfr.Concat_skip_empty(Html_tag_.Br_inl, page_content_sub, redirect_msg).XtoAryAndClear(); } public static byte[] Bld_page_name(Bry_bfr tmp_bfr, Xoa_ttl ttl, byte[] display_ttl) { if (display_ttl != null) return display_ttl; // display_ttl explicitly set; use it diff --git a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java index ff1925c1a..bc97e49be 100644 --- a/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/html/Xow_html_mgr.java @@ -57,85 +57,85 @@ public class Xow_html_mgr implements GfoInvkAble { public Xoctg_html_mgr Ns_ctg() {return ns_ctg;} private Xoctg_html_mgr ns_ctg = new Xoctg_html_mgr(); public Xoh_imgs_mgr Imgs_mgr() {return imgs_mgr;} private Xoh_imgs_mgr imgs_mgr; public Bry_fmtr Lnki_full_image() {return lnki_full_image;} Bry_fmtr lnki_full_image = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "\"~{alt}\"" - ), "elem_id", "href", "src", "width", "height", "alt", "lnki_title", "anchor_class", "anchor_rel", "anchor_title", "img_class" - ); + ( "\"~{alt}\"" + ), "elem_id", "href", "src", "width", "height", "alt", "lnki_title", "anchor_class", "anchor_rel", "anchor_title", "img_class" + ); public Bry_fmtr Lnki_full_media() {return lnki_full_media;} Bry_fmtr lnki_full_media = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "~{lnki_caption}" - , "" - ), "lnki_src", "lnki_title", "lnki_caption" - ); + ( "~{lnki_caption}" + , "" + ), "lnki_src", "lnki_title", "lnki_caption" + ); public Bry_fmtr Lnki_thumb_core() {return lnki_thumb_core;} Bry_fmtr lnki_thumb_core = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last // REF.MW: Linker.php|makeImageLink2 - ( "
    " - , "
    " - , "~{lnki_content}" - , "
    " - , "
    " - , "" - ), "div_width", "lnki_halign", "lnki_content", "elem_id" - ); + ( "
    " + , "
    " + , "~{lnki_content}" + , "
    " + , "
    " + , "" + ), "div_width", "lnki_halign", "lnki_content", "elem_id" + ); public Bry_fmtr Lnki_thumb_file_image() {return lnki_thumb_file_image;} Bry_fmtr lnki_thumb_file_image = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( " ~{thumb_image}~{lnki_caption}~{lnki_alt}" - ), "thumb_image", "lnki_caption", "lnki_alt"); + ( " ~{thumb_image}~{lnki_caption}~{lnki_alt}" + ), "thumb_image", "lnki_caption", "lnki_alt"); public Bry_fmtr Lnki_thumb_file_video() {return lnki_thumb_file_video;} Bry_fmtr lnki_thumb_file_video = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "
    ~{video_thumb}~{play_btn}" - , "
    ~{lnki_caption}~{lnki_alt}" - ), "play_btn", "video_thumb", "lnki_caption", "lnki_alt"); + ( "
    ~{video_thumb}~{play_btn}" + , "
    ~{lnki_caption}~{lnki_alt}" + ), "play_btn", "video_thumb", "lnki_caption", "lnki_alt"); public Bry_fmtr Lnki_thumb_file_audio() {return lnki_thumb_file_audio;} Bry_fmtr lnki_thumb_file_audio = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "
    ~{play_btn}~{info_btn}" - , "
    ~{lnki_caption}~{lnki_alt}" - ), "play_btn", "info_btn", "lnki_caption", "lnki_alt"); + ( "
    ~{play_btn}~{info_btn}" + , "
    ~{lnki_caption}~{lnki_alt}" + ), "play_btn", "info_btn", "lnki_caption", "lnki_alt"); public Bry_fmtr Lnki_thumb_part_image() {return lnki_thumb_part_image;} Bry_fmtr lnki_thumb_part_image = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
    " - , " " - , " \"~{lnki_alt}\"" - , " " - , "
    " - ), "elem_id", "lnki_class", "lnki_href", "lnki_title", "lnki_src", "lnki_width", "lnki_height", "lnki_alt"); + ( "" + , "
    " + , " " + , " \"~{lnki_alt}\"" + , " " + , "
    " + ), "elem_id", "lnki_class", "lnki_href", "lnki_title", "lnki_src", "lnki_width", "lnki_height", "lnki_alt"); public Bry_fmtr Lnki_thumb_part_caption() {return lnki_thumb_part_caption;} Bry_fmtr lnki_thumb_part_caption = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
    ~{magnify_btn}" - , " ~{lnki_caption}" - , "
    " - ), "magnify_btn", "lnki_caption"); + ( "" + , "
    ~{magnify_btn}" + , " ~{lnki_caption}" + , "
    " + ), "magnify_btn", "lnki_caption"); public Bry_fmtr Lnki_thumb_part_alt() {return lnki_thumb_part_alt;} Bry_fmtr lnki_thumb_part_alt = Bry_fmtr.new_ - (String_.Concat_lines_nl_skip_last - ( "" - , "
    " - , "
    " - , "~{alt_html}" - , "
    " - ) - , "alt_html"); + (String_.Concat_lines_nl_skip_last + ( "" + , "
    " + , "
    " + , "~{alt_html}" + , "
    " + ) + , "alt_html"); public Bry_fmtr Lnki_thumb_part_magnfiy_btn() {return lnki_thumb_part_magnify_btn;} Bry_fmtr lnki_thumb_part_magnify_btn = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
    " - , " " - , " \"\"" - , " " - , "
    " - ), "magnify_icon", "lnki_src", "lnki_enlarge_msg"); + ( "" + , "
    " + , " " + , " \"\"" + , " " + , "
    " + ), "magnify_icon", "lnki_src", "lnki_enlarge_msg"); public Bry_fmtr Lnki_thumb_part_play_btn() {return lnki_thumb_part_play_btn;} Bry_fmtr lnki_thumb_part_play_btn = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
    " - , " " - , " \"Play" - , " " - , "
    " - ), "play_id", "play_icon", "play_width", "play_max_width", "lnki_url", "lnki_title"); + ( "" + , "
    " + , " " + , " \"Play" + , " " + , "
    " + ), "play_id", "play_icon", "play_width", "play_max_width", "lnki_url", "lnki_title"); public Bry_fmtr Lnki_thumb_part_info_btn() {return lnki_thumb_part_info_btn;} Bry_fmtr lnki_thumb_part_info_btn = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
    " - , " " - , " " - , " " - , "
    " - ), "info_icon", "lnki_href"); + ( "" + , "
    " + , " " + , " " + , " " + , "
    " + ), "info_icon", "lnki_href"); public Bry_fmtr Plain() {return plain;} Bry_fmtr plain = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "~{val}" - ), "val"); + ( "~{val}" + ), "val"); public void Copy_cfg(Xow_html_mgr html_mgr) {imgs_mgr.Copy_cfg(html_mgr.Imgs_mgr());} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_lnki_full_image_)) lnki_full_image.Fmt_(m.ReadBry("v")); diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__globals.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__globals.java index 7f4edb96d..3c8dce613 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__globals.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__globals.java @@ -65,12 +65,12 @@ public class Xoh_module_itm__globals implements Xoh_module_itm { bfr.Add_byte(Byte_ascii.Brack_bgn).Add_byte(Byte_ascii.Apos).Add_byte(Byte_ascii.Apos); for (int i = january_id; i <= december_id; i++) { bfr.Add_byte(Byte_ascii.Comma).Add_byte(Byte_ascii.Space).Add_byte(Byte_ascii.Apos); - bfr.Add(msg_mgr.Val_by_id(i)); + bfr.Add(Bry_.Replace(msg_mgr.Val_by_id(i), Byte_ascii.Apos_bry, Apos_escape)); bfr.Add_byte(Byte_ascii.Apos); } bfr.Add_byte(Byte_ascii.Brack_end); return bfr.XtoAryAndClear(); - } + } private static final byte[] Apos_escape = Bry_.new_ascii_("\\'"); private static byte[] Html_js_table_num_format_separators(Bry_bfr bfr, Xol_transform_mgr separator_mgr) { byte[] dec_spr = separator_mgr.Get_val_or_self(Xol_num_mgr.Separators_key__dec); bfr.Add_byte(Byte_ascii.Brack_bgn) .Add_byte(Byte_ascii.Apos).Add(dec_spr).Add_byte(Byte_ascii.Tab).Add_byte(Byte_ascii.Dot).Add_byte(Byte_ascii.Apos); diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java index 2c44a5050..952ab8f04 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java @@ -20,6 +20,7 @@ import gplx.xowa.gui.*; import gplx.xowa.apis.xowa.html.modules.*; public class Xoh_module_itm__popups implements Xoh_module_itm { public boolean Enabled() {return enabled;} public void Enabled_y_() {enabled = true;} public void Enabled_(boolean v) {enabled = v;} private boolean enabled; + public boolean Bind_hover_area() {return bind_hover_area;} public void Bind_hover_area_(boolean v) {bind_hover_area = v;} private boolean bind_hover_area; public void Clear() {enabled = false;} public byte[] Key() {return Key_const;} private static final byte[] Key_const = Bry_.new_ascii_("popups"); public void Write_css_script(Xoa_app app, Xow_wiki wiki, Xoa_page page, Xoh_module_wtr wtr) {} @@ -51,6 +52,7 @@ public class Xoh_module_itm__popups implements Xoh_module_itm { wtr.Write_js_global_ini_atr_val(Key_win_max_h , api_popups.Win_max_h()); wtr.Write_js_global_ini_atr_val(Key_win_show_all_max_w , api_popups.Win_show_all_max_w()); wtr.Write_js_global_ini_atr_val(Key_win_bind_focus_blur , api_popups.Win_bind_focus_blur()); + wtr.Write_js_global_ini_atr_val(Key_win_bind_hover_area , bind_hover_area); } private static byte[] Css_url, Js_line_2; private static final byte[] @@ -63,5 +65,6 @@ public class Xoh_module_itm__popups implements Xoh_module_itm { , Key_win_max_h = Bry_.new_ascii_("popups-win-max_h") , Key_win_show_all_max_w = Bry_.new_ascii_("popups-win-show_all_max_w") , Key_win_bind_focus_blur = Bry_.new_ascii_("popups-win-bind_focus_blur") + , Key_win_bind_hover_area = Bry_.new_ascii_("popups-win-bind_hover_area") ; } diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr_tst.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr_tst.java index 1c38fd102..b0f0fd847 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr_tst.java @@ -40,7 +40,7 @@ public class Xoh_module_mgr_tst { , " 'toc-enabled' : true," , " 'mw_hidetoc' : '0'," , " 'showtoc' : 'Sh\"ow'," - , " 'hidetoc' : 'Hi''de'," + , " 'hidetoc' : 'Hi\\'de'," , " }" , " " )); diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr.java index 0709092ed..3c55c29ba 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr.java @@ -92,7 +92,7 @@ public class Xoh_module_wtr { private void Write_js_global_ini_atr(byte[] key, boolean quote_val, byte[] val) { Write_js_global_ini_atr_bgn(key); if (quote_val) - Write_quote(Byte_ascii.Apos, val); + Write_js_quote(Byte_ascii.Apos, val); else bfr.Add(val); bfr.Add_byte(Byte_ascii.Comma); @@ -115,7 +115,7 @@ public class Xoh_module_wtr { bfr.Add(key); bfr.Add(Js_var_mid); if (quote_val) - Write_quote(Byte_ascii.Apos, val); + Write_js_quote(Byte_ascii.Apos, val); else bfr.Add(val); bfr.Add(Js_var_end); @@ -124,12 +124,12 @@ public class Xoh_module_wtr { Indent(); bfr.Add(v); } - private void Write_quote(byte quote_byte, byte[] val) { + private void Write_js_quote(byte quote_byte, byte[] val) { int val_len = val.length; bfr.Add_byte(quote_byte); for (int i = 0; i < val_len; i++) { byte b = val[i]; - if (b == quote_byte) bfr.Add_byte(b); // double up quotes + if (b == quote_byte) bfr.Add_byte_backslash(); // escape quote bfr.Add_byte(b); } bfr.Add_byte(quote_byte); diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr_tst.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr_tst.java index aa7de2193..7c36a9b75 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_wtr_tst.java @@ -38,7 +38,7 @@ public class Xoh_module_wtr_tst { , "var xowa_global_values = {" , " 'key_1' : 'val_1'," , " 'key_2' : 'val_2'," - , " 'key_3' : 'apos_''_1'," + , " 'key_3' : 'apos_\\'_1'," , "}" )); } diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder.java new file mode 100644 index 000000000..16e9d45c0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder.java @@ -0,0 +1,69 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; +class Xow_popup_anchor_finder { + private byte[] src, find; + private int src_len, nl_lhs; + public int Find(byte[] src, int src_len, byte[] find, int bgn) { + this.src = src; this.src_len = src_len; this.find = find; this.nl_lhs = bgn; + if (bgn == Xop_parser_.Doc_bgn_bos && Find_hdr(bgn)) return Xop_parser_.Doc_bgn_bos;// handle BOS separately which won't fit "\n=" search below; EX: "BOS==A==\n" + int lhs_bgn = bgn; + while (true) { + lhs_bgn = Bry_finder.Find_fwd(src, Hdr_bgn, nl_lhs, src_len); + if (lhs_bgn == Bry_.NotFound) break; // "\n=" not found; exit; + if (Find_hdr(lhs_bgn)) return lhs_bgn; + } + return Find_id(bgn); + } + private boolean Find_hdr(int lhs_bgn) { + int nl_rhs = Bry_finder.Find_fwd(src, Byte_ascii.NewLine, nl_lhs + 1, src_len); // look for \n + if (nl_rhs == Bry_finder.Not_found) nl_rhs = src_len - 1; // no more \n; set to last idx + nl_lhs = nl_rhs; // update nl_lhs for loop + int lhs_end = Bry_finder.Find_fwd_while(src, lhs_bgn + 1, nl_rhs, Byte_ascii.Eq); // skip eq; EX: "\n==="; +1 to skip eq + int rhs_end = Bry_finder.Trim_bwd_space_tab(src, nl_rhs, lhs_end); // skip ws bwd; EX: "== \n" + int rhs_bgn = Bry_finder.Find_bwd_while(src, rhs_end, lhs_end, Byte_ascii.Eq); // skip eq; EX: "==\n" -> pos before = + if (rhs_bgn < lhs_end) return false; // eq found, but is actually lhs_eq; no rhs_eq, so exit; EX: "\n== \n" + ++rhs_bgn; // rhs_bgn is 1st char before eq; position at eq; neede for txt_end below + int txt_bgn = Bry_finder.Trim_fwd_space_tab(src, lhs_end, nl_rhs); // trim ws + int txt_end = Bry_finder.Trim_bwd_space_tab(src, rhs_bgn, lhs_end); // trim ws + return Bry_.Eq(find, src, txt_bgn, txt_end); // check for strict match + } + private int Find_id(int bgn) { + byte[] quoted = Bry_.Add(Byte_ascii.Quote_bry, find, Byte_ascii.Quote_bry); + int rv = Find_id_by_quoted(bgn, quoted); + if (rv == Bry_finder.Not_found) { + quoted[0] = Byte_ascii.Apos; quoted[quoted.length - 1] = Byte_ascii.Apos; + rv = Find_id_by_quoted(bgn, quoted); + } + return rv; + } + private int Find_id_by_quoted(int bgn, byte[] quoted) { + int rv = Bry_finder.Not_found; + int pos = Bry_finder.Find_fwd(src, quoted, bgn); + if (pos == Bry_finder.Not_found) return rv; + pos = Bry_finder.Trim_bwd_space_tab(src, pos, bgn); + if (src[pos - 1] != Byte_ascii.Eq) return rv; + int id_end = Bry_finder.Trim_bwd_space_tab(src, pos - 1, bgn); + int id_bgn = Bry_finder.Find_bwd_ws(src, id_end - 1, bgn); + boolean id_match = Int_.Bounds_chk(id_bgn, id_end, src_len) && Bry_.Eq(Id_bry, src, id_bgn + 1, id_end); + if (!id_match) return rv; + rv = Bry_finder.Find_bwd(src, Byte_ascii.NewLine, id_bgn); + return rv == Bry_finder.Not_found ? 0 : rv; + } + private static final byte[] Hdr_bgn = Bry_.new_ascii_("\n="), Id_bry = Bry_.new_ascii_("id"); +} diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_hdr_finder_tst.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder__hdr_tst.java similarity index 75% rename from 400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_hdr_finder_tst.java rename to 400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder__hdr_tst.java index fb8d0f34f..990c5f298 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_hdr_finder_tst.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder__hdr_tst.java @@ -19,7 +19,7 @@ package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import import org.junit.*; import gplx.xowa.apis.xowa.html.modules.*; import gplx.xowa.gui.views.*; -public class Xow_popup_hdr_finder_tst { +public class Xow_popup_anchor_finder__hdr_tst { @Before public void init() {fxt.Clear();} private Xop_popup_hdr_finder_fxt fxt = new Xop_popup_hdr_finder_fxt(); @Test public void Basic() { String src_str = String_.Concat_lines_nl_skip_last @@ -27,7 +27,7 @@ public class Xow_popup_hdr_finder_tst { , "==b1==" , "c" ); - fxt.Test_find(src_str, "b1", 2); + fxt.Test_find(src_str, "b1", 1); fxt.Test_find_not(src_str, "b"); fxt.Test_find_not(src_str, "a"); } @@ -39,25 +39,41 @@ public class Xow_popup_hdr_finder_tst { , "==d==" , "e" ); - fxt.Test_find(src_str, "d", 10); + fxt.Test_find(src_str, "d", 9); } @Test public void Eos() { String src_str = String_.Concat_lines_nl_skip_last ( "a" , "==b==" ); - fxt.Test_find(src_str, "b", 2); + fxt.Test_find(src_str, "b", 1); } @Test public void Bos() { String src_str = String_.Concat_lines_nl_skip_last ( "==a==" , "b" ); - fxt.Test_find(src_str, "a", 0); + fxt.Test_find(src_str, "a", -1); + } + @Test public void Trim() { + String src_str = String_.Concat_lines_nl_skip_last + ( "a" + , "== b ==" + , "c" + ); + fxt.Test_find(src_str, "b", 1); + } + @Test public void Ws() { + String src_str = String_.Concat_lines_nl_skip_last + ( "a" + , "== b c ==" + , "d" + ); + fxt.Test_find(src_str, "b c", 1); } } class Xop_popup_hdr_finder_fxt { - private Xow_popup_hdr_finder finder = new Xow_popup_hdr_finder(); + private Xow_popup_anchor_finder finder = new Xow_popup_anchor_finder(); public void Clear() { } public void Test_find_not(String src_str, String hdr_str) {Test_find(src_str, hdr_str, Bry_finder.Not_found);} diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder__id_tst.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder__id_tst.java new file mode 100644 index 000000000..67be361b5 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_anchor_finder__id_tst.java @@ -0,0 +1,50 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; +import org.junit.*; +import gplx.xowa.apis.xowa.html.modules.*; +import gplx.xowa.gui.views.*; +public class Xow_popup_anchor_finder__id_tst { + @Before public void init() {fxt.Clear();} private Xop_popup_hdr_finder_fxt fxt = new Xop_popup_hdr_finder_fxt(); + @Test public void Basic() { + String src_str = String_.Concat_lines_nl_skip_last + ( "b" + , "" + , "c" + ); + fxt.Test_find(src_str, "a", 1); + fxt.Test_find_not(src_str, "b"); + fxt.Test_find_not(src_str, "c"); + } + @Test public void Ws() { + String src_str = String_.Concat_lines_nl_skip_last + ( "b" + , "" + , "c" + ); + fxt.Test_find(src_str, "a", 1); + } + @Test public void Fail() { + String src_str = String_.Concat_lines_nl_skip_last + ( "b" + , "" + , "c" + ); + fxt.Test_find_not(src_str, "a"); + } +} diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_hdr_finder.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_hdr_finder.java deleted file mode 100644 index 662b17204..000000000 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_hdr_finder.java +++ /dev/null @@ -1,49 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; -class Xow_popup_hdr_finder { - private byte[] src, hdr; - private int src_len; - private int nl_pos; - public int Find(byte[] src, int src_len, byte[] hdr, int bgn) { - this.src = src; this.src_len = src_len; this.hdr = hdr; - int lhs_bgn = bgn; - while (true) { - boolean found = Find_hdr(lhs_bgn); - if (found) return lhs_bgn; - lhs_bgn = Bry_finder.Find_fwd(src, Hdr_bgn, nl_pos, src_len); - if (lhs_bgn == Bry_.NotFound) break; // "\n=" not found; exit; - ++lhs_bgn; // skip \n - } - return Bry_finder.Not_found; - } - private boolean Find_hdr(int lhs_bgn) { - nl_pos = Bry_finder.Find_fwd(src, Byte_ascii.NewLine, lhs_bgn, src_len); // look for \n - if (nl_pos == Bry_finder.Not_found) nl_pos = src_len - 1; // no more \n; set to last idx - int lhs_end = Bry_finder.Find_fwd_while(src, lhs_bgn, nl_pos, Byte_ascii.Eq); // skip eq; EX: "\n===" - int rhs_end = Bry_finder.Find_bwd_non_ws_or_end(src, nl_pos, lhs_end); // skip ws bwd; EX: "== \n" - int rhs_bgn = Bry_finder.Find_bwd_while(src, rhs_end, lhs_end, Byte_ascii.Eq); // skip eq - if (rhs_bgn < lhs_end) return false; // eq found, but < lhs_end; exit; EX: "\n== \n" - ++rhs_bgn; // rhs_bgn is 1st char before eq; position at eq; - if (rhs_end - rhs_bgn < 1) return false; // no eq; exit; EX: "\n==abc \n" - int txt_end = Bry_finder.Find_bwd_non_ws_or_end(src, rhs_bgn, lhs_end); // skip ws before ==; EX: "\n==a ==\n" - int txt_bgn = Bry_finder.Find_fwd_while_space_or_tab(src, lhs_end, nl_pos); // skip spaces after eq - return Bry_.Eq(hdr, src, txt_bgn, txt_end); // check for strict match - } - private static final byte[] Hdr_bgn = Bry_.new_ascii_("\n="); -} diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_itm.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_itm.java index 9a2e4bc1b..7a8ede190 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_itm.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_itm.java @@ -17,10 +17,11 @@ along with this program. If not, see . */ package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; public class Xow_popup_itm implements Cancelable { - public Xow_popup_itm(int id, byte[] page_href, int init_words_needed) { + public Xow_popup_itm(int id, byte[] page_href, byte[] tooltip, int init_words_needed) { this.popup_id = "popup_" + Int_.XtoStr(id); this.words_needed = init_words_needed; this.page_href = page_href; + this.tooltip = tooltip; } public boolean Canceled() {return canceled;} private boolean canceled = false; public void Cancel() {canceled = true;} @@ -39,6 +40,7 @@ public class Xow_popup_itm implements Cancelable { } public String Popup_id() {return popup_id;} private String popup_id; public byte[] Popup_html() {return popup_html;} public void Popup_html_(byte[] v) {popup_html = v;} private byte[] popup_html; + public byte[] Tooltip() {return tooltip;} private byte[] tooltip; public byte[] Wiki_domain() {return wiki_domain;} private byte[] wiki_domain; public byte[] Page_href() {return page_href;} private byte[] page_href; public Xoa_ttl Page_ttl() {return page_ttl;} private Xoa_ttl page_ttl; diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java index 4488573e6..77f2b050f 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_mgr.java @@ -60,11 +60,11 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { , Xoapi_popups.Evt_html_fmtr_popup_changed, Xoapi_popups.Evt_html_fmtr_viewed_changed, Xoapi_popups.Evt_html_fmtr_wiki_changed, Xoapi_popups.Evt_html_fmtr_next_sect_changed ); } - public String Show_init(byte[] href, int id) { + public String Show_init(int id, byte[] href, byte[] tooltip) { Xoa_page cur_page = Cur_page(); Xog_tab_itm tab = cur_page.Tab(); if (tab != null && tab.Tab_is_loading()) return ""; // NOTE: tab is null when previewing - Xow_popup_itm itm = new Xow_popup_itm(id, href, show_init_word_count); + Xow_popup_itm itm = new Xow_popup_itm(id, href, tooltip, show_init_word_count); String rv = String_.new_utf8_(Get_popup_html(cur_page, itm)); return tab != null && tab.Tab_is_loading() ? "" : rv; } @@ -84,7 +84,7 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { if (Bry_.HasAtBgn(href, gplx.xowa.parsers.lnkes.Xop_lnke_wkr.Bry_xowa_protocol)) return null; // ignore xowa-cmd synchronized (async_thread_guard) { if (async_itm != null) async_itm.Cancel(); - async_itm = new Xow_popup_itm(++async_id_next, href, show_init_word_count); + async_itm = new Xow_popup_itm(++async_id_next, href, Bry_.Empty, show_init_word_count); String id_str = async_itm.Popup_id(); ThreadAdp_.invk_(id_str, this, Invk_show_popup_async).Start(); return id_str; @@ -98,12 +98,12 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { app.Href_parser().Parse(temp_href, itm.Page_href(), wiki, cur_page.Ttl().Page_url()); Xow_wiki popup_wiki = app.Wiki_mgr().Get_by_key_or_null(temp_href.Wiki()); popup_wiki.Init_assert(); - Xoa_ttl popup_ttl = Xoa_ttl.parse_(popup_wiki, temp_href.Page()); + Xoa_ttl popup_ttl = Xoa_ttl.parse_(popup_wiki, temp_href.Page_and_anchor()); if (ns_allowed_regy.Count() > 0 && !ns_allowed_regy.Has(ns_allowed_regy_key.Val_(popup_ttl.Ns().Id()))) return Bry_.Empty; itm.Init(popup_wiki.Domain_bry(), popup_ttl); Xoa_page popup_page = popup_wiki.Data_mgr().Get_page(popup_ttl, false); byte[] rv = popup_wiki.Html_mgr().Module_mgr().Popup_mgr().Parser().Parse(wiki, popup_page, cur_page.Tab(), itm); - Xog_win_itm__prog_href_mgr.Hover(app, cur_page, String_.new_utf8_(itm.Page_href())); // set page ttl again in prog bar; DATE:2014-06-28 + Update_progress_bar(app, cur_page, itm); return rv; } } @@ -112,6 +112,13 @@ public class Xow_popup_mgr implements GfoInvkAble, GfoEvObj { return null; } } + private static void Update_progress_bar(Xoa_app app, Xoa_page cur_page, Xow_popup_itm itm) { + byte[] href = itm.Page_href(); + byte[] tooltip = itm.Tooltip(); + if (Bry_.Len_gt_0(tooltip)) + href = Bry_.Add(tooltip); + Xog_win_itm__prog_href_mgr.Hover(app, cur_page, String_.new_utf8_(href)); // set page ttl again in prog bar; DATE:2014-06-28 + } public void Show_popup_html(String cbk, byte[] mode, Xow_popup_itm popup_itm) { Xog_tab_itm cur_tab = app.Gui_mgr().Browser_win().Active_tab(); cur_tab.Html_box().Html_js_eval_script(Xow_popup_mgr_.Bld_js_cmd(js_wtr, cbk, mode, popup_itm.Page_href(), popup_itm.Popup_html())); diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java index 0fd3f8bd9..b1df3a9bc 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser.java @@ -17,14 +17,14 @@ along with this program. If not, see . */ package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; import gplx.core.btries.*; -import gplx.xowa.apis.xowa.html.modules.*; -import gplx.xowa.gui.views.*; -import gplx.xowa.html.modules.popups.keeplists.*; +import gplx.xowa.apis.xowa.html.modules.*; import gplx.xowa.html.modules.popups.keeplists.*; +import gplx.xowa.gui.views.*; import gplx.xowa.parsers.hdrs.*; public class Xow_popup_parser { private Xoa_app app; private Xow_wiki wiki; private Xop_parser parser; private Btrie_fast_mgr tmpl_trie, wtxt_trie; private Xop_tkn_mkr tkn_mkr; private Xop_ctx tmpl_ctx; private Xop_root_tkn tmpl_root, wtxt_root; private Xot_compile_data tmpl_props = new Xot_compile_data(); private Xoh_html_wtr_ctx hctx = Xoh_html_wtr_ctx.Popup; + private Xow_popup_anchor_finder hdr_finder = new Xow_popup_anchor_finder(); public Xow_popup_cfg Cfg() {return cfg;} private Xow_popup_cfg cfg = new Xow_popup_cfg(); public Xow_popup_wrdx_mkr Wrdx_mkr() {return wrdx_mkr;} private Xow_popup_wrdx_mkr wrdx_mkr = new Xow_popup_wrdx_mkr(); public Xow_popup_html_mkr Html_mkr() {return html_mkr;} private Xow_popup_html_mkr html_mkr = new Xow_popup_html_mkr(); @@ -69,7 +69,8 @@ public class Xow_popup_parser { } public byte[] Parse(Xow_wiki cur_wiki, Xoa_page page, Xog_tab_itm cur_tab, Xow_popup_itm popup_itm) { // NOTE: must pass cur_wiki for xwiki label; DATE:2014-07-02 byte[] tmpl_src = page.Data_raw(); int tmpl_len = tmpl_src.length; if (tmpl_len == 0) return Bry_.Empty; - int tmpl_bgn = Xop_parser_.Doc_bgn_bos; + int tmpl_bgn_orig = Xow_popup_parser_.Tmpl_bgn_get_(app, popup_itm, page.Ttl(), hdr_finder, tmpl_src, tmpl_len); + int tmpl_bgn = tmpl_bgn_orig; int tmpl_read_len_cur = cfg.Tmpl_read_len(); wrdx_mkr.Init(); data.Init(cfg, popup_itm, tmpl_len); @@ -100,8 +101,8 @@ public class Xow_popup_parser { } tmpl_bgn = new_tmpl_bgn; data.Tmpl_loop_count_add(); - if ( tmpl_bgn == tmpl_len // end of template - || tmpl_bgn > data.Tmpl_max() // too much read; stop and give whatever's available + if ( tmpl_bgn == tmpl_len // end of template + || tmpl_bgn - tmpl_bgn_orig > data.Tmpl_max() // too much read; stop and give whatever's available ) break; } @@ -200,6 +201,13 @@ public class Xow_popup_parser { } } class Xow_popup_parser_ { + public static int Tmpl_bgn_get_(Xoa_app app, Xow_popup_itm itm, Xoa_ttl page_ttl, Xow_popup_anchor_finder hdr_finder, byte[] src, int src_len) { + int rv = Xop_parser_.Doc_bgn_bos; if (itm.Mode_all()) return rv; + byte[] anch = itm.Page_href()[0] == Byte_ascii.Hash ? Bry_.Mid(app.Encoder_mgr().Href().Decode(itm.Page_href()), 1) : page_ttl.Anch_txt(); + if (anch == null) return rv; + int hdr_bgn = hdr_finder.Find(src, src_len, anch, rv); // NOTE: starting search from Xop_parser_.Doc_bgn_bos + return hdr_bgn == Bry_finder.Not_found ? rv : hdr_bgn; + } public static int Calc_read_len(Xop_ctx ctx, int tmpl_read_cur, int tmpl_read_len, byte[] src, int bgn, int end) {// DATE:2014-07-19 int rv_default = tmpl_read_cur + tmpl_read_len; Xop_tkn_itm tkn = Get_expensive_dangling_tkn(ctx); diff --git a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java index dddb66efd..a81c6a407 100644 --- a/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java +++ b/400_xowa/src/gplx/xowa/html/modules/popups/Xow_popup_parser_tst.java @@ -370,6 +370,32 @@ public class Xow_popup_parser_tst { , "

    c

    " )); } + @Test public void Anchor() { + fxt.Test_parse(String_.Concat_lines_nl_skip_last + ( "a b c d" + , "" + , "== e ==" + , "f g h i" + ), "#e", String_.Concat_lines_nl_skip_last + ( "

    e

    " + , "" + , "

    f" + , "

    " + )); + } + @Test public void Anchor_underline() { + fxt.Test_parse(String_.Concat_lines_nl_skip_last + ( "a b c d" + , "" + , "== e f ==" + , "g h i" + ), "#e_f", String_.Concat_lines_nl_skip_last + ( "

    e f

    " + , "" + , "

    g" + , "

    " + )); + } @Test public void Tmpl_tkn_max() { fxt.Init_tmpl_tkn_max_(5).Init_page("Template:A", "a"); // eval fxt.Test_parse @@ -469,10 +495,11 @@ class Xop_popup_parser_fxt { Tfds.Eq_ary(expd, Int_obj_ref.Ary_xto_int_ary(ids)); return this; } - public void Test_parse(String raw, String expd) { - Xoa_page page = Xoa_page.create_(wiki, Xoa_ttl.parse_(wiki, Bry_.new_ascii_("Test_1"))); + public void Test_parse(String raw, String expd) {Test_parse(raw, "Test_1", expd);} + public void Test_parse(String raw, String ttl, String expd) { + Xoa_page page = Xoa_page.create_(wiki, Xoa_ttl.parse_(wiki, Bry_.new_ascii_(ttl))); page.Data_raw_(Bry_.new_utf8_(raw)); - Xow_popup_itm itm = new Xow_popup_itm(1, Bry_.new_utf8_(raw), word_min); + Xow_popup_itm itm = new Xow_popup_itm(1, Bry_.new_utf8_(raw), Bry_.Empty, word_min); itm.Init(wiki.Domain_bry(), page.Ttl()); byte[] actl = parser.Parse(wiki, page, null, itm); Tfds.Eq_str_lines(expd, String_.new_utf8_(actl)); diff --git a/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java b/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java index 5f4b23e31..5a148d0de 100644 --- a/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java +++ b/400_xowa/src/gplx/xowa/html/tocs/Xow_hdr_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -import gplx.xowa.parsers.amps.*; +import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.hdrs.*; public class Xow_hdr_mgr { private Xow_wiki wiki; private Xoa_page page; private Xop_hdr_tkn[] hdrs_ary = new Xop_hdr_tkn[0]; private int hdrs_max, hdrs_len; diff --git a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java index 737bcfa88..d7b21e591 100644 --- a/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java +++ b/400_xowa/src/gplx/xowa/html/tocs/Xow_toc_mgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.tocs; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; +import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.hdrs.*; public class Xow_toc_mgr implements Bry_fmtr_arg { private static final int Toc_levels = 32; // assume 6 max levels * 5 max heading (9999.); add 2 for good measure private Xoa_page page; private Xop_toc_itm[] path_ary; private Bry_bfr path_bfr = Bry_bfr.reset_(Toc_levels); diff --git a/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java b/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java index 7337b4877..2f33fbd4f 100644 --- a/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java +++ b/400_xowa/src/gplx/xowa/langs/Xol_func_name_regy.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.langs; import gplx.*; import gplx.xowa.*; -import gplx.core.btries.*; import gplx.intl.*; +import gplx.core.btries.*; import gplx.intl.*; import gplx.xowa.xtns.pfuncs.*; public class Xol_func_name_regy { private Xol_func_name_itm finder = new Xol_func_name_itm(); private Btrie_slim_mgr cs_trie = Btrie_slim_mgr.cs_(), ci_trie = Btrie_slim_mgr.ci_utf_8_(); diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_apos_log.java b/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_log.java similarity index 87% rename from 400_xowa/src_400_parser/gplx/xowa/Xop_apos_log.java rename to 400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_log.java index c36a6de8a..a002bf92c 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_apos_log.java +++ b/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_log.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.apos; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_apos_log { private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "apos"); public static final Gfo_msg_itm @@ -23,7 +23,4 @@ public class Xop_apos_log { , Dangling_apos = Gfo_msg_itm_.new_note_(owner, "Dangling_apos") , Multiple_apos = Gfo_msg_itm_.new_note_(owner, "Multiple_apos") ; -// public final RscStrItm_arg -// Dangling_apos_typ = new RscStrItm_arg(_mgr, "closing_typ") -// ; } diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_apos_tkn_chkr.java b/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_tkn_chkr.java similarity index 93% rename from 400_xowa/src_400_parser/gplx/xowa/Xop_apos_tkn_chkr.java rename to 400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_tkn_chkr.java index 7956bb29c..4cf9fe6ae 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_apos_tkn_chkr.java +++ b/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_tkn_chkr.java @@ -15,8 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; -import gplx.xowa.parsers.apos.*; +package gplx.xowa.parsers.apos; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_apos_tkn_chkr extends Xop_tkn_chkr_base { @Override public Class TypeOf() {return Xop_apos_tkn.class;} @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_apos;} diff --git a/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_wkr_tst.java b/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_wkr_tst.java index 6b4677d8b..ab5f68543 100644 --- a/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_wkr_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/apos/Xop_apos_wkr_tst.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.parsers.apos; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; +import gplx.xowa.parsers.lists.*; public class Xop_apos_wkr_tst { private Xop_fxt fxt = new Xop_fxt(); @Test public void Basic() { diff --git a/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_log.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_log.java new file mode 100644 index 000000000..4ff3c17af --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_log.java @@ -0,0 +1,27 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +public class Xop_hdr_log { + private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "hdr"); + public static final Gfo_msg_itm + Dangling_hdr = Gfo_msg_itm_.new_warn_(owner, "dangling_hdr") + , Mismatched = Gfo_msg_itm_.new_warn_(owner, "mismatched") + , Len_1 = Gfo_msg_itm_.new_warn_(owner, "len_1") + , Len_7_or_more = Gfo_msg_itm_.new_warn_(owner, "len_7_or_more") + ; +} diff --git a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_lxr.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_lxr.java similarity index 90% rename from 400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_lxr.java rename to 400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_lxr.java index e132d9484..88a20df78 100644 --- a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_lxr.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_lxr.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.core.btries.*; -class Xop_hdr_lxr implements Xop_lxr { +public class Xop_hdr_lxr implements Xop_lxr { public byte Lxr_tid() {return Xop_lxr_.Tid_hdr;} public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Hook_bgn, this);} static final byte[] Hook_bgn = new byte[] {Byte_ascii.NewLine, Byte_ascii.Eq}; public void Init_by_lang(Xol_lang lang, Btrie_fast_mgr core_trie) {} diff --git a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_tkn.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn.java similarity index 95% rename from 400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_tkn.java rename to 400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn.java index acebc7c7a..21186f945 100644 --- a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_hdr_tkn extends Xop_tkn_itm_base { public Xop_hdr_tkn(int bgn, int end, int hdr_len) {this.Tkn_ini_pos(false, bgn, end); this.hdr_len = hdr_len;} @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_hdr;} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_hdr_tkn_chkr.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn_chkr.java similarity index 94% rename from 400_xowa/src_400_parser/gplx/xowa/Xop_hdr_tkn_chkr.java rename to 400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn_chkr.java index 28f896991..d0da9cfb1 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_hdr_tkn_chkr.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_tkn_chkr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_hdr_tkn_chkr extends Xop_tkn_chkr_base { @Override public Class TypeOf() {return Xop_hdr_tkn.class;} @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_hdr;} diff --git a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java similarity index 96% rename from 400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr.java rename to 400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java index 14bc6b600..d0d1c9e57 100644 --- a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_hdr_wkr implements Xop_ctx_wkr { public void Ctor_ctx(Xop_ctx ctx) {} public void Page_bgn(Xop_ctx ctx, Xop_root_tkn root) {} diff --git a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr_basic_tst.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr_basic_tst.java similarity index 90% rename from 400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr_basic_tst.java rename to 400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr_basic_tst.java index bafffb381..52e1b0943 100644 --- a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr_basic_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; public class Xop_hdr_wkr_basic_tst { @Before public void init() {fxt.Reset();} private Xop_fxt fxt = new Xop_fxt(); @@ -106,14 +106,14 @@ public class Xop_hdr_wkr_basic_tst { , "" )); } -// @Test public void Pfunc() {// PAGE:en.w:Wikipedia:WikiProject_Articles_for_creation/Submissions/List DATE:2014-06-24 -// fxt.Test_parse_page_all_str -// ( "{{#if:exists|==a==|no}}" -// , String_.Concat_lines_nl_skip_last -// ( "

    a

    " -// , "" -// )); -// } + @Test public void Pfunc() {// multiple = should not be interpreted as key-val equals; PAGE:en.w:Wikipedia:Picture_of_the_day/June_2014 DATE:2014-07-21 + fxt.Test_parse_page_all_str + ( "{{#if:exists|==a==|no}}" + , String_.Concat_lines_nl_skip_last + ( "

    a

    " + , "" + )); + } // @Test public void Hdr_inside_dangling_tmpl_fix_2() { // PURPOSE: hdr == inside dangling tmpl; DATE:2014-06-10 // fxt.Init_defn_add("Print", "{{{1}}}"); // fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last diff --git a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr_para_tst.java b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr_para_tst.java similarity index 91% rename from 400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr_para_tst.java rename to 400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr_para_tst.java index a46ba235c..34fd535f5 100644 --- a/400_xowa/src_450_hdr/gplx/xowa/Xop_hdr_wkr_para_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/hdrs/Xop_hdr_wkr_para_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; public class Xop_hdr_wkr_para_tst { @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private Xop_fxt fxt = new Xop_fxt(); diff --git a/400_xowa/src_470_list/gplx/xowa/Xop_list_lxr.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_lxr.java similarity index 89% rename from 400_xowa/src_470_list/gplx/xowa/Xop_list_lxr.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_lxr.java index 0691a6c37..23db337a9 100644 --- a/400_xowa/src_470_list/gplx/xowa/Xop_list_lxr.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_lxr.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.core.btries.*; -class Xop_list_lxr implements Xop_lxr {//20111222 +public class Xop_list_lxr implements Xop_lxr {//20111222 public byte Lxr_tid() {return Xop_lxr_.Tid_list;} public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {Add_ary(core_trie, this, Xop_list_tkn_.Hook_ul, Xop_list_tkn_.Hook_ol, Xop_list_tkn_.Hook_dt, Xop_list_tkn_.Hook_dd);} public void Init_by_lang(Xol_lang lang, Btrie_fast_mgr core_trie) {} diff --git a/400_xowa/src_470_list/gplx/xowa/Xop_list_tkn.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn.java similarity index 95% rename from 400_xowa/src_470_list/gplx/xowa/Xop_list_tkn.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn.java index 2e5fd13c2..9b9719acf 100644 --- a/400_xowa/src_470_list/gplx/xowa/Xop_list_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_list_tkn extends Xop_tkn_itm_base { @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_list;} public int List_uid() {return list_uid;} public Xop_list_tkn List_uid_(int v) {list_uid = v; return this;} private int list_uid = -1; diff --git a/400_xowa/src_470_list/gplx/xowa/Xop_list_tkn_.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_.java similarity index 94% rename from 400_xowa/src_470_list/gplx/xowa/Xop_list_tkn_.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_.java index 05b3da753..a84a6386f 100644 --- a/400_xowa/src_470_list/gplx/xowa/Xop_list_tkn_.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_list_tkn_ { public static final byte[] Hook_ul = new byte[] {Byte_ascii.NewLine, Byte_ascii.Asterisk}, Hook_ol = new byte[] {Byte_ascii.NewLine, Byte_ascii.Hash} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_list_tkn_chkr.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_chkr.java similarity index 95% rename from 400_xowa/src_400_parser/gplx/xowa/Xop_list_tkn_chkr.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_chkr.java index a16bf5080..c95ebb209 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_list_tkn_chkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_tkn_chkr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_list_tkn_chkr extends Xop_tkn_chkr_base { @Override public Class TypeOf() {return Xop_list_tkn.class;} @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_list;} diff --git a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr.java similarity index 81% rename from 400_xowa/src_470_list/gplx/xowa/Xop_list_wkr.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr.java index 96dbf2b90..5f8b85e25 100644 --- a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_list_wkr implements Xop_ctx_wkr { private int listId = 0; byte[] curSymAry = new byte[Max_list_depth]; int curSymLen = 0; byte[] prvSymAry = Bry_.Empty; private HierPosAryBldr posBldr = new HierPosAryBldr(Max_list_depth); @@ -203,47 +203,3 @@ public class Xop_list_wkr implements Xop_ctx_wkr { } public static final int Max_list_depth = 256; } -class Xop_list_wkr_ { - public static byte[] MakeSymAry(byte[] curSymAry, int curSymLen) { - byte[] rv = new byte[curSymLen]; - for (int i = 0; i < curSymLen; i++) - rv[i] = curSymAry[i]; - return rv; - } - public static byte Compare_normalize(byte b) { // convert : to ; for sake of determining levels; EX: ";:" is actually same group - switch (b) { - case Byte_ascii.Asterisk: - case Byte_ascii.Hash: - case Byte_ascii.Semic: return b; - case Byte_ascii.Colon: return Byte_ascii.Semic; - default: throw Err_.unhandled(b); - } - } - public static void Close_list_if_present(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int bgn_pos, int cur_pos) { - if (ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_tmpl_invk) != Xop_ctx.Stack_not_found) return; // list is inside template; do not close; - while (true) { // close all list tkns on stack; EX: *** n should close all 3 stars; used to only close 1 - int acs_pos = -1, acs_len = ctx.Stack_len(); - for (int i = acs_len - 1; i > -1; i--) { // find auto-close pos - byte cur_acs_tid = ctx.Stack_get(i).Tkn_tid(); - switch (cur_acs_tid) { - case Xop_tkn_itm_.Tid_tblw_tb: // do not bypass tbl_elem; EX: ": {| |- *a |b }" should not close ":" - case Xop_tkn_itm_.Tid_tblw_tc: - case Xop_tkn_itm_.Tid_tblw_te: - case Xop_tkn_itm_.Tid_tblw_td: - case Xop_tkn_itm_.Tid_tblw_th: - case Xop_tkn_itm_.Tid_tblw_tr: - i = -1; // force break; - break; - case Xop_tkn_itm_.Tid_list: - acs_pos = i; - break; - default: - break; - } - } -// int acs_idx = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_list); - if (acs_pos == Xop_ctx.Stack_not_found) break; // no more list tokens found - ctx.Stack_pop_til(root, src, acs_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_list); - } - } -} diff --git a/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_.java new file mode 100644 index 000000000..4ad751245 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_.java @@ -0,0 +1,62 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +public class Xop_list_wkr_ { + public static byte[] MakeSymAry(byte[] curSymAry, int curSymLen) { + byte[] rv = new byte[curSymLen]; + for (int i = 0; i < curSymLen; i++) + rv[i] = curSymAry[i]; + return rv; + } + public static byte Compare_normalize(byte b) { // convert : to ; for sake of determining levels; EX: ";:" is actually same group + switch (b) { + case Byte_ascii.Asterisk: + case Byte_ascii.Hash: + case Byte_ascii.Semic: return b; + case Byte_ascii.Colon: return Byte_ascii.Semic; + default: throw Err_.unhandled(b); + } + } + public static void Close_list_if_present(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int bgn_pos, int cur_pos) { + if (ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_tmpl_invk) != Xop_ctx.Stack_not_found) return; // list is inside template; do not close; + while (true) { // close all list tkns on stack; EX: *** n should close all 3 stars; used to only close 1 + int acs_pos = -1, acs_len = ctx.Stack_len(); + for (int i = acs_len - 1; i > -1; i--) { // find auto-close pos + byte cur_acs_tid = ctx.Stack_get(i).Tkn_tid(); + switch (cur_acs_tid) { + case Xop_tkn_itm_.Tid_tblw_tb: // do not bypass tbl_elem; EX: ": {| |- *a |b }" should not close ":" + case Xop_tkn_itm_.Tid_tblw_tc: + case Xop_tkn_itm_.Tid_tblw_te: + case Xop_tkn_itm_.Tid_tblw_td: + case Xop_tkn_itm_.Tid_tblw_th: + case Xop_tkn_itm_.Tid_tblw_tr: + i = -1; // force break; + break; + case Xop_tkn_itm_.Tid_list: + acs_pos = i; + break; + default: + break; + } + } +// int acs_idx = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_list); + if (acs_pos == Xop_ctx.Stack_not_found) break; // no more list tokens found + ctx.Stack_pop_til(root, src, acs_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_list); + } + } +} diff --git a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_basic_tst.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_basic_tst.java similarity index 96% rename from 400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_basic_tst.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_basic_tst.java index 6c8553f49..7a42aaf8e 100644 --- a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_basic_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; public class Xop_list_wkr_basic_tst { private Xop_fxt fxt = new Xop_fxt(); diff --git a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_para_tst.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_para_tst.java similarity index 92% rename from 400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_para_tst.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_para_tst.java index a53e89db0..c0b983fa0 100644 --- a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_para_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_para_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; public class Xop_list_wkr_para_tst { @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private Xop_fxt fxt = new Xop_fxt(); diff --git a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_uncommon_tst.java b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_uncommon_tst.java similarity index 94% rename from 400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_uncommon_tst.java rename to 400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_uncommon_tst.java index 1738f1ae5..26a043524 100644 --- a/400_xowa/src_470_list/gplx/xowa/Xop_list_wkr_uncommon_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lists/Xop_list_wkr_uncommon_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lists; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; public class Xop_list_wkr_uncommon_tst { private Xop_fxt fxt = new Xop_fxt(); @@ -342,12 +342,10 @@ public class Xop_list_wkr_uncommon_tst { ( "*a
b" , String_.Concat_lines_nl_skip_last ( "
    " - , "
  • a" + , "
  • a
b" // TIDY.dangling: tidy will correct dangling node; DATE:2014-07-22 , " " - , "b" - , "" , "" - )); + )); } @Test public void Colon_causes_dd() { // PURPOSE: colon was mistakenly being ignored due to proximity to "\n;"; PAGE:de.w:Schmach_von_Tirana#Kuriosit.C3.A4t:_EM-Qualifikationsspiel_vom_20._November_1983 DATE:2014-07-11 fxt.Test_parse_page_all_str diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java new file mode 100644 index 000000000..f0856b4c4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java @@ -0,0 +1,84 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import gplx.xowa.html.*; import gplx.xowa.net.*; +public class Xoh_lnke_wtr { + private Xoa_app app; + public Xoh_lnke_wtr(Xow_wiki wiki) {this.app = wiki.App();} + public void Write_all(Bry_bfr bfr, Xoh_html_wtr html_wtr, Xoh_html_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke) { + int lnke_bgn = lnke.Lnke_bgn(), lnke_end = lnke.Lnke_end(); boolean proto_is_xowa = lnke.Proto_tid() == Xoo_protocol_itm.Tid_xowa; + if (!hctx.Mode_is_alt()) { // write href, unless mode is alt + bfr.Add(Xoh_consts.A_bgn); + if (Write_href(bfr, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa)) + bfr.Add(A_lhs_end_external); + else + bfr.Add(A_lhs_end_internal); + } + Write_caption(bfr, html_wtr, hctx, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); + if (!hctx.Mode_is_alt()) { + if (proto_is_xowa) // add + bfr.Add(Xoh_consts.Img_bgn).Add(html_wtr.Html_mgr().Img_xowa_protocol()).Add(Xoh_consts.__inline_quote); + bfr.Add(Xoh_consts.A_end); + } + } + public boolean Write_href(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke, int lnke_bgn, int lnke_end, boolean proto_is_xowa) { + byte[] lnke_xwiki_wiki = lnke.Lnke_xwiki_wiki(); + if (lnke_xwiki_wiki == null) { + if (lnke.Lnke_relative()) { // relative; EX: //a.org + bfr.Add(app.Url_parser().Url_parser().Relative_url_protocol_bry()).Add_mid(src, lnke_bgn, lnke_end); + return true; + } + else { // xowa or regular; EX: http://a.org + if (proto_is_xowa) { + bfr.Add(Xop_lnke_wkr.Bry_xowa_protocol); + ctx.App().Encoder_mgr().Gfs().Encode(bfr, src, lnke_bgn, lnke_end); + return false; + } + else { // regular; add href + bfr.Add_mid(src, lnke_bgn, lnke_end); + return true; + } + } + } + else { // xwiki + Url_encoder href_encoder = ctx.App().Encoder_mgr().Href_quotes(); + bfr.Add(Xoh_href_parser.Href_site_bry).Add(lnke_xwiki_wiki).Add(Xoh_href_parser.Href_wiki_bry) + .Add(href_encoder.Encode(lnke.Lnke_xwiki_page())); // NOTE: must encode page; EX:%22%3D -> '">' which will end attribute; PAGE:en.w:List_of_Category_A_listed_buildings_in_West_Lothian DATE:2014-07-15 + if (lnke.Lnke_xwiki_qargs() != null) + Xoa_url_arg_hash.Concat_bfr(bfr, href_encoder, lnke.Lnke_xwiki_qargs()); // NOTE: must encode args + return false; + } + } + public void Write_caption(Bry_bfr bfr, Xoh_html_wtr html_wtr, Xoh_html_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke, int lnke_bgn, int lnke_end, boolean proto_is_xowa) { + int subs_len = lnke.Subs_len(); + if (subs_len == 0) { // no text; auto-number; EX: "[1]" + if (lnke.Lnke_typ() == Xop_lnke_tkn.Lnke_typ_text) + bfr.Add_mid(src, lnke_bgn, lnke_end); + else + bfr.Add_byte(Byte_ascii.Brack_bgn).Add_int_variable(ctx.Cur_page().Html_data().Lnke_autonumber_next()).Add_byte(Byte_ascii.Brack_end); + } + else { // text available + for (int i = 0; i < subs_len; i++) + html_wtr.Write_tkn(bfr, ctx, hctx, src, lnke, i, lnke.Subs_get(i)); + } + } + private static final byte[] + A_lhs_end_external = Bry_.new_ascii_("\" class=\"external text\" rel=\"nofollow\">") + , A_lhs_end_internal = Bry_.new_ascii_("\">") + ; +} diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr_tst.java new file mode 100644 index 000000000..b38e39a07 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr_tst.java @@ -0,0 +1,36 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import org.junit.*; +public class Xoh_lnke_wtr_tst { + private Xop_fxt fxt = new Xop_fxt(); + @After public void term() {fxt.Init_para_n_(); fxt.Reset();} + @Test public void Basic() {fxt.Test_parse_page_wiki_str("[irc://a]" , "[1]");} + @Test public void Autonumber() {fxt.Test_parse_page_wiki_str("[irc://a] [irc://b]" , "[1] [2]");} + @Test public void Caption() {fxt.Test_parse_page_wiki_str("[irc://a b]" , "b");} + @Test public void Caption_wtxt() {fxt.Test_parse_page_wiki_str("[irc://a ''b'']" , "b");} + @Test public void Xowa_protocol() { + String img = ""; + fxt.Wiki().Sys_cfg().Xowa_proto_enabled_(true); + fxt.Test_parse_page_wiki_str("[xowa-cmd:\"a\" z]" , "z" + img + ""); + fxt.Test_parse_page_wiki_str("[xowa-cmd:\"a.b('c_d');\" z]" , "z" + img + ""); + fxt.Test_parse_page_wiki_str("[xowa-cmd:*\"a\"b*c\"* z]" , "z" + img + ""); + fxt.Wiki().Sys_cfg().Xowa_proto_enabled_(false); + fxt.Test_parse_page_wiki_str("[xowa-cmd:\"a\" b]" , "[xowa-cmd:"a" b]"); // protocol is disabled: literalize String (i.e.: don't make it an anchor) + } +} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_lnke_log.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_log.java similarity index 90% rename from 400_xowa/src_400_parser/gplx/xowa/Xop_lnke_log.java rename to 400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_log.java index bf11a7123..d85dd6eb6 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_lnke_log.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_log.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; public class Xop_lnke_log { private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "lnke"); public static final Gfo_msg_itm Dangling = Gfo_msg_itm_.new_note_(owner, "dangling"); // NOTE: WP.BOT:YOBOT;PAGE:en.w:Pan_flute diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java index 56e4680c8..948459277 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java @@ -54,6 +54,7 @@ public class Nowiki_escape_itm { Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); trie_new_itm(rv, Bool_.N, Byte_ascii.Lt_bry , Html_entity_.Lt_bry); trie_new_itm(rv, Bool_.N, Byte_ascii.Brack_bgn_bry , Html_entity_.Brack_bgn_bry); + trie_new_itm(rv, Bool_.N, Byte_ascii.Brack_end_bry , Html_entity_.Brack_end_bry); // PAGE:en.w: Tall_poppy_syndrome DATE:2014-07-23 trie_new_itm(rv, Bool_.N, Byte_ascii.Pipe_bry , Html_entity_.Pipe_bry); trie_new_itm(rv, Bool_.N, Byte_ascii.Apos_bry , Html_entity_.Apos_key_bry); // NOTE: for backward compatibility, use ' note that amp_wkr will turn ' -> ' but ' -> '; DATE:2014-07-03 trie_new_itm(rv, Bool_.N, Byte_ascii.Colon_bry , Html_entity_.Colon_bry); diff --git a/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java b/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java index 19b093925..cf4aacf6d 100644 --- a/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java +++ b/400_xowa/src/gplx/xowa/users/Xous_window_mgr.java @@ -36,6 +36,7 @@ public class Xous_window_mgr implements GfoInvkAble { cfg_mgr.Set_by_app("xowa.api.app.startup.tabs.previous" , Calc_previous_tabs(user.App().Gui_mgr().Browser_win().Tab_mgr())); } cfg_mgr.Set_by_app("app.gui.html.portal.wikis.visible" , Yn.Xto_str(user.App().Gui_mgr().Html_mgr().Portal_mgr().Wikis().Visible())); + cfg_mgr.Set_by_app("xowa.api.app.env.version_previous" , Xoa_app_.Version); cfg_mgr.Db_save_txt(); } private String Calc_previous_tabs(Xog_tab_mgr tab_mgr) { diff --git a/400_xowa/src/gplx/xowa/xtns/Xow_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/Xow_xtn_mgr.java index 995a9bfb2..4603c30ec 100644 --- a/400_xowa/src/gplx/xowa/xtns/Xow_xtn_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/Xow_xtn_mgr.java @@ -16,22 +16,22 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns; import gplx.*; import gplx.xowa.*; -import gplx.xowa.xtns.gallery.*; import gplx.xowa.xtns.cite.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.poems.*; import gplx.xowa.xtns.hiero.*; -import gplx.xowa.xtns.scores.*; import gplx.xowa.xtns.listings.*; import gplx.xowa.xtns.titleBlacklists.*; import gplx.xowa.xtns.pfuncs.scribunto.*; +import gplx.xowa.xtns.cite.*; public class Xow_xtn_mgr implements GfoInvkAble { private OrderedHash regy = OrderedHash_.new_bry_(); public int Count() {return regy.Count();} public Cite_xtn_mgr Xtn_cite() {return xtn_cite;} private Cite_xtn_mgr xtn_cite; public Xow_xtn_mgr Ctor_by_app(Xoa_app app) { // NOTE: needed for options Add(app, new Cite_xtn_mgr()); - Add(app, new Scrib_xtn_mgr()); - Add(app, new Gallery_xtn_mgr()); - Add(app, new Poem_xtn_mgr()); - Add(app, new Hiero_xtn_mgr()); - Add(app, new Score_xtn_mgr()); - Add(app, new Listing_xtn_mgr()); - Add(app, new Blacklist_xtn_mgr()); - Add(app, new Pfunc_xtn_mgr()); + Add(app, new gplx.xowa.xtns.scribunto.Scrib_xtn_mgr()); + Add(app, new gplx.xowa.xtns.gallery.Gallery_xtn_mgr()); + Add(app, new gplx.xowa.xtns.imaps.Imap_xtn_mgr()); + Add(app, new gplx.xowa.xtns.poems.Poem_xtn_mgr()); + Add(app, new gplx.xowa.xtns.hieros.Hiero_xtn_mgr()); + Add(app, new gplx.xowa.xtns.scores.Score_xtn_mgr()); + Add(app, new gplx.xowa.xtns.listings.Listing_xtn_mgr()); + Add(app, new gplx.xowa.xtns.titleBlacklists.Blacklist_xtn_mgr()); + Add(app, new gplx.xowa.xtns.pfuncs.scribunto.Pfunc_xtn_mgr()); return this; } public Xow_xtn_mgr Ctor_by_wiki(Xow_wiki wiki) { diff --git a/400_xowa/src/gplx/xowa/xtns/cite/Cite_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/cite/Cite_xtn_mgr.java index c6997360d..acbbf2140 100644 --- a/400_xowa/src/gplx/xowa/xtns/cite/Cite_xtn_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/cite/Cite_xtn_mgr.java @@ -18,7 +18,8 @@ along with this program. If not, see . package gplx.xowa.xtns.cite; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; public class Cite_xtn_mgr extends Xox_mgr_base { @Override public byte[] Xtn_key() {return XTN_KEY;} public static final byte[] XTN_KEY = Bry_.new_ascii_("cite"); - public byte[] Group_default_name() {return group_default_name;} private byte[] group_default_name = Bry_.new_ascii_("lower-alpha"); +// public byte[] Group_default_name() {return group_default_name;} private byte[] group_default_name = Bry_.new_ascii_("lower-alpha"); + public static byte[] Group_default_name() {return group_default_name;} private static byte[] group_default_name = Bry_.new_ascii_("lower-alpha"); @Override public Xox_mgr Clone_new() {return new Cite_xtn_mgr();} @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_group_default_name)) return String_.new_utf8_(group_default_name); diff --git a/400_xowa/src/gplx/xowa/xtns/cite/Ref_html_wtr.java b/400_xowa/src/gplx/xowa/xtns/cite/Ref_html_wtr.java index 3eb127a4b..18e24880f 100644 --- a/400_xowa/src/gplx/xowa/xtns/cite/Ref_html_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/cite/Ref_html_wtr.java @@ -25,12 +25,14 @@ public class Ref_html_wtr { Ref_nde itm = (Ref_nde)xnde.Xnde_xtn(); if (itm == null) return; if (itm.Follow_y()) return; // NOTE: "follow" is always appended to preceding ref; will never generate its own ^ a + byte[] itm_group = itm.Group(); + boolean itm_group_is_default = Bry_.Eq(itm_group, Bry_.Empty) || Bry_.Eq(itm_group, Cite_xtn_mgr.Group_default_name()); // do not show "lower-alpha"; PAGE:en.w:Moon; DATE:2014-07-21 cfg.Itm_html().Bld_bfr_many(bfr , Itm_id(itm, true) , Grp_id(itm) - , itm.Group() == Bry_.Empty // grp_key - ? itm.Idx_major() + 1 - : (Object)grp_key_fmtr.Atrs_(cfg.Itm_grp_text(), itm.Group(), itm.Idx_major() + 1) + , itm_group_is_default + ? itm.Idx_major() + 1 + : (Object)grp_key_fmtr.Atrs_(cfg.Itm_grp_text(), itm.Group(), itm.Idx_major() + 1) ); } private Bry_fmtr_arg_fmtr_objs grp_key_fmtr = Bry_fmtr_arg_.fmtr_null_(); public Ref_html_wtr_cfg Cfg() {return cfg;} private Ref_html_wtr_cfg cfg; diff --git a/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java b/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java index 69e8c8cba..ce1622019 100644 --- a/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java @@ -36,11 +36,7 @@ public class Ref_nde implements Xox_xnde, Xop_xnde_atr_parser { switch (xatr_key.Val()) { case Xatr_id_name: name = wiki.App().Sanitizer().Escape_id(xatr.Val_as_bry(src)); break; case Xatr_id_follow: follow = xatr.Val_as_bry(src); break; - case Xatr_id_group: { - group = xatr.Val_as_bry(src); - // if (Bry_.Eq(group, wiki.Xtn_mgr().Xtn_cite().Group_default_name())) group = Bry_.Empty; // if group == default, make it same as empty; DATE:2014-07-03 - break; - } + case Xatr_id_group: group = xatr.Val_as_bry(src); break; } } public void Xtn_parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) { diff --git a/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java b/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java index 18db0eec9..ca79a218a 100644 --- a/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java @@ -24,11 +24,7 @@ public class References_nde implements Xox_xnde, Xop_xnde_atr_parser { if (xatr_key_obj == null) return; Byte_obj_val xatr_key = (Byte_obj_val)xatr_key_obj; switch (xatr_key.Val()) { - case Xatr_id_group: { - group = xatr.Val_as_bry(src); - // if (Bry_.Eq(group, wiki.Xtn_mgr().Xtn_cite().Group_default_name())) group = Bry_.Empty; // if group == default, make it same as empty; DATE:2014-07-03 - break; - } + case Xatr_id_group: group = xatr.Val_as_bry(src); break; } } public void Xtn_parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn cur_root, byte[] src, Xop_xnde_tkn xnde) { diff --git a/400_xowa/src/gplx/xowa/xtns/cite/References_nde_group_tst.java b/400_xowa/src/gplx/xowa/xtns/cite/References_nde_group_tst.java index eea948fb3..e598cab29 100644 --- a/400_xowa/src/gplx/xowa/xtns/cite/References_nde_group_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/cite/References_nde_group_tst.java @@ -41,29 +41,26 @@ public class References_nde_group_tst { , "" )); } -// @Test public void Lower_alpha_is_ignored() { -// String expd = -// String_.Concat_lines_nl_skip_last -// ( "[1]" -// , "[2]" -// , "
    " -// , "
  1. ^ x
  2. " -// , "
  3. ^ y
  4. " -// , "
" -// , "" -// ); -// fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last -// ( "x" -// , "y" // note: no group name, but still goes in "lower-alpha" group -// , "" -// ), expd); -// fxt.Clear_ref_mgr(); -// fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last -// ( "x" // note: "lower-alpha" group name, but goes in default group -// , "y" -// , "" -// ), expd); -// } + @Test public void Lower_alpha_is_ignored() { + String expd = + String_.Concat_lines_nl_skip_last + ( "[1]" // note:do not show lower-alpha; DATE:2014-07-21 + , "[1]" + , "
    " + , "
  1. ^ x
  2. " + , "
" + , "
    " + , "
  1. ^ y
  2. " + , "
" + , "" + ); + fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last + ( "x" + , "y" + , "" + , "" + ), expd); + } @Test public void Empty() { // PURPOSE: is same as ; DATE:2013-02-06 fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "b" diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java index 1042fb150..8b20ccd2c 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java @@ -43,7 +43,7 @@ public class Gallery_itm implements Js_img_wkr { this.xnde = xnde; this.xfer_itm = xfer_itm;; this.wiki = wiki; this.ctx = ctx; this.src = src; this.gallery_li_id_bry = gallery_li_id_bry; this.gallery_itm_idx = gallery_itm_idx; } private Gallery_xnde xnde; private Xof_xfer_itm xfer_itm; private Xow_wiki wiki; private Xop_ctx ctx; private byte[] src; private byte[] gallery_li_id_bry; private int gallery_itm_idx; - public void Html_update(Xog_html_itm html_itm, int w, int h, String view_src, String orig_src) { + public void Html_update(Xoa_page page, Xog_html_itm html_itm, int w, int h, String view_src, String orig_src) { Gallery_mgr_base gallery_mgr = xnde.Gallery_mgr(); Bry_bfr bfr = wiki.Utl_bry_bfr_mkr().Get_k004(), tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(); try { @@ -52,7 +52,7 @@ public class Gallery_itm implements Js_img_wkr { String itm_html = bfr.XtoStrAndClear(); html_itm.Html_elem_replace_html(String_.new_utf8_(gallery_li_id_bry), itm_html); if (gallery_itm_idx == xnde.Itms_len() - 1 && Gallery_mgr_base_.Mode_is_packed(xnde.Mode())) - html_itm.Html_gallery_packed_exec(); + page.Html_data().Gallery_packed_exists_y_(); // set flag for packed_gallery; don't fire multiple times; PAGE:en.w:National_Sculpture_Museum_(Valladolid); DATE:2014-07-21 } finally { bfr.Mkr_rls(); tmp_bfr.Mkr_rls(); diff --git a/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java b/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java index d8e925307..658ec598d 100644 --- a/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java +++ b/400_xowa/src/gplx/xowa/xtns/geoCrumbs/Geoc_isin_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.geoCrumbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Geoc_isin_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_geoCrumbs_isin;} @Override public Pf_func New(int id, byte[] name) {return new Geoc_isin_func().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/geodata/Geo_coordinates_func.java b/400_xowa/src/gplx/xowa/xtns/geodata/Geo_coordinates_func.java index 35de372a4..e604d63e7 100644 --- a/400_xowa/src/gplx/xowa/xtns/geodata/Geo_coordinates_func.java +++ b/400_xowa/src/gplx/xowa/xtns/geodata/Geo_coordinates_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.geodata; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Geo_coordinates_func extends Pf_func_base { @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) {} // NOOP: MW uses to save coordinates for API retrieval @Override public int Id() {return Xol_kwd_grp_.Id_xtn_geodata_coordinates;} diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_file_mgr.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_file_mgr.java similarity index 95% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_file_mgr.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_file_mgr.java index 388df6302..3d6fec5b1 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_file_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_file_mgr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.srls.dsvs.*; class Hiero_file_mgr implements GfoInvkAble { private OrderedHash hash = OrderedHash_.new_bry_(); diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_html_mgr.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_html_mgr.java similarity index 96% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_html_mgr.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_html_mgr.java index 938356685..8d4502b62 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_html_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_html_mgr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.html.*; class Hiero_html_mgr { private Bry_bfr html_bfr = Bry_bfr.reset_(Io_mgr.Len_kb), content_bfr = Bry_bfr.reset_(255), tbl_content_bfr = Bry_bfr.reset_(Io_mgr.Len_kb), temp_bfr = Bry_bfr.reset_(255); @@ -239,7 +239,7 @@ class Hiero_html_wtr { private Hiero_phoneme_mgr phoneme_mgr; private Bry_bfr temp_bfr = Bry_bfr.reset_(255); public Hiero_html_wtr(Hiero_html_mgr mgr, Hiero_phoneme_mgr phoneme_mgr) {this.phoneme_mgr = phoneme_mgr;} - public void Hr(Bry_bfr bfr) {bfr.Add(Html_tag_.Hr_bry).Add_byte_nl();} + public void Hr(Bry_bfr bfr) {bfr.Add(Html_tag_.Hr_inl).Add_byte_nl();} public void Tbl_eol(Bry_bfr bfr) {bfr.Add(Tbl_eol_bry);} private static final String Tbl_bgn_str = "
" diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_html_mgr_tst.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_html_mgr_tst.java similarity index 96% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_html_mgr_tst.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_html_mgr_tst.java index 405d00db7..ed085e0f2 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_html_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_html_mgr_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import org.junit.*; public class Hiero_html_mgr_tst { @Before public void init() {fxt.Reset();} private Hiero_html_mgr_fxt fxt = new Hiero_html_mgr_fxt(); diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_mw_tables_parser.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_mw_tables_parser.java similarity index 96% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_mw_tables_parser.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_mw_tables_parser.java index 6ed0e913f..91fbac17c 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_mw_tables_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_mw_tables_parser.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.php.*; import gplx.srls.dsvs.*; public class Hiero_mw_tables_parser { private Php_parser parser = new Php_parser(); private Php_evaluator evaluator; diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_mw_tables_parser_tst.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_mw_tables_parser_tst.java similarity index 93% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_mw_tables_parser_tst.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_mw_tables_parser_tst.java index 017e8c4ba..9aec534f5 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_mw_tables_parser_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_mw_tables_parser_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import org.junit.*; import gplx.intl.*; public class Hiero_mw_tables_parser_tst { diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_parser.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_parser.java similarity index 95% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_parser.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_parser.java index 99509765a..4d5c7b827 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_parser.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.btries.*; import gplx.html.*; import gplx.xowa.html.*; class Hiero_parser { private Btrie_slim_mgr trie = Btrie_slim_mgr.cs_(); diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_parser_tst.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_parser_tst.java similarity index 94% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_parser_tst.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_parser_tst.java index 02004c2f6..b26aea66b 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_parser_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_parser_tst.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import org.junit.*; public class Hiero_parser_tst { @Before public void init() {fxt.Reset();} private Hiero_parser_fxt fxt = new Hiero_parser_fxt(); diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_phoneme_mgr.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_phoneme_mgr.java similarity index 95% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_phoneme_mgr.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_phoneme_mgr.java index f8520d672..7771d8ee2 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_phoneme_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_phoneme_mgr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.srls.dsvs.*; class Hiero_phoneme_mgr implements GfoInvkAble { private OrderedHash hash = OrderedHash_.new_bry_(); diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_prefab_mgr.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_prefab_mgr.java similarity index 94% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_prefab_mgr.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_prefab_mgr.java index 7e458bfe1..492dbbc7c 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_prefab_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_prefab_mgr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.srls.dsvs.*; class Hiero_prefab_mgr implements GfoInvkAble { private OrderedHash hash = OrderedHash_.new_bry_(); diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_xnde.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xnde.java similarity index 95% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_xnde.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xnde.java index 141795347..1c88f27b1 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xnde.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.html.*; public class Hiero_xnde implements Xox_xnde, Xop_xnde_atr_parser { diff --git a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xtn_mgr.java similarity index 90% rename from 400_xowa/src/gplx/xowa/xtns/hiero/Hiero_xtn_mgr.java rename to 400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xtn_mgr.java index af7afced4..a2725fa72 100644 --- a/400_xowa/src/gplx/xowa/xtns/hiero/Hiero_xtn_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xtn_mgr.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.hiero; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.hieros; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.wikis.*; import gplx.xowa.html.modules.*; public class Hiero_xtn_mgr extends Xox_mgr_base implements GfoInvkAble { @Override public boolean Enabled_default() {return true;} @@ -31,7 +31,6 @@ public class Hiero_xtn_mgr extends Xox_mgr_base implements GfoInvkAble { Xoa_app app = wiki.App(); Io_url ext_root_dir = app.Fsys_mgr().Bin_extensions_dir().GenSubDir("Wikihiero"); Img_src_dir = Bry_.new_utf8_(ext_root_dir.GenSubDir("img").To_http_file_str()); -// Module_css = new Xoh_module_itm("wikihiero.css").Css_mgr_init(ext_root_dir.GenSubFil_nest("modules", "ext.wikihiero.css")); app.Gfs_mgr().Run_url_for(this, ext_root_dir.GenSubFil_nest("data", "tables.gfs")); html_wtr = new Hiero_html_mgr(this); parser.Init(); @@ -54,5 +53,4 @@ public class Hiero_xtn_mgr extends Xox_mgr_base implements GfoInvkAble { else return super.Invk(ctx, ikey, k, m); } public static final String Invk_prefabs = "prefabs", Invk_files = "files", Invk_phonemes = "phonemes"; -// public static Xoh_module_itm Module_css; } diff --git a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_html_bldr.java b/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_html_bldr.java deleted file mode 100644 index 0208152db..000000000 --- a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_html_bldr.java +++ /dev/null @@ -1,56 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.xtns.imageMap; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -class Imap_html_bldr { - private Pts_fmtr_arg pts_fmtr_arg = new Pts_fmtr_arg(); - public void Bld_map(Bry_bfr rslt_bfr, Xow_wiki wiki, Imap_itm[] itms) { - int itms_len = itms.length; - // Imap_itm img_itm = itms[0]; - for (int i = 0; i < itms_len; ++i) { - Imap_itm itm = itms[i]; - switch (itm.Itm_tid()) { - case Imap_itm_.Tid_shape_dflt: - case Imap_itm_.Tid_shape_rect: - case Imap_itm_.Tid_shape_circle: - case Imap_itm_.Tid_shape_poly: - Bld_map_shape(rslt_bfr, wiki, (Imap_itm_shape)itm); - break; - } - } - } - private void Bld_map_shape(Bry_bfr rslt_bfr, Xow_wiki wiki, Imap_itm_shape itm) { - byte[] shape_name = Imap_itm_.Xto_str(itm.Itm_tid()); - pts_fmtr_arg.Init(itm.Shape_pts()); - area_fmtr.Bld_bfr_many(rslt_bfr, itm.Shape_link_href(), itm.Shape_link_caption(), shape_name, pts_fmtr_arg); - } - private static final Bry_fmtr area_fmtr = Bry_fmtr.new_ - ( "\"{caption}\"" - , "href", "caption", "shape", "pts" - ); -} -class Pts_fmtr_arg implements Bry_fmtr_arg { - private Double_obj_val[] pts; - public void Init(Double_obj_val[] pts) {this.pts = pts;} - public void XferAry(Bry_bfr bfr, int idx) { - int pts_len = pts.length; - for (int i = 0; i < pts_len; ++i) { - if (i != 0) bfr.Add_byte(Byte_ascii.Comma); - bfr.Add_double(pts[i].Val()); - } - } -} diff --git a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_itm_parser.java b/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_itm_parser.java deleted file mode 100644 index 0bf8936f7..000000000 --- a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_itm_parser.java +++ /dev/null @@ -1,177 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.xtns.imageMap; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.core.btries.*; -class Imap_itm_parser { - private Xoa_url page_url; private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; - private ListAdp itms = ListAdp_.new_(); - private ListAdp pts = ListAdp_.new_(); - private ListAdp errs = ListAdp_.new_(); - private byte[] src; // private int src_bgn, src_end; - private int itm_idx; private int itm_bgn, itm_end; - private Xoa_app app; private Xow_wiki wiki; private Xop_ctx imap_ctx; private Xop_root_tkn imap_root; - public void Init(Xow_wiki wiki, Xoa_url page_url, Gfo_usr_dlg usr_dlg) { - this.app = wiki.App(); this.wiki = wiki; this.page_url = page_url; this.usr_dlg = usr_dlg; - if (imap_ctx == null) { - imap_ctx = Xop_ctx.new_(wiki); - imap_root = app.Tkn_mkr().Root(Bry_.Empty); - } - } - public void Clear() { - this.itm_idx = 0; itms.Clear(); - pts.Clear(); - errs.Clear(); - } - public ListAdp Errs() {return errs;} - public Imap_itm[] Parse(byte[] src, int src_bgn, int src_end) { - this.Clear(); - this.src = src; // this.src_bgn = src_bgn; this.src_end = src_end; - itm_bgn = src_bgn; itm_end = src_bgn - 1; - while (true) { - if (itm_end == src_end) break; - itm_bgn = Bry_finder.Trim_fwd_space_tab(src, itm_end + 1, src_end); // trim ws at start, and look for first char - if (itm_bgn == src_end) break; // line is entirely ws and terminated by eos; EX: "\n EOS" - itm_end = Bry_finder.Find_fwd_until(src, itm_bgn, src_end, Byte_ascii.NewLine); // look for \n - if (itm_end == Bry_finder.Not_found) itm_end = src_end; // no \n; make EOS = \n - itm_end = Bry_finder.Trim_bwd_space_tab(src, itm_end, itm_bgn); // trim any ws at end - if (itm_end - itm_bgn == 0) continue; // line is entirely ws; continue; - byte b = src[itm_bgn]; - if (b == Byte_ascii.Hash) { - Parse_comment(itm_bgn, itm_end); - continue; - } - if (itm_idx == 0) - Parse_img(itm_bgn, itm_end); - else { - Object tid_obj = tid_trie.Match_bgn_w_byte(b, src, itm_bgn, itm_end); - byte tid_val = tid_obj == null ? Imap_itm_.Tid_invalid : ((Byte_obj_val)tid_obj).Val(); - int tid_end_pos = tid_trie.Match_pos(); - switch (tid_val) { - case Imap_itm_.Tid_desc: Parse_desc(itm_bgn, itm_end); break; - case Imap_itm_.Tid_shape_dflt: Parse_shape(tid_val, tid_end_pos, itm_end, Reqd_dflt); break; - case Imap_itm_.Tid_shape_rect: Parse_shape(tid_val, tid_end_pos, itm_end, 4); break; - case Imap_itm_.Tid_shape_poly: Parse_shape(tid_val, tid_end_pos, itm_end, Reqd_poly); break; - case Imap_itm_.Tid_shape_circle: Parse_shape(tid_val, tid_end_pos, itm_end, 3); break; - default: - case Imap_itm_.Tid_invalid: Parse_invalid(itm_bgn, itm_end); break; - } - } - ++itm_idx; - } - return (Imap_itm[])itms.XtoAryAndClear(Imap_itm.class); - } - private void Parse_comment(int itm_bgn, int itm_end) {} // noop comments; EX: "# comment\n" - private void Parse_invalid(int itm_bgn, int itm_end) {usr_dlg.Warn_many("", "", "imap has invalid line: page=~{0} line=~{1}", page_url.Xto_full_str_safe(), String_.new_utf8_(src, itm_bgn, itm_end));} - private void Parse_desc(int itm_bgn, int itm_end) {itms.Add(new Imap_itm_desc(itm_idx, itm_bgn, itm_end));} - private void Parse_shape(byte shape_tid, int itm_bgn, int itm_end, int reqd_pts) { - int num_bgn = -1; // differs from MW parser which looks for link via regx, and then chops off rest; regx is difficult due to lnke; doing opposite approach which is eat numbers until something else - int pos = Bry_finder.Trim_fwd_space_tab(src, itm_bgn, itm_end); - boolean reading_numbers = true; - while (reading_numbers) { - boolean last = pos == itm_end; - byte b = last ? Byte_ascii.Space : src[pos]; - switch (b) { - case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: - case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: - case Byte_ascii.Dash: case Byte_ascii.Dot: - if (num_bgn == -1) - num_bgn = pos; - ++pos; - break; - default: - int new_pos = Parse_shape_num(num_bgn, pos, itm_end); - if (new_pos == -1) {Add_err("imagemap_invalid_coord", itm_bgn, itm_end); return;} - if (new_pos == pos) - reading_numbers = false; - else - pos = Bry_finder.Trim_fwd_space_tab(src, new_pos, itm_end); - num_bgn = -1; - break; - } - if (last) reading_numbers = false; - } - int pts_len = pts.Count(); - switch (reqd_pts) { - case Reqd_poly: { - if (pts_len == 0) {Add_err("imagemap_missing_coord", itm_bgn, itm_end); return;} - else if (pts_len % 2 != 0) {Add_err("imagemap_poly_odd", itm_bgn, itm_end); return;} - break; - } - case Reqd_dflt: { - pts.Clear(); // dflt should have 0 points; if any defined, ignore them; clearing list for purpose of test - break; - } - default: { - if (reqd_pts != pts_len) {Add_err("imagemap_missing_coord", itm_bgn, itm_end); return;} - break; - } - } - pos = Bry_finder.Trim_fwd_space_tab(src, pos, itm_end); - Imap_itm_shape shape_itm = new Imap_itm_shape(itm_idx, itm_bgn, itm_end, shape_tid, (Double_obj_val[])pts.XtoAryAndClear(Double_obj_val.class)); - Xop_tkn_itm link_tkn = Parse_link(pos, itm_end); - shape_itm.Shape_link_(app, wiki, src, link_tkn); - itms.Add(shape_itm); - } - private void Add_err(String err_key, int bgn, int end) { - usr_dlg.Warn_many("", "", err_key + ": page=~{0} line=~{1}", page_url.Xto_full_str_safe(), String_.new_utf8_(src, bgn, end)); - errs.Add(new Imap_itm_err(itm_idx, err_key)); - } - private Xop_tkn_itm Parse_link(int link_bgn, int link_end) { - imap_root.Clear(); - imap_ctx.Clear(); - wiki.Parser().Parse_to_src_end(imap_root, imap_ctx, wiki.App().Tkn_mkr(), src, wiki.Parser().Wtxt_trie(), link_bgn, link_end); - int subs_len = imap_root.Subs_len(); - for (int i = 0; i < subs_len; ++i) { - Xop_tkn_itm sub = imap_root.Subs_get(i); - switch (sub.Tkn_tid()) { - case Xop_tkn_itm_.Tid_lnki: - case Xop_tkn_itm_.Tid_lnke: - return sub; - } - } - return null; - } - private int Parse_shape_num(int num_bgn, int num_end, int itm_end) { - if (num_bgn == -1) return num_end; - double num = Bry_.XtoDoubleByPosOr(src, num_bgn, num_end, Double_.NaN); - if (Double_.IsNaN(num)) return -1; // invalid number; EX: "1.2.3" - pts.Add(Double_obj_val.new_(num)); - return Bry_finder.Trim_fwd_space_tab(src, num_end, itm_end); - } - - private void Parse_img(int itm_bgn, int itm_end) { - int pos = Bry_finder.Trim_fwd_space_tab(src, itm_bgn, itm_end); - Xop_tkn_itm link_tkn = Parse_link(pos, itm_end); - Imap_itm_img itm = new Imap_itm_img(itm_idx, itm_bgn, itm_end, link_tkn); - itms.Add(itm); - } - private static Btrie_slim_mgr tid_trie = Btrie_slim_mgr.ci_ascii_() // NOTE: names are not i18n'd; // NOTE:ci.ascii:MW_const.en - .Add_str_byte("desc" , Imap_itm_.Tid_desc) - .Add_str_byte("#" , Imap_itm_.Tid_comment) - .Add_bry_bval(Imap_itm_.Tid_name_default , Imap_itm_.Tid_shape_dflt) - .Add_bry_bval(Imap_itm_.Tid_name_rect , Imap_itm_.Tid_shape_rect) - .Add_bry_bval(Imap_itm_.Tid_name_circle , Imap_itm_.Tid_shape_circle) - .Add_bry_bval(Imap_itm_.Tid_name_poly , Imap_itm_.Tid_shape_poly) - ; - private static final int Reqd_poly = -1, Reqd_dflt = -2; -} -class Imap_itm_err { - public Imap_itm_err(int itm_idx, String err_key) {this.itm_idx = itm_idx; this.err_key = err_key;} - public int Itm_idx() {return itm_idx;} private int itm_idx; - public String Err_key() {return err_key;} private String err_key; -} diff --git a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_line.java b/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_line.java deleted file mode 100644 index 130981863..000000000 --- a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_line.java +++ /dev/null @@ -1,95 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.xtns.imageMap; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -interface Imap_itm { - byte Itm_tid(); - int Itm_idx(); - int Src_bgn(); - int Src_end(); -} -class Imap_itm_ { - public static final byte Tid_invalid = 0, Tid_img = 1, Tid_desc = 2, Tid_comment = 3, Tid_shape_dflt = 4, Tid_shape_rect = 5, Tid_shape_circle = 6, Tid_shape_poly = 7; - public static final byte[] - Tid_name_default = Bry_.new_ascii_("default") - , Tid_name_rect = Bry_.new_ascii_("rect") - , Tid_name_circle = Bry_.new_ascii_("circle") - , Tid_name_poly = Bry_.new_ascii_("poly") - ; - public static byte[] Xto_str(byte v) { - switch (v) { - case Tid_shape_dflt : return Tid_name_default; - case Tid_shape_rect : return Tid_name_rect; - case Tid_shape_circle : return Tid_name_circle; - case Tid_shape_poly : return Tid_name_poly; - default : throw Err_.unhandled(v); - } - } -} -abstract class Imap_itm_base implements Imap_itm { - public abstract byte Itm_tid(); - public void Ctor(int itm_idx, int src_bgn, int src_end) {this.itm_idx = itm_idx; this.src_bgn = src_bgn; this.src_end = src_end;} - public int Itm_idx() {return itm_idx;} private int itm_idx; - public int Src_bgn() {return src_bgn;} private int src_bgn; - public int Src_end() {return src_end;} private int src_end; -} -class Imap_itm_img extends Imap_itm_base { - public Imap_itm_img(int itm_idx, int src_bgn, int src_end, Xop_tkn_itm img_link) { - this.Ctor(itm_idx, src_bgn, src_end); - this.img_link = img_link; - } - public Xop_tkn_itm Img_link() {return img_link;} private Xop_tkn_itm img_link; - @Override public byte Itm_tid() {return Imap_itm_.Tid_img;} -} -class Imap_itm_desc extends Imap_itm_base { - public Imap_itm_desc(int itm_idx, int src_bgn, int src_end) {this.Ctor(itm_idx, src_bgn, src_end);} - @Override public byte Itm_tid() {return Imap_itm_.Tid_desc;} -} -// class Imap_itm_comment : Imap_itm_base { -// public override byte Itm_tid() {return Imap_itm_.Tid_comment;} -// } -class Imap_itm_shape extends Imap_itm_base { - public Imap_itm_shape(int itm_idx, int src_bgn, int src_end, byte shape_tid, Double_obj_val[] shape_pts) { - this.Ctor(itm_idx, src_bgn, src_end); - this.shape_tid = shape_tid; - this.shape_pts = shape_pts; - } - @Override public byte Itm_tid() {return shape_tid;} private byte shape_tid; - public Double_obj_val[] Shape_pts() {return shape_pts;} private Double_obj_val[] shape_pts; - public Xop_tkn_itm Shape_link() {return shape_link;} private Xop_tkn_itm shape_link; - public byte[] Shape_link_href() {return shape_link_href;} private byte[] shape_link_href; - public byte[] Shape_link_caption() {return shape_link_caption;} private byte[] shape_link_caption; - public void Shape_link_(Xoa_app app, Xow_wiki wiki, byte[] src, Xop_tkn_itm tkn) { - this.shape_link = tkn; - switch (tkn.Tkn_tid()) { - case Xop_tkn_itm_.Tid_lnki: { - Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)tkn; - shape_link_href = app.Href_parser().Build_to_bry(wiki, lnki_tkn.Ttl()); - shape_link_caption = Bry_.Mid(src, lnki_tkn.Src_bgn(), lnki_tkn.Src_end()); - break; - } - case Xop_tkn_itm_.Tid_lnke: { -// gplx.xowa.parsers.lnkes.Xop_lnke_tkn lnke_tkn = (gplx.xowa.parsers.lnkes.Xop_lnke_tkn)tkn; -// shape_link_href = lnke_tkn. -// shape_link_caption = Bry_.Mid(src, lnki_tkn.Src_bgn(), lnki_tkn.Src_end()); - break; - } - } - } - public static final byte Tid_default = 0, Tid_rect = 4, Tid_circle = 3, Tid_poly = 5; - public static final Imap_itm_shape Shape_dflt = new Imap_itm_shape(-1, -1, -1, Imap_itm_.Tid_shape_dflt, null); -} diff --git a/400_xowa/src/gplx/xowa/xtns/imageMap/Xop_imageMap_xnde.java b/400_xowa/src/gplx/xowa/xtns/imageMap/Xop_imageMap_xnde.java deleted file mode 100644 index 26e91eeb6..000000000 --- a/400_xowa/src/gplx/xowa/xtns/imageMap/Xop_imageMap_xnde.java +++ /dev/null @@ -1,144 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.xtns.imageMap; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.core.btries.*; import gplx.xowa.html.*; -import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.logs.*; -public class Xop_imageMap_xnde implements Xox_xnde { - private boolean first = true; - public byte[] Xtn_src() {return lnki_src;} private byte[] lnki_src; - private Xop_root_tkn xtn_root; - public ListAdp Shape_list() {return shape_list;} ListAdp shape_list = ListAdp_.new_(); - public void Xtn_parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) { - ctx.Para().Process_block__xnde(xnde.Tag(), Xop_xnde_tag.Block_end); - int content_bgn = xnde.Tag_open_end(), content_end = xnde.Tag_close_bgn(); - int nl_0_pos = Bry_finder.Find_fwd_while_not_ws(src, content_bgn, content_end); - int cur_pos = nl_0_pos, nl_1_pos = -1;//, ws_pos_bgn = -1; - int src_len = src.length; - Xop_ctx imageMap_ctx = Xop_ctx.new_sub_(wiki).Tid_is_image_map_(true); - imageMap_ctx.Para().Enabled_n_(); - Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr(); - while (true) { - boolean last = cur_pos == content_end; - if (last) nl_1_pos = cur_pos; - if (nl_1_pos != -1 || last) { - Object typeId_obj = TypeTrie.Match_bgn(src, nl_0_pos, nl_1_pos); - if (typeId_obj == null) { // flag itm - if (!first && nl_1_pos - nl_0_pos > 0) - ctx.Msg_log().Add_itm_none(Xtn_imageMap_msg.Line_type_unknown, src, nl_0_pos, nl_1_pos); - } - else { - byte typeId = ((Byte_obj_val)typeId_obj).Val(); - switch (typeId) { - case TypeId_comment: break; // NOOP - case TypeId_desc: break; // FUTURE: flag; TODO: desc show info icon; top-right, bottom-right, bottom-left, top-left, none - case TypeId_default: - case TypeId_rect: - case TypeId_circle: - case TypeId_poly: -// GfoLogWkr logWkr = new GfoLogWkr(); -// logWkr.Add_args(Xtn_imageMap_msg.Coords_count_invalid, TypeName[typeId], TypeCoords[typeId], coords.length); - Xtn_imageMap_shape shape = Xtn_imageMap_shape.parse_(typeId, src, nl_0_pos + TypeTrie.Match_pos(), nl_1_pos); - shape_list.Add(shape); - break; - } - } - //int bgn = ws_pos_bgn = -1 ? nl_0_pos : ws - ParseLine(ctx, imageMap_ctx, wiki, tkn_mkr, root, src, src_len, xnde, nl_0_pos, nl_1_pos); - nl_0_pos = nl_1_pos + 1; - nl_1_pos = -1; - } - if (last) break; - byte b = src[cur_pos]; - switch (b) { - case Byte_ascii.Space: - case Byte_ascii.Tab: - break; - case Byte_ascii.NewLine: - nl_1_pos = cur_pos; - break; - default: -// ws_pos_bgn = cur_pos;; - break; - } - ++cur_pos; - } - ctx.Para().Process_block__xnde(xnde.Tag(), Xop_xnde_tag.Block_end); - ctx.Para().Process_nl(ctx, root, src, xnde.Tag_close_end(), xnde.Tag_close_end()); // NOTE: this should create an extra stub "p" so that remaining text gets enclosed in

; DATE:2014-05-08 - boolean log_wkr_enabled = Log_wkr != Xop_log_basic_wkr.Null; if (log_wkr_enabled) Log_wkr.Log_end_xnde(ctx.Cur_page(), Xop_log_basic_wkr.Tid_imageMap, src, xnde); - } public static Xop_log_basic_wkr Log_wkr = Xop_log_basic_wkr.Null; - public void Xtn_write(Xoa_app app, Xoh_html_wtr html_wtr, Xoh_html_wtr_ctx opts, Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) { - html_wtr.Write_tkn(bfr, ctx, opts, xtn_root.Root_src(), xnde, Xoh_html_wtr.Sub_idx_null, xtn_root); - } - private void ParseLine(Xop_ctx orig_ctx, Xop_ctx image_map_ctx, Xow_wiki wiki, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, Xop_xnde_tkn xnde, int nl_0_pos, int nl_1_pos) { - int line_len = nl_1_pos - nl_0_pos; - if (line_len == 0 || src[nl_0_pos + 1] == Byte_ascii.Hash) return; - if (first) { - byte[] lnki_raw = Bry_.Add(Xop_tkn_.Lnki_bgn, Bry_.Mid(src, nl_0_pos, nl_1_pos), Xop_tkn_.Lnki_end); - xtn_root = tkn_mkr.Root(lnki_src); - image_map_ctx.Wiki().Parser().Parse_text_to_wdom(xtn_root, image_map_ctx, tkn_mkr, lnki_raw, 0); - lnki_src = xtn_root.Root_src(); // NOTE: html_wtr will write based on parsed mid (not raw) - xtn_root.Root_src_(lnki_src); // HACK: Xoh_html_wtr uses raw (instead of mid); put data in raw in order to conform to other xtns - Xop_lnki_logger file_wkr = orig_ctx.Lnki().File_wkr(); // NOTE: do not do image_map_ctx.Lnki(); image_map_ctx is brand new - Xop_lnki_tkn lnki_tkn = null; - int subs_len = xtn_root.Subs_len(); - for (int i = 0; i < subs_len; i++) { - Xop_tkn_itm sub_tkn = xtn_root.Subs_get(i); - if (sub_tkn.Tkn_tid() == Xop_tkn_itm_.Tid_lnki) { - lnki_tkn = (Xop_lnki_tkn)sub_tkn; - break; - } - } - if (lnki_tkn == null) { - image_map_ctx.Wiki().App().Usr_dlg().Warn_many("", "", "image_map failed to find lnki; page=~{0} imageMap=~{1}", String_.new_utf8_(image_map_ctx.Cur_page().Ttl().Full_txt()), String_.new_utf8_(lnki_raw)); - } - else { - orig_ctx.Cur_page().Lnki_list().Add(lnki_tkn); - if (file_wkr != null) file_wkr.Wkr_exec(orig_ctx, src, lnki_tkn, gplx.xowa.bldrs.files.Xob_lnki_src_tid.Tid_imageMap); - } - first = false; - } - else { - } - } - public static final byte TypeId_default = 0, TypeId_rect = 4, TypeId_circle = 3, TypeId_poly = 5, TypeId_desc = 6, TypeId_comment = 7; - public static Btrie_mgr TypeTrie = Btrie_slim_mgr.ci_ascii_() // NOTE: names are not i18n'd; // NOTE:ci.ascii:MW_const.en - .Add_obj("default" , Byte_obj_val.new_(TypeId_default)) - .Add_obj("rect" , Byte_obj_val.new_(TypeId_rect)) - .Add_obj("circle" , Byte_obj_val.new_(TypeId_circle)) - .Add_obj("poly" , Byte_obj_val.new_(TypeId_poly)) - .Add_obj("desc" , Byte_obj_val.new_(TypeId_desc)) - .Add_obj("#" , Byte_obj_val.new_(TypeId_comment)) - ; -} -class Xtn_imageMap_shape { - public byte TypeId() {return typeId;} private byte typeId; - public int[] Coord_ary() {return coord_ary;} private int[] coord_ary = null; - public Xop_lnki_tkn Lnki_tkn() {return lnki_tkn;} private Xop_lnki_tkn lnki_tkn = null; - public static Xtn_imageMap_shape parse_(byte typeId, byte[] src, int bgn, int end) { - Xtn_imageMap_shape rv = new Xtn_imageMap_shape(); - rv.typeId = typeId; - return rv; - } -} -class Xtn_imageMap_msg { - public static final Gfo_msg_grp Nde = Gfo_msg_grp_.new_(Xoa_app_.Nde, "image_map"); - public static final Gfo_msg_itm - Line_type_unknown = Gfo_msg_itm_.new_warn_(Nde, "line_type_unknown", "Line type is unknown") - , Coords_count_invalid = Gfo_msg_itm_.new_warn_(Nde, "coords_count_invalid", "Coordinate counts are invalid for shape: shape=~{0} expd=~{1} actl=~{2}") - ; -} diff --git a/400_xowa/src/gplx/xowa/xtns/imageMap/Xop_imageMap_xnde_tst.java b/400_xowa/src/gplx/xowa/xtns/imageMap/Xop_imageMap_xnde_tst.java deleted file mode 100644 index 4941f1175..000000000 --- a/400_xowa/src/gplx/xowa/xtns/imageMap/Xop_imageMap_xnde_tst.java +++ /dev/null @@ -1,62 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.xtns.imageMap; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import org.junit.*; -public class Xop_imageMap_xnde_tst { - private Xop_fxt fxt = new Xop_fxt(); - @Before public void init() {fxt.Reset();} - @Test public void Basic() { - fxt.Test_parse_page_wiki_str("File:A.png", html_img_none("File:A.png", "")); - } - @Test public void Caption() { - fxt.Test_parse_page_wiki_str("File:A.png|thumb|bcde", String_.Concat_lines_nl_skip_last - ( Xop_para_wkr_basic_tst.File_html("File", "A.png", "7/0", "bcde") - , "" - )); - } - @Test public void Err_trailing_ws() { // PURPOSE: empty 1st line causes failure - fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last - ( " " - , "File:A.png" - , "" - ), html_img_none("File:A.png", "")); - } - @Test public void Coords_one() { - fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last - ( "" - , "File:A.png" - , "circle 1 3 5 [[b|c]]" -// , "rect 2 4 6 8" -// , "poly 1 2 3 4 5" - , "" - ), html_img_none("File:A.png", "")); - } - @Test public void Para_omitted() { // PURPOSE: imagemap should not be automatically enclosed in para; cs.w:Seznam_clenu_ctrn�ct�ho_Knesetu; DATE:2014-05-08 - fxt.Init_para_y_(); - fxt.Test_parse_page_wiki_str("File:A.png a", html_img_none("File:A.png", "") + String_.Concat_lines_nl_skip_last - ( "" - , "" - , "

a" - , "

" - )); - fxt.Init_para_n_(); - } - private static String html_img_none(String trg, String alt) { - return String_.Format("\"\"", trg, alt); - } -} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_desc_tid.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_desc_tid.java new file mode 100644 index 000000000..624914763 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_desc_tid.java @@ -0,0 +1,73 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.core.btries.*; +class Imap_desc_tid { + public static final byte Tid_tr = 0, Tid_br = 1, Tid_bl = 2, Tid_tl = 3, Tid_none = 4, Tid_null = 5; + public static final byte[] + Key_tr = Bry_.new_ascii_("top-right") + , Key_br = Bry_.new_ascii_("bottom-right") + , Key_bl = Bry_.new_ascii_("bottom-left") + , Key_tl = Bry_.new_ascii_("top-left") + , Key_none = Bry_.new_ascii_("none") + ; + public static Btrie_slim_mgr trie_(Xow_wiki wiki) { + Btrie_slim_mgr rv = Btrie_slim_mgr.ci_utf_8_(); + trie_add(rv, Key_tr, Key_br, Key_bl, Key_tl, Key_none); +// if (wiki.Lang().Lang_id() != Xol_lang_itm_.Id_en) { + byte[][] lang_types = Parse_lang_types(wiki); + if (lang_types != null) + trie_add(rv, lang_types); +// } + return rv; + } + private static void trie_add(Btrie_slim_mgr trie, byte[]... ary) { + trie.Add_bry_bval(ary[0] ,Tid_tr); + trie.Add_bry_bval(ary[1] ,Tid_br); + trie.Add_bry_bval(ary[2] ,Tid_bl); + trie.Add_bry_bval(ary[3] ,Tid_tl); + trie.Add_bry_bval(ary[4] ,Tid_none); + } + private static byte[][] Parse_lang_types(Xow_wiki wiki) { + byte[] val = wiki.Msg_mgr().Val_by_key_obj("imagemap_desc_types"); + if (Bry_.Len_eq_0(val)) return null; // no msg in lang; return; + byte[][] ary = Bry_.Split(val, Byte_ascii.Comma); + int ary_len = ary.length; + if (ary_len != 5) wiki.App().Usr_dlg().Warn_many("", "", "imap_desc does not have 5 items; wiki=~{0} val=~{1}", wiki.Domain_bry(), val); + for (int i = 0; i < 5; ++i) + ary[i] = Bry_.Trim(ary[i]); // note that items will have trailing ws; EX: "top-right, bottom-right, bottom-left, top-left, none" + return ary; + } + public static byte parse_(Btrie_slim_mgr trie, byte[] src, int bgn, int end) { + Object rv = trie.Match_bgn(src, bgn, end); + return rv == null ? Tid_null : ((Byte_obj_val)rv).Val(); + } + public static void calc_desc_margins(Int_2_ref rv, byte tid, int html_w, int html_h) { + int margin_l + = tid == Tid_tl || tid == Tid_bl + ? 0 + : html_w - 20 + ; + int margin_t + = tid == Tid_tl || tid == Tid_tr + ? -html_h + 1 // 1px hack for IE, to stop it poking out the top + : -20 + ; + rv.Val_all_(margin_l, margin_t); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_html_fmtrs.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_html_fmtrs.java new file mode 100644 index 000000000..bf438ed98 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_html_fmtrs.java @@ -0,0 +1,61 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +class Imap_html_fmtrs { + public static final Bry_fmtr + Map = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "
" + , " ~{shapes}" + , " ~{img}" + , "
" + ), "imap_id", "desc_style", "img", "shapes" + ) + , Area = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "\n \"~{title}\"" + ), "href", "shape", "coords", "title") + , Img_anchor_none = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " \"~{img_alt}\"" + ), "imap_id", "img_elem_id", "img_alt", "img_src", "img_w", "img_h", "img_cls", "anchor_href", "anchor_title" + ) + , Img_anchor_lnki = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " \"~{img_alt}\"" + , " " + ), "imap_id", "img_elem_id", "img_alt", "img_src", "img_w", "img_h", "img_cls", "anchor_href", "anchor_title" + ) + , Img_anchor_lnke = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + , " \"~{img_alt}\"" + , " " + ), "imap_id", "img_elem_id", "img_alt", "img_src", "img_w", "img_h", "img_cls", "anchor_href", "anchor_title" + ) + , Desc_style = Bry_fmtr.new_(" style=\"height:~{div_h}px; width: ~{div_w}px;\"", "div_h", "div_w") + , Desc_main = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , "
" + , " " + , " \"~{msg_desc}\"" + , " " + , "
" + ), "margin_left", "margin_top", "img_href", "msg_desc", "icon_url" + ) + ; +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_img_fmtr_arg.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_img_fmtr_arg.java new file mode 100644 index 000000000..1227b23ce --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_img_fmtr_arg.java @@ -0,0 +1,49 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +class Imap_img_fmtr_arg implements Bry_fmtr_arg { + private Imap_map map; + private int img_elem_id, img_w, img_h; + private byte[] img_alt, img_src, img_cls, img_href; + private Int_2_ref margin_calc = new Int_2_ref(); + public void Init(Imap_map map, int img_elem_id, byte[] img_alt, byte[] img_src, int img_w, int img_h, byte[] img_cls, byte[] img_href) { + this.map = map; + this.img_elem_id = img_elem_id; this.img_w = img_w; this.img_h = img_h; + this.img_alt = img_alt; + this.img_src = img_src; + this.img_cls = img_cls; + this.img_href = img_href; + } + public void XferAry(Bry_bfr bfr, int idx) { + Bry_fmtr fmtr = Imap_html_fmtrs.Img_anchor_none; + byte[] anchor_href = Bry_.Empty, anchor_text = Bry_.Empty; + Imap_itm_dflt itm_dflt = map.Dflt(); + if (itm_dflt != null) { + fmtr = itm_dflt.Link_tid() == Xop_tkn_itm_.Tid_lnki ? Imap_html_fmtrs.Img_anchor_lnki : Imap_html_fmtrs.Img_anchor_lnke; + anchor_href = itm_dflt.Link_href(); + anchor_text = itm_dflt.Link_text(); + } + fmtr.Bld_bfr_many(bfr, map.Id(), img_elem_id, img_alt, img_src, img_w, img_h, img_cls, anchor_href, anchor_text); + Imap_itm_desc itm_desc = map.Desc(); + if (itm_desc != null) { + Imap_desc_tid.calc_desc_margins(margin_calc, itm_desc.Desc_tid(), img_w, img_h); + Imap_xtn_mgr xtn_mgr = map.Xtn_mgr(); + Imap_html_fmtrs.Desc_main.Bld_bfr_many(bfr, margin_calc.Val_0(), margin_calc.Val_1(), img_href, xtn_mgr.Desc_msg(), xtn_mgr.Desc_icon_url()); + } + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm.java new file mode 100644 index 000000000..0acd9a55b --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm.java @@ -0,0 +1,59 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +interface Imap_itm { + byte Itm_tid(); +} +class Imap_itm_ { + public static final byte Tid_invalid = 0, Tid_img = 1, Tid_desc = 2, Tid_comment = 3, Tid_dflt = 4, Tid_shape_rect = 5, Tid_shape_circle = 6, Tid_shape_poly = 7; + public static final byte[] + Key_dflt = Bry_.new_ascii_("default") + , Key_shape_rect = Bry_.new_ascii_("rect") + , Key_shape_circle = Bry_.new_ascii_("circle") + , Key_shape_poly = Bry_.new_ascii_("poly") + ; + public static byte[] Xto_key(byte v) { + switch (v) { + case Tid_shape_rect : return Key_shape_rect; + case Tid_shape_circle : return Key_shape_circle; + case Tid_shape_poly : return Key_shape_poly; + default : throw Err_.unhandled(v); + } + } +} +class Imap_itm_img implements Imap_itm { + public Imap_itm_img(Xop_lnki_tkn img_link) {this.img_link = img_link;} + public byte Itm_tid() {return Imap_itm_.Tid_img;} + public Xop_lnki_tkn Img_link() {return img_link;} private Xop_lnki_tkn img_link; +} +class Imap_itm_desc implements Imap_itm { + public Imap_itm_desc(byte desc_tid) {this.desc_tid = desc_tid;} + public byte Itm_tid() {return Imap_itm_.Tid_desc;} + public byte Desc_tid() {return desc_tid;} private byte desc_tid; +} +class Imap_itm_dflt implements Imap_itm, Imap_link_owner { + public byte Itm_tid() {return Imap_itm_.Tid_dflt;} + public int Link_tid() {return link_tid;} public void Link_tid_(int v) {link_tid = v;} private int link_tid; + public byte[] Link_href() {return link_href;} public void Link_href_(byte[] v) {this.link_href = v;} private byte[] link_href; + public byte[] Link_text() {return link_text;} public void Link_text_(byte[] v) {this.link_text = v;} private byte[] link_text; +} +class Imap_err { + public Imap_err(int itm_idx, String err_key) {this.itm_idx = itm_idx; this.err_key = err_key;} + public int Itm_idx() {return itm_idx;} private int itm_idx; + public String Err_key() {return err_key;} private String err_key; +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm_shape.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm_shape.java new file mode 100644 index 000000000..6fff95a1e --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm_shape.java @@ -0,0 +1,64 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.parsers.lnkes.*; import gplx.xowa.html.*; import gplx.xowa.net.*; +interface Imap_link_owner { + void Link_tid_(int v); + void Link_href_(byte[] v); + void Link_text_(byte[] v); +} +class Imap_link_owner_ { + public static void Init(Imap_link_owner link_owner, Xoa_app app, Xow_wiki wiki, byte[] src, Xop_tkn_itm tkn) { + Bry_bfr bfr = wiki.Utl_bry_bfr_mkr().Get_b512(); + int tkn_tid = tkn.Tkn_tid(); + link_owner.Link_tid_(tkn_tid); + switch (tkn_tid) { + case Xop_tkn_itm_.Tid_lnki: { + Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)tkn; + link_owner.Link_href_(app.Href_parser().Build_to_bry(wiki, lnki_tkn.Ttl())); + wiki.Html_mgr().Html_wtr().Lnki_wtr().Write_caption(bfr, Xoh_html_wtr_ctx.Alt, src, lnki_tkn, lnki_tkn.Ttl()); + link_owner.Link_text_(bfr.XtoAryAndClear()); + break; + } + case Xop_tkn_itm_.Tid_lnke: { + Xop_lnke_tkn lnke = (Xop_lnke_tkn)tkn; + Xop_ctx ctx = wiki.Ctx(); + int lnke_bgn = lnke.Lnke_bgn(), lnke_end = lnke.Lnke_end(); boolean proto_is_xowa = lnke.Proto_tid() == Xoo_protocol_itm.Tid_xowa; + Xoh_lnke_wtr lnke_wtr = wiki.Html_mgr().Html_wtr().Lnke_wtr(); + lnke_wtr.Write_href(bfr, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); + link_owner.Link_href_(bfr.XtoAryAndClear()); + lnke_wtr.Write_caption(bfr, wiki.Html_mgr().Html_wtr(), Xoh_html_wtr_ctx.Basic, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); + link_owner.Link_text_(bfr.XtoAryAndClear()); + break; + } + } + bfr.Mkr_rls(); + } +} +class Imap_itm_shape implements Imap_itm, Imap_link_owner { + public Imap_itm_shape(byte shape_tid, Double_obj_val[] shape_pts) { + this.shape_tid = shape_tid; + this.shape_pts = shape_pts; + } + public byte Itm_tid() {return shape_tid;} private byte shape_tid; + public Double_obj_val[] Shape_pts() {return shape_pts;} private Double_obj_val[] shape_pts; + public int Link_tid() {return link_tid;} public void Link_tid_(int v) {link_tid = v;} private int link_tid; + public byte[] Link_href() {return link_href;} public void Link_href_(byte[] v) {this.link_href = v;} private byte[] link_href; + public byte[] Link_text() {return link_text;} public void Link_text_(byte[] v) {this.link_text = v;} private byte[] link_text; + public static final byte Tid_default = 0, Tid_rect = 4, Tid_circle = 3, Tid_poly = 5; +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java new file mode 100644 index 000000000..7db42ee05 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java @@ -0,0 +1,69 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.files.*; import gplx.xowa.html.*; +class Imap_map implements Bry_fmtr_arg, Xoh_lnki_file_wkr { + public Imap_xtn_mgr Xtn_mgr() {return xtn_mgr;} private Imap_xtn_mgr xtn_mgr; + public void Init(Imap_xtn_mgr xtn_mgr, int id, byte[] img_src, Imap_itm_img img, Imap_itm_dflt dflt, Imap_itm_desc desc, Imap_itm_shape[] shapes, Imap_err[] errs) { + this.xtn_mgr = xtn_mgr; + this.id = id; this.img_src = img_src; this.img = img; this.dflt = dflt; this.desc = desc; this.shapes = shapes; this.errs = errs; + } + public int Id() {return id;} private int id; + public byte[] Img_src() {return img_src;} private byte[] img_src; + public Imap_itm_img Img() {return img;} private Imap_itm_img img; + public Imap_itm_dflt Dflt() {return dflt;} private Imap_itm_dflt dflt; + public Imap_itm_desc Desc() {return desc;} private Imap_itm_desc desc; + public Imap_itm_shape[] Shapes() {return shapes;} private Imap_itm_shape[] shapes; + public Imap_err[] Errs() {return errs;} private Imap_err[] errs; + public void Write_img_full(Bry_bfr bfr, Xof_xfer_itm xfer_itm, int elem_id, byte[] lnki_href, byte[] html_view_src, int html_w, int html_h, byte[] lnki_alt_text, byte[] lnki_ttl, byte[] anchor_cls, byte[] anchor_rel, byte[] anchor_title, byte[] itm_cls) { + pts_fmtr_arg.Scale_(Calc_scale(xfer_itm.Orig_w(), xfer_itm.Orig_h(), html_w, html_h)); + img_fmtr_arg.Init(this, elem_id, lnki_alt_text, html_view_src, html_w, html_h, itm_cls, lnki_href); + byte[] desc_style = Calc_desc_style(html_w, html_h); + Imap_html_fmtrs.Map.Bld_bfr_many(bfr, id, desc_style, img_fmtr_arg, this); + } + private byte[] Calc_desc_style(int html_w, int html_h) { + if (desc == null) return Bry_.Empty; + Bry_bfr tmp_bfr = xtn_mgr.Wiki().Utl_bry_bfr_mkr().Get_b128().Mkr_rls(); + return Imap_html_fmtrs.Desc_style.Bld_bry_many(tmp_bfr, html_w, html_h); + } + public void XferAry(Bry_bfr bfr, int idx) { + int shapes_len = shapes.length; + Bry_fmtr fmtr = Imap_html_fmtrs.Area; + for (int i = 0; i < shapes_len; ++i) { + Imap_itm_shape shape = shapes[i]; + Fmt_shape(bfr, fmtr, pts_fmtr_arg, shape); + } + } + public static void Fmt_shape(Bry_bfr bfr, Bry_fmtr fmtr, Imap_pts_fmtr_arg pts_fmtr, Imap_itm_shape shape) { + pts_fmtr_arg.Pts_(shape.Shape_pts()); + fmtr.Bld_bfr_many(bfr + , shape.Link_href() + , Imap_itm_.Xto_key(shape.Itm_tid()) + , pts_fmtr_arg + , shape.Link_text() + ); + } + private static final Imap_pts_fmtr_arg pts_fmtr_arg = new Imap_pts_fmtr_arg(); + private static final Imap_img_fmtr_arg img_fmtr_arg = new Imap_img_fmtr_arg(); + private static double Calc_scale(int orig_w, int orig_h, int html_w, int html_h) { + int denominator = orig_w + orig_h; + int numerator = html_w + html_h; + if (denominator <= 0 || numerator <= 0) return 1; // return identity; note that MW does "return self::error( 'imagemap_invalid_image' );" + return (double)numerator / (double)denominator; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java new file mode 100644 index 000000000..9d64f0d1a --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java @@ -0,0 +1,222 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.core.btries.*; import gplx.xowa.parsers.lnkis.redlinks.*; +class Imap_parser { + private Imap_xtn_mgr xtn_mgr; private Xoa_url page_url; private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; + private byte[] imap_img_src; + private Imap_itm_img imap_img; + private Imap_itm_dflt imap_dflt; + private Imap_itm_desc imap_desc; + private ListAdp shapes = ListAdp_.new_(), pts = ListAdp_.new_(), errs = ListAdp_.new_(); + private byte[] src; + private int itm_idx; private int itm_bgn, itm_end; + private Xoa_app app; private Xow_wiki wiki; private Xop_ctx wiki_ctx, imap_ctx; private Xop_root_tkn imap_root; + public Imap_parser(Imap_xtn_mgr xtn_mgr) {this.xtn_mgr = xtn_mgr;} + public void Init(Xow_wiki wiki, Xoa_url page_url, Gfo_usr_dlg usr_dlg) { + this.app = wiki.App(); this.wiki = wiki; this.page_url = page_url; this.usr_dlg = usr_dlg; + this.wiki_ctx = wiki.Ctx(); + if (imap_ctx == null) { + imap_ctx = Xop_ctx.new_(wiki); + imap_root = app.Tkn_mkr().Root(Bry_.Empty); + } + } + public void Clear() { + this.itm_idx = 0; + imap_img = null; imap_img_src = null; imap_desc = null; imap_dflt = null; + shapes.Clear(); pts.Clear(); errs.Clear(); + } + public Imap_map Parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) { + Imap_map rv = new Imap_map(); + Init(wiki, ctx.Cur_page().Url(), wiki.App().Usr_dlg()); + this.Parse(rv, ctx.Cur_page().Html_data().Imap_id_next(), src, xnde.Tag_open_end(), xnde.Tag_close_bgn()); + return rv; + } + public void Parse(Imap_map rv, int imap_id, byte[] src, int src_bgn, int src_end) { + this.Clear(); + this.src = src; + itm_bgn = src_bgn; itm_end = src_bgn - 1; + while (true) { + if (itm_end == src_end) break; + itm_bgn = Bry_finder.Trim_fwd_space_tab(src, itm_end + 1, src_end); // trim ws at start, and look for first char + if (itm_bgn == src_end) break; // line is entirely ws and terminated by eos; EX: "\n EOS" + itm_end = Bry_finder.Find_fwd_until(src, itm_bgn, src_end, Byte_ascii.NewLine); // look for \n + if (itm_end == Bry_finder.Not_found) itm_end = src_end; // no \n; make EOS = \n + itm_end = Bry_finder.Trim_bwd_space_tab(src, itm_end, itm_bgn); // trim any ws at end + if (itm_end - itm_bgn == 0) continue; // line is entirely ws; continue; + byte b = src[itm_bgn]; + if (b == Byte_ascii.Hash) { + Parse_comment(itm_bgn, itm_end); + continue; + } + try { + if (itm_idx == 0) + Parse_img(rv, itm_bgn, itm_end); + else { + Object tid_obj = tid_trie.Match_bgn_w_byte(b, src, itm_bgn, itm_end); + byte tid_val = tid_obj == null ? Imap_itm_.Tid_invalid : ((Byte_obj_val)tid_obj).Val(); + int tid_end_pos = tid_trie.Match_pos(); + switch (tid_val) { + case Imap_itm_.Tid_desc: Parse_desc(tid_end_pos, itm_end); break; + case Imap_itm_.Tid_dflt: Parse_dflt(tid_end_pos, itm_end); break; + case Imap_itm_.Tid_shape_rect: Parse_shape(tid_val, tid_end_pos, itm_bgn, itm_end, 4); break; + case Imap_itm_.Tid_shape_poly: Parse_shape(tid_val, tid_end_pos, itm_bgn, itm_end, Reqd_poly); break; + case Imap_itm_.Tid_shape_circle: Parse_shape(tid_val, tid_end_pos, itm_bgn, itm_end, 3); break; + default: + case Imap_itm_.Tid_invalid: Parse_invalid(itm_bgn, itm_end); break; + } + } + } catch (Exception e) {usr_dlg.Warn_many("", "", "imap.parse:skipping line; page=~{0} line=~{1} err=~{2}", page_url.Xto_full_str_safe(), Bry_.Mid_by_len_safe(src, itm_bgn, itm_end), Err_.Message_gplx(e));} + ++itm_idx; + } + rv.Init(xtn_mgr, imap_id, imap_img_src, imap_img, imap_dflt, imap_desc, (Imap_itm_shape[])shapes.XtoAryAndClear(Imap_itm_shape.class), (Imap_err[])errs.XtoAryAndClear(Imap_err.class)); + } + private void Parse_comment(int itm_bgn, int itm_end) {} // noop comments; EX: "# comment\n" + private void Parse_invalid(int itm_bgn, int itm_end) {usr_dlg.Warn_many("", "", "imap has invalid line: page=~{0} line=~{1}", page_url.Xto_full_str_safe(), String_.new_utf8_(src, itm_bgn, itm_end));} + private boolean Parse_desc(int itm_bgn, int itm_end) { + xtn_mgr.Desc_assert(); + Btrie_slim_mgr trie = xtn_mgr.Desc_trie(); + byte tid_desc = Imap_desc_tid.parse_(trie, src, Bry_finder.Trim_fwd_space_tab(src, itm_bgn, itm_end), Bry_finder.Trim_bwd_space_tab(src, itm_bgn, itm_end)); + switch (tid_desc) { + case Imap_desc_tid.Tid_null: return Add_err(Bool_.N, itm_bgn, itm_end, "imagemap_invalid_coord"); + case Imap_desc_tid.Tid_none: return true; + } + if (imap_img == null || imap_img.Img_link().Lnki_type() == Xop_lnki_type.Id_thumb) return true; // thumbs don't get desc + imap_desc = new Imap_itm_desc(tid_desc); + return true; + } + private void Parse_dflt(int itm_bgn, int itm_end) { + imap_dflt = new Imap_itm_dflt(); + Init_link_owner(imap_dflt, src, itm_bgn, itm_end); + } + private boolean Parse_shape(byte shape_tid, int tid_end_pos, int itm_bgn, int itm_end, int reqd_pts) { + int num_bgn = -1; // differs from MW parser which looks for link via regx, and then chops off rest; regx is difficult due to lnke; doing opposite approach which is eat numbers until something else + int pos = Bry_finder.Trim_fwd_space_tab(src, tid_end_pos, itm_end); + boolean reading_numbers = true; + while (reading_numbers) { + boolean last = pos == itm_end; + byte b = last ? Byte_ascii.Space : src[pos]; + switch (b) { + case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4: + case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: + case Byte_ascii.Dash: case Byte_ascii.Dot: + if (num_bgn == -1) + num_bgn = pos; + ++pos; + break; + default: + int new_pos = Parse_shape_num(shape_tid, b, pos, num_bgn, pos, itm_end); + if (new_pos == -1) return Add_err(Bool_.Y, itm_bgn, itm_end, "imagemap_invalid_coord"); + if (new_pos == pos) + reading_numbers = false; + else + pos = Bry_finder.Trim_fwd_space_tab(src, new_pos, itm_end); + num_bgn = -1; + break; + } + if (last) reading_numbers = false; + } + int pts_len = pts.Count(); + if (reqd_pts == Reqd_poly) { + if (pts_len == 0) return Add_err(Bool_.Y, itm_bgn, itm_end, "imagemap_missing_coord"); + else if (pts_len % 2 != 0) return Add_err(Bool_.Y, itm_bgn, itm_end, "imagemap_poly_odd"); + } + else { + if (pts_len < reqd_pts ) return Add_err(Bool_.Y, itm_bgn, itm_end, "imagemap_missing_coord"); + } + pos = Bry_finder.Trim_fwd_space_tab(src, pos, itm_end); + Imap_itm_shape shape_itm = new Imap_itm_shape(shape_tid, (Double_obj_val[])pts.XtoAryAndClear(Double_obj_val.class)); + Init_link_owner(shape_itm, src, pos, itm_end); + shapes.Add(shape_itm); + return true; + } + private boolean Add_err(boolean clear_pts, int bgn, int end, String err_key) { + usr_dlg.Warn_many("", "", err_key + ": page=~{0} line=~{1}", page_url.Xto_full_str_safe(), String_.new_utf8_(src, bgn, end)); + errs.Add(new Imap_err(itm_idx, err_key)); + if (clear_pts) pts.Clear(); + return false; + } + private void Init_link_owner(Imap_link_owner link_owner, byte[] src, int bgn, int end) { + byte[] link_tkn_src = Bry_.Mid(src, bgn, end); + Xop_tkn_itm link_tkn = Parse_link(link_tkn_src); + Imap_link_owner_.Init(link_owner, app, wiki, link_tkn_src, link_tkn); + } + private Xop_tkn_itm Parse_link(byte[] raw) { + imap_root.Clear(); + imap_ctx.Clear(); + wiki.Parser().Parse_text_to_wdom(imap_root, imap_ctx, wiki.App().Tkn_mkr(), raw, 0); + int subs_len = imap_root.Subs_len(); + for (int i = 0; i < subs_len; ++i) { + Xop_tkn_itm sub = imap_root.Subs_get(i); + switch (sub.Tkn_tid()) { + case Xop_tkn_itm_.Tid_lnki: + case Xop_tkn_itm_.Tid_lnke: + return sub; + } + } + return null; + } + private int Parse_shape_num(byte shape_tid, byte b, int pos, int num_bgn, int num_end, int itm_end) { + double num = 0; + if (num_bgn == -1) { // 1st char is non-numeric; EX: "poly a" + if ( shape_tid == Imap_itm_.Tid_shape_poly // poly code in ImageMap_body.php accepts invalid words and converts to 0; EX:"poly1"; PAGE:uk.w:Стратосфера; DATE:2014-07-26 + && b != Byte_ascii.Brack_bgn // skip logic if "[" which may be beginning of lnki / lnke + ) { + num_end = Bry_finder.Find_fwd_until_space_or_tab(src, pos, itm_end); // gobble up rest of word and search forward for space / tab to + if (num_end == Bry_finder.Not_found) return -1; // space / tab not found; return -1 (fail) + num = 0; + } + else + return num_end; + } + else + num = Bry_.XtoDoubleByPosOr(src, num_bgn, num_end, Double_.NaN); + if (Double_.IsNaN(num)) { + if (shape_tid == Imap_itm_.Tid_shape_poly) // poly code in ImageMap_body.php accepts invalid words and converts to 0; EX:"poly 1a" + num = 0; + else + return -1; // invalid number; EX: "1.2.3" + } + pts.Add(Double_obj_val.new_(num)); + return Bry_finder.Trim_fwd_space_tab(src, num_end, itm_end); + } + private void Parse_img(Imap_map imap, int itm_bgn, int itm_end) { + int pos = Bry_finder.Trim_fwd_space_tab(src, itm_bgn, itm_end); + imap_img_src = Bry_.Add(Xop_tkn_.Lnki_bgn, Bry_.Mid(src, pos, itm_end), Xop_tkn_.Lnki_end); + Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)Parse_link(imap_img_src); + imap_img_src = imap_root.Data_mid(); // NOTE: need to re-set src to pick up templates; EX: File:A.png|thumb|{{Test_template}}\n; PAGE:en.w:Kilauea; DATE:2014-07-27 + Xop_lnki_logger file_wkr = wiki_ctx.Lnki().File_wkr(); // NOTE: do not do imap_ctx.Lnki(); imap_ctx is brand new + if (lnki_tkn == null) + imap_ctx.Wiki().App().Usr_dlg().Warn_many("", "", "image_map failed to find lnki; page=~{0} imageMap=~{1}", String_.new_utf8_(imap_ctx.Cur_page().Ttl().Full_txt()), String_.new_utf8_(imap_img_src)); + else { + imap_img = new Imap_itm_img(lnki_tkn); + lnki_tkn.Lnki_file_wkr_(imap); + wiki_ctx.Cur_page().Lnki_list().Add(lnki_tkn); + if (file_wkr != null) file_wkr.Wkr_exec(wiki_ctx, src, lnki_tkn, gplx.xowa.bldrs.files.Xob_lnki_src_tid.Tid_imageMap); + } + } + private static Btrie_slim_mgr tid_trie = Btrie_slim_mgr.ci_ascii_() // NOTE: names are not i18n'd; // NOTE:ci.ascii:MW_const.en + .Add_str_byte("desc" , Imap_itm_.Tid_desc) + .Add_str_byte("#" , Imap_itm_.Tid_comment) + .Add_bry_bval(Imap_itm_.Key_dflt , Imap_itm_.Tid_dflt) + .Add_bry_bval(Imap_itm_.Key_shape_rect , Imap_itm_.Tid_shape_rect) + .Add_bry_bval(Imap_itm_.Key_shape_circle , Imap_itm_.Tid_shape_circle) + .Add_bry_bval(Imap_itm_.Key_shape_poly , Imap_itm_.Tid_shape_poly) + ; + private static final int Reqd_poly = -1; +} diff --git a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_itm_parser_tst.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java similarity index 61% rename from 400_xowa/src/gplx/xowa/xtns/imageMap/Imap_itm_parser_tst.java rename to 400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java index e52cb287e..14c6276ac 100644 --- a/400_xowa/src/gplx/xowa/xtns/imageMap/Imap_itm_parser_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java @@ -15,32 +15,27 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.xtns.imageMap; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import org.junit.*; -public class Imap_itm_parser_tst { - @Before public void init() {fxt.Reset();} private Imap_itm_parser_fxt fxt = new Imap_itm_parser_fxt(); - @Test public void Dflt_pass() {fxt.Test_shape("default [[A]]" , fxt.itm_dflt_("[[A]]"));} - @Test public void Dflt_ignore_points() {fxt.Test_shape("default 1 2 3 [[A]]" , fxt.itm_dflt_("[[A]]"));} +public class Imap_parser_tst { + @Before public void init() {fxt.Reset();} private Imap_parser_fxt fxt = new Imap_parser_fxt(); @Test public void Rect_pass() {fxt.Test_shape("rect 1 2 3 4 [[A]]" , fxt.itm_rect_("[[A]]", 1, 2, 3, 4));} @Test public void Circle_pass() {fxt.Test_shape("circle 1 2 3 [[A]]" , fxt.itm_circle_("[[A]]", 1, 2, 3));} @Test public void Poly_pass() {fxt.Test_shape("poly 1 2 3 4 5 6 [[A]]" , fxt.itm_poly_("[[A]]", 1, 2, 3, 4, 5, 6));} + @Test public void Poly_pass_chars() {fxt.Test_shape("poly a b [[A]]" , fxt.itm_poly_("[[A]]", 0, 0));} // PURPOSE: non-numeric should be converted to 0; PAGE:uk.w:Стратосфера; DATE:2014-07-26 @Test public void Rect_fail() {fxt.Test_shape_err("rect 1 2 3 [[A]]" , "imagemap_missing_coord");} @Test public void Circle_fail() {fxt.Test_shape_err("circle 1 2 [[A]]" , "imagemap_missing_coord");} @Test public void Poly_fail_odd() {fxt.Test_shape_err("poly 1 2 3 [[A]]" , "imagemap_poly_odd");} @Test public void Poly_fail_zero() {fxt.Test_shape_err("poly [[A]]" , "imagemap_missing_coord");} - @Test public void Poly_fail_invalid() {fxt.Test_shape_err("poly 1 2..3 [[A]]" , "imagemap_invalid_coord");} + @Test public void Circle_fail_invalid() {fxt.Test_shape_err("rect 1 2..3 4 [[A]]" , "imagemap_invalid_coord");} } -class Imap_itm_parser_fxt { - private Xoa_app app; private Xow_wiki wiki; - private Imap_itm_parser parser = new Imap_itm_parser(); - public void Reset() { +class Imap_fxt_base { + protected Xoa_app app; protected Xow_wiki wiki; + @gplx.Virtual public void Reset() { app = Xoa_app_fxt.app_(); wiki = Xoa_app_fxt.wiki_tst_(app); - Xoa_url url = Xoa_url.new_(wiki.Domain_bry(), Bry_.new_ascii_("Test_1")); - parser.Init(wiki, url, Gfo_usr_dlg_.Null); - parser.Clear(); + wiki.Ctx().Para().Enabled_n_(); } - public Imap_itm_shape itm_dflt_(String link) {return itm_shape_(Imap_itm_.Tid_shape_dflt, link);} public Imap_itm_shape itm_rect_(String link, int... pts_ary) {return itm_shape_(Imap_itm_.Tid_shape_rect, link, pts_ary);} public Imap_itm_shape itm_circle_(String link, int... pts_ary) {return itm_shape_(Imap_itm_.Tid_shape_circle, link, pts_ary);} public Imap_itm_shape itm_poly_(String link, int... pts_ary) {return itm_shape_(Imap_itm_.Tid_shape_poly, link, pts_ary);} @@ -50,34 +45,50 @@ class Imap_itm_parser_fxt { for (int i = 0; i < pts_len; ++i) pts_doubles[i] = Double_obj_val.new_(pts_ary[i]); byte[] link_bry = Bry_.new_utf8_(link); - Xop_tkn_itm link_tkn = app.Tkn_mkr().Bry(-1, -1, link_bry); - Imap_itm_shape rv = new Imap_itm_shape(0, 0, link_bry.length, tid, pts_doubles); - rv.Shape_link_(app, wiki, link_bry, link_tkn); + Imap_itm_shape rv = new Imap_itm_shape(tid, pts_doubles); + Imap_link_owner_.Init(rv, app, wiki, link_bry, Make_link_tkn(link_bry)); return rv; } + private Xop_tkn_itm Make_link_tkn(byte[] src) { + Xop_root_tkn root_tkn = new Xop_root_tkn(); + wiki.Parser().Parse_text_to_wdom(root_tkn, wiki.Ctx(), app.Tkn_mkr(), src, Xop_parser_.Doc_bgn_bos); + return root_tkn.Subs_get(0); + } +} +class Imap_parser_fxt extends Imap_fxt_base { + private Imap_parser parser; + private Imap_map imap; + @Override public void Reset() { + super.Reset(); + Xoa_url url = Xoa_url.new_(wiki.Domain_bry(), Bry_.new_ascii_("Test_1")); + Imap_xtn_mgr xtn_mgr = new Imap_xtn_mgr(); + parser = new Imap_parser(xtn_mgr); + parser.Init(wiki, url, Gfo_usr_dlg_.Null); + parser.Clear(); + imap = new Imap_map(); + } public void Test_shape(String raw_str, Imap_itm_shape expd) { raw_str = "File:A.png\n" + raw_str; - byte[] raw = Bry_.new_utf8_(raw_str); - Imap_itm[] actl_ary = parser.Parse(raw, 0, raw.length); - Imap_itm_shape actl = actl_ary == null | actl_ary.length != 2 ? null : (Imap_itm_shape)actl_ary[1]; + byte[] raw = Bry_.new_utf8_(raw_str); + parser.Parse(imap, 1, raw, 0, raw.length); + Imap_itm_shape[] actl_ary = imap.Shapes(); + Imap_itm_shape actl = actl_ary == null | actl_ary.length != 1 ? null : (Imap_itm_shape)actl_ary[0]; if (actl == null && expd == null) {} // noop; test passed else if (actl == null && expd != null) {Tfds.Fail("actl should not be null", raw);} else if (actl != null && expd == null) {Tfds.Fail("actl should be null", raw);} else { Tfds.Eq(expd.Itm_tid(), actl.Itm_tid(), "tid"); Tfds.Eq_ary(expd.Shape_pts(), actl.Shape_pts(), "pts"); - Xop_bry_tkn expd_link_tkn = ((Xop_bry_tkn)expd.Shape_link()); - String expd_link = String_.new_utf8_(expd_link_tkn.Val()); - String actl_link = String_.new_utf8_(raw, actl.Shape_link().Src_bgn(), actl.Shape_link().Src_end()); - Tfds.Eq(expd_link, actl_link); + Tfds.Eq(String_.new_utf8_(expd.Link_href()), String_.new_utf8_(actl.Link_href())); + Tfds.Eq(String_.new_utf8_(expd.Link_text()), String_.new_utf8_(actl.Link_text())); } - Tfds.Eq(0, parser.Errs().Count(), "expd 0 errors"); + Tfds.Eq(0, imap.Errs().length, "expd 0 errors"); } public void Test_shape_err(String raw_str, String expd_err) { raw_str = "File:A.png\n" + raw_str; byte[] raw = Bry_.new_utf8_(raw_str); - parser.Parse(raw, 0, raw.length); - Imap_itm_err[] err_ary = (Imap_itm_err[])parser.Errs().XtoAryAndClear(Imap_itm_err.class); + parser.Parse(imap, 1, raw, 0, raw.length); + Imap_err[] err_ary = imap.Errs(); Tfds.Eq(1, err_ary.length, "expd 1 err"); Tfds.Eq(expd_err, err_ary[0].Err_key()); } diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_pts_fmtr_arg.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_pts_fmtr_arg.java new file mode 100644 index 000000000..4b0bc48b1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_pts_fmtr_arg.java @@ -0,0 +1,33 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +class Imap_pts_fmtr_arg implements Bry_fmtr_arg { + private double scale = 1; private Double_obj_val[] pts; + public void Scale_(double v) {this.scale = v;} + public void Pts_(Double_obj_val[] v) {this.pts = v;} + public void XferAry(Bry_bfr bfr, int idx) { + int pts_len = pts.length; + for (int i = 0; i < pts_len; ++i) { + Double_obj_val pt = pts[i]; + if (i != 0) bfr.Add_byte_comma(); + int pt_int = (int)pt.Val(); + pt_int = (int)Math_.Round(scale * pt_int, 0); + bfr.Add_int_variable(pt_int); + } + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde.java new file mode 100644 index 000000000..bb5938000 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde.java @@ -0,0 +1,35 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.html.*; import gplx.xowa.parsers.logs.*; +public class Imap_xnde implements Xox_xnde { + private Imap_xtn_mgr xtn_mgr; + private Imap_map imap_data; + public void Xtn_parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) { + xtn_mgr = (Imap_xtn_mgr)wiki.Xtn_mgr().Get_or_fail(Imap_xtn_mgr.Xtn_key_static); + xtn_mgr.Xtn_assert(); + ctx.Cur_page().Html_data().Module_mgr().Itm_popups().Bind_hover_area_(true); + ctx.Para().Process_block__xnde(xnde.Tag(), Xop_xnde_tag.Block_end); + imap_data = xtn_mgr.Parser().Parse(wiki, ctx, root, src, xnde); + ctx.Para().Process_block__xnde(xnde.Tag(), Xop_xnde_tag.Block_end); + boolean log_wkr_enabled = Log_wkr != Xop_log_basic_wkr.Null; if (log_wkr_enabled) Log_wkr.Log_end_xnde(ctx.Cur_page(), Xop_log_basic_wkr.Tid_imageMap, src, xnde); + } public static Xop_log_basic_wkr Log_wkr = Xop_log_basic_wkr.Null; + public void Xtn_write(Xoa_app app, Xoh_html_wtr html_wtr, Xoh_html_wtr_ctx opts, Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) { + html_wtr.Write_tkn(bfr, ctx, opts, imap_data.Img_src(), xnde, Xoh_html_wtr.Sub_idx_null, imap_data.Img().Img_link()); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_all_tst.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_all_tst.java new file mode 100644 index 000000000..7e48243bd --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_all_tst.java @@ -0,0 +1,191 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import org.junit.*; +public class Imap_xnde_html_all_tst { + @Before public void init() {fxt.Reset();} private Imap_xnde_html_fxt fxt = new Imap_xnde_html_fxt(); + @Test public void Basic() { + fxt.Test_html_full_str(String_.Concat_lines_nl_skip_last + ( "" + , "File:A.png|thumb|123px|a1" + , "circle 0 0 5 [[B|b1]]" + , "rect 0 0 4 8 [[C|c1]]" + , "desc none" + , "" + ), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , " " + , " \"b1\"" + , " \"c1\"" + , " " + , " \"\"" + , "
" + , "
" + , "
" + , " " + , " \"\"" + , " " + , "
" + , " a1" + , "
" + , "
" + , "
" + )); + } + @Test public void Caption_xml() { // PURPOSE: xnde in caption was being escaped; PAGE:en.w:Council_of_Europe; DATE:2014-07-25 + fxt.Test_html_full_frag("File:A.png|thumb|c\n", "c"); + } + @Test public void Default() { + fxt.Test_html_full_str(String_.Concat_lines_nl_skip_last + ( "" + , "File:A.png|thumb|123px|a1" + , "default [[B|b1]]" + , "" + ), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , " " + , " " + , " " + , " \"\"" + , " " + , "
" + , "
" + , "
" + , " " + , " \"\"" + , " " + , "
" + , " a1" + , "
" + , "
" + , "
" + )); + } + @Test public void Desc() { + fxt.Test_html_full_str(String_.Concat_lines_nl_skip_last + ( "" + , "File:A.png|123px|a1" + , "desc top-left" + , "" + ), String_.Concat_lines_nl_skip_last + ( "
" + , " " + , " " + , " \"a1\"" + , "
" + , " " + , " \"click" + , " " + , "
" + , "
" + )); + } + @Test public void Lnke() { // PURPOSE: handle shapes with lnke; PAGE:en.w:Cholesterolt DATE:2014-07-25 + fxt.Test_html_full_str(String_.Concat_lines_nl_skip_last + ( "" + , "File:A.png|thumb|123px|a1" + , "circle 0 0 5 [[http://b.org b1]]" + , "desc none" + , "" + ), String_.Concat_lines_nl_skip_last + ( "
" + , "
" + , "
" + , " " + , " \"b1\"" + , " " + , " \"\"" + , "
" + , "
" + , "
" + , " " + , " \"\"" + , " " + , "
" + , " a1" + , "
" + , "
" + , "
" + )); + } + @Test public void Err_trailing_ws() { // PURPOSE: empty 1st line causes failure + fxt.Test_html_full_frag(String_.Concat_lines_nl_skip_last + ( " " + , "File:A.png|thumb|test_caption" + , "" + ), "test_caption" // no error if test_caption appears; + ); + } + @Test public void Para_omitted() { // PURPOSE: imagemap should not be automatically enclosed in para; PAGE:cs.w:Seznam_clenu_ctrn�ct�ho_Knesetu; DATE:2014-05-08; + fxt.Fxt().Init_para_y_(); + fxt.Test_html_full_str("File:A.png a", fxt.Frag_html_full() + " a"); // NOTE: "a" no longer enclosed in

; DATE:2014-07-25 + fxt.Fxt().Init_para_n_(); + } + @Test public void Xnde_double_pipe() {// PURPOSE: if || is inside table and imagemap, treat as lnki; EX:w:United_States_presidential_election,_1992; DATE:2014-03-29; DATE:2014-05-06 + fxt.Test_html_full_str(String_.Concat_lines_nl_skip_last + ( "{|" + , "|-" + , "| z" + , "" + , "File:A.png||123px|b" // NOTE: "||" should not be tblw; also should not be pipe + text; if it is pipe + text, then caption will be "|123px" and width will be -1; DATE:2014-05-06 + , "" + , "|}" + ) , String_.Concat_lines_nl_skip_last + ( "

" + , " " + , " " + , " " + , "
z" + , "
" + , " " + , " " + , " \"b\"" // NOTE: width must be 123, not 0 + , "
" + , "
" + , "" + ) + ); + } + @Test public void Tmpl() { // PURPOSE: handle templates in caption; PAGE:en.w:Kilauea; DATE:2014-07-27 + fxt.Fxt().Init_page_create("Template:Test_template", "xyz"); + fxt.Test_html_full_frag("File:A.png|thumb|{{Test_template}}\n", "xyz"); + } +} +class Imap_xnde_html_fxt { + public void Reset() { + fxt.Reset(); + Xol_msg_itm msg = fxt.Wiki().Msg_mgr().Get_or_make(Bry_.new_ascii_("imagemap_description")); + msg.Atrs_set(Bry_.new_ascii_("click here"), false, false); + } + public Xop_fxt Fxt() {return fxt;} private Xop_fxt fxt = new Xop_fxt(); + public void Test_html_full_str(String raw, String expd) {fxt.Test_html_full_str(raw, expd);} + public void Test_html_full_frag(String raw, String expd) {fxt.Test_html_full_frag(raw, expd);} + public String Frag_html_full() { + return String_.Concat_lines_nl_skip_last + ( "

" + , " " + , " " + , " \"\"" + , "
" + ); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_itm_tst.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_itm_tst.java new file mode 100644 index 000000000..95df7a611 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xnde_html_itm_tst.java @@ -0,0 +1,33 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import org.junit.*; +public class Imap_xnde_html_itm_tst { + @Before public void init() {fxt.Reset();} private Imap_html_bldr_fxt fxt = new Imap_html_bldr_fxt(); + @Test public void Rect() {fxt.Test_shape_html(fxt.itm_rect_("[[A|b]]", 1, 2, 3, 4), "\n \"b\"");} + @Test public void Circle() {fxt.Test_shape_html(fxt.itm_circle_("[[A|b]]", 1, 2, 3 ), "\n \"b\"");} + @Test public void Poly() {fxt.Test_shape_html(fxt.itm_poly_("[[A|b]]", 1, 2, 3, 4), "\n \"b\"");} +} +class Imap_html_bldr_fxt extends Imap_fxt_base { + private Bry_bfr bfr = Bry_bfr.new_(); + private Imap_pts_fmtr_arg pts_fmtr_arg = new Imap_pts_fmtr_arg(); + public void Test_shape_html(Imap_itm_shape shape, String expd) { + Imap_map.Fmt_shape(bfr, Imap_html_fmtrs.Area, pts_fmtr_arg, shape); + Tfds.Eq(expd, bfr.XtoStrAndClear()); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xtn_mgr.java new file mode 100644 index 000000000..5f9194cc4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_xtn_mgr.java @@ -0,0 +1,47 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.wikis.*; +import gplx.core.btries.*; +public class Imap_xtn_mgr extends Xox_mgr_base implements GfoInvkAble { + private boolean init; + @Override public boolean Enabled_default() {return true;} + @Override public byte[] Xtn_key() {return Xtn_key_static;} public static final byte[] Xtn_key_static = Bry_.new_ascii_("imageMap"); + public Xow_wiki Wiki() {return wiki;} private Xow_wiki wiki; + @gplx.Internal protected Imap_parser Parser() {return parser;} private Imap_parser parser; + public void Desc_assert() { + if (desc_trie != null) return; + desc_trie = Imap_desc_tid.trie_(wiki); + desc_msg = wiki.Msg_mgr().Val_by_key_obj("imagemap_description"); + desc_icon_url = wiki.App().Fsys_mgr().Bin_extensions_dir().GenSubFil_nest("ImageMap", "imgs", "desc-20.png").To_http_file_bry(); + } + public Btrie_slim_mgr Desc_trie() {return desc_trie;} private Btrie_slim_mgr desc_trie; + public byte[] Desc_msg() {return desc_msg;} private byte[] desc_msg; + public byte[] Desc_icon_url() {return desc_icon_url;} private byte[] desc_icon_url; + @Override public Xox_mgr Clone_new() {return new Imap_xtn_mgr();} + @Override public void Xtn_init_by_wiki(Xow_wiki wiki) { + this.wiki = wiki; + } + public void Xtn_assert() { + if (init) return; + parser = new Imap_parser(this); + init = true; + } + public void Clear() { + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst.java b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst.java index 04d84845d..402ea4236 100644 --- a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst.java +++ b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.lst; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Lst_pfunc_lst extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_lst;} @Override public Pf_func New(int id, byte[] name) {return new Lst_pfunc_lst().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lstx.java b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lstx.java index 0d4b81496..81676c682 100644 --- a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lstx.java +++ b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lstx.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.lst; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Lst_pfunc_lstx extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_lstx;} @Override public Pf_func New(int id, byte[] name) {return new Lst_pfunc_lstx().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java index 32c78c595..0c0379b06 100644 --- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java +++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.mapSources; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Map_dd2dms_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_mapSources_dd2dms;} @Override public Pf_func New(int id, byte[] name) {return new Map_dd2dms_func().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func.java index bab323fb5..76a5624fd 100644 --- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func.java +++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.mapSources; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Map_deg2dd_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_mapSources_deg2dd;} @Override public Pf_func New(int id, byte[] name) {return new Map_deg2dd_func().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java index 4dd406a39..c82b6d274 100644 --- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java +++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.mapSources; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Map_geolink_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_mapSources_geoLink;} @Override public Pf_func New(int id, byte[] name) {return new Map_geolink_func().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/massMessage/Message_target_func.java b/400_xowa/src/gplx/xowa/xtns/massMessage/Message_target_func.java index af2ae026d..fe1c7907f 100644 --- a/400_xowa/src/gplx/xowa/xtns/massMessage/Message_target_func.java +++ b/400_xowa/src/gplx/xowa/xtns/massMessage/Message_target_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.massMessage; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Message_target_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_massMessage_target;} @Override public Pf_func New(int id, byte[] name) {return new Message_target_func().Name_(name);} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func.java similarity index 90% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_func.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func.java index 79636322c..3c211e812 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; public interface Pf_func extends Xot_defn { int Id(); void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb); diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java similarity index 93% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_func_.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java index 63cd23596..45894ba81 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java @@ -15,8 +15,8 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; -import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.pfuncs.times.*; import gplx.xowa.xtns.pfuncs.numbers.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.pfuncs.langs.*; import gplx.xowa.xtns.pfuncs.strings.*; +package gplx.xowa.xtns.pfuncs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.pfuncs.times.*; import gplx.xowa.xtns.pfuncs.numbers.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.pfuncs.langs.*; import gplx.xowa.xtns.pfuncs.strings.*; import gplx.xowa.xtns.pfuncs.pages.*; import gplx.xowa.xtns.pfuncs.wikis.*; public class Pf_func_ { public static byte[] Eval_arg_or_empty(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, int self_args_len, int i) {return Eval_arg_or(ctx, src, caller, self, self_args_len, i, Bry_.Empty);} public static final byte Name_dlm = Byte_ascii.Colon; @@ -264,7 +264,7 @@ public class Pf_func_ { case Xol_kwd_grp_.Id_ttl_subj_txt: case Xol_kwd_grp_.Id_ttl_subj_url: case Xol_kwd_grp_.Id_ttl_talk_txt: - case Xol_kwd_grp_.Id_ttl_talk_url: return Pf_name._; + case Xol_kwd_grp_.Id_ttl_talk_url: return Pfunc_ttl._; case Xol_kwd_grp_.Id_site_sitename: case Xol_kwd_grp_.Id_site_servername: @@ -274,7 +274,7 @@ public class Pf_func_ { case Xol_kwd_grp_.Id_site_stylepath: case Xol_kwd_grp_.Id_site_contentlanguage: case Xol_kwd_grp_.Id_site_directionmark: - case Xol_kwd_grp_.Id_site_currentversion: return Pf_wiki_props._; + case Xol_kwd_grp_.Id_site_currentversion: return Pfunc_wiki_props._; case Xol_kwd_grp_.Id_num_pages: case Xol_kwd_grp_.Id_num_articles: @@ -283,17 +283,17 @@ public class Pf_func_ { case Xol_kwd_grp_.Id_num_views: case Xol_kwd_grp_.Id_num_users: case Xol_kwd_grp_.Id_num_users_active: - case Xol_kwd_grp_.Id_num_admins: return Pf_wiki_stats._; + case Xol_kwd_grp_.Id_num_admins: return Pfunc_wiki_stats._; case Xol_kwd_grp_.Id_page_id: case Xol_kwd_grp_.Id_rev_id: case Xol_kwd_grp_.Id_rev_pagesize: case Xol_kwd_grp_.Id_rev_user: - case Xol_kwd_grp_.Id_rev_protectionlevel: return Pf_rev_props._; - case Xol_kwd_grp_.Id_page_displaytitle: return Pf_page_displaytitle._; - case Xol_kwd_grp_.Id_page_defaultsort: return Pf_page_defaultsort._; - case Xol_kwd_grp_.Id_noeditsection: return Pf_page_noeditsection._; - case Xol_kwd_grp_.Id_site_pagesincategory: return Pf_site_pagesincategory._; + case Xol_kwd_grp_.Id_rev_protectionlevel: return Pfunc_rev_props._; + case Xol_kwd_grp_.Id_page_displaytitle: return Pfunc_displaytitle._; + case Xol_kwd_grp_.Id_page_defaultsort: return Pfunc_defaultsort._; + case Xol_kwd_grp_.Id_noeditsection: return Pfunc_noeditsection._; + case Xol_kwd_grp_.Id_site_pagesincategory: return Pfunc_pagesincategory._; case Xol_kwd_grp_.Id_url_ns: return new Pfunc_ns(false); case Xol_kwd_grp_.Id_url_nse: return new Pfunc_ns(true); @@ -319,7 +319,7 @@ public class Pf_func_ { case Xol_kwd_grp_.Id_i18n_language: return new Pfunc_language(); case Xol_kwd_grp_.Id_i18n_int: return new Pfunc_int(); case Xol_kwd_grp_.Id_i18n_grammar: return new Pfunc_grammar(); - case Xol_kwd_grp_.Id_misc_tag: return new Pf_tag(); + case Xol_kwd_grp_.Id_misc_tag: return new Pfunc_tag(); case Xol_kwd_grp_.Id_xtn_expr: return new gplx.xowa.xtns.pfuncs.exprs.Pfunc_expr(); case Xol_kwd_grp_.Id_xtn_if: return new Pfunc_if(); diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_base.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_base.java similarity index 94% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_func_base.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_base.java index ad12cb16f..a81dcf3cd 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_base.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_base.java @@ -15,7 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; public abstract class Pf_func_base implements Pf_func { public byte Defn_tid() {return Xot_defn_.Tid_func;} public byte[] Name() {return name;} public Pf_func_base Name_(byte[] v) {name = v; name_len = v.length; return this;} private byte[] name = Bry_.Empty; int name_len = 0; @@ -54,7 +54,7 @@ public abstract class Pf_func_base implements Pf_func { else { // colon found; EX: {{#func:}} if (Bry_.Match_bwd_any(src, colon_pos - 1, src_bgn - 1, func_name)) // #func == func_name; EX: {{NAMESPACE:}} return Eval_arg_or_null_is_empty; - else // #func != func_name; assume subst: or safesubst:; EX: {{safesubst:NAMESPACE}}; NOTE: can check subst / safesubs trie, but will be expensive; also, only Pf_name calls this function + else // #func != func_name; assume subst: or safesubst:; EX: {{safesubst:NAMESPACE}}; NOTE: can check subst / safesubs trie, but will be expensive; also, only Pfunc_ttl calls this function return Eval_arg_or_null_is_null; } } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_defaultsort.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_defaultsort.java new file mode 100644 index 000000000..2371c6e84 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_defaultsort.java @@ -0,0 +1,24 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +public class Pfunc_defaultsort extends Pf_func_base { + @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb) {} + @Override public int Id() {return Xol_kwd_grp_.Id_page_defaultsort;} + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_defaultsort().Name_(name);} + public static final Pfunc_defaultsort _ = new Pfunc_defaultsort(); Pfunc_defaultsort() {} +} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_page_displaytitle.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle.java similarity index 57% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_page_displaytitle.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle.java index 2e3f3ac6f..5346b5c9a 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_page_displaytitle.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle.java @@ -15,10 +15,10 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; -class Pf_page_displaytitle extends Pf_func_base { +package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +public class Pfunc_displaytitle extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_page_displaytitle;} - @Override public Pf_func New(int id, byte[] name) {return new Pf_page_displaytitle().Name_(name);} + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_displaytitle().Name_(name);} @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) { byte[] val_dat_ary = Eval_argx(ctx, src, caller, self); Xow_wiki wiki = ctx.Wiki(); Xop_parser parser = wiki.Parser(); @@ -29,17 +29,5 @@ class Pf_page_displaytitle extends Pf_func_base { byte[] val_html = tmp_bfr.Mkr_rls().XtoAryAndClear(); ctx.Cur_page().Display_ttl_(val_html); } - public static final Pf_page_displaytitle _ = new Pf_page_displaytitle(); Pf_page_displaytitle() {} + public static final Pfunc_displaytitle _ = new Pfunc_displaytitle(); Pfunc_displaytitle() {} } -class Pf_page_defaultsort extends Pf_func_base { - @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb) {} - @Override public int Id() {return Xol_kwd_grp_.Id_page_defaultsort;} - @Override public Pf_func New(int id, byte[] name) {return new Pf_page_defaultsort().Name_(name);} - public static final Pf_page_defaultsort _ = new Pf_page_defaultsort(); Pf_page_defaultsort() {} -} -class Pf_page_noeditsection extends Pf_func_base { - @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb) {} - @Override public int Id() {return Xol_kwd_grp_.Id_noeditsection;} - @Override public Pf_func New(int id, byte[] name) {return new Pf_page_noeditsection().Name_(name);} - public static final Pf_page_noeditsection _ = new Pf_page_noeditsection(); Pf_page_noeditsection() {} -} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_page_displaytitle_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle_tst.java similarity index 83% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_page_displaytitle_tst.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle_tst.java index e13e092eb..743e75e9b 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_page_displaytitle_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_displaytitle_tst.java @@ -15,10 +15,10 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import org.junit.*; -public class Pf_page_displaytitle_tst { - @Before public void init() {fxt.Reset();} private Pf_page_displaytitle_fxt fxt = new Pf_page_displaytitle_fxt(); +public class Pfunc_displaytitle_tst { + @Before public void init() {fxt.Reset();} private Pfunc_displaytitle_fxt fxt = new Pfunc_displaytitle_fxt(); @Test public void Basic() {fxt.Test("{{DISPLAYTITLE:a}}" , "a");} @Test public void Apos_italic() {fxt.Test("{{DISPLAYTITLE:''a''}}" , "a");} @Test public void Strip_display() { @@ -29,7 +29,7 @@ public class Pf_page_displaytitle_tst { fxt.Test("{{DISPLAYTITLE:display:none}}" , "display:none"); } } -class Pf_page_displaytitle_fxt { +class Pfunc_displaytitle_fxt { private Xop_fxt fxt = new Xop_fxt(); public void Reset() { fxt.Reset(); diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_misc_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_misc_tst.java similarity index 86% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_func_misc_tst.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_misc_tst.java index 30de44d07..9e6ecca95 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_func_misc_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_misc_tst.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import org.junit.*; -public class Pf_func_misc_tst { +public class Pfunc_misc_tst { private Xop_fxt fxt = new Xop_fxt(); @Before public void init() {fxt.Reset();} @Test public void CascadingSources() {fxt.Test_parse_page_all_str("{{CASCADINGSOURCES}}", "");} // PURPOSE: noop; DATE:2014-04-09 diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_noeditsection.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_noeditsection.java new file mode 100644 index 000000000..27cf1af36 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_noeditsection.java @@ -0,0 +1,24 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +public class Pfunc_noeditsection extends Pf_func_base { + @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb) {} + @Override public int Id() {return Xol_kwd_grp_.Id_noeditsection;} + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_noeditsection().Name_(name);} + public static final Pfunc_noeditsection _ = new Pfunc_noeditsection(); Pfunc_noeditsection() {} +} diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_rev_props.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_rev_props.java new file mode 100644 index 000000000..882f3cffb --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_rev_props.java @@ -0,0 +1,50 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +public class Pfunc_rev_props extends Pf_func_base { + @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) { + byte[] argx = Eval_argx(ctx, src, caller, self); + Xoa_revision_data revision_data = ctx.Cur_page().Revision_data(); + switch (id) { + case Xol_kwd_grp_.Id_page_id: + case Xol_kwd_grp_.Id_rev_id: bfr.Add_int_variable(ctx.Cur_page().Revision_data().Id()); break; // NOTE: making rev_id and page_id interchangeable; XOWA does not store rev_id + case Xol_kwd_grp_.Id_rev_user: bfr.Add(revision_data.User()); break; + case Xol_kwd_grp_.Id_rev_pagesize: + if (argx.length > 0) { + Xoa_ttl argx_ttl = Xoa_ttl.parse_(ctx.Wiki(), argx); + if (argx_ttl == null) { // invalid ttl; EX: {{PAGESIZE:{{{bad}}}}} + bfr.Add_byte(Byte_ascii.Num_0); + return; + } + Xoa_page argx_page = ctx.Wiki().Data_mgr().Get_page(argx_ttl, false); + if (!argx_page.Missing()) { + bfr.Add_int_variable(argx_page.Data_raw().length); + return; + } + } + bfr.Add_byte(Byte_ascii.Num_0); + break; + case Xol_kwd_grp_.Id_rev_protectionlevel: bfr.Add(revision_data.Protection_level()); break; + default: throw Err_.unhandled(id); + } + } + public Pfunc_rev_props(int id) {this.id = id;} + @Override public int Id() {return id;} private int id; + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_rev_props(id).Name_(name);} + public static final Pfunc_rev_props _ = new Pfunc_rev_props(-1); +} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_rev_props_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_rev_props_tst.java similarity index 90% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_rev_props_tst.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_rev_props_tst.java index 28176f1b1..d90556855 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_rev_props_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/pages/Pfunc_rev_props_tst.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import org.junit.*; -public class Pf_rev_props_tst { +public class Pfunc_rev_props_tst { private Xop_fxt fxt = new Xop_fxt(); @Before public void setup() {fxt.Reset(); fxt.Page().Revision_data().User_(Bry_.new_ascii_("user")).Protection_level_(Bry_.new_ascii_("normal"));} @After public void teardown() {} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_tag.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java similarity index 87% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_tag.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java index d73de80e0..7905f2599 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_tag.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java @@ -15,11 +15,11 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.strings; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.html.*; -public class Pf_tag extends Pf_func_base { +public class Pfunc_tag extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_misc_tag;} - @Override public Pf_func New(int id, byte[] name) {return new Pf_tag().Name_(name);} + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_tag().Name_(name);} @Override public boolean Func_require_colon_arg() {return true;} @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) { byte[] tag_name = Eval_argx(ctx, src, caller, self); if (tag_name.length == 0) return; @@ -38,7 +38,7 @@ public class Pf_tag extends Pf_func_base { byte[] arg = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, args_len, i); // NOTE: must evaluate arg; don't try to parse arg_tkn's key / val separately; EX:{{#tag:pre|a|{{#switch:a|a=id}}=c}} if (arg.length == 0) continue; // skip empty atrs tmp.Add_byte(Byte_ascii.Space); - Pf_tag_kv_bldr.Add_arg_as_html_atr(arg, tmp); + Pfunc_tag_kv_bldr.Add_arg_as_html_atr(arg, tmp); } } tmp.Add_byte(Byte_ascii.Gt); @@ -61,13 +61,13 @@ public class Pf_tag extends Pf_func_base { , Xtag_rhs = Bry_.new_ascii_("'/>") ; } -class Pf_tag_kv_bldr { +class Pfunc_tag_kv_bldr { public int Key_bgn() {return key_bgn;} private int key_bgn; public int KeyEnd() {return key_end;} private int key_end; - public Pf_tag_kv_bldr Key_rng_(int bgn, int end) {key_bgn = bgn; key_end = end; return this;} + public Pfunc_tag_kv_bldr Key_rng_(int bgn, int end) {key_bgn = bgn; key_end = end; return this;} public int Val_bgn() {return val_bgn;} private int val_bgn; public int Val_end() {return val_end;} private int val_end; - public Pf_tag_kv_bldr Val_rng_(int bgn, int end) {val_bgn = bgn; val_end = end; return this;} + public Pfunc_tag_kv_bldr Val_rng_(int bgn, int end) {val_bgn = bgn; val_end = end; return this;} public boolean Valid() { return key_bgn != -1 && key_end != -1 && val_bgn != -1 && val_end != -1 && key_bgn <= key_end && val_bgn <= val_end; } @@ -91,7 +91,7 @@ class Pf_tag_kv_bldr { kv_bldr.Clear(); } } - private static void ParseKeyVal(byte[] src, Pf_tag_kv_bldr kv_bldr) { + private static void ParseKeyVal(byte[] src, Pfunc_tag_kv_bldr kv_bldr) { kv_bldr.Clear(); // do not forget to clear; DATE:2014-07-20 int itm_bgn = -1, itm_end = -1, src_len = src.length; boolean mode_is_key = true; @@ -123,5 +123,5 @@ class Pf_tag_kv_bldr { if (itm_end == -1) itm_end = src_len; kv_bldr.Val_rng_(itm_bgn, itm_end); } - private static Pf_tag_kv_bldr kv_bldr = new Pf_tag_kv_bldr(); + private static Pfunc_tag_kv_bldr kv_bldr = new Pfunc_tag_kv_bldr(); } diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_tag_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag_tst.java similarity index 95% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_tag_tst.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag_tst.java index 4c0688a56..165be4f62 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_tag_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag_tst.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.strings; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import org.junit.*; -public class Pf_tag_tst { +public class Pfunc_tag_tst { @Before public void init() {fxt.Reset();} private Xop_fxt fxt = new Xop_fxt(); @Test public void Basic() {fxt.Test_html_full_str("{{#tag:pre|a|id=b|style=c}}" , "
a
");} // @Test public void Missing_val() {fxt.ini_Msg(Mwl_tag_rsc._.Invalid).Test_parse_tmpl_str_test("{{#tag:pre|a|id=}}" , "{{test}}" , "");} // see {{Reflist|colwidth=30em}} -> a{{#tag:references||group=}} -> "" diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_name.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_ttl.java similarity index 89% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_name.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_ttl.java index 5652859f0..f85ab2ddd 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_name.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_ttl.java @@ -15,8 +15,8 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; -class Pf_name extends Pf_func_base { +package gplx.xowa.xtns.pfuncs.ttls; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +public class Pfunc_ttl extends Pf_func_base { @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) { byte[] val_dat_ary = Eval_argx_or_null(ctx, src, caller, self, this.Name()); if (val_dat_ary == Bry_.Empty) return; // if argx is empty, return EX: {{PAGENAME:}}; DATE:2013-02-20 @@ -44,8 +44,8 @@ class Pf_name extends Pf_func_base { case Xol_kwd_grp_.Id_ns_talk_url: bfr.Add(ctx.Wiki().Ns_mgr().Ords_get_at(ttl.Ns().Ord_talk_id()).Name_enc()); break; } } - public Pf_name(int id) {this.id = id;} + public Pfunc_ttl(int id) {this.id = id;} @Override public int Id() {return id;} private int id; - @Override public Pf_func New(int id, byte[] name) {return new Pf_name(id).Name_(name);} - public static final Pf_name _ = new Pf_name(-1); + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_ttl(id).Name_(name);} + public static final Pfunc_ttl _ = new Pfunc_ttl(-1); } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_ttl_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_ttl_tst.java new file mode 100644 index 000000000..efa36a0ad --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_ttl_tst.java @@ -0,0 +1,49 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.pfuncs.ttls; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +import org.junit.*; +public class Pfunc_ttl_tst { + private Xop_fxt fxt = new Xop_fxt(); + @Before public void init() {fxt.Reset();} + @Test public void Ttl_page_txt() {fxt.Page_ttl_("a b"); fxt.Test_parse_tmpl_str_test("{{PAGENAME}}" , "{{test}}", "A b");} + @Test public void Ttl_page_txt_empty() {fxt.Page_ttl_("a b"); fxt.Test_parse_tmpl_str_test("{{PAGENAME:}}" , "{{test}}", "");} + @Test public void Ttl_page_txt_empty_2() {fxt.Page_ttl_("a b"); fxt.Test_parse_tmpl_str_test("{{PAGENAME:{{{a|}}}}}" , "{{test}}", "");} // PURPOSE.fix: {{PAGENAME:{{{nom|}}}}} should return ""; pt.wikipedia.org/wiki/Nicholas Kratzer; DATE:2013-02-20 + @Test public void Ttl_page_txt_arg() {fxt.Page_ttl_("a b"); fxt.Test_parse_tmpl_str_test("{{PAGENAME:c d}}" , "{{test}}", "C d");} + @Test public void Ttl_page_txt_amp() {fxt.Page_ttl_("a b"); fxt.Test_parse_tmpl_str_test("{{PAGENAME:c & d}}" , "{{test}}", "C & d");} + @Test public void Ttl_page_url() {fxt.Page_ttl_("a b"); fxt.Test_parse_tmpl_str_test("{{PAGENAMEE}}" , "{{test}}", "A_b");} + @Test public void Ttl_full_txt() {fxt.Page_ttl_("Help:a b"); fxt.Test_parse_tmpl_str_test("{{FULLPAGENAME}}" , "{{test}}", "Help:A b");} + @Test public void Ttl_full_url() {fxt.Page_ttl_("Help:a b"); fxt.Test_parse_tmpl_str_test("{{FULLPAGENAMEE}}" , "{{test}}", "Help:A_b");} + @Test public void Ttl_leaf_txt() {fxt.Page_ttl_("a b/c/d e"); fxt.Test_parse_tmpl_str_test("{{SUBPAGENAME}}" , "{{test}}", "d e");} + @Test public void Ttl_leaf_url() {fxt.Page_ttl_("a b/c/d e"); fxt.Test_parse_tmpl_str_test("{{SUBPAGENAMEE}}" , "{{test}}", "d_e");} + @Test public void Ttl_base_txt() {fxt.Page_ttl_("a b/c/d e"); fxt.Test_parse_tmpl_str_test("{{BASEPAGENAME}}" , "{{test}}", "A b/c");} + @Test public void Ttl_base_url() {fxt.Page_ttl_("a b/c/d e"); fxt.Test_parse_tmpl_str_test("{{BASEPAGENAMEE}}" , "{{test}}", "A_b/c");} + @Test public void Ttl_subj_txt() {fxt.Page_ttl_("Help talk:a b"); fxt.Test_parse_tmpl_str_test("{{SUBJECTPAGENAME}}" , "{{test}}", "Help:A b");} + @Test public void Ttl_subj_url() {fxt.Page_ttl_("Help talk:a b"); fxt.Test_parse_tmpl_str_test("{{SUBJECTPAGENAMEE}}" , "{{test}}", "Help:A_b");} + @Test public void Ttl_talk_txt() {fxt.Page_ttl_("Help:a b"); fxt.Test_parse_tmpl_str_test("{{TALKPAGENAME}}" , "{{test}}", "Help talk:A b");} + @Test public void Ttl_talk_url() {fxt.Page_ttl_("Help:a b"); fxt.Test_parse_tmpl_str_test("{{TALKPAGENAMEE}}" , "{{test}}", "Help_talk:A_b");} + @Test public void Ns_num() {fxt.Page_ttl_("Help:A"); fxt.Test_parse_tmpl_str_test("{{NAMESPACENUMBER}}" , "{{test}}", "12");} + @Test public void Ns_txt() {fxt.Page_ttl_("Help talk:a b"); fxt.Test_parse_tmpl_str_test("{{NAMESPACE}}" , "{{test}}", "Help talk");} + @Test public void Ns_url() {fxt.Page_ttl_("Help talk:a b"); fxt.Test_parse_tmpl_str_test("{{NAMESPACEE}}" , "{{test}}", "Help_talk");} + @Test public void Ns_subj_txt() {fxt.Page_ttl_("Help talk:a b"); fxt.Test_parse_tmpl_str_test("{{SUBJECTSPACE}}" , "{{test}}", "Help");} + @Test public void Ns_subj_url() {fxt.Page_ttl_("Help talk:a b"); fxt.Test_parse_tmpl_str_test("{{SUBJECTSPACEE}}" , "{{test}}", "Help");} + @Test public void Ns_talk_txt() {fxt.Page_ttl_("Help:a b"); fxt.Test_parse_tmpl_str_test("{{TALKSPACE}}" , "{{test}}", "Help talk");} + @Test public void Ns_talk_url() {fxt.Page_ttl_("Help:a b"); fxt.Test_parse_tmpl_str_test("{{TALKSPACEE}}" , "{{test}}", "Help_talk");} + @Test public void Ns_safesubst() {fxt.Page_ttl_("Help:a"); fxt.Test_parse_tmpl_str_test("{{{{{|safesubst:}}}NAMESPACE}}" , "{{test}}", "Help");} // PURPOSE: "safesubst:NAMESPACE" was being interpreted as "NAMESPACE:" due to false colon detection; DATE:2013-11-11 + @Test public void Ns_safesubst2() {fxt.Page_ttl_("Help:a"); fxt.Test_parse_tmpl_str_test("{{{{{|safesubst:}}}NAMESPACE:}}" , "{{test}}", "");} //PURPOSE: makes sure "safesubst:NAMESPACE:" still returns "" + @Test public void Exc_empty2() {fxt.Page_ttl_("Test"); fxt.Test_parse_tmpl_str_test("{{NAMESPACE:x}}" , "{{test}}", "");} // {{NMS:x}} -> {{NMS:}} +} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_site_pagesincategory.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_pagesincategory.java similarity index 85% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_site_pagesincategory.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_pagesincategory.java index 5b70ffaf5..f2467f8ef 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_site_pagesincategory.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_pagesincategory.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import gplx.core.btries.*; import gplx.xowa.langs.numbers.*; -public class Pf_site_pagesincategory extends Pf_func_base { +public class Pfunc_pagesincategory extends Pf_func_base { @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb) { byte[] val_dat_ary = Eval_argx(ctx, src, caller, self); if (Bry_.Len_eq_0(val_dat_ary)) {bb.Add_int_fixed(0, 1); return;} val_dat_ary = Xoa_ttl.Replace_spaces(val_dat_ary); @@ -40,6 +40,6 @@ public class Pf_site_pagesincategory extends Pf_func_base { bb.Add(rslt); } private Btrie_slim_mgr trie; @Override public int Id() {return Xol_kwd_grp_.Id_site_pagesincategory;} - @Override public Pf_func New(int id, byte[] name) {return new Pf_site_pagesincategory().Name_(name);} - public static final Pf_site_pagesincategory _ = new Pf_site_pagesincategory(); Pf_site_pagesincategory() {} + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_pagesincategory().Name_(name);} + public static final Pfunc_pagesincategory _ = new Pfunc_pagesincategory(); Pfunc_pagesincategory() {} } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_props.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_props.java new file mode 100644 index 000000000..4a24fe258 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_props.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.pfuncs.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +public class Pfunc_wiki_props extends Pf_func_base { + @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr rslt_bfr) { + Xow_wiki_props props = ctx.Wiki().Props(); + switch (id) { + case Xol_kwd_grp_.Id_site_sitename: rslt_bfr.Add(props.SiteName()); break; + case Xol_kwd_grp_.Id_site_server: rslt_bfr.Add(props.Server()); break; + case Xol_kwd_grp_.Id_site_servername: rslt_bfr.Add(props.ServerName()); break; + case Xol_kwd_grp_.Id_site_articlepath: rslt_bfr.Add(props.ArticlePath()); break; + case Xol_kwd_grp_.Id_site_scriptpath: rslt_bfr.Add(props.ScriptPath()); break; + case Xol_kwd_grp_.Id_site_stylepath: rslt_bfr.Add(props.StylePath()); break; + case Xol_kwd_grp_.Id_site_contentlanguage: rslt_bfr.Add(ctx.Cur_page().Lang().Key_bry()); break; + case Xol_kwd_grp_.Id_site_directionmark: rslt_bfr.Add(props.DirectionMark()); break; // FUTURE: find page that uses it + case Xol_kwd_grp_.Id_site_currentversion: rslt_bfr.Add(props.CurrentVersion()); break; + default: throw Err_.unhandled(id); + } + } + public Pfunc_wiki_props(int id) {this.id = id;} + @Override public int Id() {return id;} private int id; + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_wiki_props(id).Name_(name);} + public static final Pfunc_wiki_props _ = new Pfunc_wiki_props(-1); +} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_wiki_props_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_props_tst.java similarity index 89% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_wiki_props_tst.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_props_tst.java index 8fa6e5919..d17398e40 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_wiki_props_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_props_tst.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import org.junit.*; -public class Pf_wiki_props_tst { +public class Pfunc_wiki_props_tst { private Xop_fxt fxt = new Xop_fxt(); @Before public void setup() {fxt.Reset(); fxt.Wiki().Stats().NumPages_(1).NumArticles_(2).NumFiles_(3).NumEdits_(4).NumViews_(5).NumUsers_(6).NumUsersActive_(7).NumAdmins_(8);} @Test public void NumPages() {fxt.Test_parse_tmpl_str_test("{{NUMBEROFPAGES}}" , "{{test}}", "1");} @@ -35,5 +35,5 @@ public class Pf_wiki_props_tst { fxt.Lang_by_id_(Xol_lang_itm_.Id_ru); Init_numArticles(1234); fxt.Test_parse_tmpl_str_test("{{NUMBEROFARTICLES}}" , "{{test}}", "1234"); Init_numArticles(2); } - private Pf_wiki_props_tst Init_numArticles(int v) {fxt.Wiki().Stats().NumArticles_(v); return this;} + private Pfunc_wiki_props_tst Init_numArticles(int v) {fxt.Wiki().Stats().NumArticles_(v); return this;} } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_stats.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_stats.java new file mode 100644 index 000000000..bd60cfa95 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_stats.java @@ -0,0 +1,49 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.pfuncs.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; +public class Pfunc_wiki_stats extends Pf_func_base { + @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr rslt_bfr) { + byte[] argx = Eval_argx(ctx, src, caller, self); + boolean raw = false; + if (argx.length == 1) { + byte argx_0 = argx[0]; + switch (argx_0) {case Byte_ascii.Ltr_R: case Byte_ascii.Ltr_r: raw = true; break;} + } + Xow_wiki_stats stats = ctx.Wiki().Stats(); + int v = 0; + switch (id) { + case Xol_kwd_grp_.Id_num_pages: v = stats.NumPages(); break; + case Xol_kwd_grp_.Id_num_articles: v = stats.NumArticles(); break; + case Xol_kwd_grp_.Id_num_files: v = stats.NumFiles(); break; + case Xol_kwd_grp_.Id_num_edits: v = stats.NumEdits(); break; + case Xol_kwd_grp_.Id_num_views: v = stats.NumViews(); break; + case Xol_kwd_grp_.Id_num_users: v = stats.NumUsers(); break; + case Xol_kwd_grp_.Id_num_users_active: v = stats.NumUsersActive(); break; + case Xol_kwd_grp_.Id_num_admins: v = stats.NumAdmins(); break; + default: throw Err_.unhandled(id); + } + if (raw) + rslt_bfr.Add_int_variable(v); + else + rslt_bfr.Add(ctx.Cur_page().Lang().Num_mgr().Format_num(v)); + } + public Pfunc_wiki_stats(int id) {this.id = id;} + @Override public int Id() {return id;} private int id; + @Override public Pf_func New(int id, byte[] name) {return new Pfunc_wiki_stats(id).Name_(name);} + public static final Pfunc_wiki_stats _ = new Pfunc_wiki_stats(-1); +} diff --git a/400_xowa/src_510_pf_core/gplx/xowa/Pf_wiki_stats_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_stats_tst.java similarity index 91% rename from 400_xowa/src_510_pf_core/gplx/xowa/Pf_wiki_stats_tst.java rename to 400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_stats_tst.java index 418691083..d599662c5 100644 --- a/400_xowa/src_510_pf_core/gplx/xowa/Pf_wiki_stats_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/wikis/Pfunc_wiki_stats_tst.java @@ -15,9 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa; import gplx.*; +package gplx.xowa.xtns.pfuncs.wikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*; import org.junit.*; -public class Pf_wiki_stats_tst { +public class Pfunc_wiki_stats_tst { private Xop_fxt fxt = new Xop_fxt(); @Before public void setup() {fxt.Reset();} @Test public void SiteName() {fxt.Test_parse_tmpl_str_test("{{SITENAME}}" , "{{test}}", "Wikipedia");} diff --git a/400_xowa/src/gplx/xowa/xtns/relatedArticles/Articles_func.java b/400_xowa/src/gplx/xowa/xtns/relatedArticles/Articles_func.java index d6500c70d..8f15d8e94 100644 --- a/400_xowa/src/gplx/xowa/xtns/relatedArticles/Articles_func.java +++ b/400_xowa/src/gplx/xowa/xtns/relatedArticles/Articles_func.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.relatedArticles; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.html.*; +import gplx.xowa.xtns.pfuncs.*; public class Articles_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_relatedArticles;} @Override public Pf_func New(int id, byte[] name) {return new Articles_func().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/relatedSites/Sites_func.java b/400_xowa/src/gplx/xowa/xtns/relatedSites/Sites_func.java index a8f65d175..9bbf40661 100644 --- a/400_xowa/src/gplx/xowa/xtns/relatedSites/Sites_func.java +++ b/400_xowa/src/gplx/xowa/xtns/relatedSites/Sites_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.relatedSites; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Sites_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_relatedSites;} @Override public Pf_func New(int id, byte[] name) {return new Sites_func().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_core.java b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_core.java index ff4d3d90d..75046f661 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_core.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_core.java @@ -101,6 +101,7 @@ public class Scrib_core { } lib_uri.Notify_page_changed(); lib_title.Notify_page_changed(); + lib_wikibase.Notify_page_changed(); } public byte[] Cur_wiki() {return cur_wiki;} private byte[] cur_wiki = Bry_.Empty; public byte[] Cur_lang() {return cur_lang;} private byte[] cur_lang = Bry_.Empty; @@ -155,7 +156,7 @@ public class Scrib_core { lib_mw.Invoke_bgn(wiki, ctx, src); Xot_invk old_frame_parent = this.frame_parent; Xot_invk old_frame_current = this.frame_current; this.frame_parent = parent_frame; this.frame_current = current_frame; - parent_frame.Scrib_frame_tid_(Scrib_frame_.Tid_parent); current_frame.Scrib_frame_tid_(Scrib_frame_.Tid_current); + parent_frame.Frame_tid_(Scrib_frame_.Tid_parent); current_frame.Frame_tid_(Scrib_frame_.Tid_current); try { Scrib_lua_mod mod = Mods_get_or_new(mod_name, mod_text); KeyVal[] func_args = Scrib_kv_utl_.base1_many_(mod.Init_chunk_func(), String_.new_utf8_(fnc_name)); @@ -168,7 +169,7 @@ public class Scrib_core { } finally { lib_mw.Invoke_end(); - parent_frame.Scrib_frame_tid_(Scrib_frame_.Tid_null); current_frame.Scrib_frame_tid_(Scrib_frame_.Tid_null); + parent_frame.Frame_tid_(Scrib_frame_.Tid_null); current_frame.Frame_tid_(Scrib_frame_.Tid_null); this.frame_parent = old_frame_parent; this.frame_current = old_frame_current; // NOTE: reset template frame; PAGE:en.w:Constantine_the_Great {{Christianity}}; DATE:2014-06-26 frame_created_list.Clear(); } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java index d2c7aedc9..f64dda72c 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func.java @@ -19,6 +19,7 @@ package gplx.xowa.xtns.scribunto; import gplx.*; import gplx.xowa.*; import gplx import gplx.html.*; import gplx.xowa.html.*; import gplx.xowa.parsers.logs.*; +import gplx.xowa.xtns.pfuncs.*; public class Scrib_invoke_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_invoke;} @Override public Pf_func New(int id, byte[] name) {return new Scrib_invoke_func().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java index 4fc438f03..bcabb9854 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/Scrib_invoke_func_fxt.java @@ -114,7 +114,7 @@ public class Scrib_invoke_func_fxt { fxt = new Xop_fxt(); // NOTE: don't try to cache fxt on func_fxt level; causes errors in Language_lib core_fxt = new Scrib_core_fxt(fxt); core = core_fxt.Core(); - Xot_invk parent_frame = new Xot_invk_temp(true); parent_frame.Scrib_frame_tid_(Scrib_frame_.Tid_null); + Xot_invk parent_frame = new Xot_invk_temp(true); parent_frame.Frame_tid_(Scrib_frame_.Tid_null); Xot_invk current_frame = Xot_invk_mock.test_(); current_frame.Frame_ttl_(Bry_.new_ascii_("Module:Mod_0")); core.Invoke_init(core.Wiki(), core.Ctx(), Bry_.Empty, parent_frame, current_frame); core.When_page_changed(fxt.Page()); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_message.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_message.java index 18f03e199..ff4d74b20 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_message.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_message.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.scribunto.lib; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; -import gplx.xowa.html.*; +import gplx.html.*; public class Scrib_lib_message implements Scrib_lib { public Scrib_lib_message(Scrib_core core) {this.core = core;} private Scrib_core core; public Scrib_lua_mod Mod() {return mod;} private Scrib_lua_mod mod; @@ -139,7 +139,7 @@ class Scrib_lib_message_data { break; case Fmt_tid_parseAsBlock: // NOTE: MW passes msg_val through parser and strips

if tid==parse; XOWA does the opposite, so add

if parseAsBlock requested Bry_bfr bfr = wiki.Utl_bry_bfr_mkr().Get_b512(); - msg_val = bfr.Add(Xoh_consts.P_bgn).Add(msg_val).Add(Xoh_consts.P_end).Mkr_rls().XtoAryAndClear(); + msg_val = bfr.Add(Html_tag_.P_lhs).Add(msg_val).Add(Html_tag_.P_rhs).Mkr_rls().XtoAryAndClear(); break; case Fmt_tid_escaped: msg_val = gplx.html.Html_utl.Escape_html_as_bry(msg_val); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java index 20e2fde30..99d6d9121 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_mw.java @@ -99,7 +99,7 @@ public class Scrib_lib_mw implements Scrib_lib { public boolean GetExpandedArgument(Scrib_proc_args args, Scrib_proc_rslt rslt) { String frame_id = args.Pull_str(0); Xot_invk frame = Scrib_frame_.Get_frame(core, frame_id); - int frame_arg_adj = Scrib_frame_.Get_arg_adj(frame.Scrib_frame_tid()); + int frame_arg_adj = Scrib_frame_.Get_arg_adj(frame.Frame_tid()); String idx_str = args.Pull_str(1); int idx_int = Int_.parse_or_(idx_str, Int_.MinValue); // NOTE: should not receive int value < -1; idx >= 0 Bry_bfr tmp_bfr = Bry_bfr.new_(); // NOTE: do not make modular level variable, else random failures; DATE:2013-10-14 @@ -151,7 +151,7 @@ public class Scrib_lib_mw implements Scrib_lib { public boolean GetAllExpandedArguments(Scrib_proc_args args, Scrib_proc_rslt rslt) { String frame_id = args.Pull_str(0); Xot_invk frame = Scrib_frame_.Get_frame(core, frame_id); - byte frame_tid = frame.Scrib_frame_tid(); + byte frame_tid = frame.Frame_tid(); Xot_invk parent_frame = Scrib_frame_.Get_parent(core, frame_tid); int frame_arg_adj = Scrib_frame_.Get_arg_adj(frame_tid); int args_len = frame.Args_len() - frame_arg_adj; @@ -203,12 +203,12 @@ public class Scrib_lib_mw implements Scrib_lib { return rslt.Init_obj(frame != null); } public boolean ParentFrameExists(Scrib_proc_args args, Scrib_proc_rslt rslt) { - return rslt.Init_obj(!core.Frame_parent().Root_frame()); + return rslt.Init_obj(!core.Frame_parent().Frame_is_root()); } public boolean Preprocess(Scrib_proc_args args, Scrib_proc_rslt rslt) { String frame_id = args.Pull_str(0); Xot_invk frame = Scrib_frame_.Get_frame(core, frame_id); - byte frame_tid = frame.Scrib_frame_tid(); + byte frame_tid = frame.Frame_tid(); Xot_invk parent_frame = Scrib_frame_.Get_parent(core, frame_tid); String text_str = args.Pull_str(1); byte[] text_bry = Bry_.new_utf8_(text_str); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase.java index ded57cf3a..cd9a76590 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_wikibase.java @@ -25,8 +25,9 @@ public class Scrib_lib_wikibase implements Scrib_lib { public Scrib_lua_mod Register(Scrib_core core, Io_url script_dir) { Init(); mod = core.RegisterInterface(this, script_dir.GenSubFil("mw.wikibase.lua")); + notify_page_changed_fnc = mod.Fncs_get_by_key("notify_page_changed"); return mod; - } + } private Scrib_lua_proc notify_page_changed_fnc; public Scrib_proc_mgr Procs() {return procs;} private Scrib_proc_mgr procs = new Scrib_proc_mgr(); public boolean Procs_exec(int key, Scrib_proc_args args, Scrib_proc_rslt rslt) { switch (key) { @@ -39,6 +40,7 @@ public class Scrib_lib_wikibase implements Scrib_lib { private static final int Proc_getEntity = 0, Proc_getEntityId = 1, Proc_getGlobalSiteId = 2; public static final String Invk_getEntity = "getEntity", Invk_getEntityId = "getEntityId", Invk_getGlobalSiteId = "getGlobalSiteId"; private static final String[] Proc_names = String_.Ary(Invk_getEntity, Invk_getEntityId, Invk_getGlobalSiteId); + public void Notify_page_changed() {if (notify_page_changed_fnc != null) core.Interpreter().CallFunction(notify_page_changed_fnc.Id(), KeyVal_.Ary_empty);} public boolean GetEntity(Scrib_proc_args args, Scrib_proc_rslt rslt) { byte[] ttl_bry = args.Pull_bry(0); if (Bry_.Len_eq_0(ttl_bry)) return rslt.Init_empty(); // NOTE: some Modules do not pass in an argument; return early, else spurious warning "invalid qid for ttl" (since ttl is blank); EX:w:Module:Authority_control; DATE:2013-10-27 diff --git a/400_xowa/src/gplx/xowa/xtns/syntaxHighlight/Xtn_syntaxHighlight_nde.java b/400_xowa/src/gplx/xowa/xtns/syntaxHighlight/Xtn_syntaxHighlight_nde.java index e93e06cfb..e4637a239 100644 --- a/400_xowa/src/gplx/xowa/xtns/syntaxHighlight/Xtn_syntaxHighlight_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/syntaxHighlight/Xtn_syntaxHighlight_nde.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.syntaxHighlight; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.xowa.html.*; +import gplx.html.*; import gplx.xowa.html.*; public class Xtn_syntaxHighlight_nde implements Xox_xnde, Xop_xnde_atr_parser { private byte[] lang = Bry_.Empty; private byte[] style = null; private byte[] enclose = Bry_.Empty; private boolean line_enabled = false; private int start = 1; private Int_rng_mgr highlight_idxs = Int_rng_mgr_null._; @@ -83,7 +83,7 @@ public class Xtn_syntaxHighlight_nde implements Xox_xnde, Xop_xnde_atr_parser { Xox_mgr_base.Xtn_write_escape(app, bfr, line); bfr.Add(Xoh_consts.Span_end); if (enclose_is_none) - bfr.Add(Xoh_consts.Br); + bfr.Add(Html_tag_.Br_inl); bfr.Add_byte_nl(); } } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_external_lang_links_data.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_external_lang_links_data.java index cde361c58..05aae015f 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_external_lang_links_data.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_external_lang_links_data.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.wdatas; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Wdata_external_lang_links_data { private ListAdp langs_list = ListAdp_.new_(); private Hash_adp_bry langs_hash = Hash_adp_bry.ci_ascii_(); // ASCII:lang_code public boolean Enabled() {return enabled;} private boolean enabled; public Wdata_external_lang_links_data Enabled_(boolean v) {enabled = v; return this;} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_noExternalLangLinks.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_noExternalLangLinks.java index 2371dad15..019244d6b 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_noExternalLangLinks.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_noExternalLangLinks.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.wdatas; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.json.*; +import gplx.xowa.xtns.pfuncs.*; public class Wdata_pf_noExternalLangLinks extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_noexternallanglinks;} @Override public Pf_func New(int id, byte[] name) {return new Wdata_pf_noExternalLangLinks().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_property.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_property.java index f15218b5a..b1a4b49e1 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_property.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_pf_property.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.wdatas; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.json.*; import gplx.xowa.parsers.logs.*; +import gplx.json.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.xtns.pfuncs.*; public class Wdata_pf_property extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_property;} @Override public Pf_func New(int id, byte[] name) {return new Wdata_pf_property().Name_(name);} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java index 3f1923ad2..438baa518 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java @@ -42,22 +42,21 @@ public class Wdata_wiki_mgr implements GfoInvkAble { byte[] qids_key = bfr.Add_byte(Byte_ascii.Pipe).Add(ns_num).Add_byte(Byte_ascii.Pipe).Add(ttl).XtoAry(); qids_cache.Add(qids_key, qid); } - public byte[] Qids_get(Xow_wiki wiki, Xoa_ttl ttl) {return Qids_get(wiki.Wdata_wiki_lang(), wiki.Wdata_wiki_tid(), ttl.Ns().Num_bry(), ttl.Page_db());} - public byte[] Qids_get(byte[] lang_key, byte wiki_tid, byte[] ns_num, byte[] ttl) { + public byte[] Qids_get(Xow_wiki wiki, Xoa_ttl ttl) {return Qids_get(wiki.Wdata_wiki_abrv(), ttl);} + private byte[] Qids_get(byte[] wiki_abrv, Xoa_ttl ttl) { if (!enabled) return null; - if (wiki_tid == Xow_wiki_domain_.Tid_other) return null; // "other" wikis will never call wikidata - Bry_bfr bfr = app.Utl_bry_bfr_mkr().Get_b512(); - Xob_bz2_file.Build_alias_by_lang_tid(bfr, lang_key, wiki_tid_ref.Val_(wiki_tid)); - int xwiki_key_len = bfr.Len(); - byte[] qids_key = bfr.Add_byte(Byte_ascii.Pipe).Add(ns_num).Add_byte(Byte_ascii.Pipe).Add(ttl).XtoAry(); - byte[] rv = (byte[])qids_cache.Fetch(qids_key); - if (rv == null) { - rv = this.Wdata_wiki().Db_mgr().Load_mgr().Load_qid(Bry_.Mid(bfr.Bfr(), 0, xwiki_key_len), ns_num, ttl); if (rv == null) {bfr.Mkr_rls(); return null;} - qids_cache.Add(qids_key, rv); + if (Bry_.Len_eq_0(wiki_abrv)) return null; // "other" wikis will never call wikidata + synchronized (qid_key) { + qid_key.Init(wiki_abrv, ttl); + byte[] rv = (byte[])qids_cache.Fetch(qid_key.Cache_key()); + if (rv == null) { // not in cache + rv = this.Wdata_wiki().Db_mgr().Load_mgr().Load_qid(qid_key.Wiki_abrv(), qid_key.Ns_num_bry(), qid_key.Ttl_bry()); + byte[] add_val = rv == null ? Bry_.Empty : rv; // JAVA: hashtable does not accept null as value; use Bry_.Empty + qids_cache.Add(qid_key.Cache_key(), add_val); // NOTE: if not in db, will insert a null value for cache_key; DATE:2014-07-23 + } + return Bry_.Len_eq_0(rv) ? null : rv; // JAVA: convert Bry_.Empty to null } - bfr.Mkr_rls().Clear(); - return rv; - } private Byte_obj_ref wiki_tid_ref = Byte_obj_ref.zero_(); + } private Byte_obj_ref wiki_tid_ref = Byte_obj_ref.zero_(); private Wdata_qid_key qid_key = new Wdata_qid_key(); public Int_obj_val Pids_add(byte[] pids_key, int pid_id) {Int_obj_val rv = Int_obj_val.new_(pid_id); pids_cache.Add(pids_key, rv); return rv;} public int Pids_get(byte[] lang_key, byte[] pid_name) { if (!enabled) return Pid_null; @@ -76,7 +75,7 @@ public class Wdata_wiki_mgr implements GfoInvkAble { if (data.Q() != null) return Pages_get(data.Q()); else if (data.Of() != null) { Xoa_ttl of_ttl = Xoa_ttl.parse_(wiki, data.Of()); if (of_ttl == null) return null; - byte[] qid = Qids_get(wiki.Wdata_wiki_lang(), wiki.Wdata_wiki_tid(), of_ttl.Ns().Num_bry(), of_ttl.Page_db()); if (qid == null) return null; // NOTE: for now, use wiki.Lang_key(), not page.Lang() + byte[] qid = Qids_get(wiki, of_ttl); if (qid == null) return null; // NOTE: for now, use wiki.Lang_key(), not page.Lang() return Pages_get(qid); } else return Pages_get(wiki, ttl); @@ -213,3 +212,24 @@ public class Wdata_wiki_mgr implements GfoInvkAble { ctx.Wiki().App().Usr_dlg().Log_many("", "", "qid not found in wikidata; qid=~{0} page=~{1}", String_.new_utf8_(qid), String_.new_utf8_(ctx.Cur_page().Ttl().Page_db())); } } +class Wdata_qid_key { + public byte[] Wiki_abrv() {return wiki_abrv;} private byte[] wiki_abrv; + public byte[] Ns_num_bry() {return ns_num_bry;} private byte[] ns_num_bry; + public byte[] Ttl_bry() {return ttl_bry;} private byte[] ttl_bry; + public byte[] Cache_key() {return cache_key;} private byte[] cache_key; + public void Init(byte[] wiki_abrv, Xoa_ttl ttl) { + this.wiki_abrv = wiki_abrv; + Xow_ns ns = ttl.Ns(); + boolean ns_is_canonical = Xow_ns_.Canonical_id(ns.Name_bry()) != Xow_ns_.Id_null; // handle titles with non-canoncial ns; PAGE:uk.s:Автор:Богдан_Гаврилишин DATE:2014-07-23 + if (ns_is_canonical) { // canonical ns; EX: Category:A + ns_num_bry = ns.Num_bry(); // use ns's number; EX: 14 + ttl_bry = ttl.Page_db(); // use page_db EX: A + } + else { // not a canonical ns; EX: Author:A + ns_num_bry = Ns_num_bry_main; // use main ns EX: 0 + ttl_bry = ttl.Full_db(); // use full_db EX: Author:A + } + this.cache_key = Bry_.Add(wiki_abrv, Byte_ascii.Pipe_bry, ns_num_bry, Byte_ascii.Pipe_bry, ttl_bry); + } + public static final byte[] Ns_num_bry_main = Bry_.new_ascii_("000"); +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java index 7c4ab0549..fd5ca0c2a 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java @@ -58,10 +58,11 @@ public class Wdata_wiki_mgr_fxt { tmp_bfr.Mkr_rls(); } public void Init_pids_add(String lang_key, String pid_name, int pid) {wdata_mgr.Pids_add(Bry_.new_utf8_(lang_key + "|" + pid_name), pid);} - public void Init_links_add(String wiki, String ttl, String qid) { + public void Init_links_add(String wiki, String ttl, String qid) {Init_links_add(wiki, "000", ttl, qid);} + public void Init_links_add(String wiki, String ns_num, String ttl, String qid) { byte[] ttl_bry = Bry_.new_utf8_(ttl); Xowd_regy_mgr regy_mgr = app.Hive_mgr().Regy_mgr(); - Io_url regy_fil = wdata_mgr.Wdata_wiki().Fsys_mgr().Site_dir().GenSubDir_nest("data", "qid").GenSubFil_nest(wiki, "000", "reg.csv"); + Io_url regy_fil = wdata_mgr.Wdata_wiki().Fsys_mgr().Site_dir().GenSubDir_nest("data", "qid").GenSubFil_nest(wiki, ns_num, "reg.csv"); regy_mgr.Init(regy_fil); regy_mgr.Create(ttl_bry); regy_mgr.Save(); @@ -70,7 +71,7 @@ public class Wdata_wiki_mgr_fxt { byte[] itm = bfr.Add(ttl_bry).Add_byte(Byte_ascii.Pipe).Add(Bry_.new_ascii_(qid)).Add_byte_nl().XtoAryAndClear(); Xob_xdat_file xdat_file = new Xob_xdat_file(); xdat_file.Insert(bfr, itm); - Io_url file_orig = Xob_wdata_qid_base_tst.ttl_(app.Wiki_mgr().Wdata_mgr().Wdata_wiki(), wiki, "000", 0); + Io_url file_orig = Xob_wdata_qid_base_tst.ttl_(app.Wiki_mgr().Wdata_mgr().Wdata_wiki(), wiki, ns_num, 0); xdat_file.Save(file_orig); } public void Init_external_links_mgr_clear() {wiki.Ctx().Cur_page().Wdata_external_lang_links().Reset();} @@ -89,8 +90,10 @@ public class Wdata_wiki_mgr_fxt { public void Test_get_low_qid(String qid, String expd) { Tfds.Eq(expd, String_.new_ascii_(Wdata_wiki_mgr.Get_low_qid(Bry_.new_ascii_(qid)))); } - public void Test_link(String lang, String page, String expd) { - Tfds.Eq(expd, String_.new_utf8_(wdata_mgr.Qids_get(Bry_.new_ascii_(lang), Xow_wiki_domain_.Tid_wikipedia, Bry_.new_ascii_("000"), Bry_.new_utf8_(page)))); + public void Test_link(String ttl_str, String expd) {Test_link(Xoa_ttl.parse_(wiki, Xow_ns_.Id_main, Bry_.new_utf8_(ttl_str)), expd);} + public void Test_link(Xoa_ttl ttl, String expd) { + byte[] qid_ttl = wdata_mgr.Qids_get(wiki, ttl); + Tfds.Eq(expd, String_.new_utf8_(qid_ttl)); } public void Test_parse_pid_null(String val) {Test_parse_pid(val, Wdata_wiki_mgr.Pid_null);} public void Test_parse_pid(String val, int expd) {Tfds.Eq(expd, Wdata_pf_property.Parse_pid(num_parser, Bry_.new_ascii_(val)));} private NumberParser num_parser = new NumberParser(); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_tst.java index eccacf98d..97f608a37 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_tst.java @@ -20,15 +20,23 @@ import org.junit.*; import gplx.xowa.xtns.wdatas.imports.*; public class Wdata_wiki_mgr_tst { @Test public void Basic() { Wdata_wiki_mgr_fxt fxt = new Wdata_wiki_mgr_fxt().Init(); - fxt.Init_links_add("enwiki", "q1", "q1_en"); - fxt.Test_link("en", "q1", "q1_en"); - fxt.Test_link("en", "q2", null); + fxt.Init_links_add("enwiki", "Q1", "Q1_en"); + fxt.Test_link("Q1", "Q1_en"); + fxt.Test_link("Q2", null); } @Test public void Case_sensitive() { // PURPOSE: wikidata lkp should be case_sensitive; a vs A DATE:2013-09-03 Wdata_wiki_mgr_fxt fxt = new Wdata_wiki_mgr_fxt().Init(); - fxt.Init_links_add("enwiki", "q1", "q1_lc"); - fxt.Test_link("en", "q1", "q1_lc"); - fxt.Test_link("en", "Q1", null); // Q1 should not match q1 + fxt.Init_links_add("enwiki", "Page", "Page_data"); + fxt.Test_link("Page", "Page_data"); + fxt.Test_link("PAGE", null); + } + @Test public void Non_canonical_ns() { // PURPOSE: handle wikidata entries in non-canonical ns; EX:ukwikisource and Author; PAGE:uk.s:Автор:Богдан_Гаврилишин DATE:2014-07-23 + Wdata_wiki_mgr_fxt fxt = new Wdata_wiki_mgr_fxt().Init(); + Xow_wiki wiki = fxt.Wiki(); + wiki.Ns_mgr().Add_new(124, "Test_ns"); + fxt.Init_links_add("enwiki", "000", "Test_ns:Test_page", "pass"); // NOTE: wdata will save to "000" ns, b/c "124" ns is not canonical + Xoa_ttl ttl = Xoa_ttl.parse_(fxt.Wiki(), 124, Bry_.new_ascii_("Test_page")); + fxt.Test_link(ttl, "pass"); } @Test public void Write_json_as_html() { Wdata_wiki_mgr_fxt fxt = new Wdata_wiki_mgr_fxt().Init(); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java index 9227a0ec7..44e214838 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java @@ -40,9 +40,8 @@ public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xo Json_itm_nde links_nde = Json_itm_nde.cast_(doc.Get_grp(Wdata_doc_consts.Key_atr_links_bry)); if (links_nde == null) return; // no links; ignore int len = links_nde.Subs_len(); if (len == 0) return; // no subs; return; Wdata_qid_data data_core = null; - links.Clear(); - // iterate links; find data_core (hopefully enwiki) - for (int i = 0; i < len; i++) { + links.Clear(); + for (int i = 0; i < len; i++) { // iterate links; find data_core (hopefully enwiki) Json_itm_kv kv = (Json_itm_kv)links_nde.Subs_get_at(i); byte[] xwiki_key = kv.Key().Data_bry(); byte[] ttl_bry = Wdata_doc_.Link_extract(kv); @@ -52,15 +51,11 @@ public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xo if (Bry_.Eq(xwiki_key, Xwiki_key_en)) data_core = data; } - // get core_ns; warn if not enwiki -// if (!Bry_.Eq(data_core.Xwiki_key(), Xwiki_key_en) && Bry_finder.Find_fwd(data_core.Ttl(), Byte_ascii.Colon) != Bry_.NotFound) -// bldr.App().Usr_dlg().Log_many(GRP_KEY, "enwiki_not_found", "enwiki not found; namespace parsing may be inaccurate; ~{0} ~{1}", String_.new_ascii_(qid), String_.new_ascii_(data_core.Ttl())); - Xoa_ttl core_ttl = Xoa_ttl.parse_(wiki, data_core.Ttl()); // parse ttl to get ns; this may still be inaccurate as it is using wikidata's ns, not enwiki's; + Xoa_ttl core_ttl = Xoa_ttl.parse_(wiki, data_core.Ttl()); // NOTE: parse ttl to get ns; this may still be inaccurate as it is using wikidata's ns, not enwiki's;; DATE:2014-07-23 Xow_ns core_ns = core_ttl.Ns(); boolean core_ns_is_main = core_ns.Id_main(); - - // iterate links again; do parsing, but assume any ns is same as enwiki - for (int i = 0; i < len; i++) { + + for (int i = 0; i < len; i++) { // iterate links again; do parsing, but assume any ns is same as enwiki Wdata_qid_data data = (Wdata_qid_data)links.FetchAt(i); byte[] data_ttl_bry = data.Ttl(); byte[] actl_ttl = null; diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_func.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_func.java index 1f9c02da5..1fd61f91d 100644 --- a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_func.java +++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/Xop_xowa_func.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.xowa_cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.xowa.xtns.pfuncs.*; public class Xop_xowa_func extends Pf_func_base { @Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bfr) { if (ctx.Wiki().Sys_cfg().Xowa_cmd_enabled()) { // only exec if enabled for wiki diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java index a85fbbcc6..bdb40e5cf 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java @@ -20,7 +20,7 @@ import gplx.xowa.apps.*; import gplx.xowa.wikis.*; import gplx.xowa.users.*; import gplx.xowa.html.*; import gplx.xowa.users.history.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.gui.views.*; import gplx.xowa.setup.maints.*; import gplx.xowa.wikis.caches.*; -import gplx.xowa.bldrs.imports.*; +import gplx.xowa.bldrs.imports.*; import gplx.xowa.xtns.pfuncs.*; public class Xow_wiki implements GfoInvkAble { private Xow_html_util util; public Xow_wiki(Xoa_app app, Io_url wiki_dir, Xow_ns_mgr ns_mgr, Xol_lang lang) { @@ -61,6 +61,7 @@ public class Xow_wiki implements GfoInvkAble { wdata_wiki_tid = domain_tid; wdata_wiki_lang = lang.Key_bry(); } + Wdata_wiki_abrv_(); db_mgr = new gplx.xowa.dbs.Xodb_mgr_txt(this, data_mgr); domain_abrv = Xob_bz2_file.Build_alias(Xow_wiki_domain_.parse_by_domain(domain_bry)); maint_mgr = new Xow_maint_mgr(this); @@ -91,9 +92,16 @@ public class Xow_wiki implements GfoInvkAble { public Xow_fragment_mgr Fragment_mgr() {return fragment_mgr;} private Xow_fragment_mgr fragment_mgr; public Bfmtr_eval_wiki Eval_mgr() {return eval_mgr;} private Bfmtr_eval_wiki eval_mgr; public Bry_bfr_mkr Utl_bry_bfr_mkr() {return app.Utl_bry_bfr_mkr();} - public byte Wdata_wiki_tid() {return wdata_wiki_tid;} private byte wdata_wiki_tid; - public byte[] Wdata_wiki_lang() {return wdata_wiki_lang;} private byte[] wdata_wiki_lang; - public void Wdata_wiki_lang_(byte[] v) {this.wdata_wiki_lang = v;} // TEST: +// public byte Wdata_wiki_tid() {return wdata_wiki_tid;} + public byte[] Wdata_wiki_lang() {return wdata_wiki_lang;} private byte[] wdata_wiki_lang; + public void Wdata_wiki_lang_(byte[] v) {this.wdata_wiki_lang = v; Wdata_wiki_abrv_();} // TEST: + public byte[] Wdata_wiki_abrv() {return wdata_wiki_abrv;} private byte[] wdata_wiki_abrv; private byte wdata_wiki_tid; + private void Wdata_wiki_abrv_() { + Bry_bfr bfr = app.Utl_bry_bfr_mkr().Get_b128(); + Xob_bz2_file.Build_alias_by_lang_tid(bfr, wdata_wiki_lang, Byte_obj_ref.new_(wdata_wiki_tid)); + wdata_wiki_abrv = bfr.Mkr_rls().XtoAryAndClear(); + } + public boolean Init_needed() {return init_needed;} public Xow_wiki Init_needed_(boolean v) {init_needed = v; return this;} private boolean init_needed = true; public Xop_parser Parser() {return parser;} private Xop_parser parser; diff --git a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java index 98d1730de..88a8f4b19 100644 --- a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java +++ b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue.java @@ -68,7 +68,7 @@ public class Xof_xfer_queue { wiki.File_mgr().Fsdb_mgr().Init_by_wiki__add_bin_wkrs(wiki); wiki.File_mgr().Fsdb_mgr().Reg_select(page, exec_tid, Xfer_itms_to_fsdb_itms(list, wiki.File_mgr().Fsdb_mgr().Patch_upright())); } - private ListAdp Xfer_itms_to_fsdb_itms(ListAdp list, boolean upright_patch) { + private ListAdp Xfer_itms_to_fsdb_itms(ListAdp list, int upright_patch) { ListAdp rv = ListAdp_.new_(); int list_len = list.Count(); for (int i = 0; i < list_len; i++) { diff --git a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_cases_tst.java b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_cases_tst.java index bf36147c1..af2d2cb23 100644 --- a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_cases_tst.java +++ b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_cases_tst.java @@ -267,6 +267,15 @@ public class Xof_xfer_queue_html_cases_tst { .Html_size_(300, 40) .tst(); } + @Test public void Thumbtime_ignored_if_non_media() { // PURPOSE: ignore thumbtime if not media; PAGE:en.w:Moon; EX:[[File:A.png|thumbtime=0.02]] DATE:2014-07-22 + fxt .ini_page_create_en_wiki("File:A.png"); + fxt .Lnki_("A.png", true, 90, Xof_img_size.Size_null_deprecated, Xof_img_size.Size_null_deprecated, 2) // thumbtime of 2 specified; will be ignored below + .Src( fxt.img_("mem/src/en.wikipedia.org/thumb/7/70/A.png/90px-A.png", 90, 80)) + .Trg( fxt.img_("mem/trg/en.wikipedia.org/fit/7/0/A.png/90px.png", 90, 80) + , fxt.reg_("mem/xowa/file/#meta/en.wikipedia.org/7/70.csv", "A.png|y||2?0,0|1?90,80") + ); + fxt.tst(); + } // @Test public void Ogg_full_skip() { // DISABLED: 2012-12-03; not sure about logic // fxt .ini_page_create_commons ("File:A.ogg"); diff --git a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_wmf_api_tst.java b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_wmf_api_tst.java index 81216a72d..0f7cbae31 100644 --- a/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_wmf_api_tst.java +++ b/400_xowa/src_162_xfer/gplx/xowa/Xof_xfer_queue_html_wmf_api_tst.java @@ -71,7 +71,7 @@ public class Xof_xfer_queue_html_wmf_api_tst { } @Test public void Upright_defect() { // PURPOSE.fix: upright not working; PAGE:en.w:Beethoven; [[File:Rudolf-habsburg-olmuetz.jpg|thumb|upright|]]; changed upright to = Upright_default; DATE:2014-05-23 fxt .ini_page_api("en_wiki", "A.png", "", 1378, 1829); - fxt .Lnki_("A.png", true, -1, -1, Xof_img_size.Upright_default, Xof_doc_thumb.Null_as_int) + fxt .Lnki_("A.png", true, -1, -1, Xof_img_size.Upright_default_marker, Xof_doc_thumb.Null_as_int) .Src( fxt.img_("mem/src/en.wikipedia.org/thumb/7/70/A.png/170px-A.png", 170, 226)) .Trg( fxt.img_("mem/trg/en.wikipedia.org/fit/7/0/A.png/170px.png", 170, 226) , fxt.reg_("mem/xowa/file/#meta/en.wikipedia.org/7/70.csv" , "A.png|y||2?1378,1829|1?170,226") diff --git a/400_xowa/src_210_bldr_core/gplx/xowa/Xob_bz2_file.java b/400_xowa/src_210_bldr_core/gplx/xowa/Xob_bz2_file.java index 6ebd2b773..6359d151e 100644 --- a/400_xowa/src_210_bldr_core/gplx/xowa/Xob_bz2_file.java +++ b/400_xowa/src_210_bldr_core/gplx/xowa/Xob_bz2_file.java @@ -146,6 +146,8 @@ public class Xob_bz2_file { case Xow_wiki_domain_.Tid_wikimediafoundation: bfr.Add(domain_suffix); break; + case Xow_wiki_domain_.Tid_other: + break; default: bfr.Add(lang_key).Add(domain_suffix); break; diff --git a/400_xowa/src_220_bldr_file/gplx/xowa/Xobc_img_run_xfer.java b/400_xowa/src_220_bldr_file/gplx/xowa/Xobc_img_run_xfer.java index 67c9cc1a6..f879c6d72 100644 --- a/400_xowa/src_220_bldr_file/gplx/xowa/Xobc_img_run_xfer.java +++ b/400_xowa/src_220_bldr_file/gplx/xowa/Xobc_img_run_xfer.java @@ -86,7 +86,7 @@ public class Xobc_img_run_xfer extends Xob_itm_basic_base implements Xob_cmd, Gf boolean thumb_pass = false, skip = false; //byte orig_pass = Bool_.__byte; for (int i = 0; i < lnks_len; i++) { Xofo_lnki lnk = lnks[i]; - xfer_itm.Atrs_by_lnki(lnk.Lnki_type(), lnk.Lnki_w(), lnk.Lnki_h(), lnk.Lnki_upright(), lnk.Lnki_thumbtime(), Xof_doc_page.Null); + xfer_itm.Init_by_lnki(row.Name(), row.Redirect(), lnk.Lnki_type(), lnk.Lnki_w(), lnk.Lnki_h(), lnk.Lnki_upright(), lnk.Lnki_thumbtime(), Xof_doc_page.Null); // NOTE: row.Name(), row.Redirect() is redundant with above, but (a) performance implications only and (b) this class is deprecated xfer_itm.Atrs_calc_for_html(); xfer.Atrs_by_itm(xfer_itm, src_repo, trg_repo); if (!xfer.Download_allowed_by_ext() || xfer_itm.Meta_itm().Orig_exists() == Xof_meta_itm.Exists_n) {skip = true; break;} diff --git a/400_xowa/src_300_html/gplx/xowa/Xoa_html_data.java b/400_xowa/src_300_html/gplx/xowa/Xoa_html_data.java index 59e9378c4..2819eeec7 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoa_html_data.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoa_html_data.java @@ -31,6 +31,8 @@ public class Xoa_html_data { public byte[] Custom_html() {return custom_html;} public Xoa_html_data Custom_html_(byte[] v) {custom_html = v; return this;} private byte[] custom_html; public byte[] Custom_name() {return custom_name;} public Xoa_html_data Custom_name_(byte[] v) {custom_name = v; return this;} private byte[] custom_name; public byte[] Custom_head_end() {return custom_head_end;} + public boolean Gallery_packed_exists() {return gallery_packed_exists;} public void Gallery_packed_exists_y_() {gallery_packed_exists = true;} private boolean gallery_packed_exists; + public int Imap_id_next() {return ++imap_id_next;} private int imap_id_next; public void Custom_head_end_concat(byte[] v) { if (v == null) custom_head_end = v; @@ -46,12 +48,14 @@ public class Xoa_html_data { } private byte[] custom_html_end; public void Clear() { if (ctg_hash != null) ctg_hash.Clear(); + gallery_packed_exists = false; module_mgr.Clear(); lnke_autonumber = 1; html_restricted = true; html_content_sub = Bry_.Empty; search_text = Bry_.Empty; custom_html_end = custom_head_end = custom_html = custom_name = null; + imap_id_next = 0; } public byte[][] Ctgs_to_ary() {return ctg_hash == null ? Bry_.Ary_empty : (byte[][])ctg_hash.XtoAry(byte[].class);} public void Ctgs_add(Xoa_ttl ttl) { diff --git a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java index 0388bd296..918762a61 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main.java @@ -18,17 +18,17 @@ along with this program. If not, see . package gplx.xowa; import gplx.*; import gplx.xowa.files.*; class Xoh_file_main_alts implements Bry_fmtr_arg { - public Xoh_file_main_alts Ini_(Xoh_file_page opt) { - this.opt = opt; - return this; - } private Xoh_file_page opt; Xof_xfer_itm xfer_itm = new Xof_xfer_itm(); + private Xof_xfer_itm orig_itm; private Xoh_file_page opt; private Xof_xfer_itm xfer_itm = new Xof_xfer_itm(); + public Xoh_file_main_alts Ctor(Xof_xfer_itm orig_itm, Xoh_file_page opt) { + this.orig_itm = orig_itm; this.opt = opt; return this; + } public void XferAry(Bry_bfr bfr, int idx) { Int_2_ref[] size_alts = opt.Size_alts(); int len = size_alts.length; for (int i = 0; i < len; i++) { Int_2_ref size = size_alts[i]; if (xfer_itm.Html_w() < size.Val_0()) continue; - xfer_itm.Atrs_by_lnki(Xop_lnki_type.Id_none, size.Val_0(), size.Val_1(), Xop_lnki_tkn.Upright_null, Xof_doc_thumb.Null, Xof_doc_page.Null); + xfer_itm.Init_by_lnki(orig_itm.Lnki_ttl(), orig_itm.Lnki_redirect(), Xop_lnki_type.Id_none, size.Val_0(), size.Val_1(), Xop_lnki_tkn.Upright_null, Xof_doc_thumb.Null, Xof_doc_page.Null); xfer_itm.Atrs_calc_for_html(); opt.Html_alts().Bld_bfr_many(bfr, xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_src(), i == len - 1 ? opt.Html_alt_dlm_last() : opt.Html_alt_dlm_default()); } diff --git a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java index ba95dd3f6..66a77db55 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java +++ b/400_xowa/src_300_html/gplx/xowa/Xoh_file_main_wkr.java @@ -19,7 +19,7 @@ package gplx.xowa; import gplx.*; import gplx.xowa.html.*; import gplx.xowa.files.*; public class Xoh_file_main_wkr implements Bry_fmtr_arg { - Xoh_file_page opt; Xoh_file_main_alts alts = new Xoh_file_main_alts(); + private Xof_xfer_itm xfer_itm; private Xoh_file_main_alts alts = new Xoh_file_main_alts(); private Xoh_file_page opt; byte[] file_size_bry; Xoa_ttl ttl; Xow_wiki wiki; public void Bld_html(Xow_wiki wiki, Xop_ctx ctx, Bry_bfr bfr, Xoa_ttl ttl, Xoh_file_page opt, Xof_xfer_queue queue) { this.opt = opt; this.ttl = ttl; this.wiki = wiki; @@ -47,15 +47,14 @@ public class Xoh_file_main_wkr implements Bry_fmtr_arg { xfer_itm = Xoh_lnki_file_wtr.Queue_add_manual(queue, xfer_itm); } opt.Html_main().Bld_bfr_many(bfr, this); - } byte[] play_btn_icon; Bool_obj_ref queue_add_ref = Bool_obj_ref.n_(); + } private byte[] play_btn_icon; private Bool_obj_ref queue_add_ref = Bool_obj_ref.n_(); public void Bld_html(Xow_wiki wiki, Bry_bfr bfr, Xof_xfer_itm xfer_itm, Xoa_ttl ttl, Xoh_file_page opt, byte[] file_size_bry, byte[] play_btn_icon, int elem_id_val) { this.xfer_itm = xfer_itm; this.wiki = wiki; this.ttl = ttl; this.opt = opt; this.file_size_bry = file_size_bry; this.play_btn_icon = play_btn_icon; this.elem_id_val = elem_id_val; opt.Html_main().Bld_bfr_many(bfr, this); - } int elem_id_val; - Xof_xfer_itm xfer_itm; + } private int elem_id_val; public void XferAry(Bry_bfr bfr, int idx) { - alts.Ini_(opt); + alts.Ctor(xfer_itm, opt); Xof_ext ext = xfer_itm.Lnki_ext(); if (ext.Id_is_thumbable_img()) opt.Html_main_img().Bld_bfr_many(bfr, xfer_itm.Orig_w(), xfer_itm.Orig_h(), xfer_itm.Html_orig_src(), file_size_bry, ext.Mime_type(), elem_id_val, xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_src(), ttl.Full_txt(), wiki.App().Encoder_mgr().Url().Encode(ttl.Page_url()), alts); diff --git a/400_xowa/src_310_url/gplx/xowa/Xoh_href.java b/400_xowa/src_310_url/gplx/xowa/Xoh_href.java index 9a0b1c75e..53bb23a82 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoh_href.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoh_href.java @@ -22,6 +22,11 @@ public class Xoh_href { public byte[] Page() {return page;} public Xoh_href Page_(byte[] v) {page = v; return this;} private byte[] page; public byte[] Anchor() {return anchor;} public Xoh_href Anchor_(byte[] v) {anchor = v; return this;} private byte[] anchor; public byte Tid() {return tid;} public Xoh_href Tid_(byte v) {tid = v; return this;} private byte tid; + public byte[] Page_and_anchor() { + if (Bry_.Len_eq_0(anchor)) return page; + else if (Bry_.Len_eq_0(page)) return anchor; + else return Bry_.Add_w_dlm(Byte_ascii.Hash, page, anchor); + } public byte Protocol_tid() {return protocol_tid;} private byte protocol_tid; public void Init(byte[] raw, byte protocol_tid) { this.raw = raw; this.protocol_tid = protocol_tid; diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java b/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java index 62a5ed2e1..05ba1ef00 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_ctx.java @@ -17,9 +17,9 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.btries.*; import gplx.xowa.gui.*; import gplx.xowa.xtns.lst.*; -import gplx.xowa.xtns.scribunto.*; -import gplx.xowa.xtns.wdatas.*; -import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.html.modules.popups.keeplists.*; +import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*; +import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; +import gplx.xowa.parsers.logs.*; import gplx.xowa.html.modules.popups.keeplists.*; public class Xop_ctx { private Xop_ctx_wkr[] wkrs = new Xop_ctx_wkr[] {}; Xop_ctx(Xow_wiki wiki, Xoa_page page) { diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java b/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java index e547301e5..f6b15e4a6 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_fxt.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.html.*; +import gplx.xowa.html.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; public class Xop_fxt { public Xop_fxt() { Xoa_app app = Xoa_app_fxt.app_(); @@ -91,11 +91,11 @@ public class Xop_fxt { @gplx.Internal protected Xop_ignore_tkn_chkr tkn_comment_(int bgn, int end) {return tkn_ignore_(bgn, end, Xop_ignore_tkn.Ignore_tid_comment);} @gplx.Internal protected Xop_ignore_tkn_chkr tkn_ignore_(int bgn, int end, byte t){return (Xop_ignore_tkn_chkr)new Xop_ignore_tkn_chkr().Ignore_tid_(t).Src_rng_(bgn, end);} public Xop_tkn_chkr_hr tkn_hr_(int bgn, int end) {return new Xop_tkn_chkr_hr(bgn, end).Hr_len_(Xop_hr_lxr.Hr_len);} - @gplx.Internal protected Xop_tblw_tb_tkn_chkr tkn_tblw_tb_(int bgn, int end) {return (Xop_tblw_tb_tkn_chkr)new Xop_tblw_tb_tkn_chkr().Src_rng_(bgn, end);} - @gplx.Internal protected Xop_tblw_tc_tkn_chkr tkn_tblw_tc_(int bgn, int end) {return (Xop_tblw_tc_tkn_chkr)new Xop_tblw_tc_tkn_chkr().Src_rng_(bgn, end);} - @gplx.Internal protected Xop_tblw_td_tkn_chkr tkn_tblw_td_(int bgn, int end) {return (Xop_tblw_td_tkn_chkr)new Xop_tblw_td_tkn_chkr().Src_rng_(bgn, end);} - @gplx.Internal protected Xop_tblw_th_tkn_chkr tkn_tblw_th_(int bgn, int end) {return (Xop_tblw_th_tkn_chkr)new Xop_tblw_th_tkn_chkr().Src_rng_(bgn, end);} - @gplx.Internal protected Xop_tblw_tr_tkn_chkr tkn_tblw_tr_(int bgn, int end) {return (Xop_tblw_tr_tkn_chkr)new Xop_tblw_tr_tkn_chkr().Src_rng_(bgn, end);} + public Xop_tblw_tb_tkn_chkr tkn_tblw_tb_(int bgn, int end) {return (Xop_tblw_tb_tkn_chkr)new Xop_tblw_tb_tkn_chkr().Src_rng_(bgn, end);} + public Xop_tblw_tc_tkn_chkr tkn_tblw_tc_(int bgn, int end) {return (Xop_tblw_tc_tkn_chkr)new Xop_tblw_tc_tkn_chkr().Src_rng_(bgn, end);} + public Xop_tblw_td_tkn_chkr tkn_tblw_td_(int bgn, int end) {return (Xop_tblw_td_tkn_chkr)new Xop_tblw_td_tkn_chkr().Src_rng_(bgn, end);} + public Xop_tblw_th_tkn_chkr tkn_tblw_th_(int bgn, int end) {return (Xop_tblw_th_tkn_chkr)new Xop_tblw_th_tkn_chkr().Src_rng_(bgn, end);} + public Xop_tblw_tr_tkn_chkr tkn_tblw_tr_(int bgn, int end) {return (Xop_tblw_tr_tkn_chkr)new Xop_tblw_tr_tkn_chkr().Src_rng_(bgn, end);} public Xop_hdr_tkn_chkr tkn_hdr_(int bgn, int end, int hdr_len) {return (Xop_hdr_tkn_chkr)new Xop_hdr_tkn_chkr().Hdr_len_(hdr_len).Src_rng_(bgn, end);} @gplx.Internal protected Xop_xnde_tkn_chkr tkn_xnde_br_(int pos) {return tkn_xnde_(pos, pos).Xnde_tagId_(Xop_xnde_tag_.Tid_br);} public Xop_xnde_tkn_chkr tkn_xnde_() {return tkn_xnde_(String_.Pos_neg1, String_.Pos_neg1);} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java index 1832fdcad..edf016972 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_mgr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.btries.*; -import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; +import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; public class Xop_lxr_mgr { private Xop_lxr[] ary; public Xop_lxr_mgr(Xop_lxr[] ary) {this.ary = ary;} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_misc.java b/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_misc.java index 02b3572dc..b659c65e0 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_misc.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_lxr_misc.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.core.btries.*; +import gplx.core.btries.*; import gplx.xowa.parsers.lists.*; class Xop_colon_lxr implements Xop_lxr { public byte Lxr_tid() {return Xop_lxr_.Tid_colon;} public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Byte_ascii.Colon, this);} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tb_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tb_tkn_chkr.java new file mode 100644 index 000000000..e4841104a --- /dev/null +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tb_tkn_chkr.java @@ -0,0 +1,31 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa; import gplx.*; +public class Xop_tblw_tb_tkn_chkr extends Xop_tkn_chkr_base { + @Override public Class TypeOf() {return Xop_tblw_tb_tkn.class;} + @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tb;} + public int Caption_count() {return caption_count;} public Xop_tblw_tb_tkn_chkr Caption_count_(int v) {caption_count = v; return this;} private int caption_count = Int_.Neg1_count; + public Xop_tblw_tb_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; + @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { + Xop_tblw_tb_tkn actl = (Xop_tblw_tb_tkn)actl_obj; + err += mgr.Tst_val(caption_count == Int_.Neg1_count, path, "caption_count", caption_count, actl.Caption_count()); + err += mgr.Tst_val(atrs_bgn == Xop_tblw_wkr.Atrs_null, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); + err += mgr.Tst_val(atrs_end == Xop_tblw_wkr.Atrs_null, path, "atrs_end", atrs_end, actl.Atrs_end()); + return err; + } +} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tc_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tc_tkn_chkr.java new file mode 100644 index 000000000..0cc4ed4a4 --- /dev/null +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tc_tkn_chkr.java @@ -0,0 +1,26 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa; import gplx.*; +public class Xop_tblw_tc_tkn_chkr extends Xop_tkn_chkr_base { + @Override public Class TypeOf() {return Xop_tblw_tc_tkn.class;} + @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tc;} + @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { +// Xop_tblw_tc_tkn actl = (Xop_tblw_tc_tkn)actl_obj; + return err; + } +} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_td_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_td_tkn_chkr.java new file mode 100644 index 000000000..c22de219b --- /dev/null +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_td_tkn_chkr.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa; import gplx.*; +public class Xop_tblw_td_tkn_chkr extends Xop_tkn_chkr_base { + @Override public Class TypeOf() {return Xop_tblw_td_tkn.class;} + @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_td;} + public Xop_tblw_td_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; + @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { + Xop_tblw_td_tkn actl = (Xop_tblw_td_tkn)actl_obj; + err += mgr.Tst_val(atrs_bgn == Xop_tblw_wkr.Atrs_null, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); + err += mgr.Tst_val(atrs_end == Xop_tblw_wkr.Atrs_null, path, "atrs_end", atrs_end, actl.Atrs_end()); + return err; + } +} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_th_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_th_tkn_chkr.java new file mode 100644 index 000000000..fa6af6b43 --- /dev/null +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_th_tkn_chkr.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa; import gplx.*; +public class Xop_tblw_th_tkn_chkr extends Xop_tkn_chkr_base { + @Override public Class TypeOf() {return Xop_tblw_th_tkn.class;} + @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_th;} + public Xop_tblw_th_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; + @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { + Xop_tblw_th_tkn actl = (Xop_tblw_th_tkn)actl_obj; + err += mgr.Tst_val(atrs_bgn == -1, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); + err += mgr.Tst_val(atrs_end == -1, path, "atrs_end", atrs_end, actl.Atrs_end()); + return err; + } +} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tr_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tr_tkn_chkr.java new file mode 100644 index 000000000..92ca1d4dc --- /dev/null +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_tblw_tr_tkn_chkr.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa; import gplx.*; +public class Xop_tblw_tr_tkn_chkr extends Xop_tkn_chkr_base { + @Override public Class TypeOf() {return Xop_tblw_tr_tkn.class;} + @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tr;} + public Xop_tblw_tr_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; + @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { + Xop_tblw_tr_tkn actl = (Xop_tblw_tr_tkn)actl_obj; + err += mgr.Tst_val(atrs_bgn == -1, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); + err += mgr.Tst_val(atrs_end == -1, path, "atrs_end", atrs_end, actl.Atrs_end()); + return err; + } +} diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_ttl_log.java b/400_xowa/src_400_parser/gplx/xowa/Xop_ttl_log.java index 0e6eb1611..46b96f4f3 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_ttl_log.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_ttl_log.java @@ -34,15 +34,6 @@ class Xop_comment_log { Eos = Gfo_msg_itm_.new_warn_(owner, "eos") ; } -class Xop_hdr_log { - private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "hdr"); - public static final Gfo_msg_itm - Dangling_hdr = Gfo_msg_itm_.new_warn_(owner, "dangling_hdr") - , Mismatched = Gfo_msg_itm_.new_warn_(owner, "mismatched") - , Len_1 = Gfo_msg_itm_.new_warn_(owner, "len_1") - , Len_7_or_more = Gfo_msg_itm_.new_warn_(owner, "len_7_or_more") - ; -} class Xop_lnki_log { private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "lnki"); public static final Gfo_msg_itm diff --git a/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java b/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java index 6bcf4df87..41f27af86 100644 --- a/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java +++ b/400_xowa/src_400_parser/gplx/xowa/Xop_xnde_tkn_chkr.java @@ -39,60 +39,6 @@ public class Xop_xnde_tkn_chkr extends Xop_tkn_chkr_base { return err; } } -class Xop_tblw_tb_tkn_chkr extends Xop_tkn_chkr_base { - @Override public Class TypeOf() {return Xop_tblw_tb_tkn.class;} - @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tb;} - public int Caption_count() {return caption_count;} public Xop_tblw_tb_tkn_chkr Caption_count_(int v) {caption_count = v; return this;} private int caption_count = Int_.Neg1_count; - public Xop_tblw_tb_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; - @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { - Xop_tblw_tb_tkn actl = (Xop_tblw_tb_tkn)actl_obj; - err += mgr.Tst_val(caption_count == Int_.Neg1_count, path, "caption_count", caption_count, actl.Caption_count()); - err += mgr.Tst_val(atrs_bgn == Xop_tblw_wkr.Atrs_null, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); - err += mgr.Tst_val(atrs_end == Xop_tblw_wkr.Atrs_null, path, "atrs_end", atrs_end, actl.Atrs_end()); - return err; - } -} -class Xop_tblw_tc_tkn_chkr extends Xop_tkn_chkr_base { - @Override public Class TypeOf() {return Xop_tblw_tc_tkn.class;} - @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tc;} - @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { -// Xop_tblw_tc_tkn actl = (Xop_tblw_tc_tkn)actl_obj; - return err; - } -} -class Xop_tblw_td_tkn_chkr extends Xop_tkn_chkr_base { - @Override public Class TypeOf() {return Xop_tblw_td_tkn.class;} - @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_td;} - public Xop_tblw_td_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; - @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { - Xop_tblw_td_tkn actl = (Xop_tblw_td_tkn)actl_obj; - err += mgr.Tst_val(atrs_bgn == Xop_tblw_wkr.Atrs_null, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); - err += mgr.Tst_val(atrs_end == Xop_tblw_wkr.Atrs_null, path, "atrs_end", atrs_end, actl.Atrs_end()); - return err; - } -} -class Xop_tblw_tr_tkn_chkr extends Xop_tkn_chkr_base { - @Override public Class TypeOf() {return Xop_tblw_tr_tkn.class;} - @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_tr;} - public Xop_tblw_tr_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; - @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { - Xop_tblw_tr_tkn actl = (Xop_tblw_tr_tkn)actl_obj; - err += mgr.Tst_val(atrs_bgn == -1, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); - err += mgr.Tst_val(atrs_end == -1, path, "atrs_end", atrs_end, actl.Atrs_end()); - return err; - } -} -class Xop_tblw_th_tkn_chkr extends Xop_tkn_chkr_base { - @Override public Class TypeOf() {return Xop_tblw_th_tkn.class;} - @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_tblw_th;} - public Xop_tblw_th_tkn_chkr Atrs_rng_(int bgn, int end) {this.atrs_bgn = bgn; this.atrs_end = end; return this;} private int atrs_bgn = Xop_tblw_wkr.Atrs_null, atrs_end = Xop_tblw_wkr.Atrs_null; - @Override public int Chk_hook(Tst_mgr mgr, String path, Object actl_obj, int err) { - Xop_tblw_th_tkn actl = (Xop_tblw_th_tkn)actl_obj; - err += mgr.Tst_val(atrs_bgn == -1, path, "atrs_bgn", atrs_bgn, actl.Atrs_bgn()); - err += mgr.Tst_val(atrs_end == -1, path, "atrs_end", atrs_end, actl.Atrs_end()); - return err; - } -} class Xop_para_tkn_chkr extends Xop_tkn_chkr_base { @Override public Class TypeOf() {return Xop_para_tkn.class;} @Override public byte Tkn_tid() {return Xop_tkn_itm_.Tid_para;} diff --git a/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java b/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java index f5fafeb1d..d84d6e746 100644 --- a/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java +++ b/400_xowa/src_405_tkn/gplx/xowa/Xop_tkn_mkr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.xtns.cite.*; +import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.xtns.cite.*; public class Xop_tkn_mkr { Xop_space_tkn space_tkn_immutable = new Xop_space_tkn(true, -1, -1); public Xop_root_tkn Root(byte[] raw) {return new Xop_root_tkn().Root_src_(raw);} @@ -69,8 +69,8 @@ public class Xop_tkn_mkr { public References_nde Xnde_references() {return new References_nde();} public gplx.xowa.xtns.math.Math_nde Xnde_math() {return new gplx.xowa.xtns.math.Math_nde();} public gplx.xowa.xtns.gallery.Gallery_xnde Xnde_gallery() {return new gplx.xowa.xtns.gallery.Gallery_xnde();} - public gplx.xowa.xtns.imageMap.Xop_imageMap_xnde Xnde_imageMap() {return new gplx.xowa.xtns.imageMap.Xop_imageMap_xnde();} - public gplx.xowa.xtns.hiero.Hiero_xnde Xnde_hiero() {return new gplx.xowa.xtns.hiero.Hiero_xnde();} + public gplx.xowa.xtns.imaps.Imap_xnde Xnde_imageMap() {return new gplx.xowa.xtns.imaps.Imap_xnde();} + public gplx.xowa.xtns.hieros.Hiero_xnde Xnde_hiero() {return new gplx.xowa.xtns.hieros.Hiero_xnde();} public gplx.xowa.xtns.proofreadPage.Pp_pages_nde Xnde_pages() {return new gplx.xowa.xtns.proofreadPage.Pp_pages_nde();} public gplx.xowa.xtns.proofreadPage.Pp_pagelist_nde Xnde_pagelist() {return new gplx.xowa.xtns.proofreadPage.Pp_pagelist_nde();} public gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde Xnde_pagequality() {return new gplx.xowa.xtns.proofreadPage.Pp_pagequality_nde();} diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java index fab4d6286..5e9e19b3b 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_tkn.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.files.*; import gplx.xowa.xtns.pfuncs.ttls.*; +import gplx.xowa.files.*; import gplx.xowa.html.*; import gplx.xowa.xtns.pfuncs.ttls.*; public class Xop_lnki_tkn extends Xop_tkn_itm_base { @Override public byte Tkn_tid() {return tkn_tid;} private byte tkn_tid = Xop_tkn_itm_.Tid_lnki; public void Tkn_tid_to_txt() {tkn_tid = Xop_tkn_itm_.Tid_txt;} @@ -46,6 +46,7 @@ public class Xop_lnki_tkn extends Xop_tkn_itm_base { public int Html_id() {return html_id;} public Xop_lnki_tkn Html_id_(int v) {html_id = v; return this;} private int html_id; public int Pipe_count() {return pipe_count;} private int pipe_count; public boolean Pipe_count_is_zero() {return pipe_count++ == 0;} + public Xoh_lnki_file_wkr Lnki_file_wkr() {return lnki_file_wkr;} public void Lnki_file_wkr_(Xoh_lnki_file_wkr v) {lnki_file_wkr = v;} private Xoh_lnki_file_wkr lnki_file_wkr; public byte[] Ttl_ary() { return ttl.ForceLiteralLink() || nsId != Xow_ns_.Id_main // if [[:]] or non-main (Category, Template) ? ttl.Full_txt() // use full_txt (no initial colon; capitalize first) diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java index 63e06c1e5..ef7565d90 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr.java @@ -30,30 +30,19 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { lnki.Tkn_tid_to_txt(); ctx.Msg_log().Add_itm_none(Xop_misc_log.Eos, src, lnki.Src_bgn(), lnki.Src_end()); } - private static final byte[] Brack_end_bry = Bry_.new_ascii_("]"); public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) { if (ctx.Cur_tkn_tid() == Xop_tkn_itm_.Tid_lnke) { // if lnke then take 1st ] in "]]" and use it close lnke int lnke_end_pos = bgn_pos + 1; ctx.Lnke().MakeTkn_end(ctx, tkn_mkr, root, src, src_len, bgn_pos, lnke_end_pos); return lnke_end_pos; } - if ( cur_pos < src_len // bounds check - && src[cur_pos] == Byte_ascii.Brack_end // is next char after "]]", "]"; i.e.: "]]]"; PAGE:en.w:Aubervilliers DATE:2014-06-25 - ) { - int nxt_pos = cur_pos + 1; - if ( nxt_pos == src_len // allow "]]]EOS" - || ( nxt_pos < src_len // bounds check - && src[nxt_pos] != Byte_ascii.Brack_end // is next char after "]]]", "]"; i.e.: not "]]]]"; PAGE:ru.w:Меркатале_ин_Валь_ди_Песа; DATE:2014-02-04 - ) - - ) { - root.Subs_add(tkn_mkr.Bry(bgn_pos, bgn_pos + 1, Brack_end_bry)); // add "]" as bry - ++bgn_pos; ++cur_pos; // position "]]" at end of "]]]" - } + int stack_pos = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_lnki); + if (stack_pos == Xop_ctx.Stack_not_found) return ctx.Lxr_make_txt_(cur_pos); // "]]" found but no "[[" in stack; return literal "]]" + Xop_lnki_tkn lnki = (Xop_lnki_tkn)ctx.Stack_pop_til(root, src, stack_pos, false, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_lnki_end); + if (Xop_lnki_wkr_.Adjust_for_brack_end_len_of_3(ctx, tkn_mkr, root, src, src_len, cur_pos, lnki)) { // convert "]]]" into "]" + "]]", not "]]" + "]" + root.Subs_add(tkn_mkr.Bry(bgn_pos, bgn_pos + 1, Byte_ascii.Brack_end_bry)); // add "]" as bry + ++bgn_pos; ++cur_pos; // position "]]" at end of "]]]" } - int lvl_pos = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_lnki); - if (lvl_pos == Xop_ctx.Stack_not_found) return ctx.Lxr_make_txt_(cur_pos); // "]]" found but no "[[" in stack; interpet "]]" literally - Xop_lnki_tkn lnki = (Xop_lnki_tkn)ctx.Stack_pop_til(root, src, lvl_pos, false, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_lnki_end); if (!arg_bldr.Bld(ctx, tkn_mkr, this, Xop_arg_wkr_.Typ_lnki, root, lnki, bgn_pos, cur_pos, lnki.Tkn_sub_idx() + 1, root.Subs_len(), src)) return Xop_lnki_wkr_.Invalidate_lnki(ctx, src, root, lnki, bgn_pos); cur_pos = Xop_lnki_wkr_.Chk_for_tail(ctx.Lang(), src, cur_pos, src_len, lnki); @@ -162,7 +151,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { lnki.Upright_(number_parser.AsDec().XtoDouble()); } else // no =; EX: [[Image:a|upright]] - lnki.Upright_(1); + lnki.Upright_(gplx.xowa.files.Xof_img_size.Upright_default_marker);// NOTE: was incorrectly hardcoded as 1; DATE:2014-07-23 break; case Xop_lnki_arg_parser.Tid_noicon: lnki.Media_icon_n_(); break; case Xop_lnki_arg_parser.Tid_page: Xop_lnki_wkr_.Page_parse(ctx, src, number_parser, lnki, arg); break; @@ -266,4 +255,19 @@ class Xop_lnki_wkr_ { else lnki.Thumbtime_(fracs / TimeSpanAdp_.Ratio_f_to_s); } + public static boolean Adjust_for_brack_end_len_of_3(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int cur_pos, Xop_lnki_tkn lnki) { + if ( cur_pos < src_len // bounds check + && src[cur_pos] == Byte_ascii.Brack_end // is next char after "]]", "]"; i.e.: "]]]"; PAGE:en.w:Aubervilliers DATE:2014-06-25 + ) { + int nxt_pos = cur_pos + 1; + if ( nxt_pos == src_len // allow "]]]EOS" + || ( nxt_pos < src_len // bounds check + && src[nxt_pos] != Byte_ascii.Brack_end // is next char after "]]]", "]"; i.e.: not "]]]]"; PAGE:ru.w:Меркатале_ин_Валь_ди_Песа; DATE:2014-02-04 + ) + ) { + return lnki.Ttl() != null; // only change "]]]" to "]" + "]]" if lnki is not title; otherwise [[A]]] -> "A]" which will be invalid; PAGE:en.w: Tall_poppy_syndrome DATE:2014-07-23 + } + } + return false; + } } diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java index 5498a8dbf..9a68e62a6 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__basic_tst.java @@ -106,7 +106,7 @@ public class Xop_lnki_wkr__basic_tst { @Test public void Image_upright() { fxt.Test_parse_page_wiki("[[Image:a|upright=.123]]" , fxt.tkn_lnki_().Upright_(.123)); - fxt.Test_parse_page_wiki("[[Image:a|upright]]" , fxt.tkn_lnki_().Upright_(1)); // no eq tokn + fxt.Test_parse_page_wiki("[[Image:a|upright]]" , fxt.tkn_lnki_().Upright_(gplx.xowa.files.Xof_img_size.Upright_default_marker)); // no eq tokn fxt.Test_parse_page_wiki("[[Image:a|upright=.42190046219457]]", fxt.tkn_lnki_().Upright_(.42190046219457)); // many decimal places breaks upright fxt.Init_log_(Xop_lnki_log.Upright_val_is_invalid) .Test_parse_page_wiki("[[Image:a|upright=y]]" , fxt.tkn_lnki_().Upright_(-1)); // invalid diff --git a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java index 24566b154..9274a9d41 100644 --- a/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java +++ b/400_xowa/src_440_lnki/gplx/xowa/Xop_lnki_wkr__uncommon_tst.java @@ -26,6 +26,10 @@ public class Xop_lnki_wkr__uncommon_tst { @Test public void Single_bracket() { // PURPOSE: handle [[A|[b]]] PAGE:en.w:Aubervilliers DATE:2014-06-25 fxt.Test_html_full_str("[[A|[B]]]", "[B]"); } + @Test public void Triple_bracket() { // PURPOSE: "]]]" shouldn't invalidate tkn; PAGE:en.w:Tall_poppy_syndrome; DATE:2014-07-23 + fxt.Test_parse_page_all_str("[[A]]]" , "A]"); // title only + fxt.Test_parse_page_all_str("[[A|B]]]" , "B]"); // title + caption; note that ] should be outside b/c MW has more logic that says "if caption starts with '['", but leaving as is; DATE:2014-07-23 + } @Test public void Multiple_captions() { // PURPOSE: multiple captions should be concatenated (used to only take first); EX:zh.d:维基词典:Unicode字符索引/0000–0FFF; DATE:2014-05-05 fxt.Test_parse_page_all_str("[[A|B|C|D]]" , "B|C|D"); } diff --git a/400_xowa/src_460_para/gplx/xowa/Xop_nl_lxr.java b/400_xowa/src_460_para/gplx/xowa/Xop_nl_lxr.java index ee75b22e5..962cb70f2 100644 --- a/400_xowa/src_460_para/gplx/xowa/Xop_nl_lxr.java +++ b/400_xowa/src_460_para/gplx/xowa/Xop_nl_lxr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.core.btries.*; +import gplx.core.btries.*; import gplx.xowa.parsers.lists.*; class Xop_nl_lxr implements Xop_lxr { public byte Lxr_tid() {return Xop_lxr_.Tid_nl;} public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Byte_ascii.NewLine, this);} diff --git a/400_xowa/src_460_para/gplx/xowa/Xop_para_wkr_basic_tst.java b/400_xowa/src_460_para/gplx/xowa/Xop_para_wkr_basic_tst.java index e8e2a79c8..ca0fea63b 100644 --- a/400_xowa/src_460_para/gplx/xowa/Xop_para_wkr_basic_tst.java +++ b/400_xowa/src_460_para/gplx/xowa/Xop_para_wkr_basic_tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import org.junit.*; +import org.junit.*; import gplx.xowa.parsers.lists.*; public class Xop_para_wkr_basic_tst { private Xop_fxt fxt = new Xop_fxt(); String raw; @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} diff --git a/400_xowa/src_460_para/gplx/xowa/Xop_pre_lxr.java b/400_xowa/src_460_para/gplx/xowa/Xop_pre_lxr.java index 459cfede2..394bbfce9 100644 --- a/400_xowa/src_460_para/gplx/xowa/Xop_pre_lxr.java +++ b/400_xowa/src_460_para/gplx/xowa/Xop_pre_lxr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.core.btries.*; +import gplx.core.btries.*; import gplx.xowa.parsers.lists.*; class Xop_pre_lxr implements Xop_lxr { public byte Lxr_tid() {return Xop_lxr_.Tid_pre;} public void Init_by_wiki(Xow_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Hook_space, this);} // NOTE: do not treat \n\t as shorthand pre; EX:pl.w:Main_Page; DATE:2014-05-06 diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr.java index e58f50d4e..f994eee55 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; +import gplx.xowa.parsers.lists.*; public class Xop_tblw_wkr implements Xop_ctx_wkr { private int tblw_te_ignore_count = 0; public boolean Cell_pipe_seen() {return cell_pipe_seen;} public Xop_tblw_wkr Cell_pipe_seen_(boolean v) {cell_pipe_seen = v; return this;} private boolean cell_pipe_seen; // status of 1st cell pipe; EX: \n| a | b | c || -> flag pipe between a and b but ignore b and c diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__dangling_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__dangling_tst.java index e96c5360f..b761d2a96 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__dangling_tst.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__dangling_tst.java @@ -20,7 +20,7 @@ import org.junit.*; public class Xop_tblw_wkr__dangling_tst { @Before public void init() {fxt.Reset(); fxt.Init_para_y_();} private Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_();} - @Test public void Dangling_tb_in_xnde() {// PURPOSE: dangling tblw incorrectly auto-closed by ; NOTE: this test is not correct; needs HTML tidy to close

earlier; EX:w:Atlanta_Olympics; DATE:2014-03-18 + @Test public void Dangling_tb_in_xnde() {// PURPOSE: dangling tblw incorrectly auto-closed by ; PAGE:en.w:Atlanta_Olympics; DATE:2014-03-18 fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last ( "
" , "{|" @@ -44,6 +44,7 @@ public class Xop_tblw_wkr__dangling_tst { , " " , " " , " " + , "
" // TIDY.dangling: tidy will correct dangling node; DATE:2014-07-22 , "" , "

b" , " " diff --git a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__double_pipe_tst.java b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__double_pipe_tst.java index c91afe054..8fb4e0014 100644 --- a/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__double_pipe_tst.java +++ b/400_xowa/src_480_tblw/gplx/xowa/Xop_tblw_wkr__double_pipe_tst.java @@ -27,27 +27,6 @@ public class Xop_tblw_wkr__double_pipe_tst { , "" )); } - @Test public void Image_map() {// PURPOSE: if || is inside table and imagemap, treat as lnki; EX:w:United_States_presidential_election,_1992; DATE:2014-03-29; DATE:2014-05-06 - fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last - ( "{|" - , "|-" - , "| z" - , "" - , "File:A.png||123px|b" // NOTE: "||" should not be tblw; also should not be pipe + text; if it is pipe + text, then caption will be "|123px" and width will be -1; DATE:2014-05-06 - , "" - , "|}" - ) , String_.Concat_lines_nl_skip_last - ( "" - , " " - , " " - , " " - , "
z" - , "\"b\"" // NOTE: width must be 123, not 0 - , "
" - , "" - ) - ); - } @Test public void Tblw_lnki_nth() { // PURPOSE: if || is nth pipe, then treat as lnki; EX:en.w:Main_Page;de.w:Main_Page; DATE:2014-05-06 fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last ( "{|" diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java index b23fc03ad..95ee1559c 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.core.btries.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.wikis.*; import gplx.xowa.xtns.*; import gplx.html.*; +import gplx.core.btries.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.wikis.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.strings.*; import gplx.html.*; import gplx.xowa.parsers.logs.*; public class Xop_xnde_wkr implements Xop_ctx_wkr { public void Ctor_ctx(Xop_ctx ctx) {} @@ -431,18 +431,6 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { Tblw_end(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, end_tag_id); return cur_pos; } - byte wlst_tid = Xop_list_tkn_.List_itmTyp_null; - switch (end_tag_id) { - case Xop_xnde_tag_.Tid_ul: wlst_tid = Xop_list_tkn_.List_itmTyp_ul; break; - case Xop_xnde_tag_.Tid_ol: wlst_tid = Xop_list_tkn_.List_itmTyp_ol; break; - case Xop_xnde_tag_.Tid_dd: wlst_tid = Xop_list_tkn_.List_itmTyp_dd; break; - case Xop_xnde_tag_.Tid_dt: wlst_tid = Xop_list_tkn_.List_itmTyp_dt; break; - } - if ( wlst_tid != Xop_list_tkn_.List_itmTyp_null // end tag is list; EX: - && ctx.List().List_dirty() // wlst is in effect; EX: *a - ) { - ctx.List().AutoClose(ctx, tkn_mkr, root, src, src_len, bgn_pos, cur_pos, tkn_mkr.List_end(cur_pos, wlst_tid)); // xnde can close wlst; PAGE:en.w:Bristol_Bullfinch DATE:2014-06-24 - } if (end_tag.Empty_ignored() && ctx.Empty_ignored() // emulate TidyHtml logic for pruning empty tags; EX: "

  • " -> "") && bgn_nde != null) { // bgn_nde will be null if only end_nde; EX:WP:Sukhoi Su-47; "* " ctx.Empty_ignore(root, bgn_nde.Tkn_sub_idx()); @@ -487,14 +475,17 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } if (end_tag.Restricted()) // restricted tags (like