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

'v3.3.4.1'

This commit is contained in:
gnosygnu
2016-03-27 23:44:59 -04:00
parent de67253a9c
commit baaef32df2
903 changed files with 13339 additions and 8695 deletions

View File

@@ -89,6 +89,7 @@ public class Pf_func_ {
, Xol_kwd_grp_.Id_strx_replace
, Xol_kwd_grp_.Id_strx_explode
, Xol_kwd_grp_.Id_strx_urldecode
, Xol_kwd_grp_.Id_new_window_link
);
Ary_nonwmf = (int[])list.To_ary_and_clear(int.class);
}
@@ -390,6 +391,7 @@ public class Pf_func_ {
case Xol_kwd_grp_.Id_lstx: return gplx.xowa.xtns.lst.Lst_pfunc_lstx.Instance;
case Xol_kwd_grp_.Id_invoke: return new gplx.xowa.xtns.scribunto.Scrib_invoke_func();
case Xol_kwd_grp_.Id_pagebanner: return new gplx.xowa.xtns.pagebanners.Pgbnr_func();
case Xol_kwd_grp_.Id_new_window_link: return new gplx.xowa.xtns.new_window_links.New_window_link_func();
case Xol_kwd_grp_.Id_property: return new gplx.xowa.xtns.wdatas.pfuncs.Wdata_pf_property();
case Xol_kwd_grp_.Id_noexternallanglinks: return new gplx.xowa.xtns.wdatas.pfuncs.Wdata_pf_noExternalLangLinks();

View File

@@ -27,11 +27,11 @@ class Pfunc_i18n_fxt {
public Xop_fxt Fxt() {return fxt;}
public Pfunc_i18n_fxt lang_(String v) {lang_key = v; return this;} private String lang_key;
public Pfunc_i18n_fxt Ini() {
if (app == null) app = Xoa_app_fxt.app_();
if (app == null) app = Xoa_app_fxt.Make__app__edit();
app.Lang_mgr().Clear(); // else lang values retained from last run
app.Free_mem(false); // else tmpl_result_cache will get reused from last run for {{test}}
lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7(lang_key));
wiki = Xoa_app_fxt.wiki_(app, lang_key + ".wikipedia.org", lang);
wiki = Xoa_app_fxt.Make__wiki__edit(app, lang_key + ".wikipedia.org", lang);
fxt = new Xop_fxt(app, wiki);
return this;
} private Xoae_app app; private Xop_fxt fxt; Xol_lang_itm lang; Xowe_wiki wiki;

View File

@@ -21,9 +21,9 @@ import gplx.core.intls.*; import gplx.xowa.langs.numbers.*;
public class Pf_formatnum_es_tst {
private Xop_fxt fxt;
@Before public void init() {
Xoae_app app = Xoa_app_fxt.app_();
Xoae_app app = Xoa_app_fxt.Make__app__edit();
Xol_lang_itm lang = new Xol_lang_itm(app.Lang_mgr(), Bry_.new_a7("es")).Init_by_load_assert();
Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "es.wikipedia.org", lang);
Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "es.wikipedia.org", lang);
fxt = new Xop_fxt(app, wiki);
}
@Test public void Basic() {

View File

@@ -21,10 +21,10 @@ import gplx.core.intls.*; import gplx.xowa.langs.*; import gplx.xowa.langs.numbe
public class Pf_formatnum_fa_tst {
private Xop_fxt fxt;
@Before public void init() {
Xoae_app app = Xoa_app_fxt.app_();
Xoae_app app = Xoa_app_fxt.Make__app__edit();
Xol_lang_itm lang = new Xol_lang_itm(app.Lang_mgr(), Bry_.new_a7("fa")).Init_by_load_assert();
app.Gfs_mgr().Run_str_for(lang, Persian_numbers_gfs);
Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "fa.wikipedia.org", lang);
Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "fa.wikipedia.org", lang);
fxt = new Xop_fxt(app, wiki);
}
@Test public void Basic() {

View File

@@ -31,7 +31,7 @@ public class Pfunc_tag extends Pf_func_base {
try {
int tag_idx = ++tag__next_id;
Xop_xnde_tag tag = (Xop_xnde_tag)ctx.Xnde_tag_regy().Get_trie(ctx.Xnde_names_tid()).Match_exact(tag_name, 0, tag_name.length);
boolean tag_is_ref = tag != null && tag.Id() == Xop_xnde_tag_.Tid_ref;
boolean tag_is_ref = tag != null && tag.Id() == Xop_xnde_tag_.Tid__ref;
if (tag_is_ref) // <ref>; add <xtag_bgn> to handle nested refs; PAGE:en.w:Battle_of_Midway; DATE:2014-06-27
tmp.Add(Xtag_bgn_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, 10, tag_idx).Add(Xtag_rhs);
tmp.Add_byte(Byte_ascii.Lt).Add(tag_name);

View File

@@ -49,7 +49,6 @@ class Pft_fmt_itm_hebrew_ {
public static boolean Calc_hebrew_date(int[] rv, int year, int month, int day) { // REF.MW:Language.php|tsToHebrew
// Calculate Hebrew year
int hebrewYear = year + 3760;
// Month number when September = 1, August = 12
month += 4;
if (month > 12) {
@@ -58,7 +57,6 @@ class Pft_fmt_itm_hebrew_ {
year++;
hebrewYear++;
}
// Calculate day of year from 1 September
int dayOfYear = day;
for (int i = 1; i < month; i++) {
@@ -75,10 +73,8 @@ class Pft_fmt_itm_hebrew_ {
dayOfYear += 31;
}
}
// Calculate the start of the Hebrew year
int start = Calc_hebrew_year_num_start(hebrewYear);
// Calculate next year's start
int nextStart = 0;
if (dayOfYear <= start) {
@@ -100,10 +96,8 @@ class Pft_fmt_itm_hebrew_ {
// Next year's start
nextStart = Calc_hebrew_year_num_start(hebrewYear + 1);
}
// Calculate Hebrew day of year
int hebrewDayOfYear = dayOfYear - start;
// Difference between year's days
int diff = nextStart - start;
// Add 12 (or 13 for leap years) days to ignore the difference between
@@ -114,7 +108,6 @@ class Pft_fmt_itm_hebrew_ {
} else {
diff += 12;
}
// Check the year pattern, and is leap year
// 0 means an incomplete year, 1 means a regular year, 2 means a complete year
// This is mod 30, to work on both leap years (which add 30 days of Adar I)
@@ -122,14 +115,12 @@ class Pft_fmt_itm_hebrew_ {
int yearPattern = diff % 30;
// Check if leap year
boolean isLeap = diff >= 30;
// Calculate day in the month from number of day in the Hebrew year
// Don't check Adar - if the day is not in Adar, we will stop before;
// if it is in Adar, we will use it to check if it is Adar I or Adar II
int hebrewDay = hebrewDayOfYear;
int hebrewMonth = 1;
int days = 0;
while (hebrewMonth <= 12) {
// Calculate days in this month
if (isLeap && hebrewMonth == 6) {
@@ -205,7 +196,6 @@ class Pft_fmt_itm_hebrew_ {
, Rslt_day_num = 2
, Rslt_month_days_count = 3
;
private static final byte[][][] Numeral_tbls = new byte[][][]
{ new byte[][] {Bry_.Empty, Bry_.new_u8("א"), Bry_.new_u8("ב"), Bry_.new_u8("ג"), Bry_.new_u8("ד"), Bry_.new_u8("ה") , Bry_.new_u8("ו") , Bry_.new_u8("ז") , Bry_.new_u8("ח") , Bry_.new_u8("ט") , Bry_.new_u8("י")}
, new byte[][] {Bry_.Empty, Bry_.new_u8("י"), Bry_.new_u8("כ"), Bry_.new_u8("ל"), Bry_.new_u8("מ"), Bry_.new_u8("נ") , Bry_.new_u8("ס") , Bry_.new_u8("ע") , Bry_.new_u8("פ") , Bry_.new_u8("צ") , Bry_.new_u8("ק")}

View File

@@ -28,7 +28,6 @@ class Pft_fmt_itm_hijiri {
int hiji_d = greg_d;
int hiji_m = greg_m;
int hiji_y = greg_y;
int tmp_jd = 0;
if (
(hiji_y > 1582) || ((hiji_y == 1582) && (hiji_m > 10)) ||
@@ -43,7 +42,6 @@ class Pft_fmt_itm_hijiri {
tmp_jd = 367 * hiji_y - (int)((7 * (hiji_y + 5001 + (int)((hiji_m - 9) / 7))) / 4) +
(int)((275 * hiji_m) / 9) + hiji_d + 1729777;
}
int tmp_l = tmp_jd -1948440 + 10632;
int tmp_n = (int)((tmp_l - 1) / 10631);
tmp_l = tmp_l - 10631 * tmp_n + 354;
@@ -52,7 +50,6 @@ class Pft_fmt_itm_hijiri {
hiji_m = (int)((24 * tmp_l) / 709);
hiji_d = tmp_l - (int)((709 * hiji_m) / 24);
hiji_y = 30 * tmp_n + tmp_j - 30;
rv[0] = hiji_y;
rv[1] = hiji_m;
rv[2] = hiji_d;

View File

@@ -31,7 +31,7 @@ public class Pfunc_filepath_tst {
Xoae_app app = fxt.App();
en_wiki = fxt.Wiki();
// Init_orig_mgr(en_wiki);
commons_wiki = Xoa_app_fxt.wiki_(app, Xow_domain_itm_.Str__commons);
commons_wiki = Xoa_app_fxt.Make__wiki__edit(app, Xow_domain_itm_.Str__commons);
mock_wkr.Clear_commons(); // assume all files are in repo 0
en_wiki.File_mgr().Repo_mgr().Page_finder_(mock_wkr);
commons_wiki.Db_mgr().Load_mgr().Clear();

View File

@@ -21,7 +21,7 @@ import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*;
public class Pfunc_rel2abs extends Pf_func_base {
@Override public boolean Func_require_colon_arg() {return true;}
private static final byte[] Ary_dot_slash = Bry_.new_a7("./"), Ary_dot_dot = Bry_.new_a7(".."), Ary_dot_dot_slash = Bry_.new_a7("../");
private static final byte[] Ary_dot_slash = Bry_.new_a7("./"), Ary_dot_dot = Bry_.new_a7(".."), Ary_dot_dot_slash = Bry_.new_a7("../");
private static void qry_bgns_with_init() {
qry_bgns_with = Btrie_fast_mgr.cs();
qry_bgns_with.Add(Byte_ascii.Slash, Int_obj_ref.new_(Id_slash));
@@ -33,7 +33,7 @@ public class Pfunc_rel2abs extends Pf_func_base {
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) {// REF.MW:ParserFunctions_body.php
byte[] qry = Eval_argx(ctx, src, caller, self);
byte[] orig = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, self.Args_len(), 0);
if (orig.length == 0) orig = ctx.Page().Ttl().Full_txt();
if (orig.length == 0) orig = ctx.Page().Ttl().Full_txt_w_ttl_case();
bfr.Add(Rel2abs(ctx.App().Utl__bfr_mkr().Get_b512().Mkr_rls(), qry, orig));
}
public static boolean Rel2abs_ttl(byte[] ttl, int bgn, int end) {
@@ -57,7 +57,7 @@ public class Pfunc_rel2abs extends Pf_func_base {
}
return rv;
}
private static final Int_obj_ref ignore_rel2abs_tid = Int_obj_ref.zero_();
private static final Int_obj_ref ignore_rel2abs_tid = Int_obj_ref.zero_();
public static byte[] Rel2abs(Bry_bfr tmp_bfr, byte[] qry, byte[] src) {return Rel2abs(tmp_bfr, qry, src, ignore_rel2abs_tid);}
public static byte[] Rel2abs(Bry_bfr tmp_bfr, byte[] qry, byte[] src, Int_obj_ref rel2abs_tid) {
if (qry_bgns_with == null) qry_bgns_with_init();
@@ -65,7 +65,6 @@ public class Pfunc_rel2abs extends Pf_func_base {
// qry_len = RTrim(qry, Byte_ascii.Slash, qry_bgn, qry_len); // not needed, but test anyway
if (qry_len == 0) return src;// no qry; return src; EX:{{#rel2abs:|a/b}} -> a/b
byte[] tmp = src;
int tmp_adj = 0, i = 0, prv_slash_end = 0, tmp_len = src_len, seg_pos = 0;
boolean tmp_is_1st = true;
@@ -182,4 +181,4 @@ B -> [A, B] add
C -> [A, C] add
. -> [A, C] noop
D -> [A, C, D] add
*/
*/

View File

@@ -38,7 +38,7 @@ public class Pfunc_rel2abs_tst {
@Test public void Err_owner() {fxt.Test_parse_tmpl_str_test("{{#rel2abs:..}}" , "{{test}}" , "");} // PURPOSE.fix: should not fail
@Test public void Err_owner_2() {fxt.Test_parse_tmpl_str_test("{{#rel2abs:/../../b|a}}" , "{{test}}" , "");} // PURPOSE.fix: should not fail
@Test public void Ns_should_be_included_for_cur_page() {// PURPOSE.fix: current title was not returning ns; EX: de.wikipedia.org/wiki/Hilfe:Vorlagenprogrammierung#Funktion_rel2abs
fxt.Page_ttl_("Help:A"); // set page to title with namespace
fxt.Page_ttl_("Help:A"); // set page to title with Srch_rslt_cbk
fxt.Test_parse_tmpl_str_test("{{#rel2abs:.}}" , "{{test}}" , "Help:A");
}
@Test public void Owner_lvl0() {// PURPOSE.fix: old rel2abs was producing "/c"; EX: de.wikipedia.org/wiki/Hilfe:Vorlagenprogrammierung#Funktion_rel2abs

View File

@@ -27,8 +27,7 @@ public class Pfunc_titleparts extends Pf_func_base {
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..
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();
else argx = argx_as_ttl.Full_txt_w_ttl_case();
// get parts_len
byte[] parts_len_ary = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, args_len, 0);
int parts_len = parts_len_ary == Bry_.Empty ? Int_.Min_value : Bry_.To_int_or(parts_len_ary, Int_.Max_value);
@@ -37,7 +36,6 @@ public class Pfunc_titleparts extends Pf_func_base {
bfr.Add(argx);
return;
}
// get parts_bgn
byte[] parts_bgn_arg = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, args_len, 1);
int parts_bgn = parts_bgn_arg == Bry_.Empty ? 0 : Bry_.To_int_or(parts_bgn_arg, Int_.Min_value);
@@ -55,12 +53,10 @@ public class Pfunc_titleparts extends Pf_func_base {
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
@@ -69,7 +65,6 @@ public class Pfunc_titleparts extends Pf_func_base {
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;

View File

@@ -27,7 +27,7 @@ public class Pfunc_ttl extends Pf_func_base {
switch (id) {
case Xol_kwd_grp_.Id_ttl_page_txt: bfr.Add(ttl.Page_txt()); break;
case Xol_kwd_grp_.Id_ttl_page_url: bfr.Add(ttl.Page_url()); break;
case Xol_kwd_grp_.Id_ttl_full_txt: bfr.Add(ttl.Full_txt()); break;
case Xol_kwd_grp_.Id_ttl_full_txt: bfr.Add(ttl.Full_txt_w_ttl_case()); break;
case Xol_kwd_grp_.Id_ttl_full_url: bfr.Add(ttl.Full_url()); break;
case Xol_kwd_grp_.Id_ttl_leaf_txt: bfr.Add(ttl.Leaf_txt()); break;
case Xol_kwd_grp_.Id_ttl_leaf_url: bfr.Add(ttl.Leaf_url()); break;
@@ -49,5 +49,5 @@ public class Pfunc_ttl extends Pf_func_base {
public Pfunc_ttl(int id) {this.id = id;}
@Override public int Id() {return id;} private int id;
@Override public Pf_func New(int id, byte[] name) {return new Pfunc_ttl(id).Name_(name);}
public static final Pfunc_ttl Instance = new Pfunc_ttl(-1);
public static final Pfunc_ttl Instance = new Pfunc_ttl(-1);
}

View File

@@ -39,9 +39,9 @@ class Pfunc_pagesincategory_tstr {
private final Xowd_page_tbl page_tbl; private final Xowd_cat_core_tbl cat_core_tbl;
public Pfunc_pagesincategory_tstr() {
Xoa_test_.Inet__init();
this.app = Xoa_app_fxt.app_();
this.wiki = Xoa_app_fxt.wiki_tst_(app);
Xoa_test_.Db__init__mem(wiki);
this.app = Xoa_app_fxt.Make__app__edit();
this.wiki = Xoa_app_fxt.Make__wiki__edit(app);
Xoa_test_.Init__db__edit(wiki);
this.parser_tstr = new Xop_fxt(app, wiki);
this.core_data_mgr = wiki.Data__core_mgr();
this.page_tbl = core_data_mgr.Tbl__page();

View File

@@ -19,7 +19,7 @@ package gplx.xowa.xtns.pfuncs.wikis; import gplx.*; import gplx.xowa.*; import g
import org.junit.*; import gplx.xowa.langs.*;
public class Pfunc_wiki_props_tst {
private final Xop_fxt fxt = new Xop_fxt();
@Before public void setup() {fxt.Reset(); fxt.Wiki().Stats().NumPages_(1).NumArticles_(2).NumFiles_(3).NumEdits_(4).NumViews_(5).NumUsers_(6).NumUsersActive_(7).NumAdmins_(8);}
@Before public void setup() {fxt.Reset(); fxt.Wiki().Stats().Load_by_db(1, 2, 3, 4, 5, 6, 7, 8);}
@Test public void NumPages() {fxt.Test_parse_tmpl_str_test("{{NUMBEROFPAGES}}" , "{{test}}", "1");}
@Test public void NumArticles() {fxt.Test_parse_tmpl_str_test("{{NUMBEROFARTICLES}}" , "{{test}}", "2");}
@Test public void NumFiles() {fxt.Test_parse_tmpl_str_test("{{NUMBEROFFILES}}" , "{{test}}", "3");}
@@ -35,5 +35,5 @@ public class Pfunc_wiki_props_tst {
fxt.Lang_by_id_(Xol_lang_stub_.Id_ru);
Init_numArticles(1234); fxt.Test_parse_tmpl_str_test("{{NUMBEROFARTICLES}}" , "{{test}}", "1234"); Init_numArticles(2);
}
private Pfunc_wiki_props_tst Init_numArticles(int v) {fxt.Wiki().Stats().NumArticles_(v); return this;}
private Pfunc_wiki_props_tst Init_numArticles(int v) {fxt.Wiki().Stats().Load_by_db(1, v, 3, 4, 5, 6, 7, 8); return this;}
}

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.xtns.pfuncs.wikis; 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.parsers.*; import gplx.xowa.parsers.tmpls.*;
import gplx.xowa.wikis.metas.*;
import gplx.xowa.wikis.data.site_stats.*;
public class Pfunc_wiki_stats extends Pf_func_base {
@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);
@@ -27,23 +27,23 @@ public class Pfunc_wiki_stats extends Pf_func_base {
byte argx_0 = argx[0];
switch (argx_0) {case Byte_ascii.Ltr_R: case Byte_ascii.Ltr_r: raw = true; break;}
}
Xow_wiki_stats stats = ctx.Wiki().Stats();
int v = 0;
Xow_site_stats_mgr stats = ctx.Wiki().Stats();
long v = 0;
switch (id) {
case Xol_kwd_grp_.Id_num_pages: v = stats.NumPages(); break;
case Xol_kwd_grp_.Id_num_articles: v = stats.NumArticles(); break;
case Xol_kwd_grp_.Id_num_files: v = stats.NumFiles(); break;
case Xol_kwd_grp_.Id_num_edits: v = stats.NumEdits(); break;
case Xol_kwd_grp_.Id_num_views: v = stats.NumViews(); break;
case Xol_kwd_grp_.Id_num_users: v = stats.NumUsers(); break;
case Xol_kwd_grp_.Id_num_users_active: v = stats.NumUsersActive(); break;
case Xol_kwd_grp_.Id_num_admins: v = stats.NumAdmins(); break;
case Xol_kwd_grp_.Id_num_pages: v = stats.Num_pages(); break;
case Xol_kwd_grp_.Id_num_articles: v = stats.Num_articles(); break;
case Xol_kwd_grp_.Id_num_files: v = stats.Num_files(); break;
case Xol_kwd_grp_.Id_num_edits: v = stats.Num_edits(); break;
case Xol_kwd_grp_.Id_num_views: v = stats.Num_views(); break;
case Xol_kwd_grp_.Id_num_users: v = stats.Num_users(); break;
case Xol_kwd_grp_.Id_num_users_active: v = stats.Num_active(); break;
case Xol_kwd_grp_.Id_num_admins: v = stats.Num_admins(); break;
default: throw Err_.new_unhandled(id);
}
if (raw)
bfr.Add_int_variable(v);
bfr.Add_long_variable(v);
else
bfr.Add(ctx.Page().Lang().Num_mgr().Format_num(v));
bfr.Add(ctx.Page().Lang().Num_mgr().Format_num_by_long(v));
}
public Pfunc_wiki_stats(int id) {this.id = id;}
@Override public int Id() {return id;} private int id;