mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
v3.1.5.1
This commit is contained in:
parent
52c36aa4f8
commit
6d179ca59d
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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;}
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 = "";
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
|
@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
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;
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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 <attach_db>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 <attach_db>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 <attach_db>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 <attach_db>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 <attach_db>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 <attach_db>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();
|
||||
|
@ -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"
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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/");
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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
|
||||
|
@ -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)) {
|
||||
|
@ -23,7 +23,7 @@ public class Xoh_img_bare_hzip__tst {
|
||||
@Test public void Hiero() {
|
||||
fxt.Test__bicode
|
||||
( "~(!<img style=\"margin: 1px; height: 11px;\" src=\"~X1.png\" title=\"X1 [t]\" alt=\"t\">~"
|
||||
, "<img style='margin: 1px; height: 11px;' src='file:///mem/xowa/bin/any/xowa/xtns/Wikihiero/img/hiero_X1.png' title='X1 [t]' alt='t'>"
|
||||
, "<img style='margin: 1px; height: 11px;' src='file:///android_asset/xowa/bin/any/xowa/xtns/Wikihiero/img/hiero_X1.png' title='X1 [t]' alt='t'>"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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());
|
||||
|
@ -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()));
|
||||
|
@ -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")
|
||||
|
37
400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm__pgbnr.java
Normal file
37
400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_itm__pgbnr.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
||||
}
|
@ -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;
|
||||
|
@ -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(" <ul>\n")
|
||||
, Bry_list_end = Bry_.new_a7(" </ul>\n")
|
||||
, Bry_item_end = Bry_.new_a7(" </li>\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
|
||||
( "<div id=\"toc\" class=\"toc\">"
|
||||
( "<div~{toc}>"
|
||||
, " <div id=\"toctitle\">"
|
||||
, " <h2>~{contents_title}</h2>"
|
||||
, " </div>"
|
||||
, "~{toc_list}</div>"
|
||||
, ""
|
||||
)
|
||||
, "contents_title", "toc_list"
|
||||
, "toc", "contents_title", "toc_list"
|
||||
)
|
||||
, bfmtr_line = Bry_fmtr.new_
|
||||
( " <li class=\"toclevel-~{level} tocsection-~{toc_idx}\"><a href=\"#~{anchor}\"><span class=\"tocnumber\">~{heading}</span> <span class=\"toctext\">~{text}</span></a>\n"
|
||||
|
@ -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) {
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
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
|
||||
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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) {}
|
||||
}
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
||||
}
|
50
400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.java
Normal file
50
400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
|
33
400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java
Normal file
33
400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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("<h1 id='firstHeading' class='firstHeading'><span>~{page_title}</span></h1>"), "page_title");
|
||||
}
|
@ -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;
|
||||
|
@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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: <imagemap>File:A.png|thumb|{{Test_template}}\n</imagemap>; 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;
|
||||
}
|
||||
|
@ -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());
|
||||
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;
|
||||
|
@ -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"
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -16,16 +16,25 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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
|
||||
}
|
||||
}
|
||||
|
@ -17,16 +17,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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 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 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__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);
|
||||
|
@ -18,24 +18,32 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
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
|
||||
// ( "<div class='ext-wpb-pagebanner noprint pre-content'>"
|
||||
// , " <div class='wpb-topbanner'>"
|
||||
// , " <h1 class='wpb-name'>Test page</h1>"
|
||||
// , " <a class='image' title='Test page' href=''><img src='' srcset=' 640w' class='wpb-banner-image ' data-pos-x='0' data-pos-y='0' style='max-width:1px'></a>"
|
||||
// , " </div>"
|
||||
// , " <div class='wpb-topbanner-toc '><div class='wpb-banner-toc'></div></div>"
|
||||
// , "</div>"
|
||||
// ));
|
||||
fxt.Test__parse__eq("{{PAGEBANNER:A.png|icon-star=Star_article}}", String_.Concat_lines_nl_apos_skip_last
|
||||
( "<div class='ext-wpb-pagebanner noprint pre-content'>"
|
||||
, " <div class='wpb-topbanner'>"
|
||||
, " <h1 class='wpb-name'>Test page</h1>"
|
||||
, " <a class='image' title='Test page' href=''><img id='xoimg_0' src='file:///mem/wiki/repo/trg/orig/7/0/A.png' srcset='' class='wpb-banner-image ' data-pos-x='0' data-pos-y='0' style='max-width:0px'></a>"
|
||||
, " <div class='wpb-iconbox'>"
|
||||
, " <a href='/wiki/Star_article'><span aria-disabled='false' title='Star article' class='oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement-icon oo-ui-icon-star oo-ui-iconElement oo-ui-iconWidget'></span></a>"
|
||||
, " </div>"
|
||||
, " </div>"
|
||||
, " <div class='wpb-topbanner-toc '><div class='wpb-banner-toc'></div></div>"
|
||||
, "</div>"
|
||||
));
|
||||
}
|
||||
}
|
||||
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());
|
||||
|
@ -16,19 +16,26 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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("<span aria-disabled='false' title='~{title}' class='oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement-icon oo-ui-icon-~{name} oo-ui-iconElement oo-ui-iconWidget'></span>")
|
||||
, "name", "title"
|
||||
);
|
||||
}
|
||||
|
@ -16,32 +16,41 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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));
|
||||
|
@ -17,33 +17,77 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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
|
||||
( "<div class='ext-wpb-pagebanner noprint pre-content'>"
|
||||
, " <div class='wpb-topbanner'>"
|
||||
, " {{#isHeadingOverrideEnabled}}<h1 class='wpb-name'>{{title}}</h1>{{/isHeadingOverrideEnabled}}"
|
||||
, " <a class='image' title='{{tooltip}}' href='{{bannerfile}}'><img src='{{banner}}' srcset='{{srcset}}' class='wpb-banner-image {{originx}}' data-pos-x='{{data-pos-x}}' data-pos-y='{{data-pos-y}}' style='max-width:{{maxWidth}}px'></a>"
|
||||
, " <a class='image' title='{{tooltip}}' href='{{bannerfile}}'><img id='{{html_uid}}' src='{{banner}}' srcset='{{srcset}}' class='wpb-banner-image {{originx}}' data-pos-x='{{data-pos-x}}' data-pos-y='{{data-pos-y}}' style='max-width:{{maxWidth}}px'></a>"
|
||||
, " {{#hasIcons}}"
|
||||
, " <div class='wpb-iconbox'>"
|
||||
, " {{#icons}}"
|
||||
|
@ -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|<a href='{{{1}}}'|}}; "<a href" should not be interpreted as key
|
||||
if (nde.KeyTkn_exists()) bfr.Add_byte(Byte_ascii.Eq);
|
||||
nde.Val_tkn().Tmpl_evaluate(ctx, src, caller, bfr);
|
||||
return bfr.To_bry_and_clear_and_trim();
|
||||
}
|
||||
public static byte[] Eval_val_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;
|
||||
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user