1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

'v3.7.2.1'

This commit is contained in:
gnosygnu
2016-07-10 23:35:32 -04:00
parent f5f48bb9b1
commit b333db45f8
366 changed files with 4468 additions and 3460 deletions

View File

@@ -42,7 +42,7 @@ class Dpl_itm {
public byte Stable_pages() {return stable_pages;} private byte stable_pages;
private Xop_ctx sub_ctx; private Xop_tkn_mkr sub_tkn_mkr; private Xop_root_tkn sub_root;
public void Parse(Xowe_wiki wiki, Xop_ctx ctx, byte[] page_ttl, byte[] src, Xop_xnde_tkn xnde) { // parse kvps in xnde; EX:<dpl>category=abc\nredirects=y\n</dpl>
sub_ctx = Xop_ctx.new_sub_(wiki);
sub_ctx = Xop_ctx.new_sub_(ctx);
sub_tkn_mkr = sub_ctx.Tkn_mkr();
sub_root = sub_tkn_mkr.Root(Bry_.Empty);
int content_bgn = xnde.Tag_open_end(), content_end = xnde.Tag_close_bgn();

View File

@@ -52,7 +52,7 @@ public class Dpl_xnde implements Xox_xnde {
bfr.Add(html_mode.Grp_bgn()).Add_byte_nl();
for (int i = itms_bgn; i < itms_len; i++) {
Xowd_page_itm page = (Xowd_page_itm)pages.Get_at(i);
Xoa_ttl ttl = Xoa_ttl.parse(wiki, page.Ns_id(), page.Ttl_page_db());
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, page.Ns_id(), page.Ttl_page_db());
byte[] ttl_page_txt = show_ns ? ttl.Full_txt_w_ttl_case() : ttl.Page_txt();
if (ttl_page_txt == null) continue; // NOTE: apparently DynamicPageList allows null pages; DATE:2013-07-22
switch (html_mode.Tid()) {

View File

@@ -271,9 +271,9 @@ class Dpl_xnde_fxt {
Dpl_page_mok page = pages[i];
int id = page.Id();
String ttl = page.Ttl();
Xoa_ttl page_ttl = Xoa_ttl.parse(fxt.Wiki(), Bry_.new_u8(ttl));
Xoa_ttl page_ttl = Xoa_ttl.Parse(fxt.Wiki(), Bry_.new_u8(ttl));
Xoae_page page_obj = fxt.Wiki().Data_mgr().Load_page_by_ttl(page_ttl);
if (page_obj.Missing()) {
if (page_obj.Db().Page().Exists_n()) {
fxt.Init_page_create(ttl);
fxt.Init_id_create (id, 0, 0, false, 5, Xow_ns_.Tid__main, ttl);
}

View File

@@ -61,21 +61,4 @@ public class Gallery_itm implements Js_img_wkr {
bfr.Mkr_rls(); tmp_bfr.Mkr_rls();
}
}
// public static void Js_wkr__update_hdoc2(Xoa_page page, Xog_js_wkr js_wkr, int html_uid, int html_w, int html_h, Io_url html_view_url, int orig_w, int orig_h, Io_url html_orig_url, byte[] lnki_ttl) {
// Xow_wiki wiki = null;
// Gallery_mgr_base gallery_mgr = null;
// Bry_bfr bfr = null, tmp_bfr = null;
// Xof_file_itm xfer_itm = null;
// try {
// xfer_itm.Init_at_gallery_end(html_w, html_h, html_view_url, html_orig_url);
//// Gallery_mgr_wtr.Write_itm(bfr, tmp_bfr, wiki.Appe(), wiki, ctx.Page(), ctx, wiki.Html_mgr().Html_wtr(), Xoh_wtr_ctx.Basic, src, gallery_mgr, xnde, gallery_itm_idx, xfer_itm);
//// String itm_html = bfr.To_str_and_clear();
//// js_wkr.Html_elem_replace_html(String_.new_u8(gallery_li_id_bry), itm_html);
//// if (gallery_itm_idx == xnde.Itms_len() - 1 && Gallery_mgr_base_.Mode_is_packed(xnde.Mode()))
//// page.Xtn_gallery_packed_exists_y_(); // set flag for packed_gallery; don't fire multiple times; PAGE:en.w:National_Sculpture_Museum_(Valladolid); DATE:2014-07-21
// }
// finally {
// bfr.Mkr_rls(); tmp_bfr.Mkr_rls();
// }
// }
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.core.brys.fmtrs.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.parsers.htmls.*; import gplx.xowa.htmls.core.makes.imgs.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.parsers.htmls.*;
import gplx.xowa.files.*;
public class Gallery_mgr_wtr {
private static final Gallery_img_pad_fmtr_arg div_3_fmtr_arg = new Gallery_img_pad_fmtr_arg();
@@ -37,7 +37,6 @@ public class Gallery_mgr_wtr {
if (itms_per_row > 0) { // "perrow" specified; add "_maxwidth" to div1 style
int max_width = itms_per_row * (itm_default_w + mgr.Get_all_padding());
ul_style = Fmt_and_add(tmp_bfr, Gallery_mgr_wtr_.Fmtr__ul__style, ul_style, max_width);
page.Hdump_data().Imgs_add(new Xohd_img_itm__gallery_mgr(ul_uid, max_width));
}
byte[] ul_cls = Fmt_and_add(tmp_bfr, Gallery_mgr_wtr_.Fmtr__ul__cls, xnde.Atr_cls(), Gallery_mgr_base_.To_bry(mgr.Tid()));
Write_ul_lhs(bfr, tmp_bfr, hctx_is_hdump, wiki.Appe().Html_mgr().Whitelist_mgr(), src, xnde, ul_id, ul_cls, ul_style, xnde.Atrs_other());
@@ -110,7 +109,7 @@ public class Gallery_mgr_wtr {
// get href_ttl
Xoa_ttl href_ttl = itm.Link_bgn() == Bry_find_.Not_found
? itm_ttl
: Xoa_ttl.parse(wiki, Bry_.Mid(src, itm.Link_bgn(), itm.Link_end()));
: Xoa_ttl.Parse(wiki, Bry_.Mid(src, itm.Link_bgn(), itm.Link_end()));
if (href_ttl == null) href_ttl = itm_ttl; // occurs when link is invalid; EX: A.png|link=<invalid>
// get w, h
@@ -153,9 +152,6 @@ public class Gallery_mgr_wtr {
itm_caption = tmp_bfr.Add(show_filenames_link).Add(itm_caption).To_bry_and_clear();
mgr.Wrap_gallery_text(bfr, itm_caption, html_w_expand, html_h_expand);
bfr.Add(itm_li_end_bry);
if (hctx_is_hdump)
page.Hdump_data().Imgs_add_img(new Xohd_img_itm__gallery_itm().Data_init_gallery(div_1_w, div_2_w, div_3_margin), xfer_itm, Xohd_img_itm__gallery_itm.Tid_gallery);
}
public static byte File_found_mode = Bool_.__byte;

View File

@@ -172,14 +172,14 @@ public class Gallery_parser {
cur_itm.Ttl_end_(fld_end);
byte[] ttl_bry = Bry_.Mid(src, cur_itm.Ttl_bgn(), fld_end);
ttl_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url_ttl.Decode(ttl_bry); // NOTE: must decode url-encoded entries; EX: "A%28b%29.png" -> "A(b).png"; DATE:2014-01-01
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
if ( ttl == null // invalid ttl; EX: "<invalid>"
|| ttl.Anch_bgn() == 1 // anchor-only ttl; EX: "#invalid"; DATE:2014-03-18
)
cur_itm.Reset();
else {
if (!ttl.Ns().Id_is_file_or_media()) // ttl does not have "File:"; MW allows non-ns names; EX: "A.png" instead of "File:A.png"; DATE:2013-11-18
ttl = Xoa_ttl.parse(wiki, Xow_ns_.Tid__file, ttl_bry);
ttl = Xoa_ttl.Parse(wiki, Xow_ns_.Tid__file, ttl_bry);
cur_itm.Ttl_(ttl);
cur_itm.Ext_(Xof_ext_.new_by_ttl_(ttl_bry));
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import org.junit.*; import gplx.core.tests.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.wikis.ttls.*;
public class Gallery_xnde_tst {
private final Xop_fxt fxt = new Xop_fxt(); String raw_src;
private final Xop_fxt fxt = new Xop_fxt(); String raw_src;
@Before public void init() {fxt.Reset(); fxt.Wiki().Xtn_mgr().Init_by_wiki(fxt.Wiki());}
@Test public void Lnki_no_caption() {
fxt.Test_parse_page_wiki("<gallery>File:A.png</gallery>"
@@ -81,7 +81,7 @@ public class Gallery_xnde_tst {
}
@Test public void Invalid_curly() {
raw_src = "a\n";
fxt.Init_log_(Xop_ttl_log.Invalid_char).Test_parse_page_wiki("<gallery>File:A.png|" + raw_src + "}}</gallery>" // NOTE: }} is ignored since it is not a valid title
fxt.Test_parse_page_wiki("<gallery>File:A.png|" + raw_src + "}}</gallery>" // NOTE: }} is ignored since it is not a valid title
, fxt.tkn_xnde_().Xnde_tagId_(Xop_xnde_tag_.Tid__gallery).Xnde_xtn_
( new_chkr_gallery_mgr().Expd_subs_
( new_chkr_gallery_itm().Expd_lnki_("File:A.png").Expd_caption_("a")
@@ -123,7 +123,7 @@ public class Gallery_xnde_tst {
}
@Test public void Err_comment() { // PURPOSE: comment was being rendered; PAGE:en.w:Perpetual motion; <!-- removed A.jpg|bcde -->
raw_src = "b";
fxt.Init_log_(Xop_ttl_log.Comment_eos).Test_parse_page_wiki(String_.Concat_lines_nl_skip_last
fxt.Test_parse_page_wiki(String_.Concat_lines_nl_skip_last
( "<gallery>"
, "<!-- deleted A.jpg|" + raw_src
, "</gallery>"

View File

@@ -25,11 +25,11 @@ public class Geoc_isin_func extends Pf_func_base {
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) {
byte[] ttl_bry = Eval_argx(ctx, src, caller, self);
Xowe_wiki wiki = ctx.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); if (ttl == null) return;
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry); if (ttl == null) return;
byte[] lnki_ttl = Bry_.Add(Xop_tkn_.Lnki_bgn, ttl_bry, Xop_tkn_.Lnki_end); // make "[[ttl]]"
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128();
wiki.Parser_mgr().Main().Parse_text_to_html(tmp_bfr, ctx.Page(), false, lnki_ttl);
ctx.Page().Html_data().Content_sub_(tmp_bfr.To_bry_and_rls());
}
public static final Geoc_isin_func Instance = new Geoc_isin_func();
public static final Geoc_isin_func Instance = new Geoc_isin_func();
}

View File

@@ -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.xowa.files.*; import gplx.xowa.guis.cbks.js.*;
import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.makes.imgs.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*;
import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*;
import gplx.xowa.xtns.imaps.itms.*; import gplx.xowa.xtns.imaps.htmls.*;
public class Imap_map implements Xoh_file_img_wkr, Js_img_wkr {
private byte img_cls_tid; private Imap_xtn_mgr xtn_mgr;
@@ -45,7 +45,6 @@ public class Imap_map implements Xoh_file_img_wkr, Js_img_wkr {
if (hctx.Mode_is_hdump()) {
img_w = xfer_itm.Lnki_w(); // NOTE: hdump must dump lnki_w, not img_w; GUI will either (a) write -1 and update later thru js_wkr; (b) get correct img_w from cache; hdump can do neither (a) nor (b); DATE:2016-06-17
img_h = xfer_itm.Lnki_h();
page.Hdump_data().Imgs_add_img(new Xohd_img_itm__img(), xfer_itm, Xohd_img_itm__gallery_itm.Tid_basic); // DELETE: no need to add img to global collection during hdump; was here presumably to write entries to "imgs" table; DATE:2016-06-17
}
Write_imap_div(tmp_bfr, hctx, uid, img_w, img_h, img_src, xfer_itm.Orig_w(), xfer_itm.Orig_h(), a_xowa_title);
}

View File

@@ -33,7 +33,7 @@ public class Imap_parser {
public void Init(Xowe_wiki wiki, Xoae_page page, Gfo_usr_dlg usr_dlg) {// SCOPE.PAGE
this.app = wiki.Appe(); this.wiki = wiki; this.page_url = page.Url(); this.usr_dlg = usr_dlg;
this.wiki_ctx = wiki.Parser_mgr().Ctx();
imap_ctx = Xop_ctx.new_(wiki, page.Ttl().Raw()); // NOTE: must update page ttl for Modules; PAGE:it.s:Patria_Esercito_Re/Indice_generale; DATE:2015-12-02
imap_ctx = Xop_ctx.new_(wiki, wiki.Parser_mgr(), page.Ttl().Raw()); // NOTE: must update page ttl for Modules; PAGE:it.s:Patria_Esercito_Re/Indice_generale; DATE:2015-12-02
imap_root = app.Parser_mgr().Tkn_mkr().Root(Bry_.Empty);
}
public void Clear() {

View File

@@ -49,7 +49,7 @@ public class Insider_html_bldr implements gplx.core.brys.Bfr_arg {
Gfo_url_encoder href_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href;
for (int i = 0; i < list_len; ++i) {
byte[] itm = (byte[])list.Get_at(i);
Xoa_ttl user_ttl = Xoa_ttl.parse(wiki, Xow_ns_.Tid__user, itm);
Xoa_ttl user_ttl = Xoa_ttl.Parse(wiki, Xow_ns_.Tid__user, itm);
if (user_ttl == null) continue;
byte[] user_ttl_bry = user_ttl.Full_db();
if (hash.Has(user_ttl_bry)) continue;

View File

@@ -45,21 +45,18 @@ public class Listing_xnde implements Xox_xnde, Mwh_atr_itm_owner1 {
case Listing_xatrs.Tid_long: xatr_long = xatr.Val_as_int_or(Xatr_meridian_null); break;
}
}
private void Init_args() {
private void Init_args(Xop_ctx ctx) {
if (xatr_name == null) {
xatr_name = msg_mgr.Itm_by_key_or_new(Bry_.new_a7("listings-unknown")).Val();
}
xatr_alt = Parse_wikitext(xatr_alt);
xatr_address = Parse_wikitext(xatr_address);
xatr_directions = Parse_wikitext(xatr_directions);
xatr_alt = Parse_wikitext(ctx, xatr_alt);
xatr_address = Parse_wikitext(ctx, xatr_address);
xatr_directions = Parse_wikitext(ctx, xatr_directions);
}
private Xowe_wiki wiki; private Xop_parser parser; private Xop_ctx sub_ctx; private Xol_msg_mgr msg_mgr;
private void Init_sub_ctx() {
sub_ctx = Xop_ctx.new_sub_(wiki);
}
private byte[] Parse_wikitext(byte[] v) {
private byte[] Parse_wikitext(Xop_ctx ctx, byte[] v) {
if (Bry_.Len_eq_0(v)) return v; // ignore null, ""
if (sub_ctx == null) Init_sub_ctx();
if (sub_ctx == null) sub_ctx = Xop_ctx.new_sub_(ctx);
return parser.Parse_text_to_html(sub_ctx, v);
}
private Listing_xtn_mgr xtn_mgr;
@@ -69,10 +66,10 @@ public class Listing_xnde implements Xox_xnde, Mwh_atr_itm_owner1 {
xtn_mgr = (Listing_xtn_mgr)wiki.Xtn_mgr().Get_or_fail(Listing_xtn_mgr.Xtn_key_static);
if (xtn_mgr == null || !xtn_mgr.Enabled()) return;
Mwh_atr_itm[] atrs = Xox_xnde_.Xatr__set(wiki, this, Listing_xatrs.Key_hash, src, xnde);
Init_args();
Init_args(ctx);
Gfh_wtr hwtr = xtn_mgr.Hwtr();
if (!Bld_by_template(xnde, atrs, src)) {
Bld_by_args(xtn_mgr, hwtr, xnde, src);
if (!Bld_by_template(ctx, xnde, atrs, src)) {
Bld_by_args(xtn_mgr, ctx, hwtr, xnde, src);
html_output = hwtr.To_bry_and_clear();
}
}
@@ -82,7 +79,7 @@ public class Listing_xnde implements Xox_xnde, Mwh_atr_itm_owner1 {
else
bfr.Add(html_output);
}
private boolean Bld_by_template(Xop_xnde_tkn xnde, Mwh_atr_itm[] atrs, byte[] src) {
private boolean Bld_by_template(Xop_ctx ctx, Xop_xnde_tkn xnde, Mwh_atr_itm[] atrs, byte[] src) {
byte[] listings_template = xtn_mgr.Listings_template();
if (listings_template == null) return false;
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
@@ -102,11 +99,11 @@ public class Listing_xnde implements Xox_xnde, Mwh_atr_itm_owner1 {
bfr.Add_mid(src, xnde.Tag_open_end(), xnde.Tag_close_bgn());
}
bfr.Add(Bry__invk_end); // "}}"
Xop_ctx sub_ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx);
html_output = wiki.Parser_mgr().Main().Parse_text_to_html(sub_ctx, bfr.To_bry_and_rls());
return true;
}
private void Bld_by_args(Listing_xtn_mgr xtn_mgr, Gfh_wtr wtr, Xop_xnde_tkn xnde, byte[] src) {
private void Bld_by_args(Listing_xtn_mgr xtn_mgr, Xop_ctx ctx, Gfh_wtr wtr, Xop_xnde_tkn xnde, byte[] src) {
wtr.Nde_full(Tag_strong, xatr_name); // <strong>name</strong>
if (xatr_url != null)
wtr.Nde_full_atrs(Tag_a, wtr.To_bry_and_clear(), false
@@ -120,7 +117,7 @@ public class Listing_xnde implements Xox_xnde, Mwh_atr_itm_owner1 {
wtr.Nde_full_atrs(Tag_em, xatr_alt, false); // alt
wtr.Txt_byte(Byte_ascii.Paren_end); // ")"
}
byte[] position = Bld_position();
byte[] position = Bld_position(ctx);
if (xatr_address != null || xatr_directions != null || position != null) {
if (xatr_address != null)
wtr.Txt(Txt_comma_space).Txt(xatr_address); // , address
@@ -193,7 +190,7 @@ public class Listing_xnde implements Xox_xnde, Mwh_atr_itm_owner1 {
if (xnde.CloseMode() == Xop_xnde_tkn.CloseMode_pair)
wtr.Txt(Bry_.Trim(Bry_.Mid(src, xnde.Tag_open_end(), xnde.Tag_close_bgn())));
}
private byte[] Bld_position() {
private byte[] Bld_position(Xop_ctx ctx) {
if (xatr_lat >= Xatr_meridian_null || xatr_long >= Xatr_meridian_null) return null; // check that lat and long are valid
Xol_msg_itm position_template = xtn_mgr.Position_template();
if (position_template == null) return null;
@@ -202,7 +199,7 @@ public class Listing_xnde implements Xox_xnde, Mwh_atr_itm_owner1 {
tmp_bfr.Add(Bry__invk_bgn); // "{{"
tmp_bfr.Add(rv); // rv is not message, but actually template precursor
tmp_bfr.Add(Bry__invk_end); // "}}"
Xop_ctx sub_ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx);
rv = wiki.Parser_mgr().Main().Parse_text_to_html(sub_ctx, tmp_bfr.To_bry_and_clear());
Xol_msg_itm position_text = xtn_mgr.Position_text();
if (Bry_.Len_eq_0(position_text.Val())) return rv;

View File

@@ -26,16 +26,16 @@ public class Listing_xtn_mgr extends Xox_mgr_base {
@Override public Xox_mgr Xtn_clone_new() {return new Listing_xtn_mgr();}
@Override public void Xtn_init_by_wiki(Xowe_wiki wiki) {
if (!Enabled()) return;
this.Reset(wiki);
this.Reset(wiki, wiki.Parser_mgr().Ctx());
}
@gplx.Internal protected Gfh_wtr Hwtr() {return hwtr;} private Gfh_wtr hwtr;
public void Clear() {
listings_template = phone_symbol = tollfree_symbol = fax_symbol = email_symbol = null;
checkin_msg = checkout_msg = position_template = position_text = null;
}
private void Reset(Xowe_wiki wiki) {
private void Reset(Xowe_wiki wiki, Xop_ctx ctx) {
hwtr = new Gfh_wtr();
Xop_ctx sub_ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx);
listings_template = Load_txt(wiki, sub_ctx, "listings-template");
phone_symbol = Load_txt(wiki, sub_ctx, "listings-phone-symbol", "listings-phone");
tollfree_symbol = Load_txt(wiki, sub_ctx, "listings-tollfree-symbol", "listings-tollfree");

View File

@@ -32,12 +32,12 @@ public class Lst_pfunc_wkr {
public void Exec(Bry_bfr bfr, Xop_ctx ctx) {
Xowe_wiki wiki = ctx.Wiki();
Xoa_ttl src_ttl = Xoa_ttl.parse(wiki, src_ttl_bry); if (src_ttl == null) return; // {{#lst:<>}} -> ""
Xoa_ttl src_ttl = Xoa_ttl.Parse(wiki, src_ttl_bry); if (src_ttl == null) return; // {{#lst:<>}} -> ""
Xot_defn_tmpl defn_tmpl = (Xot_defn_tmpl)wiki.Cache_mgr().Lst_cache().Get_by_key(src_ttl_bry);
Xop_ctx sub_ctx = null;
byte[] src = null;
if (defn_tmpl == null) { // cache transclusions to prevent multiple parsings; DATE:2014-02-22
sub_ctx = Xop_ctx.new_sub_(wiki).Ref_ignore_(true);
sub_ctx = Xop_ctx.new_sub_(ctx).Ref_ignore_(true);
byte[] src_page_bry = wiki.Cache_mgr().Page_cache().Get_or_load_as_src(src_ttl);
if (src_page_bry == null) return; // {{#lst:missing}} -> ""
Xoae_page page = ctx.Page();
@@ -137,5 +137,5 @@ public class Lst_pfunc_wkr {
}
bfr.Add_mid(src, bgn_pos, src.length);
}
public static final byte[] Null_arg = null;
public static final byte[] Null_arg = null;
}

View File

@@ -96,19 +96,20 @@ public class Pgbnr_func extends Pf_func_base {
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
page.Hdr_mgr().Toc_manual_(); // NOTE: must mark toc_manual else will show 2nd TOC in edit mode; DATE:2016-07-10
}
public static void Add_banner(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src) {
public static void Add_banner(Bry_bfr bfr, Xoae_page wpg, Xop_ctx ctx, Xoh_wtr_ctx hctx, Pgbnr_itm itm) {
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 ttl = wpg.Ttl();
Xoa_ttl banner_ttl = null; byte[] banner_html = null;
if (itm != null) { // {{PAGEBANNER}} exists in wikitext
itm.Init_hdump(hctx.Mode_is_hdump());
banner_ttl = itm.banner_ttl;
banner_html = Get_banner_html(wiki, ctx, src, cfg, banner_ttl, itm);
banner_html = Get_banner_html(wiki, ctx, hctx, 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);
banner_html = Get_banner_html(wiki, ctx, hctx, cfg, banner_ttl, itm);
}
}
else if ( ttl.Ns().Id_is_main() // {{PAGEBANNER}} missing, but wiki is marked as enable_default_banner
@@ -121,12 +122,13 @@ public class Pgbnr_func extends Pf_func_base {
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);
itm.Init_hdump(hctx.Mode_is_hdump());
banner_html = Get_banner_html(wiki, ctx, hctx, cfg, banner_ttl, itm);
}
if (banner_html != null)
bfr.Add(banner_html);
}
public static byte[] Get_banner_html(Xowe_wiki wiki, Xop_ctx ctx, byte[] src, Pgbnr_cfg cfg, Xoa_ttl banner_ttl, Pgbnr_itm itm) {
public static byte[] Get_banner_html(Xowe_wiki wiki, Xop_ctx ctx, Xoh_wtr_ctx hctx, 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;
@@ -141,8 +143,16 @@ public class Pgbnr_func extends Pf_func_base {
int max_width = itm.banner_file_itm.Orig_w(); // $file = wfFindFile( banner_file ); $options['max_width'] = $file->getWidth();
byte[] banner_file = null; // $bannerfile->getLocalUrl();
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();
byte[] toc_html = null;
if (hctx.Mode_is_hdump()) {
gplx.xowa.htmls.core.wkrs.tocs.Xoh_toc_wtr.Write_tag(tmp_bfr, true);
toc_html = tmp_bfr.To_bry_and_clear();
banner_file = Bry_.Add(gplx.xowa.htmls.hrefs.Xoh_href_.Bry__wiki, gplx.xowa.wikis.nss.Xow_ns_.Bry__file, Byte_ascii.Colon_bry, banner_ttl.Full_db());
}
else {
wiki.Html_mgr().Toc_mgr().Html(ctx.Page(), gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Basic, tmp_bfr, true);
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);

View File

@@ -17,19 +17,34 @@ 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.*;
import gplx.xowa.htmls.core.htmls.*;
public class Pgbnr_func_tst {
private final Pgbnr_func_fxt fxt = new Pgbnr_func_fxt();
@Test public void Basic() {
fxt.Test__parse__eq("{{PAGEBANNER:A.png|icon-star=Star_article}}", String_.Concat_lines_nl_apos_skip_last
fxt.Test__parse(Bool_.N, "{{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>"
, " <a href='' class='image' title='Test page' xowa_title='A.png'><img id='xoimg_0' class='wpb-banner-image ' alt='' src='file:///mem/wiki/repo/trg/orig/7/0/A.png' srcset='' 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='wpb-topbanner-toc'><div class='wpb-banner-toc'></div></div>"
, "</div>"
));
}
@Test public void Hdump() {
fxt.Test__parse(Bool_.Y, "{{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 href='/wiki/File:A.png' class='image' title='Test page' xowa_title='A.png'><img data-xowa-title=\"A.png\" data-xoimg=\"0|-1|-1|-1|-1|-1\" class='wpb-banner-image ' alt='' src='file:///mem/wiki/repo/trg/orig/7/0/A.png' srcset='' 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 class=\"xo-toc\" data-toc-mode=\"1\"></div></div></div>"
, "</div>"
));
}
@@ -41,9 +56,10 @@ class Pgbnr_func_fxt {
Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "en.wikivoyage.org");
fxt = new Xop_fxt(app, wiki);
}
public void Test__parse__eq(String raw, String expd) {
public void Test__parse(boolean hdump, String raw, String expd) {
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);
Xoh_wtr_ctx hctx = hdump ? Xoh_wtr_ctx.Hdump : Xoh_wtr_ctx.Basic;
Bfr_arg arg = fxt.Wiki().Xtn_mgr().Xtn_pgbnr().Write_html(fxt.Page(), fxt.Ctx(), hctx);
Bry_bfr bfr = Bry_bfr_.New();
arg.Bfr_arg__add(bfr);
Tfds.Eq_str_lines(expd, bfr.To_str_and_clear());

View File

@@ -18,23 +18,26 @@ 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.xowa.parsers.lnkis.*;
import gplx.xowa.files.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*;
public class Pgbnr_itm implements Mustache_doc_itm {
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 byte[] file_ttl;
private Pgbnr_icon[] 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) {
private byte[] img_id_atr, img_xottl_atr, img_xoimg_atr;
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();
this.file_ttl = banner_file_itm.Orig_ttl();
}
public void Init_from_html(int maxWidth, byte[] banner_anch_href, byte[] banner_img_src, byte[] srcset, boolean isHeadingOverrideEnabled, byte[] toc) {
this.maxWidth = maxWidth;
@@ -44,18 +47,33 @@ public class Pgbnr_itm implements Mustache_doc_itm {
this.isHeadingOverrideEnabled = isHeadingOverrideEnabled;
this.toc = toc;
}
public void Init_hdump(boolean mode_is_hdump) {
Bry_bfr tmp_bfr = Bry_bfr_.New();
if (mode_is_hdump) {
this.img_id_atr = Bry_.Empty;
this.img_xottl_atr = Gfh_atr_.Add_to_bry(tmp_bfr, Xoh_img_xoimg_data.Bry__data_xowa_title, file_ttl);
this.img_xoimg_atr = Gfh_atr_.Add_to_bry(tmp_bfr, Xoh_img_xoimg_data.Bry__data_xowa_image, Xoh_img_xoimg_data.Bry__data_xowa_image__full);
}
else {
this.img_id_atr = tmp_bfr.Add(Bry__anch_atr_id).Add_int_variable(banner_file_itm.Html_uid()).Add_byte_quote().To_bry_and_clear();
this.img_xottl_atr = this.img_xoimg_atr = Bry_.Empty;
}
}
public boolean Mustache__write(String key, Mustache_bfr bfr) {
if (String_.Eq(key, "title")) bfr.Add_bry(banner_hdr_text);
else if (String_.Eq(key, "tooltip")) bfr.Add_bry(banner_anch_title);
else if (String_.Eq(key, "bannerfile")) bfr.Add_bry(banner_anch_href);
else if (String_.Eq(key, "banner")) bfr.Add_bry(banner_img_src);
else if (String_.Eq(key, "html_uid")) bfr.Add_bry(Bry_.new_u8(gplx.xowa.htmls.Xoh_img_mgr.Str__html_uid + Int_.To_str(html_uid)));
else if (String_.Eq(key, "srcset")) bfr.Add_bry(srcset == null ? Bry_.Empty : Bry_.Empty);
else if (String_.Eq(key, "originx")) bfr.Add_bry(originx);
else if (String_.Eq(key, "data-pos-x")) bfr.Add_double(data_pos_x);
else if (String_.Eq(key, "data-pos-y")) bfr.Add_double(data_pos_y);
else if (String_.Eq(key, "maxWidth")) bfr.Add_int(maxWidth);
else if (String_.Eq(key, "toc")) bfr.Add_bry(toc);
else if (String_.Eq(key, "img_id_atr")) bfr.Add_bry(img_id_atr);
else if (String_.Eq(key, "img_xottl")) bfr.Add_bry(img_xottl_atr);
else if (String_.Eq(key, "img_xoimg")) bfr.Add_bry(img_xoimg_atr);
else if (String_.Eq(key, "file_ttl")) bfr.Add_bry(file_ttl);
else return false;
return true;
}
@@ -66,4 +84,5 @@ public class Pgbnr_itm implements Mustache_doc_itm {
else if (String_.Eq(key, "isHeadingOverrideEnabled")) return Mustache_doc_itm_.Ary__bool(isHeadingOverrideEnabled);
return Mustache_doc_itm_.Ary__empty;
}
private static final byte[] Bry__anch_atr_id = Bry_.new_a7(" id=\"xoimg_");
}

View File

@@ -74,20 +74,20 @@ public class Pgbnr_xtn_mgr extends Xox_mgr_base implements Bfr_arg {
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, Xoh_wtr_ctx hctx, byte[] src) {
this.pctx = pctx; this.page = page; this.hctx = hctx; this.src = src;
public Bfr_arg Write_html(Xoae_page wpg, Xop_ctx pctx, Xoh_wtr_ctx hctx) {
this.wpg = wpg; this.pctx = pctx; this.hctx = hctx;
return this;
} private Xop_ctx pctx; private Xoae_page page; private Xoh_wtr_ctx hctx; private byte[] src;
} private Xoae_page wpg; private Xop_ctx pctx; private Xoh_wtr_ctx hctx;
public void Bfr_arg__add(Bry_bfr bfr) {
Pgbnr_itm itm = page.Html_data().Xtn_pgbnr();
if (itm == null) return;
Pgbnr_func.Add_banner(bfr, pctx, hctx, src);
Pgbnr_itm itm = wpg.Html_data().Xtn_pgbnr(); if (itm == null) return;
Pgbnr_func.Add_banner(bfr, wpg, pctx, hctx, itm);
}
public static final byte[] Bry__cls__wpb_banner_image = Bry_.new_a7("wpb-banner-image");
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 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>"
, " <a href='{{bannerfile}}' class='image' title='{{tooltip}}' xowa_title='{{file_ttl}}'><img{{{img_id_atr}}}{{{img_xottl}}}{{{img_xoimg}}} class='wpb-banner-image {{originx}}' alt='' src='{{banner}}' srcset='{{srcset}}' data-pos-x='{{data-pos-x}}' data-pos-y='{{data-pos-y}}' style='max-width:{{maxWidth}}px'></a>"
, " {{#hasIcons}}"
, " <div class='wpb-iconbox'>"
, " {{#icons}}"
@@ -96,7 +96,7 @@ public class Pgbnr_xtn_mgr extends Xox_mgr_base implements Bfr_arg {
, " </div>"
, " {{/hasIcons}}"
, " </div>"
, " <div class='wpb-topbanner-toc {{#bottomtoc}}wpb-bottomtoc{{/bottomtoc}}'><div class='wpb-banner-toc'>{{{toc}}}</div></div>"
, " <div class='wpb-topbanner-toc{{#bottomtoc}} wpb-bottomtoc{{/bottomtoc}}'><div class='wpb-banner-toc'>{{{toc}}}</div></div>"
, "</div>"
);
}

View File

@@ -58,11 +58,13 @@ public class Pf_func_ {
}
else if (lhs_len == 0 || rhs_len == 0) // one side is empty String and the other side is String; return false;
return false;
lhs_parser.Parse(lhs, 0, lhs_len);
if (lhs_parser.Has_err()) return false;
rhs_parser.Parse(rhs, 0, rhs_len);
if (rhs_parser.Has_err()) return false;
return lhs_parser.Has_frac() || rhs_parser.Has_frac() ? lhs_parser.Rv_as_dec().Eq(rhs_parser.Rv_as_dec()) : lhs_parser.Rv_as_int() == rhs_parser.Rv_as_int();
synchronized (lhs_parser) { // LOCK:static-obj; DATE:2016-07-06
lhs_parser.Parse(lhs, 0, lhs_len);
if (lhs_parser.Has_err()) return false;
rhs_parser.Parse(rhs, 0, rhs_len);
if (rhs_parser.Has_err()) return false;
return lhs_parser.Has_frac() || rhs_parser.Has_frac() ? lhs_parser.Rv_as_dec().Eq(rhs_parser.Rv_as_dec()) : lhs_parser.Rv_as_int() == rhs_parser.Rv_as_int();
}
}
public static void Reg(Xow_domain_itm domain_itm, gplx.xowa.langs.funcs.Xol_func_regy func_regy, Xol_lang_itm lang) {
Xol_kwd_mgr kwd_mgr = lang.Kwd_mgr();

View File

@@ -24,6 +24,7 @@ public class Pfunc_expr_shunter {
Val_stack val_stack = new Val_stack();
Func_tkn_stack prc_stack = new Func_tkn_stack();
public static final Decimal_adp Null_rslt = null;
private final Object thread_lock = new Object();
public Bry_bfr Err() {return err_bfr;} Bry_bfr err_bfr = Bry_bfr_.New();
public Decimal_adp Err_set(Xop_ctx ctx, int msgId) {return Err_set(ctx, msgId, Bry_.Empty);}
public Decimal_adp Err_set(Xop_ctx ctx, int msg_id, byte[] arg) {
@@ -37,127 +38,129 @@ public class Pfunc_expr_shunter {
err_bfr.Add(bry);
}
public Decimal_adp Evaluate(Xop_ctx ctx, byte[] src) { // REF.MW: Expr.php
int src_len = src.length; if (src_len == 0) return Null_rslt;
int cur_pos = 0; byte cur_byt = src[0];
boolean mode_expr = true; Func_tkn prv_prc = null;
val_stack.Clear(); prc_stack.Clear();
while (true) {
// can't think of a way for this to happen; note that operators will automatically push values/operators off stack that are lower; can't get up to 100
// if (val_stack.Len() > 100 || prc_stack.Len() > 100) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_err__stack_exhausted);
Object o = trie.Match_bgn_w_byte(cur_byt, src, cur_pos, src_len);
int bgn_pos = cur_pos;
if (o == null) { // letter or unknown symbol
while (cur_pos < src_len) {
byte b = src[cur_pos++];
if (Byte_ascii.Is_ltr(b))
continue;
else
break;
synchronized (thread_lock) {
int src_len = src.length; if (src_len == 0) return Null_rslt;
int cur_pos = 0; byte cur_byt = src[0];
boolean mode_expr = true; Func_tkn prv_prc = null;
val_stack.Clear(); prc_stack.Clear();
while (true) {
// can't think of a way for this to happen; note that operators will automatically push values/operators off stack that are lower; can't get up to 100
// if (val_stack.Len() > 100 || prc_stack.Len() > 100) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_err__stack_exhausted);
Object o = trie.Match_bgn_w_byte(cur_byt, src, cur_pos, src_len);
int bgn_pos = cur_pos;
if (o == null) { // letter or unknown symbol
while (cur_pos < src_len) {
byte b = src[cur_pos++];
if (Byte_ascii.Is_ltr(b))
continue;
else
break;
}
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unrecognised_word, Bry_.Mid(src, bgn_pos, cur_pos));
}
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unrecognised_word, Bry_.Mid(src, bgn_pos, cur_pos));
}
else {
Expr_tkn t = (Expr_tkn)o;
cur_pos = trie.Match_pos();
switch (t.Tid()) {
case Expr_tkn_.Tid_space: break;
case Expr_tkn_.Tid_number:
if (!mode_expr) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_number);
int numBgn = cur_pos - 1;
boolean loop = true;
while (loop) {
if (cur_pos == src_len) break;
switch (src[cur_pos]) {
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
case Byte_ascii.Dot:
++cur_pos;
break;
default: loop = false; break;
}
}
Decimal_adp num = Null_rslt;
try {num = Bry_.To_decimal(src, numBgn, cur_pos);}
catch (Exception exc) {
// NOTE: PATCH.PHP: 65.5.5 can evaluate to 65.5; EX "{{Geological eras|-600|height=2|border=none}}" eventually does "|10-to={{#ifexpr:{{{1|-4567}}}<-65.5|-65.5|{{{1}}}}}.5" which is 65.5.5
Err_.Noop(exc);
int dot_count = 0;
for (int i = numBgn; i < cur_pos; i++) {
if (src[i] == Byte_ascii.Dot) {
switch (dot_count) {
case 0: dot_count = 1; break;
case 1:
try {
num = Bry_.To_decimal(src, numBgn, i);
}
catch (Exception exc_inner) {Err_.Noop(exc_inner);}
break;
}
else {
Expr_tkn t = (Expr_tkn)o;
cur_pos = trie.Match_pos();
switch (t.Tid()) {
case Expr_tkn_.Tid_space: break;
case Expr_tkn_.Tid_number:
if (!mode_expr) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_number);
int numBgn = cur_pos - 1;
boolean loop = true;
while (loop) {
if (cur_pos == src_len) break;
switch (src[cur_pos]) {
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
case Byte_ascii.Dot:
++cur_pos;
break;
default: loop = false; break;
}
}
if (num == null) return Null_rslt;
}
val_stack.Push(num);
mode_expr = false;
break;
case Expr_tkn_.Tid_paren_lhs:
if (!mode_expr) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_operator, Bry_.new_a7("("));
prc_stack.Push((Func_tkn)t);
break;
case Expr_tkn_.Tid_operator:
Func_tkn cur_prc = (Func_tkn)t;
if (Byte_ascii.Is_ltr(cur_byt)) {
int nxt_pos = Bry_find_.Find_fwd_while_letter(src, cur_pos, src_len);
if (nxt_pos > cur_pos)
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unrecognised_word, Bry_.Mid(src, bgn_pos, nxt_pos));
}
if (cur_prc.Func_is_const()) { // func is "pi" or "e"; DATE:2014-03-01
if (mode_expr) { // number expected; just call Calc (which will place value on stack)
cur_prc.Calc(ctx, this, val_stack);
Decimal_adp num = Null_rslt;
try {num = Bry_.To_decimal(src, numBgn, cur_pos);}
catch (Exception exc) {
// NOTE: PATCH.PHP: 65.5.5 can evaluate to 65.5; EX "{{Geological eras|-600|height=2|border=none}}" eventually does "|10-to={{#ifexpr:{{{1|-4567}}}<-65.5|-65.5|{{{1}}}}}.5" which is 65.5.5
Err_.Noop(exc);
int dot_count = 0;
for (int i = numBgn; i < cur_pos; i++) {
if (src[i] == Byte_ascii.Dot) {
switch (dot_count) {
case 0: dot_count = 1; break;
case 1:
try {
num = Bry_.To_decimal(src, numBgn, i);
}
catch (Exception exc_inner) {Err_.Noop(exc_inner);}
break;
}
}
}
if (num == null) return Null_rslt;
}
val_stack.Push(num);
mode_expr = false;
break;
case Expr_tkn_.Tid_paren_lhs:
if (!mode_expr) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_operator, Bry_.new_a7("("));
prc_stack.Push((Func_tkn)t);
break;
case Expr_tkn_.Tid_operator:
Func_tkn cur_prc = (Func_tkn)t;
if (Byte_ascii.Is_ltr(cur_byt)) {
int nxt_pos = Bry_find_.Find_fwd_while_letter(src, cur_pos, src_len);
if (nxt_pos > cur_pos)
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unrecognised_word, Bry_.Mid(src, bgn_pos, nxt_pos));
}
if (cur_prc.Func_is_const()) { // func is "pi" or "e"; DATE:2014-03-01
if (mode_expr) { // number expected; just call Calc (which will place value on stack)
cur_prc.Calc(ctx, this, val_stack);
break;
}
else // operator expected; fail b/c pi / e is not an operator;
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_number);
}
if (mode_expr) { // NOTE: all the GetAlts have higher precedence; "break;" need to skip evaluation below else will fail for --1
Func_tkn alt_prc = cur_prc.GetAlt();
prc_stack.Push(alt_prc);
break;
}
else // operator expected; fail b/c pi / e is not an operator;
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_number);
}
if (mode_expr) { // NOTE: all the GetAlts have higher precedence; "break;" need to skip evaluation below else will fail for --1
Func_tkn alt_prc = cur_prc.GetAlt();
prc_stack.Push(alt_prc);
prv_prc = prc_stack.GetLast();
while (prv_prc != null && (cur_prc.Precedence() <= prv_prc.Precedence())) {
if (!prv_prc.Calc(ctx, this, val_stack)) return Null_rslt;
prc_stack.Pop();
prv_prc = prc_stack.GetLast();
}
prc_stack.Push(cur_prc);
mode_expr = true;
break;
case Expr_tkn_.Tid_paren_rhs: {
prv_prc = prc_stack.GetLast();
while (prv_prc != null && prv_prc.Tid() != Expr_tkn_.Tid_paren_lhs) {
if (!prv_prc.Calc(ctx, this, val_stack)) return Null_rslt;
prc_stack.Pop();
prv_prc = prc_stack.GetLast();
}
if (prv_prc == Paren_bgn_tkn.Instance)
prc_stack.Pop();
else
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_closing_bracket);
mode_expr = false;
break;
}
prv_prc = prc_stack.GetLast();
while (prv_prc != null && (cur_prc.Precedence() <= prv_prc.Precedence())) {
if (!prv_prc.Calc(ctx, this, val_stack)) return Null_rslt;
prc_stack.Pop();
prv_prc = prc_stack.GetLast();
}
prc_stack.Push(cur_prc);
mode_expr = true;
break;
case Expr_tkn_.Tid_paren_rhs: {
prv_prc = prc_stack.GetLast();
while (prv_prc != null && prv_prc.Tid() != Expr_tkn_.Tid_paren_lhs) {
if (!prv_prc.Calc(ctx, this, val_stack)) return Null_rslt;
prc_stack.Pop();
prv_prc = prc_stack.GetLast();
}
if (prv_prc == Paren_bgn_tkn.Instance)
prc_stack.Pop();
else
return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unexpected_closing_bracket);
mode_expr = false;
break;
}
}
if (cur_pos == src_len) break;
cur_byt = src[cur_pos];
}
if (cur_pos == src_len) break;
cur_byt = src[cur_pos];
while (prc_stack.Len() > 0) {
Func_tkn cur_prc = prc_stack.Pop();
if (cur_prc.Tid() == Expr_tkn_.Tid_paren_lhs) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unclosed_bracket);
if (!cur_prc.Calc(ctx, this, val_stack)) return Null_rslt;
}
return val_stack.Len() == 0 ? Null_rslt : val_stack.Pop(); // HACK: for [[List of Premiers of South Australia by time in office]] and {{#expr:\n{{age in days
}
while (prc_stack.Len() > 0) {
Func_tkn cur_prc = prc_stack.Pop();
if (cur_prc.Tid() == Expr_tkn_.Tid_paren_lhs) return Err_set(ctx, Xol_msg_itm_.Id_pfunc_expr_unclosed_bracket);
if (!cur_prc.Calc(ctx, this, val_stack)) return Null_rslt;
}
return val_stack.Len() == 0 ? Null_rslt : val_stack.Pop(); // HACK: for [[List of Premiers of South Australia by time in office]] and {{#expr:\n{{age in days
}
private static Btrie_fast_mgr expression_() {
Btrie_fast_mgr rv = Btrie_fast_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; math and expressions

View File

@@ -25,7 +25,7 @@ public class Pfunc_ifexist_mgr {
public void Clear() {regy.Clear();}
public boolean Exists(Xowe_wiki wiki, byte[] raw_bry) {
if (Bry_.Len_eq_0(raw_bry)) return false; // return early; NOTE: {{autolink}} can pass in "" (see test)
Xoa_ttl ttl = Xoa_ttl.parse(wiki, raw_bry); if (ttl == null) return false;
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, raw_bry); if (ttl == null) return false;
byte[] ttl_bry = ttl.Page_db(); // NOTE: must use Page_db; EX: {{#ifexist:File:Peter & Paul fortress in SPB 03.jpg|y|n}}
Object exists_obj = regy.Get_by(ttl_bry);
if (exists_obj != null) return ((Pfunc_ifexist_itm)exists_obj).Exists();

View File

@@ -23,60 +23,62 @@ public class Pfunc_switch extends Pf_func_base {
@Override public Pf_func New(int id, byte[] name) {return new Pfunc_switch().Name_(name);}
@Override public boolean Func_require_colon_arg() {return true;}
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) {// REF.MW:ParserFunctions_body.php
int self_args_len = self.Args_len(); if (self_args_len == 0) return; // no cases; return; effectively "empty"
byte[] argx = Eval_argx(ctx, src, caller, self);
boolean fall_thru_found = false;
byte[] match = null;
Arg_itm_tkn dflt_val_tkn = null; byte[] dflt_val_bry = null;
Arg_nde_tkn last_keyless_arg = null;
Bry_bfr tmp = ctx.Wiki().Utl__bfr_mkr().Get_b512();
Xol_kwd_mgr kwd_mgr = ctx.Lang().Kwd_mgr();
for (int i = 0; i < self_args_len; i++) {
Arg_nde_tkn arg = self.Args_get_by_idx(i);
if (arg.KeyTkn_exists()) { // = exists; EX: "|a=1|"
last_keyless_arg = null; // set last_keyless_arg to null
byte[] case_key = Get_or_eval(ctx, src, caller, self, bfr, arg.Key_tkn(), tmp);
if ( fall_thru_found // fall-thru found earlier; take cur value; EX: {{#switch:a|a|b=1|c=2}} -> 1
|| Pf_func_.Eq_(case_key, argx) // case_key matches argx; EX: {{#switch:a|a=1}}
) {
match = Get_or_eval(ctx, src, caller, self, bfr, arg.Val_tkn(), tmp);
break; // stop iterating; explicit match found;
// synchronized (this) { // LOCK:DELETE; DATE:2016-07-06
int self_args_len = self.Args_len(); if (self_args_len == 0) return; // no cases; return; effectively "empty"
byte[] argx = Eval_argx(ctx, src, caller, self);
boolean fall_thru_found = false;
byte[] match = null;
Arg_itm_tkn dflt_val_tkn = null; byte[] dflt_val_bry = null;
Arg_nde_tkn last_keyless_arg = null;
Bry_bfr tmp = ctx.Wiki().Utl__bfr_mkr().Get_b512();
Xol_kwd_mgr kwd_mgr = ctx.Lang().Kwd_mgr();
for (int i = 0; i < self_args_len; i++) {
Arg_nde_tkn arg = self.Args_get_by_idx(i);
if (arg.KeyTkn_exists()) { // = exists; EX: "|a=1|"
last_keyless_arg = null; // set last_keyless_arg to null
byte[] case_key = Get_or_eval(ctx, src, caller, self, bfr, arg.Key_tkn(), tmp);
if ( fall_thru_found // fall-thru found earlier; take cur value; EX: {{#switch:a|a|b=1|c=2}} -> 1
|| Pf_func_.Eq_(case_key, argx) // case_key matches argx; EX: {{#switch:a|a=1}}
) {
match = Get_or_eval(ctx, src, caller, self, bfr, arg.Val_tkn(), tmp);
break; // stop iterating; explicit match found;
}
else if (kwd_mgr.Kwd_default_match(case_key)){ // case_key is #default; EX: {{#switch:a|#default=1}}; note that "#defaultabc" is also allowed;
dflt_val_tkn = arg.Val_tkn(); // set dflt_val_tkn; note that there is no "break" b/c multiple #defaults will use last one; EX: {{#switch:a|#default=1|#default=2}} -> 2
dflt_val_bry = null; // set dflt_val_bry to null; EX:{{#switch:a|#defaultabc|#default=2}} -> 2
}
else {} // case_key != argx; continue
}
else if (kwd_mgr.Kwd_default_match(case_key)){ // case_key is #default; EX: {{#switch:a|#default=1}}; note that "#defaultabc" is also allowed;
dflt_val_tkn = arg.Val_tkn(); // set dflt_val_tkn; note that there is no "break" b/c multiple #defaults will use last one; EX: {{#switch:a|#default=1|#default=2}} -> 2
dflt_val_bry = null; // set dflt_val_bry to null; EX:{{#switch:a|#defaultabc|#default=2}} -> 2
}
else {} // case_key != argx; continue
}
else { // = missing; EX: "|a|", "|#default|"
last_keyless_arg = arg;
byte[] case_val = Get_or_eval(ctx, src, caller, self, bfr, arg.Val_tkn(), tmp);
if (Pf_func_.Eq_(case_val, argx)) // argx matches case_val; EX: case_val="|a|" and argx="a"
fall_thru_found = true; // set as fall-thru; note that fall-thrus will have "val" in next keyed arg, so need to continue iterating; EX: {{#switch:a|a|b=1|c=2}} "a" is fall-thru, but "b" is next keyed arg with a val
else if (kwd_mgr.Kwd_default_match(case_val)) { // case_val starts with #default; EX: "|#default|" or "|#defaultabc|"
last_keyless_arg = null; // unflag last keyless arg else |#defaultabc| will be treated as last_keyless_arg and generate "#defaultabc"; DATE:2014-05-29
dflt_val_tkn = null; // unflag dflt_val_tkn; EX: {{#switch:a|b|#default=1|#default}} -> "" x> "1"
int case_val_len = case_val.length;
dflt_val_bry
= case_val_len == Dflt_keyword_len // PERF: check if case_val = "|#default|"
? null // PERF: set to null; don't create Bry_.Empty
: Bry_.Mid(case_val, Dflt_keyword_len, case_val_len) // chop off "#default"; EX: {{#switch:a|b|#defaultabc}} -> "abc"
;
else { // = missing; EX: "|a|", "|#default|"
last_keyless_arg = arg;
byte[] case_val = Get_or_eval(ctx, src, caller, self, bfr, arg.Val_tkn(), tmp);
if (Pf_func_.Eq_(case_val, argx)) // argx matches case_val; EX: case_val="|a|" and argx="a"
fall_thru_found = true; // set as fall-thru; note that fall-thrus will have "val" in next keyed arg, so need to continue iterating; EX: {{#switch:a|a|b=1|c=2}} "a" is fall-thru, but "b" is next keyed arg with a val
else if (kwd_mgr.Kwd_default_match(case_val)) { // case_val starts with #default; EX: "|#default|" or "|#defaultabc|"
last_keyless_arg = null; // unflag last keyless arg else |#defaultabc| will be treated as last_keyless_arg and generate "#defaultabc"; DATE:2014-05-29
dflt_val_tkn = null; // unflag dflt_val_tkn; EX: {{#switch:a|b|#default=1|#default}} -> "" x> "1"
int case_val_len = case_val.length;
dflt_val_bry
= case_val_len == Dflt_keyword_len // PERF: check if case_val = "|#default|"
? null // PERF: set to null; don't create Bry_.Empty
: Bry_.Mid(case_val, Dflt_keyword_len, case_val_len) // chop off "#default"; EX: {{#switch:a|b|#defaultabc}} -> "abc"
;
}
}
}
}
if (match == null) { // no match; will either use last_keyless arg or #default
if (last_keyless_arg != null) // always prefer last_keyless_arg; EX: {{#switch:a|#default=1|2}} -> 2
match = Get_or_eval(ctx, src, caller, self, bfr, last_keyless_arg.Val_tkn(), tmp);
else if (dflt_val_bry != null) // "|#defaultabc|" found; use it
match = dflt_val_bry;
else if (dflt_val_tkn != null) // "|#default=val|" found; use it
match = Get_or_eval(ctx, src, caller, self, bfr, dflt_val_tkn, tmp);
else {} // nothing found; noop; match will remain null
}
if (match != null)
bfr.Add(match);
tmp.Mkr_rls();
if (match == null) { // no match; will either use last_keyless arg or #default
if (last_keyless_arg != null) // always prefer last_keyless_arg; EX: {{#switch:a|#default=1|2}} -> 2
match = Get_or_eval(ctx, src, caller, self, bfr, last_keyless_arg.Val_tkn(), tmp);
else if (dflt_val_bry != null) // "|#defaultabc|" found; use it
match = dflt_val_bry;
else if (dflt_val_tkn != null) // "|#default=val|" found; use it
match = Get_or_eval(ctx, src, caller, self, bfr, dflt_val_tkn, tmp);
else {} // nothing found; noop; match will remain null
}
if (match != null)
bfr.Add(match);
tmp.Mkr_rls();
// }
}
private byte[] Get_or_eval(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb, Arg_itm_tkn itm, Bry_bfr tmp) {
if (itm.Itm_static() == Bool_.Y_byte)
@@ -86,6 +88,6 @@ public class Pfunc_switch extends Pf_func_base {
return tmp.To_bry_and_clear_and_trim();
}
}
public static final byte[] Dflt_keyword = Bry_.new_a7("#default"); // NOTE: technically should pull from messages, but would need to cache Dflt_keyword on wiki level; checked all Messages files, and no one overrides it; DATE:2014-05-29
public static final byte[] Dflt_keyword = Bry_.new_a7("#default"); // NOTE: technically should pull from messages, but would need to cache Dflt_keyword on wiki level; checked all Messages files, and no one overrides it; DATE:2014-05-29
private static int Dflt_keyword_len = Dflt_keyword.length;
}

View File

@@ -25,7 +25,7 @@ public class Pfunc_displaytitle extends Pf_func_base {
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) {
byte[] val_dat_ary = Eval_argx(ctx, src, caller, self);
Xowe_wiki wiki = ctx.Wiki(); Xop_parser parser = wiki.Parser_mgr().Main();
Xop_ctx display_ttl_ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx display_ttl_ctx = Xop_ctx.new_sub_(ctx);
Xop_root_tkn display_ttl_root = parser.Parse_text_to_wdom(display_ttl_ctx, val_dat_ary, false);
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
boolean restrict = wiki.Cfg_parser().Display_title_restrict();

View File

@@ -17,33 +17,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.dbs.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*;
public class Pfunc_rev_props extends Pf_func_base {
public Pfunc_rev_props(int id) {this.id = id;}
@Override public int Id() {return id;} private final int id;
@Override public Pf_func New(int id, byte[] name) {return new Pfunc_rev_props(id).Name_(name);}
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) {
byte[] argx = Eval_argx(ctx, src, caller, self);
Xopg_revision_data rev_data = ctx.Page().Revision_data();
Xopg_db_protection rev_data = ctx.Page().Db().Protection();
switch (id) {
case Xol_kwd_grp_.Id_page_id:
case Xol_kwd_grp_.Id_rev_id: bfr.Add_int_variable(ctx.Page().Revision_data().Id()); break; // NOTE: making rev_id and page_id interchangeable; XOWA does not store rev_id
case Xol_kwd_grp_.Id_rev_id: bfr.Add_int_variable(ctx.Page().Db().Page().Id()); break; // NOTE: making rev_id and page_id interchangeable; XOWA does not store rev_id
case Xol_kwd_grp_.Id_rev_user: bfr.Add(rev_data.User()); break;
case Xol_kwd_grp_.Id_rev_protectionlevel: bfr.Add(rev_data.Protection_level()); break;
case Xol_kwd_grp_.Id_rev_protectionexpiry: bfr.Add(rev_data.Protection_expiry()); break;
case Xol_kwd_grp_.Id_rev_revisionsize: // default revsize to pagesize; MW has additional logic for subst which should not apply to XO; https://gerrit.wikimedia.org/r/#/c/82650/
bfr.Add_int_variable(ctx.Page().Data_raw().length);
bfr.Add_int_variable(ctx.Page().Db().Text().Text_bry().length);
break;
case Xol_kwd_grp_.Id_rev_pagesize:
if (argx.length > 0) {
Xoa_ttl argx_ttl = Xoa_ttl.parse(ctx.Wiki(), argx);
Xoa_ttl argx_ttl = Xoa_ttl.Parse(ctx.Wiki(), argx);
if (argx_ttl == null) { // invalid ttl; EX: {{PAGESIZE:{{{bad}}}}}
bfr.Add_byte(Byte_ascii.Num_0);
return;
}
Xoae_page argx_page = ctx.Wiki().Data_mgr().Load_page_by_ttl(argx_ttl);
if (!argx_page.Missing()) {
bfr.Add_int_variable(argx_page.Data_raw().length);
if (argx_page.Db().Page().Exists()) {
bfr.Add_int_variable(argx_page.Db().Text().Text_bry().length);
return;
}
}

View File

@@ -18,17 +18,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.pfuncs.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
import org.junit.*; import gplx.xowa.wikis.ttls.*;
public class Pfunc_rev_props_tst {
private final Xop_fxt fxt = new Xop_fxt();
@Before public void setup() {fxt.Reset(); fxt.Page().Revision_data().User_(Bry_.new_a7("user")).Protection_level_(Bry_.new_a7("normal"));}
@Test public void Revision_id() {fxt.Page().Revision_data().Id_(1); fxt.Test_parse_tmpl_str_test("{{REVISIONID}}" , "{{test}}", "1");}
@Test public void Page_id() {fxt.Page().Revision_data().Id_(1); fxt.Test_parse_tmpl_str_test("{{PAGEID}}" , "{{test}}", "1");}
private final Xop_fxt fxt = new Xop_fxt();
@Before public void setup() {fxt.Reset(); fxt.Page().Db().Protection().User_(Bry_.new_a7("user")).Protection_level_(Bry_.new_a7("normal"));}
@Test public void Revision_id() {fxt.Page().Db().Page().Id_(1); fxt.Test_parse_tmpl_str_test("{{REVISIONID}}" , "{{test}}", "1");}
@Test public void Page_id() {fxt.Page().Db().Page().Id_(1); fxt.Test_parse_tmpl_str_test("{{PAGEID}}" , "{{test}}", "1");}
@Test public void Revision_user() {fxt.Test_parse_tmpl_str_test("{{REVISIONUSER}}" , "{{test}}", "user");}
@Test public void Page_size() {fxt.Test_parse_tmpl_str_test("{{PAGESIZE:Test page}}" , "{{test}}", "0");}
@Test public void Revision_size() {fxt.Test_parse_tmpl_str_test("{{REVISIONSIZE}}" , "{{test}}", "8");}
@Test public void Protection_level() {fxt.Test_parse_tmpl_str_test("{{PROTECTIONLEVEL}}" , "{{test}}", "normal");}
@Test public void Protection_expiry() {fxt.Test_parse_tmpl_str_test("{{PROTECTIONEXPIRY}}" , "{{test}}", "infinite");}
@Test public void PageSize_invalid_ttl() {
fxt.Init_log_(Xop_ttl_log.Invalid_char);
fxt.Test_parse_tmpl_str_test("{{PAGESIZE:{{{100}}}|R}}" , "{{test}}", "0");
}
@Test public void PageSize_invalid_ttl() {fxt.Test_parse_tmpl_str_test("{{PAGESIZE:{{{100}}}|R}}" , "{{test}}", "0");}
}

View File

@@ -164,52 +164,55 @@ public class Pft_fmt_itm_ {
// TODO_OLD: space; "
;
public static Pft_fmt_itm[] Parse(Xop_ctx ctx, byte[] fmt) {
Btrie_fast_mgr trie = Pft_fmt_itm_.Regy;
int i = 0, fmt_len = fmt.length;
fmt_itms.Clear(); int raw_bgn = String_.Pos_neg1; byte raw_byt = Byte_.Zero;
while (i < fmt_len) {
byte b = fmt[i];
Object o = trie.Match_bgn_w_byte(b, fmt, i, fmt_len);
if (o != null) {
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
fmt_itms.Add((Pft_fmt_itm)o);
i = trie.Match_pos();
}
else {
switch (b) {
case Byte_ascii.Backslash:
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
++i; // peek next char
if (i == fmt_len) // trailing backslash; add one; EX: "b\" -> "b\" not "b"
fmt_itms.Add(new Pft_fmt_itm_raw_byt(Byte_ascii.Backslash));
else
fmt_itms.Add(new Pft_fmt_itm_raw_byt(fmt[i]));
++i;
break;
case Byte_ascii.Quote:
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
++i; // skip quote_bgn
raw_bgn = i;
while (i < fmt_len) {
b = fmt[i];
if (b == Byte_ascii.Quote) {
break;
}
synchronized (fmt_itms) { // LOCK:static-obj; DATE:2016-07-06
Btrie_fast_mgr trie = Pft_fmt_itm_.Regy;
Btrie_rv trv = new Btrie_rv();
int i = 0, fmt_len = fmt.length;
fmt_itms.Clear(); int raw_bgn = String_.Pos_neg1; byte raw_byt = Byte_.Zero;
while (i < fmt_len) {
byte b = fmt[i];
Object o = trie.Match_at_w_b0(trv, b, fmt, i, fmt_len);
if (o != null) {
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
fmt_itms.Add((Pft_fmt_itm)o);
i = trv.Pos();
}
else {
switch (b) {
case Byte_ascii.Backslash:
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
++i; // peek next char
if (i == fmt_len) // trailing backslash; add one; EX: "b\" -> "b\" not "b"
fmt_itms.Add(new Pft_fmt_itm_raw_byt(Byte_ascii.Backslash));
else
++i;
}
fmt_itms.Add(i - raw_bgn == 0 ? new Pft_fmt_itm_raw_byt(Byte_ascii.Quote) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i));
raw_bgn = String_.Pos_neg1;
++i; // skip quote_end
break;
default:
if (raw_bgn == String_.Pos_neg1) {raw_bgn = i; raw_byt = b;}
i += gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(b);
break;
fmt_itms.Add(new Pft_fmt_itm_raw_byt(fmt[i]));
++i;
break;
case Byte_ascii.Quote:
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(i - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(raw_byt) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i)); raw_bgn = String_.Pos_neg1;}
++i; // skip quote_bgn
raw_bgn = i;
while (i < fmt_len) {
b = fmt[i];
if (b == Byte_ascii.Quote) {
break;
}
else
++i;
}
fmt_itms.Add(i - raw_bgn == 0 ? new Pft_fmt_itm_raw_byt(Byte_ascii.Quote) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, i));
raw_bgn = String_.Pos_neg1;
++i; // skip quote_end
break;
default:
if (raw_bgn == String_.Pos_neg1) {raw_bgn = i; raw_byt = b;}
i += gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(b);
break;
}
}
}
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(fmt_len - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(fmt[fmt_len - 1]) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, fmt_len)); raw_bgn = String_.Pos_neg1;}
return (Pft_fmt_itm[])fmt_itms.To_ary(Pft_fmt_itm.class);
}
if (raw_bgn != String_.Pos_neg1) {fmt_itms.Add(fmt_len - raw_bgn == 1 ? new Pft_fmt_itm_raw_byt(fmt[fmt_len - 1]) : (Pft_fmt_itm)new Pft_fmt_itm_raw_ary(fmt, raw_bgn, fmt_len)); raw_bgn = String_.Pos_neg1;}
return (Pft_fmt_itm[])fmt_itms.To_ary(Pft_fmt_itm.class);
} private static List_adp fmt_itms = List_adp_.New();
}

View File

@@ -28,7 +28,7 @@ public class Pft_func_date_int extends Pf_func_base {
switch (date_tid) {
case Date_tid_lcl: date = DateAdp_.Now(); break;
case Date_tid_utc: date = DateAdp_.Now().XtoUtc(); break;
case Date_tid_rev: date = ctx.Page().Revision_data().Modified_on(); break;
case Date_tid_rev: date = ctx.Page().Db().Page().Modified_on(); break;
default: throw Err_.new_unhandled(date_tid);
}
switch (id) {
@@ -87,7 +87,7 @@ public class Pft_func_date_int extends Pf_func_base {
}
}
public static final int Date_tid_utc = 0, Date_tid_lcl = 1, Date_tid_rev = 2;
public static final Pft_func_date_int
public static final Pft_func_date_int
Utc = new Pft_func_date_int(-1, Date_tid_utc)
, Lcl = new Pft_func_date_int(-1, Date_tid_lcl)
, Rev = new Pft_func_date_int(-1, Date_tid_rev);

View File

@@ -26,7 +26,7 @@ public class Pft_func_date_name extends Pf_func_base {
switch (date_tid) {
case Pft_func_date_int.Date_tid_lcl: date = DateAdp_.Now(); break;
case Pft_func_date_int.Date_tid_utc: date = DateAdp_.Now().XtoUtc(); break;
case Pft_func_date_int.Date_tid_rev: date = ctx.Page().Revision_data().Modified_on(); break;
case Pft_func_date_int.Date_tid_rev: date = ctx.Page().Db().Page().Modified_on(); break;
default: throw Err_.new_unhandled(date_tid);
}
byte[] val = ctx.Wiki().Msg_mgr().Val_by_id(base_idx + date.Segment(seg_idx));

View File

@@ -18,8 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.pfuncs.times; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
import org.junit.*;
public class Pft_func_date_rev_tst {
private final Xop_fxt fxt = new Xop_fxt();
@Before public void setup() {fxt.Reset(); fxt.Page().Revision_data().Modified_on_(DateAdp_.new_(2012, 1, 2, 3, 4, 5, 6));}
private final Xop_fxt fxt = new Xop_fxt();
@Before public void setup() {fxt.Reset(); fxt.Page().Db().Page().Modified_on_(DateAdp_.new_(2012, 1, 2, 3, 4, 5, 6));}
@After public void teardown() {}
@Test public void Rev_year() {fxt.Test_parse_tmpl_str_test("{{REVISIONYEAR}}" , "{{test}}", "2012");}
@Test public void Rev_month_int() {fxt.Test_parse_tmpl_str_test("{{REVISIONMONTH1}}" , "{{test}}", "1");}

View File

@@ -20,44 +20,48 @@ import gplx.xowa.langs.*;
public class Pft_func_formatdate_bldr {
public int Idx_cur() {return idx_cur;} private int idx_cur;
public Pft_func_formatdate_bldr Idx_nxt_(int v) {idx_nxt = v; return this;} private int idx_nxt;
public Pft_fmt_itm[] Fmt_itms() {return fmt_itms;} Pft_fmt_itm[] fmt_itms;
public Pft_fmt_itm[] Fmt_itms() {return fmt_itms;} private Pft_fmt_itm[] fmt_itms;
public void Format(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_fmt_itm fmt_itm) {
fmt_itm.Fmt(bfr, wiki, lang, date, this);
synchronized (this) { // LOCK:static-obj;Pft_func_formatdate.Date_bldr(); DATE:2016-07-07
fmt_itm.Fmt(bfr, wiki, lang, date, this);
}
}
public void Format(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, DateAdp date, Pft_fmt_itm[] fmt_itms) {
this.fmt_itms = fmt_itms;
int len = fmt_itms.length;
idx_cur = 0; idx_nxt = -1;
Pft_fmt_itm chained_fmt = null;
while (idx_cur < len) {
Pft_fmt_itm fmt_itm = fmt_itms[idx_cur];
if (fmt_itm.TypeId() == Pft_fmt_itm_.Tid_hebrew_numeral)
chained_fmt = fmt_itm;
else {
if (chained_fmt != null) {
Bry_bfr tmp_bfr = Xoa_app_.Utl__bfr_mkr().Get_b128();
synchronized (tmp_bfr) {
fmt_itm.Fmt(tmp_bfr, wiki, lang, date, this);
chained_fmt.Fmt(tmp_bfr, wiki, lang, date, this);
bfr.Add(tmp_bfr.To_bry_and_rls());
chained_fmt = null;
synchronized (this) { // LOCK:static-obj;Pft_func_formatdate.Date_bldr(); DATE:2016-07-07
this.fmt_itms = fmt_itms;
int len = fmt_itms.length;
idx_cur = 0; idx_nxt = -1;
Pft_fmt_itm chained_fmt = null;
while (idx_cur < len) {
Pft_fmt_itm fmt_itm = fmt_itms[idx_cur];
if (fmt_itm.TypeId() == Pft_fmt_itm_.Tid_hebrew_numeral)
chained_fmt = fmt_itm;
else {
if (chained_fmt != null) {
Bry_bfr tmp_bfr = Xoa_app_.Utl__bfr_mkr().Get_b128();
synchronized (tmp_bfr) {
fmt_itm.Fmt(tmp_bfr, wiki, lang, date, this);
chained_fmt.Fmt(tmp_bfr, wiki, lang, date, this);
bfr.Add(tmp_bfr.To_bry_and_rls());
chained_fmt = null;
}
}
else
fmt_itm.Fmt(bfr, wiki, lang, date, this);
}
if (idx_nxt == -1)
++idx_cur;
else {
idx_cur = idx_nxt;
idx_nxt = -1;
}
else
fmt_itm.Fmt(bfr, wiki, lang, date, this);
}
if (idx_nxt == -1)
++idx_cur;
else {
idx_cur = idx_nxt;
idx_nxt = -1;
}
}
if (chained_fmt != null) {
int year_int = bfr.To_int_and_clear(-1);
if (year_int != -1) { // handle no format; EX:{{#time:xh}} DATE:2014-07-20
date = DateAdp_.seg_(new int[] {year_int, date.Month(), date.Day(), date.Hour(), date.Minute(), date.Second(), date.Frac()});
chained_fmt.Fmt(bfr, wiki, lang, date, this);
if (chained_fmt != null) {
int year_int = bfr.To_int_and_clear(-1);
if (year_int != -1) { // handle no format; EX:{{#time:xh}} DATE:2014-07-20
date = DateAdp_.seg_(new int[] {year_int, date.Month(), date.Day(), date.Hour(), date.Minute(), date.Second(), date.Frac()});
chained_fmt.Fmt(bfr, wiki, lang, date, this);
}
}
}
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.pfuncs.times; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.pfuncs.*;
import org.junit.*; import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
public class Pft_func_time__basic__tst {
@Before public void init() {fxt.Reset(); Tfds.Now_set(DateAdp_.new_(2012, 1, 2, 3, 4, 5, 6));} private final Xop_fxt fxt = new Xop_fxt();
@Before public void init() {fxt.Reset(); Tfds.Now_set(DateAdp_.new_(2012, 1, 2, 3, 4, 5, 6));} private final Xop_fxt fxt = new Xop_fxt();
@After public void term() {Tfds.Now_enabled_n_();}
@Test public void Utc_date() {fxt.Test_parse_tmpl_str("{{#time:Y-m-d|2012-01-02 03:04:05}}" , "2012-01-02");}
@Test public void Utc_time() {fxt.Test_parse_tmpl_str("{{#time:h:i:s A|2012-01-02 03:04:05}}" , "03:04:05 AM");}

View File

@@ -23,8 +23,8 @@ interface Pxd_itm {
int Seg_idx();
int Eval_idx();
int Data_idx(); void Data_idx_(int v);
void Eval(Pxd_parser state);
void Time_ini(DateAdpBldr bldr);
boolean Eval(Pxd_parser state);
boolean Time_ini(DateAdpBldr bldr);
}
class Pxd_itm_ {
public static final int
@@ -60,6 +60,7 @@ class Pxd_itm_ {
int len = tkns.length;
for (int i = bgn; i < len; i++) {
Pxd_itm itm = tkns[i];
if (itm == null) return null; // PAGE:s.w:Synesthesia EX:"March 2006 [last update]"; DATE:2016-07-06
if (tid == itm.Tkn_tid()) return itm;
}
return null;
@@ -73,8 +74,8 @@ abstract class Pxd_itm_base implements Pxd_itm {
public void Seg_idx_(int v) {seg_idx = v;}
public int Data_idx() {return data_idx;} public void Data_idx_(int v) {data_idx = v;} private int data_idx;
public abstract int Eval_idx();
@gplx.Virtual public void Eval(Pxd_parser state) {}
@gplx.Virtual public void Time_ini(DateAdpBldr bldr) {}
@gplx.Virtual public boolean Eval(Pxd_parser state) {return true;}
@gplx.Virtual public boolean Time_ini(DateAdpBldr bldr) {return true;}
public void Ctor(int ary_idx) {this.ary_idx = ary_idx;}
public static final int Seg_idx_null = -1, Seg_idx_skip = -2;
}
@@ -91,7 +92,7 @@ class DateAdpBldr {
return DateAdp_.Now(); // not dirtied; default to now;
}
public DateAdpBldr Date_(DateAdp v) {date = v; return this;} DateAdp date = null;
public DateAdpBldr Seg_set(int idx, int val) {
public void Seg_set(int idx, int val) {
if (date == null) seg_ary[idx] = val;
else {
seg_ary = date.XtoSegAry();
@@ -99,7 +100,6 @@ class DateAdpBldr {
date = DateAdp_.seg_(seg_ary);
}
dirty = true;
return this;
}
public DateAdp Bld() {
return date == null ? DateAdp_.seg_(seg_ary) : date;
@@ -108,8 +108,8 @@ class DateAdpBldr {
int[] seg_ary = new int[DateAdp_.SegIdx__max]; boolean dirty = false;
}
class Pft_func_time_log {
private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "time_parser");
public static final Gfo_msg_itm
private static final Gfo_msg_grp owner = Gfo_msg_grp_.new_(Xoa_app_.Nde, "time_parser");
public static final Gfo_msg_itm
Invalid_day = Gfo_msg_itm_.new_warn_(owner, "Invalid day: ~{0}")
, Invalid_month = Gfo_msg_itm_.new_warn_(owner, "Invalid month: ~{0}")
, Invalid_year = Gfo_msg_itm_.new_warn_(owner, "Invalid year: ~{0}")

View File

@@ -43,16 +43,16 @@ class Pxd_itm_int extends Pxd_itm_base implements Pxd_itm_int_interface {
public boolean Val_is_adj() {return val_is_adj;} public void Val_is_adj_(boolean v) {val_is_adj = v;} private boolean val_is_adj;
public int Xto_int_or(int or) {return val;}
public int Digits() {return digits;} private int digits;
@Override public void Time_ini(DateAdpBldr bldr) {
@Override public boolean Time_ini(DateAdpBldr bldr) {
int seg_idx = this.Seg_idx();
if (seg_idx == Pxd_itm_base.Seg_idx_skip) return;
if (seg_idx == Pxd_itm_base.Seg_idx_skip) return true;
if (val_is_adj) {
if (val == 0) return; // no adjustment to make
if (val == 0) return true; // no adjustment to make
DateAdp date = bldr.Date();
switch (seg_idx) {
case DateAdp_.SegIdx_hour: date = date.Add_hour(val); break;
case DateAdp_.SegIdx_minute: date = date.Add_minute(val); break;
default: return;
default: return true;
}
bldr.Date_(date);
}
@@ -62,22 +62,25 @@ class Pxd_itm_int extends Pxd_itm_base implements Pxd_itm_int_interface {
switch (seg_idx) {
case DateAdp_.SegIdx_month: date = DateAdp_.seg_(new int[] {date.Year(), 1, date.Day(), date.Hour(), date.Minute(), date.Second(), date.Frac()}).Add_month(-1); bldr.Date_(date); break;
case DateAdp_.SegIdx_day: date = DateAdp_.seg_(new int[] {date.Year(), date.Month(), 1, date.Hour(), date.Minute(), date.Second(), date.Frac()}).Add_day(-1); bldr.Date_(date); break;
default: return;
default: return true;
}
}
else
else {
if (seg_idx == -1) return false; // PAGE:New_York_City EX: March 14, 2,013; DATE:2016-07-06
bldr.Seg_set(seg_idx, val);
}
}
return true;
}
@Override public void Eval(Pxd_parser tctx) {
@Override public boolean Eval(Pxd_parser tctx) {
int data_idx = this.Data_idx();
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return; // has seg_idx; already eval'd by something else
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return true; // has seg_idx; already eval'd by something else
switch (digits) {
case 5: // 5 digits
switch (data_idx) {
case 0: Pxd_eval_year.Eval_at_pos_0(tctx, this); break; // year at pos 0; EX: 01234-02-03
case 1: tctx.Err_set(Pft_func_time_log.Invalid_date); return; // year at pos 1; invalid; EX: 01-01234-02
case 2: tctx.Err_set(Pft_func_time_log.Invalid_date); break; // year at pos 2; invalid; EX: 01-02-01234
case 1: tctx.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_bry(tctx.Src())); return false; // year at pos 1; invalid; EX: 01-01234-02
case 2: tctx.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_bry(tctx.Src())); break; // year at pos 2; invalid; EX: 01-02-01234
}
val = 2000 + (val % 10); // NOTE: emulate PHP's incorrect behavior with 5 digit years; EX:ca.w:Nicolau_de_Mira; DATE:2014-04-18
tctx.Seg_idxs_(this, DateAdp_.SegIdx_year);
@@ -85,7 +88,7 @@ class Pxd_itm_int extends Pxd_itm_base implements Pxd_itm_int_interface {
case 4: // 4 digits; assume year
switch (data_idx) {
case 0: Pxd_eval_year.Eval_at_pos_0(tctx, this); break; // year at pos 0; EX: 2001-02-03
case 1: tctx.Err_set(Pft_func_time_log.Invalid_year_mid); return;// year at pos 1; invalid; EX: 02-2003-03
case 1: tctx.Err_set(Pft_func_time_log.Invalid_year_mid); return false;// year at pos 1; invalid; EX: 02-2003-03
case 2: Pxd_eval_year.Eval_at_pos_2(tctx, this); break; // year at pos 2; EX: 02-03-2001
default: Pxd_eval_year.Eval_at_pos_n(tctx, this); break; // year at pos n; EX: 04:05 02-03-2001
}
@@ -101,7 +104,7 @@ class Pxd_itm_int extends Pxd_itm_base implements Pxd_itm_int_interface {
&& rhs_itm != null && rhs_itm.Seg_idx() == DateAdp_.SegIdx_year // itm on right is year
&& tctx.Seg_idxs()[DateAdp_.SegIdx_day] == -1 // day not yet set; needed for {{#time:Y|July 28 - August 1, 1975}}
)
if (!Pxd_eval_seg.Eval_as_d(tctx, cur_itm)) return; // cur int should be day; EX:January 1, 2010; PAGE:en.w:Wikipedia:WikiProject_Maine/members; DATE:2014-06-25
if (!Pxd_eval_seg.Eval_as_d(tctx, cur_itm)) return true; // cur int should be day; EX:January 1, 2010; PAGE:en.w:Wikipedia:WikiProject_Maine/members; DATE:2014-06-25
if (val > Month_max) { // value is not a month; assume day; DATE:2013-03-15
switch (data_idx) {
case 0: // > 12 in slot 0
@@ -131,6 +134,7 @@ class Pxd_itm_int extends Pxd_itm_base implements Pxd_itm_int_interface {
}
break;
}
return true;
}
public static final int Month_max = 12;
private void Eval_unknown_at_pos_3(Pxd_parser tctx) { // int at pos 4
@@ -148,7 +152,8 @@ class Pxd_itm_int extends Pxd_itm_base implements Pxd_itm_int_interface {
int sym_idx = this.Ary_idx() + (fwd ? 1 : -1);
Pxd_itm[] sym_tkns = tctx.Tkns();
if (sym_idx < 0 || sym_idx > sym_tkns.length) return false; // NOTE: was Data_ary_len; DATE:2013-06-19
return sym_tkns[sym_idx].Tkn_tid() == sym_tid;
Pxd_itm sym_tkn = sym_tkns[sym_idx];
return sym_tkn == null ? false : sym_tkn.Tkn_tid() == sym_tid; // PAGE:s.w:Byzantine_Empire EX:285 DATE:2016-07-06
}
private void Eval_month_at_pos_0(Pxd_parser tctx) {
Pxd_itm[] data_ary = tctx.Data_ary();
@@ -249,6 +254,7 @@ class Pxd_itm_int_ {
}
for (int i = tkn_idx + adj; i != end; i += adj) {
Pxd_itm itm = tkns[i];
if (itm == null) return null; // PAGE:s.w:Leonid_Hurwicz EX:"1944, 2004, [[7 August]] [[2007]]"; DATE:2016-07-06
if (itm.Tkn_tid() == Pxd_itm_.Tid_int) {
Pxd_itm_int itm_int = (Pxd_itm_int)itm;
return itm_int.Seg_idx() == -1 ? itm_int : null;

View File

@@ -20,42 +20,43 @@ import gplx.core.brys.*;
class Pxd_itm_colon extends Pxd_itm_base {
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_colon;}
@Override public int Eval_idx() {return 20;}
@Override public void Eval(Pxd_parser state) {
@Override public boolean Eval(Pxd_parser state) {
int colon_count = ++state.Colon_count;
Pxd_itm[] tkns = state.Tkns();
Pxd_itm_int itm_int = null;
switch (colon_count) {
case 1: // hh:mm
itm_int = Pxd_itm_int_.GetNearest(tkns, this.Ary_idx(), Bool_.N);
if (itm_int == null) {state.Err_set(Pft_func_time_log.Invalid_hour, Bfr_arg_.New_bry("null")); return;}
if (!Pxd_eval_seg.Eval_as_h(state, itm_int)) return;
if (itm_int == null) {state.Err_set(Pft_func_time_log.Invalid_hour, Bfr_arg_.New_bry("null")); return false;}
if (!Pxd_eval_seg.Eval_as_h(state, itm_int)) return true;
itm_int = Pxd_itm_int_.GetNearest(tkns, this.Ary_idx(), true);
if (!Pxd_eval_seg.Eval_as_n(state, itm_int)) return;
if (!Pxd_eval_seg.Eval_as_n(state, itm_int)) return true;
break;
case 2: // :ss
itm_int = Pxd_itm_int_.GetNearest(tkns, this.Ary_idx(), true);
if (!Pxd_eval_seg.Eval_as_s(state, itm_int)) return;
if (!Pxd_eval_seg.Eval_as_s(state, itm_int)) return true;
break;
case 3: // +hh:mm; DATE:2014-08-26
itm_int = Pxd_itm_int_.GetNearest(tkns, this.Ary_idx(), Bool_.N);
if (itm_int == null) {state.Err_set(Pft_func_time_log.Invalid_timezone, Bfr_arg_.New_bry("null")); return;}
if (itm_int == null) {state.Err_set(Pft_func_time_log.Invalid_timezone, Bfr_arg_.New_bry("null")); return false;}
byte tz_positive_val = Pxd_eval_seg.Eval_as_tz_sym(state, tkns, itm_int);
if (tz_positive_val == Bool_.__byte) return;
if (tz_positive_val == Bool_.__byte) return true;
boolean tz_negative = tz_positive_val == Bool_.N_byte;
if (!Pxd_eval_seg.Eval_as_tz_h(state, itm_int, tz_negative)) return;
if (!Pxd_eval_seg.Eval_as_tz_h(state, itm_int, tz_negative)) return true;
itm_int = Pxd_itm_int_.GetNearest(tkns, this.Ary_idx(), Bool_.Y);
if (itm_int == null) {state.Err_set(Pft_func_time_log.Invalid_timezone, Bfr_arg_.New_bry("null")); return;}
if (itm_int == null) {state.Err_set(Pft_func_time_log.Invalid_timezone, Bfr_arg_.New_bry("null")); return false;}
if (tz_negative) itm_int.Val_(itm_int.Val() * -1);
if (!Pxd_eval_seg.Eval_as_tz_m(state, itm_int, tz_negative)) return;
if (!Pxd_eval_seg.Eval_as_tz_m(state, itm_int, tz_negative)) return true;
break;
}
return true;
}
public Pxd_itm_colon(int ary_idx) {this.Ctor(ary_idx);}
}
class Pxd_itm_null extends Pxd_itm_base {
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_null;}
@Override public int Eval_idx() {return 99;}
public static final Pxd_itm_null Instance = new Pxd_itm_null();
public static final Pxd_itm_null Instance = new Pxd_itm_null();
}
class Pxd_itm_dash extends Pxd_itm_base {
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_dash;}
@@ -80,7 +81,7 @@ class Pxd_itm_slash extends Pxd_itm_base {
class Pxd_itm_sym extends Pxd_itm_base {
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_sym;}
@Override public int Eval_idx() {return 99;}
@Override public void Time_ini(DateAdpBldr bldr) {}
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
public byte Sym_byte() {return sym_byte;} private byte sym_byte;
public Pxd_itm_sym(int ary_idx, byte val) {this.Ctor(ary_idx); this.sym_byte = val;}
}
@@ -89,8 +90,8 @@ class Pxd_itm_int_dmy_14 extends Pxd_itm_base implements Pxd_itm_int_interface {
public int Xto_int_or(int or) {return Bry_.To_int_or(src, or);}
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_int_dmy_14;}
@Override public int Eval_idx() {return eval_idx;} private int eval_idx = 20;
@Override public void Time_ini(DateAdpBldr bldr) {
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return; // has seg_idx; already eval'd by something else
@Override public boolean Time_ini(DateAdpBldr bldr) {
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return true; // has seg_idx; already eval'd by something else
bldr.Seg_set(DateAdp_.SegIdx_year , Bry_.To_int_or(src, 0, 4, 0));
bldr.Seg_set(DateAdp_.SegIdx_month , Bry_.To_int_or(src, 4, 6, 0));
if (digits > 6) {
@@ -104,6 +105,7 @@ class Pxd_itm_int_dmy_14 extends Pxd_itm_base implements Pxd_itm_int_interface {
}
}
}
return true;
}
}
class Pxd_itm_int_mhs_6 extends Pxd_itm_base implements Pxd_itm_int_interface {
@@ -111,11 +113,12 @@ class Pxd_itm_int_mhs_6 extends Pxd_itm_base implements Pxd_itm_int_interface {
public int Xto_int_or(int or) {return Bry_.To_int_or(src, or);}
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_int_hms_6;}
@Override public int Eval_idx() {return eval_idx;} private int eval_idx = 20;
@Override public void Time_ini(DateAdpBldr bldr) {
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return; // has seg_idx; already eval'd by something else
@Override public boolean Time_ini(DateAdpBldr bldr) {
if (this.Seg_idx() != Pxd_itm_base.Seg_idx_null) return true; // has seg_idx; already eval'd by something else
bldr.Seg_set(DateAdp_.SegIdx_hour , Bry_.To_int_or(src, 0, 2, 0));
bldr.Seg_set(DateAdp_.SegIdx_minute , Bry_.To_int_or(src, 2, 4, 0));
bldr.Seg_set(DateAdp_.SegIdx_second , Bry_.To_int_or(src, 4, 6, 0));
return true;
}
}
class Pxd_itm_sorter implements gplx.core.lists.ComparerAble {
@@ -124,7 +127,7 @@ class Pxd_itm_sorter implements gplx.core.lists.ComparerAble {
Pxd_itm rhs = (Pxd_itm)rhsObj;
return Int_.Compare(lhs.Eval_idx(), rhs.Eval_idx());
}
public static final Pxd_itm_sorter Instance = new Pxd_itm_sorter();
public static final Pxd_itm_sorter Instance = new Pxd_itm_sorter();
public static Pxd_itm[] XtoAryAndSort(Pxd_itm[] src, int src_len) {
Pxd_itm[] rv = new Pxd_itm[src_len];
for (int i = 0; i < src_len; i++)

View File

@@ -26,7 +26,7 @@ class Pxd_itm_month_name extends Pxd_itm_base implements Pxd_itm_prototype {
Pxd_itm_month_name rv = new Pxd_itm_month_name(ary_idx, name, this.Seg_idx(), seg_val);
return rv;
}
@Override public void Eval(Pxd_parser state) {
@Override public boolean Eval(Pxd_parser state) {
state.Seg_idxs_(this, this.Seg_idx(), seg_val);
switch (this.Data_idx()) {
case 0: Eval_month_0(state); break;
@@ -36,15 +36,19 @@ class Pxd_itm_month_name extends Pxd_itm_base implements Pxd_itm_prototype {
Pxd_itm[] data_ary = state.Data_ary();
int data_idx = this.Data_idx();
if (data_idx + 1 < data_ary.length) {
Pxd_itm_int itm_rhs = Pxd_itm_int_.CastOrNull(data_ary[data_idx + 1]);
Pxd_itm itm = data_ary[data_idx + 1];
if (itm == null) return false; // PAGE:s.w:Leonid_Hurwicz EX:1944, 2004, [[7 August]] [[2007]] DATE:2016-07-06
Pxd_itm_int itm_rhs = Pxd_itm_int_.CastOrNull(itm);
if (itm_rhs == null) return false; // PAGE:s.w:Leonid_Hurwicz EX:1944, 2004, [[7 August]] [[2007]] DATE:2016-07-06
if (itm_rhs.Digits() == 4) { // handle fmts of 1 January 2010
Eval_month_1(state);
return;
return true;
}
}
Eval_month_2(state);
break;
}
return true;
}
public void Eval_month_0(Pxd_parser state) {
Pxd_itm[] data_ary = state.Data_ary();
@@ -140,8 +144,9 @@ class Pxd_itm_month_name extends Pxd_itm_base implements Pxd_itm_prototype {
}
}
}
@Override public void Time_ini(DateAdpBldr bldr) {
@Override public boolean Time_ini(DateAdpBldr bldr) {
bldr.Seg_set(this.Seg_idx(), seg_val);
return true;
}
}
class Pxd_itm_unit extends Pxd_itm_base implements Pxd_itm_prototype {
@@ -157,11 +162,12 @@ class Pxd_itm_unit extends Pxd_itm_base implements Pxd_itm_prototype {
seg_val = v; seg_multiple = 1;
eval_done_by_relative = true;
} private boolean eval_done_by_relative;
@Override public void Eval(Pxd_parser state) {
if (eval_done_by_relative) return;
@Override public boolean Eval(Pxd_parser state) {
if (eval_done_by_relative) return true;
state.Seg_idxs_(this, this.Seg_idx(), seg_val);
Pxd_itm[] tkns = state.Tkns();
Pxd_itm_int itm_int = Pxd_itm_int_.GetNearest(tkns, this.Ary_idx(), false);
if (itm_int == null) return false; // PAGE:s.w:Crich_Tramway_Village EX:Yearly DATE:2016-07-06
state.Seg_idxs_(itm_int, Pxd_itm_base.Seg_idx_skip);
seg_val = itm_int.Val();
for (int i = itm_int.Ary_idx(); i > -1; i--) {
@@ -178,8 +184,9 @@ class Pxd_itm_unit extends Pxd_itm_base implements Pxd_itm_prototype {
break;
}
}
return true;
}
@Override public void Time_ini(DateAdpBldr bldr) {
@Override public boolean Time_ini(DateAdpBldr bldr) {
DateAdp cur = bldr.Date();
if (cur == null) cur = DateAdp_.Now();
int val = seg_val * seg_multiple;
@@ -193,15 +200,16 @@ class Pxd_itm_unit extends Pxd_itm_base implements Pxd_itm_prototype {
default: throw Err_.new_unhandled(this.Seg_idx());
}
bldr.Date_(cur);
return true;
}
}
class Pxd_itm_ago extends Pxd_itm_base implements Pxd_itm_prototype {
public Pxd_itm_ago(int ary_idx, int seg_idx) {Ctor(ary_idx); Seg_idx_(seg_idx);}
public byte[] Name() {return Name_ago;} public static final byte[] Name_ago = Bry_.new_a7("ago");
public byte[] Name() {return Name_ago;} public static final byte[] Name_ago = Bry_.new_a7("ago");
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_ago;}
@Override public int Eval_idx() {return 5;} // set to high priority so it can evaluate before unit_name
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_ago(ary_idx, this.Seg_idx());}
@Override public void Eval(Pxd_parser state) {
@Override public boolean Eval(Pxd_parser state) {
Pxd_itm[] tkns = state.Tkns();
int end = this.Ary_idx();
boolean unit_seen = false;
@@ -220,42 +228,43 @@ class Pxd_itm_ago extends Pxd_itm_base implements Pxd_itm_prototype {
default: break;
}
}
return true;
}
@Override public void Time_ini(DateAdpBldr bldr) {
}
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
}
class Pxd_itm_day_suffix extends Pxd_itm_base implements Pxd_itm_prototype {
public Pxd_itm_day_suffix(int ary_idx) {Ctor(ary_idx);}
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_day_suffix;}
@Override public int Eval_idx() {return 99;} // set to low priority so it can evaluate after day
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_day_suffix(ary_idx);}
@Override public void Eval(Pxd_parser state) {
@Override public boolean Eval(Pxd_parser state) {
Pxd_itm[] tkn_ary = state.Tkns();
int tkn_idx = this.Ary_idx();
if (tkn_idx == 0) state.Err_set(Pft_func_time_log.Invalid_day, Bfr_arg_.New_int(Int_.Min_value));
if (tkn_idx == 0) {state.Err_set(Pft_func_time_log.Invalid_day, Bfr_arg_.New_int(Int_.Min_value)); return false;} // PAGE:s.w:Aachen EX: "936" DATE:2016-07-06
Pxd_itm day_itm = tkn_ary[tkn_idx - 1];
if (day_itm.Seg_idx() != DateAdp_.SegIdx_day) {
state.Err_set(Pft_func_time_log.Invalid_day, Bfr_arg_.New_int(Int_.Min_value));
}
return true;
}
public static final Pxd_itm_day_suffix Instance = new Pxd_itm_day_suffix(); Pxd_itm_day_suffix() {}
public static final Pxd_itm_day_suffix Instance = new Pxd_itm_day_suffix(); Pxd_itm_day_suffix() {}
}
class Pxd_itm_day_relative extends Pxd_itm_base implements Pxd_itm_prototype {
public Pxd_itm_day_relative(int adj, int ary_idx) {Ctor(ary_idx); this.adj = adj;}
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_day_relative;}
@Override public int Eval_idx() {return 5;}
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_day_relative(adj, ary_idx);}
@Override public void Eval(Pxd_parser state) {
}
@Override public void Time_ini(DateAdpBldr bldr) {
@Override public boolean Eval(Pxd_parser state) {return true;}
@Override public boolean Time_ini(DateAdpBldr bldr) {
DateAdp date = DateAdp_.Now();
if (adj != 0) date = date.Add_day(adj);
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
bldr.Seg_set(DateAdp_.SegIdx_month , date.Month());
bldr.Seg_set(DateAdp_.SegIdx_day , date.Day());
return true;
}
public static final Pxd_itm_day_relative
public static final Pxd_itm_day_relative
Today = new Pxd_itm_day_relative(0)
, Tomorrow = new Pxd_itm_day_relative(1)
, Yesterday = new Pxd_itm_day_relative(-1)
@@ -267,9 +276,8 @@ class Pxd_itm_time_relative extends Pxd_itm_base implements Pxd_itm_prototype {
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_time_relative;}
@Override public int Eval_idx() {return 5;}
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_time_relative(ary_idx);}
@Override public void Eval(Pxd_parser state) {
}
@Override public void Time_ini(DateAdpBldr bldr) {
@Override public boolean Eval(Pxd_parser state) {return true;}
@Override public boolean Time_ini(DateAdpBldr bldr) {
DateAdp date = DateAdp_.Now();
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
bldr.Seg_set(DateAdp_.SegIdx_month , date.Month());
@@ -278,8 +286,9 @@ class Pxd_itm_time_relative extends Pxd_itm_base implements Pxd_itm_prototype {
bldr.Seg_set(DateAdp_.SegIdx_minute , date.Minute());
bldr.Seg_set(DateAdp_.SegIdx_second , date.Second());
bldr.Seg_set(DateAdp_.SegIdx_frac , date.Frac());
return true;
}
public static final Pxd_itm_time_relative
public static final Pxd_itm_time_relative
Now = new Pxd_itm_time_relative()
;
Pxd_itm_time_relative() {}
@@ -289,15 +298,16 @@ class Pxd_itm_unit_relative extends Pxd_itm_base implements Pxd_itm_prototype {
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_unit_relative;}
@Override public int Eval_idx() {return 5;}
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_unit_relative(adj, ary_idx);}
@Override public void Eval(Pxd_parser state) {
@Override public boolean Eval(Pxd_parser state) {
Pxd_itm itm = Pxd_itm_.Find_fwd_by_tid(state.Tkns(), this.Ary_idx() + 1, Pxd_itm_.Tid_unit);
if (itm == null) state.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_int(adj));
Pxd_itm_unit unit_tkn = (Pxd_itm_unit)itm;
if (unit_tkn == null) {state.Err_set(Pft_func_time_log.Invalid_date, Bfr_arg_.New_int(adj)); return false;} // PAGE:s.w:Synesthesia EX:"March 2006 [last update]"; DATE:2016-07-06
unit_tkn.Unit_seg_val_(adj);
return true;
}
@Override public void Time_ini(DateAdpBldr bldr) {
}
public static final Pxd_itm_unit_relative
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
public static final Pxd_itm_unit_relative
Next = new Pxd_itm_unit_relative(1)
, Prev = new Pxd_itm_unit_relative(-1)
, This = new Pxd_itm_unit_relative(0)
@@ -307,15 +317,16 @@ class Pxd_itm_unit_relative extends Pxd_itm_base implements Pxd_itm_prototype {
class Pxd_itm_unixtime extends Pxd_itm_base implements Pxd_itm_prototype {
private long unixtime;
public Pxd_itm_unixtime(int ary_idx, int seg_idx) {Ctor(ary_idx); Seg_idx_(seg_idx);}
public byte[] Name() {return Name_const;} public static final byte[] Name_const = Bry_.new_a7("@");
public byte[] Name() {return Name_const;} public static final byte[] Name_const = Bry_.new_a7("@");
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_unixtime;}
@Override public int Eval_idx() {return 5;} // set to high priority so it can evaluate number early
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_unixtime(ary_idx, this.Seg_idx());}
@Override public void Eval(Pxd_parser state) {
@Override public boolean Eval(Pxd_parser state) {
Pxd_itm[] tkns = state.Tkns();
unixtime = Pxd_itm_int_.Read_nearest_as_int_and_skip(state, tkns, this.Ary_idx(), true, Int_.Min_value);
return true;
}
@Override public void Time_ini(DateAdpBldr bldr) {
@Override public boolean Time_ini(DateAdpBldr bldr) {
DateAdp date = DateAdp_.unixtime_utc_seconds_(unixtime);
bldr.Seg_set(DateAdp_.SegIdx_year , date.Year());
bldr.Seg_set(DateAdp_.SegIdx_month , date.Month());
@@ -324,6 +335,7 @@ class Pxd_itm_unixtime extends Pxd_itm_base implements Pxd_itm_prototype {
bldr.Seg_set(DateAdp_.SegIdx_minute , date.Minute());
bldr.Seg_set(DateAdp_.SegIdx_second , date.Second());
bldr.Seg_set(DateAdp_.SegIdx_frac , date.Frac());
return true;
}
}
class Pxd_itm_dow_name extends Pxd_itm_base implements Pxd_itm_prototype {
@@ -333,31 +345,33 @@ class Pxd_itm_dow_name extends Pxd_itm_base implements Pxd_itm_prototype {
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_dow_name;}
@Override public int Eval_idx() {return 20;}
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_dow_name(ary_idx, dow_name, dow_idx);}
@Override public void Eval(Pxd_parser state) {
}
@Override public void Time_ini(DateAdpBldr bldr) {
@Override public boolean Eval(Pxd_parser state) {return true;}
@Override public boolean Time_ini(DateAdpBldr bldr) {
DateAdp now = DateAdp_.Now();
int adj = dow_idx - now.DayOfWeek(); // adj = requested_dow - current_dow; EX: requesting Friday, and today is Wednesday; adj = 2 (4 - 2); DATE:2014-05-02
if (adj < 0) adj += 7; // requested_down is before current_dow; add 7 to get the next day
bldr.Date_(bldr.Date().Add_day(adj));
return true;
}
}
class Pxd_itm_iso8601_t extends Pxd_itm_base implements Pxd_itm_prototype {
public Pxd_itm_iso8601_t(int ary_idx, int seg_idx) {Ctor(ary_idx); Seg_idx_(seg_idx);}
public byte[] Name() {return Name_const;} public static final byte[] Name_const = Bry_.new_a7("T");
public byte[] Name() {return Name_const;} public static final byte[] Name_const = Bry_.new_a7("T");
@Override public byte Tkn_tid() {return Pxd_itm_.Tid_iso8601_t;}
@Override public int Eval_idx() {return 99;} // evaluate last
public Pxd_itm MakeNew(int ary_idx) {return new Pxd_itm_iso8601_t(ary_idx, this.Seg_idx());}
@Override public void Eval(Pxd_parser state) {
@Override public boolean Eval(Pxd_parser state) {
Pxd_itm hour = Next_non_ws_tkn(state.Tkns(), this.Ary_idx() + 1);
if (hour != null && hour.Seg_idx() == DateAdp_.SegIdx_hour) return; // next item is hour
if (hour != null && hour.Seg_idx() == DateAdp_.SegIdx_hour) return true; // next item is hour
state.Err_set(Pft_func_time_log.Invalid_hour, Bfr_arg_.New_bry("T"));
return true;
}
@Override public void Time_ini(DateAdpBldr bldr) {}
@Override public boolean Time_ini(DateAdpBldr bldr) {return true;}
private static Pxd_itm Next_non_ws_tkn(Pxd_itm[] tkns, int bgn) {
int len = tkns.length;
for (int i = bgn; i < len; i++) {
Pxd_itm itm = tkns[i];
if (itm == null) return null; // PAGE:s.w:Christianity_and_alcohol EX:January 8 to January 14, 2001; DATE:2016-07-06
if (itm.Tkn_tid() != Pxd_itm_.Tid_ws) return itm;
}
return null;

View File

@@ -25,6 +25,7 @@ class Pxd_parser {
public int Data_ary_len() {return data_ary_len;} private int data_ary_len;
public int Colon_count;
public int[] Seg_idxs() {return seg_idxs;} private int[] seg_idxs = new int[DateAdp_.SegIdx__max]; // temp ary for storing current state
public byte[] Src() {return src;}
public boolean Seg_idxs_chk(int... ary) {
int len = ary.length;
for (int i = 0; i < len; i++)
@@ -43,8 +44,10 @@ class Pxd_parser {
fmtr.Bld_bfr(error_bfr, args);
} private Bry_bfr error_bfr = Bry_bfr_.New_w_size(32);
public DateAdp Parse(byte[] src, Bry_bfr error_bfr) {
Tokenize(src); // NOTE: should check if Tokenize failed, but want to be liberal as date parser is not fully implemented; this will always default to 1st day of year; DATE:2014-03-27
return Evaluate(src, error_bfr);
// synchronized (this) { // LOCK:static-obj; DATE:2016-07-06
Tokenize(src); // NOTE: should check if Tokenize failed, but want to be liberal as date parser is not fully implemented; this will always default to 1st day of year; DATE:2014-03-27
return Evaluate(src, error_bfr);
// }
}
private boolean Tokenize(byte[] src) {
this.src = src; src_len = src.length;
@@ -134,7 +137,10 @@ class Pxd_parser {
Pxd_itm[] eval_ary = Pxd_itm_sorter.XtoAryAndSort(tkns, tkns_len);
MakeDataAry();
for (int i = 0; i < tkns_len; i++) {
eval_ary[i].Eval(this);
if (!eval_ary[i].Eval(this)) {
error.Add_bfr_and_clear(error_bfr);
return DateAdp_.MinValue;
}
if (error_bfr.Len() != 0) {
error.Add_bfr_and_clear(error_bfr);
return DateAdp_.MinValue;
@@ -144,7 +150,10 @@ class Pxd_parser {
DateAdpBldr bldr = new DateAdpBldr(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0);
for (int i = 0; i < tkns_len; i++) {
Pxd_itm itm = (Pxd_itm)tkns[i];
itm.Time_ini(bldr);
if (!itm.Time_ini(bldr)) {
error.Add_str_a7("Invalid time");
return null;
}
}
return bldr.Bld();
}

View File

@@ -27,7 +27,7 @@ public class Pfunc_anchorencode extends Pf_func_base { // EX: {{anchorencode:a b
if (anchor_ctx != null) return;// NOTE: called by Scrib_uri
encode_trie.Add(Byte_ascii.Colon, Bfr_arg_.New_byte(Byte_ascii.Colon));
encode_trie.Add(Byte_ascii.Space, Bfr_arg_.New_byte(Byte_ascii.Underline));
anchor_ctx = Xop_ctx.new_sub_(ctx.Wiki());
anchor_ctx = Xop_ctx.new_sub_(ctx);
anchor_ctx.Para().Enabled_n_();
anchor_tkn_mkr = anchor_ctx.Tkn_mkr();
anchor_parser = ctx.Wiki().Parser_mgr().Anchor_encoder();

View File

@@ -30,7 +30,7 @@ public class Pfunc_filepath extends Pf_func_base {
byte[] val_ary = Eval_argx(ctx, src, caller, self); if (val_ary == Bry_.Empty) return;
Xowe_wiki wiki = ctx.Wiki();
Xoa_ttl ttl = wiki.Ttl_parse(Xow_ns_.Tid__file, val_ary); if (ttl == null) return; // text is not valid ttl; exit;
Xoae_page page = Load_page(wiki, ttl); if (page.Missing()) return; // page not found in wiki or commons; exit;
Xoae_page page = Load_page(wiki, ttl); if (page.Db().Page().Exists_n()) return; // page not found in wiki or commons; exit;
byte[] ttl_bry = page.Ttl().Page_url();
// Xof_orig_itm orig_itm = wiki.File_mgr().Orig_mgr().Find_by_ttl_or_null(ttl_bry);
@@ -50,11 +50,13 @@ public class Pfunc_filepath extends Pf_func_base {
private static final Xof_url_bldr url_bldr = new Xof_url_bldr();
private static Xoae_page Load_page(Xowe_wiki wiki, Xoa_ttl ttl) {
Xoae_page page = wiki.Data_mgr().Load_page_by_ttl(ttl);
if (page.Missing()) { // file not found in current wiki; try commons;
if (page.Db().Page().Exists_n()) { // file not found in current wiki; try commons;
Xowe_wiki commons_wiki = (Xowe_wiki)wiki.Appe().Wiki_mgr().Get_by_or_null(wiki.Commons_wiki_key());
if (commons_wiki != null) { // commons_wiki not installed; exit; DATE:2013-06-08
if (!Env_.Mode_testing()) commons_wiki.Init_assert();// must assert load else page_zip never detected; DATE:2013-03-10
page = commons_wiki.Data_mgr().Load_page_by_ttl(ttl);
synchronized (commons_wiki) { // LOCK:app-level; wiki.commons; DATE:2016-07-06
if (!Env_.Mode_testing()) commons_wiki.Init_assert();// must assert load else page_zip never detected; DATE:2013-03-10
page = commons_wiki.Data_mgr().Load_page_by_ttl(ttl);
}
}
}
return page;

View File

@@ -57,7 +57,6 @@ public class Pfunc_filepath_tst {
fxt.Test_parse_tmpl_str_test("{{filepath:B.png}}", "{{test}}", "");
}
@Test public void Invalid() { // PURPOSE: handle invalid ttls; EX:w:Germicidin
fxt.Init_log_(Xop_ttl_log.Invalid_char);
fxt.Test_parse_tmpl_str_test("{{filepath:{{{ImageFile}}}}}", "{{test}}", "");
}
// private static void Init_orig_mgr(Xow_wiki wiki) {

View File

@@ -38,7 +38,7 @@ public class Pfunc_rel2abs extends Pf_func_base {
}
public static boolean Rel2abs_ttl(byte[] ttl, int bgn, int end) {
int last = end - 1;
if (end - bgn > Xoa_ttl.Max_len) return false; // NOTE: some tmpls have long #if statements; quicker to fail here than wait for invalid char below
if (end - bgn > Ttl_max) return false; // NOTE: some tmpls have long #if statements; quicker to fail here than wait for invalid char below
boolean rv = false;
for (int i = bgn; i < end; ++i) {
switch (ttl[i]) {
@@ -165,7 +165,8 @@ public class Pfunc_rel2abs extends Pf_func_base {
}
return tmp_bfr.To_bry_and_clear();
}
private static int[] seg_ary = new int[Xoa_ttl.Max_len];
public static final int Ttl_max = 2048; // ASSUME: max len of 256 * 8 bytes
private static int[] seg_ary = new int[Ttl_max];
@Override public int Id() {return Xol_kwd_grp_.Id_xtn_rel2abs;}
@Override public Pf_func New(int id, byte[] name) {return new Pfunc_rel2abs().Name_(name);}
public static final int Id_null = 0, Id_slash = 1, Id_dot = 2, Id_dot_slash = 3, Id_dot_dot = 4, Id_dot_dot_slash = 5;

View File

@@ -25,7 +25,7 @@ public class Pfunc_titleparts extends Pf_func_base {
// get argx
int args_len = self.Args_len();
byte[] argx = Eval_argx(ctx, src, caller, self); if (argx == null) return; // no argx; return empty
Xoa_ttl argx_as_ttl = Xoa_ttl.new_(ctx.Wiki(), ctx.App().Msg_log_null(), argx, 0, argx.length); // transform to title in order to upper first, replace _, etc..
Xoa_ttl argx_as_ttl = Xoa_ttl.Parse(ctx.Wiki(), argx, 0, argx.length); // transform to title in order to upper first, replace _, etc..
if (argx_as_ttl == null) {bfr.Add(argx); return;} // NOTE: argx_as_ttl will be null if invalid, such as [[a|b]]; PAGE:en.w:owl and {{taxobox/showtaxon|Dinosauria}}
else argx = argx_as_ttl.Full_txt_w_ttl_case();
// get parts_len
@@ -48,30 +48,32 @@ public class Pfunc_titleparts extends Pf_func_base {
}
private byte[] TitleParts(byte[] src, int parts_len, int parts_bgn) {
// find dlm positions; EX: ab/cde/f/ will have -1,2,6,8
int src_len = src.length; int dlms_ary_len = 1; // 1 b/c dlms_ary[0] will always be -1
for (int i = 0; i < src_len; i++) {
if (src[i] == Byte_ascii.Slash) dlms_ary[dlms_ary_len++] = i;
synchronized (dlms_ary) {// LOCK:static-obj; DATE:2016-07-06
int src_len = src.length; int dlms_ary_len = 1; // 1 b/c dlms_ary[0] will always be -1
for (int i = 0; i < src_len; i++) {
if (src[i] == Byte_ascii.Slash) dlms_ary[dlms_ary_len++] = i;
}
dlms_ary[dlms_ary_len] = src_len; // put src_len into last dlms_ary; makes dlms_ary[] logic easier
// calc bgn_idx; must occur before adjust parts_len
int bgn_idx = parts_bgn > -1 ? parts_bgn : parts_bgn + dlms_ary_len; // negative parts_bgn means calc from end of dlms_ary_len; EX a/b/c|1|-1 means start from 2
if ( bgn_idx < 0 // bgn_idx can be negative when parts_len is negative and greater than array; EX: {{#titleparts:a/b|-1|-2}} results in dlms_ary_len of 1 and parts_bgn of -2 which will be parts_bgn of -1
|| bgn_idx > dlms_ary_len) return Bry_.Empty; // if bgn > len, return ""; EX: {{#titleparts:a/b|1|3}} should return ""
// adjust parts_len for negative/null
if (parts_len == Int_.Min_value) parts_len = dlms_ary_len; // no parts_len; default to dlms_ary_len
else if (parts_len < 0) { // neg parts_len; shorten parts now and default to rest of String; EX: a/b/c|-1 -> makes String a/b/c and get 2 parts
dlms_ary_len += parts_len;
parts_len = dlms_ary_len;
if (parts_len < 1) return Bry_.Empty; // NOTE: if zerod'd b/c of neg length, return empty; contrast with line below; EX: a/b/c|-4
}
if (parts_len == 0) return src; // if no dlms, return orig
// calc idxs for extraction
int bgn_pos = dlms_ary[bgn_idx] + 1; // +1 to start after slash
int end_idx = bgn_idx + parts_len;
int end_pos = end_idx > dlms_ary_len ? dlms_ary[dlms_ary_len] : dlms_ary[end_idx];
if (end_pos < bgn_pos) return Bry_.Empty;
return Bry_.Mid(src, bgn_pos, end_pos);
}
dlms_ary[dlms_ary_len] = src_len; // put src_len into last dlms_ary; makes dlms_ary[] logic easier
// calc bgn_idx; must occur before adjust parts_len
int bgn_idx = parts_bgn > -1 ? parts_bgn : parts_bgn + dlms_ary_len; // negative parts_bgn means calc from end of dlms_ary_len; EX a/b/c|1|-1 means start from 2
if ( bgn_idx < 0 // bgn_idx can be negative when parts_len is negative and greater than array; EX: {{#titleparts:a/b|-1|-2}} results in dlms_ary_len of 1 and parts_bgn of -2 which will be parts_bgn of -1
|| bgn_idx > dlms_ary_len) return Bry_.Empty; // if bgn > len, return ""; EX: {{#titleparts:a/b|1|3}} should return ""
// adjust parts_len for negative/null
if (parts_len == Int_.Min_value) parts_len = dlms_ary_len; // no parts_len; default to dlms_ary_len
else if (parts_len < 0) { // neg parts_len; shorten parts now and default to rest of String; EX: a/b/c|-1 -> makes String a/b/c and get 2 parts
dlms_ary_len += parts_len;
parts_len = dlms_ary_len;
if (parts_len < 1) return Bry_.Empty; // NOTE: if zerod'd b/c of neg length, return empty; contrast with line below; EX: a/b/c|-4
}
if (parts_len == 0) return src; // if no dlms, return orig
// calc idxs for extraction
int bgn_pos = dlms_ary[bgn_idx] + 1; // +1 to start after slash
int end_idx = bgn_idx + parts_len;
int end_pos = end_idx > dlms_ary_len ? dlms_ary[dlms_ary_len] : dlms_ary[end_idx];
if (end_pos < bgn_pos) return Bry_.Empty;
return Bry_.Mid(src, bgn_pos, end_pos);
} static int[] dlms_ary = new Int_ary_bldr(255).Set(0, -1).Xto_int_ary(); // set pos0 to -1; makes +1 logic easier
} private static final int[] dlms_ary = new Int_ary_bldr(255).Set(0, -1).Xto_int_ary(); // set pos0 to -1; makes +1 logic easier
@Override public int Id() {return Xol_kwd_grp_.Id_xtn_titleparts;}
@Override public Pf_func New(int id, byte[] name) {return new Pfunc_titleparts().Name_(name);}
}

View File

@@ -22,7 +22,7 @@ public class Pfunc_ttl extends Pf_func_base {
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) {
byte[] val_dat_ary = Eval_argx_or_null(ctx, src, caller, self, this.Name());
if (val_dat_ary == Bry_.Empty) return; // if argx is empty, return EX: {{PAGENAME:}}; DATE:2013-02-20
Xoa_ttl ttl = val_dat_ary == null ? ctx.Page().Ttl() : Xoa_ttl.parse(ctx.Wiki(), val_dat_ary);
Xoa_ttl ttl = val_dat_ary == null ? ctx.Page().Ttl() : Xoa_ttl.Parse(ctx.Wiki(), val_dat_ary);
if (ttl == null) return;
switch (id) {
case Xol_kwd_grp_.Id_ttl_page_txt: bfr.Add(ttl.Page_txt()); break;

View File

@@ -28,7 +28,7 @@ public class Pfunc_urlfunc extends Pf_func_base { // EX: {{lc:A}} -> a
}
public static void UrlString(Xop_ctx ctx, byte tid, boolean encode, byte[] src, Bry_bfr trg, byte[] qry_arg) {
Xowe_wiki wiki = ctx.Wiki();
Xoa_ttl ttl = Xoa_ttl.new_(wiki, ctx.Msg_log(), src, 0, src.length);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, src, 0, src.length);
if (ttl == null) return; // NOTE: guard against null ttl; EX: {{fullurl:{{transclude|{{{1}}}}}|action=edit}} -> {{fullurl:Template:{{{1}}}|action=edit}} -> Template:{{{1}}} will be a null ttl
byte[] ttl_ary = ttl.Full_url();// NOTE: Full_url does encoding; don't encode again
Xow_xwiki_itm xwiki = ttl.Wik_itm();

View File

@@ -22,7 +22,7 @@ public class Poem_xtn_mgr extends Xox_mgr_base {
@Override public Xox_mgr Xtn_clone_new() {return new Poem_xtn_mgr();}
public Xop_parser Parser() {return parser;} private Xop_parser parser;
@Override public void Xtn_init_by_wiki(Xowe_wiki wiki) {
parser = Xop_parser.new_(wiki, wiki.Parser_mgr().Main().Tmpl_lxr_mgr(), wiki.Parser_mgr().Main().Wtxt_lxr_mgr());
parser = Xop_parser.new_(wiki, Xop_lxr_mgr.new_tmpl_(), Xop_lxr_mgr.new_wiki_());
parser.Init_by_wiki(wiki);
parser.Init_by_lang(wiki.Lang());
}

View File

@@ -24,7 +24,7 @@ class Pp_index_parser {
byte[] src = wiki.Cache_mgr().Page_cache().Get_or_load_as_src(index_ttl);
if (src == null) return Pp_index_page.Null;
Xop_parser sub_parser = Xop_parser.new_(wiki, wiki.Parser_mgr().Main().Tmpl_lxr_mgr(), wiki.Parser_mgr().Main().Wtxt_lxr_mgr());
Xop_ctx sub_ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx);
Xop_tkn_mkr tkn_mkr = sub_ctx.Tkn_mkr();
Xop_root_tkn index_root = tkn_mkr.Root(src);
byte[] mid_text = sub_parser.Parse_text_to_wtxt(index_root, sub_ctx, tkn_mkr, src);
@@ -112,7 +112,7 @@ class Pp_index_page {
if (rv.Count() == 0) return Pp_pages_nde.Ttls_null;
return (Xoa_ttl[])rv.To_ary(Xoa_ttl.class);
}
private static Xoa_ttl new_ttl_(Xowe_wiki wiki, int ns_page_id, byte[] bry) {return bry == null ? Xoa_ttl.Null : Xoa_ttl.parse(wiki, ns_page_id, bry);}
private static Xoa_ttl new_ttl_(Xowe_wiki wiki, int ns_page_id, byte[] bry) {return bry == null ? Xoa_ttl.Null : Xoa_ttl.Parse(wiki, ns_page_id, bry);}
public static final Pp_index_page Null = new Pp_index_page();
}
class Pp_index_arg {

View File

@@ -92,7 +92,7 @@ public class Pp_pages_nde implements Xox_xnde, Mwh_atr_itm_owner1 {
if (cfg_pages.Init_needed()) cfg_pages.Init(wiki.Ns_mgr());
ns_index_id = cfg_pages.Ns_index_id(); if (ns_index_id == Int_.Min_value) return Fail_msg("wiki does not have an Index ns");
ns_page_id = cfg_pages.Ns_page_id(); if (ns_page_id == Int_.Min_value) return Fail_msg("wiki does not have a Page ns"); // occurs when <pages> used in a wiki without a "Page:" ns; EX: de.w:Help:Buchfunktion/Feedback
index_ttl = Xoa_ttl.parse(wiki, ns_index_id, index_ttl_bry); if (index_ttl == null) return Fail_args("index title is not valid: index={0}", String_.new_u8(index_ttl_bry));
index_ttl = Xoa_ttl.Parse(wiki, ns_index_id, index_ttl_bry); if (index_ttl == null) return Fail_args("index title is not valid: index={0}", String_.new_u8(index_ttl_bry));
ns_page = wiki.Ns_mgr().Ids_get_or_null(ns_page_id);
if (onlysection != null)
bgn_sect_bry = end_sect_bry = null;
@@ -269,7 +269,7 @@ public class Pp_pages_nde implements Xox_xnde, Mwh_atr_itm_owner1 {
int page_leaf_max = 0;
for (int i = 0; i < len; i++) {
Xowd_page_itm page = (Xowd_page_itm)rslt.Get_at(i);
Xoa_ttl page_ttl = Xoa_ttl.parse(wiki, ns_page_id, page.Ttl_page_db()); if (page_ttl == null) continue; // page_ttl is not valid; should never happen;
Xoa_ttl page_ttl = Xoa_ttl.Parse(wiki, ns_page_id, page.Ttl_page_db()); if (page_ttl == null) continue; // page_ttl is not valid; should never happen;
byte[] page_ttl_leaf = page_ttl.Leaf_txt(); if (page_ttl_leaf == null) continue; // page is not leaf; should not happen
int page_leaf_val = Bry_.To_int_or(page_ttl_leaf, Int_.Min_value); if (page_leaf_val == Int_.Min_value) continue; // leaf is not int; ignore
if (page_leaf_val > page_leaf_max) page_leaf_max = page_leaf_val;
@@ -307,7 +307,7 @@ public class Pp_pages_nde implements Xox_xnde, Mwh_atr_itm_owner1 {
.Add(index_ttl_bry) // EX: 'File.djvu'
.Add_byte(Byte_ascii.Slash) // EX: '/'
.Add_int_variable(page.Val()); // EX: '123'
rv[rv_idx++] = Xoa_ttl.parse(wiki, ttl_bfr.To_bry_and_clear());
rv[rv_idx++] = Xoa_ttl.Parse(wiki, ttl_bfr.To_bry_and_clear());
}
ttl_bfr.Mkr_rls();
return rv;

View File

@@ -60,7 +60,7 @@ class Articles_itm_fmtr implements gplx.core.brys.Bfr_arg {
int len = itms.Count();
for (int i = 0; i < len; i++) {
Articles_itm itm = (Articles_itm)itms.Get_at(i);
Xoa_ttl ttl = Xoa_ttl.parse(wiki, itm.Ttl()); if (ttl == null) continue;
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, itm.Ttl()); if (ttl == null) continue;
fmtr.Bld_bfr(bfr, ttl.Full_db(), itm.Text());
}
}

View File

@@ -57,7 +57,7 @@ class Sites_html_bldr_fxt {
}
private void Init_regy_mgr(String... ary) {xtn_mgr.Regy_mgr().Set_many(ary);}
public void Init_ttl(String lnki_ttl) {
Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.new_u8(lnki_ttl));
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.new_u8(lnki_ttl));
xtn_mgr.Regy_mgr().Match(page, ttl);
}
public void Test_bld(String expd) {

View File

@@ -177,9 +177,9 @@ public class Scrib_core {
func_rslt = engine.CallFunction(lib_mw.Mod().Fncs_get_id("executeFunction"), func_args); // call function now
String rslt = Scrib_kv_utl_.Val_to_str(func_rslt, 0); // rslt expects an array with 1 scalar value
bfr.Add_str_u8(rslt);
// byte[] rslt_bry = Bry_.new_u8(rslt); // CHART
// gplx.xowa.parsers.xndes.Xop_xnde_tkn.Hack_ctx = ctx;
// bfr.Add(rslt_bry);
//byte[] rslt_bry = Bry_.new_u8(rslt); // CHART
//gplx.xowa.parsers.xndes.Xop_xnde_tkn.Hack_ctx = ctx;
//bfr.Add(rslt_bry);
if (!Env_.Mode_testing())
engine.CleanupChunks(Keyval_.Ary(Keyval_.int_(proc.Id(), ""))); // cleanup chunk immediately; needed for heavy pages like en.d:water; DATE:2014-08-07
}
@@ -200,12 +200,6 @@ public class Scrib_core {
}
return rv;
}
public static Scrib_core Core() {return core;}
public static Scrib_core Core_new_(Xoae_app app, Xop_ctx ctx) {
core = new Scrib_core(app, ctx);
core_invalidate_when_page_changes = false;
return core;
} private static Scrib_core core;
public void Handle_error(String err, String traceback) {
String excerpt = "";
try {
@@ -215,20 +209,6 @@ public class Scrib_core {
} catch (Exception e) {Err_.Noop(e);}
throw Err_.new_wo_type(err, "ttl", page.Ttl().Page_db_as_str(), "excerpt", excerpt, "traceback", traceback);
}
public static void Core_invalidate_when_page_changes() {core_invalidate_when_page_changes = true;} private static boolean core_invalidate_when_page_changes;
public static void Core_page_changed(Xoae_page page) {
if ( core != null // core explicitly invalidated
|| core_invalidate_when_page_changes // core marked invalidated b/c of error in {{#invoke}} but won't be regen'd until page changes; invalidate now; PAGE:th.d:all; DATE:2014-10-03
) {
core_invalidate_when_page_changes = false;
if ( core != null // null check
&& Bry_.Eq(page.Wiki().Domain_bry(), core.Cur_wiki())) // current page is in same wiki as last page
core.When_page_changed(page);
else // current page is in different wiki
Core_invalidate(); // invalidate scrib engine; note that lua will cache chunks by Module name and two modules in two different wikis can have the same name, but different data: EX:Module:Citation/CS1/Configuration and enwiki / zhwiki; DATE:2014-03-21
}
}
public static void Core_invalidate() {if (core != null) core.Term(); core = null;}
public static final String Frame_key_module = "current", Frame_key_template = "parent";
public static final int Base_1 = 1;
public static final String Key_mw_interface = "mw_interface";

View File

@@ -22,13 +22,15 @@ public class Scrib_core_fxt {
public Scrib_core_fxt(Xop_fxt fxt) {
app = fxt.App();
wiki = fxt.Wiki();
core = Scrib_core.Core_new_(app, wiki.Parser_mgr().Ctx());
core = wiki.Parser_mgr().Scrib().Core_make(wiki.Parser_mgr().Ctx());
server = new Process_server_mock();
core.Interpreter().Server_(server);
}
public Scrib_core_fxt Clear() {
if (core == null) {
app = Xoa_app_fxt.Make__app__edit();
wiki = Xoa_app_fxt.Make__wiki__edit(app);
core = Scrib_core.Core_new_(app, wiki.Parser_mgr().Ctx());
core = wiki.Parser_mgr().Scrib().Core_make(wiki.Parser_mgr().Ctx());
server = new Process_server_mock();
core.Interpreter().Server_(server);
}

View File

@@ -0,0 +1,64 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.scribunto; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.xowa.parsers.*;
public class Scrib_core_mgr {
private static final List_adp cores = List_adp_.New();
public Scrib_core Core() {return core;} private Scrib_core core;
public Scrib_core Core_make(Xop_ctx ctx) {
core = new Scrib_core(ctx.App(), ctx);
core_invalidate_when_page_changes = false;
synchronized (cores) {
cores.Add(core);
}
return core;
}
public void Core_term() {
if (core != null) core.Term();
synchronized (cores) {
cores.Del(core);
}
core = null;
}
public void Core_invalidate_when_page_changes() {core_invalidate_when_page_changes = true;} private boolean core_invalidate_when_page_changes;
public void Core_page_changed(Xoae_page page) {
if ( core != null // core explicitly invalidated
|| core_invalidate_when_page_changes // core marked invalidated b/c of error in {{#invoke}} but won't be regen'd until page changes; invalidate now; PAGE:th.d:all; DATE:2014-10-03
) {
if ( core != null // null check
&& Bry_.Eq(page.Wiki().Domain_bry(), core.Cur_wiki()) // current page is in same wiki as last page
&& !core_invalidate_when_page_changes // if core_invalidate_when_page_changes, then must call Core_term
)
core.When_page_changed(page);
else // current page is in different wiki
Core_term(); // invalidate scrib engine; note that lua will cache chunks by Module name and two modules in two different wikis can have the same name, but different data: EX:Module:Citation/CS1/Configuration and enwiki / zhwiki; DATE:2014-03-21
core_invalidate_when_page_changes = false;
}
}
public static void Term_all() {
synchronized (cores) {
int cores_len = cores.Len();
for (int i = 0; i < cores_len; ++i) {
Scrib_core core = (Scrib_core)cores.Get_at(i);
core.Term();
}
cores.Clear();
}
}
}

View File

@@ -38,16 +38,19 @@ public class Scrib_invoke_func extends Pf_func_base {
log_time_bgn = Env_.TickCount();
if (!invoke_wkr.Eval_bgn(ctx.Page(), mod_name, fnc_name)) return;
}
Scrib_core core = Scrib_core.Core();
Scrib_core core = wiki.Parser_mgr().Scrib().Core();
if (core == null) {
core = Scrib_core.Core_new_(ctx.App(), ctx).Init();
core.When_page_changed(ctx.Page());
synchronized (this) {
core = wiki.Parser_mgr().Scrib().Core_make(ctx);
core.Init();
core.When_page_changed(ctx.Page());
}
}
byte[] mod_raw = null;
Scrib_lua_mod mod = core.Mods_get(mod_name);
if (mod == null) {
Xow_ns module_ns = wiki.Ns_mgr().Ids_get_or_null(Xow_ns_.Tid__module);
Xoa_ttl mod_ttl = Xoa_ttl.parse(wiki, Bry_.Add(module_ns.Name_db_w_colon(), mod_name));
Xoa_ttl mod_ttl = Xoa_ttl.Parse(wiki, Bry_.Add(module_ns.Name_db_w_colon(), mod_name));
mod_raw = wiki.Cache_mgr().Page_cache().Get_or_load_as_src(mod_ttl);
if (mod_raw == null) {Error(bfr, wiki.Msg_mgr(), Err_mod_missing); return;} // EX: "{{#invoke:missing_mod}}"
}
@@ -68,7 +71,7 @@ public class Scrib_invoke_func extends Pf_func_base {
|| err_filter_mgr.Count_eq_0( ) // err_filter_mgr exists, but no definitions
|| !err_filter_mgr.Match(String_.new_u8(mod_name), String_.new_u8(fnc_name), err.To_str__msg_only())) // NOTE: must be To_str__msg_only; err_filter_mgr has defintion and it doesn't match current; print warn; DATE:2015-07-24
ctx.App().Usr_dlg().Warn_many("", "", "invoke failed: ~{0} ~{1} ~{2}", ctx.Page().Ttl().Raw(), String_.new_u8(src, self.Src_bgn(), self.Src_end()), err.To_str__log());
Scrib_core.Core_invalidate_when_page_changes(); // NOTE: invalidate core when page changes, not for rest of page, else page with many errors will be very slow due to multiple invalidations; PAGE:th.d:all; DATE:2014-10-03
wiki.Parser_mgr().Scrib().Core_invalidate_when_page_changes(); // NOTE: invalidate core when page changes, not for rest of page, else page with many errors will be very slow due to multiple invalidations; PAGE:th.d:all; DATE:2014-10-03
}
}
public static void Error(Bry_bfr bfr, Xow_msg_mgr msg_mgr, Err err) {Error(bfr, msg_mgr, Err_.cast_or_make(err).To_str__top_wo_args());}// NOTE: must use "short" error message to show in wikitext; DATE:2015-07-27
@@ -76,6 +79,6 @@ public class Scrib_invoke_func extends Pf_func_base {
byte[] script_error_msg = msg_mgr.Val_by_id(Xol_msg_itm_.Id_scribunto_parser_error);
error_fmtr.Bld_bfr_many(bfr, script_error_msg, error);
}
private static final Bry_fmtr error_fmtr = Bry_fmtr.new_("<strong class=\"error\"><span class=\"scribunto-error\" id=\"mw-scribunto-error-0\">~{0}: ~{1}</span></strong>"); // NOTE: must be "error" not 'error'; iferror checks for quote not apos; DATE:2015-09-17
private static final Bry_fmtr error_fmtr = Bry_fmtr.new_("<strong class=\"error\"><span class=\"scribunto-error\" id=\"mw-scribunto-error-0\">~{0}: ~{1}</span></strong>"); // NOTE: must be "error" not 'error'; iferror checks for quote not apos; DATE:2015-09-17
public static final String Err_mod_missing = "No such module";
}

View File

@@ -25,7 +25,7 @@ public class Scrib_invoke_func_fxt {
public Scrib_core Core() {return core;}
public void Clear_for_invoke() {
fxt = new Xop_fxt(); // NOTE: don't try to cache fxt on func_fxt level; causes errors in Language_lib
core_fxt = new Scrib_core_fxt();
core_fxt = new Scrib_core_fxt(fxt);
core_fxt.Clear();
core_fxt.Init_lib_mw();
core = core_fxt.Core();

View File

@@ -17,26 +17,30 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.scribunto; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
public class Scrib_proc_mgr {
private Ordered_hash hash = Ordered_hash_.New();
private final Ordered_hash hash = Ordered_hash_.New();
public void Clear() {hash.Clear();}
public Scrib_proc Get_by_key(String key) {return (Scrib_proc)hash.Get_by(key);}
public Scrib_proc Get_at(int i) {return (Scrib_proc)hash.Get_at(i);}
public Scrib_proc Get_by_key(String key) {synchronized (hash) {return (Scrib_proc)hash.Get_by(key);}}
public Scrib_proc Get_at(int i) {synchronized (hash) {return (Scrib_proc)hash.Get_at(i);}}
public void Set(String key, Scrib_proc proc) {
hash.Add_if_dupe_use_nth(key, proc); // WORKAROUND: Add_if_dupe_use_nth b/c some libraries reuse proc name; EX: getGlobalSiteId is used by mw.wikibase.lua and mw.wikibase.entity.lua
// synchronized (hash) { // LOCK:DELETE; DATE:2016-07-06
hash.Add_if_dupe_use_nth(key, proc); // WORKAROUND: Add_if_dupe_use_nth b/c some libraries reuse proc name; EX: getGlobalSiteId is used by mw.wikibase.lua and mw.wikibase.entity.lua
// }
}
public Scrib_proc Set(Scrib_lib lib, String proc_name, int proc_id) {
Scrib_proc proc = new Scrib_proc(lib, proc_name, proc_id);
Set(proc.Proc_key(), proc);
return proc;
}
public int Len() {return hash.Count();}
public int Len() {synchronized (hash) {return hash.Count();}}
public void Init_by_lib(Scrib_lib lib, String[] proc_names) {
hash.Clear();
int len = proc_names.length;
for (int i = 0; i < len; i++) {
String proc_name = proc_names[i];
Scrib_proc proc = new Scrib_proc(lib, proc_name, i); // ASSUME: Proc_id consts matches order in which Init is called
hash.Add(proc_name, proc);
synchronized (hash) {
hash.Clear();
int len = proc_names.length;
for (int i = 0; i < len; i++) {
String proc_name = proc_names[i];
Scrib_proc proc = new Scrib_proc(lib, proc_name, i); // ASSUME: Proc_id consts matches order in which Init is called
hash.Add(proc_name, proc);
}
}
}
}

View File

@@ -26,7 +26,7 @@ public class Scrib_xtn_mgr extends Xox_mgr_base {
public byte Engine_type() {return engine_type;} private byte engine_type = Scrib_engine_type.Type_luaj;
public void Engine_type_(byte cmd) {
engine_type = cmd;
Scrib_core.Core_invalidate();
gplx.xowa.xtns.scribunto.Scrib_core_mgr.Term_all();
}
public int Lua_timeout() {return lua_timeout;} private int lua_timeout = 4000;
public int Lua_timeout_polling() {return lua_timeout_polling;} private int lua_timeout_polling = 1;
@@ -36,7 +36,7 @@ public class Scrib_xtn_mgr extends Xox_mgr_base {
public boolean Luaj_debug_enabled() {return luaj_debug_enabled;} private boolean luaj_debug_enabled;
public void Luaj_debug_enabled_(boolean v) {
this.luaj_debug_enabled = v;
Scrib_core.Core_invalidate(); // restart server in case luaj caches any debug data
gplx.xowa.xtns.scribunto.Scrib_core_mgr.Term_all();// restart server in case luaj caches any debug data
}
public Xop_log_invoke_wkr Invoke_wkr() {return invoke_wkr;} private Xop_log_invoke_wkr invoke_wkr;
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {

View File

@@ -19,15 +19,17 @@ package gplx.xowa.xtns.scribunto.engines.luaj; import gplx.*; import gplx.xowa.*
import org.luaj.vm2.*; import org.luaj.vm2.lib.*; import org.luaj.vm2.lib.jse.*;
import gplx.xowa.xtns.scribunto.engines.process.*;
public class Luaj_engine implements Scrib_engine {
private final Luaj_server_func_recv func_recv;
private final Luaj_server_func_dbg func_dbg;
private final Scrib_proc_mgr proc_mgr;
private final Scrib_core core;
private Luaj_server server;
private Scrib_proc_mgr proc_mgr;
private Scrib_core core;
public Luaj_engine(Xoae_app app, Scrib_core core, boolean debug_enabled) {
this.core = core;
server = new Luaj_server(core, debug_enabled);
proc_mgr = core.Proc_mgr();
Luaj_server_func_recv.Instance.Engine_(this);
Luaj_server_func_dbg.Instance.Core_(core);
this.proc_mgr = core.Proc_mgr();
this.func_recv = new Luaj_server_func_recv(this);
this.func_dbg = new Luaj_server_func_dbg(core);
this.server = new Luaj_server(func_recv, func_dbg);
}
public Scrib_server Server() {return server;} public void Server_(Scrib_server v) {server = (Luaj_server)v;}
public boolean Dbg_print() {return dbg_print;} public void Dbg_print_(boolean v) {dbg_print = v;} private boolean dbg_print;

View File

@@ -20,21 +20,26 @@ import gplx.core.envs.*;
import org.luaj.vm2.*; import org.luaj.vm2.lib.*; import org.luaj.vm2.lib.jse.*;
import gplx.xowa.xtns.scribunto.engines.process.*;
public class Luaj_server implements Scrib_server {
private final Luaj_server_func_recv func_recv;
private final Luaj_server_func_dbg func_dbg;
private LuaTable server;
public Luaj_server(Scrib_core core, boolean debug_enabled) {}
public static Globals Globals_singleton;
public Luaj_server(Luaj_server_func_recv func_recv, Luaj_server_func_dbg func_dbg) {
this.func_recv = func_recv;
this.func_dbg = func_dbg;
}
private Globals luaj_globals;
public void Init(String... init_args) {
Globals_singleton = JsePlatform.standardGlobals();
Globals_singleton.load(new DebugLib());
Globals_singleton.load(new MWClient());
Globals_singleton.set("dbg", Luaj_server_func_dbg.Instance);
luaj_globals = JsePlatform.standardGlobals();
luaj_globals.load(new DebugLib());
luaj_globals.load(new MWClient(luaj_globals, func_recv));
luaj_globals.set("dbg", func_dbg);
String root_str = init_args[2];
if (Op_sys.Cur().Tid_is_wnt())
root_str = String_.Replace(root_str, Op_sys.Wnt.Fsys_dir_spr_str(), Op_sys.Lnx.Fsys_dir_spr_str());
LuaValue main_fil_val = LuaValue.valueOf(root_str + "engines/Luaj/mw_main.lua");
LuaValue package_val = Globals_singleton.get("package");
LuaValue package_val = luaj_globals.get("package");
package_val.rawset("path", LuaValue.valueOf(root_str + "engines/Luaj/?.lua;" + root_str + "engines/LuaCommon/lualib/?.lua"));
server = (LuaTable)Globals_singleton.get("dofile").call(main_fil_val);
server = (LuaTable)luaj_globals.get("dofile").call(main_fil_val);
}
public LuaTable Dispatch(LuaTable msg) {
return (LuaTable)server.method(Val_server_recv, msg);
@@ -72,10 +77,16 @@ public class Luaj_server implements Scrib_server {
* @return Value that will be returned in the require() call. In this case,
* it is the library itself.
*/
private final Globals luaj_globals;
private final Luaj_server_func_recv func_recv;
public MWClient(Globals luaj_globals, Luaj_server_func_recv func_recv) {
this.luaj_globals = luaj_globals;
this.func_recv = func_recv;
}
public LuaValue call(LuaValue libname) {
LuaValue library = tableOf();
library.set("client_recv", Luaj_server_func_recv.Instance);
LuaValue env = gplx.xowa.xtns.scribunto.engines.luaj.Luaj_server.Globals_singleton;
library.set("client_recv", func_recv);
LuaValue env = luaj_globals;
env.set( "MWClient", library );
return library;
}

View File

@@ -22,8 +22,8 @@ import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import org.luaj.vm2.lib.VarArgFunction;
public class Luaj_server_func_dbg extends VarArgFunction {
private Scrib_core core;
public void Core_(Scrib_core v) {this.core = v;}
private final Scrib_core core;
public Luaj_server_func_dbg(Scrib_core v) {this.core = v;}
public Varargs invoke(Varargs args) {
int len = args.narg();
Bry_bfr bfr = Bry_bfr_.New();
@@ -36,5 +36,4 @@ public class Luaj_server_func_dbg extends VarArgFunction {
core.Page().Html_data().Xtn_scribunto_dbg_(bfr.To_bry_and_clear());
return NONE;
}
public static Luaj_server_func_dbg Instance = new Luaj_server_func_dbg();
}

View File

@@ -20,13 +20,12 @@ import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.OneArgFunction;
public class Luaj_server_func_recv extends OneArgFunction {
private Luaj_engine engine;
public void Engine_(Luaj_engine v) {this.engine = v;}
private final Luaj_engine engine;
public Luaj_server_func_recv(Luaj_engine v) {this.engine = v;}
public LuaValue call(LuaValue tbl_val) {
LuaTable tbl = (LuaTable)tbl_val;
String op = Luaj_value_.Get_val_as_str(tbl, "op");
if (!String_.Eq(op, "call")) throw Err_.new_wo_type("luaj_recvr only processes op calls");
return engine.Server_recv_call(tbl);
}
public static Luaj_server_func_recv Instance = new Luaj_server_func_recv();
}

View File

@@ -99,7 +99,7 @@ class Luaj_value_ {
else if (Object_.Eq(c, Long_.Cls_ref_type)) return LuaValue.valueOf((Long)o);
else if (Object_.Eq(c, Scrib_lua_proc.class)) return server.Get_closure_by_id(((Scrib_lua_proc)o).Id());
else if (Object_.Eq(c, Float_.Cls_ref_type)) return LuaValue.valueOf((Float)o);
else if (Object_.Eq(c, Char_.Cls_ref_type)) return LuaValue.valueOf((char)o);
else if (Object_.Eq(c, Char_.Cls_ref_type)) return LuaValue.valueOf((Character)o);
else if (Object_.Eq(c, Short_.Cls_ref_type)) return LuaValue.valueOf((Short)o);
else return LuaValue.NIL;
}

View File

@@ -27,7 +27,7 @@ public class Mock_scrib_fxt {
Xoae_app app = Xoa_app_fxt.Make__app__edit();
Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, domain, app.Lang_mgr().Get_by_or_new(Bry_.new_u8(lang)));
parser_fxt = new Xop_fxt(app, wiki); // NOTE: always new(); don't try to cache; causes errors in Language_lib
core = Scrib_core.Core_new_(app, wiki.Parser_mgr().Ctx());
core = wiki.Parser_mgr().Scrib().Core_make(wiki.Parser_mgr().Ctx());
core.Engine_(engine); engine.Clear();
core.Interpreter().Server_(server);
Xot_invk parent_frame = new Xot_invk_temp(true); parent_frame.Frame_tid_(Scrib_frame_.Tid_null);

View File

@@ -93,7 +93,7 @@ public class Scrib_lib_language implements Scrib_lib {
}
public boolean IsValidCode(Scrib_proc_args args, Scrib_proc_rslt rslt) { // REF.MW: Language.php!isValidCode
byte[] lang_code = args.Pull_bry(0);
boolean valid = Xoa_ttl.parse(core.Wiki(), lang_code) != null; // NOTE: MW calls Title::getTitleInvalidRegex()
boolean valid = Xoa_ttl.Parse(core.Wiki(), lang_code) != null; // NOTE: MW calls Title::getTitleInvalidRegex()
if (valid) {
int len = lang_code.length;
for (int i = 0; i < len; i++) {

View File

@@ -99,11 +99,11 @@ class Scrib_lib_message_data {
if (data_ttl == null)
ttl = ctx.Page().Ttl();
else
ttl = Xoa_ttl.parse(wiki, data_ttl);
ttl = Xoa_ttl.Parse(wiki, data_ttl);
}
if (raw_msg_key != null) {
Xol_msg_itm raw_msg_itm = new Xol_msg_itm(-1, Bry_.Empty);
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
Bry_bfr tmp_bfr = Bry_bfr_.New(); // wiki.Utl__bfr_mkr().Get_b512();
byte[] raw_msg_val = Xoa_gfs_php_mgr.Xto_gfs(tmp_bfr, raw_msg_key);
Xol_msg_itm_.update_val_(raw_msg_itm, raw_msg_val);
byte[] raw_msg_rv = wiki.Msg_mgr().Val_by_itm(tmp_bfr, raw_msg_itm, args);

View File

@@ -95,12 +95,12 @@ public class Scrib_lib_mw implements Scrib_lib {
String mod_code = fsys_mgr.Get_or_null(mod_name); // check if mod_name a file in /lualib/ directoryScribunto .lua file (in /lualib/)
if (mod_code != null)
return rslt.Init_obj(core.Interpreter().LoadString("@" + mod_name + ".lua", mod_code));
Xoa_ttl ttl = Xoa_ttl.parse(cur_wiki, Bry_.new_u8(mod_name));// NOTE: should have Module: prefix
Xoa_ttl ttl = Xoa_ttl.Parse(cur_wiki, Bry_.new_u8(mod_name));// NOTE: should have Module: prefix
if (ttl == null) return rslt.Init_ary_empty();
Xoae_page page = cur_wiki.Data_mgr().Load_page_by_ttl(ttl);
if (page.Missing()) return rslt.Init_ary_empty();
if (page.Db().Page().Exists_n()) return rslt.Init_ary_empty();
Scrib_lua_mod mod = new Scrib_lua_mod(core, mod_name);
return rslt.Init_obj(mod.LoadString(String_.new_u8(page.Data_raw())));
return rslt.Init_obj(mod.LoadString(String_.new_u8(page.Db().Text().Text_bry())));
}
public boolean LoadPHPLibrary(Scrib_proc_args args, Scrib_proc_rslt rslt) { // NOTE: noop; Scribunto uses this to load the Scribunto_*Library classses (EX: Scribunto_TitleLibrary); DATE:2015-01-21
return rslt.Init_obj(null);
@@ -224,7 +224,7 @@ public class Scrib_lib_mw implements Scrib_lib {
String text_str = args.Pull_str(1);
byte[] text_bry = Bry_.new_u8(text_str);
Xop_root_tkn tmp_root = ctx.Tkn_mkr().Root(text_bry);
Xop_ctx tmp_ctx = Xop_ctx.new_sub_(cur_wiki);
Xop_ctx tmp_ctx = Xop_ctx.new_sub_(core.Ctx());
int args_adj = Scrib_frame_.Get_arg_adj(frame_tid);
int args_len = frame.Args_len() - args_adj;
Keyval[] kv_args = new Keyval[args_len];
@@ -244,6 +244,7 @@ public class Scrib_lib_mw implements Scrib_lib {
tmp_root.Tmpl_evaluate(tmp_ctx, text_bry, mock_frame, tmp_bfr);
return rslt.Init_obj(tmp_bfr.To_str_and_rls());
}
private static final Xol_func_itm finder = new Xol_func_itm();
public boolean CallParserFunction(Scrib_proc_args args, Scrib_proc_rslt rslt) {
String frame_id = args.Pull_str(0);
int frame_tid = Scrib_frame_.Get_frame_tid(frame_id);
@@ -254,11 +255,17 @@ public class Scrib_lib_mw implements Scrib_lib {
Bry_obj_ref fnc_name_ref = Bry_obj_ref.New(fnc_name);
Keyval[] parser_func_args = CallParserFunction_parse_args(cur_wiki.Appe().Utl_num_parser(), argx_ref, fnc_name_ref, args.Ary());
Xot_invk_mock frame = Xot_invk_mock.new_(parent_frame.Defn_tid(), 0, fnc_name, parser_func_args); // pass something as frame_ttl; choosng fnc_name; DATE:2014-09-21
Xol_func_itm finder = cur_wiki.Lang().Func_regy().Find_defn(fnc_name, 0, fnc_name_len);
Xot_defn defn = finder.Func();
Xot_defn defn;
synchronized (finder) {
cur_wiki.Lang().Func_regy().Find_defn(finder, fnc_name, 0, fnc_name_len);
defn = finder.Func();
}
if (defn == Xot_defn_.Null) throw Err_.new_wo_type("callParserFunction: function was not found", "function", String_.new_u8(fnc_name));
Bry_bfr bfr = cur_wiki.Utl__bfr_mkr().Get_k004();
Xop_ctx fnc_ctx = Xop_ctx.new_sub_(cur_wiki);
Xop_ctx fnc_ctx = Xop_ctx.new_sub_(core.Ctx());
fnc_ctx.Parse_tid_(Xop_parser_.Parse_tid_page_tmpl); // default xnde names to template; needed for test, but should be in place; DATE:2014-06-27
Xot_invk_tkn.Eval_func(fnc_ctx, src, parent_frame, frame, bfr, defn, argx_ref.Val());
bfr.Mkr_rls();
@@ -302,10 +309,10 @@ public class Scrib_lib_mw implements Scrib_lib {
public boolean ExpandTemplate(Scrib_proc_args args, Scrib_proc_rslt rslt) {
String ttl_str = args.Pull_str(1);
byte[] ttl_bry = Bry_.new_u8(ttl_str);
Xoa_ttl ttl = Xoa_ttl.parse(cur_wiki, ttl_bry); // parse directly; handles titles where template is already part of title; EX: "Template:A"
Xoa_ttl ttl = Xoa_ttl.Parse(cur_wiki, ttl_bry); // parse directly; handles titles where template is already part of title; EX: "Template:A"
if (ttl == null) return rslt.Init_ary_empty(); // invalid ttl;
if (!ttl.ForceLiteralLink() && ttl.Ns().Id_is_main()) // title is not literal and is not prefixed with Template; parse again as template; EX: ":A" and "Template:A" are fine; "A" is parsed again as "Template:A"
ttl = Xoa_ttl.parse(cur_wiki, Bry_.Add(cur_wiki.Ns_mgr().Ns_template().Name_db_w_colon(), ttl_bry)); // parse again, but add "Template:"
ttl = Xoa_ttl.Parse(cur_wiki, Bry_.Add(cur_wiki.Ns_mgr().Ns_template().Name_db_w_colon(), ttl_bry)); // parse again, but add "Template:"
Keyval[] args_ary = args.Pull_kv_ary_safe(2);
// BLOCK.bgn:Xot_invk_tkn.Transclude; cannot reuse b/c Transclude needs invk_tkn, and invk_tkn is manufactured late; DATE:2014-01-02
byte[] sub_src = null;
@@ -351,10 +358,10 @@ public class Scrib_lib_mw implements Scrib_lib {
Xoa_ttl ttl = null;
if (Type_adp_.ClassOf_obj(ttl_obj) != String.class) { // title = false
byte[] ttl_bry = frame.Frame_ttl();
ttl = Xoa_ttl.parse(core.Wiki(), ttl_bry);
ttl = Xoa_ttl.Parse(core.Wiki(), ttl_bry);
}
else {
ttl = Xoa_ttl.parse(cur_wiki, Bry_.new_u8((String)ttl_obj));
ttl = Xoa_ttl.Parse(cur_wiki, Bry_.new_u8((String)ttl_obj));
if (ttl == null) throw Err_.new_wo_type("newChild: invalid title", "title", (String)ttl_obj);
}
Keyval[] args_ary = args.Pull_kv_ary_safe(2);

View File

@@ -70,13 +70,11 @@ public class Scrib_lib_site implements Scrib_lib {
}
else {
int rv_count = 0;
switch (ctg_type) {
case "all": rv_count = ctg_itm.All; break;
case "pages": rv_count = ctg_itm.Pages; break;
case "subcats": rv_count = ctg_itm.Subcs; break;
case "files": rv_count = ctg_itm.Files; break;
default: throw Scrib_err.Make__err__arg(Invk_pagesInCategory, 2, ctg_type, "one of '*', 'all', 'pages', 'subcats', or 'files'");
}
if (String_.Eq(ctg_type, "all")) rv_count = ctg_itm.All;
else if (String_.Eq(ctg_type, "pages")) rv_count = ctg_itm.Pages;
else if (String_.Eq(ctg_type, "subcats")) rv_count = ctg_itm.Subcs;
else if (String_.Eq(ctg_type, "files")) rv_count = ctg_itm.Files;
else throw Scrib_err.Make__err__arg(Invk_pagesInCategory, 2, ctg_type, "one of '*', 'all', 'pages', 'subcats', or 'files'");
return rslt.Init_obj(rv_count);
}
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*;
import gplx.langs.jsons.*;
class Scrib_lib_text__json_util {
private final Json_wtr wtr = new Json_wtr();
private final Json_wtr wtr = new Json_wtr();
public void Reindex_arrays(Scrib_lib_text__reindex_data rv, Keyval[] kv_ary, boolean is_encoding) {
int next = 0;
if (is_encoding) {
@@ -112,10 +112,10 @@ class Scrib_lib_text__json_util {
}
private Object Decode_ary(Json_ary ary) {
int len = ary.Len();
Object rv = Array_.Create(Object.class, len);
Object[] rv = new Object[len];
for (int i = 0; i < len; ++i) {
Json_itm itm = ary.Get_at(i);
Array_.Set_at(rv, i, Decode_obj(itm));
rv[i] = Decode_obj(itm);
}
return rv;
}
@@ -200,7 +200,7 @@ class KeyVal__sorter__key_is_numeric implements gplx.core.lists.ComparerAble {
int rhs_int = Int_.parse_or(rhs_itm.Key(), Int_.Min_value);
return CompareAble_.Compare(lhs_int, rhs_int);
}
public static final KeyVal__sorter__key_is_numeric Instance = new KeyVal__sorter__key_is_numeric(); KeyVal__sorter__key_is_numeric() {}
public static final KeyVal__sorter__key_is_numeric Instance = new KeyVal__sorter__key_is_numeric(); KeyVal__sorter__key_is_numeric() {}
}
class Scrib_lib_text__reindex_data {
public boolean Rv_is_kvy() {return rv_is_kvy;} private boolean rv_is_kvy;

View File

@@ -69,7 +69,7 @@ public class Scrib_lib_title implements Scrib_lib {
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
ttl_bry = bfr.Add(ns_bry).Add_byte(Byte_ascii.Colon).Add(ttl_bry).To_bry_and_rls();
}
Xoa_ttl ttl = Xoa_ttl.parse(core.Wiki(), ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(core.Wiki(), ttl_bry);
if (ttl == null) return rslt.Init_obj(null); // invalid title; exit; matches MW logic
return rslt.Init_obj(GetInexpensiveTitleData(ttl));
}
@@ -83,7 +83,7 @@ public class Scrib_lib_title implements Scrib_lib {
byte url_func_tid = ((Byte_obj_val)url_func_obj).Val();
byte[] qry_bry = args.Extract_qry_args(wiki, 2);
// byte[] proto = Scrib_kv_utl_.Val_to_bry_or(values, 3, null); // NOTE: Scribunto has more conditional logic around argument 2 and setting protocols; DATE:2014-07-07
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
Bry_bfr bfr = wiki.Appe().Utl__bfr_mkr().Get_b512();
//if (url_func_tid == Pfunc_urlfunc.Tid_full) {
// if (proto == null) proto = Proto_relative;
@@ -124,13 +124,13 @@ public class Scrib_lib_title implements Scrib_lib {
tmp_bfr.Add(ns_bry).Add_byte(Byte_ascii.Colon);
tmp_bfr.Add_str_u8(ttl_str);
if (anchor_str != null) tmp_bfr.Add_byte(Byte_ascii.Hash).Add_str_u8(anchor_str);
Xoa_ttl ttl = Xoa_ttl.parse(wiki, tmp_bfr.To_bry_and_rls());
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, tmp_bfr.To_bry_and_rls());
if (ttl == null) return rslt.Init_obj(null); // invalid title; exit;
return rslt.Init_obj(GetInexpensiveTitleData(ttl));
}
public boolean GetExpensiveData(Scrib_proc_args args, Scrib_proc_rslt rslt) {
byte[] ttl_bry = args.Pull_bry(0);
Xoa_ttl ttl = Xoa_ttl.parse(core.Wiki(), ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(core.Wiki(), ttl_bry);
if (ttl == Xoa_ttl.Null) return rslt.Init_null();
// TODO_OLD: MW does extra logic here to cache ttl in ttl cache to avoid extra title lookups
boolean ttl_exists = false, ttl_redirect = false; int ttl_id = 0;
@@ -151,11 +151,11 @@ public class Scrib_lib_title implements Scrib_lib {
public boolean GetFileInfo(Scrib_proc_args args, Scrib_proc_rslt rslt) {
byte[] ttl_bry = args.Pull_bry(0);
Xowe_wiki wiki = core.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
if ( ttl == null
|| !ttl.Ns().Id_is_file_or_media()
) return rslt.Init_obj(GetFileInfo_absent);
if (ttl.Ns().Id_is_media()) ttl = Xoa_ttl.parse(wiki, Xow_ns_.Tid__file, ttl.Page_db()); // if [[Media:]] change to [[File:]]; theoretically, this should be changed in Get_page, but not sure if I want to put this logic that low; DATE:2014-01-07
if (ttl.Ns().Id_is_media()) ttl = Xoa_ttl.Parse(wiki, Xow_ns_.Tid__file, ttl.Page_db()); // if [[Media:]] change to [[File:]]; theoretically, this should be changed in Get_page, but not sure if I want to put this logic that low; DATE:2014-01-07
// Xoae_page file_page = Pfunc_filepath.Load_page(wiki, ttl); // EXPENSIVE
// boolean exists = !file_page.Missing();
// if (!exists) return rslt.Init_obj(Keyval_.Ary(Keyval_.new_("exists", false))); // NOTE: do not reinstate; will exit early if commons is not installed; DATE:2015-01-25; NOTE: Media objects are often flagged as absent in offline mode
@@ -175,7 +175,7 @@ public class Scrib_lib_title implements Scrib_lib {
public boolean GetContent(Scrib_proc_args args, Scrib_proc_rslt rslt) {
byte[] ttl_bry = args.Pull_bry(0);
Xowe_wiki wiki = core.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
Xow_page_cache_itm page_itm = wiki.Cache_mgr().Page_cache().Get_or_load_as_itm_2(ttl);
byte[] rv = null;
if (page_itm != null) {
@@ -195,13 +195,13 @@ public class Scrib_lib_title implements Scrib_lib {
public boolean ProtectionLevels(Scrib_proc_args args, Scrib_proc_rslt rslt) {
// byte[] ttl_bry = args.Pull_bry(0);
// Xowe_wiki wiki = core.Wiki();
// Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
// Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
return rslt.Init_many_objs(""); // NOTE: always return no protection; protectionLevels are stored in different table which is currently not mirrored; DATE:2014-04-09
}
public boolean CascadingProtection(Scrib_proc_args args, Scrib_proc_rslt rslt) {
byte[] ttl_bry = args.Pull_bry(0);
Xowe_wiki wiki = core.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry); if (ttl == null) return rslt.Init_obj(null);
return rslt.Init_obj(CascadingProtection_rv);
}
public static final Keyval[] CascadingProtection_rv = Keyval_.Ary(Keyval_.new_("sources", Bool_.N), Keyval_.new_("restrictions", Keyval_.Ary_empty));

View File

@@ -53,7 +53,6 @@ public class Scrib_lib_title_tst {
fxt.Test__proc__objs__nest(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "A", "b") , ttl_fast(10, "Template", "A", "b"));
fxt.Parser_fxt().Wiki().Xwiki_mgr().Add_by_atrs("fr", "fr.wikipedia.org");
fxt.Test__proc__objs__nest(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "A", "b", "fr") , ttl_fast(0, "", "Template:A", "b", "fr"));
fxt.Parser_fxt().Init_log_(gplx.xowa.wikis.ttls.Xop_ttl_log.Invalid_char);
fxt.Test__proc__objs__nest(lib, Scrib_lib_title.Invk_makeTitle, Object_.Ary("Template", "a[b"), Scrib_invoke_func_fxt.Null_rslt_ary); // PURPOSE: handle bad MakeTitle cmds; PAGE:en.w:Disney; DATE:2013-10-15
}
@Test public void GetExpensiveData_absent() {

View File

@@ -43,7 +43,7 @@ public class Scrib_lib_uri implements Scrib_lib {
}
private static final int Proc_anchorEncode = 0, Proc_localUrl = 1, Proc_fullUrl = 2, Proc_canonicalUrl = 3, Proc_init_uri_for_page = 4;
public static final String Invk_anchorEncode = "anchorEncode", Invk_localUrl = "localUrl", Invk_fullUrl = "fullUrl", Invk_canonicalUrl = "canonicalUrl", Invk_init_uri_for_page = "init_uri_for_page";
private static final String[] Proc_names = String_.Ary(Invk_anchorEncode, Invk_localUrl, Invk_fullUrl, Invk_canonicalUrl, Invk_init_uri_for_page);
private static final String[] Proc_names = String_.Ary(Invk_anchorEncode, Invk_localUrl, Invk_fullUrl, Invk_canonicalUrl, Invk_init_uri_for_page);
public boolean AnchorEncode(Scrib_proc_args args, Scrib_proc_rslt rslt) {
byte[] raw_bry = args.Pull_bry(0);
Bry_bfr bfr = core.App().Utl__bfr_mkr().Get_b512();
@@ -57,7 +57,7 @@ public class Scrib_lib_uri implements Scrib_lib {
Xowe_wiki wiki = core.Wiki();
byte[] ttl_bry = args.Pull_bry(0);
byte[] qry_bry = args.Extract_qry_args(wiki, 1);
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
if (ttl == null) return rslt.Init_null();
Bry_bfr bfr = core.App().Utl__bfr_mkr().Get_b512();
if (ttl.Ns().Id() == Xow_ns_.Tid__media) { // change "Media:" -> "File:"

View File

@@ -65,7 +65,7 @@ public class Scrib_lib_wikibase implements Scrib_lib {
public boolean GetEntityId(Scrib_proc_args args, Scrib_proc_rslt rslt) {
byte[] ttl_bry = args.Pull_bry(0);
Xowe_wiki wiki = core.Wiki();
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
byte[] rv = wiki.Appe().Wiki_mgr().Wdata_mgr().Qid_mgr.Get_or_null(wiki, ttl); if (rv == null) rv = Bry_.Empty;
return rslt.Init_obj(rv);
}

View File

@@ -191,7 +191,7 @@ public class Scrib_lib_wikibase_srl_tst {
, " numeric-id:'3'"
, " property:'P2'"
, " snaktype:'value'"
, " datatype:'wikibase-entityid'"
, " datatype:'wikibase-item'"
, " rank:'normal'"
, " type:'statement'"
, ""
@@ -212,7 +212,7 @@ public class Scrib_lib_wikibase_srl_tst {
, " numeric-id:'3'"
, " property:'P2'"
, " snaktype:'value'"
, " datatype:'wikibase-entityid'"
, " datatype:'wikibase-item'"
, " rank:'normal'"
, " type:'statement'"
, " p2:"
@@ -226,7 +226,7 @@ public class Scrib_lib_wikibase_srl_tst {
, " numeric-id:'3'"
, " property:'P2'"
, " snaktype:'value'"
, " datatype:'wikibase-entityid'"
, " datatype:'wikibase-item'"
, " rank:'normal'"
, " type:'statement'"
, ""

View File

@@ -20,7 +20,7 @@ import org.junit.*;
public class Xow_wiki_tst {
@Before public void init() {fxt.Clear();} private Xow_wiki_fxt fxt = new Xow_wiki_fxt();
@Test public void Load_page_and_parse() { // PURPOSE.fix: unknown page causes null reference error in scribunto; DATE:2013-08-27
Scrib_core.Core_new_(fxt.Fxt().App(), fxt.Fxt().Ctx());
fxt.Fxt().Wiki().Parser_mgr().Scrib().Core_make(fxt.Fxt().Ctx());
fxt.Test_getPageByTtl("Does_not_exist", null);
}
}
@@ -32,10 +32,10 @@ class Xow_wiki_fxt {
public void Test_getPageByTtl(String ttl_str, String expd) {
Xowe_wiki wiki = fxt.Wiki();
byte[] ttl_bry = Bry_.new_a7(ttl_str);
Xoa_url url = Xoa_url.new_(wiki.Domain_bry(), ttl_bry);
Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry);
Xoa_url url = Xoa_url.New(wiki.Domain_bry(), ttl_bry);
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
Xoae_page actl = fxt.Wiki().Data_mgr().Load_page_and_parse(url, ttl);
if (expd == null) Tfds.Eq_true(actl.Missing());
if (expd == null) Tfds.Eq_true(actl.Db().Page().Exists_n());
else Tfds.Eq(expd, String_.new_u8(actl.Ttl().Raw()));
}
}

View File

@@ -33,7 +33,7 @@ public class Xop_languages_xnde implements Xox_xnde {
int slash_pos = Bry_find_.Find_bwd(page_bry, Xoa_ttl.Subpage_spr);
if (slash_pos == Bry_find_.Not_found) return ttl;
byte[] root_bry = Bry_.Mid(page_bry, 0, slash_pos);
return Xoa_ttl.parse(wiki, ttl.Ns().Id(), root_bry);
return Xoa_ttl.Parse(wiki, ttl.Ns().Id(), root_bry);
}
private List_adp Find_lang_pages(Xop_ctx ctx, Xowe_wiki wiki) {
this.root_ttl = Root_ttl_of(wiki, ctx.Page().Ttl());
@@ -112,13 +112,13 @@ class Xop_languages_fmtr implements gplx.core.brys.Bfr_arg {
int len = langs.Count();
Xoh_href_wtr href_wtr = wiki.Appe().Html__href_wtr();
int ns_id = root_ttl.Ns().Id();
byte[] root_ttl_bry = root_ttl.Page_db(); // NOTE: do not use .Full(); ns will be added in Xoa_ttl.parse below
byte[] root_ttl_bry = root_ttl.Page_db(); // NOTE: do not use .Full(); ns will be added in Xoa_ttl.Parse below
for (int i = 0; i < len; i++) {
Xol_lang_stub lang = (Xol_lang_stub)langs.Get_at(i);
byte[] lang_key = lang.Key();
boolean lang_is_en = Bry_.Eq(lang_key, Xol_lang_itm_.Key_en);
byte[] lang_ttl_bry = lang_is_en ? root_ttl_bry : Bry_.Add_w_dlm(Xoa_ttl.Subpage_spr, root_ttl_bry, lang_key);
Xoa_ttl lang_ttl = Xoa_ttl.parse(wiki, ns_id, lang_ttl_bry);
Xoa_ttl lang_ttl = Xoa_ttl.Parse(wiki, ns_id, lang_ttl_bry);
byte[] lang_href = href_wtr.Build_to_bry(wiki, lang_ttl);
byte[] lang_title = Xoh_html_wtr.Ttl_to_title(lang_ttl.Full_txt_w_ttl_case());
Bry_fmtr fmtr = null;

View File

@@ -30,7 +30,7 @@ public class Xop_mylanguage_page implements Xow_special_page {
if (!lang_is_english)
trg_bry = Bry_.Add_w_dlm(Xoa_ttl.Subpage_spr, page_bry, lang_key);
wiki.Data_mgr().Redirect(page, trg_bry);
if (page.Missing() && !lang_is_english) // foreign lang does not exist; default to english
if (page.Db().Page().Exists_n() && !lang_is_english) // foreign lang does not exist; default to english
wiki.Data_mgr().Redirect(page, page_bry);
}

View File

@@ -49,10 +49,10 @@ class Xop_mylanguage_page_fxt {
Xoae_page page = parser_fxt.Ctx().Page();
Xoa_url url = app.User().Wikii().Utl__url_parser().Parse(Bry_.new_u8(link));
page.Url_(url);
Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.new_a7(link));
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.new_a7(link));
page.Ttl_(ttl);
special_page.Special__gen(wiki, page, url, ttl);
Tfds.Eq(expd, String_.new_a7(page.Url().Page_bry()));
Tfds.Eq(expd, String_.new_a7(page.Data_raw()));
Tfds.Eq(expd, String_.new_a7(page.Db().Text().Text_bry()));
}
}

View File

@@ -24,7 +24,7 @@ public class Xop_translate_xnde implements Xox_xnde {
public void Xtn_parse(Xowe_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) {
byte[] translate_src = Bry_.Mid(src, xnde.Tag_open_end(), xnde.Tag_close_bgn());
translate_src = Bry_.Trim(translate_src, 0, translate_src.length);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx);
xtn_root = wiki.Parser_mgr().Main().Parse_text_to_wdom_old_ctx(sub_ctx, translate_src, true);
}
public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) {

View File

@@ -23,17 +23,17 @@ public class Xop_tvar_lxr implements Xop_lxr {
public void Init_by_wiki(Xowe_wiki wiki, Btrie_fast_mgr core_trie) {core_trie.Add(Hook_bgn, this);}
public void Init_by_lang(Xol_lang_itm lang, Btrie_fast_mgr core_trie) {}
public void Term(Btrie_fast_mgr core_trie) {}
private static final byte[] Hook_bgn = Bry_.new_a7("<tvar|"), Close_nde = Bry_.new_a7("</>");
private static final byte[] Hook_bgn = Bry_.new_a7("<tvar|"), Close_nde = Bry_.new_a7("</>");
public int Make_tkn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos) {
int rhs_end = Bry_find_.Find_fwd(src, Byte_ascii.Gt, cur_pos); if (rhs_end == Bry_find_.Not_found) return ctx.Lxr_make_txt_(cur_pos);
int lhs_bgn = Bry_find_.Find_fwd(src, Close_nde , rhs_end); if (lhs_bgn == Bry_find_.Not_found) return ctx.Lxr_make_txt_(cur_pos);
byte[] body = Bry_.Mid(src, rhs_end + Int_.Const_position_after_char, lhs_bgn);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx.Wiki());
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx);
Xop_root_tkn sub_root = tkn_mkr.Root(body);
body = ctx.Wiki().Parser_mgr().Main().Parse_text_to_wtxt(sub_root, sub_ctx, tkn_mkr, body); // NOTE: must parse inner text for templates; EX:<tvar|a>{{B}}</>; PAGE:mw:Download; DATE:2014-04-27
int end_pos = lhs_bgn + Close_nde.length;
ctx.Subs_add(root, tkn_mkr.Tvar(bgn_pos, end_pos, cur_pos, rhs_end, rhs_end + Int_.Const_position_after_char, lhs_bgn, body));
return end_pos;
}
public static final Xop_tvar_lxr Instance = new Xop_tvar_lxr(); Xop_tvar_lxr() {}
public static final Xop_tvar_lxr Instance = new Xop_tvar_lxr(); Xop_tvar_lxr() {}
}

View File

@@ -44,9 +44,9 @@ public class Wbase_doc_mgr {
}
private byte[] Load_or_null(byte[] full_db) {
if (!enabled) return null;
Xoa_ttl page_ttl = Xoa_ttl.parse(wbase_mgr.Wdata_wiki(), full_db); if (page_ttl == null) {app.Usr_dlg().Warn_many("", "", "invalid qid for ttl: qid=~{0}", full_db); return null;}
Xoa_ttl page_ttl = Xoa_ttl.Parse(wbase_mgr.Wdata_wiki(), full_db); if (page_ttl == null) {app.Usr_dlg().Warn_many("", "", "invalid qid for ttl: qid=~{0}", full_db); return null;}
Xoae_page page_itm = wbase_mgr.Wdata_wiki().Data_mgr().Load_page_by_ttl(page_ttl);
return page_itm.Missing() ? null : page_itm.Data_raw();
return page_itm.Db().Page().Exists_n() ? null : page_itm.Db().Text().Text_bry();
}
private static byte[] Prepend_property_if_needed(byte[] bry) {

View File

@@ -24,8 +24,12 @@ class Wdata_prop_val_visitor implements Wdata_claim_visitor {
private final Bry_bfr tmp_time_bfr = Bry_bfr_.Reset(255); private final Bry_fmtr tmp_time_fmtr = Bry_fmtr.new_();
private Wdata_hwtr_msgs msgs;
public Wdata_prop_val_visitor(Xoae_app app, Wdata_wiki_mgr wdata_mgr) {this.app = app; this.wdata_mgr = wdata_mgr;}
public void Init(Bry_bfr bfr, Wdata_hwtr_msgs msgs, byte[] lang_key) {this.bfr = bfr; ; this.msgs = msgs; this.lang_key = lang_key;}
public void Visit_str(Wdata_claim_itm_str itm) {bfr.Add(itm.Val_str());}
public void Init(Bry_bfr bfr, Wdata_hwtr_msgs msgs, byte[] lang_key) {
this.bfr = bfr; this.msgs = msgs; this.lang_key = lang_key;
}
public void Visit_str(Wdata_claim_itm_str itm) {
bfr.Add(itm.Val_str());
}
public void Visit_time(Wdata_claim_itm_time itm) {
itm.Write_to_bfr(bfr, tmp_time_bfr, tmp_time_fmtr, msgs, Bry_.Empty); // for now, don't bother passing ttl; only used for error msg; DATE:2015-08-03
}

View File

@@ -69,29 +69,33 @@ public class Wdata_wiki_mgr implements Gfo_evt_itm, Gfo_invk {
Wdata_doc wdoc = Doc_mgr.Get_by_bry_or_null(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();
synchronized (tmp_bfr) { // LOCK:must synchronized b/c prop_val_visitor has member bfr which can get overwritten; DATE:2016-07-06
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_w_size(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();
Wdata_claim_itm_core selected = null;
for (int i = 0; i < len; i++) { // NOTE: multiple props possible; EX: {{#property:P1082}}; PAGE:en.w:Earth DATE:2015-08-02
Wdata_claim_itm_core prop = prop_grp.Get_at(i);
if (selected == null) selected = prop; // if selected not set, set it; will always set to 1st prop
if (prop.Rank_tid() == Wdata_dict_rank.Tid_preferred) { // if prop is preferred, select it and exit;
selected = prop;
break;
synchronized (this) { // LOCK:must synchronized b/c prop_val_visitor has member bfr which can get overwritten; DATE:2016-07-06
Hwtr_mgr_assert();
int len = prop_grp.Len();
Wdata_claim_itm_core selected = null;
for (int i = 0; i < len; i++) { // NOTE: multiple props possible; EX: {{#property:P1082}}; PAGE:en.w:Earth DATE:2015-08-02
Wdata_claim_itm_core prop = prop_grp.Get_at(i);
if (selected == null) selected = prop; // if selected not set, set it; will always set to 1st prop
if (prop.Rank_tid() == Wdata_dict_rank.Tid_preferred) { // if prop is preferred, select it and exit;
selected = prop;
break;
}
}
}
switch (selected.Snak_tid()) {
case Wdata_dict_snak_tid.Tid_novalue : bfr.Add(Wdata_dict_snak_tid.Bry_novalue); break;
case Wdata_dict_snak_tid.Tid_somevalue : bfr.Add(Wdata_dict_snak_tid.Bry_somevalue); break;
default: {
prop_val_visitor.Init(bfr, hwtr_mgr.Msgs(), lang_key);
selected.Welcome(prop_val_visitor);
break;
switch (selected.Snak_tid()) {
case Wdata_dict_snak_tid.Tid_novalue : bfr.Add(Wdata_dict_snak_tid.Bry_novalue); break;
case Wdata_dict_snak_tid.Tid_somevalue : bfr.Add(Wdata_dict_snak_tid.Bry_somevalue); break;
default: {
prop_val_visitor.Init(bfr, hwtr_mgr.Msgs(), lang_key);
selected.Welcome(prop_val_visitor);
break;
}
}
}
}
@@ -117,11 +121,13 @@ public class Wdata_wiki_mgr implements Gfo_evt_itm, Gfo_invk {
}
private void Hwtr_msgs_make() {
if (!app.Wiki_mgr().Wiki_regy().Has(Xow_domain_itm_.Bry__wikidata)) return;
Xol_lang_itm new_lang = app.Usere().Lang();
Xowe_wiki cur_wiki = this.Wdata_wiki();
cur_wiki.Xtn_mgr().Xtn_wikibase().Load_msgs(cur_wiki, new_lang);
Wdata_hwtr_msgs hwtr_msgs = Wdata_hwtr_msgs.new_(cur_wiki.Msg_mgr());
hwtr_mgr.Init_by_lang(hwtr_msgs);
// synchronized (this) { // LOCK:DELETE; DATE:2016-07-06
Xol_lang_itm new_lang = app.Usere().Lang();
Xowe_wiki cur_wiki = this.Wdata_wiki();
cur_wiki.Xtn_mgr().Xtn_wikibase().Load_msgs(cur_wiki, new_lang);
Wdata_hwtr_msgs hwtr_msgs = Wdata_hwtr_msgs.new_(cur_wiki.Msg_mgr());
hwtr_mgr.Init_by_lang(hwtr_msgs);
// }
}
public static void Write_json_as_html(Json_parser jdoc_parser, Bry_bfr bfr, byte[] data_raw) {
bfr.Add(Xoh_consts.Span_bgn_open).Add(Xoh_consts.Id_atr).Add(Html_json_id).Add(Xoh_consts.__end_quote); // <span id="xowa-wikidata-json">

View File

@@ -114,7 +114,7 @@ public class Wdata_wiki_mgr_fxt {
external_lang_links.Langs_add(Bry_.new_a7(lang));
}
}
public void Test_link(String ttl_str, String expd) {Test_link(Xoa_ttl.parse(wiki, Xow_ns_.Tid__main, Bry_.new_u8(ttl_str)), expd);}
public void Test_link(String ttl_str, String expd) {Test_link(Xoa_ttl.Parse(wiki, Xow_ns_.Tid__main, Bry_.new_u8(ttl_str)), expd);}
public void Test_link(Xoa_ttl ttl, String expd) {
byte[] qid_ttl = wdata_mgr.Qid_mgr.Get_or_null(wiki, ttl);
Tfds.Eq(expd, String_.new_u8(qid_ttl));
@@ -152,7 +152,7 @@ public class Wdata_wiki_mgr_fxt {
}
public void Test_xwiki_links(String ttl, String... expd) {
tmp_langs.Clear();
Wdata_xwiki_link_wtr.Write_wdata_links(tmp_langs, wiki, Xoa_ttl.parse(wiki, Bry_.new_u8(ttl)), wiki.Parser_mgr().Ctx().Page().Wdata_external_lang_links());
Wdata_xwiki_link_wtr.Write_wdata_links(tmp_langs, wiki, Xoa_ttl.Parse(wiki, Bry_.new_u8(ttl)), wiki.Parser_mgr().Ctx().Page().Wdata_external_lang_links());
Tfds.Eq_ary_str(expd, Test_xwiki_links_xto_str_ary(tmp_langs));
} List_adp tmp_langs = List_adp_.New();
String[] Test_xwiki_links_xto_str_ary(List_adp list) {

View File

@@ -35,7 +35,7 @@ public class Wdata_wiki_mgr_tst {
Xowe_wiki wiki = fxt.Wiki();
wiki.Ns_mgr().Add_new(124, "Test_ns");
fxt.Init_links_add("enwiki", "000", "Test_ns:Test_page", "pass"); // NOTE: wdata will save to "000" ns, b/c "124" ns is not canonical
Xoa_ttl ttl = Xoa_ttl.parse(fxt.Wiki(), 124, Bry_.new_a7("Test_page"));
Xoa_ttl ttl = Xoa_ttl.Parse(fxt.Wiki(), 124, Bry_.new_a7("Test_page"));
fxt.Test_link(ttl, "pass");
}
@Test public void Write_json_as_html() {

View File

@@ -55,7 +55,7 @@ public class Wdata_xwiki_link_wtr implements gplx.core.brys.Bfr_arg {
tmp_bfr.Add(lang_key);
tmp_bfr.Add_byte(Byte_ascii.Colon);
tmp_bfr.Add(slink.Name());
Xoa_ttl slink_ttl = Xoa_ttl.parse(wiki, tmp_bfr.To_bry_and_clear());
Xoa_ttl slink_ttl = Xoa_ttl.Parse(wiki, tmp_bfr.To_bry_and_clear());
if (slink_ttl == null) continue; // invalid ttl
Xow_xwiki_itm xwiki_itm = slink_ttl.Wik_itm();
if ( xwiki_itm == null // not a known xwiki; EX: [[zzz:abc]]

View File

@@ -39,7 +39,7 @@ public class Wdata_dict_val_tid {
, Str_monolingualtext = "monolingualtext"
, Str_unknown = "unknown"
;
public static final byte[]
public static final byte[]
Bry_bad = Bry_.new_a7(Str_bad)
, Bry_string = Bry_.new_a7(Str_string)
, Bry_entity = Bry_.new_a7(Str_entity)
@@ -49,7 +49,7 @@ public class Wdata_dict_val_tid {
, Bry_monolingualtext = Bry_.new_a7(Str_monolingualtext)
, Bry_unknown = Bry_.new_a7(Str_unknown)
;
private static final Hash_adp_bry Dict = Hash_adp_bry.cs()
private static final Hash_adp_bry Dict = Hash_adp_bry.cs()
.Add_bry_byte(Bry_string , Tid_string)
.Add_bry_byte(Bry_entity , Tid_entity)
.Add_bry_byte(Bry_time , Tid_time)
@@ -73,7 +73,7 @@ public class Wdata_dict_val_tid {
public static String To_str__srl(byte tid) { // for scrib.wbase
switch (tid) {
case Tid_string : return Str_string;
case Tid_entity : return Str_entity;
case Tid_entity : return "wikibase-item"; // changed from "wikibase-entityid"; PAGE:ht.w:Srilanka DATE:2016-07-08
case Tid_time : return Str_time;
case Tid_globecoordinate : return "globe-coordinate";
case Tid_quantity : return Str_quantity;

View File

@@ -110,17 +110,19 @@ public class Wdata_doc_parser_v2 implements Wdata_doc_parser {
} catch (Exception e) {throw Err_.new_exc(e, "xo", "failed to parse sitelinks", "qid", String_.new_u8(qid));}
}
public Ordered_hash Parse_claims(byte[] qid, Json_doc doc) {
try {
Json_nde list_nde = Json_nde.cast(doc.Get_grp(Bry_claims)); if (list_nde == null) return Wdata_doc_parser_v1.Empty_ordered_hash_generic;
List_adp temp_list = List_adp_.New();
byte[] src = doc.Src();
int len = list_nde.Len();
for (int i = 0; i < len; i++) {
Json_kv claim_nde = Json_kv.cast(list_nde.Get_at(i));
claims_parser.Make_claim_itms(qid, temp_list, src, claim_nde);
}
return Wdata_doc_parser_v1.Claims_list_to_hash(temp_list);
} catch (Exception e) {throw Err_.new_exc(e, "xo", "failed to parse claims", "qid", String_.new_u8(doc.Src()));}
synchronized (this) {// TS; DATE:2016-07-06
try {
Json_nde list_nde = Json_nde.cast(doc.Get_grp(Bry_claims)); if (list_nde == null) return Wdata_doc_parser_v1.Empty_ordered_hash_generic;
List_adp temp_list = List_adp_.New();
byte[] src = doc.Src();
int len = list_nde.Len();
for (int i = 0; i < len; i++) {
Json_kv claim_nde = Json_kv.cast(list_nde.Get_at(i));
claims_parser.Make_claim_itms(qid, temp_list, src, claim_nde);
}
return Wdata_doc_parser_v1.Claims_list_to_hash(temp_list);
} catch (Exception e) {throw Err_.new_exc(e, "xo", "failed to parse claims", "qid", String_.new_u8(doc.Src()));}
}
}
public Wdata_claim_itm_base Parse_claims_data(byte[] qid, int pid, byte snak_tid, Json_nde nde) {return claims_parser.Parse_datavalue(qid, pid, snak_tid, nde);}
public Wdata_claim_grp_list Parse_qualifiers(byte[] qid, Json_nde nde) {return claims_parser.Parse_qualifiers(qid, nde);}

View File

@@ -25,39 +25,41 @@ public class Wdata_pf_property extends Pf_func_base {
@Override public int Id() {return Xol_kwd_grp_.Id_property;}
@Override public Pf_func New(int id, byte[] name) {return new Wdata_pf_property().Name_(name);}
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) {// EX: {{#property:p123|}}
// init
byte[] pid_ttl = Eval_argx(ctx, src, caller, self);
Xop_log_property_wkr property_wkr = ctx.Xtn__wikidata__property_wkr();
long log_time_bgn = 0;
if (property_wkr != null) {
log_time_bgn = Env_.TickCount();
if (!property_wkr.Eval_bgn(ctx.Page(), pid_ttl)) return;
}
Xoae_app app = ctx.App();
Xowe_wiki wiki = ctx.Wiki();
Xoa_ttl ttl = ctx.Page().Ttl();
Wdata_wiki_mgr wdata_mgr = app.Wiki_mgr().Wdata_mgr(); if (!wdata_mgr.Enabled()) return;
// get pid_int; EX: {{#property:p123}} -> 123
int pid_int = Wdata_pf_property.Parse_pid(app.Utl_num_parser(), pid_ttl); // parse "p123" to "123"
if (pid_int == Wdata_wiki_mgr.Pid_null) { // pid_ttl is name; EX: {{#property:road_map}}
pid_int = wdata_mgr.Pid_mgr.Get_or_null(wiki.Wdata_wiki_lang(), pid_ttl);
if (pid_int == Wdata_wiki_mgr.Pid_null) {
Print_self(app.Usr_dlg(), bfr, src, self, "prop_not_found", "prop id not found: ~{0} ~{1} ~{2}", wiki.Domain_str(), ttl.Page_db_as_str(), pid_ttl);
return;
synchronized (this) { // LOCK: must synchronized b/c bfr will later be set as member variable; DATE:2016-07-06
// init
byte[] pid_ttl = Eval_argx(ctx, src, caller, self);
Xop_log_property_wkr property_wkr = ctx.Xtn__wikidata__property_wkr();
long log_time_bgn = 0;
if (property_wkr != null) {
log_time_bgn = Env_.TickCount();
if (!property_wkr.Eval_bgn(ctx.Page(), pid_ttl)) return;
}
Xoae_app app = ctx.App();
Xowe_wiki wiki = ctx.Wiki();
Xoa_ttl ttl = ctx.Page().Ttl();
Wdata_wiki_mgr wdata_mgr = app.Wiki_mgr().Wdata_mgr(); if (!wdata_mgr.Enabled()) return;
// get pid_int; EX: {{#property:p123}} -> 123
int pid_int = Wdata_pf_property.Parse_pid(app.Utl_num_parser(), pid_ttl); // parse "p123" to "123"
if (pid_int == Wdata_wiki_mgr.Pid_null) { // pid_ttl is name; EX: {{#property:road_map}}
pid_int = wdata_mgr.Pid_mgr.Get_or_null(wiki.Wdata_wiki_lang(), pid_ttl);
if (pid_int == Wdata_wiki_mgr.Pid_null) {
Print_self(app.Usr_dlg(), bfr, src, self, "prop_not_found", "prop id not found: ~{0} ~{1} ~{2}", wiki.Domain_str(), ttl.Page_db_as_str(), pid_ttl);
return;
}
}
// get doc from args; EX:{{#property:p123}} -> "current_page"; EX:{{#property:p123|of=Earth}} -> "Q2"; {{#property:p123|q=q2}} -> "Q2"; {{#property:p123|from=p321}} -> "Property:P321"
Wdata_pf_property_data doc_data = Wdata_pf_property_data.Parse(ctx, src, caller, self, this);
Wdata_doc doc = Wdata_pf_property_.Get_doc(wdata_mgr, wiki, ttl, doc_data);
if (doc == null) return; // NOTE: some pages will not have a qid; EX: "Some_unknown_page" will not have a qid in wikidata; if no qid, then all {{#property:p###}} will have no prop_val
// get val based on pid and doc; EX: {{#property:p123|of=Earth}} -> doc=Q2; pid=123 -> "value of p123 in Q2"
Wdata_claim_grp claim_grp = doc.Claim_list_get(pid_int);
if (claim_grp == null) return;// NOTE: some props may not exist; EX: "Some_known_page" has a qid of 123 but does not have pid 345 required by {{#property:P345|q=123}}
wdata_mgr.Resolve_to_bfr(bfr, claim_grp, wiki.Wdata_wiki_lang()); // NOTE: was ctx.Page().Lang().Key_bry(), but fails in simplewiki; DATE:2013-12-02
if (property_wkr != null) property_wkr.Eval_end(ctx.Page(), pid_ttl, log_time_bgn);
}
// get doc from args; EX:{{#property:p123}} -> "current_page"; EX:{{#property:p123|of=Earth}} -> "Q2"; {{#property:p123|q=q2}} -> "Q2"; {{#property:p123|from=p321}} -> "Property:P321"
Wdata_pf_property_data doc_data = Wdata_pf_property_data.Parse(ctx, src, caller, self, this);
Wdata_doc doc = Wdata_pf_property_.Get_doc(wdata_mgr, wiki, ttl, doc_data);
if (doc == null) return; // NOTE: some pages will not have a qid; EX: "Some_unknown_page" will not have a qid in wikidata; if no qid, then all {{#property:p###}} will have no prop_val
// get val based on pid and doc; EX: {{#property:p123|of=Earth}} -> doc=Q2; pid=123 -> "value of p123 in Q2"
Wdata_claim_grp claim_grp = doc.Claim_list_get(pid_int);
if (claim_grp == null) return;// NOTE: some props may not exist; EX: "Some_known_page" has a qid of 123 but does not have pid 345 required by {{#property:P345|q=123}}
wdata_mgr.Resolve_to_bfr(bfr, claim_grp, wiki.Wdata_wiki_lang()); // NOTE: was ctx.Page().Lang().Key_bry(), but fails in simplewiki; DATE:2013-12-02
if (property_wkr != null) property_wkr.Eval_end(ctx.Page(), pid_ttl, log_time_bgn);
}
public static int Parse_pid(Number_parser num_parser, byte[] bry) {
int bry_len = bry.length;
@@ -81,7 +83,7 @@ class Wdata_pf_property_ {
if (Bry_.Len_gt_0(data.Q)) return wdata_mgr.Doc_mgr.Get_by_bry_or_null(data.Q);
else if (Bry_.Len_gt_0(data.From)) return wdata_mgr.Doc_mgr.Get_by_xid_or_null(data.From); // NOTE: by_xid b/c Module passes just "p1" not "Property:P1"
else if (Bry_.Len_gt_0(data.Of)) {
Xoa_ttl of_ttl = Xoa_ttl.parse(wiki, data.Of); if (of_ttl == null) return null;
Xoa_ttl of_ttl = Xoa_ttl.Parse(wiki, data.Of); if (of_ttl == null) return null;
byte[] qid = wdata_mgr.Qid_mgr.Get_or_null(wiki, of_ttl); if (qid == null) return null; // NOTE: for now, use wiki.Lang_key(), not page.Lang()
return wdata_mgr.Doc_mgr.Get_by_bry_or_null(qid);
}

View File

@@ -53,17 +53,17 @@ public class Wdata_itemByTitle_page implements Xow_special_page {
if (Navigate(usr_dlg, app, app.Wiki_mgr().Wdata_mgr(), page, site_bry, page_bry)) return;
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004();
html_fmtr.Bld_bfr_many(tmp_bfr, "Search for items by site and title", "Site", site_bry, "Page", page_bry, "Search");
page.Data_raw_(tmp_bfr.To_bry_and_rls());
page.Db().Text().Text_bry_(tmp_bfr.To_bry_and_rls());
page.Html_data().Html_restricted_n_(); // [[Special:]] pages allow all HTML
}
private static boolean Navigate(Gfo_usr_dlg usr_dlg, Xoae_app app, Wdata_wiki_mgr wdata_mgr, Xoae_page page, byte[] site_bry, byte[] page_bry) {
page_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(page_bry); // NOTE: space is converted to + on postback to url; decode
byte[] wiki_domain = Xow_abrv_wm_.Parse_to_domain_bry(site_bry); if (wiki_domain == null) {usr_dlg.Warn_many("", "", "site_bry parse failed; site_bry:~{0}", String_.new_u8(site_bry)); return false;}
Xowe_wiki wiki = app.Wiki_mgr().Get_by_or_make(wiki_domain); if (wiki == null) {usr_dlg.Warn_many("", "", "wiki_domain does not exist; wiki_domain:~{0}", String_.new_u8(wiki_domain)); return false;}
Xoa_ttl wdata_ttl = Xoa_ttl.parse(wiki, page_bry); if (wdata_ttl == null) {usr_dlg.Warn_many("", "", "ttl is invalid; ttl:~{0}", String_.new_u8(page_bry)); return false;}
Xoa_ttl wdata_ttl = Xoa_ttl.Parse(wiki, page_bry); if (wdata_ttl == null) {usr_dlg.Warn_many("", "", "ttl is invalid; ttl:~{0}", String_.new_u8(page_bry)); return false;}
Wdata_doc doc = wdata_mgr.Doc_mgr.Get_by_ttl_or_null(wiki, wdata_ttl); if (doc == null) {usr_dlg.Warn_many("", "", "ttl cannot be found in wikidata; ttl:~{0}", String_.new_u8(wdata_ttl.Raw())); return false;}
byte[] qid_bry = doc.Qid();
wdata_mgr.Wdata_wiki().Data_mgr().Redirect(page, qid_bry); if (page.Missing()) {usr_dlg.Warn_many("", "", "qid cannot be found in wikidata; qid:~{0}", String_.new_u8(qid_bry)); return false;}
wdata_mgr.Wdata_wiki().Data_mgr().Redirect(page, qid_bry); if (page.Db().Page().Exists_n()) {usr_dlg.Warn_many("", "", "qid cannot be found in wikidata; qid:~{0}", String_.new_u8(qid_bry)); return false;}
return true;
}
private static Bry_fmtr html_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl

View File

@@ -63,10 +63,10 @@ class Wdata_itemByTitle_page_fxt {
Xoae_page page = wiki.Parser_mgr().Ctx().Page();
Xoa_url url = app.User().Wikii().Utl__url_parser().Parse(Bry_.new_u8(link));
page.Url_(url);
Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.new_a7(link));
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.new_a7(link));
page.Ttl_(ttl);
special_page.Special__gen(wiki, page, url, ttl);
Tfds.Eq_str_lines(expd, String_.new_a7(page.Data_raw()));
Tfds.Eq_str_lines(expd, String_.new_a7(page.Db().Text().Text_bry()));
}
public String Expd_html(String wmf_key, String ttl_str) {
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004();

View File

@@ -33,7 +33,7 @@ public class Xop_xowa_cmd implements Xox_xnde {
xtn_src = Bry_.new_u8(Object_.Xto_str_strict_or_null_mark(rslt));
}
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
Xop_ctx sub_ctx = Xop_ctx.new_sub_(wiki);
Xop_ctx sub_ctx = Xop_ctx.new_sub_(ctx);
Xop_root_tkn sub_root = tkn_mkr.Root(xtn_src);
xtn_html = wiki.Parser_mgr().Main().Parse_text_to_wtxt(sub_root, sub_ctx, ctx.Tkn_mkr(), xtn_src);
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.xowa_cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*;
import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*; import gplx.xowa.wikis.pages.htmls.*;
public class Xox_xowa_html_cmd implements Xox_xnde, Mwh_atr_itm_owner2 {
private byte tag_pos = Xo_custom_html_pos_.Tid__head_end, tag_type = Xo_custom_html_type_.Tid__css_code;
public void Xatr__set(Xowe_wiki wiki, byte[] src, Mwh_atr_itm xatr, byte xatr_id) {