From a94a9f0c7ff4c08462ae876a1e199a457067e37d Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Mon, 18 Mar 2019 23:11:26 -0400 Subject: [PATCH] Cite: Change Cite to follow MediaWiki behavior for super-scripting [#382] --- 100_core/src/gplx/Bry_split_.java | 18 ++++ 100_core/src/gplx/Bry_split__tst.java | 9 ++ .../gplx/core/data_stores/Gfo_data_itm.java | 19 ++++ .../gplx/core/data_stores/Gfo_data_store.java | 28 ++++++ .../src/gplx/langs/htmls/Gfh_atr_itm.java | 26 +++++ 400_xowa/src/gplx/langs/htmls/Gfh_html_.java | 39 ++++++++ 400_xowa/src/gplx/langs/htmls/Gfh_tag_.java | 2 +- 400_xowa/src/gplx/xowa/Xop_fxt.java | 6 +- .../src/gplx/xowa/parsers/Xow_parser_mgr.java | 3 +- .../xowa/xtns/cites/Cite_link_label_mgr.java | 40 ++++++++ .../src/gplx/xowa/xtns/cites/Cite_mgr.java | 98 +++++++++++++++++++ .../gplx/xowa/xtns/cites/Cite_mgr_tst.java | 64 ++++++++++++ .../gplx/xowa/xtns/cites/Cite_xtn_data.java | 34 +++++++ .../gplx/xowa/xtns/cites/Cite_xtn_mgr.java | 9 -- .../gplx/xowa/xtns/cites/Ref_html_wtr.java | 10 +- .../xowa/xtns/cites/Ref_html_wtr_cfg.java | 2 - .../xtns/cites/References_nde_group_tst.java | 10 +- 17 files changed, 392 insertions(+), 25 deletions(-) create mode 100644 400_xowa/src/gplx/core/data_stores/Gfo_data_itm.java create mode 100644 400_xowa/src/gplx/core/data_stores/Gfo_data_store.java create mode 100644 400_xowa/src/gplx/langs/htmls/Gfh_atr_itm.java create mode 100644 400_xowa/src/gplx/langs/htmls/Gfh_html_.java create mode 100644 400_xowa/src/gplx/xowa/xtns/cites/Cite_link_label_mgr.java create mode 100644 400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr.java create mode 100644 400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr_tst.java create mode 100644 400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_data.java diff --git a/100_core/src/gplx/Bry_split_.java b/100_core/src/gplx/Bry_split_.java index b0a0b433f..2f46ed571 100644 --- a/100_core/src/gplx/Bry_split_.java +++ b/100_core/src/gplx/Bry_split_.java @@ -134,6 +134,24 @@ public class Bry_split_ { } return rv; } + public static byte[][] Split_ws(byte[] src) {// REF.PHP: preg_split('/\s+/', $text) + int len = src.length; + if (len == 0) return Bry_.Ary_empty; + + List_adp list = List_adp_.New(); + int pos = 0; + while (true) { + int bgn = Bry_find_.Find_fwd_while_ws(src, pos, len); + if (bgn == len) break; // EOS + int end = Bry_find_.Find_fwd_until_ws(src, bgn + 1, len); + if (end == -1) end = len; + list.Add(Bry_.Mid(src, bgn, end)); + pos = end + 1; + if (pos >= len) break; + } + return (byte[][])list.To_ary_and_clear(byte[].class); + } + public static final int Rv__ok = 0, Rv__extend = 1, Rv__cancel = 2; } diff --git a/100_core/src/gplx/Bry_split__tst.java b/100_core/src/gplx/Bry_split__tst.java index c6fb53018..70cd286f2 100644 --- a/100_core/src/gplx/Bry_split__tst.java +++ b/100_core/src/gplx/Bry_split__tst.java @@ -49,6 +49,11 @@ public class Bry_split__tst { fxt.Test__split_w_max("a" , Byte_ascii.Pipe, 2, "a", null); // max is more fxt.Test__split_w_max("|" , Byte_ascii.Pipe, 2, "", ""); // empty itms } + @Test public void Split_ws() { + fxt.Test__split_ws("a b", "a", "b"); + fxt.Test__split_ws(" a ", "a"); + fxt.Test__split_ws(" abc def ", "abc", "def"); + } } class Bry_split__fxt { private final Bry_split_wkr__example wkr = new Bry_split_wkr__example(); @@ -64,6 +69,10 @@ class Bry_split__fxt { public void Test__split_w_max(String src, byte dlm, int max, String... expd) { Gftest.Eq__ary(expd, String_.Ary(Bry_split_.Split_w_max(Bry_.new_u8(src), dlm, max))); } + public void Test__split_ws(String raw, String... expd) { + byte[][] actl = Bry_split_.Split_ws(Bry_.new_u8(raw)); + Gftest.Eq__ary(Bry_.Ary(expd), actl, raw); + } } class Bry_split_wkr__example implements gplx.core.brys.Bry_split_wkr { private final List_adp list = List_adp_.New(); diff --git a/400_xowa/src/gplx/core/data_stores/Gfo_data_itm.java b/400_xowa/src/gplx/core/data_stores/Gfo_data_itm.java new file mode 100644 index 000000000..633bc7032 --- /dev/null +++ b/400_xowa/src/gplx/core/data_stores/Gfo_data_itm.java @@ -0,0 +1,19 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.core.data_stores; import gplx.*; import gplx.core.*; +public interface Gfo_data_itm { + String Key(); +} diff --git a/400_xowa/src/gplx/core/data_stores/Gfo_data_store.java b/400_xowa/src/gplx/core/data_stores/Gfo_data_store.java new file mode 100644 index 000000000..9b56cd0f0 --- /dev/null +++ b/400_xowa/src/gplx/core/data_stores/Gfo_data_store.java @@ -0,0 +1,28 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.core.data_stores; import gplx.*; import gplx.core.*; +public class Gfo_data_store { + private final Hash_adp hash = Hash_adp_.New(); + public Gfo_data_itm Get_or_null(String key) { + return (Gfo_data_itm)hash.Get_by(key); + } + public void Set(Gfo_data_itm itm) { + hash.Add_if_dupe_use_nth(itm.Key(), itm); + } + public void Clear() { + hash.Clear(); + } +} diff --git a/400_xowa/src/gplx/langs/htmls/Gfh_atr_itm.java b/400_xowa/src/gplx/langs/htmls/Gfh_atr_itm.java new file mode 100644 index 000000000..68530dac3 --- /dev/null +++ b/400_xowa/src/gplx/langs/htmls/Gfh_atr_itm.java @@ -0,0 +1,26 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.langs.htmls; import gplx.*; import gplx.langs.*; +public class Gfh_atr_itm { + public Gfh_atr_itm(byte[] key, byte[] val) { + this.key = key; + this.val = val; + } + public byte[] Key() {return key;} private final byte[] key; + public byte[] Val() {return val;} private final byte[] val; + public static Gfh_atr_itm New(byte[] key, String val) {return new Gfh_atr_itm(key, Bry_.new_u8(val));} + public static Gfh_atr_itm New(byte[] key, byte[] val) {return new Gfh_atr_itm(key, val);} +} diff --git a/400_xowa/src/gplx/langs/htmls/Gfh_html_.java b/400_xowa/src/gplx/langs/htmls/Gfh_html_.java new file mode 100644 index 000000000..8a098187c --- /dev/null +++ b/400_xowa/src/gplx/langs/htmls/Gfh_html_.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.langs.htmls; import gplx.*; import gplx.langs.*; +public class Gfh_html_ { + public static byte[] rawElement(Bry_bfr bfr, int tag_id, byte[] body, Gfh_atr_itm... atrs) { + // add "" + Gfh_tag_.Bld_lhs_end_nde(bfr); + + bfr.Add(body); + + // add "" + Gfh_tag_.Bld_rhs(bfr, tag_name); + return bfr.To_bry_and_clear(); + } +} diff --git a/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java b/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java index 78a990a7f..a57199ff5 100644 --- a/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java +++ b/400_xowa/src/gplx/langs/htmls/Gfh_tag_.java @@ -278,7 +278,7 @@ public class Gfh_tag_ { // NOTE: not serialized; used by tag_rdr , Comm_end_len = Comm_end.length ; public static final byte[] Rhs_bgn = Bry_.new_a7(" + public static void Bld_lhs_bgn(Bry_bfr bfr, byte[] tag) {bfr.Add_byte(Byte_ascii.Lt).Add(tag);} // public static void Bld_lhs_end_inl(Bry_bfr bfr) {bfr.Add_byte(Byte_ascii.Slash).Add_byte(Byte_ascii.Gt);} // "/>" public static void Bld_rhs(Bry_bfr bfr, byte[] name) {bfr.Add(Rhs_bgn).Add(name).Add_byte(Byte_ascii.Angle_end);} // EX:"" diff --git a/400_xowa/src/gplx/xowa/Xop_fxt.java b/400_xowa/src/gplx/xowa/Xop_fxt.java index ba33a5e4e..7001ea236 100644 --- a/400_xowa/src/gplx/xowa/Xop_fxt.java +++ b/400_xowa/src/gplx/xowa/Xop_fxt.java @@ -16,7 +16,7 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt package gplx.xowa; import gplx.*; import gplx.core.tests.*; import gplx.core.log_msgs.*; import gplx.xowa.apps.cfgs.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.parsers.miscs.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.repos.*; @@ -161,6 +161,10 @@ public class Xop_fxt { rv.Find_tkn_(tkn_arg_itm_(find)); return rv; } + public void Init__msg(String key, String val) { + Xol_msg_itm msg_itm = wiki.Msg_mgr().Get_or_make(Bry_.new_u8(key)); + msg_itm.Atrs_set(Bry_.new_u8(val), false, false); + } public Xop_fxt Init_para_y_() {ctx.Para().Enabled_y_(); return this;} public Xop_fxt Init_para_n_() {ctx.Para().Enabled_n_(); return this;} public Xop_fxt Init_log_(Gfo_msg_itm... itms) {for (Gfo_msg_itm itm : itms) log_itms.Add(itm); return this;} List_adp log_itms = List_adp_.New(); diff --git a/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java b/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java index 3bfa27206..ff72cface 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java @@ -14,7 +14,7 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt */ package gplx.xowa.parsers; import gplx.*; import gplx.xowa.*; -import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; +import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; import gplx.core.data_stores.*; import gplx.xowa.wikis.*; import gplx.core.envs.*; import gplx.xowa.files.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wbases.hwtrs.*; import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.xtns.pfuncs.times.*; import gplx.xowa.xtns.pfuncs.ttls.*; @@ -28,6 +28,7 @@ public class Xow_parser_mgr { } public Xop_ctx Ctx() {return ctx;} private final Xop_ctx ctx; public Xop_parser Main() {return parser;} private final Xop_parser parser; + public Gfo_data_store Data_store() {return data_store;} private final Gfo_data_store data_store = new Gfo_data_store(); public Scrib_core_mgr Scrib() {return scrib;} private final Scrib_core_mgr scrib = new Scrib_core_mgr(); public Xof_img_size Img_size() {return img_size;} private final Xof_img_size img_size = new Xof_img_size(); public Pfunc_ifexist_mgr Ifexist_mgr() {return ifexist_mgr;} private final Pfunc_ifexist_mgr ifexist_mgr = new Pfunc_ifexist_mgr(); diff --git a/400_xowa/src/gplx/xowa/xtns/cites/Cite_link_label_mgr.java b/400_xowa/src/gplx/xowa/xtns/cites/Cite_link_label_mgr.java new file mode 100644 index 000000000..448c6268e --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/cites/Cite_link_label_mgr.java @@ -0,0 +1,40 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.xowa.xtns.cites; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +class Cite_link_label_mgr { + private final Hash_adp_bry hash = Hash_adp_bry.cs(); + public void Clear() { + hash.Clear(); + } + public Cite_link_label_grp Get_or_null(byte[] group) { + return (Cite_link_label_grp)hash.Get_by(group); + } + public void Add(byte[] group, Cite_link_label_grp grp) { + hash.Add(group, grp); + } +} +class Cite_link_label_grp { + private final byte[][] labels; + public Cite_link_label_grp(byte[] name, byte[][] labels) { + this.name = name; + this.labels = labels; + } + public byte[] Name() {return name;} private final byte[] name; + public int Len() {return labels.length;} + public byte[] Get_or_null(int idx) { + return idx < labels.length ? labels[idx] : null; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr.java b/400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr.java new file mode 100644 index 000000000..8876a4a92 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr.java @@ -0,0 +1,98 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.xowa.xtns.cites; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.core.brys.fmtrs.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; +import gplx.langs.htmls.*; +class Cite_mgr { // REF.MW:/extensions/Cite/includes/Cite.php + private final Xowe_wiki wiki; + private final Hash_adp_bry messages_by_group = Hash_adp_bry.cs(); + private Cite_xtn_data xtn_data; + private Cite_link_label_mgr link_label_mgr; + public Cite_mgr(Xowe_wiki wiki) { + this.wiki = wiki; + } + public byte[] getLinkLabel(int offset, byte[] group) { + // get xtn_data; NOTE: should go in Init_by_wiki, but Init_by_wiki doesn't get called by tests + if (xtn_data == null) { + this.xtn_data = Cite_xtn_data.Get_or_make(wiki.Parser_mgr().Data_store()); + this.link_label_mgr = xtn_data.Link_labels(); + } + + // get message; use cache to avoid multiple concantenations; EX: "cite_link_label_group-" + "lower-roman"; + byte[] message = (byte[])messages_by_group.Get_by_bry(group); + if (message == null) { + message = Bry_.Add(Msg__cite_link_label_group, group); + messages_by_group.Add(group, message); + } + + // get linkLabels or gen + Cite_link_label_grp linkLabels = link_label_mgr.Get_or_null(group); + if (linkLabels == null) { + linkLabels = this.genLinkLabels(group, message); + } + + // if linkLabels group missing, just concat; EX: "custom-group 1" + if (linkLabels.Len() == 0) { + return Bry_.Add((group.length == 0 ? Bry_.Empty : Bry_.Add(group, Byte_ascii.Space)), wiki.Lang().Num_mgr().Format_num(offset)); + } + + // linkLabels group exists; pull corresponding offset; EX: "5" in lower-roman -> "v" + byte[] rv = linkLabels.Get_or_null(offset - 1); + return rv == null + ? this.plainError(Msg__cite_error_no_link_label_group, group, message) + : rv; + } + private Cite_link_label_grp genLinkLabels(byte[] group, byte[] message) { + Xol_msg_itm msg = wiki.Msg_mgr().Find_or_null(message); + byte[][] text = msg == null + ? Bry_.Ary_empty + : Bry_split_.Split_ws(msg.Val()); + + Cite_link_label_grp grp = new Cite_link_label_grp(group, text); + link_label_mgr.Add(group, grp); + return grp; + } + private byte[] plainError(byte[] key, Object... ary) { + Bry_bfr tmp_bfr = Bry_bfr_.New(); + Bry_fmtr tmp_fmtr = Bry_fmtr.New__tmp(); + + // build specific error msg + Xol_msg_itm msg_itm = wiki.Msg_mgr().Find_or_null(key); + byte[] msg = (msg_itm == null) ? key : msg_itm.Fmt(tmp_bfr, tmp_fmtr, ary); + + // wrap specific error message with "Cite error: " + msg_itm = wiki.Msg_mgr().Find_or_null(Msg__cite_error); + if (msg_itm != null) + msg = msg_itm.Fmt(tmp_bfr, tmp_fmtr, msg); + + // generate tag + Xol_lang_itm lang = wiki.Lang(); + byte[] ret = Gfh_html_.rawElement + ( tmp_bfr, Gfh_tag_.Id__span + , msg + , Gfh_atr_itm.New(Gfh_atr_.Bry__class, "error mw-ext-cite-error") + , Gfh_atr_itm.New(Gfh_atr_.Bry__lang , lang.Key_bry()) + , Gfh_atr_itm.New(Gfh_atr_.Bry__dir , lang.Dir_ltr_bry()) + ); + return ret; + } + public static final byte[] + Msg__cite_link_label_group = Bry_.new_a7("cite_link_label_group-") + , Msg__cite_error = Bry_.new_a7("cite_error") + , Msg__cite_error_no_link_label_group = Bry_.new_a7("cite_error_no_link_label_group") + ; +} diff --git a/400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr_tst.java b/400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr_tst.java new file mode 100644 index 000000000..25fa825e8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/cites/Cite_mgr_tst.java @@ -0,0 +1,64 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.xowa.xtns.cites; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import org.junit.*; import gplx.core.tests.*; +import gplx.xowa.langs.msgs.*; +public class Cite_mgr_tst { + private final Cite_mgr_fxt fxt = new Cite_mgr_fxt(); + @Test public void getLinkLabel_lower_alpha() { + fxt.Test__getLinkLabel("lower-alpha", 1, "a"); + fxt.Test__getLinkLabel("lower-alpha", 2, "b"); + fxt.Test__getLinkLabel("lower-alpha", 3, "c"); + } + @Test public void getLinkLabel_upper_roman() { + fxt.Test__getLinkLabel("upper-roman", 1, "I"); + fxt.Test__getLinkLabel("upper-roman", 2, "II"); + fxt.Test__getLinkLabel("upper-roman", 3, "III"); + } + @Test public void getLinkLabel_unknown() { + fxt.Test__getLinkLabel("unknown", 1, "unknown 1"); + } + @Test public void getLinkLabel_err() { + fxt.Test__getLinkLabel("upper-roman", 4, "Cite error: Ran out of custom link labels for group \"upper-roman\".\nDefine more in the [[MediaWiki:cite_link_label_group-upper-roman]] message."); + } +} +class Cite_mgr_fxt { + private Cite_mgr mgr; + private Xowe_wiki wiki; + public Cite_mgr_fxt() { + // init cite_mgr + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); + this.mgr = new Cite_mgr(wiki); + + // init common messages + this.Init__msg__label_grp("lower-alpha", "a b c"); + this.Init__msg__label_grp("upper-roman", "I II III"); + this.Init__msg(Cite_mgr.Msg__cite_error, "Cite error: ~{0}"); + this.Init__msg(Cite_mgr.Msg__cite_error_no_link_label_group, "Ran out of custom link labels for group \"~{0}\".\nDefine more in the [[MediaWiki:~{1}]] message."); + } + private void Init__msg__label_grp(String key, String val) { + this.Init__msg(String_.new_u8(Cite_mgr.Msg__cite_link_label_group) + key, val); + } + private void Init__msg(String key, String val) {Init__msg(Bry_.new_u8(key), val);} + private void Init__msg(byte[] key, String val) { + Xol_msg_itm msg = wiki.Msg_mgr().Get_or_make(key); + msg.Atrs_set(Bry_.new_u8(val), false, false); + } + public void Test__getLinkLabel(String group, int offset, String expd) { + Gftest.Eq__str(expd, mgr.getLinkLabel(offset, Bry_.new_u8(group))); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_data.java b/400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_data.java new file mode 100644 index 000000000..ab69249fc --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_data.java @@ -0,0 +1,34 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2017 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +The terms of each license can be found in the source code repository: + +GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt +Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt +*/ +package gplx.xowa.xtns.cites; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.core.data_stores.*; +class Cite_xtn_data implements Gfo_data_itm { + public String Key() {return KEY;} + public void Clear() { + link_labels.Clear(); + } + public Cite_link_label_mgr Link_labels() {return link_labels;} private final Cite_link_label_mgr link_labels = new Cite_link_label_mgr(); + + private static final String KEY = "xtn.Cite"; + public static Cite_xtn_data Get_or_make(Gfo_data_store data_store) { + Cite_xtn_data rv = (Cite_xtn_data)data_store.Get_or_null(KEY); + if (rv == null) { + rv = new Cite_xtn_data(); + data_store.Set(rv); + } + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_mgr.java index 0f1a8c4e2..103be02cc 100644 --- a/400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/cites/Cite_xtn_mgr.java @@ -17,13 +17,4 @@ package gplx.xowa.xtns.cites; import gplx.*; import gplx.xowa.*; import gplx.xow 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_a7("cite"); @Override public Xox_mgr Xtn_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_u8(group_default_name); - else if (ctx.Match(k, Invk_group_default_name_)) group_default_name = m.ReadBry("v"); - else return super.Invk(ctx, ikey, k, m); - return this; - } - private static final String Invk_group_default_name = "group_default_name", Invk_group_default_name_ = "group_default_name_"; - - public static byte[] Group_default_name() {return group_default_name;} private static byte[] group_default_name = Bry_.new_a7("lower-alpha"); } diff --git a/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr.java b/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr.java index 516123cab..3639cd06a 100644 --- a/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr.java @@ -19,22 +19,20 @@ import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; public class Ref_html_wtr { private final Xoh_ref_list_fmtr grp_list_fmtr = new Xoh_ref_list_fmtr(); - private final Bfr_arg__bry_fmtr grp_key_fmtr = Bfr_arg_.New_bry_fmtr__null(), itm_id_fmtr = Bfr_arg_.New_bry_fmtr__null(), grp_id_fmtr = Bfr_arg_.New_bry_fmtr__null(); + private final Bfr_arg__bry_fmtr itm_id_fmtr = Bfr_arg_.New_bry_fmtr__null(), grp_id_fmtr = Bfr_arg_.New_bry_fmtr__null(); + private final Cite_mgr mgr; public Ref_html_wtr(Xowe_wiki wiki) { cfg = Ref_html_wtr_cfg.new_(); + mgr = new Cite_mgr(wiki); } public void Xnde_ref(Xoh_wtr_ctx opts, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) { 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_is_default - ? itm.Idx_major() + 1 - : (Object)grp_key_fmtr.Set(cfg.Itm_grp_text(), itm.Group(), itm.Idx_major() + 1) + , mgr.getLinkLabel(itm.Idx_major() + 1, itm.Group()) ); } public Ref_html_wtr_cfg Cfg() {return cfg;} private Ref_html_wtr_cfg cfg; diff --git a/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr_cfg.java b/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr_cfg.java index ef9f5e8a9..eaf3b7e1e 100644 --- a/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr_cfg.java +++ b/400_xowa/src/gplx/xowa/xtns/cites/Ref_html_wtr_cfg.java @@ -20,7 +20,6 @@ public class Ref_html_wtr_cfg { public Bry_fmtr Itm_id_uid() {return itm_id_uid;} private Bry_fmtr itm_id_uid; public Ref_html_wtr_cfg Itm_id_uid_(String v) {itm_id_uid = Bry_fmtr.new_(v, "uid"); return this;} public Bry_fmtr Itm_id_key_one() {return itm_id_key_one;} private Bry_fmtr itm_id_key_one; public Ref_html_wtr_cfg Itm_id_key_one_(String v) {itm_id_key_one = Bry_fmtr.new_(v, "itm_key", "uid", "minor"); return this;} public Bry_fmtr Itm_id_key_many() {return itm_id_key_many;} private Bry_fmtr itm_id_key_many; public Ref_html_wtr_cfg Itm_id_key_many_(String v) {itm_id_key_many = Bry_fmtr.new_(v, "itm_key", "uid"); return this;} - public Bry_fmtr Itm_grp_text() {return itm_grp_text;} private Bry_fmtr itm_grp_text; public Ref_html_wtr_cfg Itm_grp_text_(String v) {itm_grp_text = Bry_fmtr.new_(v, "grp_key", "major"); return this;} public Bry_fmtr Grp_html_one() {return grp_html_one;} private Bry_fmtr grp_html_one; public Ref_html_wtr_cfg Grp_html_one_(String v) {grp_html_one = Bry_fmtr.new_(v, "grp_id", "itm_id", "text"); return this;} public Bry_fmtr Grp_html_many() {return grp_html_many;} private Bry_fmtr grp_html_many; public Ref_html_wtr_cfg Grp_html_many_(String v) {grp_html_many = Bry_fmtr.new_(v, "grp_id", "related_ids", "text"); return this;} public Bry_fmtr Grp_html_list() {return grp_html_list;} private Bry_fmtr grp_html_list; public Ref_html_wtr_cfg Grp_html_list_(String v) {grp_html_list = Bry_fmtr.new_(v, "itm_id", "backlabel"); return this;} @@ -47,7 +46,6 @@ public class Ref_html_wtr_cfg { rv.Itm_id_uid_ ("~{uid}"); rv.Itm_id_key_one_ ("~{itm_key}_~{uid}-~{minor}"); rv.Itm_id_key_many_ ("~{itm_key}-~{uid}"); - rv.Itm_grp_text_ ("~{grp_key} ~{major}"); rv.Grp_html_one_ ("
  • ^ ~{text}
  • \n"); rv.Grp_html_many_ ("
  • ^~{related_ids} ~{text}
  • \n"); rv.Grp_html_list_ (" ~{backlabel}"); diff --git a/400_xowa/src/gplx/xowa/xtns/cites/References_nde_group_tst.java b/400_xowa/src/gplx/xowa/xtns/cites/References_nde_group_tst.java index 8c6ac3f13..1bc7313fb 100644 --- a/400_xowa/src/gplx/xowa/xtns/cites/References_nde_group_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/cites/References_nde_group_tst.java @@ -16,7 +16,7 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt package gplx.xowa.xtns.cites; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import org.junit.*; public class References_nde_group_tst { - @Before public void init() {fxt.Clear_ref_mgr();} private final Xop_fxt fxt = new Xop_fxt(); + @Before public void init() {fxt.Clear_ref_mgr();} private final Xop_fxt fxt = new Xop_fxt(); @After public void term() {fxt.Init_para_n_();} @Test public void Basic() { fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last @@ -39,10 +39,10 @@ public class References_nde_group_tst { , "" )); } - @Test public void Lower_alpha_is_ignored() { + @Test public void Unknown() { String expd = String_.Concat_lines_nl_skip_last - ( "[1]" // note:do not show lower-alpha; DATE:2014-07-21 + ( "[unknown 1]" , "[1]" , "
      " , "
    1. ^ x
    2. " @@ -53,9 +53,9 @@ public class References_nde_group_tst { , "" ); fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last - ( "x" + ( "x" , "y" - , "" + , "" , "" ), expd); }