diff --git a/100_core/src/gplx/Decimal_adp_.java b/100_core/src/gplx/Decimal_adp_.java index 8912dd3e2..f6444df52 100644 --- a/100_core/src/gplx/Decimal_adp_.java +++ b/100_core/src/gplx/Decimal_adp_.java @@ -59,7 +59,7 @@ public class Decimal_adp_ { public static Decimal_adp double_thru_str_(double v) {return new Decimal_adp(BigDecimal.valueOf(v));} public static Decimal_adp db_(Object v) {return new Decimal_adp((BigDecimal)v);} public static Decimal_adp parse(String raw) { try { - DecimalFormat nf = (DecimalFormat)NumberFormat.getInstance(Locale.getDefault()); + DecimalFormat nf = (DecimalFormat)NumberFormat.getInstance(Locale.US); // always parse as US format; EX:".9" should not be ",9" in german; DATE:2016-01-31 nf.setParseBigDecimal(true); BigDecimal bd = (BigDecimal)nf.parse(raw); return new Decimal_adp(bd); diff --git a/100_core/src/gplx/Io_mgr.java b/100_core/src/gplx/Io_mgr.java index 5b1a32eb5..0d4ce6031 100644 --- a/100_core/src/gplx/Io_mgr.java +++ b/100_core/src/gplx/Io_mgr.java @@ -76,7 +76,8 @@ public class Io_mgr { // exists primarily to gather all cmds under gplx namespac public String LoadFilStr(String url) {return LoadFilStr_args(Io_url_.new_fil_(url)).Exec();} public String LoadFilStr(Io_url url) {return LoadFilStr_args(url).Exec();} public IoEngine_xrg_loadFilStr LoadFilStr_args(Io_url url) {return IoEngine_xrg_loadFilStr.new_(url);} - public byte[] LoadFilBryOrNull(Io_url url) {return ExistsFil(url) ? LoadFilBry(url) : null;} + public byte[] LoadFilBryOrNull(Io_url url) {return LoadFilBryOr(url, null);} + public byte[] LoadFilBryOr(Io_url url, byte[] or) {return ExistsFil(url) ? LoadFilBry(url) : or;} public byte[] LoadFilBry(String url) {return LoadFilBry_reuse(Io_url_.new_fil_(url), Bry_.Empty, Int_obj_ref.zero_());} public byte[] LoadFilBry(Io_url url) {return LoadFilBry_reuse(url, Bry_.Empty, Int_obj_ref.zero_());} public void LoadFilBryByBfr(Io_url url, Bry_bfr bfr) { diff --git a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt.java b/100_core/src/gplx/core/brys/fmtrs/Bry_fmt.java index 2b5d43427..f120fed9f 100644 --- a/100_core/src/gplx/core/brys/fmtrs/Bry_fmt.java +++ b/100_core/src/gplx/core/brys/fmtrs/Bry_fmt.java @@ -54,6 +54,7 @@ public class Bry_fmt { this.itms_len = itms.length; } public static Bry_fmt New(String fmt, String... keys) {return new Bry_fmt(Bry_.new_u8(fmt), Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);} + public static Bry_fmt New(byte[] fmt, String... keys) {return new Bry_fmt(fmt , Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);} } class Bry_fmt_itm { public Bry_fmt_itm(int tid, int src_bgn, int src_end) { diff --git a/100_core/src/gplx/core/envs/Op_sys.java b/100_core/src/gplx/core/envs/Op_sys.java index d7b3f51d4..f77d64c57 100644 --- a/100_core/src/gplx/core/envs/Op_sys.java +++ b/100_core/src/gplx/core/envs/Op_sys.java @@ -80,7 +80,5 @@ public class Op_sys { else throw Err_.new_wo_type("unknown os_name; expecting windows, linux, mac; System.getProperty(\"os.name\")", "val", os_name); } catch (Exception exc) {Drd.os_name = os_name; return Drd;} } - public static void OpSysIsDroid() { - cur_op_sys = Drd; - } + public static void Cur_is_drd_() {cur_op_sys = Drd;} } diff --git a/400_xowa/src/gplx/langs/mustaches/Mustache_itm_render_tst.java b/400_xowa/src/gplx/langs/mustaches/Mustache_itm_render_tst.java index 97146bffe..43e1a97e0 100644 --- a/400_xowa/src/gplx/langs/mustaches/Mustache_itm_render_tst.java +++ b/400_xowa/src/gplx/langs/mustaches/Mustache_itm_render_tst.java @@ -94,6 +94,17 @@ public class Mustache_itm_render_tst { , "a12ab34b" ); } + @Test public void Section_bool_subs() { // handle prop written after boolean; should not pick up inner prop + fxt.Init__root + ( fxt.Make_mock(0).Add_bool_y("bool1").Add_prop("prop2", "2").Add_subs("subs1" + , fxt.Make_mock(1).Add_prop("prop1", "11") + , fxt.Make_mock(2).Add_prop("prop1", "12") + )); + fxt.Test__parse + ( "a{{#bool1}}b{{#subs1}}c{{prop1}}d{{/subs1}}e{{/bool1}}f{{prop2}}g" + , "abc11dc12def2g" + ); + } } class Mustache_itm_render_fxt { private final Mustache_tkn_parser parser = new Mustache_tkn_parser(); diff --git a/400_xowa/src/gplx/langs/mustaches/Mustache_render_ctx.java b/400_xowa/src/gplx/langs/mustaches/Mustache_render_ctx.java index 1e7d0f7d8..54499ed7a 100644 --- a/400_xowa/src/gplx/langs/mustaches/Mustache_render_ctx.java +++ b/400_xowa/src/gplx/langs/mustaches/Mustache_render_ctx.java @@ -19,11 +19,11 @@ package gplx.langs.mustaches; import gplx.*; import gplx.langs.*; public class Mustache_render_ctx { private final List_adp stack = List_adp_.new_(); private Mustache_doc_itm cur; - private Mustache_doc_itm[] subs; private int subs_idx, subs_len; private boolean cur_is_bool; + private Mustache_doc_itm[] subs; private int subs_idx, subs_len; private byte cur_is_bool; public Mustache_render_ctx Init(Mustache_doc_itm cur) { this.cur = cur; this.subs = null; - this.subs_idx = subs_len = 0; this.cur_is_bool = false; + this.subs_idx = subs_len = 0; this.cur_is_bool = Bool_.__byte; return this; } public byte[] Render_variable(String key) { @@ -32,51 +32,55 @@ public class Mustache_render_ctx { while (itm != Mustache_doc_itm_.Null_itm) { rv = cur.Get_prop(key); if (rv != Mustache_doc_itm_.Null_val) break; - else break; - // TODO: itm = itm.Get_owner(); + else break; // TODO: itm = itm.Get_owner(); } return rv; } public void Section_bgn(String key) { - subs = cur.Get_subs(key); if (subs == null) subs = Mustache_doc_itm_.Ary__empty; + Mustache_stack_itm stack_itm = new Mustache_stack_itm(cur, subs, subs_idx, subs_len, cur_is_bool); // note that cur is "owner" since subs_idx == 0 + stack.Add(stack_itm); + subs = cur.Get_subs(key); if (subs == null) subs = Mustache_doc_itm_.Ary__empty; // subs == null if property does not exist; EX: "folder{{#files}}file{{/files}}" and folder = new Folder(File[0]); subs_len = subs.length; subs_idx = -1; - cur_is_bool = false; } public boolean Section_do() { if (++subs_idx >= subs_len) return false; Mustache_doc_itm sub = subs[subs_idx]; if (subs_idx == 0) { // special logic to handle 1st item; note that there always be at least one item - if (subs_len == 1) { - if (sub == Mustache_doc_itm_.Itm__bool__y) {cur_is_bool = true; return Bool_.Y;} - else if (sub == Mustache_doc_itm_.Itm__bool__n) {cur_is_bool = true; return Bool_.N;} + if (sub == Mustache_doc_itm_.Itm__bool__n) { + cur_is_bool = Bool_.N_byte; + return Bool_.N; } - Mustache_stack_itm stack_itm = new Mustache_stack_itm(cur, subs, subs_idx, subs_len); // note that cur is "owner" since subs_idx == 0 - stack.Add(stack_itm); + else if (sub == Mustache_doc_itm_.Itm__bool__y) { + cur_is_bool = Bool_.Y_byte; + return Bool_.Y; + } + else + cur_is_bool = Bool_.__byte; } cur = sub; return true; } public void Section_end() { - if (cur_is_bool) return; - if (stack.Count() == 0) return; Mustache_stack_itm itm = (Mustache_stack_itm)List_adp_.Pop(stack); subs = itm.subs; subs_len = itm.subs_len; subs_idx = itm.subs_idx; cur = itm.cur; - // cur = subs_idx < subs_len ? subs[subs_idx] : null; + cur_is_bool = itm.cur_is_bool; } } class Mustache_stack_itm { - public Mustache_stack_itm(Mustache_doc_itm cur, Mustache_doc_itm[] subs, int subs_idx, int subs_len) { + public Mustache_stack_itm(Mustache_doc_itm cur, Mustache_doc_itm[] subs, int subs_idx, int subs_len, byte cur_is_bool) { this.cur = cur; + this.cur_is_bool = cur_is_bool; this.subs = subs; this.subs_idx = subs_idx; this.subs_len = subs_len; } - public Mustache_doc_itm cur; - public Mustache_doc_itm[] subs; - public int subs_idx; - public int subs_len; + public final Mustache_doc_itm cur; + public final byte cur_is_bool; + public final Mustache_doc_itm[] subs; + public final int subs_idx; + public final int subs_len; } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index b67705f25..8da0cec7e 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -34,7 +34,7 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "3.1.4.2"; + public static final String Version = "3.1.5.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys_str; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java index fc6debf64..3d9a9427c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java @@ -284,7 +284,7 @@ class Xob_rate_mgr { private int item_len; private Bry_bfr save_bfr = Bry_bfr.reset_(255); public int Reset_interval() {return reset_interval;} public Xob_rate_mgr Reset_interval_(int v) {reset_interval = v; return this;} private int reset_interval = 10000; - public Io_url Log_file() {return log_file;} public Xob_rate_mgr Log_file_(Io_url v) {log_file = v; return this;} private Io_url log_file; + public Io_url Log_file_url() {return log_file;} public Xob_rate_mgr Log_file_(Io_url v) {log_file = v; return this;} private Io_url log_file; public void Init() {time_bgn = Env_.TickCount();} public void Increment() { ++item_len; diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java index 1d0781430..4b2c1d3f6 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java @@ -20,11 +20,12 @@ import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.xowa.wikis.data.tbls.*; i import gplx.xowa.files.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; -import gplx.xowa.parsers.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.xndes.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.htmls.core.bldrs.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.wdatas.*; import gplx.fsdb.meta.*; import gplx.xowa.files.fsdb.*; import gplx.fsdb.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.parsers.vnts.*; -public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink_logger { +import gplx.xowa.parsers.lnkis.files.*; +public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements gplx.xowa.parsers.lnkis.files.Xop_file_logger { private Xob_lnki_temp_tbl tbl; private boolean wdata_enabled = true, xtn_ref_enabled = true, gen_html, gen_hdump; private Xop_log_invoke_wkr invoke_wkr; private Xop_log_property_wkr property_wkr; private boolean ns_file_is_case_match_all = true; private Xowe_wiki commons_wiki; @@ -40,7 +41,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink property_wkr.Init_reset(); } @Override protected Db_conn Init_db_file() { - ctx.Lnki().File_wkr_(this); + ctx.Lnki().File_logger_(this); Xob_db_file make_db = Xob_db_file.new__file_make(wiki.Fsys_mgr().Root_dir()); Db_conn make_conn = make_db.Conn(); this.tbl = new Xob_lnki_temp_tbl(make_conn); tbl.Create_tbl(); @@ -125,7 +126,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink wiki.Appe().Log_mgr().Txn_end(); tbl.Insert_end(); } - public void Wkr_exec(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, byte lnki_src_tid) { + public void Log_file(Xop_ctx ctx, Xop_lnki_tkn lnki, byte caller_tid) { if (lnki.Ttl().ForceLiteralLink()) return; // ignore literal links which creat a link to file, but do not show the image; EX: [[:File:A.png|thumb|120px]] creates a link to File:A.png, regardless of other display-oriented args byte[] ttl = lnki.Ttl().Page_db(); Xof_ext ext = Xof_ext_.new_by_ttl_(ttl); @@ -136,8 +137,8 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink && Xof_lnki_time.Null_n(lnki_time)) // thumbtime set usr_dlg.Warn_many("", "", "page and thumbtime both set; this may be an issue with fsdb: page=~{0} ttl=~{1}", ctx.Page().Ttl().Page_db_as_str(), String_.new_u8(ttl)); if (lnki.Ns_id() == Xow_ns_.Tid__media) - lnki_src_tid = Xob_lnki_src_tid.Tid_media; - tbl.Insert_cmd_by_batch(ctx.Page().Bldr__ns_ord(), ctx.Page().Revision_data().Id(), ttl, ttl_commons, Byte_.By_int(ext.Id()), lnki.Lnki_type(), lnki_src_tid, lnki.W(), lnki.H(), lnki.Upright(), lnki_time, lnki_page); + caller_tid = Xop_file_logger_.Tid__media; + tbl.Insert_cmd_by_batch(ctx.Page().Bldr__ns_ord(), ctx.Page().Revision_data().Id(), ttl, ttl_commons, Byte_.By_int(ext.Id()), lnki.Lnki_type(), caller_tid, lnki.W(), lnki.H(), lnki.Upright(), lnki_time, lnki_page); } @Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_wdata_enabled_)) wdata_enabled = m.ReadYn("v"); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm.java index 0b28d271f..794ebf1c3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.core.stores.*; import gplx.dbs.*; import gplx.xowa.files.*; -import gplx.xowa.parsers.lnkis.*; +import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*; class Xob_xfer_temp_itm { public int Lnki_id() {return lnki_id;} private int lnki_id; public int Lnki_tier_id() {return lnki_tier_id;} private int lnki_tier_id; @@ -119,7 +119,7 @@ class Xob_xfer_temp_itm { chk_tid = Chk_tid_orig_media_type_is_audio; return false; } - if (lnki_src_tid == Xob_lnki_src_tid.Tid_media) { + if (lnki_src_tid == Xop_file_logger_.Tid__media) { chk_tid = Chk_tid_ns_is_media; return false; } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java index efd1c733e..ea4c7ee1d 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_xfer_temp_itm_tst.java @@ -19,7 +19,7 @@ package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gp import org.junit.*; import gplx.core.gfo_ndes.*; import gplx.core.stores.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; -import gplx.xowa.parsers.lnkis.*; +import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*; public class Xob_xfer_temp_itm_tst { private Xob_xfer_temp_itm_fxt fxt = new Xob_xfer_temp_itm_fxt(); @Before public void init() {fxt.Reset();} @@ -86,7 +86,7 @@ public class Xob_xfer_temp_itm_tst { @Test public void Media_should_be_ignored() {// ignore [[Media:]] for xfer_thumb (needed for xfer_orig) fxt.Test_bgn ( KeyVal_.new_(Xob_orig_regy_tbl.Fld_lnki_ttl , "A.png") - , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_src_tid , Xob_lnki_src_tid.Tid_media) + , KeyVal_.new_(Xob_lnki_regy_tbl.Fld_lnki_src_tid , Xop_file_logger_.Tid__media) ); fxt.Test_itm_chk_fail_id(Xob_xfer_temp_itm.Chk_tid_ns_is_media); } @@ -137,7 +137,7 @@ class Xob_xfer_temp_itm_fxt { GfoFldList flds = GfoFldList_.str_(Flds); nde = GfoNde_.vals_(flds, Object_.Ary ( Xof_ext_.Id_png, 1, 1, Xof_repo_itm_.Repo_remote - , "A.png", Xof_ext_.Id_png, "A.png", Xop_lnki_type.Id_thumb, Xob_lnki_src_tid.Tid_file + , "A.png", Xof_ext_.Id_png, "A.png", Xop_lnki_type.Id_thumb, Xop_file_logger_.Tid__file , 220, 200, 1, 2, 440, 400, 3 , Xop_lnki_tkn.Upright_null, Xof_lnki_time.Null, Xof_lnki_page.Null , Xof_media_type.Name_bitmap, "png" diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java index f52df218f..55cdfadb0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_delete_cmd.java @@ -34,7 +34,8 @@ public class Xob_page_delete_cmd extends Xob_cmd_base { { Dbmeta_fld_itm.new_int("page_id").Primary_y_() , Dbmeta_fld_itm.new_int("page_text_db_id") } - , Dbmeta_idx_itm.new_normal_by_tbl("page_filter", "db_id", "page_text_db_id", "page_id") + , Dbmeta_idx_itm.new_normal_by_tbl("page_filter", "db_id__page", "page_text_db_id", "page_id") + , Dbmeta_idx_itm.new_normal_by_tbl("page_filter", "page_id", "page_id") )); } @@ -53,25 +54,28 @@ public class Xob_page_delete_cmd extends Xob_cmd_base { , ";" )); - Xowd_db_file[] db_files = core_db.Tbl__db().Select_all(wiki.Data__core_mgr().Props(), wiki.Fsys_mgr().Root_dir()); - int len = db_files.length; - for (int i = 0; i < len; ++i) { - boolean db_file_is_text = Bool_.N, db_file_is_cat = Bool_.N, db_file_is_search = Bool_.N; - Xowd_db_file db_file = db_files[i]; - switch (db_file.Tid()) { - case Xowd_db_file_.Tid_core: case Xowd_db_file_.Tid_wiki_solo: case Xowd_db_file_.Tid_text_solo: - db_file_is_text = db_file_is_cat = db_file_is_search = Bool_.Y; break; - case Xowd_db_file_.Tid_text: db_file_is_text = Bool_.Y; break; - case Xowd_db_file_.Tid_cat: db_file_is_cat = Bool_.Y; break; - case Xowd_db_file_.Tid_search_core: db_file_is_search = Bool_.Y; break; + try { + Xowd_db_file[] db_files = core_db.Tbl__db().Select_all(wiki.Data__core_mgr().Props(), wiki.Fsys_mgr().Root_dir()); + int len = db_files.length; + for (int i = 0; i < len; ++i) { + boolean db_file_is_text = Bool_.N, db_file_is_cat = Bool_.N, db_file_is_search = Bool_.N; + Xowd_db_file db_file = db_files[i]; + switch (db_file.Tid()) { + case Xowd_db_file_.Tid_core: case Xowd_db_file_.Tid_wiki_solo: case Xowd_db_file_.Tid_text_solo: + if (wiki.Data__core_mgr().Props().Layout_text().Tid_is_lot()) continue; // if mode is lot, then "core" db does not have text, cat, search; skip; DATE:2016-01-31 + db_file_is_text = db_file_is_cat = db_file_is_search = Bool_.Y; break; + case Xowd_db_file_.Tid_text: db_file_is_text = Bool_.Y; break; + case Xowd_db_file_.Tid_cat: db_file_is_cat = Bool_.Y; break; + case Xowd_db_file_.Tid_search_core: db_file_is_search = Bool_.Y; break; + } + int db_id = db_file.Id(); + if (db_file_is_text) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting text: " + db_id, "DELETE FROM text WHERE page_id IN (SELECT page_id FROM page_filter WHERE page_text_db_id = {0});"); + if (db_file_is_cat) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting cat: " + db_id, "DELETE FROM cat_link WHERE cl_from IN (SELECT page_id FROM page_filter);"); + if (db_file_is_search) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting search:" + db_id, "DELETE FROM search_link WHERE page_id IN (SELECT page_id FROM page_filter);"); + if (db_file_is_text || db_file_is_cat || db_file_is_search) + db_file.Conn().Env_vacuum(); } - int db_id = db_file.Id(); - if (db_file_is_text) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting text: " + db_id, "DELETE FROM text WHERE page_id IN (SELECT page_id FROM page_filter WHERE page_text_db_id = {0});"); - if (db_file_is_cat) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting cat: " + db_id, "DELETE FROM cat_link WHERE cl_from IN (SELECT page_id FROM page_filter);"); - if (db_file_is_cat) Run_sql(core_db_conn, db_file.Url(), db_id, "deleting search:" + db_id, "DELETE FROM search_link WHERE page_id IN (SELECT page_id FROM page_filter);"); - if (db_file_is_text || db_file_is_cat || db_file_is_search) - db_file.Conn().Env_vacuum(); - } + } catch (Exception e) {Gfo_usr_dlg_.Instance.Warn_many("", "", "fatal error during page deletion: err=~{0}", Err_.Message_gplx_log(e));} core_db_conn.Exec_sql_plog_ntx("deleting from table: page", "DELETE FROM page WHERE page_id IN (SELECT page_id FROM page_filter);"); // core_db_conn.Ddl_delete_tbl("page_filter"); core_db_conn.Env_vacuum(); diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr.java index 3e9b73e55..7cd306551 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_mgr.java @@ -81,7 +81,7 @@ public class Xoh_page_wtr_mgr implements GfoInvkAble { public static final String Invk_page_read_ = "page_read_", Invk_page_edit_ = "page_edit_", Invk_page_html_ = "page_html_", Invk_xowa_div_edit_rename_ = "xowa_div_edit_rename_"; private static final String[] Fmtr_keys = new String[] { "app_root_dir", "app_version", "app_build_date", "xowa_mode_is_server" - , "page_id", "page_name", "page_title", "page_modified_on_msg" + , "page_id", "page_name", "page_title", "page_modified_on_msg", "page_heading" , "html_css_common_path", "html_css_wiki_path", "xowa_head" , "page_lang_ltr", "page_indicators", "page_content_sub", "page_jumpto", "page_pgbnr", "page_body_cls", "html_content_editable" , "page_data", "page_langs" diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java index 4d4598585..b1f0a3834 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java @@ -44,15 +44,18 @@ public class Xoh_page_wtr_wkr { break; } Bry_bfr page_bfr = Xoa_app_.Utl__bfr_mkr().Get_m001(); // NOTE: get separate page bfr to output page; do not reuse tmp_bfr b/c it will be used inside Fmt_do + Xoh_wtr_ctx hctx = null; if (page_mode == Xopg_page_.Tid_html && wiki.App().Api_root().Html().Page().View_html_generates_hdump()) { - Write_body(page_bfr, Xoh_wtr_ctx.Hdump, page); - Write_page_by_tid(page_mode, bfr, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(page_bfr.To_bry_and_clear())); + hctx = Xoh_wtr_ctx.Hdump; + Write_body(page_bfr, hctx, page); + Write_page_by_tid(hctx, page_mode, bfr, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(page_bfr.To_bry_and_clear())); } else { - Write_body(page_bfr, Xoh_wtr_ctx.Basic, page); - Write_page_by_tid(view_mode, bfr, fmtr, page_bfr.To_bry_and_rls()); + hctx = Xoh_wtr_ctx.Basic; + Write_body(page_bfr, hctx, page); + Write_page_by_tid(hctx, view_mode, bfr, fmtr, page_bfr.To_bry_and_rls()); if (page_mode == Xopg_page_.Tid_html) // if html, write page again, but wrap it in html skin this time - Write_page_by_tid(page_mode, bfr, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(bfr.To_bry_and_clear())); + Write_page_by_tid(hctx, page_mode, bfr, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(bfr.To_bry_and_clear())); wdata_lang_wtr.Page_(null); } } @@ -62,7 +65,7 @@ public class Xoh_page_wtr_wkr { return bfr.To_bry_and_clear(); } } - private void Write_page_by_tid(byte html_gen_tid, Bry_bfr bfr, Bry_fmtr fmtr, byte[] page_data) { + private void Write_page_by_tid(Xoh_wtr_ctx hctx, byte html_gen_tid, Bry_bfr bfr, Bry_fmtr fmtr, byte[] page_data) { // if custom_html, use it and exit; needed for Default_tab byte[] custom_html = page.Html_data().Custom_html(); if (custom_html != null) {bfr.Add(custom_html); return;} @@ -92,9 +95,9 @@ public class Xoh_page_wtr_wkr { , root_dir_bry, Xoa_app_.Version, Xoa_app_.Build_date, app.Tcp_server().Running_str() , page.Revision_data().Id() , page_name, page_display - , modified_on_msg + , modified_on_msg, page.Html_data().Page_heading().Init(page) , mgr.Css_common_bry(), mgr.Css_wiki_bry(), page.Html_data().Head_mgr().Init(app, wiki, page).Init_dflts() - , page.Lang().Dir_ltr_bry(), page.Html_data().Indicators(), page_content_sub, wiki.Html_mgr().Portal_mgr().Div_jump_to(), wiki.Xtn_mgr().Xtn_pgbnr().Write_html(ctx, page), page_body_class, html_content_editable + , page.Lang().Dir_ltr_bry(), page.Html_data().Indicators(), page_content_sub, wiki.Html_mgr().Portal_mgr().Div_jump_to(), wiki.Xtn_mgr().Xtn_pgbnr().Write_html(ctx, page, hctx, page_data), page_body_class, html_content_editable , page_data, wdata_lang_wtr , portal_mgr.Div_personal_bry(), portal_mgr.Div_ns_bry(app.Utl__bfr_mkr(), page_ttl, wiki.Ns_mgr()), portal_mgr.Div_view_bry(app.Utl__bfr_mkr(), html_gen_tid, page.Html_data().Xtn_search_text()) , portal_mgr.Div_logo_bry(), portal_mgr.Div_home_bry(), new Xopg_xtn_skin_fmtr_arg(page, Xopg_xtn_skin_itm_tid.Tid_sidebar), portal_mgr.Div_wikis_bry(app.Utl__bfr_mkr()), portal_mgr.Sidebar_mgr().Html_bry() diff --git a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java index 50c87a165..57bf92383 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java @@ -43,7 +43,7 @@ public class Xow_html_mgr implements GfoInvkAble { } public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; public Xoh_html_wtr Html_wtr() {return html_wtr;} private Xoh_html_wtr html_wtr; - public Xoh_page_wtr_mgr Page_wtr_mgr() {return page_wtr_mgr;} private Xoh_page_wtr_mgr page_wtr_mgr; + public Xoh_page_wtr_mgr Page_wtr_mgr() {return page_wtr_mgr;} private Xoh_page_wtr_mgr page_wtr_mgr; public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr; public Xow_toc_mgr Toc_mgr() {return toc_mgr;} private Xow_toc_mgr toc_mgr = new Xow_toc_mgr(); public Xow_module_mgr Head_mgr() {return module_mgr;} private Xow_module_mgr module_mgr; diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java index 06ce4a1f4..8c30f247e 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java @@ -75,7 +75,7 @@ public class Xoh_html_wtr { case Xop_tkn_itm_.Tid_html_ref: Html_ref(ctx, hctx, bfr, src, (Xop_amp_tkn_txt)tkn); break; case Xop_tkn_itm_.Tid_hr: Hr(ctx, hctx, bfr, src, (Xop_hr_tkn)tkn); break; case Xop_tkn_itm_.Tid_apos: Apos(ctx, hctx, bfr, src, (Xop_apos_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_lnki: lnki_wtr.Write_lnki(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; case Xop_tkn_itm_.Tid_under: Under(ctx, hctx, bfr, src, (Xop_under_tkn)tkn); break; @@ -223,7 +223,7 @@ public class Xoh_html_wtr { if (hctx.Mode_is_alt()) return; switch (under.Under_tid()) { case Xol_kwd_grp_.Id_toc: - wiki.Html_mgr().Toc_mgr().Html(page, hctx, src, bfr); + wiki.Html_mgr().Toc_mgr().Html(page, hctx, src, bfr, true); break; case Xol_kwd_grp_.Id_notoc: case Xol_kwd_grp_.Id_forcetoc: // NOTE: skip output; changes flag on page only break; diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java index e195c1163..b57fd9e8f 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java @@ -22,6 +22,7 @@ import gplx.xowa.files.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.files.c import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.apps.metas.*; public class Xoh_hdoc_ctx { private byte[] fsys__file; + public byte[] Fsys__res() {return fsys__res;} private byte[] fsys__res; public byte[] Fsys__root() {return fsys__root;} private byte[] fsys__root; public byte[] Fsys__file__comm() {return fsys__file__comm;} private byte[] fsys__file__comm; public byte[] Fsys__file__wiki() {return fsys__file__wiki;} private byte[] fsys__file__wiki; @@ -48,8 +49,9 @@ public class Xoh_hdoc_ctx { this.fsys__root = fsys_mgr.Root_dir().To_http_file_bry(); this.fsys__file = fsys_mgr.File_dir().To_http_file_bry(); this.fsys__file__comm = Bry_.Add(fsys__file, Xow_domain_itm_.Bry__commons, Byte_ascii.Slash_bry); - // Xou_cache_mgr cache_mgr = app.User().User_db_mgr().Cache_mgr(); - // if (cache_mgr != null) file__mgr = Xou_cache_finder_.New_db(cache_mgr); // NOTE: this effectively only loads the cache db in app mode (and not in test mode) + this.fsys__res = gplx.core.envs.Op_sys.Cur().Tid_is_drd() ? Fsys__res__drd : fsys__root; + Xou_cache_mgr cache_mgr = app.User().User_db_mgr().Cache_mgr(); + if (cache_mgr != null) file__mgr = Xou_cache_finder_.New_db(cache_mgr); // NOTE: this effectively only loads the cache db in app mode (and not in test mode) pool_mgr__hzip.Init(); } public void Init_by_page(Xow_wiki wiki, byte[] page_url) { @@ -67,4 +69,5 @@ public class Xoh_hdoc_ctx { this.uid__gly = -1; } public static final int Invalid = -1; + private static final byte[] Fsys__res__drd = Bry_.new_a7("file:///android_asset/xowa/"); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java index f22282b53..d3b8f6e08 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java @@ -26,6 +26,7 @@ public class Xoh_hzip_fxt { private final Xoh_page hpg = new Xoh_page(); private boolean mode_is_b256; public Xoh_hzip_fxt() { + gplx.core.envs.Op_sys.Cur_is_drd_(); // force drd mode; needed for img_bare this.wiki = parser_fxt.Wiki(); Xoa_app_fxt.repo2_(parser_fxt.App(), wiki); // needed else will be old "mem/wiki/repo/trg/thumb/" instead of standard "mem/file/en.wikipedia.org/thumb/" wiki.Html__hdump_mgr().Init_by_db(parser_fxt.Wiki()); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java index fa4cbabbd..cee8e5e54 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_html.java @@ -22,7 +22,7 @@ import gplx.xowa.htmls.core.htmls.*; public class Xoh_hdr_html { public void Write_html(Bry_bfr bfr, Xoh_html_wtr wtr, Xowe_wiki wiki, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoh_html_wtr_cfg cfg, Xop_tkn_grp grp, int sub_idx, byte[] src, Xop_hdr_tkn hdr) { if (hdr.Hdr_html_first() && cfg.Toc__show() && !page.Hdr_mgr().Toc_manual()) // __TOC__ not specified; place at top; NOTE: if __TOC__ was specified, then it would be placed wherever __TOC__ appears - wiki.Html_mgr().Toc_mgr().Html(ctx.Page(), hctx, src, bfr); + wiki.Html_mgr().Toc_mgr().Html(ctx.Page(), hctx, src, bfr, true); int hdr_len = hdr.Hdr_level(); if (hdr_len > 0) { // NOTE: need to check hdr_len b/c it could be dangling diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_data.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_data.java index 759bf7a04..64ce344e1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_data.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_data.java @@ -32,7 +32,7 @@ public class Xoh_img_bare_data implements Xoh_data_itm { public boolean Init_by_parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag img_head, Gfh_tag unused) { this.src_bgn = img_head.Src_bgn(); this.src_end = img_head.Src_end(); Gfh_atr img_src_atr = img_head.Atrs__get_by_or_empty(Gfh_atr_.Bry__src); if (img_src_atr.Val_dat_missing()) return false; - byte[] root_dir_bry = hctx.Fsys__root(); + byte[] root_dir_bry = hctx.Fsys__res(); // NOTE: Fsys_res == Fsys_root on all machines except drd; int root_dir_bgn = img_src_atr.Val_bgn(); int root_dir_end = root_dir_bgn + root_dir_bry.length; if (Bry_.Match(src, root_dir_bgn, root_dir_end, root_dir_bry)) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java index 0991a97b3..f7a18f1c0 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_hzip__tst.java @@ -23,7 +23,7 @@ public class Xoh_img_bare_hzip__tst { @Test public void Hiero() { fxt.Test__bicode ( "~(!\"t\"~" - , "t" + , "t" ); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_wtr.java index c7f5c6117..31deb5944 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bare_wtr.java @@ -36,7 +36,7 @@ public class Xoh_img_bare_wtr implements Bfr_arg, Xoh_wtr_itm { switch (data_itm.Img_tid()) { case Xoh_img_bare_data.Img_tid__hiero: bfr.Add_mid(src, data_itm.Src_bgn(), data_itm.Dir_bgn()); - bfr.Add(hctx.Fsys__root()).Add(Xoh_img_bare_data.Url__hiero); + bfr.Add(hctx.Fsys__res()).Add(Xoh_img_bare_data.Url__hiero); // NOTE: must use Fsys_res will be android_asset on drd; en.w:Hieroglyphics DATE:2016-01-31 bfr.Add_mid(src, data_itm.Dir_end(), data_itm.Src_end()); break; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_data.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_data.java index bbefde444..7284ae9cb 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_data.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_data.java @@ -26,21 +26,21 @@ public class Xoh_img_data implements Xoh_data_itm { public int Src_end() {return src_end;} private int src_end; public Xoh_anch_href_data Anch_href() {return anch_href;} private Xoh_anch_href_data anch_href = new Xoh_anch_href_data(); public Xoh_anch_cls_data Anch_cls() {return anch_cls;} private Xoh_anch_cls_data anch_cls = new Xoh_anch_cls_data(); - public boolean Anch_rel_nofollow_exists() {return anch_rel_is_nofollow;} private boolean anch_rel_is_nofollow; + public boolean Anch_rel_nofollow_exists() {return anch_rel_is_nofollow;} private boolean anch_rel_is_nofollow; public int Anch_title_bgn() {return anch_title_bgn;} private int anch_title_bgn; public int Anch_title_end() {return anch_title_end;} private int anch_title_end; - public boolean Anch_title_exists() {return anch_title_end != -1;} + public boolean Anch_title_exists() {return anch_title_end != -1;} public Bry_obj_ref Anch_page() {return anch_page;} private Bry_obj_ref anch_page = Bry_obj_ref.New_empty(); public Xoh_img_src_data Img_src() {return img_src;} private final Xoh_img_src_data img_src = new Xoh_img_src_data(); public Xoh_img_cls_data Img_cls() {return img_cls;} private final Xoh_img_cls_data img_cls = new Xoh_img_cls_data(); public Xoh_img_xoimg_data Img_xoimg() {return img_xoimg;} private Xoh_img_xoimg_data img_xoimg = new Xoh_img_xoimg_data(); public int Img_alt_bgn() {return img_alt_bgn;} private int img_alt_bgn; public int Img_alt_end() {return img_alt_end;} private int img_alt_end; - public boolean Img_alt__diff__anch_title() {return img_alt__diff_anch_title;} private boolean img_alt__diff_anch_title; + public boolean Img_alt__diff__anch_title() {return img_alt__diff_anch_title;} private boolean img_alt__diff_anch_title; public int Img_w() {return img_w;} private int img_w; public int Img_h() {return img_h;} private int img_h; - public boolean Img_w__diff__file_w() {return img_w != img_src.File_w();} - public boolean Img_is_vid() {return img_is_vid;} private boolean img_is_vid; + public boolean Img_w__diff__file_w() {return img_w != img_src.File_w();} + public boolean Img_is_vid() {return img_is_vid;} private boolean img_is_vid; public boolean Img_wo_anch() {return img_wo_anch;} private boolean img_wo_anch; public int Img_imap_idx() {return img_imap_idx;} private int img_imap_idx; public void Clear() { diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java index d02e7630d..d054c66e8 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java @@ -58,6 +58,7 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { Init_by_decode(hpg, hctx, src, data); this.Bfr_arg__add(bfr); } + private static final byte[] Bry__qarg__esc = Bry_.new_a7("%3F"); public boolean Init_by_decode(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_data_itm data_itm) { Xoh_img_data data = (Xoh_img_data)data_itm; this.Clear(); @@ -73,7 +74,9 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm { this.img_xowa_image.Set_by_arg(img_xowa_image.Clone()); // NOTE: must clone b/c img_xowa_image is member of Xoh_img_data which is poolable (and cleared); PAGE:en.w:Almagest; DATE:2016-01-05 img_w.Set_by_int(fsdb_itm.Html_w()); img_h.Set_by_int(fsdb_itm.Html_h()); - this.img_src.Set_by_bry(fsdb_itm.Html_view_url().To_http_file_bry()); + byte[] src_bry = fsdb_itm.Html_view_url().To_http_file_bry(); + if (gplx.core.envs.Op_sys.Cur().Tid_is_drd()) src_bry = Bry_.Replace(src_bry, Byte_ascii.Question_bry, Bry__qarg__esc); // NOTE: if drd, always escape "?" as "%3F" PAGE:en.w:Cleopatra en.w:Cave_painting; DATE:2016-01-31 + this.img_src.Set_by_bry(src_bry); } else if (data.Img_w() != -1) { img_w.Set_by_int(data.Img_w()); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java index cf868f3cb..8adea471d 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java @@ -43,7 +43,7 @@ public class Xoh_lnki_wtr { this.history_mgr = app.Usere().History_mgr(); if (hctx.Mode_is_hdump()) cfg.Lnki__id_(false); } - public void Write(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) { + public void Write_lnki(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) { Xoa_ttl lnki_ttl = lnki.Ttl(); if (lnki_ttl == null) {// NOTE: parser failed to properly invalidate lnki; escape tkn now and warn; DATE:2014-06-06 app.Usr_dlg().Warn_many("", "", "invalid lnki evaded parser; page=~{0} ex=~{1}", ctx.Page().Url().To_str(), String_.new_u8(src, lnki.Src_bgn(), lnki.Src_end())); diff --git a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm_.java b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm_.java index 02f3fac0f..7456e526f 100644 --- a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm_.java +++ b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm_.java @@ -28,6 +28,7 @@ public class Xoh_head_itm_ { , Key__mathjax = Bry_.new_a7("mathjax") , Key__navframe = Bry_.new_a7("navframe") , Key__popups = Bry_.new_a7("popups") + , Key__pgbnr = Bry_.new_a7("pgbnr") , Key__search_suggest = Bry_.new_a7("xowa.search_suggest") , Key__timeline = Bry_.new_a7("xowa.timeline") , Key__title_rewrite = Bry_.new_a7("title_rewrite") diff --git a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm__pgbnr.java b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm__pgbnr.java new file mode 100644 index 000000000..73bdf4d39 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm__pgbnr.java @@ -0,0 +1,37 @@ +/* +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.htmls.heads; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +import gplx.xowa.guis.*; +public class Xoh_head_itm__pgbnr extends Xoh_head_itm__base { + @Override public byte[] Key() {return Xoh_head_itm_.Key__pgbnr;} + @Override public int Flags() {return Flag__css_include;} + @Override public void Write_css_include(Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xoh_head_wtr wtr) { + if (Url__css__styles == null) { + Url__css__oojs_ui = app.Fsys_mgr().Bin_any_dir().GenSubFil_nest("xowa", "html", "res", "lib", "oojs-ui", "oojs-ui-mediawiki.css").To_http_file_bry(); // needed for icons; should move to own file + Io_url resources_dir = app.Fsys_mgr().Bin_any_dir().GenSubDir_nest("xowa", "xtns", "WikidataPageBanner", "resources"); + Url__css__styles = resources_dir.GenSubFil_nest("ext.WikidataPageBanner.styles" , "ext.WikidataPageBanner.css").To_http_file_bry(); + Url__css__toc = resources_dir.GenSubFil_nest("ext.WikidataPageBanner.toc.styles" , "ext.WikidataPageBanner.toc.css").To_http_file_bry(); + Url__css__bottomtoc = resources_dir.GenSubFil_nest("ext.WikidataPageBanner.toc.styles" , "ext.WikidataPageBanner.bottomtoc.css").To_http_file_bry(); + } + wtr.Write_css_include(Url__css__oojs_ui); + wtr.Write_css_include(Url__css__styles); + wtr.Write_css_include(Url__css__toc); + wtr.Write_css_include(Url__css__bottomtoc); + } + private static byte[] Url__css__styles, Url__css__toc, Url__css__bottomtoc, Url__css__oojs_ui; +} diff --git a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java index 84c732447..a395e83ff 100644 --- a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java @@ -33,7 +33,7 @@ public class Xoh_head_mgr implements gplx.core.brys.Bfr_arg { public Xoh_head_mgr() { Itms_add(itm__css, itm__globals, itm__server, itm__popups, itm__toc, itm__collapsible, itm__navframe, itm__gallery, itm__gallery_styles , itm__mathjax, itm__graph, itm__hiero, itm__top_icon, itm__title_rewrite, itm__search_suggest, itm__timeline - , itm__dbui + , itm__dbui, itm__pgbnr ); } public Xoh_head_itm__css Itm__css() {return itm__css;} private final Xoh_head_itm__css itm__css = new Xoh_head_itm__css(); @@ -53,6 +53,7 @@ public class Xoh_head_mgr implements gplx.core.brys.Bfr_arg { public Xoh_head_itm__timeline Itm__timeline() {return itm__timeline;} private final Xoh_head_itm__timeline itm__timeline = new Xoh_head_itm__timeline(); public Xoh_head_itm__search_suggest Itm__search_suggest() {return itm__search_suggest;} private final Xoh_head_itm__search_suggest itm__search_suggest = new Xoh_head_itm__search_suggest(); public Xoh_head_itm__dbui Itm__dbui() {return itm__dbui;} private final Xoh_head_itm__dbui itm__dbui = new Xoh_head_itm__dbui(); + public Xoh_head_itm__pgbnr Itm__pgbnr() {return itm__pgbnr;} private final Xoh_head_itm__pgbnr itm__pgbnr = new Xoh_head_itm__pgbnr(); public Xoh_head_mgr Init(Xoae_app app, Xowe_wiki wiki, Xoae_page page) { this.app = app; this.wiki = wiki; this.page = page; return this; diff --git a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java index f4a4b399e..75cd15887 100644 --- a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr.java @@ -190,28 +190,29 @@ public class Xow_toc_mgr implements gplx.core.brys.Bfr_arg { } } } - public void Html(Xoae_page page, Xoh_wtr_ctx hctx, byte[] src, Bry_bfr bfr) { + public void Html(Xoae_page page, Xoh_wtr_ctx hctx, byte[] src, Bry_bfr bfr, boolean write_toc_cls) { if (!page.Hdr_mgr().Toc_enabled()) return; // REF.MW: Parser.php|formatHeadings if (hctx.Mode_is_hdump()) return; this.page = page; byte[] bry_contents = page.Wikie().Msg_mgr().Val_by_id(Xol_msg_itm_.Id_toc); - bfmtr_main.Bld_bfr_many(bfr, Bfr_arg_.New_bry(bry_contents), this); + bfmtr_main.Bld_bfr_many(bfr, write_toc_cls ? Bry_toc_cls : Bry_.Empty, Bfr_arg_.New_bry(bry_contents), this); } private static final byte[] Bry_list_bgn = Bry_.new_a7("
    \n") , Bry_list_end = Bry_.new_a7("
\n") , Bry_item_end = Bry_.new_a7(" \n") + , Bry_toc_cls = Bry_.new_a7(" id=\"toc\" class=\"toc\"") ; private Bry_fmtr bfmtr_main = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "
" + ( "" , "
" , "

~{contents_title}

" , "
" , "~{toc_list}
" , "" ) - , "contents_title", "toc_list" + , "toc", "contents_title", "toc_list" ) , bfmtr_line = Bry_fmtr.new_ ( "
  • ~{heading} ~{text}\n" diff --git a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java index daccbd1d5..95885a30f 100644 --- a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java @@ -514,7 +514,7 @@ class Xow_toc_mgr_fxt { byte[] raw_bry = Bry_.new_u8(raw); Xop_root_tkn root = fxt.Ctx().Tkn_mkr().Root(raw_bry); fxt.Parser().Parse_page_all_clear(root, fxt.Ctx(), fxt.Ctx().Tkn_mkr(), raw_bry); - toc_mgr.Html(fxt.Page(), Xoh_wtr_ctx.Basic, raw_bry, tmp); + toc_mgr.Html(fxt.Page(), Xoh_wtr_ctx.Basic, raw_bry, tmp, true); Tfds.Eq_ary(String_.SplitLines_nl(expd), String_.SplitLines_nl(tmp.To_str_and_clear()), raw); } public void Test_html_all(String raw, String expd) { diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java index c7f23ee72..640f3dba8 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java @@ -325,9 +325,9 @@ public class Xop_ctx { return rv; } private static void new_copy(Xop_ctx src, Xop_ctx trg) { - trg.Lnki().File_wkr_(src.Lnki().File_wkr()); // always share file_wkr between sub contexts - trg.tmpl_output = src.tmpl_output; // share bfr for optimization purposes - trg.ref_ignore = src.ref_ignore; // copy ref_ignore; needed for refs inside poem else duplicate refs; it.s:La_Secchia_rapita/Canto_primo; DATE:2015-12-03 + trg.Lnki().File_logger_(src.Lnki().File_logger()); // always share lnki_logger between sub contexts + trg.tmpl_output = src.tmpl_output; // share bfr for optimization purposes + trg.ref_ignore = src.ref_ignore; // copy ref_ignore; needed for refs inside poem else duplicate refs; it.s:La_Secchia_rapita/Canto_primo; DATE:2015-12-03 trg.references_group = src.references_group; trg.cur_page.Ref_mgr_(src.cur_page.Ref_mgr()); } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java index 47e1d5dc5..6ea7369f4 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.parsers.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.core.btries.*; import gplx.core.primitives.*; import gplx.xowa.wikis.nss.*; -import gplx.xowa.wikis.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.relatedSites.*; +import gplx.xowa.wikis.*; import gplx.xowa.parsers.lnkis.files.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.relatedSites.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.parsers.miscs.*; public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { private Arg_bldr arg_bldr = Arg_bldr.Instance; @@ -29,7 +29,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { sites_regy_mgr = ctx.Wiki().Xtn_mgr().Xtn_sites().Regy_mgr(); if (!sites_regy_mgr.Xtn_mgr().Enabled()) sites_regy_mgr = null; // sets sites_xtn_mgr status for page; see below } public void Page_end(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int src_len) {} - public Xopg_redlink_logger File_wkr() {return file_wkr;} public Xop_lnki_wkr File_wkr_(Xopg_redlink_logger v) {file_wkr = v; return this;} private Xopg_redlink_logger file_wkr; + public Xop_file_logger File_logger() {return lnki_logger;} public Xop_lnki_wkr File_logger_(Xop_file_logger v) {lnki_logger = v; return this;} private Xop_file_logger lnki_logger = Xop_file_logger_.Noop; public void Auto_close(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, Xop_tkn_itm tkn) { Xop_lnki_tkn lnki = (Xop_lnki_tkn)tkn; lnki.Tkn_tid_to_txt(); @@ -72,7 +72,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr { } if (lnki_is_file) { ctx.Page().Lnki_list().Add(lnki); - if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_file); + lnki_logger.Log_file(ctx, lnki, Xop_file_logger_.Tid__file); } Xoa_ttl lnki_ttl = lnki.Ttl(); if ( lnki_ttl.Wik_bgn() != -1 // lnki is xwiki diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_logger.java b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger.java similarity index 65% rename from 400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_logger.java rename to 400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger.java index 7f0ae8b5d..be8aa7e43 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_logger.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger.java @@ -15,7 +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.parsers.lnkis.redlinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; -public interface Xopg_redlink_logger { - void Wkr_exec(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, byte lnki_src_tid); +package gplx.xowa.parsers.lnkis.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; +public interface Xop_file_logger { + void Log_file(Xop_ctx ctx, Xop_lnki_tkn lnki, byte caller_tid); +} +class Xop_file_logger__noop implements Xop_file_logger { + public void Log_file(Xop_ctx ctx, Xop_lnki_tkn lnki, byte caller_tid) {} } diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger_.java similarity index 66% rename from 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java rename to 400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger_.java index d5c5348fe..56cbf5c48 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger_.java @@ -15,7 +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.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; -public class Xob_lnki_src_tid { - public static final byte Tid_file = 0, Tid_media = 1, Tid_gallery = 2, Tid_imageMap = 3; +package gplx.xowa.parsers.lnkis.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; +public class Xop_file_logger_ { + public static final Xop_file_logger Noop = new Xop_file_logger__noop(); + public static final byte Tid__file = 0, Tid__media = 1, Tid__gallery = 2, Tid__imap = 3, Tid__pgbnr_main = 4; } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.java new file mode 100644 index 000000000..b4f986f72 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.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.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import gplx.xowa.xtns.pfuncs.*; +public class Xop_func_arg_itm { + public byte[] key; + public byte[] val; + public void Set(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Arg_nde_tkn arg) { + Pf_func_.Eval_arg_or(bfr, ctx, src, caller, self, arg, null); + key = val = Bry_.Empty; + int len = bfr.Len(); byte[] bry = bfr.Bfr(); + int bgn = -1, end = -1; boolean mode_is_key = true; + for (int i = 0; i < len; ++i) { + byte b = bry[i]; + switch (b) { + case Byte_ascii.Eq: + if (mode_is_key) { + mode_is_key = false; + key = Bry_.Mid(bry, bgn, end); + bgn = end = -1; + } + break; + case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space: + break; + default: + if (bgn == -1) bgn = i; + end = i + 1; + break; + } + if (bgn != -1) // guard against 'key=' + val = Bry_.Mid(bry, bgn, end); + } + bfr.Clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java index d8ae415f1..65a1e3e2a 100644 --- a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java +++ b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java @@ -20,7 +20,7 @@ import gplx.langs.htmls.*; import gplx.xowa.htmls.heads.*; import gplx.xowa.wiki import gplx.xowa.xtns.pagebanners.*; public class Xopg_html_data { private Ordered_hash ctg_hash; - public boolean Html_restricted() {return html_restricted;} private boolean html_restricted = true; + public boolean Html_restricted() {return html_restricted;} private boolean html_restricted = true; public void Html_restricted_(boolean v) {html_restricted = v;} public void Html_restricted_n_() {Html_restricted_(Bool_.N);} public void Html_restricted_y_() {Html_restricted_(Bool_.Y);} public byte[] Display_ttl() { return ( display_ttl_vnt != null // -{T}- was in document @@ -33,25 +33,26 @@ public class Xopg_html_data { ; } public Xopg_html_data Display_ttl_(byte[] v) {display_ttl = v; return this;} private byte[] display_ttl; - public boolean Mode_wtxt_shown() {synchronized (this) {return mode_wtxt_shown;}} public void Mode_wtxt_shown_y_() {synchronized (this) {this.mode_wtxt_shown = true;}} private boolean mode_wtxt_shown; + public boolean Mode_wtxt_shown() {synchronized (this) {return mode_wtxt_shown;}} public void Mode_wtxt_shown_y_() {synchronized (this) {this.mode_wtxt_shown = true;}} private boolean mode_wtxt_shown; public byte[] Display_ttl_vnt() {return display_ttl_vnt;} public void Display_ttl_vnt_(byte[] v) {display_ttl_vnt = v;} private byte[] display_ttl_vnt; public byte[] Content_sub() {return content_sub;} public void Content_sub_(byte[] v) {content_sub = v;} private byte[] content_sub; + public Xopg_page_heading Page_heading() {return page_heading;} private final Xopg_page_heading page_heading = new Xopg_page_heading(); public String Bmk_pos() {return html_bmk_pos;} public void Bmk_pos_(String v) {html_bmk_pos = v;} private String html_bmk_pos; public Bry_bfr Portal_div_xtn() {return portal_div_xtn;} private Bry_bfr portal_div_xtn = Bry_bfr.reset_(255); public byte[] Edit_preview_w_dbg() {return Bry_.Add(xtn_scribunto_dbg, edit_preview);} public void Edit_preview_(byte[] v) {edit_preview = v;} private byte[] edit_preview = Bry_.Empty; public int Lnke_autonumber_next() {return lnke_autonumber++;} private int lnke_autonumber = 1; public int Sect_uid() {return sect_uid;} private int sect_uid = -1; public int Sect_uid_next() {return ++sect_uid;} - public boolean Lang_convert_content() {return lang_convert_content;} public void Lang_convert_content_(boolean v) {lang_convert_content = v;} private boolean lang_convert_content = true; - public boolean Lang_convert_title() {return lang_convert_title;} public void Lang_convert_title_(boolean v) {lang_convert_title = v;} private boolean lang_convert_title = true; + public boolean Lang_convert_content() {return lang_convert_content;} public void Lang_convert_content_(boolean v) {lang_convert_content = v;} private boolean lang_convert_content = true; + public boolean Lang_convert_title() {return lang_convert_title;} public void Lang_convert_title_(boolean v) {lang_convert_title = v;} private boolean lang_convert_title = true; public Xopg_xtn_skin_mgr Xtn_skin_mgr() {return xtn_skin_mgr;} private Xopg_xtn_skin_mgr xtn_skin_mgr = new Xopg_xtn_skin_mgr(); public Indicator_html_bldr Indicators() {return indicators;} private final Indicator_html_bldr indicators = new Indicator_html_bldr(); public int Xtn_gallery_next_id() {return ++xtn_gallery_next_id;} private int xtn_gallery_next_id = -1; - public boolean Xtn_gallery_packed_exists() {return xtn_gallery_packed_exists;} public void Xtn_gallery_packed_exists_y_() {xtn_gallery_packed_exists = true;} private boolean xtn_gallery_packed_exists; - public boolean Xtn_imap_exists() {return xtn_imap_exists;} public void Xtn_imap_exists_y_() {xtn_imap_exists = true;} private boolean xtn_imap_exists; + public boolean Xtn_gallery_packed_exists() {return xtn_gallery_packed_exists;} public void Xtn_gallery_packed_exists_y_() {xtn_gallery_packed_exists = true;} private boolean xtn_gallery_packed_exists; + public boolean Xtn_imap_exists() {return xtn_imap_exists;} public void Xtn_imap_exists_y_() {xtn_imap_exists = true;} private boolean xtn_imap_exists; public int Xtn_imap_next_id() {return ++xtn_imap_next_id;} private int xtn_imap_next_id; // NOTE: must keep separate imap_id b/c html_elem_id is not always set; public byte[] Xtn_search_text() {return xtn_search_txt;} public void Xtn_search_text_(byte[] v) {xtn_search_txt = v;} private byte[] xtn_search_txt = Bry_.Empty; public byte[] Xtn_scribunto_dbg() {return xtn_scribunto_dbg;} public void Xtn_scribunto_dbg_(byte[] v) {xtn_scribunto_dbg = Bry_.Add(xtn_scribunto_dbg, v);} private byte[] xtn_scribunto_dbg = Bry_.Empty; - public Pgbnr_itm Xtn__pgbnr() {return xtn__pgbnr;} public void Xtn__pgbnr_(Pgbnr_itm v) {xtn__pgbnr = v;} private Pgbnr_itm xtn__pgbnr; + public Pgbnr_itm Xtn_pgbnr() {return xtn_pgbnr;} public void Xtn_pgbnr_(Pgbnr_itm v) {xtn_pgbnr = v;} private Pgbnr_itm xtn_pgbnr; public Xoh_head_mgr Head_mgr() {return module_mgr;} private Xoh_head_mgr module_mgr = new Xoh_head_mgr(); public byte[] Custom_html() {return custom_html;} public Xopg_html_data Custom_html_(byte[] v) {custom_html = v; return this;} private byte[] custom_html; public byte[] Custom_tab_name() {return custom_tab_name;} public Xopg_html_data Custom_tab_name_(byte[] v) {custom_tab_name = v; return this;} private byte[] custom_tab_name; @@ -81,7 +82,7 @@ public class Xopg_html_data { xtn_imap_exists = false; xtn_search_txt = Bry_.Empty; xtn_scribunto_dbg = Bry_.Empty; - xtn__pgbnr = null; + xtn_pgbnr = null; module_mgr.Clear(); custom_html = custom_html_end = custom_head_end = custom_tab_name = null; if (ctg_hash != null) ctg_hash.Clear(); diff --git a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java new file mode 100644 index 000000000..d4eda1c0b --- /dev/null +++ b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.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.wikis.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; +import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; +public class Xopg_page_heading implements Bfr_arg { + private Xopg_html_data html_data; + private Xoa_ttl page_ttl; + public Xopg_page_heading Init(Xoae_page page) { + this.html_data = page.Html_data(); + this.page_ttl = page.Ttl(); + return this; + } + public void Bfr_arg__add(Bry_bfr bfr) { + if (html_data.Xtn_pgbnr() != null) return; // pgbnr exists; don't add title + fmtr.Bld_bfr_many(bfr, page_ttl.Page_txt()); + } + private final Bry_fmt fmtr = Bry_fmt.New(Bry_.New_u8_nl_apos("

    ~{page_title}

    "), "page_title"); +} diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java index 43f4aadab..9c429f8fa 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java @@ -19,7 +19,7 @@ package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.x import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.wikis.nss.*; -import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.tmpls.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.files.*; public class Gallery_itm_parser { private Xowe_wiki wiki; private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_u8(); @@ -77,11 +77,10 @@ public class Gallery_itm_parser { Xop_root_tkn caption_tkn = wiki.Parser_mgr().Main().Parse_text_to_wdom_old_ctx(ctx, lnki_caption, true); cur_itm.Caption_tkn_(caption_tkn); } - Xopg_redlink_logger file_wkr = ctx.Lnki().File_wkr(); // NOTE: do not set file_wkr ref early (as member var); parse_all sets late ctx.Page().Lnki_list().Add(lnki_tkn); mgr.Get_thumb_size(lnki_tkn, cur_itm.Ext()); // NOTE: set thumb size, so that lnki.temp parse picks it up - if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki_tkn, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_gallery); - lnki_tkn.W_(-1).H_(-1); // NOTE: reset lnki back to defaults, else itm will show as large missing caption + ctx.Lnki().File_logger().Log_file(ctx, lnki_tkn, Xop_file_logger_.Tid__gallery); // NOTE: do not set file_wkr ref early (as member var); parse_all sets late + lnki_tkn.W_(-1).H_(-1); // NOTE: reset lnki back to defaults, else itm will show as large missing caption } private byte Parse_itm() { int fld_count = 0; diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java index 6d1dae326..cbd10b65c 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java @@ -17,7 +17,7 @@ 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.core.primitives.*; -import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*; class Imap_parser { private Imap_xtn_mgr xtn_mgr; private Xoa_url page_url; private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance; private byte[] imap_img_src; @@ -188,7 +188,6 @@ class Imap_parser { imap_img_src = Bry_.Add(Xop_tkn_.Lnki_bgn, Bry_.Mid(src, img_bgn, img_end), Xop_tkn_.Lnki_end); Xop_tkn_itm tkn_itm = Parse_link(imap_img_src); // NOTE: need to parse before imap_root.Data_mid() below imap_img_src = imap_root.Data_mid(); // 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 - Xopg_redlink_logger file_wkr = wiki_ctx.Lnki().File_wkr(); // NOTE: do not do imap_ctx.Lnki(); imap_ctx is brand new if ( tkn_itm == null // no lnki or lnke || tkn_itm.Tkn_tid() != Xop_tkn_itm_.Tid_lnki // no lnki; occurs with badly constructed maps; PAGE:en.w:Demography_of_the_United_Kingdom DATE:2015-01-22 ) @@ -198,7 +197,7 @@ class Imap_parser { imap_img = new Imap_itm_img(lnki_tkn); lnki_tkn.Lnki_file_wkr_(imap); wiki_ctx.Page().Lnki_list().Add(lnki_tkn); - if (file_wkr != null) file_wkr.Wkr_exec(wiki_ctx, src, lnki_tkn, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_imageMap); + wiki_ctx.Lnki().File_logger().Log_file(wiki_ctx, lnki_tkn, Xop_file_logger_.Tid__imap); // NOTE: do not do imap_ctx.Lnki(); imap_ctx is brand new } return img_end; } 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 b3f50dbc8..14a218766 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 @@ -29,12 +29,14 @@ public class Map_dd2dms_func extends Pf_func_base { Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b128(); byte[] plus = Bry_.Empty, minus = Bry_.Empty; int prec = 4; + Xop_func_arg_itm func_arg = new Xop_func_arg_itm(); for (int i = 0; i < args_len; i++) { - Arg_nde_tkn arg = self.Args_get_by_idx(i); - byte[] key = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Key_tkn()); + Arg_nde_tkn arg = self.Args_get_by_idx(i); + func_arg.Set(tmp_bfr, ctx, src, caller, self, arg); + byte[] key = func_arg.key; Object key_tid_obj = Key_hash.Get_by(key); if (key_tid_obj != null) { - byte[] val = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Val_tkn()); + byte[] val = func_arg.val; switch (((Byte_obj_val)key_tid_obj).Val()) { case Key_tid_plus: plus = val; break; case Key_tid_minus: minus = val; break; diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java index 75391ebd7..221dbe26e 100644 --- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java @@ -22,4 +22,5 @@ public class Map_dd2dms_func_tst { @Test public void Example() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58|precision=4}}" , "{{test}}" , "14° 34' 48"");} @Test public void Plus() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58|precision=4|plus=pos}}" , "{{test}}" , "14° 34' 48" pos");} @Test public void Ws() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58| precision = 4 | plus = pos }}" , "{{test}}" , "14° 34' 48" pos");} + @Test public void Nested_pfunc() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58|{{#if:2|precision=2}}}}" , "{{test|3}}" , "14° 34'");} // handle "{{#if:2|precision=2}}" -> "precision=2" } 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 081594d85..e995c4e49 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 @@ -29,13 +29,15 @@ public class Map_geolink_func extends Pf_func_base { int args_len = self.Args_len(); Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b128(); try { + Xop_func_arg_itm func_arg = new Xop_func_arg_itm(); byte[] pattern = Eval_argx(ctx, src, caller, self); for (int i = 0; i < args_len; i++) { Arg_nde_tkn arg = self.Args_get_by_idx(i); - byte[] key = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Key_tkn()); + func_arg.Set(tmp_bfr, ctx, src, caller, self, arg);; + byte[] key = func_arg.key; Object key_tid_obj = Key_hash.Get_by(key); if (key_tid_obj != null) { - byte[] val = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Val_tkn()); + byte[] val = func_arg.val; switch (((Byte_obj_val)key_tid_obj).Val()) { case Key_tid_lat_val: mer_x_val = val; break; case Key_tid_long_val: mer_y_val = val; break; diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java index 0ef92e7e7..25b15ee46 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java @@ -16,16 +16,25 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.core.primitives.*; public class Pgbnr_cfg { - private static final int[] wpb_standard_sizes = new int[] {640, 1280, 2560}; - public byte[] Default_file() {return null;} - public boolean Enabled_in_ns(int ns_id) {return false;} - public boolean Get__wpb_enable_default_banner() {return false;} - public boolean Get__wpb_enable_heading_override() {return false;} - public byte[] Get__wpb_image() {return null;} - public int[] Get__wpb_standard_sizes() {return wpb_standard_sizes;} + private final Hash_adp ns_hash = Hash_adp_.new_(); private final Int_obj_ref tmp_ns_key = Int_obj_ref.neg1_(); + public Pgbnr_cfg(boolean enabled, boolean enable_heading_override, boolean enable_default_banner, int[] ns_ary, int dflt_img_wdata_prop, byte[] dflt_img_title, int[] standard_sizes) { + this.enabled = enabled; this.enable_heading_override = enable_heading_override; this.enable_default_banner = enable_default_banner; + this.standard_sizes = standard_sizes; + this.dflt_img_wdata_prop = dflt_img_wdata_prop; this.dflt_img_title = dflt_img_title; + for (int ns : ns_ary) + this.ns_hash.Add_as_key_and_val(Int_obj_ref.new_(ns)); + } + public final boolean enabled; + public final boolean enable_heading_override; + public final boolean enable_default_banner; + public final int dflt_img_wdata_prop; + public final byte[] dflt_img_title; + public final int[] standard_sizes; public boolean Chk_pgbnr_allowed(Xoa_ttl ttl, Xowe_wiki wiki) { - return this.Enabled_in_ns(ttl.Ns().Id()) // chk if ns allows banner + boolean enabled_in_ns = ns_hash.Has(tmp_ns_key.Val_(ttl.Ns().Id())); + return enabled_in_ns // chk if ns allows banner && !Bry_.Eq(ttl.Page_db(), wiki.Props().Main_page()); // never show on main page } } diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java index 3e9e47564..0783dc55b 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java @@ -17,16 +17,16 @@ along with this program. If not, see . */ package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.btries.*; import gplx.langs.mustaches.*; -import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.langs.kwds.*; -import gplx.xowa.parsers.utils.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.parsers.utils.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*; +import gplx.xowa.files.*; import gplx.xowa.htmls.core.htmls.*; public class Pgbnr_func extends Pf_func_base { @Override public int Id() {return Xol_kwd_grp_.Id_pagebanner;} @Override public Pf_func New(int id, byte[] name) {return new Pgbnr_func().Name_(name);} @Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) { // {{PAGEBANNER}} appears on page; WikidataPageBanner.hooks.php|addCustomBanner - Xowe_wiki wiki = ctx.Wiki(); + Xowe_wiki wiki = ctx.Wiki(); Xoae_page page = ctx.Page(); Pgbnr_xtn_mgr xtn_mgr = wiki.Xtn_mgr().Xtn_pgbnr(); Pgbnr_cfg cfg = xtn_mgr.Cfg(); - Xoa_ttl ttl = ctx.Page().Ttl(); + Xoa_ttl ttl = page.Ttl(); if (!cfg.Chk_pgbnr_allowed(ttl, wiki)) return; byte[] tooltip = ttl.Page_txt(), title = ttl.Page_txt(), toc = Bry_.Empty, origin_x = Bry_.Empty; boolean bottomtoc = false;; @@ -34,10 +34,13 @@ public class Pgbnr_func extends Pf_func_base { List_adp icons_list = null; Bry_bfr tmp_bfr = Bry_bfr.new_(); int args_len = self.Args_len(); + Xop_func_arg_itm func_arg = new Xop_func_arg_itm(); for (int i = 0; i < args_len; ++i) { Arg_nde_tkn arg = self.Args_get_by_idx(i); - byte[] key = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Key_tkn()); - byte[] val = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Val_tkn()); + func_arg.Set(tmp_bfr, ctx, src, caller, self, arg); + byte[] key = func_arg.key; + byte[] val = func_arg.val; + if (key == Bry_.Empty) continue; // ignore blank args; EX:{{PAGEBANNER:A.png|\n|toc=yes}} int tid = arg_hash.Get_as_int_or(key, -1); if (tid == Arg__pgname) tooltip = title = val; @@ -47,9 +50,9 @@ public class Pgbnr_func extends Pf_func_base { bottomtoc = true; if (tid == Arg__toc && Bry_.Eq(val, Bry__yes)) // REF.MW:addToc toc = Bry_.Empty; // note that "" will be overwritten later by actual toc html - if ( tid == -1 // handle "icon-*"; + if ( tid == -1 // note that "icon-*" won't have a tid && Bry_.Has_at_bgn(key, Bry__icon) // if (substr($key, 0, 5) === 'icon-') - && Bry_.Len(Bry__icon) > 5 // if ( !isset( $iconname) ) + && Bry_.Len(key) > 5 // if ( !isset( $iconname) ) && Bry_.Len_gt_0(val) // if ( !isset( $$value ) ) ) { // REF.MW:addIcons tid = Arg__icon; @@ -57,16 +60,13 @@ public class Pgbnr_func extends Pf_func_base { byte[] icon_key = Bry_.Mid(key, 5); byte[] icon_name = Xop_sanitizer.Escape_cls(icon_key); byte[] icon_title = icon_name; - Xoa_ttl icon_url_ttl = wiki.Ttl_parse(val); -// TODO: get icon_url - byte[] icon_url_bry = Bry_.Empty; - if (icon_url_ttl == null) - icon_url_bry = Bry__url_dflt; // $iconUrl = Title::newFromText( $value ); if ( $iconUrl ) - else { - icon_url_bry = Bry_.Empty; // $iconUrl->getLocalUrl(); - icon_title = ttl.Page_txt(); + Xoa_ttl icon_ttl = wiki.Ttl_parse(val); + byte[] icon_href = Bry__icon_href_dflt; + if (icon_ttl != null) { + icon_href = Bry_.Add(gplx.xowa.htmls.hrefs.Xoh_href_.Bry__wiki, icon_ttl.Page_db()); + icon_title = icon_ttl.Page_txt(); } - icons_list.Add(new Pgbnr_icon(icon_name, icon_title, icon_url_bry)); + icons_list.Add(new Pgbnr_icon(tmp_bfr, icon_name, icon_title, icon_href)); } if (tid == Arg__origin) { // REF.MW:addFocus double tmp_data_pos_x = Double_.NaN, tmp_data_pos_y = Double_.NaN; @@ -85,86 +85,82 @@ public class Pgbnr_func extends Pf_func_base { } } } - if (tid == -1) Gfo_usr_dlg_.Instance.Warn_many("", "", "unknown arg type; page=~{0} key=~{1} val=~{2}", "page", ctx.Page().Url_bry_safe(), key, val); + if (tid == -1) Gfo_usr_dlg_.Instance.Warn_many("", "", "unknown arg type; page=~{0} key=~{1} val=~{2}", page.Url_bry_safe(), key, val); } - byte[] name = Eval_argx(ctx, src, caller, self); - // Xoa_ttl file_ttl = wiki.Ttl_parse(name); SKIP?: MW creates title to auto-register page and image in imagelinks + + byte[] banner_name = Eval_argx(ctx, src, caller, self); + Xoa_ttl banner_ttl = wiki.Ttl_parse(banner_name); // NOTE: MW also creates title to auto-register page and image in imagelinks + Xof_file_itm banner_file_itm = File__make_tkn(ctx, Xop_file_logger_.Tid__pgbnr_main, banner_ttl, Xop_lnki_tkn.Width_null, Xop_lnki_tkn.Height_null); + Pgbnr_itm itm = new Pgbnr_itm(); - ctx.Page().Html_data().Xtn__pgbnr_(itm); - itm.Init_from_wtxt(name, tooltip, title, bottomtoc, toc, data_pos_x, data_pos_y, origin_x, icons_list == null ? Pgbnr_icon.Ary_empty : (Pgbnr_icon[])icons_list.To_ary_and_clear(Pgbnr_icon.class)); + itm.Init_from_wtxt(banner_ttl, banner_file_itm, tooltip, title, bottomtoc, toc, data_pos_x, data_pos_y, origin_x, icons_list == null ? Pgbnr_icon.Ary_empty : (Pgbnr_icon[])icons_list.To_ary_and_clear(Pgbnr_icon.class)); + page.Html_data().Xtn_pgbnr_(itm); + page.Html_data().Head_mgr().Itm__pgbnr().Enabled_y_(); // register css / js during parse stage } - public static void Add_banner(Bry_bfr bfr, Xop_ctx ctx) { - Xowe_wiki wiki = ctx.Wiki(); - Pgbnr_cfg cfg = wiki.Xtn_mgr().Xtn_pgbnr().Cfg(); - Xoa_ttl ttl = ctx.Page().Ttl(); - Pgbnr_itm itm = ctx.Page().Html_data().Xtn__pgbnr(); - byte[] banner_name = null, banner_html = null; - if (itm != null) { // {{PAGEBANNER}} exists in wikitext - banner_name = itm.name; - banner_html = Get_banner_html(wiki, cfg, banner_name, itm); - if (banner_html == null) { // no banner; try again using title from wikidata; - banner_name = Get_wikidata_banner(ttl); - banner_html = Get_banner_html(wiki, cfg, banner_name, itm); - } - if (banner_html != null) { // only add banner and styling if valid banner generated - if (itm.toc != null) { - // $out->addModuleStyles( 'ext.WikidataPageBanner.toc.styles' ); - } - bfr.Add(banner_html); + public static void Add_banner(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src) { + Xowe_wiki wiki = ctx.Wiki(); Xoae_app app = wiki.Appe(); + Pgbnr_cfg cfg = wiki.Xtn_mgr().Xtn_pgbnr().Cfg(); if (!cfg.enabled) return; + Xoae_page page = ctx.Page(); Xoa_ttl ttl = page.Ttl(); + Pgbnr_itm itm = page.Html_data().Xtn_pgbnr(); + Xoa_ttl banner_ttl = null; byte[] banner_html = null; + if (itm != null) { // {{PAGEBANNER}} exists in wikitext + banner_ttl = itm.banner_ttl; + banner_html = Get_banner_html(wiki, ctx, src, cfg, banner_ttl, itm); + if (banner_html == null) { // no banner; try again using title from wikidata; note that this should only happen if no banner_ttl or banner_ttl is invalid; EX:{{PAGEBANNER:|toc=yes}} + banner_ttl = Get_wikidata_banner(app, wiki, cfg, ttl); + banner_html = Get_banner_html(wiki, ctx, src, cfg, banner_ttl, itm); } } - else if ( ttl.Ns().Id_is_main() // if the page uses no 'PAGEBANNER' invocation and if article page, insert default banner - && cfg.Get__wpb_enable_default_banner() + else if ( ttl.Ns().Id_is_main() // {{PAGEBANNER}} missing, but wiki is marked as enable_default_banner + && cfg.enable_default_banner + && cfg.Chk_pgbnr_allowed(ttl, wiki) ) { - if (cfg.Chk_pgbnr_allowed(ttl, wiki)) { - banner_name = Get_wikidata_banner(ttl); - if (banner_name == null) { - banner_name = cfg.Get__wpb_image(); - } - itm = new Pgbnr_itm(); - itm.name = banner_name; - banner_html = Get_banner_html(wiki, cfg, banner_name, itm); - if (banner_html != null) { // NOTE: same as above - bfr.Add(banner_html); - } - } + banner_ttl = Get_wikidata_banner(app, wiki, cfg, ttl); + if (banner_ttl == null) + banner_ttl = wiki.Ttl_parse(cfg.dflt_img_title); + Xof_file_itm banner_file_itm = File__make_tkn(ctx, Xop_file_logger_.Tid__pgbnr_main, banner_ttl, Xop_lnki_tkn.Width_null, Xop_lnki_tkn.Height_null); + itm = new Pgbnr_itm(); + itm.Init_from_wtxt(banner_ttl, banner_file_itm, Bry_.Empty, Bry_.Empty, false, Bry_.Empty, 0, 0, Bry_.Empty, Pgbnr_icon.Ary_empty); + banner_html = Get_banner_html(wiki, ctx, src, cfg, banner_ttl, itm); } + if (banner_html != null) + bfr.Add(banner_html); } - public static byte[] Get_banner_html(Xowe_wiki wiki, Pgbnr_cfg cfg, byte[] banner_name, Pgbnr_itm itm) { - byte[][] urls = Get_standard_size_urls(wiki, cfg, banner_name); - if (urls == null) return null; + public static byte[] Get_banner_html(Xowe_wiki wiki, Xop_ctx ctx, byte[] src, Pgbnr_cfg cfg, Xoa_ttl banner_ttl, Pgbnr_itm itm) { + byte[][] urls = Get_standard_size_urls(wiki, cfg, banner_ttl); if (urls == null) return null; Bry_bfr tmp_bfr = Bry_bfr.new_(); int urls_len = urls.length; - int[] sizes = cfg.Get__wpb_standard_sizes(); + int[] sizes = cfg.standard_sizes; for (int i = 0; i < urls_len; ++i) { int size = sizes[i]; if (i != 0) tmp_bfr.Add_byte_comma(); - tmp_bfr.Add(urls[i]).Add_byte_space().Add_int_variable(size).Add_byte(Byte_ascii.Ltr_w); // $srcset[] = "$url {$size}w"; + tmp_bfr.Add(urls[i]).Add_byte_space().Add_int_variable(size).Add_byte(Byte_ascii.Ltr_w); // REF.MW: $srcset[] = "$url {$size}w"; } byte[] srcset = tmp_bfr.To_bry_and_clear(); - byte[] banner_url = urls.length == 0 ? Bry_.Empty : urls[urls_len - 1]; // gets largest url - // Xoa_ttl banner_file = wiki.Ttl_parse(tmp_bfr.Add(wiki.Ns_mgr().Ns_file().Name_db_w_colon()).Add(banner_name).To_bry_and_clear()); - int maxWidth = 1; // $file = wfFindFile( banner_file ); $options['maxWidth'] = $file->getWidth(); + byte[] banner_url = itm.banner_img_src != null ? itm.banner_img_src : urls.length == 0 ? Bry_.Empty : urls[urls_len - 1]; // gets largest url + int max_width = itm.banner_file_itm.Orig_w(); // $file = wfFindFile( banner_file ); $options['max_width'] = $file->getWidth(); byte[] banner_file = null; // $bannerfile->getLocalUrl(); - itm.Init_from_html(maxWidth, banner_file, banner_url, srcset, cfg.Get__wpb_enable_heading_override()); + + wiki.Html_mgr().Toc_mgr().Html(ctx.Page(), gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Basic, src, tmp_bfr, false); + byte[] toc_html = tmp_bfr.To_bry_and_clear(); + itm.Init_from_html(max_width, banner_file, banner_url, srcset, cfg.enable_heading_override, toc_html); Mustache_render_ctx mctx = new Mustache_render_ctx().Init(itm); wiki.Xtn_mgr().Xtn_pgbnr().Template_root().Render(tmp_bfr, mctx); return tmp_bfr.To_bry_and_clear(); } - private static byte[][] Get_standard_size_urls(Xow_wiki wiki, Pgbnr_cfg cfg, byte[] file_name) { + private static byte[][] Get_standard_size_urls(Xow_wiki wiki, Pgbnr_cfg cfg, Xoa_ttl banner_ttl) { Ordered_hash hash = Ordered_hash_.New_bry(); - int[] sizes = cfg.Get__wpb_standard_sizes(); + int[] sizes = cfg.standard_sizes; int sizes_len = sizes.length; for (int i = 0; i < sizes_len; ++i) { - byte[] url = Get_image_url(wiki, file_name, sizes[i]); + byte[] url = Get_image_url(wiki, banner_ttl, sizes[i]); if (url != null) hash.Add_if_dupe_use_1st(url, url); } return (byte[][])hash.To_ary_and_clear(byte[].class); } - private static byte[] Get_image_url(Xow_wiki wiki, byte[] file_name, int width) { - // Xoa_ttl file_ttl = wiki.Ttl_parse(file_name); + private static byte[] Get_image_url(Xow_wiki wiki, Xoa_ttl banner_ttl, int width) { // Object file = new Object(); // $file = wfFindFile( file_ttl ); // if (file == null) return null; if (width >= 0 && width <= 3000) { @@ -175,10 +171,19 @@ public class Pgbnr_func extends Pf_func_base { else return new byte[0]; // $file->getFullUrl(); } - private static byte[] Get_wikidata_banner(Xoa_ttl ttl) { - return null; + private static Xoa_ttl Get_wikidata_banner(Xoae_app app, Xow_wiki wiki, Pgbnr_cfg cfg, Xoa_ttl ttl) { + byte[] rv = app.Wiki_mgr().Wdata_mgr().Get_claim_or(wiki.Domain_itm(), ttl, cfg.dflt_img_wdata_prop, null); // don't log misses; wikivoyage pages will default to show pagebanner, and many pages may not have wikidata definitions + if (rv == null) return null; + return wiki.Ttl_parse(rv); + } + private static Xof_file_itm File__make_tkn(Xop_ctx ctx, byte tid, Xoa_ttl file_ttl, int file_w, int file_h) { + Xop_lnki_tkn lnki = ctx.Tkn_mkr().Lnki(file_w, file_h).Ttl_(file_ttl); + ctx.Page().Lnki_list().Add(lnki); + ctx.Lnki().File_logger().Log_file(ctx, lnki, tid); // NOTE: do not set file_wkr ref early (as member var); parse_all sets late + Xof_file_itm file_itm = ctx.Wiki().Html_mgr().Html_wtr().Lnki_wtr().File_wtr().Lnki_eval(Xof_exec_tid.Tid_wiki_page, ctx, ctx.Page(), lnki); + return file_itm; } - private static final byte[] Bry__yes = Bry_.new_a7("yes"), Bry__icon = Bry_.new_a7("icon-"), Bry__url_dflt = Bry_.new_a7("#"), Bry__origin_x__left = Bry_.new_a7("wpb-left"), Bry__origin_x__right = Bry_.new_a7("wpb-right"); + private static final byte[] Bry__yes = Bry_.new_a7("yes"), Bry__icon = Bry_.new_a7("icon-"), Bry__icon_href_dflt = Bry_.new_a7("#"), Bry__origin_x__left = Bry_.new_a7("wpb-left"), Bry__origin_x__right = Bry_.new_a7("wpb-right"); private static final int Arg__pgname = 0, Arg__tooltip = 1, Arg__bottomtoc = 2, Arg__toc = 3, Arg__icon = 4, Arg__origin = 5; private static final Hash_adp_bry arg_hash = Hash_adp_bry.cs().Add_str_int("pgname", Arg__pgname) .Add_str_int("tooltip", Arg__tooltip).Add_str_int("bottomtoc", Arg__bottomtoc).Add_str_int("toc", Arg__toc).Add_str_int("origin", Arg__origin); diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java index 62e65f606..24b732955 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java @@ -18,24 +18,32 @@ along with this program. If not, see . package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import org.junit.*; import gplx.core.brys.*; import gplx.xowa.wikis.pages.skins.*; public class Pgbnr_func_tst { -// private final Pgbnr_func_fxt fxt = new Pgbnr_func_fxt(); + private final Pgbnr_func_fxt fxt = new Pgbnr_func_fxt(); @Test public void Basic() { -// fxt.Test__parse__eq("{{PAGEBANNER:A.png}}", String_.Concat_lines_nl_apos_skip_last -// ( "
    " -// , "
    " -// , "

    Test page

    " -// , " " -// , "
    " -// , "
    " -// , "
    " -// )); + fxt.Test__parse__eq("{{PAGEBANNER:A.png|icon-star=Star_article}}", String_.Concat_lines_nl_apos_skip_last + ( "
    " + , "
    " + , "

    Test page

    " + , " " + , "
    " + , " " + , "
    " + , "
    " + , "
    " + , "
    " + )); } } class Pgbnr_func_fxt { - private final Xop_fxt fxt = new Xop_fxt(); + private final Xop_fxt fxt; + public Pgbnr_func_fxt() { + Xoae_app app = Xoa_app_fxt.app_(); + Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "en.wikivoyage.org"); + fxt = new Xop_fxt(app, wiki); + } public void Test__parse__eq(String raw, String expd) { - fxt.Exec_parse_page_all_as_str("{{PAGEBANNER:A.png}}"); - Bfr_arg arg = fxt.Wiki().Xtn_mgr().Xtn_pgbnr().Write_html(fxt.Ctx(), fxt.Page()); + fxt.Exec_parse_page_all_as_str(raw); + Bfr_arg arg = fxt.Wiki().Xtn_mgr().Xtn_pgbnr().Write_html(fxt.Ctx(), fxt.Page(), null, null); Bry_bfr bfr = Bry_bfr.new_(); arg.Bfr_arg__add(bfr); Tfds.Eq_str_lines(expd, bfr.To_str_and_clear()); diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java index b381e66f9..323326440 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java @@ -16,19 +16,26 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.core.brys.fmtrs.*; import gplx.langs.mustaches.*; public class Pgbnr_icon implements Mustache_doc_itm { - public byte[] name; - public byte[] title; - public byte[] url; - public Pgbnr_icon(byte[] name, byte[] title, byte[] url) {this.name = name; this.title = title; this.url = url;} + private final byte[] name, title, href, html; + public Pgbnr_icon(Bry_bfr tmp_bfr, byte[] name, byte[] title, byte[] href) { + this.name = name; this.title = title; this.href = href; + fmt.Bld_bfr_many(tmp_bfr, name, title); + this.html = tmp_bfr.To_bry_and_clear(); + } public byte[] Get_prop(String key) { if (String_.Eq(key, "name")) return name; else if (String_.Eq(key, "title")) return title; - else if (String_.Eq(key, "url")) return url; - else if (String_.Eq(key, "html")) return Mustache_doc_itm_.Null_val; + else if (String_.Eq(key, "url")) return href; + else if (String_.Eq(key, "html")) return html; return Mustache_doc_itm_.Null_val; } public Mustache_doc_itm[] Get_subs(String key) {return Mustache_doc_itm_.Ary__empty;} public static final Pgbnr_icon[] Ary_empty = new Pgbnr_icon[0]; + public static final Bry_fmt fmt = Bry_fmt.New + ( Bry_.New_u8_nl_apos("") + , "name", "title" + ); } diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java index 68191157b..47d9f52ba 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java @@ -16,32 +16,41 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.langs.mustaches.*; +import gplx.langs.mustaches.*; import gplx.xowa.parsers.lnkis.*; +import gplx.xowa.files.*; public class Pgbnr_itm implements Mustache_doc_itm { - public byte[] name, toc; - private byte[] tooltip, title, originx, bannerfile, banner, srcset; + public Xoa_ttl banner_ttl; + public byte[] banner_img_src; + private int html_uid; + public byte[] toc; + public Xof_file_itm banner_file_itm; + private byte[] banner_anch_title, banner_hdr_text, originx, banner_anch_href, srcset; private double data_pos_x, data_pos_y; private int maxWidth; private boolean bottomtoc, isHeadingOverrideEnabled; private Pgbnr_icon[] icons; - public void Init_from_wtxt(byte[] name, byte[] tooltip, byte[] title, boolean bottomtoc, byte[] toc, double data_pos_x, double data_pos_y, byte[] originx, Pgbnr_icon[] icons) { - this.name = name; - this.tooltip = tooltip; this.title = title; this.bottomtoc = bottomtoc; this.toc = toc; this.icons = icons; + public void Init_from_wtxt(Xoa_ttl banner_ttl, Xof_file_itm banner_file_itm, byte[] banner_anch_title, byte[] banner_hdr_text, boolean bottomtoc, byte[] toc, double data_pos_x, double data_pos_y, byte[] originx, Pgbnr_icon[] icons) { + this.banner_ttl = banner_ttl; this.banner_file_itm = banner_file_itm; + this.banner_anch_title = banner_anch_title; this.banner_hdr_text = banner_hdr_text; this.bottomtoc = bottomtoc; this.toc = toc; this.icons = icons; this.data_pos_x = data_pos_x; this.data_pos_y = data_pos_y; this.originx = originx; + this.html_uid = banner_file_itm.Html_uid(); + this.banner_img_src = banner_file_itm.Html_view_url().To_http_file_bry(); } - public void Init_from_html(int maxWidth, byte[] bannerfile, byte[] banner, byte[] srcset, boolean isHeadingOverrideEnabled) { + public void Init_from_html(int maxWidth, byte[] banner_anch_href, byte[] banner_img_src, byte[] srcset, boolean isHeadingOverrideEnabled, byte[] toc) { this.maxWidth = maxWidth; - this.bannerfile = bannerfile; - this.banner = banner; + this.banner_anch_href = banner_anch_href; + this.banner_img_src = banner_img_src; this.srcset = srcset; this.isHeadingOverrideEnabled = isHeadingOverrideEnabled; + this.toc = toc; } public byte[] Get_prop(String key) { - if (String_.Eq(key, "title")) return title; - else if (String_.Eq(key, "tooltip")) return tooltip; - else if (String_.Eq(key, "bannerfile")) return bannerfile; - else if (String_.Eq(key, "banner")) return banner; - else if (String_.Eq(key, "srcset")) return srcset; + if (String_.Eq(key, "title")) return banner_hdr_text; + else if (String_.Eq(key, "tooltip")) return banner_anch_title; + else if (String_.Eq(key, "bannerfile")) return banner_anch_href; + else if (String_.Eq(key, "banner")) return banner_img_src; + else if (String_.Eq(key, "html_uid")) return Bry_.new_u8(gplx.xowa.htmls.Xoh_img_mgr.Str__html_uid + Int_.To_str(html_uid)); + else if (String_.Eq(key, "srcset")) return srcset == null ? Bry_.Empty : Bry_.Empty; else if (String_.Eq(key, "originx")) return originx; else if (String_.Eq(key, "data-pos-x")) return Bry_.new_a7(Double_.To_str(data_pos_x)); else if (String_.Eq(key, "data-pos-y")) return Bry_.new_a7(Double_.To_str(data_pos_y)); diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java index 9889126d0..9ba4f83b9 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java @@ -17,33 +17,77 @@ along with this program. If not, see . */ package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.brys.*; import gplx.langs.mustaches.*; import gplx.xowa.parsers.*; +import gplx.xowa.langs.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.nss.*; +import gplx.xowa.htmls.core.htmls.*; public class Pgbnr_xtn_mgr extends Xox_mgr_base implements Bfr_arg { @Override public byte[] Xtn_key() {return Xtn_key_static;} public static final byte[] Xtn_key_static = Bry_.new_a7("pagebanner"); @Override public Xox_mgr Clone_new() {return new Pgbnr_xtn_mgr();} - public Pgbnr_cfg Cfg() {return cfg;} private final Pgbnr_cfg cfg = new Pgbnr_cfg(); - public Mustache_tkn_itm Template_root() { - if (template_root == null) { - Mustache_tkn_parser parser = new Mustache_tkn_parser(); - template_root = parser.Parse(Template_dflt, 0, Template_dflt.length); + public Pgbnr_cfg Cfg() {return cfg;} private Pgbnr_cfg cfg; + public Mustache_tkn_itm Template_root() {return template_root;} private Mustache_tkn_itm template_root; + @Override public void Xtn_init_by_app(Xoae_app app) {} + @Override public void Xtn_init_by_wiki(Xowe_wiki wiki) { + // load config; TODO: load by file + boolean enabled = false, enable_heading_override = true, enable_default_banner = false; + int[] ns_ary = Int_.Ary(Xow_ns_.Tid__main, Xow_ns_.Tid__user); + int[] standard_sizes = new int[] {640, 1280, 2560}; + int dflt_img_wdata_prop = 948; byte[] dflt_img_title = Bry_.new_a7("Pagebanner_default.jpg"); // www.wikidata.org/wiki/Property:P948 + switch (wiki.Domain_tid()) { + case Xow_domain_tid_.Int__home: + enabled = true; + ns_ary = Int_.Ary(Xow_ns_.Tid__help); + break; + case Xow_domain_tid_.Int__wikivoyage: + switch (wiki.Lang().Lang_id()) { + case Xol_lang_stub_.Id_en: + case Xol_lang_stub_.Id_fr: + case Xol_lang_stub_.Id_zh: + enabled = true; + break; + case Xol_lang_stub_.Id_ru: + ns_ary = Int_.Ary(0, 1, 10, 11, 12, 13, 14, 15, 2, 2300, 2301, 2302, 2303, 2600, 3, 4, 5, 6, 7, 8, 828, 829, 9); + enabled = true; + break; + case Xol_lang_stub_.Id_uk: + ns_ary = Int_.Ary(Xow_ns_.Tid__main, Xow_ns_.Tid__user, Xow_ns_.Tid__project); + enabled = true; + break; + } + break; + case Xow_domain_tid_.Int__wikipedia: + switch (wiki.Lang().Lang_id()) { + case Xol_lang_stub_.Id_ca: + // enabled = enable_default_banner = true; + ns_ary = Int_.Ary(102, Xow_ns_.Tid__user); + break; + case Xol_lang_stub_.Id_en: + // enabled = enable_default_banner = true; + enable_heading_override = false; + break; + } + break; } - return template_root; - } private Mustache_tkn_itm template_root; - @Override public void Xtn_init_by_app(Xoae_app app) { + cfg = new Pgbnr_cfg(enabled, enable_heading_override, enable_default_banner, ns_ary, dflt_img_wdata_prop, dflt_img_title, standard_sizes); + + if (!enabled) return; + // load template file; + byte[] template_data = Io_mgr.Instance.LoadFilBryOr(wiki.Appe().Fsys_mgr().Bin_any_dir().GenSubDir_nest("xowa", "xtns", "WikidataPageBanner", "templates", "banner.mustache"), Template_dflt); + Mustache_tkn_parser parser = new Mustache_tkn_parser(); + template_root = parser.Parse(template_data, 0, template_data.length); } - public Bfr_arg Write_html(Xop_ctx pctx, Xoae_page page) { - this.pctx = pctx; this.page = page; + public Bfr_arg Write_html(Xop_ctx pctx, Xoae_page page, Xoh_wtr_ctx hctx, byte[] src) { + this.pctx = pctx; this.page = page; this.hctx = hctx; this.src = src; return this; - } private Xop_ctx pctx; private Xoae_page page; + } private Xop_ctx pctx; private Xoae_page page; private Xoh_wtr_ctx hctx; private byte[] src; public void Bfr_arg__add(Bry_bfr bfr) { - Pgbnr_itm itm = page.Html_data().Xtn__pgbnr(); + Pgbnr_itm itm = page.Html_data().Xtn_pgbnr(); if (itm == null) return; - Pgbnr_func.Add_banner(bfr, pctx); + Pgbnr_func.Add_banner(bfr, pctx, hctx, src); } private static final byte[] Template_dflt = Bry_.New_u8_nl_apos ( "
    " , "
    " , " {{#isHeadingOverrideEnabled}}

    {{title}}

    {{/isHeadingOverrideEnabled}}" - , " " + , " " , " {{#hasIcons}}" , "
    " , " {{#icons}}" diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java index 4f2f99037..617512f99 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java @@ -25,12 +25,15 @@ public class Pf_func_ { public static final byte Name_dlm = Byte_ascii.Colon; public static byte[] Eval_arg_or(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, int self_args_len, int i, byte[] or) { if (i >= self_args_len) return or; - Bry_bfr bfr = Bry_bfr.new_(); Arg_nde_tkn nde = self.Args_get_by_idx(i); + Bry_bfr bfr = Bry_bfr.new_(); + Eval_arg_or(bfr, ctx, src, caller, self, nde, or); + return bfr.To_bry_and_clear_and_trim(); + } + public static void Eval_arg_or(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Arg_nde_tkn nde, byte[] or) { nde.Key_tkn().Tmpl_evaluate(ctx, src, caller, bfr); // NOTE: must add key b/c parser functions do not have keys and some usages pass in xml_tkns; EX: {{#if|= self_args_len) return or; @@ -39,10 +42,6 @@ public class Pf_func_ { nde.Val_tkn().Tmpl_evaluate(ctx, src, caller, bfr); return bfr.To_bry_and_clear_and_trim(); } - public static byte[] Eval_tkn(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xot_invk caller, Xop_tkn_itm tkn) { - tkn.Tmpl_evaluate(ctx, src, caller, bfr); - return bfr.To_bry_and_clear(); - } private static final Number_parser lhs_parser = new Number_parser().Hex_enabled_(true), rhs_parser = new Number_parser().Hex_enabled_(true); public static boolean Eq_(byte[] lhs, byte[] rhs) { // PATCH.PHP: php allows "003" == "3.0"; ASSUME: numbers are either int or int-like decimal; long, float, decimal not supported int lhs_len = lhs.length, rhs_len = rhs.length; diff --git a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java index 0f66e3923..0f71859ee 100644 --- a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java @@ -22,6 +22,7 @@ import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.xtns.lst.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*; +import gplx.xowa.parsers.lnkis.files.*; public class Pp_pages_nde implements Xox_xnde, Mwh_atr_itm_owner { private boolean xtn_literal = false; private Xop_root_tkn xtn_root; @@ -363,8 +364,8 @@ public class Pp_pages_nde implements Xox_xnde, Mwh_atr_itm_owner { } private Xop_root_tkn Bld_root_nde(Bry_bfr page_bfr, Hash_adp_bry lst_page_regy, byte[] wikitext) { Xop_ctx tmp_ctx = Xop_ctx.new_sub_page_(wiki, ctx, lst_page_regy); - tmp_ctx.Page().Ttl_(ctx.Page().Ttl()); // NOTE: must set tmp_ctx.Ttl to ctx.Ttl; EX: Flatland and First World; DATE:2013-04-29 - tmp_ctx.Lnki().File_wkr_(null); // NOTE: set file_wkr to null, else items will be double-counted + tmp_ctx.Page().Ttl_(ctx.Page().Ttl()); // NOTE: must set tmp_ctx.Ttl to ctx.Ttl; EX: Flatland and First World; DATE:2013-04-29 + tmp_ctx.Lnki().File_logger_(Xop_file_logger_.Noop); // NOTE: set file_wkr to null, else items will be double-counted tmp_ctx.Parse_tid_(Xop_parser_.Parse_tid_tmpl); Xop_parser tmp_parser = Xop_parser.new_(wiki, wiki.Parser_mgr().Main().Tmpl_lxr_mgr(), wiki.Parser_mgr().Main().Wtxt_lxr_mgr()); Xop_root_tkn rv = tmp_ctx.Tkn_mkr().Root(wikitext); 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 c3f172a87..d46b52b42 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 @@ -142,6 +142,15 @@ public class Wdata_wiki_mgr implements GfoEvObj, GfoInvkAble { } return qids[qid_idx]; } + public byte[] Get_claim_or(Xow_domain_itm domain, Xoa_ttl page_ttl, int pid, byte[] or) { + byte[] qid = this.Qids_get(domain.Abrv_wm(), page_ttl); if (qid == null) return or; + Wdata_doc wdoc = this.Pages_get(qid); if (wdoc == null) return or; + Wdata_claim_grp claim_grp = wdoc.Claim_list_get(pid); if (claim_grp == null || claim_grp.Len() == 0) return or; + Wdata_claim_itm_core claim_itm = claim_grp.Get_at(0); + prop_val_visitor.Init(tmp_bfr, hwtr_mgr.Msgs(), domain.Lang_orig_key()); + claim_itm.Welcome(prop_val_visitor); + return tmp_bfr.To_bry_and_clear(); + } private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); public void Resolve_to_bfr(Bry_bfr bfr, Wdata_claim_grp prop_grp, byte[] lang_key) { Hwtr_mgr_assert(); int len = prop_grp.Len(); diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa index 4d02f463a..880196eaa 100644 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa differ