"
@@ -152,46 +138,82 @@ public class Xoctg_catpage_mgr__basic__tst {
));
}
@Test public void Page_all_cols() {
- fxt .Init_itms__pages("A1", "A2", "A3", "B1", "C1").Init_grp__pages(0, 5)
- .Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last
- ( ""
- , "
"
- ));
+ fxt.Init_itms__pages("A1", "A2", "A3", "B1", "C1");
+ fxt.Init__grp_max_(6);
+ fxt.Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last
+ ( ""
+ , "
"
+ ));
+ }
+ @Test public void Page__numeric() { // PURPOSE: check numeric sorting; 0, 9, 10; not 0, 10, 9; DATE:2016-10-09
+ fxt.Init_itms__pages("0", "9", "10");
+ fxt.Init__grp_max_(6);
+ fxt.Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last
+ ( ""
+ , "
"
+ ));
}
@Test public void Title__escape_quotes() {// PURPOSE: quotes in title should be escaped; DATE:2015-12-28
- fxt .Init_itms__pages("A\"1").Init_grp__pages(0, 1)
+ fxt .Init_itms__pages("A\"1")
.Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last
( ""
, "
"
@@ -203,7 +225,7 @@ public class Xoctg_catpage_mgr__basic__tst {
, "
"
, " A"
, " "
, " | "
, " "
@@ -226,44 +248,49 @@ public class Xoctg_catpage_mgr__basic__tst {
}
class Xoctg_catpage_mgr_fxt {
private int grp_max;
+ private Uca_ltr_extractor ltr_extractor = new Uca_ltr_extractor(true);
public Xoctg_catpage_mgr_fxt Clear() {
if (app == null) {
app = Xoa_app_fxt.Make__app__edit();
wiki = Xoa_app_fxt.Make__wiki__edit(app);
- ctg_html = wiki.Html_mgr().Catpage_mgr();
+ ctg_html = wiki.Ctg__catpage_mgr();
}
- ctg = new Xoctg_catpage_ctg(Bry_.new_a7("Ctg_1"));
- grp_max = Xoctg_catpage_mgr.Grp_max_dflt;
+ ctg = new Xoctg_catpage_ctg(1, Bry_.new_a7("Ctg_1"));
+ grp_max = 3; // default to 3 paer page
return this;
} private Xoae_app app; private Xoctg_catpage_mgr ctg_html;
public void Test__calc_col_len(int grp_len, int col_idx, int expd) {Tfds.Eq(expd, Xoctg_fmt_itm_base.Calc_col_len(grp_len, col_idx, 3));}
public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki;
public Xoctg_catpage_ctg Ctg() {return ctg;} private Xoctg_catpage_ctg ctg;
+ public void Init__grp_max_(int v) {this.grp_max = v;}
+ public void Init__prev_hide_y_(byte tid) {ctg.Grp_by_tid(tid).Prev_disable_(true);}
+ public void Init__next_sortkey_(byte tid, String v) {ctg.Grp_by_tid(tid).Next_sortkey_(Bry_.new_u8(v));}
public void Test__navlink(boolean next, String ctg_str, String expd) {
byte[] actl = ctg_html.Fmt(Xoa_ctg_mgr.Tid__page).Bld_bwd_fwd(wiki, Xoa_ttl.Parse(wiki, Bry_.new_a7(ctg_str)), ctg.Grp_by_tid(Xoa_ctg_mgr.Tid__page), grp_max);
Tfds.Eq_str_lines(expd, String_.new_u8(actl));
}
- public Xoctg_catpage_mgr_fxt Init_grp_max(int v) {this.grp_max = v; return this;}
- public Xoctg_catpage_mgr_fxt Init_grp__pages(int bgn, int count) {ctg.Pages().Rng_(bgn, count); return this;}
- public Xoctg_catpage_mgr_fxt Init_grp__files(int bgn, int count) {ctg.Files().Rng_(bgn, count); return this;}
public Xoctg_catpage_mgr_fxt Init_itms__pages(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__page, titles);}
public Xoctg_catpage_mgr_fxt Init_itms__files(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__file, titles);}
public Xoctg_catpage_mgr_fxt Init_itms__subcs(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__subc, titles);}
private Xoctg_catpage_mgr_fxt Init_itms(byte tid, String[] ttls) {
int len = ttls.length;
+ Xoctg_catpage_tmp tmp = new Xoctg_catpage_tmp();
Xoctg_catpage_grp grp = ctg.Grp_by_tid(tid);
+ grp.Count_all_(len);
for (int i = 0; i < len; ++i) {
- Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.new_u8(ttls[i]));
- grp.Itms__add(new Xoctg_catpage_itm(i, ttl, ttl.Page_txt()));
+ byte[] page_ttl_bry = Bry_.new_u8(ttls[i]);
+ Xoa_ttl ttl = Xoa_ttl.Parse(wiki, page_ttl_bry);
+ Xoctg_catpage_itm itm = Xoctg_catpage_itm.New_by_ttl(tid, i, ttl);
+ tmp.Add(itm);
}
- grp.Itms__make();
+ tmp.Make_by_grp(grp);
return this;
}
public void Test__html__page(byte tid, byte grp_char_0, String expd) {
Xoctg_fmt_grp list_mgr = ctg_html.Fmt(tid);
Xoctg_fmt_itm_base itm_fmt = list_mgr.Itm_fmt();
Xoctg_catpage_grp list = ctg.Grp_by_tid(tid);
- itm_fmt.Init_from_ltr(wiki, list);
+ itm_fmt.Init_from_ltr(wiki, list, ltr_extractor);
itm_fmt.Set_ltr_and_bgn(new byte[] {grp_char_0}, 0);
itm_fmt.Col_end_(0, 0);
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
@@ -273,14 +300,14 @@ class Xoctg_catpage_mgr_fxt {
public void Test__html_grp(byte tid, String expd) {
Xoctg_fmt_grp list_mgr = ctg_html.Fmt(tid);
Xoctg_fmt_ltr fmtr_grp = new Xoctg_fmt_ltr(list_mgr.Itm_fmt());
- fmtr_grp.Init_from_grp(wiki, ctg.Grp_by_tid(tid));
+ fmtr_grp.Init_from_grp(wiki, ctg.Grp_by_tid(tid), ltr_extractor);
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
fmtr_grp.Bfr_arg__add(bfr);
Tfds.Eq_str_lines(expd, bfr.To_str_and_rls());
}
public void Test__html__all(byte tid, String expd) {
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
- ctg_html.Fmt(tid).Write_catpage_grp(bfr, wiki, wiki.Lang(), ctg, grp_max);
+ ctg_html.Fmt(tid).Write_catpage_grp(bfr, wiki, wiki.Lang(), ltr_extractor, ctg, grp_max);
Tfds.Eq_str_lines(expd, bfr.To_str_and_rls());
}
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java
index c33f88423..9f48d0d5e 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java
@@ -21,43 +21,39 @@ import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addon
public class Xoctg_catpage_mgr__navlink__tst {
@Before public void init() {fxt.Clear();} private Xoctg_catpage_mgr_fxt fxt = new Xoctg_catpage_mgr_fxt();
@Test public void Navlink__basic() {
- fxt .Init_itms__pages("A1", "A2", "A3").Init_grp_max(1).Init_grp__pages(1, 2)
- .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
+ fxt.Init_itms__pages("A2", "A3", "A4");
+ fxt.Init__next_sortkey_(Xoa_ctg_mgr.Tid__page, "A5");
+ fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
( ""
- , "(
previous 1)"
- , "(
next 1)"
+ , "(
previous 3)"
+ , "(
next 3)"
));
}
@Test public void Navlink__encoded() { // escape quotes and spaces; DATE:2016-01-11
- fxt .Init_itms__pages("A\" 1", "A\" 2", "A\" 3").Init_grp_max(1).Init_grp__pages(1, 2)
- .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
+ fxt.Init_itms__pages("A\" 2", "A\" 3", "A\" 4");
+ fxt.Init__next_sortkey_(Xoa_ctg_mgr.Tid__page, "A\" 5");
+ fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
( ""
- , "(
previous 1)"
- , "(
next 1)"
+ , "(
previous 3)"
+ , "(
next 3)"
));
}
@Test public void Navlink__bos() {
- fxt .Init_itms__pages("A1", "A2", "A3").Init_grp_max(1).Init_grp__pages(0, 1)
- .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
+ fxt.Init_itms__pages("A2", "A3", "A4");
+ fxt.Init__prev_hide_y_(Xoa_ctg_mgr.Tid__page);
+ fxt.Init__next_sortkey_(Xoa_ctg_mgr.Tid__page, "A5");
+ fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
( ""
- , "(previous 1)"
- , "(
next 1)"
+ , "(previous 3)"
+ , "(
next 3)"
));
}
@Test public void Navlink__eos() {
- fxt .Init_itms__pages("A1", "A2", "A3").Init_grp_max(2).Init_grp__pages(2, 3)
- .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
+ fxt.Init_itms__pages("A2", "A3", "A4");
+ fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
( ""
- , "(
previous 2)"
- , "(next 2)"
- ));
- }
- @Test public void Navlink__eos__2() { // PURPOSE.fix: do not suppress next page on penultimate page; DATE:2016-09-25
- fxt .Init_itms__pages("A1", "A2", "A3", "A4").Init_grp_max(2).Init_grp__pages(2, 3)
- .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl
- ( ""
- , "(
previous 2)"
- , "(
next 2)"
+ , "(
previous 3)"
+ , "(next 3)"
));
}
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java
new file mode 100644
index 000000000..d09ba0044
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java
@@ -0,0 +1,182 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see
.
+*/
+package gplx.xowa.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
+import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*;
+import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs.*;
+class Xoctg_catlink_loader {
+ private byte version;
+ private int link_dbs_len;
+ private Db_attach_mgr attach_mgr;
+ private final Bry_bfr sortkey_val_bfr = Bry_bfr_.New();
+ public void Run(Xoctg_catpage_ctg rv, Xow_wiki wiki, Xoctg_catpage_mgr catpage_mgr, Xowd_page_tbl page_tbl, int cat_id, byte grp_tid, boolean url_is_from, byte[] url_sortkey, int limit) {
+ String sql = Bld_sql(catpage_mgr, cat_id, grp_tid, url_is_from, url_sortkey, limit);
+ Load_catlinks(rv, wiki, page_tbl, rv.Grp_by_tid(grp_tid), sql, url_is_from, limit);
+ }
+ public void Make_attach_mgr__v2(Xow_db_mgr db_mgr, int cat_link_db_idx) {
+ this.version = 2;
+ this.link_dbs_len = 1;
+ Xow_db_file cat_link_db = db_mgr.Dbs__get_by_id_or_fail(cat_link_db_idx);
+ this.attach_mgr = new Db_attach_mgr(cat_link_db.Conn(), new Db_attach_itm("link_db_1", cat_link_db.Conn()));
+ }
+ public void Make_attach_mgr__v3_v4(Xow_db_mgr db_mgr, Db_conn cat_core_conn) {
+ // init db vars
+ List_adp db_list = List_adp_.New();
+ Db_conn db_1st = null;
+ int db_idx = 0;
+
+ // fill db_list by looping over each db unless (a) cat_link_db or (b) core_db (if all or few)
+ int len = db_mgr.Dbs__len();
+ for (int i = 0; i < len; ++i) {
+ Xow_db_file cl_db = db_mgr.Dbs__get_at(i);
+ switch (cl_db.Tid()) {
+ case Xow_db_file_.Tid__cat_link: // always use cat_link db
+ break;
+ case Xow_db_file_.Tid__core: // only use core if all or few
+ if (db_mgr.Props().Layout_text().Tid_is_lot())
+ continue;
+ else
+ break;
+ default: // skip all other files
+ continue;
+ }
+
+ // add to db_list
+ if (db_1st == null) db_1st = cl_db.Conn();
+ db_list.Add(new Db_attach_itm("link_db_" + ++db_idx, cl_db.Conn()));
+ }
+
+ // make attach_mgr
+ this.version = 4;
+ this.link_dbs_len = db_list.Len();
+ if (cat_core_conn.Meta_tbl_exists("cat_sort")) {
+ version = 3;
+ db_1st = cat_core_conn;
+ }
+ this.attach_mgr = new Db_attach_mgr(db_1st, (Db_attach_itm[])db_list.To_ary_and_clear(Db_attach_itm.class));
+ }
+ private String Bld_sql (Xoctg_catpage_mgr catpage_mgr, int cat_id, byte grp_tid, boolean url_is_from, byte[] url_sortkey, int limit) {
+ Bry_bfr bfr = Bry_bfr_.New();
+ for (int i = 0; i < link_dbs_len; ++i)
+ Bld_sql_by_db(catpage_mgr, cat_id, grp_tid, url_is_from, url_sortkey, i + List_adp_.Base1, bfr);
+ bfr.Add_str_u8_fmt
+ ( "\nORDER BY cl_to_id, cl_type_id, cl_sortkey {0}"
+ + "\nLIMIT {1}"
+ , url_is_from ? "ASC" : "DESC", limit + 1);
+ return bfr.To_str_and_clear();
+ }
+ private void Bld_sql_by_db (Xoctg_catpage_mgr catpage_mgr, int cat_id, byte grp_tid, boolean url_is_from, byte[] url_sortkey, int link_db_id, Bry_bfr bfr) {
+ if (link_db_id != List_adp_.Base1) bfr.Add_str_a7("\nUNION\n");
+
+ // change sortkey vars per version; note that v3 differs from v2 and v4 b/c of cat_sort tbl
+ String sortkey_col = "cl_sortkey";
+ String sortkey_join = "";
+ if (version == 3) { // NOTE: version 3 takes sortkey from cat_sort
+ sortkey_col = "cs.cs_key";
+ sortkey_join = "\n JOIN cat_sort cs ON cl.cl_sortkey_id = cs.cs_id";
+ }
+
+ // sortkey_val
+ byte[] sortkey_val = null;
+ String sortkey_prefix_fld = version == 4 ? "cl_sortkey_prefix" : "''";
+ sortkey_val = Build_sortkey_val(sortkey_val_bfr, version, catpage_mgr.Collation_mgr(), url_sortkey);
+
+ // bld sql; NOTE: building sql with args embedded b/c (a) UNION requires multiple Crt_arg for each ?; (EX: 4 unions, 3 ? require 12 .Crt_arg); (b) easier to debug
+ String sql = Db_sql_.Make_by_fmt(String_.Ary
+ ( "SELECT cl_to_id"
+ , ", cl_from"
+ , ", cl_type_id"
+ , ", {3} AS cl_sortkey"
+ , ", {7} AS cl_sortkey_prefix"
+ , "FROM
cat_link cl{6}"
+ , "WHERE cl_to_id = {1}"
+ , "AND cl_type_id = {2}"
+ , "AND {3} {4} {5}"
+ ), link_db_id, cat_id, grp_tid, sortkey_col, url_is_from ? ">=" : "<", sortkey_val, sortkey_join, sortkey_prefix_fld);
+ bfr.Add_str_u8(sql);
+ }
+ private void Load_catlinks(Xoctg_catpage_ctg rv, Xow_wiki wiki, Xowd_page_tbl page_tbl, Xoctg_catpage_grp grp, String sql, boolean url_is_from, int limit) {
+ // init; prep sql
+ Xoctg_page_loader catlink_loader = new Xoctg_page_loader(wiki);
+ Ordered_hash hash = catlink_loader.Hash();
+ sql = attach_mgr.Resolve_sql(sql);
+
+ // run sql and create itms based on cat_link
+ Xoctg_catpage_itm itm_zth = null;
+ Db_rdr rdr = Db_rdr_.Empty;
+ int row_idx = 0;
+ try {
+ attach_mgr.Attach();
+ rdr = attach_mgr.Conn_main().Stmt_sql(sql).Exec_select__rls_auto();
+ while (rdr.Move_next()) {
+ Xoctg_catpage_itm itm = Xoctg_catpage_itm.New_by_rdr(rdr, version);
+ if (row_idx++ < limit) // row_idx >= limit for last row; EX: 200 < 200
+ hash.Add(itm.Page_id(), itm);
+ else { // last row; EX: 201
+ if (url_is_from) // from=some_key; 201st row is sort_key for "(Next 200)"
+ itm_zth = itm;
+ else // until=some_key; 201st row means that 200th row is not 1st row; show prev link
+ grp.Prev_disable_(false);
+ }
+ }
+ }
+ finally {
+ rdr.Rls();
+ attach_mgr.Detach();
+ }
+
+ // load ns / ttl from page
+ page_tbl.Select_in__id(catlink_loader);
+ grp.Itms_((Xoctg_catpage_itm[])hash.To_ary_and_clear(Xoctg_catpage_itm.class));
+
+ // set data for Next 200 / Previous 200
+ if (itm_zth != null) {
+ if (version == 4) {
+ Xowd_page_itm tmp_pg = new Xowd_page_itm();
+ page_tbl.Select_by_id(tmp_pg, itm_zth.Page_id());
+ Xoa_ttl zth_ttl = wiki.Ttl_parse(tmp_pg.Ns_id(), tmp_pg.Ttl_page_db());
+ itm_zth.Page_ttl_(zth_ttl);
+ itm_zth.Sortkey_handle_make(Bry_bfr_.New(), grp.Itms__get_at(grp.Itms__len() - 1).Sortkey_handle());
+ grp.Next_sortkey_(itm_zth.Sortkey_handle());
+ }
+ else
+ grp.Next_sortkey_(itm_zth.Sortkey_handle());
+ }
+ }
+ public static byte[] Build_sortkey_val(Bry_bfr sortkey_val_bfr, byte version, Xoctg_collation_mgr collation_mgr, byte[] url_sortkey) {
+ // find \n and ignore everything after it; needed else "< 'A\nA'" will pull up "A"; NOTE: can't find logic in MediaWiki CategoryViewer.php; DATE:2016-10-11
+ // ALSO: needed for v2 else SQL will literally have WHERE cl_sortkey = 'A\nA';
+ byte[] tmp_sortkey = url_sortkey;
+ int nl_pos = Bry_find_.Find_fwd(tmp_sortkey, Byte_ascii.Nl);
+ if (nl_pos != Bry_find_.Not_found)
+ tmp_sortkey = Bry_.Mid(tmp_sortkey, 0, nl_pos);
+
+ if (version == 4) {
+ if (Bry_.Len_gt_0(url_sortkey)) {
+ // make sortkey_val
+ sortkey_val_bfr.Add_byte(Byte_ascii.Ltr_x).Add_byte_apos();
+ gplx.core.encoders.Hex_utl_.Encode_bfr(sortkey_val_bfr, collation_mgr.Get_sortkey(tmp_sortkey));
+ sortkey_val_bfr.Add_byte_apos();
+ }
+ else
+ sortkey_val_bfr.Add_byte_apos().Add_byte_apos();
+ }
+ else
+ sortkey_val_bfr.Add_byte_apos().Add(Db_sql_.Escape_arg(tmp_sortkey)).Add_byte_apos();
+ return sortkey_val_bfr.To_bry_and_clear();
+ }
+}
\ No newline at end of file
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader__tst.java
new file mode 100644
index 000000000..65a49d135
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader__tst.java
@@ -0,0 +1,39 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
+import org.junit.*; import gplx.core.tests.*; import gplx.xowa.apps.urls.*;
+import gplx.xowa.langs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs.*;
+public class Xoctg_catlink_loader__tst {
+ private final Xoctg_catlink_loader__fxt fxt = new Xoctg_catlink_loader__fxt();
+ @Test public void Build_sortkey_val__v4() { // PURPOSE: remove "\n" and afterwards else will omit 1 record
+ fxt.Test__build_sortkey_sql(4, "A\nA", "x'41'"); // fails if "x'410a41'"
+ }
+ @Test public void Build_sortkey_val__v2() { // PURPOSE: remove "\n" and afterwards else SQL will be malformed
+ fxt.Test__build_sortkey_sql(2, "A\nA", "'A'"); // fails if "'A\nA'"
+ }
+}
+class Xoctg_catlink_loader__fxt {
+ public void Test__build_sortkey_sql(int version, String sortkey, String expd) {
+ Xoae_app app = Xoa_app_fxt.Make__app__edit();
+ Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "de.wikipedia.org"); // use "de.wikipedia.org" for simple "uppercase" collation
+ Xoctg_collation_mgr collation_mgr = new Xoctg_collation_mgr(wiki);
+
+ Bry_bfr bfr = Bry_bfr_.New();
+ Gftest.Eq__str(expd, Xoctg_catlink_loader.Build_sortkey_val(bfr, Byte_.By_int(version), collation_mgr, Bry_.new_u8(sortkey)));
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catpage_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catpage_loader.java
new file mode 100644
index 000000000..36a045ebd
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catpage_loader.java
@@ -0,0 +1,71 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
+import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.wikis.ctgs.dbs.*;
+import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.dbs.*;
+public class Xoctg_catpage_loader {
+ public Xoctg_catpage_ctg Load_ctg_or_null(Xow_wiki wiki, Xoctg_catpage_mgr catpage_mgr, Xoctg_catpage_url cat_url, Xoa_ttl cat_ttl, int limit) {
+ // get cat_id from page_tbl
+ Xow_db_mgr db_mgr = wiki.Data__core_mgr();
+ Xowd_page_tbl page_tbl = db_mgr.Db__core().Tbl__page();
+ Xowd_page_itm page_itm = page_tbl.Select_by_ttl_as_itm_or_null(cat_ttl);
+ if (page_itm == null) {
+ Gfo_usr_dlg_.Instance.Warn_many("", "", "category does not exist in page table; ttl=~{0}", cat_ttl.Full_db());
+ return null;
+ }
+ int cat_id = page_itm.Id();
+
+ // get cat_core_itm from cat_core_tbl
+ Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr);
+ Xowd_category_itm cat_core_itm = cat_core_tbl.Select(cat_id);
+ if (cat_core_itm == Xowd_category_itm.Null) {
+ Gfo_usr_dlg_.Instance.Log_many("", "", "category does not exist in cat_core table; ttl=~{0}", cat_ttl.Full_db()); // NOTE: this is not rare as Category pages can be created as deliberately empty, or as redirects; fr.w:Catégorie:Utilisateur_hess-4; DATE:2016-09-12
+ return null;
+ }
+
+ // load itms from cat_link_db for each grp_tid
+ Xoctg_catpage_ctg rv = new Xoctg_catpage_ctg(cat_id, cat_ttl.Page_txt());
+ for (byte grp_tid = Xoa_ctg_mgr.Tid__subc; grp_tid < Xoa_ctg_mgr.Tid___max; ++grp_tid) {
+ Xoctg_catpage_grp grp = rv.Grp_by_tid(grp_tid);
+ grp.Count_all_(cat_core_itm.Count_by_tid(grp_tid)); // set total counts per grp based on cat_core_itm;
+
+ // init url_vars
+ boolean url_is_from = cat_url.Grp_fwds()[grp_tid]; // EX: "pagefrom=A"; "pageuntil=B"
+ byte[] url_sortkey = cat_url.Grp_keys()[grp_tid];
+
+ // set prev / next props to dflt values
+ if (url_is_from) { // url is from; EX: from=A
+ if (Bry_.Len_eq_0(url_sortkey)) // no sortkey specified for group, so group always starts with 1st itm -> disable previous link
+ grp.Prev_disable_(true);
+ }
+ else { // url is until; EX: until=A
+ grp.Prev_disable_(true); // default prev link to disabled; loader will load 201 items and set to false if 201st found
+ grp.Next_sortkey_(url_sortkey); // next sortkey is always sortkey of until url arg;
+ }
+
+ // load links
+ Xoctg_catlink_loader loader = new Xoctg_catlink_loader();
+ if (cat_core_itm.File_idx() == -1) // v3 or v4: loop over all cat_link dbs {
+ loader.Make_attach_mgr__v3_v4 (db_mgr, cat_core_tbl.Conn());
+ else // v2: use cat_link_db
+ loader.Make_attach_mgr__v2 (db_mgr, cat_core_itm.File_idx());
+ loader.Run(rv, wiki, catpage_mgr, page_tbl, cat_id, grp_tid, url_is_from, url_sortkey, limit);
+ }
+ return rv;
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_page_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_page_loader.java
new file mode 100644
index 000000000..65f736531
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_page_loader.java
@@ -0,0 +1,42 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
+import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*;
+import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*;
+public class Xoctg_page_loader implements Select_in_cbk {
+ private final Xow_wiki wiki;
+ private final Ordered_hash hash = Ordered_hash_.New();
+ public Xoctg_page_loader(Xow_wiki wiki) {this.wiki = wiki;}
+ public Ordered_hash Hash() {return hash;}
+ public int Hash_max() {return hash.Len();}
+ public void Write_sql(Bry_bfr bfr, int idx) {
+ Xoctg_catpage_itm itm = (Xoctg_catpage_itm)hash.Get_at(idx);
+ bfr.Add_int_variable(itm.Page_id());
+ }
+ public void Read_data(Db_rdr rdr) {
+ // read values from page_tbl
+ int page_id = rdr.Read_int("page_id");
+ int page_ns = rdr.Read_int("page_namespace");
+ byte[] page_ttl = rdr.Read_bry_by_str("page_title");
+
+ // get itm and set data
+ Xoctg_catpage_itm itm = (Xoctg_catpage_itm)hash.Get_by(page_id);
+ if (itm == null) return; // NOTE: itms can exist in cat_links_tbl, but not in page_tbl; EX:User:Any_page
+ itm.Page_ttl_(wiki.Ttl_parse(page_ns, page_ttl));
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java
index 0dadf10c2..fc0fb109d 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java
@@ -17,12 +17,15 @@ along with this program. If not, see .
*/
package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
public class Xoctg_catpage_ctg {
- public Xoctg_catpage_ctg(byte[] name) {this.name = name;}
- public byte[] Name() {return name;} private final byte[] name;
- public Xoctg_catpage_grp Subcs() {return subcs;} private final Xoctg_catpage_grp subcs = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__subc);
- public Xoctg_catpage_grp Pages() {return pages;} private final Xoctg_catpage_grp pages = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__page);
- public Xoctg_catpage_grp Files() {return files;} private final Xoctg_catpage_grp files = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__file);
- public int Total() {return subcs.Itms__len() + pages.Itms__len() + files.Itms__len();}
+ public Xoctg_catpage_ctg(int id, byte[] name) {
+ this.id = id; this.name = name;
+ }
+ public int Id() {return id;} private final int id;
+ public byte[] Name() {return name;} private final byte[] name;
+ public Xoctg_catpage_grp Subcs() {return subcs;} private final Xoctg_catpage_grp subcs = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__subc);
+ public Xoctg_catpage_grp Pages() {return pages;} private final Xoctg_catpage_grp pages = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__page);
+ public Xoctg_catpage_grp Files() {return files;} private final Xoctg_catpage_grp files = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__file);
+ public int Total() {return subcs.Count_all() + pages.Count_all() + files.Count_all();}
public Xoctg_catpage_grp Grp_by_tid(byte tid) {
switch (tid) {
case Xoa_ctg_mgr.Tid__subc: return subcs;
@@ -31,10 +34,4 @@ public class Xoctg_catpage_ctg {
default: throw Err_.new_unhandled(tid);
}
}
- public void Make_itms() {
- for (byte i = 0; i < Xoa_ctg_mgr.Tid___max; ++i) {
- Xoctg_catpage_grp grp = Grp_by_tid(i);
- grp.Itms__make();
- }
- }
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java
index cd4556f18..82c8e29e8 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java
@@ -17,27 +17,38 @@ along with this program. If not, see .
*/
package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
public class Xoctg_catpage_grp {
- private final List_adp tmp_list = List_adp_.New();
+ private Xoctg_catpage_itm[] itms = Xoctg_catpage_itm.Ary_empty;
+ private byte[] next_sortkey = Bry_.Empty;
public Xoctg_catpage_grp(byte tid) {this.tid = tid;}
- public byte Tid() {return tid;} private byte tid; // subc|page|file
- public int Bgn() {return bgn;} private int bgn; // idx of 1st item; EX: 200
- public int End() {return end;} private int end; // idx of nth item + 1; EX: 399
- public int Count_by_page() {return end - bgn;} // count of items on page; EX: 200
- public int Itms__len() {return itms_len;} private int itms_len; // count of items in entire category; EX: 456
- public Xoctg_catpage_itm[] Itms() {return itms;} private Xoctg_catpage_itm[] itms = Xoctg_catpage_itm.Ary_empty;
- public Xoctg_catpage_itm Itms__get_at(int i) {
- if (i < 0 || i >= itms.length) throw Err_.new_wo_type("catpage: i is out of bounds", "i", i, "len", itms.length, "tid", tid);
- Xoctg_catpage_itm rv = itms[i]; if (rv == null) throw Err_.new_wo_type("ctg.view: itm is null", "i", i, "len", itms.length, "tid", tid);
- return rv;
+ public byte Tid() {return tid;} private byte tid; // subc|page|file
+ public int Count_all() {return count_all;} private int count_all; // count of items in entire category; EX: 456
+ public boolean Prev_disable() {return prev_disable;} private boolean prev_disable; // prev_link: disable link
+ public byte[] Next_sortkey() {return next_sortkey;} // next_link: set sortkey
+ public int Itms__len() {return itms.length;}
+ public Xoctg_catpage_itm Itms__get_at(int i) {return itms[i];}
+
+ public void Count_all_(int v) {this.count_all = v;}
+ public void Prev_disable_(boolean v) {this.prev_disable = v;}
+ public void Next_sortkey_(byte[] v) {this.next_sortkey = v;}
+ public void Itms_(Xoctg_catpage_itm[] v) {
+ this.itms = v;
+ Array_.Sort(itms, new Xoctg_catpage_itm_sorter()); // NOTE: need to reorder for page_until b/c ORDER BY DESC
+
+ // make sortkey_handle
+ Bry_bfr tmp_bfr = Bry_bfr_.New();
+ int itms_len = itms.length;
+ byte[] prv_sortkey_handle = Bry_.Empty;
+ for (int i = 0; i < itms_len; ++i) {
+ Xoctg_catpage_itm itm = itms[i];
+ prv_sortkey_handle = itm.Sortkey_handle_make(tmp_bfr, prv_sortkey_handle);
+ }
}
- public void Itms__add(Xoctg_catpage_itm sub) {tmp_list.Add(sub);}
- public void Itms__make() {
- tmp_list.Sort_by(Xoctg_catpage_itm_sorter__sort_key.Sorter);
- itms = (Xoctg_catpage_itm[])tmp_list.To_ary_and_clear(Xoctg_catpage_itm.class);
- bgn = 0;
- end = itms_len = itms.length;
- }
- public void Rng_(int bgn, int end) {
- this.bgn = bgn; this.end = end;
+
+}
+class Xoctg_catpage_itm_sorter implements gplx.core.lists.ComparerAble {
+ public int compare(Object lhsObj, Object rhsObj) {
+ Xoctg_catpage_itm lhs = (Xoctg_catpage_itm)lhsObj;
+ Xoctg_catpage_itm rhs = (Xoctg_catpage_itm)rhsObj;
+ return Bry_.Compare(lhs.Sortkey_binary(), rhs.Sortkey_binary());
}
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java
index 8fb9a12cb..d3fd4b6ea 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java
@@ -16,17 +16,86 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
+import gplx.dbs.*; import gplx.xowa.wikis.nss.*;
public class Xoctg_catpage_itm {
- public Xoctg_catpage_itm(int page_id, Xoa_ttl page_ttl, byte[] sort_key) {
+ private byte version;
+ Xoctg_catpage_itm(byte version, byte grp_tid, int page_id, byte[] sortkey_prefix, byte[] sortkey_binary) {
+ this.version = version;
+ this.grp_tid = grp_tid;
this.page_id = page_id;
- this.page_ttl = page_ttl;
- this.sort_key = sort_key.length == 0 ? page_ttl.Page_db() : sort_key; // v1 will not have sortkey data; PAGE:s.w:Category:Computer_science DATE:2015-11-22
+ this.page_ttl = Xoa_ttl.Null;
+ this.sortkey_prefix = sortkey_prefix;
+ this.sortkey_handle = sortkey_prefix; // default handle to sortkey_prefix;
+ this.sortkey_binary = sortkey_binary;
+ }
+ public byte Grp_tid() {return grp_tid;} private final byte grp_tid; // v2-v4:cl_type_id; subc,page,file
+ public int Page_id() {return page_id;} private final int page_id; // v2-v4:cl_from
+ public byte[] Sortkey_prefix() {return sortkey_prefix;} private byte[] sortkey_prefix; // v2-v3:cl_sortkey; v4:cl_sortkey_prefix
+ public byte[] Sortkey_handle() {return sortkey_handle;} private byte[] sortkey_handle; // v2-v3:cl_sortkey; v4:cl_sortkey_prefix\nttl_txt; never "cl_sortkey" which is binary ICU value;
+ public byte[] Sortkey_binary() {return sortkey_binary;} private byte[] sortkey_binary; // v2-v4:cl_sortkey; note that v4 is binary icu value
+ public Xoa_ttl Page_ttl() {return page_ttl;} private Xoa_ttl page_ttl;
+
+ public void Page_ttl_(Xoa_ttl ttl) {
+ this.page_ttl = ttl;
+ // sortkey_prefix will be blank for v2; use page_ttl; PAGE:s.w:Category:Computer_science DATE:2015-11-22
+ if (version == Version__2 && Bry_.Len_eq_0(sortkey_prefix))
+ sortkey_prefix = page_ttl.Page_txt();
+
+ // sortkey_binary will be blank for v2,v3; use page_ttl; PAGE:fr.w:Article_contenant_un_appel_à_traduction_en_anglais; DATE:2016-10-11
+ if (version != Version__4 && Bry_.Len_eq_0(sortkey_binary)) sortkey_binary = page_ttl.Page_txt();
+ }
+ public byte[] Sortkey_handle_make(Bry_bfr tmp_bfr, byte[] prv_sortkey_handle) {
+ // page.tbl missing even though in cat_link.tbl; happens for "User:" namespace pages;
+ if (page_ttl == Xoa_ttl.Null) {
+ // sortkey_prefix exists; happens for [[Category:A]] as opposed to [[Category:A|some_sortkey_prefix]]
+ if (Bry_.Len_gt_0(sortkey_prefix)) {
+ sortkey_handle = sortkey_prefix;
+ return sortkey_handle; // set sortkey_prefix as new prv_sortkey_handle;
+ }
+ else {
+ // set sortkey_handle to "prv_sortkey" + "page_id"; needed for multiple "missing" catlinks which span 200 page boundaries
+ tmp_bfr.Add(prv_sortkey_handle);
+ tmp_bfr.Add_byte_nl();
+ tmp_bfr.Add_int_variable(page_id);
+ sortkey_handle = tmp_bfr.To_bry_and_clear();
+ return prv_sortkey_handle;
+ }
+ }
+ // page.tbl exists
+ else {
+ // "In UCA, tab is the only character that can sort above LF so we strip both of them from the original prefix."; Title.php|getCategorySortKey
+ if (sortkey_prefix.length == 0) {
+ sortkey_handle = page_ttl.Page_txt();
+ }
+ else {
+ byte[] sortkey_normalized = Bry_.Replace(sortkey_prefix, Sortkey_prefix_replace__src, Sortkey_prefix_replace__trg);
+ tmp_bfr.Add(sortkey_normalized);
+ tmp_bfr.Add_byte_nl().Add(page_ttl.Page_txt()); // "$prefix\n$unprefixed";
+ sortkey_handle = tmp_bfr.To_bry_and_clear();
+ }
+ return sortkey_handle;
+ }
}
- public int Page_id() {return page_id;} private int page_id;
- public Xoa_ttl Page_ttl() {return page_ttl;} private Xoa_ttl page_ttl;
- public byte[] Sort_key() {return sort_key;} private byte[] sort_key;
- public boolean Missing() {return missing;} private boolean missing; // not used; remove?;
- public void Missing_y_() {missing = true;}
public static final Xoctg_catpage_itm[] Ary_empty = new Xoctg_catpage_itm[0];
+ public static Xoctg_catpage_itm New_by_rdr(Db_rdr rdr, byte version) {
+ byte[] sortkey_binary = Bry_.Empty;
+ byte[] sortkey_prefix = Bry_.Empty;
+ if (version == Version__4) {
+ sortkey_binary = rdr.Read_bry("cl_sortkey");
+ sortkey_prefix = rdr.Read_bry_by_str("cl_sortkey_prefix");
+ }
+ else {
+ sortkey_binary = Bry_.Empty;
+ sortkey_prefix = rdr.Read_bry_by_str("cl_sortkey");
+ }
+ return new Xoctg_catpage_itm(version, rdr.Read_byte("cl_type_id"), rdr.Read_int("cl_from"), sortkey_prefix, sortkey_binary);
+ }
+ public static Xoctg_catpage_itm New_by_ttl(byte grp_tid, int page_id, Xoa_ttl ttl) { // TEST
+ Xoctg_catpage_itm rv = new Xoctg_catpage_itm(Version__4, grp_tid, page_id, ttl.Page_txt(), Bry_.Empty);
+ rv.Page_ttl_(ttl);
+ return rv;
+ }
+ private static final byte Version__2 = 2, Version__4 = 4;
+ private static final byte[] Sortkey_prefix_replace__src = Bry_.new_a7("\n\t"), Sortkey_prefix_replace__trg = Bry_.new_a7(" ");
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm_sorter__sort_key.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java
similarity index 52%
rename from 400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm_sorter__sort_key.java
rename to 400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java
index 3bdb77ede..36d69ea1a 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm_sorter__sort_key.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java
@@ -16,15 +16,28 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
-public class Xoctg_catpage_itm_sorter__sort_key implements gplx.core.lists.ComparerAble, gplx.core.lists.binary_searches.Binary_comparer {
- public int compare(Object lhsObj, Object rhsObj) {
- Xoctg_catpage_itm lhs = (Xoctg_catpage_itm)lhsObj;
- Xoctg_catpage_itm rhs = (Xoctg_catpage_itm)rhsObj;
- return Bry_.Compare(lhs.Sort_key(), rhs.Sort_key());
+public class Xoctg_catpage_tmp {
+ private final List_adp subc_list = List_adp_.New(), page_list = List_adp_.New(), file_list = List_adp_.New();
+ public void Add(Xoctg_catpage_itm itm) {
+ List_adp list = Get_by_tid(itm.Grp_tid());
+ list.Add(itm);
}
- public int Compare_val_to_obj(Object val, Object obj) {
- Xoctg_catpage_itm itm = (Xoctg_catpage_itm)obj;
- return Bry_.Compare((byte[])val, itm.Sort_key());
+ public void Make_by_ctg(Xoctg_catpage_ctg ctg) { // TEST:
+ for (byte tid = 0; tid < Xoa_ctg_mgr.Tid___max; ++tid)
+ Make_by_grp(ctg.Grp_by_tid(tid));
+ }
+ public void Make_by_grp(Xoctg_catpage_grp grp) {
+ byte tid = grp.Tid();
+ List_adp list = Get_by_tid(tid);
+ if (list.Len() == 0) return;
+ grp.Itms_((Xoctg_catpage_itm[])list.To_ary_and_clear(Xoctg_catpage_itm.class));
+ }
+ private List_adp Get_by_tid(byte tid) {
+ switch (tid) {
+ case Xoa_ctg_mgr.Tid__subc: return subc_list;
+ case Xoa_ctg_mgr.Tid__page: return page_list;
+ case Xoa_ctg_mgr.Tid__file: return file_list;
+ default: throw Err_.new_unhandled_default(tid);
+ }
}
- public static final Xoctg_catpage_itm_sorter__sort_key Sorter = new Xoctg_catpage_itm_sorter__sort_key();
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java
index 44425d2ac..8f4164a20 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java
@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
-import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.langs.htmls.encoders.*;
+import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.core.intls.ucas.*;
import gplx.xowa.wikis.nss.*;
import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*;
public class Xoctg_fmt_grp { // subc|page|file
@@ -32,47 +32,43 @@ public class Xoctg_fmt_grp { // subc|page|file
this.url_arg_bgn = url_arg_bgn; this.url_arg_end = url_arg_end; this.div_id = div_id;
}
public Xoctg_fmt_itm_base Itm_fmt() {return itm_fmt;} private final Xoctg_fmt_itm_base itm_fmt;
- public void Write_catpage_grp(Bry_bfr bfr, Xow_wiki wiki, Xol_lang_itm lang, Xoctg_catpage_ctg dom_ctg, int grp_max) { // TEST:
+ public void Write_catpage_grp(Bry_bfr bfr, Xow_wiki wiki, Xol_lang_itm lang, Uca_ltr_extractor ltr_extractor, Xoctg_catpage_ctg dom_ctg, int grp_max) { // TEST:
Xoctg_catpage_grp dom_grp = dom_ctg.Grp_by_tid(tid);
- if (dom_grp.Itms__len() == 0) return; // no items in grp; EX: 0 items in File
+ if (dom_grp.Count_all() == 0) return; // no items in grp; EX: 0 items in File
// get msgs
Xow_msg_mgr msg_mgr = wiki.Msg_mgr();
byte[] msg_label_bry = msg_mgr.Val_by_id_args(msg_label_id, dom_ctg.Name());
- byte[] msg_stats_bry = msg_mgr.Val_by_id_args(msg_stats_id, dom_grp.Count_by_page(), dom_grp.Itms__len());
+ byte[] msg_stats_bry = msg_mgr.Val_by_id_args(msg_stats_id, dom_grp.Itms__len(), dom_grp.Count_all());
// get nav html; next / previous 200
Xoa_ttl ctg_ttl = wiki.Ttl_parse(Xow_ns_.Tid__category, dom_ctg.Name());
byte[] nav_html = this.Bld_bwd_fwd(wiki, ctg_ttl, dom_grp, grp_max);
// init grp; write
- itms_fmt.Init_from_grp(wiki, dom_grp);
+ itms_fmt.Init_from_grp(wiki, dom_grp, ltr_extractor);
Fmt__ctg.Bld_many(bfr, div_id, msg_label_bry, msg_stats_bry, nav_html, lang.Key_bry(), lang.Dir_ltr_bry(), itms_fmt);
}
public byte[] Bld_bwd_fwd(Xow_wiki wiki, Xoa_ttl ttl, Xoctg_catpage_grp view_grp, int grp_max) { // TEST:
- if (view_grp.Itms__len() < grp_max) return Bry_.Empty; // < 200; never show;
+ if (view_grp.Count_all() < grp_max) return Bry_.Empty; // < 200; never show;
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_k004();
Html_nav_bry(bfr, wiki, ttl, view_grp, grp_max, Bool_.N);
Html_nav_bry(bfr, wiki, ttl, view_grp, grp_max, Bool_.Y);
return bfr.To_bry_and_rls();
}
- private void Html_nav_bry(Bry_bfr bfr, Xow_wiki wiki, Xoa_ttl ttl, Xoctg_catpage_grp grp, int grp_max, boolean type_is_next) {
+ private void Html_nav_bry(Bry_bfr bfr, Xow_wiki wiki, Xoa_ttl ttl, Xoctg_catpage_grp grp, int grp_max, boolean url_is_from) {
Bry_bfr href_bfr = wiki.Utl__bfr_mkr().Get_b512();
// get nav_href; EX:href="/wiki/Category:Ctg_1?pageuntil=A1#mw-pages"
wiki.Html__href_wtr().Build_to_bfr(href_bfr, wiki.App(), Xoh_wtr_ctx.Basic, wiki.Domain_bry(), ttl);
byte[] arg_idx_lbl = null; byte[] arg_sortkey = null;
- if (type_is_next) {
+ if (url_is_from) {
arg_idx_lbl = url_arg_bgn;
-
- // get next category after last one on page; needed for "Next 200 (href=Cat_201)"
- int nxt_idx = grp.End();
- if (nxt_idx == grp.Itms__len()) --nxt_idx; // if last item, then grp.End() does not exist; just use last one
- arg_sortkey = grp.Itms__get_at(nxt_idx).Sort_key();
+ arg_sortkey = grp.Next_sortkey();
}
else {
arg_idx_lbl = url_arg_end;
- arg_sortkey = grp.Itms__get_at(grp.Bgn()).Sort_key(); // use 1st item as sortkey for "until" args
+ arg_sortkey = grp.Itms__get_at(0).Sortkey_handle(); // use 1st item as sortkey for "until" args
}
href_bfr.Add_byte(Byte_ascii.Question).Add(arg_idx_lbl).Add_byte(Byte_ascii.Eq); // filefrom=
Gfo_url_encoder_.Http_url.Encode(href_bfr, arg_sortkey); // Abc
@@ -80,12 +76,12 @@ public class Xoctg_fmt_grp { // subc|page|file
byte[] nav_href = href_bfr.To_bry_and_rls();
// get nav_text
- int nav_text_id = type_is_next ? Xol_msg_itm_.Id_next_results : Xol_msg_itm_.Id_prev_results;
+ int nav_text_id = url_is_from ? Xol_msg_itm_.Id_next_results : Xol_msg_itm_.Id_prev_results;
byte[] nav_text = wiki.Msg_mgr().Val_by_id_args(nav_text_id, grp_max); // next 200 / previous 200
// print text if 1st / zth page; else, print html
- if ( ( type_is_next && grp.Bgn() + grp_max > grp.Itms__len())
- || (!type_is_next && grp.Bgn() - grp_max < 0)
+ if ( ( url_is_from && Bry_.Len_eq_0(grp.Next_sortkey()))
+ || (!url_is_from && grp.Prev_disable())
)
Fmt__nav__text.Bld_many(bfr, nav_text);
else
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java
index 1d3c9b98e..eda036130 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java
@@ -17,27 +17,32 @@ along with this program. If not, see .
*/
package gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.htmls.core.htmls.*;
-import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
+import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.core.intls.ucas.*;
import gplx.xowa.users.history.*;
import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*;
public abstract class Xoctg_fmt_itm_base implements gplx.core.brys.Bfr_arg {
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
private Xow_wiki wiki;
private Xoctg_catpage_grp grp;
+ private Uca_ltr_extractor ltr_extractor;
private byte[] ltr_cur; private int loop_bgn; private int col_end;
public int Loop_end_idx() {return loop_end_idx;} private int loop_end_idx;
public boolean Loop_ends_at_col() {return loop_ends_at_col;} private boolean loop_ends_at_col;
public void Col_end_(int col_bgn, int col_idx) {
- this.col_end = col_bgn + Calc_col_len(grp.Count_by_page(), col_idx, Cols_max);
+ this.col_end = col_bgn + Calc_col_len(grp.Itms__len(), col_idx, Cols_max);
+ }
+ public void Init_from_ltr(Xow_wiki wiki, Xoctg_catpage_grp grp, Uca_ltr_extractor ltr_extractor) {
+ this.wiki = wiki;
+ this.grp = grp;
+ this.ltr_extractor = ltr_extractor;
}
- public void Init_from_ltr(Xow_wiki wiki, Xoctg_catpage_grp grp) {this.wiki = wiki; this.grp = grp;}
public void Set_ltr_and_bgn(byte[] ltr_cur, int loop_bgn) {this.ltr_cur = ltr_cur; this.loop_bgn = loop_bgn;}
public void Bfr_arg__add(Bry_bfr bfr) {
// init vars
Xoh_href_parser href_parser = wiki.App().Html__href_parser();
Xou_history_mgr history_mgr = wiki.App().User().History_mgr();
- int grp_end = grp.End();
+ int grp_end = grp.Itms__len();
// loop over itms;
for (int i = loop_bgn; i < grp_end; i++) {
@@ -50,28 +55,30 @@ public abstract class Xoctg_fmt_itm_base implements gplx.core.brys.Bfr_arg {
// get sortkey
Xoctg_catpage_itm itm = grp.Itms__get_at(i);
- byte[] itm_sortkey = itm.Sort_key();
+ byte[] itm_sortkey = itm.Sortkey_handle();
// reached end of ltr; exit
- if (!Bry_.Has_at_bgn(itm_sortkey, ltr_cur, 0, itm_sortkey.length)) {
+ byte[] ltr_1st = ltr_extractor.Get_1st_ltr(itm_sortkey);
+ if (!Bry_.Has_at_bgn(ltr_1st, ltr_cur, 0, ltr_1st.length)) {
loop_end_idx = i;
loop_ends_at_col = i == col_end;
return;
}
- Bld_html(bfr, wiki, history_mgr, href_parser, itm, itm.Page_ttl());
+ Xoa_ttl itm_ttl = itm.Page_ttl();
+ Bld_html(bfr, wiki, history_mgr, href_parser, itm, itm_ttl);
}
loop_end_idx = grp_end;
loop_ends_at_col = true;
}
@gplx.Virtual public void Bld_html(Bry_bfr bfr, Xow_wiki wiki, Xou_history_mgr history_mgr, Xoh_href_parser href_parser, Xoctg_catpage_itm itm, Xoa_ttl ttl) {
- byte[] itm_full_ttl = Gfh_utl.Escape_html_as_bry(tmp_bfr, ttl.Full_txt_w_ttl_case());// NOTE: ttl.Full_txt() to get full ns; EX: Template:A instead of just "A"
- if (itm.Missing())
- fmt_missing.Bld_many(bfr, itm.Page_id(), itm_full_ttl);
+ if (ttl == Xoa_ttl.Null)
+ fmt_missing.Bld_many(bfr, itm.Page_id(), itm.Sortkey_handle());
else {
+ byte[] itm_full_ttl = Gfh_utl.Escape_html_as_bry(tmp_bfr, ttl.Full_txt_w_ttl_case());// NOTE: ttl.Full_txt() to get full ns; EX: Template:A instead of just "A"
byte[] itm_href = wiki.Html__href_wtr().Build_to_bry(wiki, ttl);
byte[] itm_atr_cls = Xoh_lnki_wtr.Lnki_cls_visited(history_mgr, wiki.Domain_bry(), ttl.Page_txt()); // NOTE: must be ttl.Page_txt() in order to match Xou_history_mgr.Add
- fmt_exists.Bld_many(bfr, itm_href, itm_atr_cls, itm_full_ttl, itm_full_ttl);
+ fmt_exists.Bld_many(bfr, itm_href, itm_atr_cls, itm_full_ttl, itm_full_ttl, gplx.core.encoders.Hex_utl_.Encode_bry(itm.Sortkey_binary()));
}
}
private static final Bry_fmt
@@ -81,7 +88,7 @@ public abstract class Xoctg_fmt_itm_base implements gplx.core.brys.Bfr_arg {
)
, fmt_exists = Bry_fmt.Auto_nl_skip_last
( ""
- , " ~{itm_text}"
+ , " ~{itm_text}"
)
;
public static final int Cols_max = 3;
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java
index 370b0da14..c5ceddd79 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java
@@ -17,23 +17,25 @@ along with this program. If not, see .
*/
package gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
import gplx.xowa.htmls.core.htmls.*;
-import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
-import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*;
+import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.core.intls.ucas.*;
+import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*;
public class Xoctg_fmt_ltr implements gplx.core.brys.Bfr_arg { // "A", "B", "C cont."
private final Xoctg_fmt_itm_base itm_fmt;
private Xoctg_catpage_grp grp;
private byte[] msg__list_continues;
+ private Uca_ltr_extractor ltr_extractor;
public Xoctg_fmt_ltr(Xoctg_fmt_itm_base itm_fmt) {
this.itm_fmt = itm_fmt;
}
- public void Init_from_grp(Xow_wiki wiki, Xoctg_catpage_grp grp) {
+ public void Init_from_grp(Xow_wiki wiki, Xoctg_catpage_grp grp, Uca_ltr_extractor ltr_extractor) {
this.grp = grp;
this.msg__list_continues = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_list_continues);
- itm_fmt.Init_from_ltr(wiki, grp);
+ this.ltr_extractor = ltr_extractor;
+ itm_fmt.Init_from_ltr(wiki, grp, ltr_extractor);
}
public void Bfr_arg__add(Bry_bfr bfr) {
- int itm_idx = grp.Bgn(); // itm idx; EX: idx=201 in len=500
- int itm_end = grp.End();
+ int itm_idx = 0;
+ int itm_end = grp.Itms__len();
int itms_len = itm_end - itm_idx; if (itms_len == 0) return; // no items; exit
int col_idx = 0; // col idx; EX: 3 cols; idx = 0, 1, 2
@@ -45,8 +47,9 @@ public class Xoctg_fmt_ltr implements gplx.core.brys.Bfr_arg { // "A", "B", "C c
Xoctg_catpage_itm itm = grp.Itms__get_at(itm_idx);
// get ltr_head; EX: "C" or "C cont."
- byte[] itm_sortkey = itm.Sort_key();
- byte[] ltr_cur = gplx.core.intls.Utf8_.Get_char_at_pos_as_bry(itm_sortkey, 0);
+ byte[] itm_sortkey = itm.Sortkey_handle();
+ // byte[] ltr_cur = gplx.core.intls.Utf8_.Get_char_at_pos_as_bry(itm_sortkey, 0);
+ byte[] ltr_cur = ltr_extractor.Get_1st_ltr(itm_sortkey);
byte[] ltr_head = Bry_.Eq(ltr_prv, ltr_cur)
? Bry_.Add(ltr_prv, Byte_ascii.Space_bry, msg__list_continues) // new col uses same ltr as last itm in old col; add "cont."; EX: "C cont."
: ltr_cur; // else, just use ltr; EX: "C"
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/langs/Xoctg_collation_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/langs/Xoctg_collation_mgr.java
new file mode 100644
index 000000000..faca4a53a
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/langs/Xoctg_collation_mgr.java
@@ -0,0 +1,41 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
+import gplx.core.intls.ucas.*;
+public class Xoctg_collation_mgr {
+ private final Xow_wiki wiki;
+ private Uca_collator collator;
+ private String collation_name = "uppercase"; // REF:https://noc.wikimedia.org/conf/InitialiseSettings.php.txt|wgCategoryCollation|default
+ public Xoctg_collation_mgr(Xow_wiki wiki) {
+ this.wiki = wiki;
+ if (String_.Eq(wiki.Domain_str(), "en.wikipedia.org"))
+ collation_name = "uca-default-kn";
+ }
+ public void Collation_name_(String v) {
+ this.collation_name = v;
+ }
+ public byte[] Get_sortkey(byte[] src) {
+ if (String_.Eq(collation_name, "uppercase")) {
+ return wiki.Lang().Case_mgr().Case_build_upper(src);
+ }
+ else {
+ if (collator == null) collator = Uca_collator_.New(collation_name, true);
+ return collator.Get_sortkey(String_.new_u8(src));
+ }
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java
index c75640f95..9dbf26271 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java
@@ -20,4 +20,16 @@ public class Xoctg_catpage_url {
public Xoctg_catpage_url(byte[][] keys, boolean[] fwds) {this.keys = keys; this.fwds = fwds;}
public byte[][] Grp_keys() {return keys;} private final byte[][] keys;
public boolean[] Grp_fwds() {return fwds;} private final boolean[] fwds;
+
+ public static Xoctg_catpage_url New__blank() {
+ byte[][] keys = new byte[Xoa_ctg_mgr.Tid___max][];
+ boolean[] fwds = new boolean[Xoa_ctg_mgr.Tid___max];
+
+ // for blank url, all fwds are true; EX: "Category:A" -> keys {"", "", ""}, fwds {true, true, true}
+ for (int i = 0; i < Xoa_ctg_mgr.Tid___max; ++i) {
+ fwds[i] = Bool_.Y;
+ keys[i] = Bry_.Empty;
+ }
+ return new Xoctg_catpage_url(keys, fwds);
+ }
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java
index 25e90b494..d8f6f13fe 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java
@@ -21,15 +21,20 @@ import gplx.langs.htmls.encoders.*;
public class Xoctg_catpage_url_parser {
public static Xoctg_catpage_url Parse(Xoa_url url) {
Gfo_qarg_itm[] args = url.Qargs_ary();
- if (args == null) return null;
+ if (args == null) return Xoctg_catpage_url.New__blank();
+ int len = args.length;
+ if (len == 0) return Xoctg_catpage_url.New__blank();
// init caturl structs
byte[][] keys = new byte[Xoa_ctg_mgr.Tid___max][];
boolean[] fwds = new boolean[Xoa_ctg_mgr.Tid___max];
+ for (int i = 0; i < Xoa_ctg_mgr.Tid___max; ++i) {
+ fwds[i] = Bool_.Y;
+ keys[i] = Bry_.Empty;
+ }
Bry_bfr tmp_bfr = Bry_bfr_.New();
// loop qargs; EX: "?subcatfrom=B&filefrom=C&pagefrom=D"
- int len = args.length;
for (int i = 0; i < len; ++i) {
Gfo_qarg_itm arg = args[i];
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter.java
deleted file mode 100644
index e5f039e1f..000000000
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.addons.wikis.ctgs.htmls.catpages.utls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
-import gplx.core.lists.binary_searches.*;
-import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*;
-public class Xoctg_catpage_filter {
- public static void Filter(int limit, Xoctg_catpage_url cat_url, Xoctg_catpage_ctg ctg) {
- int len = Xoa_ctg_mgr.Tid___max;
- for (byte i = 0; i < len; ++i) {
- Filter_by_grp(limit, cat_url, ctg.Grp_by_tid(i));
- }
- }
- private static void Filter_by_grp(int grp_len, Xoctg_catpage_url cat_url, Xoctg_catpage_grp grp) {
- byte grp_tid = grp.Tid();
- byte[] grp_key = cat_url.Grp_keys()[grp_tid];
-
- // dflt to bos; EX: grp_bgn=0 grp_end=200
- int grp_bgn = 0;
- int grp_end = grp_bgn + grp_len;
-
- // key specified; calc new grp_bgn, grp_end
- if (grp_key != null) {
- // get idx of key
- int key_idx = Binary_search_.Search(grp.Itms(), Xoctg_catpage_itm_sorter__sort_key.Sorter, grp_key);
-
- // if fwd, set grp_bgn to key_idx, and add grp_len
- if (cat_url.Grp_fwds()[grp_tid]) {
- grp_bgn = key_idx;
- grp_end = grp_bgn + grp_len;
- }
- // if bwd, set grp_end to key_idx, and subtract grp_len
- else {
- grp_end = key_idx;
- grp_bgn = grp_end - grp_len;
-
- // assert new grp_bgn is not negative
- if (grp_bgn < 0) grp_bgn = 0;
- }
- }
-
- // assert new grp_end is not > grp_max; note that this needs to be specified for when grp_key is null and not null
- int grp_max = grp.Itms__len();
- if (grp_end > grp_max)
- grp_end = grp_max;
- grp.Rng_(grp_bgn, grp_end);
- }
-}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter__tst.java
deleted file mode 100644
index 8f02083c8..000000000
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter__tst.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.addons.wikis.ctgs.htmls.catpages.utls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
-import org.junit.*; import gplx.core.tests.*;
-import gplx.xowa.apps.urls.*;
-import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*;
-public class Xoctg_catpage_filter__tst {
- private final Xoctg_catpage_filter__fxt fxt = new Xoctg_catpage_filter__fxt();
- private Xoctg_catpage_ctg ctg;
- @Before public void init() {
- this.ctg = fxt.Make__ctg(25, 25, 25);
- }
- @Test public void Initial() {
- fxt.Exec__filter(5, "A", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 0, 5);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5);
- }
- @Test public void Fwd__page__05() {
- fxt.Exec__filter(5, "A?pagefrom=05", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 5, 10);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5);
- }
- @Test public void Fwd__page__10() {
- fxt.Exec__filter(5, "A?pagefrom=10", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 10, 15);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5);
- }
- @Test public void Fwd__page__23() {
- fxt.Exec__filter(5, "A?pagefrom=23", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 23, 25);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5);
- }
- @Test public void Fwd__full__06() {
- fxt.Exec__filter(5, "A?from=06", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 6, 11);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 6, 11);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 6, 11);
- }
- @Test public void Bwd__page__20() {
- fxt.Exec__filter(5, "A?pageuntil=20", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 15, 20);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5);
- }
- @Test public void Bwd__page__2() {
- fxt.Exec__filter(5, "A?pageuntil=01", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 0, 1);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5);
- }
- @Test public void Bwd__full__11() {
- fxt.Exec__filter(5, "A?until=11", ctg);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 6, 11);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 6, 11);
- fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 6, 11);
- }
-}
-class Xoctg_catpage_filter__fxt {
- private Xow_url_parser url_parser;
- public Xoctg_catpage_filter__fxt() {
- Xoa_app app = Xoa_app_fxt.Make__app__edit();
- this.url_parser = app.User().Wikii().Utl__url_parser();
- }
- public Xoctg_catpage_ctg Make__ctg(int subc, int page, int file) {
- Xoctg_catpage_ctg ctg = new Xoctg_catpage_ctg(Bry_.new_a7("A"));
- Make__ctg_grp(ctg, Xoa_ctg_mgr.Tid__subc, subc);
- Make__ctg_grp(ctg, Xoa_ctg_mgr.Tid__page, page);
- Make__ctg_grp(ctg, Xoa_ctg_mgr.Tid__file, file);
- return ctg;
- }
- private void Make__ctg_grp(Xoctg_catpage_ctg ctg, byte tid, int count) {
- Xoctg_catpage_grp grp = ctg.Grp_by_tid(tid);
- for (int i = 0; i < count; ++i) {
- Xoctg_catpage_itm itm = new Xoctg_catpage_itm(i * tid, Xoa_ttl.Null, Bry_.new_a7(Int_.To_str_pad_bgn_zero(i, 2)));
- grp.Itms__add(itm);
- }
- grp.Itms__make();
- }
- public void Exec__filter(int limit, String cat_url_str, Xoctg_catpage_ctg ctg) {
- Xoctg_catpage_url cat_url = Xoctg_catpage_url_parser.Parse(url_parser.Parse(Bry_.new_a7(cat_url_str)));
- Xoctg_catpage_filter.Filter(limit, cat_url, ctg);
- }
- public void Test__cat_grp(Xoctg_catpage_ctg ctg, byte tid, int expd_bgn, int expd_end) {
- Xoctg_catpage_grp grp = ctg.Grp_by_tid(tid);
- Gftest.Eq__int(expd_bgn, grp.Bgn(), "bgn failed; tid={0}", tid);
- Gftest.Eq__int(expd_end, grp.End(), "end failed; tid={0}", tid);
- }
-}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_loader.java
deleted file mode 100644
index aba13c4c7..000000000
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_loader.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.addons.wikis.ctgs.htmls.catpages.utls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
-import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.wikis.ctgs.dbs.*;
-import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*;
-public class Xoctg_catpage_loader {
- private static final Object thread_lock = new Object();
- public Xoctg_catpage_ctg Load_by_ttl_or_null(Xow_wiki wiki, Xoa_ttl cat_ttl) {
- // get cat_id for cat_ttl from page_tbl
- Xow_db_mgr db_mgr = wiki.Data__core_mgr();
- Xowd_page_tbl page_tbl = db_mgr.Db__core().Tbl__page();
- Xowd_page_itm page_itm = page_tbl.Select_by_ttl_as_itm_or_null(cat_ttl);
- if (page_itm == null) {
- Gfo_usr_dlg_.Instance.Warn_many("", "", "category does not exist in page table; ttl=~{0}", cat_ttl.Full_db());
- return null;
- }
-
- // get cat_link db from cat_core_tbl
- Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr);
- int cat_id = page_itm.Id();
- Xowd_category_itm cat_core_itm = cat_core_tbl.Select(cat_id);
- if (cat_core_itm == Xowd_category_itm.Null) {
- Gfo_usr_dlg_.Instance.Log_many("", "", "category does not exist in cat_core table; ttl=~{0}", cat_ttl.Full_db()); // NOTE: this is not rare as Category pages can be created as deliberately empty, or as redirects; fr.w:Catégorie:Utilisateur_hess-4; DATE:2016-09-12
- return null;
- }
-
- // load itms from cat_link_db
- Xoctg_catpage_ctg rv = new Xoctg_catpage_ctg(cat_ttl.Page_txt());
- if (cat_core_itm.File_idx() == -1) // new v3: loop over all cat_link dbs
- Search_cat_core_tbls_for_cat_id(rv, wiki, db_mgr, page_tbl.Conn(), cat_core_tbl.Conn(), cat_id);
- else { // old v2: use cat_link_db
- Xow_db_file cat_link_db = db_mgr.Dbs__get_by_id_or_fail(cat_core_itm.File_idx());
- Select_by_cat_id(rv, wiki, page_tbl.Conn(), cat_core_tbl.Conn(), cat_link_db.Conn(), cat_id, Sql_for_v2(cat_id));
- }
- rv.Make_itms();
- return rv;
- }
- private static void Search_cat_core_tbls_for_cat_id(Xoctg_catpage_ctg rv, Xow_wiki wiki, Xow_db_mgr db_mgr, Db_conn page_conn, Db_conn cat_core_conn, int cat_id) {
- // loop over each db unless (a) cat_link_db; (b) core_db (if all or few)
- int len = db_mgr.Dbs__len();
- for (int i = 0; i < len; ++i) {
- Xow_db_file db_file = db_mgr.Dbs__get_at(i);
- switch (db_file.Tid()) {
- case Xow_db_file_.Tid__cat_link: // always use cat_link db
- break;
- case Xow_db_file_.Tid__core: // only use core if all or few
- if (db_mgr.Props().Layout_text().Tid_is_lot())
- continue;
- else
- break;
- default: // else ignore all other files
- continue;
- }
- Select_by_cat_id(rv, wiki, page_conn, cat_core_conn, db_file.Conn(), cat_id, Sql_for_v3(cat_id));
- }
- }
- private static void Select_by_cat_id(Xoctg_catpage_ctg rv, Xow_wiki wiki, Db_conn page_conn, Db_conn cat_core_conn, Db_conn cat_link_conn, int cat_id, String sql) {
- // prep sql
- Db_attach_mgr attach_mgr = new Db_attach_mgr(cat_link_conn, new Db_attach_itm("page_db", page_conn), new Db_attach_itm("cat_core_db", cat_core_conn));
- sql = attach_mgr.Resolve_sql(sql);
-
- // run sql and create itms based on cat_link
- Db_rdr rdr = Db_rdr_.Empty;
- synchronized (thread_lock) { // LOCK:used by multiple wrks; DATE:2016-09-12
- try {
- attach_mgr.Attach();
- rdr = cat_link_conn.Stmt_sql(sql).Exec_select__rls_auto();
- while (rdr.Move_next()) {
- Xoa_ttl page_ttl = wiki.Ttl_parse(rdr.Read_int("page_namespace"), rdr.Read_bry_by_str("page_title"));
- Xoctg_catpage_itm itm = new Xoctg_catpage_itm(rdr.Read_int("cl_from"), page_ttl, Bry_.new_u8(rdr.Read_str("cl_sortkey")));
- rv.Grp_by_tid(rdr.Read_byte("cl_type_id")).Itms__add(itm);
- }
- }
- finally {
- rdr.Rls();
- attach_mgr.Detach();
- }
- }
- }
- private static String Sql_for_v3(int cat_id) {
- return String_.Concat_lines_nl_skip_last // ANSI.Y
- ( "SELECT cl.cl_from"
- , ", cl.cl_type_id"
- , ", p.page_namespace"
- , ", p.page_title"
- , ", cs.cs_key AS cl_sortkey"
- , "FROM cat_link cl"
- , " JOIN page p ON cl.cl_from = p.page_id"
- , " JOIN cat_sort cs ON cl.cl_sortkey_id = cs.cs_id"
- , "WHERE cl.cl_to_id = " + Int_.To_str(cat_id)
- );
- }
- private static String Sql_for_v2(int cat_id) { // NOTE: main difference is cl_sortkey is on cat_link, not in cat_sort
- return String_.Concat_lines_nl_skip_last // ANSI.Y
- ( "SELECT cl.cl_from"
- , ", cl.cl_type_id"
- , ", p.page_namespace"
- , ", p.page_title"
- , ", cl.cl_sortkey"
- , "FROM cat_link cl"
- , " JOIN page p ON cl.cl_from = p.page_id"
- , "WHERE cl.cl_to_id = " + Int_.To_str(cat_id)
- );
- }
-}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java
index bc73cbbe2..e406bb5f5 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java
@@ -31,7 +31,7 @@ class Xoctg_pagebox_loader implements Select_in_cbk {
int cat_id = rdr.Read_int("cat_id");
Xoctg_pagebox_itm page = (Xoctg_pagebox_itm)hash.Get_by_id(cat_id);
if (page == null) {// unlikely, but possible for itms to exist in cat_links, but not in cat_core; log and return;
- Gfo_usr_dlg_.Instance.Warn_many("", "", "cat_id in cat_link but not in cat_core; page=~{0} cat_id=~{0}", page_url, cat_id);
+ Gfo_usr_dlg_.Instance.Warn_many("", "", "cat_id in cat_link but not in cat_core; page=~{0} cat_id=~{1}", page_url, cat_id);
}
page.Load_by_cat_core(rdr.Read_bool_by_byte("cat_hidden"), rdr.Read_int("cat_pages"), rdr.Read_int("cat_subcats"), rdr.Read_int("cat_files"));
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java
index 08c2107ad..75e936dcb 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java
@@ -46,7 +46,7 @@ public class Xoctg_pagebox_wtr {
Xoctg_pagebox_loader select_cbk = new Xoctg_pagebox_loader(hash, page.Url_bry_safe());
// get cat_db_id from page
- boolean exists = wiki.Data__core_mgr().Tbl__page().Select_by_ttl(tmp_page_itm, page.Ttl().Ns(), page.Ttl().Page_txt());
+ boolean exists = wiki.Data__core_mgr().Tbl__page().Select_by_ttl(tmp_page_itm, page.Ttl().Ns(), page.Ttl().Page_db());
int cat_db_id = tmp_page_itm.Cat_db_id();
if (exists && cat_db_id != -1) {// note that wtxt_dbs can have 0 ctgs but will have cat_db_id == -1
Xow_db_file cat_link_db = wiki.Data__core_mgr().Dbs__get_by_id_or_null(cat_db_id);
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java
index 853e33c28..1d9eab72e 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java
@@ -35,9 +35,9 @@ public class Xoctg_double_box implements Bfr_arg {
int len = ary.length;
for (int i = 0; i < len; ++i) {
- Xoctg_pagebox_itm ctg = ary[i];
- Xoctg_double_grp list = ctg.Hidden() ? grp_hidden : grp_normal;
- list.Itms().Itms__add(ctg);
+ Xoctg_pagebox_itm itm = ary[i];
+ Xoctg_double_grp list = itm.Hidden() ? grp_hidden : grp_normal;
+ list.Itms().Itms__add(itm);
}
this.Bfr_arg__add(bfr);
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java
index 4a5b306d8..5475f3d0f 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java
@@ -31,7 +31,7 @@ public class Xowd_html_tbl_mgr {
byte[] content_sub = null;
byte[] sidebar_div = null;
db.Conn().Meta_tbl_assert(tbl);
- tbl.Upsert(page_id, Xopg_module_mgr.Tid_null, Io_stream_.Tid_raw, Xoh_hzip_dict_.Hzip__plain, display_ttl, content_sub, sidebar_div, src);
+ tbl.Upsert(page_id, Xopg_module_mgr.Tid_null, Io_stream_tid_.Tid__raw, Xoh_hzip_dict_.Hzip__plain, display_ttl, content_sub, sidebar_div, src);
wiki.Data__core_mgr().Db__core().Tbl__page().Update__html_db_id(page_id, db.Id());
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java
index a5a4eee03..92bc1d02d 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java
@@ -38,8 +38,7 @@ public class Srch_search_cfg implements Gfo_invk {
public void Args_default_str_(String v) {
this.args_default_str = v;
byte[] bry = Bry_.new_a7("http://x.org/a?" + v);
- Gfo_url tmp_url = new Gfo_url();
- app.User().Wikii().Utl__url_parser().Url_parser().Parse(tmp_url, bry, 0, bry.length);
+ Gfo_url tmp_url = app.User().Wikii().Utl__url_parser().Url_parser().Parse(bry, 0, bry.length);
args_default = tmp_url.Qargs();
}
private Srch_search_addon addon;
diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java
index daafd6ed4..52ef05ed7 100644
--- a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java
+++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java
@@ -21,10 +21,17 @@ public class Xoapi_addon implements Gfo_invk {
public void Ctor_by_app(Xoa_app app) {}
public Xoapi_addon_search Search() {return search;} private final Xoapi_addon_search search = new Xoapi_addon_search();
public Xoapi_addon_bldr Bldr() {return bldr;} private final Xoapi_addon_bldr bldr = new Xoapi_addon_bldr();
+ public boolean Wikis__ctgs__hidden_enabled() {return wikis__ctgs__hidden_enabled;} private boolean wikis__ctgs__hidden_enabled = false;
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__search)) return search;
else if (ctx.Match(k, Invk__bldr)) return bldr;
+ else if (ctx.Match(k, Invk__wikis__ctgs__hidden_enabled)) return Yn.To_str(wikis__ctgs__hidden_enabled);
+ else if (ctx.Match(k, Invk__wikis__ctgs__hidden_enabled_)) wikis__ctgs__hidden_enabled = m.ReadYn("v");
else return Gfo_invk_.Rv_unhandled;
+ return this;
}
- private static final String Invk__search = "search", Invk__bldr = "bldr";
+ private static final String Invk__search = "search", Invk__bldr = "bldr"
+ , Invk__wikis__ctgs__hidden_enabled = "wikis__ctgs__hidden_enabled"
+ , Invk__wikis__ctgs__hidden_enabled_ = "wikis__ctgs__hidden_enabled_"
+ ;
}
diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java
index 29ebe042b..f8d141d08 100644
--- a/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java
+++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java
@@ -20,13 +20,14 @@ import gplx.xowa.apps.apis.xowa.addons.bldrs.*;
public class Xoapi_addon_bldr implements Gfo_invk {
public Xoapi_central_api Central() {return central;} private final Xoapi_central_api central = new Xoapi_central_api();
public Xoapi_sync_api Sync() {return sync;} private final Xoapi_sync_api sync = new Xoapi_sync_api();
+ public boolean Wikis__ctgs__hidden_enabled() {return wikis__ctgs__hidden_enabled;} private boolean wikis__ctgs__hidden_enabled = false;
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__central)) return central;
else if (ctx.Match(k, Invk__sync)) return sync;
else return Gfo_invk_.Rv_unhandled;
}
private static final String
- Invk__central = "central"
- , Invk__sync = "sync"
+ Invk__central = "central"
+ , Invk__sync = "sync"
;
}
diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java
index de7e0a16c..c99348617 100644
--- a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java
+++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java
@@ -29,8 +29,8 @@ public class Xoapi_import implements Gfo_invk {
public long Html_db_max() {return html_db_max;} private long html_db_max = Io_size_.To_long_by_int_mb(1500); // 3.0 GB; v2; use same as text
public long File_db_max() {return file_db_max;} private long file_db_max = Io_size_.To_long_by_int_mb(1500); // 3.2 GB; v2
public byte[] Ns_file_map() {return ns_file_map;} private byte[] ns_file_map = Ns_file_map__each;
- public byte Zip_tid_text() {return zip_tid_text;} private byte zip_tid_text = Io_stream_.Tid_gzip;
- public byte Zip_tid_html() {return zip_tid_html;} private byte zip_tid_html = Io_stream_.Tid_gzip;
+ public byte Zip_tid_text() {return zip_tid_text;} private byte zip_tid_text = Io_stream_tid_.Tid__gzip;
+ public byte Zip_tid_html() {return zip_tid_html;} private byte zip_tid_html = Io_stream_tid_.Tid__gzip;
public boolean Hzip_enabled() {return hzip_enabled;} private boolean hzip_enabled = Bool_.Y;
public boolean Hzip_mode_is_b256() {return hzip_mode_is_b256;} private boolean hzip_mode_is_b256 = Bool_.Y;
public String User_name() {return user_name;} private String user_name = "anonymous";
@@ -51,7 +51,7 @@ public class Xoapi_import implements Gfo_invk {
: gplx.xowa.bldrs.cmds.Xob_ns_file_itm_parser.Ns_file_map__each; // DB.FEW: DATE:2016-06-07
// return dump_file_size < layout_text_max ? Bry_.Empty : Ns_file_map__each;
}
- public void Zip_tid_text_raw_() {zip_tid_text = Io_stream_.Tid_raw;} // TEST:
+ public void Zip_tid_text_raw_() {zip_tid_text = Io_stream_tid_.Tid__raw;} // TEST:
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_layout_all_max)) return Io_size_.To_str_mb(layout_all_max);
else if (ctx.Match(k, Invk_layout_all_max_)) layout_all_max = Io_size_.To_long_by_msg_mb(m, layout_all_max);
@@ -71,11 +71,11 @@ public class Xoapi_import implements Gfo_invk {
else if (ctx.Match(k, Invk_file_db_max_)) file_db_max = Io_size_.To_long_by_msg_mb(m, file_db_max);
else if (ctx.Match(k, Invk_ns_file_map)) return String_.new_u8(ns_file_map);
else if (ctx.Match(k, Invk_ns_file_map_)) ns_file_map = m.ReadBry("v");
- else if (ctx.Match(k, Invk_zip_tid_text)) return Io_stream_.To_str(zip_tid_text);
- else if (ctx.Match(k, Invk_zip_tid_text_)) zip_tid_text = Io_stream_.To_tid(m.ReadStr("v"));
+ else if (ctx.Match(k, Invk_zip_tid_text)) return Io_stream_tid_.To_key(zip_tid_text);
+ else if (ctx.Match(k, Invk_zip_tid_text_)) zip_tid_text = Io_stream_tid_.To_tid(m.ReadStr("v"));
else if (ctx.Match(k, Invk_zip_tid_list)) return Options_zip_tid__list;
- else if (ctx.Match(k, Invk_zip_tid_html)) return Io_stream_.To_str(zip_tid_html);
- else if (ctx.Match(k, Invk_zip_tid_html_)) zip_tid_html = Io_stream_.To_tid(m.ReadStr("v"));
+ else if (ctx.Match(k, Invk_zip_tid_html)) return Io_stream_tid_.To_key(zip_tid_html);
+ else if (ctx.Match(k, Invk_zip_tid_html_)) zip_tid_html = Io_stream_tid_.To_tid(m.ReadStr("v"));
else if (ctx.Match(k, Invk_hzip_enabled)) return Yn.To_str(hzip_enabled);
else if (ctx.Match(k, Invk_hzip_enabled_)) hzip_enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk_hzip_mode_is_b256)) return Yn.To_str(hzip_mode_is_b256);
@@ -86,7 +86,7 @@ public class Xoapi_import implements Gfo_invk {
else return Gfo_invk_.Rv_unhandled;
return this;
}
- private static final Keyval[] Options_zip_tid__list = Keyval_.Ary(Keyval_.new_("raw", "text"), Keyval_.new_("gzip"), Keyval_.new_("bzip2"));
+ private static final Keyval[] Options_zip_tid__list = Keyval_.Ary(Keyval_.new_("raw", "text"), Keyval_.new_("gzip"), Keyval_.new_("bzip2"), Keyval_.new_("xz"));
private static final String
Invk_layout_all_max = "layout_all_max" , Invk_layout_all_max_ = "layout_all_max_"
, Invk_layout_text_max = "layout_text_max" , Invk_layout_text_max_ = "layout_text_max_"
diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java
index 1228e2187..7882890b5 100644
--- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java
+++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java
@@ -89,7 +89,7 @@ class Http_server_wkr implements Gfo_invk {
// client_wtr.Write_str("Expires: Sun, 17-Jan-2038 19:14:07 GMT\n");
String mime_type = String_.new_u8(Http_file_utl.To_mime_type_by_path_as_bry(path));
client_wtr.Write_str("Content-Type: " + mime_type + "\n\n");
- Io_stream_rdr file_stream = Io_stream_rdr_.new_by_url_(Io_url_.new_fil_(String_.new_u8(path))).Open();
+ Io_stream_rdr file_stream = Io_stream_rdr_.New_by_url(Io_url_.new_fil_(String_.new_u8(path))).Open();
client_wtr.Write_stream(file_stream);
file_stream.Rls(); client_rdr.Rls(); socket.Rls();
}
diff --git a/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java b/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java
index 5441d51b0..70c58c91c 100644
--- a/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java
+++ b/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java
@@ -21,7 +21,7 @@ import gplx.xowa.langs.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*;
class Xoa_site_cfg_itm__interwikimap extends Xoa_site_cfg_itm__base {
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
- private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url();
+ private final Gfo_url_parser url_parser = new Gfo_url_parser();
public Xoa_site_cfg_itm__interwikimap() {this.Ctor(Xoa_site_cfg_loader__inet.Qarg__interwikimap);}
@Override public void Parse_json_ary_itm(Bry_bfr bfr, Xow_wiki wiki, int i, Json_itm itm) {
Json_nde nde = Json_nde.cast(itm);
@@ -40,7 +40,7 @@ class Xoa_site_cfg_itm__interwikimap extends Xoa_site_cfg_itm__base {
byte[] line = lines[i]; if (Bry_.Len_eq_0(line)) continue; // ignore blank lines
byte[][] flds = Bry_split_.Split(line, Byte_ascii.Pipe);
byte[] url_fmt = flds[1];
- byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, url_fmt);
+ byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url_fmt);
wiki.Xwiki_mgr().Add_by_atrs(flds[0], domain_bry, url_fmt);
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java
index 00dc03a3f..ab7641f58 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java
@@ -50,7 +50,7 @@ class Xoa_url__to_str__fxt extends Xow_url_parser_fxt { private final Xoh_hr
public void Chk_to_str_href(boolean full, String raw, String expd) {Chk_to_str_href(cur_wiki, full, raw, expd);}
public void Chk_to_str_href(Xowe_wiki wiki, boolean full, String raw, String expd) {
href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), wiki, Bry__page);
- this.Chk_to_str(full, expd);
+ this.Test__to_str(full, expd);
}
private static final byte[] Bry__page = Bry_.new_a7("Page_1");
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java
index ed32efbb2..458976be1 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java
@@ -25,12 +25,12 @@ public class Xow_url_parser {
private final Object thread_lock = new Object();
private final Gfo_url_encoder encoder;
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
- private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url gfo_url = new Gfo_url();
+ private final Gfo_url_parser url_parser = new Gfo_url_parser();
private final Gfo_url_encoder gfs_encoder = Gfo_url_encoder_.New__gfs().Make();
private final Xoa_app app; private final Xow_wiki wiki; private final byte[] domain_bry;
private byte tmp_protocol_tid;
private int tmp_tid;
- private byte[] tmp_raw, tmp_wiki, tmp_page, tmp_anch, tmp_protocol_bry; private Gfo_qarg_itm[] tmp_qargs;
+ private byte[] tmp_raw, tmp_orig, tmp_wiki, tmp_page, tmp_anch, tmp_protocol_bry; private Gfo_qarg_itm[] tmp_qargs;
private byte[][] tmp_segs; private int tmp_segs_len;
private boolean tmp_protocol_is_relative, tmp_page_is_main, tmp_wiki_is_missing;
private byte[] tmp_vnt;
@@ -69,9 +69,10 @@ public class Xow_url_parser {
public boolean Parse(Xoa_url rv, byte[] src, int bgn, int end) {
synchronized (thread_lock) {
if (end - bgn == 0) {Init_tmp_vars(Gfo_url.Empty); Make(rv); return false;}
- src = encoder.Decode(src, bgn, end); // NOTE: must decode any url-encoded parameters
- int src_len = src.length;
- url_parser.Parse(gfo_url, src, 0, src_len); // parse to plain gfo_url
+ tmp_orig = (bgn == 0 && end == src.length) ? src : Bry_.Mid(src, bgn, end);
+ // src = encoder.Decode(src, bgn, end); // NOTE: must decode any url-encoded parameters; TOMBSTONE:do not auto-decode DATE:2016-10-10
+ int src_len = end - bgn;
+ Gfo_url gfo_url = url_parser.Parse(src, bgn, end); // parse to plain gfo_url
Init_tmp_vars(gfo_url);
if (src[0] == Byte_ascii.Hash) // src is anch; EX: #A
Bld_anch();
@@ -134,7 +135,7 @@ public class Xow_url_parser {
}
private Xoa_url Make(Xoa_url rv) {
rv.Ctor
- ( tmp_tid, tmp_raw, tmp_protocol_tid, tmp_protocol_bry, tmp_protocol_is_relative
+ ( tmp_tid, tmp_orig, tmp_raw, tmp_protocol_tid, tmp_protocol_bry, tmp_protocol_is_relative
, tmp_wiki, tmp_page, tmp_qargs, tmp_anch
, tmp_segs, tmp_vnt, tmp_wiki_is_missing, Bry_.Eq(tmp_wiki, wiki.Domain_bry()), tmp_page_is_main);
return rv;
@@ -264,9 +265,7 @@ public class Xow_url_parser {
int qargs_len = tmp_qargs.length;
for (int i = 0; i < qargs_len; ++i) {
Gfo_qarg_itm qarg = tmp_qargs[i];
- if ( Bry_.Eq(qarg.Key_bry(), Qarg__title)
- && qarg.Val_bry() != null // HACK: handle "bad-urls" from xml-encoded entities where page is null b/c = is encoded as =; http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template standardisation/demometa DATE:2015-08-02
- )
+ if (Bry_.Eq(qarg.Key_bry(), Qarg__title))
tmp_page = qarg.Val_bry(); // handle /w/index.php?title=Earth
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java
index 9d5e8e10d..2040286d2 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java
@@ -20,23 +20,23 @@ import org.junit.*;
public class Xow_url_parser__proto_tst {
private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt();
@Test public void Relative() {
- tstr.Run_parse("//en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A");
+ tstr.Exec__parse("//en.wikipedia.org/wiki/A").Test__wiki("en.wikipedia.org").Test__page("A");
}
@Test public void Http__basic() {
- tstr.Run_parse("http://en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A");
+ tstr.Exec__parse("http://en.wikipedia.org/wiki/A").Test__wiki("en.wikipedia.org").Test__page("A");
}
@Test public void Upload__basic() {
tstr.Prep_add_xwiki_to_user("commons.wikimedia.org"); // NOTE: need to add xwiki to be able to resolve "/commons/"
- tstr.Run_parse("http://upload.wikimedia.org/wikipedia/commons/a/ab/C.svg").Chk_wiki("commons.wikimedia.org").Chk_page("File:C.svg"); // orig
- tstr.Run_parse("http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/A.png/220px-A.png").Chk_wiki("commons.wikimedia.org").Chk_page("File:A.png"); // thum
+ tstr.Exec__parse("http://upload.wikimedia.org/wikipedia/commons/a/ab/C.svg").Test__wiki("commons.wikimedia.org").Test__page("File:C.svg"); // orig
+ tstr.Exec__parse("http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/A.png/220px-A.png").Test__wiki("commons.wikimedia.org").Test__page("File:A.png"); // thum
}
@Test public void File__basic() {
- tstr.Run_parse("file:///C:/a/b/c").Chk_tid(Xoa_url_.Tid_file);
+ tstr.Exec__parse("file:///C:/a/b/c").Test__tid(Xoa_url_.Tid_file);
}
@Test public void Ftp__basic() {
- tstr.Run_parse("ftp://en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_inet);
+ tstr.Exec__parse("ftp://en.wikipedia.org/wiki/A").Test__tid(Xoa_url_.Tid_inet);
}
@Test public void Extended() {
- tstr.Run_parse("http://en.wikipedia.org/w/index.php?A=B").Chk_wiki("en.wikipedia.org").Chk_page("index.php").Chk_qargs("?A=B").Chk_anch(null);
+ tstr.Exec__parse("http://en.wikipedia.org/w/index.php?A=B").Test__wiki("en.wikipedia.org").Test__page("index.php").Test__qargs("?A=B").Test__anch(null);
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg__tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg__tst.java
new file mode 100644
index 000000000..e008fc332
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg__tst.java
@@ -0,0 +1,68 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*;
+import org.junit.*;
+public class Xow_url_parser__qarg__tst {
+ private final Xow_url_parser_fxt fxt = new Xow_url_parser_fxt();
+ @Test public void Redirect() {
+ fxt.Exec__parse("A?redirect=no").Test__wiki("en.wikipedia.org").Test__page("A").Test__qargs("?redirect=no");
+ }
+ @Test public void Action_is_edit() {
+ fxt.Exec__parse("A?action=edit").Test__wiki("en.wikipedia.org").Test__page("A").Test__action_is_edit_y();
+ }
+ @Test public void Assert_state_cleared() { // PURPOSE.fix: action_is_edit (et. al.) was not being cleared on parse even though Xoa_url reused; DATE:20121231
+ fxt.Exec__parse("A?action=edit") .Test__action_is_edit_y();
+ fxt.Exec__parse_reuse("B") .Test__action_is_edit_n();
+ }
+ @Test public void Query_arg() { // PURPOSE.fix: query args were not printing out
+ fxt.Exec__parse("en.wikipedia.org/wiki/Special:Search/Earth?fulltext=yes").Test__build_str_is_same();
+ }
+ @Test public void Dupe_key() {
+ fxt.Exec__parse("A?B=C1&B=C2").Test__page("A").Test__qargs("?B=C1&B=C2");
+ }
+ @Test public void Question_is_eos() {
+ fxt.Exec__parse("A?").Test__wiki("en.wikipedia.org").Test__page("A?").Test__qargs("");
+ }
+ @Test public void Question_is_page() {
+ fxt.Exec__parse("A?B").Test__wiki("en.wikipedia.org").Test__page("A?B").Test__qargs("");
+ }
+ @Test public void Question_is_anchor() {
+ fxt.Exec__parse("A#b?c").Test__wiki("en.wikipedia.org").Test__page("A").Test__anch("b.3Fc");
+ }
+ @Test public void Title_remove_w() { // PURPOSE: fix /w/ showing up as seg; DATE:2014-05-30
+ fxt.Exec__parse("http://en.wikipedia.org/w/index.php?title=A").Test__wiki("en.wikipedia.org").Test__page("A");
+ }
+ @Test public void Ctg() {
+ fxt.Exec__parse("Category:A?pagefrom=A#mw-pages").Test__page("Category:A").Test__qargs("?pagefrom=A").Test__anch("mw-pages");
+ }
+ @Test public void Anch() {
+ fxt.Exec__parse("A?k1=v1#anch");
+ fxt.Test__page("A");
+ fxt.Test__anch("anch");
+ fxt.Test__qargs("?k1=v1");
+ fxt.Test__to_str("en.wikipedia.org/wiki/A?k1=v1#anch");
+ }
+ // DELETED: search should not depend on url-decoded entities; should be "Special:Search/Moon?fulltext=y&xowa_page_index=1" DATE:2016-10-10
+ // @Test public void Search() {
+ // fxt.Exec__parse("Special:Search/Moon%3Ffulltext%3Dy%26xowa_page_index%3D1").Test__page("Special:Search/Moon").Test__qargs("?fulltext=y&xowa_page_index=1");
+ //}
+ // DELETED: this is wrong as url should not handle html_entities like = instead # should strictly designate anch_href; DATE:2016-10-10
+ // @Test public void Encoded() {
+ // fxt.Exec__parse("en.wikipedia.org/wiki/A?action=edit&preload=B").Test__wiki("en.wikipedia.org").Test__page("A").Test__qargs("?action==edit=&preload=&=").Test__anch("61.3BB"); // NOTE: this is wrong; fix later
+ // }
+}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java
deleted file mode 100644
index 47ceff5b8..000000000
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*;
-import org.junit.*;
-public class Xow_url_parser__qarg_tst {
- private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt();
- @Test public void Redirect() {
- tstr.Run_parse("A?redirect=no").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_qargs("?redirect=no");
- }
- @Test public void Action_is_edit() {
- tstr.Run_parse("A?action=edit").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_action_is_edit_y();
- }
- @Test public void Assert_state_cleared() { // PURPOSE.fix: action_is_edit (et. al.) was not being cleared on parse even though Xoa_url reused; DATE:20121231
- tstr.Run_parse("A?action=edit") .Chk_action_is_edit_y();
- tstr.Run_parse_reuse("B") .Chk_action_is_edit_n();
- }
- @Test public void Query_arg() { // PURPOSE.fix: query args were not printing out
- tstr.Run_parse("en.wikipedia.org/wiki/Special:Search/Earth?fulltext=yes").Chk_build_str_is_same();
- }
- @Test public void Dupe_key() {
- tstr.Run_parse("A?B=C1&B=C2").Chk_page("A").Chk_qargs("?B=C1&B=C2");
- }
- @Test public void Question_is_eos() {
- tstr.Run_parse("A?").Chk_wiki("en.wikipedia.org").Chk_page("A?").Chk_qargs("");
- }
- @Test public void Question_is_page() {
- tstr.Run_parse("A?B").Chk_wiki("en.wikipedia.org").Chk_page("A?B").Chk_qargs("");
- }
- @Test public void Question_is_anchor() {
- tstr.Run_parse("A#b?c").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_anch("b.3Fc");
- }
- @Test public void Title_remove_w() { // PURPOSE: fix /w/ showing up as seg; DATE:2014-05-30
- tstr.Run_parse("http://en.wikipedia.org/w/index.php?title=A").Chk_wiki("en.wikipedia.org").Chk_page("A");
- }
- @Test public void Search() {
- tstr.Run_parse("Special:Search/Moon%3Ffulltext%3Dy%26xowa_page_index%3D1").Chk_page("Special:Search/Moon").Chk_qargs("?fulltext=y&xowa_page_index=1");
- }
- @Test public void Ctg() {
- tstr.Run_parse("Category:A?pagefrom=A#mw-pages").Chk_page("Category:A").Chk_qargs("?pagefrom=A").Chk_anch("mw-pages");
- }
- @Test public void Encoded() {
- tstr.Run_parse("en.wikipedia.org/wiki/A?action=edit&preload=B").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_qargs("?action==edit=&preload=&=").Chk_anch("61.3BB"); // NOTE: this is wrong; fix later
- }
-}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java
index dc325a5fc..f7fca8b01 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java
@@ -20,37 +20,37 @@ import org.junit.*;
public class Xow_url_parser__ttl_tst {
private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt();
@Test public void Name() {
- tstr.Run_parse("A").Chk_wiki("en.wikipedia.org").Chk_page("A");
+ tstr.Exec__parse("A").Test__wiki("en.wikipedia.org").Test__page("A");
}
@Test public void Sub_1() {
- tstr.Run_parse("A/b").Chk_wiki("en.wikipedia.org").Chk_page("A/b");
+ tstr.Exec__parse("A/b").Test__wiki("en.wikipedia.org").Test__page("A/b");
}
@Test public void Sub_2() {
- tstr.Run_parse("A/b/c").Chk_wiki("en.wikipedia.org").Chk_page("A/b/c");
+ tstr.Exec__parse("A/b/c").Test__wiki("en.wikipedia.org").Test__page("A/b/c");
}
@Test public void Anch() {
- tstr.Run_parse("A#b").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_anch("b");
+ tstr.Exec__parse("A#b").Test__wiki("en.wikipedia.org").Test__page("A").Test__anch("b");
}
@Test public void Anch_w_slash() { // PURPOSE: A/b#c/d was not parsing correctly; PAGE:en.w:Enlightenment_Spain#Enlightened_despotism_.281759%E2%80%931788.29
- tstr.Run_parse("A/b#c/d").Chk_page("A/b").Chk_anch("c.2Fd");
+ tstr.Exec__parse("A/b#c/d").Test__page("A/b").Test__anch("c.2Fd");
}
@Test public void Ns_category() {
- tstr.Run_parse("Category:A").Chk_wiki("en.wikipedia.org").Chk_page("Category:A");
+ tstr.Exec__parse("Category:A").Test__wiki("en.wikipedia.org").Test__page("Category:A");
}
@Test public void Main_page__basic() {
- tstr.Run_parse("en.wikipedia.org") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y();
- tstr.Run_parse("en.wikipedia.org/") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y();
- tstr.Run_parse("en.wikipedia.org/wiki") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y();
- tstr.Run_parse("en.wikipedia.org/wiki/") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y();
- tstr.Run_parse("en.wikipedia.org/wiki/A") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_n();
+ tstr.Exec__parse("en.wikipedia.org") .Test__wiki("en.wikipedia.org").Test__page_is_main_y();
+ tstr.Exec__parse("en.wikipedia.org/") .Test__wiki("en.wikipedia.org").Test__page_is_main_y();
+ tstr.Exec__parse("en.wikipedia.org/wiki") .Test__wiki("en.wikipedia.org").Test__page_is_main_y();
+ tstr.Exec__parse("en.wikipedia.org/wiki/") .Test__wiki("en.wikipedia.org").Test__page_is_main_y();
+ tstr.Exec__parse("en.wikipedia.org/wiki/A") .Test__wiki("en.wikipedia.org").Test__page_is_main_n();
}
@Test public void Ns_file__basic() {// PURPOSE: "File:A" should not be mistaken for "file:///" ns
- tstr.Run_parse("File:A").Chk_wiki("en.wikipedia.org").Chk_page("File:A");
+ tstr.Exec__parse("File:A").Test__wiki("en.wikipedia.org").Test__page("File:A");
}
@Test public void Ns_file__nested() {// PURPOSE: handle fictitious "File:A/B/C.png"
- tstr.Run_parse("File:A/B/C.png").Chk_wiki("en.wikipedia.org").Chk_page("File:A/B/C.png"); // should not be C.png b/c of Gfo_url_parser_old
+ tstr.Exec__parse("File:A/B/C.png").Test__wiki("en.wikipedia.org").Test__page("File:A/B/C.png"); // should not be C.png b/c of Gfo_url_parser_old
}
@Test public void Anch__basic() {// DATE:2015-07-26
- tstr.Run_parse("#A").Chk_tid(Xoa_url_.Tid_anch).Chk_wiki_is_missing(true).Chk_page("").Chk_anch("A");
+ tstr.Exec__parse("#A").Test__tid(Xoa_url_.Tid_anch).Test__wiki_is_missing(true).Test__page("").Test__anch("A");
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java
index 19fe1ecad..7c867f5d6 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java
@@ -20,49 +20,49 @@ import org.junit.*;
public class Xow_url_parser__url_bar_tst {
private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt();
@Test public void Basic() {
- tstr.Run_parse_from_url_bar("Page_1").Chk_to_str("en.wikipedia.org/wiki/Page_1"); // basic
+ tstr.Exec__parse_from_url_bar("Page_1").Test__to_str("en.wikipedia.org/wiki/Page_1"); // basic
}
@Test public void Lang() {
tstr.Prep_add_xwiki_to_user("uk", "uk.wikipedia.org");
- tstr.Run_parse_from_url_bar("uk").Chk_to_str("en.wikipedia.org/wiki/Uk"); // lang-like page (uk=Ukraine) should not try to open wiki; DATE:2014-02-07
+ tstr.Exec__parse_from_url_bar("uk").Test__to_str("en.wikipedia.org/wiki/Uk"); // lang-like page (uk=Ukraine) should not try to open wiki; DATE:2014-02-07
}
@Test public void Lang_like() {
tstr.Prep_add_xwiki_to_user("uk", "uk.wikipedia.org", "http://~{1}.wikipedia.org"); // NOTE: fmt needed for Type_is_lang
- tstr.Run_parse_from_url_bar("uk/A").Chk_to_str("en.wikipedia.org/wiki/Uk/A"); // uk/A should not try be interpreted as wiki="uk" page="A"; DATE:2014-04-26
+ tstr.Exec__parse_from_url_bar("uk/A").Test__to_str("en.wikipedia.org/wiki/Uk/A"); // uk/A should not try be interpreted as wiki="uk" page="A"; DATE:2014-04-26
}
@Test public void Macro() {
tstr.Prep_add_xwiki_to_user("fr.wikisource.org");
- tstr.Run_parse_from_url_bar("fr.s:Auteur:Shakespeare").Chk_to_str("fr.wikisource.org/wiki/Auteur:Shakespeare"); // url_macros
+ tstr.Exec__parse_from_url_bar("fr.s:Auteur:Shakespeare").Test__to_str("fr.wikisource.org/wiki/Auteur:Shakespeare"); // url_macros
}
@Test public void Main_page__home() {
- tstr.Run_parse_from_url_bar("home").Chk_to_str("en.wikipedia.org/wiki/Home"); // home should go to current wiki's home; DATE:2014-02-09
- tstr.Run_parse_from_url_bar("home/wiki/Main_Page").Chk_to_str("home/wiki/Main_Page"); // home Main_Page should go to home; DATE:2014-02-09
+ tstr.Exec__parse_from_url_bar("home").Test__to_str("en.wikipedia.org/wiki/Home"); // home should go to current wiki's home; DATE:2014-02-09
+ tstr.Exec__parse_from_url_bar("home/wiki/Main_Page").Test__to_str("home/wiki/Main_Page"); // home Main_Page should go to home; DATE:2014-02-09
}
@Test public void Main_page__zhw() {
Xowe_wiki zh_wiki = tstr.Prep_create_wiki("zh.wikipedia.org");
zh_wiki.Props().Main_page_(Bry_.new_a7("Zh_Main_Page"));
- tstr.Run_parse_from_url_bar("zh.w:Main_Page") .Chk_page_is_main_n().Chk_to_str("zh.wikipedia.org/wiki/Main_Page");
- tstr.Run_parse_from_url_bar("zh.w:") .Chk_page_is_main_y().Chk_to_str("zh.wikipedia.org/wiki/Zh_Main_Page");
- tstr.Run_parse_from_url_bar("en.w:") .Chk_page_is_main_y().Chk_to_str("en.wikipedia.org/wiki/Main_Page"); // old bug: still stuck at zh main page due to reused objects
+ tstr.Exec__parse_from_url_bar("zh.w:Main_Page") .Test__page_is_main_n().Test__to_str("zh.wikipedia.org/wiki/Main_Page");
+ tstr.Exec__parse_from_url_bar("zh.w:") .Test__page_is_main_y().Test__to_str("zh.wikipedia.org/wiki/Zh_Main_Page");
+ tstr.Exec__parse_from_url_bar("en.w:") .Test__page_is_main_y().Test__to_str("en.wikipedia.org/wiki/Main_Page"); // old bug: still stuck at zh main page due to reused objects
}
@Test public void Mobile() { // PURPOSE: handle mobile links; DATE:2014-05-03
- tstr.Run_parse_from_url_bar("en.m.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // basic
- tstr.Run_parse_from_url_bar("en.M.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // upper
- tstr.Run_parse_from_url_bar("A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // bounds-check: 0
- tstr.Run_parse_from_url_bar("A." ).Chk_to_str("en.wikipedia.org/wiki/A."); // bounds-check: 1
- tstr.Run_parse_from_url_bar("A.b" ).Chk_to_str("en.wikipedia.org/wiki/A.b"); // bounds-check: 2
- tstr.Run_parse_from_url_bar("A.b.m." ).Chk_to_str("en.wikipedia.org/wiki/A.b.m."); // false-match
- tstr.Run_parse_from_url_bar("en.x.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/En.x.wikipedia.org/wiki/A"); // fail
+ tstr.Exec__parse_from_url_bar("en.m.wikipedia.org/wiki/A" ).Test__to_str("en.wikipedia.org/wiki/A"); // basic
+ tstr.Exec__parse_from_url_bar("en.M.wikipedia.org/wiki/A" ).Test__to_str("en.wikipedia.org/wiki/A"); // upper
+ tstr.Exec__parse_from_url_bar("A" ).Test__to_str("en.wikipedia.org/wiki/A"); // bounds-check: 0
+ tstr.Exec__parse_from_url_bar("A." ).Test__to_str("en.wikipedia.org/wiki/A."); // bounds-check: 1
+ tstr.Exec__parse_from_url_bar("A.b" ).Test__to_str("en.wikipedia.org/wiki/A.b"); // bounds-check: 2
+ tstr.Exec__parse_from_url_bar("A.b.m." ).Test__to_str("en.wikipedia.org/wiki/A.b.m."); // false-match
+ tstr.Exec__parse_from_url_bar("en.x.wikipedia.org/wiki/A" ).Test__to_str("en.wikipedia.org/wiki/En.x.wikipedia.org/wiki/A"); // fail
}
@Test public void Missing_page() {
- tstr.Run_parse_from_url_bar("http://a.org").Chk_is_null(); // unknown wiki; return null;
- tstr.Run_parse_from_url_bar("http://en.wikipedia.org").Chk_to_str("en.wikipedia.org/wiki/Main_Page"); // known wiki; return Main_Page
+ tstr.Exec__parse_from_url_bar("http://a.org").Test__is_null(); // unknown wiki; return null;
+ tstr.Exec__parse_from_url_bar("http://en.wikipedia.org").Test__to_str("en.wikipedia.org/wiki/Main_Page"); // known wiki; return Main_Page
}
@Test public void Invalid_names() {
- tstr.Run_parse_from_url_bar("http://a/b/c").Chk_is_null(); // unknown url
- tstr.Run_parse_from_url_bar("war").Chk_to_str("en.wikipedia.org/wiki/War"); // word looks like lang, but is actually page; default to current
+ tstr.Exec__parse_from_url_bar("http://a/b/c").Test__is_null(); // unknown url
+ tstr.Exec__parse_from_url_bar("war").Test__to_str("en.wikipedia.org/wiki/War"); // word looks like lang, but is actually page; default to current
}
@Test public void Proper_case() {
- tstr.Run_parse_from_url_bar("a" ).Chk_to_str("en.wikipedia.org/wiki/A"); // "a" -> "A" x> "a"
+ tstr.Exec__parse_from_url_bar("a" ).Test__to_str("en.wikipedia.org/wiki/A"); // "a" -> "A" x> "a"
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java
index c32ac95c0..53ca76693 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java
@@ -20,22 +20,22 @@ import org.junit.*;
public class Xow_url_parser__wiki_tst {
private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt();
@Test public void Basic() {
- tstr.Run_parse("en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("en.wikipedia.org").Chk_page("A");
+ tstr.Exec__parse("en.wikipedia.org/wiki/A").Test__tid(Xoa_url_.Tid_page).Test__wiki("en.wikipedia.org").Test__page("A");
}
@Test public void No_wiki() { // PURPOSE: no "/wiki/"
- tstr.Run_parse("en.wikipedia.org/A").Chk_wiki("en.wikipedia.org").Chk_page("A");
+ tstr.Exec__parse("en.wikipedia.org/A").Test__wiki("en.wikipedia.org").Test__page("A");
}
@Test public void Nested() {
- tstr.Run_parse("en.wikipedia.org/wiki/A/b").Chk_wiki("en.wikipedia.org").Chk_page("A/b");
+ tstr.Exec__parse("en.wikipedia.org/wiki/A/b").Test__wiki("en.wikipedia.org").Test__page("A/b");
}
@Test public void Slash() {
- tstr.Run_parse("en.wikipedia.org/wiki//A").Chk_wiki("en.wikipedia.org").Chk_page("/A");
- tstr.Run_parse("en.wikipedia.org/wiki/A//b").Chk_wiki("en.wikipedia.org").Chk_page("A//b");
- tstr.Run_parse("en.wikipedia.org/wiki///A").Chk_wiki("en.wikipedia.org").Chk_page("//A");
+ tstr.Exec__parse("en.wikipedia.org/wiki//A").Test__wiki("en.wikipedia.org").Test__page("/A");
+ tstr.Exec__parse("en.wikipedia.org/wiki/A//b").Test__wiki("en.wikipedia.org").Test__page("A//b");
+ tstr.Exec__parse("en.wikipedia.org/wiki///A").Test__wiki("en.wikipedia.org").Test__page("//A");
}
@Test public void Vnt() {
Xowe_wiki wiki = tstr.Wiki();
gplx.xowa.langs.vnts.Xol_vnt_regy_fxt.Init__vnt_mgr(wiki.Lang().Vnt_mgr(), 0, String_.Ary("zh-hans", "zh-hant"));
- tstr.Run_parse("en.wikipedia.org/zh-hans/A").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_vnt("zh-hans");
+ tstr.Exec__parse("en.wikipedia.org/zh-hans/A").Test__wiki("en.wikipedia.org").Test__page("A").Test__vnt("zh-hans");
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java
index 4affd34b6..7ba5b5750 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java
@@ -20,12 +20,12 @@ import org.junit.*;
public class Xow_url_parser__xcmd_tst {
private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt();
@Test public void Basic() {
- tstr.Run_parse("xowa-cmd:xowa.app.version").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("xowa.app.version");
+ tstr.Exec__parse("xowa-cmd:xowa.app.version").Test__tid(Xoa_url_.Tid_xcmd).Test__page("xowa.app.version");
}
@Test public void Encoded() {
- tstr.Run_parse("xowa-cmd:a%22b*c").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a\"b*c");
+ tstr.Exec__parse("xowa-cmd:a%22b*c").Test__tid(Xoa_url_.Tid_xcmd).Test__page("a\"b*c");
}
@Test public void Ignore_anchor_and_qargs() {
- tstr.Run_parse("xowa-cmd:a/b/c?d=e#f").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a/b/c?d=e#f");
+ tstr.Exec__parse("xowa-cmd:a/b/c?d=e#f").Test__tid(Xoa_url_.Tid_xcmd).Test__page("a/b/c?d=e#f");
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java
index 5e5a48792..448bb515f 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java
@@ -21,60 +21,60 @@ public class Xow_url_parser__xwiki_tst {
private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt();
@Test public void Commons() { // PURPOSE: "C" was being picked up as an xwiki to commons; PAGE:no.b:C/Variabler; DATE:2014-10-14
tstr.Prep_add_xwiki_to_user("c", "commons.wikimedia.org"); // add alias of "c"
- tstr.Run_parse("C/D").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("en.wikipedia.org").Chk_page("C/D"); // should use current wiki (enwiki), not xwiki to commons; also, page should be "C/D", not "D"
+ tstr.Exec__parse("C/D").Test__tid(Xoa_url_.Tid_page).Test__wiki("en.wikipedia.org").Test__page("C/D"); // should use current wiki (enwiki), not xwiki to commons; also, page should be "C/D", not "D"
}
@Test public void Parse_lang() {
tstr.Prep_add_xwiki_to_wiki("fr", "fr.wikipedia.org", "http://fr.wikipedia.org/~{0}");
- tstr.Run_parse("http://en.wikipedia.org/wiki/fr:A").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("fr.wikipedia.org").Chk_page("A");
+ tstr.Exec__parse("http://en.wikipedia.org/wiki/fr:A").Test__tid(Xoa_url_.Tid_page).Test__wiki("fr.wikipedia.org").Test__page("A");
}
@Test public void Alias_wiki() {
tstr.Prep_add_xwiki_to_wiki("s", "en.wikisource.org");
- tstr.Run_parse("s:A/b/c").Chk_wiki("en.wikisource.org").Chk_page("A/b/c");
+ tstr.Exec__parse("s:A/b/c").Test__wiki("en.wikisource.org").Test__page("A/b/c");
}
@Test public void Xwiki_no_segs() { // PURPOSE: handle xwiki without full url; EX: "commons:Commons:Media_of_the_day"; DATE:2014-02-19
tstr.Prep_add_xwiki_to_wiki("s", "en.wikisource.org");
- tstr.Run_parse("s:Project:A").Chk_wiki("en.wikisource.org").Chk_page("Project:A");
+ tstr.Exec__parse("s:Project:A").Test__wiki("en.wikisource.org").Test__page("Project:A");
}
@Test public void Domain_only() {
tstr.Prep_add_xwiki_to_user("fr.wikipedia.org");
- tstr.Run_parse("fr.wikipedia.org").Chk_wiki("fr.wikipedia.org").Chk_page("");
+ tstr.Exec__parse("fr.wikipedia.org").Test__wiki("fr.wikipedia.org").Test__page("");
}
@Test public void Domain_and_wiki() {
tstr.Prep_add_xwiki_to_user("fr.wikipedia.org");
- tstr.Run_parse("fr.wikipedia.org/wiki").Chk_wiki("fr.wikipedia.org").Chk_page("");
+ tstr.Exec__parse("fr.wikipedia.org/wiki").Test__wiki("fr.wikipedia.org").Test__page("");
}
@Test public void Domain_and_wiki_w_http() {
tstr.Prep_add_xwiki_to_user("fr.wikipedia.org");
- tstr.Run_parse("http://fr.wikipedia.org/wiki").Chk_wiki("fr.wikipedia.org").Chk_page("");
+ tstr.Exec__parse("http://fr.wikipedia.org/wiki").Test__wiki("fr.wikipedia.org").Test__page("");
}
@Test public void Namespace_in_different_wiki() { // PURPOSE.fix: namespaced titles would default to default_wiki instead of current_wiki
Xowe_wiki en_s = tstr.Prep_create_wiki("en.wikisource.org");
- tstr.Run_parse(en_s, "Category:A").Chk_wiki("en.wikisource.org").Chk_page("Category:A");
+ tstr.Exec__parse(en_s, "Category:A").Test__wiki("en.wikisource.org").Test__page("Category:A");
}
@Test public void Case_sensitive() {
- // tstr.Run_parse("en.wikipedia.org/wiki/a").Chk_wiki("en.wikipedia.org").Chk_page("A");
+ // tstr.Exec__parse("en.wikipedia.org/wiki/a").Test__wiki("en.wikipedia.org").Test__page("A");
Xowe_wiki en_d = tstr.Prep_create_wiki("en.wiktionary.org");
Xow_ns_mgr ns_mgr = en_d.Ns_mgr();
ns_mgr.Ns_main().Case_match_(Xow_ns_case_.Tid__all);
- tstr.Run_parse("en.wiktionary.org/wiki/a").Chk_wiki("en.wiktionary.org").Chk_page("a");
+ tstr.Exec__parse("en.wiktionary.org/wiki/a").Test__wiki("en.wiktionary.org").Test__page("a");
ns_mgr.Ns_category().Case_match_(Xow_ns_case_.Tid__all);
- tstr.Run_parse("en.wiktionary.org/wiki/Category:a").Chk_wiki("en.wiktionary.org").Chk_page("Category:a");
+ tstr.Exec__parse("en.wiktionary.org/wiki/Category:a").Test__wiki("en.wiktionary.org").Test__page("Category:a");
- tstr.Run_parse("en.wiktionary.org/wiki/A/B/C").Chk_page("A/B/C");
+ tstr.Exec__parse("en.wiktionary.org/wiki/A/B/C").Test__page("A/B/C");
}
@Test public void Xwiki__to_enwiki() { // PURPOSE: handle alias of "wikipedia" and sv.wikipedia.org/wiki/Wikipedia:Main_Page; DATE:2015-07-31
Xowe_wiki xwiki = tstr.Prep_create_wiki("sv.wikipedia.org");
tstr.Prep_xwiki(xwiki, "wikipedia", "en.wikipedia.org", null);
tstr.Prep_get_ns_mgr_from_meta("sv.wikipedia.org").Add_new(Xow_ns_.Tid__project, "Wikipedia");
- tstr.Run_parse(xwiki, "sv.wikipedia.org/wiki/wikipedia:X").Chk_wiki("sv.wikipedia.org").Chk_page("wikipedia:X");
- tstr.Run_parse(xwiki, "sv.wikipedia.org/wiki/Wikipedia:X").Chk_wiki("sv.wikipedia.org").Chk_page("Wikipedia:X");
+ tstr.Exec__parse(xwiki, "sv.wikipedia.org/wiki/wikipedia:X").Test__wiki("sv.wikipedia.org").Test__page("wikipedia:X");
+ tstr.Exec__parse(xwiki, "sv.wikipedia.org/wiki/Wikipedia:X").Test__wiki("sv.wikipedia.org").Test__page("Wikipedia:X");
}
@Test public void Xwiki__to_ns() { // PURPOSE: handle alias of "wikipedia" in current, but no "Wikipedia" ns in other wiki; PAGE:pt.w:Wikipedia:P�gina_de_testes DATE:2015-09-17
tstr.Prep_create_wiki("pt.wikipedia.org");
tstr.Prep_get_ns_mgr_from_meta("pt.wikipedia.org").Add_new(Xow_ns_.Tid__project, "Project"); // clear ns_mgr and add only "Project" ns, not "Wikipedia" ns
tstr.Prep_xwiki(tstr.Wiki(), "wikipedia", "en.wikipedia.org", null); // add alias of "wikipedia" in current wiki
- tstr.Run_parse(tstr.Wiki(), "pt.wikipedia.org/wiki/Wikipedia:X").Chk_wiki("pt.wikipedia.org").Chk_page("Wikipedia:X"); // should get "pt.wikipedia.org", not "en.wikipedia.org" (through alias)
+ tstr.Exec__parse(tstr.Wiki(), "pt.wikipedia.org/wiki/Wikipedia:X").Test__wiki("pt.wikipedia.org").Test__page("Wikipedia:X"); // should get "pt.wikipedia.org", not "en.wikipedia.org" (through alias)
}
}
diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java
index 32f5379e8..4c3144b17 100644
--- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java
+++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java
@@ -46,36 +46,36 @@ public class Xow_url_parser_fxt {
public Xow_ns_mgr Prep_get_ns_mgr_from_meta(String wiki) {
return app.Dbmeta_mgr().Ns__get_or_load(Bry_.new_u8(wiki));
}
- public Xow_url_parser_fxt Run_parse(String actl_str) {return Run_parse(cur_wiki, actl_str);}
- public Xow_url_parser_fxt Run_parse(Xow_wiki wiki, String actl_str) {
+ public Xow_url_parser_fxt Exec__parse(String actl_str) {return Exec__parse(cur_wiki, actl_str);}
+ public Xow_url_parser_fxt Exec__parse(Xow_wiki wiki, String actl_str) {
this.actl_url = wiki.Utl__url_parser().Parse(Bry_.new_u8(actl_str));
return this;
}
- public Xow_url_parser_fxt Run_parse_reuse(String actl_str) {
+ public Xow_url_parser_fxt Exec__parse_reuse(String actl_str) {
this.actl_url = parser.Parse(Bry_.new_u8(actl_str));
return this;
}
- public Xow_url_parser_fxt Run_parse_from_url_bar(String raw) {
+ public Xow_url_parser_fxt Exec__parse_from_url_bar(String raw) {
this.actl_url = parser.Parse_by_urlbar_or_null(raw);
return this;
}
- public Xow_url_parser_fxt Chk_tid(int v) {Tfds.Eq_int(v, actl_url.Tid() , "tid"); return this;}
- public Xow_url_parser_fxt Chk_is_null() {Tfds.Eq_bool(true, actl_url == null); return this;}
- public Xow_url_parser_fxt Chk_vnt(String v) {Tfds.Eq_str(v, actl_url.Vnt_bry() , "vnt"); return this;}
- public Xow_url_parser_fxt Chk_wiki(String v) {Tfds.Eq_str(v, actl_url.Wiki_bry() , "wiki"); return this;}
- public Xow_url_parser_fxt Chk_wiki_is_missing(boolean v) {Tfds.Eq_bool(v, actl_url.Wiki_is_missing(), "wiki_is_missing"); return this;}
- public Xow_url_parser_fxt Chk_page(String v) {Tfds.Eq_str(v, actl_url.Page_bry() , "page"); return this;}
- public Xow_url_parser_fxt Chk_qargs(String v) {Tfds.Eq_str(v, actl_url.Qargs_mgr().To_bry(), "qargs"); return this;}
- public Xow_url_parser_fxt Chk_page_is_main_y() {return Chk_page_is_main(Bool_.Y);}
- public Xow_url_parser_fxt Chk_page_is_main_n() {return Chk_page_is_main(Bool_.N);}
- public Xow_url_parser_fxt Chk_page_is_main(boolean v) {Tfds.Eq_bool(v, actl_url.Page_is_main() , "page_is_main"); return this;}
- public Xow_url_parser_fxt Chk_anch(String v) {Tfds.Eq_str(v, actl_url.Anch_bry(), "anch"); return this;}
- public Xow_url_parser_fxt Chk_action_is_edit_y() {return Chk_action_is_edit_(Bool_.Y);}
- public Xow_url_parser_fxt Chk_action_is_edit_n() {return Chk_action_is_edit_(Bool_.N);}
- private Xow_url_parser_fxt Chk_action_is_edit_(boolean v) {Tfds.Eq_bool(v, actl_url.Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit), "action_is_edit"); return this;}
- public Xow_url_parser_fxt Chk_to_str(String v) {return Chk_to_str(Bool_.Y, v);}
- public Xow_url_parser_fxt Chk_to_str(boolean full, String v) {Tfds.Eq_str(v, actl_url.To_bry(full, Bool_.Y), "To_bry"); return this;}
- public Xow_url_parser_fxt Chk_build_str_is_same() {
+ public Xow_url_parser_fxt Test__tid(int v) {Tfds.Eq_int(v, actl_url.Tid() , "tid"); return this;}
+ public Xow_url_parser_fxt Test__is_null() {Tfds.Eq_bool(true, actl_url == null); return this;}
+ public Xow_url_parser_fxt Test__vnt(String v) {Tfds.Eq_str(v, actl_url.Vnt_bry() , "vnt"); return this;}
+ public Xow_url_parser_fxt Test__wiki(String v) {Tfds.Eq_str(v, actl_url.Wiki_bry() , "wiki"); return this;}
+ public Xow_url_parser_fxt Test__wiki_is_missing(boolean v) {Tfds.Eq_bool(v, actl_url.Wiki_is_missing(), "wiki_is_missing"); return this;}
+ public Xow_url_parser_fxt Test__page(String v) {Tfds.Eq_str(v, actl_url.Page_bry() , "page"); return this;}
+ public Xow_url_parser_fxt Test__qargs(String v) {Tfds.Eq_str(v, actl_url.Qargs_mgr().To_bry(), "qargs"); return this;}
+ public Xow_url_parser_fxt Test__page_is_main_y() {return Test__page_is_main(Bool_.Y);}
+ public Xow_url_parser_fxt Test__page_is_main_n() {return Test__page_is_main(Bool_.N);}
+ public Xow_url_parser_fxt Test__page_is_main(boolean v) {Tfds.Eq_bool(v, actl_url.Page_is_main() , "page_is_main"); return this;}
+ public Xow_url_parser_fxt Test__anch(String v) {Tfds.Eq_str(v, actl_url.Anch_bry(), "anch"); return this;}
+ public Xow_url_parser_fxt Test__action_is_edit_y() {return Test__action_is_edit_(Bool_.Y);}
+ public Xow_url_parser_fxt Test__action_is_edit_n() {return Test__action_is_edit_(Bool_.N);}
+ private Xow_url_parser_fxt Test__action_is_edit_(boolean v) {Tfds.Eq_bool(v, actl_url.Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit), "action_is_edit"); return this;}
+ public Xow_url_parser_fxt Test__to_str(String v) {return Test__to_str(Bool_.Y, v);}
+ public Xow_url_parser_fxt Test__to_str(boolean full, String v) {Tfds.Eq_str(v, actl_url.To_bry(full, Bool_.Y), "To_bry"); return this;}
+ public Xow_url_parser_fxt Test__build_str_is_same() {
Xow_url_parser parser = new Xow_url_parser(cur_wiki);
Tfds.Eq_str(actl_url.Raw(), parser.Build_str(actl_url), "build_str");
return this;
diff --git a/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java
index 5bed2850d..6773dad63 100644
--- a/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java
+++ b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java
@@ -46,7 +46,8 @@ public class Xoapi_orig_wmf extends Xoapi_orig_base {
if (Parse_xml_val(tmp_rng, usr_dlg, xml, xml_len, pos, Bry_xml_descriptionurl)) {
byte[] file_url = Bry_.Mid(xml, tmp_rng.Val_0(), tmp_rng.Val_1());
- orig_wiki = gplx.xowa.wikis.xwikis.Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, file_url);
+ Gfo_url url = url_parser.Parse(file_url, 0, file_url.length);
+ orig_wiki = url.Segs__get_at_1st();
byte[] page = Xoa_ttl.Replace_spaces(url.Segs__get_at_nth());
int colon_pos = Bry_find_.Find_fwd(page, Byte_ascii.Colon, 0, page.length);
if (colon_pos != Bry_find_.Not_found)
@@ -58,7 +59,7 @@ public class Xoapi_orig_wmf extends Xoapi_orig_base {
}
}
private static Int_2_ref tmp_rng = new Int_2_ref();
- private static Gfo_url_parser url_parser = new Gfo_url_parser(); private static Gfo_url url = new Gfo_url();
+ private static Gfo_url_parser url_parser = new Gfo_url_parser();
private static boolean Parse_xml_val(Int_2_ref rv, Gfo_usr_dlg usr_dlg, byte[] xml, int xml_len, int pos, byte[] key) {
int bgn = 0, end = 0;
bgn = Bry_find_.Find_fwd(xml, key, pos, xml_len); if (bgn == Bry_find_.Not_found) return false;
diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java
index a089868ef..a3cedd74c 100644
--- a/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java
+++ b/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java
@@ -17,9 +17,10 @@ along with this program. If not, see .
*/
package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*;
import gplx.core.consoles.*; import gplx.core.envs.*;
-import gplx.xowa.apps.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.bldrs.cfgs.*; import gplx.xowa.langs.bldrs.*;
+import gplx.xowa.apps.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.langs.bldrs.*;
import gplx.xowa.bldrs.wkrs.*;
import gplx.langs.jsons.*;
+import gplx.xowa.addons.bldrs.app_cfgs.*;
public class Xob_bldr implements Gfo_invk {
private boolean pause_at_end = false; private long prv_prog_time; private Xob_xml_parser dump_parser;
public Xob_bldr(Xoae_app app) {
diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java
index 7d2857553..b3a811c98 100644
--- a/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java
+++ b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java
@@ -36,7 +36,7 @@ public class Xob_page_wkr_cmd implements Xob_cmd {
gplx.core.ios.streams.Io_stream_rdr src_rdr = wiki.Import_cfg().Src_rdr();
fil = Io_buffer_rdr.new_(src_rdr, optRdrBfrSize);
fil_len = fil.Fil_len();
- if (src_rdr.Tid() == gplx.core.ios.streams.Io_stream_.Tid_bzip2) fil_len = (fil_len * 100) / 18; // HACK: no way to get actual file progress; assume 18% compression
+ if (src_rdr.Tid() == gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2) fil_len = (fil_len * 100) / 18; // HACK: no way to get actual file progress; assume 18% compression
// fil.Seek(bldr.Opts().ResumeAt());
int prv_pos = 0;
while (true) {
diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java
index 50ebe5fab..5495d0cb3 100644
--- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java
+++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java
@@ -107,7 +107,7 @@ public class Xob_make_cmd_site implements Io_make_cmd {
fil_wtr.Add_idx_direct(itm_len, Byte_.Zero);
Io_stream_wtr wtr = null;
try {
- wtr = Io_stream_wtr_.file_(fil_wtr.Fil_url());
+ wtr = Io_stream_wtr_.New__raw(fil_wtr.Fil_url());
wtr.Open();
fil_wtr.FlushIdx(wtr);
wtr.Write(bry, itm_bgn, itm_end);
diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java
index ccb9e45f2..a092678cc 100644
--- a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java
+++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java
@@ -30,9 +30,9 @@ public class Xob_unzip_wkr {
}
public void Decompress(Io_url src, Io_url trg) {
String src_ext = src.Ext();
- if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_.Ext_bz2)) process = decompress_bz2;
- else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_.Ext_zip)) process = decompress_zip;
- else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_.Ext_gz)) process = decompress_gz;
+ if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_tid_.Ext__bz2)) process = decompress_bz2;
+ else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_tid_.Ext__zip)) process = decompress_zip;
+ else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_tid_.Ext__gz)) process = decompress_gz;
else throw Err_.new_unhandled(src_ext);
Io_url trg_owner_dir = trg.OwnerDir();
Io_mgr.Instance.CreateDirIfAbsent(trg_owner_dir);
diff --git a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java
index 93871e62e..f0e130407 100644
--- a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java
+++ b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java
@@ -240,7 +240,6 @@ public class Xoa_css_extractor {
int prv_pos = 0;
int css_find_bgn_len = Css_find_bgn.length;
byte[] protocol_prefix_bry = Bry_.new_u8(protocol_prefix);
- Gfo_url gfo_url = new Gfo_url();
while (true) {
int url_bgn = Bry_find_.Find_fwd(raw, Css_find_bgn, prv_pos); if (url_bgn == Bry_find_.Not_found) break; // nothing left; stop
url_bgn += css_find_bgn_len;
@@ -249,7 +248,7 @@ public class Xoa_css_extractor {
css_url_bry = Bry_.Replace(css_url_bry, Css_amp_find, Css_amp_repl); // & -> &
css_url_bry = url_encoder.Decode(css_url_bry); // %2C -> %7C -> |
css_url_bry = Xoa_css_extractor.Url_root_fix(wiki_domain, css_url_bry);
- url_parser.Parse(gfo_url, css_url_bry, 0, css_url_bry.length);
+ Gfo_url gfo_url = url_parser.Parse(css_url_bry, 0, css_url_bry.length);
if ( gfo_url.Protocol_tid() == Gfo_protocol_itm.Tid_relative_1 // if rel url, add protocol_prefix DATE:2015-08-01
|| (Env_.Mode_testing() && gfo_url.Protocol_tid() == Gfo_protocol_itm.Tid_unknown)) // TEST:
css_url_bry = Bry_.Add(protocol_prefix_bry, css_url_bry);
diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java
index 1dca99e6c..9d4376002 100644
--- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java
+++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java
@@ -21,7 +21,7 @@ import gplx.xowa.bldrs.wms.dumps.*;
public class Xoi_dump_mgr implements Gfo_invk {
public String[] Server_urls() {return server_urls;} private String[] server_urls = String_.Ary(Xowm_dump_file_.Server_your_org, Xowm_dump_file_.Server_wmf_https, Xowm_dump_file_.Server_c3sl, Xowm_dump_file_.Server_masaryk); // promote your.org to primary url; DATE:2016-08-07
public String[] Custom_cmds() {return custom_cmds;} private String[] custom_cmds = String_.Ary(Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_import.KEY);
- public byte Data_storage_format() {return data_storage_format;} public Xoi_dump_mgr Data_storage_format_(byte v) {data_storage_format = v; return this;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_.Tid_gzip;
+ public byte Data_storage_format() {return data_storage_format;} public Xoi_dump_mgr Data_storage_format_(byte v) {data_storage_format = v; return this;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_tid_.Tid__gzip;
public long Db_text_max() {return db_text_max;} private long db_text_max = (long)3000 * Io_mgr.Len_mb;
public long Db_categorylinks_max() {return db_categorylinks_max;} private long db_categorylinks_max = (long)3600 * Io_mgr.Len_mb;
public long Db_wikidata_max() {return db_wikidata_max;} private long db_wikidata_max = (long)3600 * Io_mgr.Len_mb;
@@ -38,8 +38,8 @@ public class Xoi_dump_mgr implements Gfo_invk {
else if (ctx.Match(k, Invk_server_urls_)) server_urls = m.ReadStrAryIgnore("v", ",", "\n");
else if (ctx.Match(k, Invk_custom_cmds)) return String_.Concat_with_str(",", custom_cmds);
else if (ctx.Match(k, Invk_custom_cmds_)) custom_cmds = String_.Ary_filter(m.ReadStrAry("v", ","), Xoi_cmd_mgr.Wiki_cmds_valid);
- else if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(data_storage_format);
- else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_.Obsolete_to_tid(m.ReadStr("v"));
+ else if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_tid_.Obsolete_to_str(data_storage_format);
+ else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_tid_.Obsolete_to_tid(m.ReadStr("v"));
else if (ctx.Match(k, Invk_data_storage_format_list)) return Options_data_storage_format_list;
else if (ctx.Match(k, Invk_db_text_max)) return db_text_max / Io_mgr.Len_mb;
else if (ctx.Match(k, Invk_db_text_max_)) db_text_max = m.ReadLong("v") * Io_mgr.Len_mb;
diff --git a/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java b/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java
index c085f2a78..ef0818154 100644
--- a/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java
+++ b/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java
@@ -32,7 +32,7 @@ public class Xosql_dump_parser {
try {
// init bfrs, rdr
Bry_bfr val_bfr = Bry_bfr_.New();
- rdr = Io_buffer_rdr.new_(Io_stream_rdr_.new_by_url_(src_fil), src_rdr_bfr_len);
+ rdr = Io_buffer_rdr.new_(Io_stream_rdr_.New_by_url(src_fil), src_rdr_bfr_len);
byte[] bfr = rdr.Bfr(); int bfr_len = rdr.Bfr_len(), fld_idx = 0, cur_pos = 0;
this.tbl_flds = Identify_flds(cbk_flds, bfr);
diff --git a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java
index 190342e1e..1b5388978 100644
--- a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java
+++ b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java
@@ -18,7 +18,7 @@ along with this program. If not, see .
package gplx.xowa.bldrs.wiki_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import org.junit.*; import gplx.core.strings.*;
import gplx.langs.xmls.*;
-import gplx.xowa.bldrs.cfgs.*;
+import gplx.xowa.addons.bldrs.app_cfgs.*;
public class Xoi_wiki_props_api_tst {
private Xoi_wiki_props_fxt fxt = new Xoi_wiki_props_fxt();
@Before public void init() {} // private Xob_subpage_tst_fxt fxt = new] Xob_subpage_tst_fxt();
diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java
index 4759e9a20..bb215b11b 100644
--- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java
+++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java
@@ -49,12 +49,12 @@ public class Xob_import_cfg {
return Io_stream_rdr_process.new_(process.Exe_url(), src_fil_bz2, process.Xto_process_bldr_args(src_fil_bz2.Raw()));
}
else
- return Io_stream_rdr_.bzip2_(src_fil_bz2);
+ return Io_stream_rdr_.New__bzip2(src_fil_bz2);
}
else {
Chk_file_ext(wiki.Appe(), src_fil_xml, ".xml", "bz2");
src_fil = src_fil_xml; src_rdr_len = Io_mgr.Instance.QueryFil(src_fil_xml).Size();
- return Io_stream_rdr_.file_(src_fil_xml);
+ return Io_stream_rdr_.New__raw(src_fil_xml);
}
}
private static void Chk_file_ext(Xoae_app app, Io_url fil, String expd_ext, String alt_ext) {
diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java
index 40a14a4ff..b7dc09f93 100644
--- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java
+++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java
@@ -23,7 +23,7 @@ public class Xob_xml_page_bldr {
public Io_buffer_rdr XtoByteStreamRdr(int bfr_len) {
Io_url url = Io_url_.mem_fil_("mem/byteStreamRdr.txt");
Io_mgr.Instance.SaveFilBry(url, bfr.To_bry_and_clear());
- return Io_buffer_rdr.new_(gplx.core.ios.streams.Io_stream_rdr_.file_(url), bfr_len);
+ return Io_buffer_rdr.new_(gplx.core.ios.streams.Io_stream_rdr_.New__raw(url), bfr_len);
}
public Bry_bfr Bfr() {return bfr;} Bry_bfr bfr = Bry_bfr_.New();
public Xob_xml_page_bldr Upd(String find, String repl) {
diff --git a/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java b/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java
index 5ff8ae344..561903264 100644
--- a/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java
+++ b/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java
@@ -35,7 +35,7 @@ public class Xowd_data_tstr {
Xoh_page hpg = new Xoh_page();
hpg.Db().Html().Html_bry_(html_bry);
byte[] data = html_bry;
- html_db.Tbl__html().Insert(page_id, 0, gplx.core.ios.streams.Io_stream_.Tid_raw, gplx.xowa.htmls.core.hzips.Xoh_hzip_dict_.Hzip__none, Bry_.Empty, Bry_.Empty, Bry_.Empty, data);
+ html_db.Tbl__html().Insert(page_id, 0, gplx.core.ios.streams.Io_stream_tid_.Tid__raw, gplx.xowa.htmls.core.hzips.Xoh_hzip_dict_.Hzip__none, Bry_.Empty, Bry_.Empty, Bry_.Empty, data);
}
public void Text__insert(int page_id, String text) {
Xow_db_file db = wiki.Data__core_mgr().Db__text();
diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java
index 2d5bbb8ad..ff3fc6b73 100644
--- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java
+++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java
@@ -120,7 +120,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr {
}
public static void Save_bin(Xof_fsdb_itm itm, Fsm_mnt_mgr mnt_mgr, Io_url html_url) {
long rdr_len = Io_mgr.Instance.QueryFil(html_url).Size();
- Io_stream_rdr rdr = gplx.core.ios.streams.Io_stream_rdr_.file_(html_url);
+ Io_stream_rdr rdr = gplx.core.ios.streams.Io_stream_rdr_.New__raw(html_url);
try {
rdr.Open();
Fsm_mnt_itm mnt_itm = mnt_mgr.Mnts__get_insert();
diff --git a/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java
index 64daf8e14..d376b66ec 100644
--- a/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java
+++ b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java
@@ -23,6 +23,6 @@ public class Io_download_mgr__memory implements Io_download_mgr {
public void Upload_data(String url, byte[] data) {hash.Add(url, data);}
public Io_stream_rdr Download_as_rdr(String url) {
byte[] data = (byte[])hash.Get_by(url); if (data == null) return Io_stream_rdr_.Noop;
- return Io_stream_rdr_.mem_(data);
+ return Io_stream_rdr_.New__mem(data);
}
}
diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java
index f038dec8e..7e59a1aa3 100644
--- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java
+++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java
@@ -110,7 +110,7 @@ public class Xof_bin_mgr {
boolean resized = Resize(exec_tid, fsdb, file_is_orig, orig, trg);
if (!resized) continue;
fsdb.File_exists_y_();
- rv = Io_stream_rdr_.file_(trg); // return stream of resized url; (result of imageMagick / inkscape)
+ rv = Io_stream_rdr_.New__raw(trg); // return stream of resized url; (result of imageMagick / inkscape)
rv.Open();
return rv;
}
@@ -151,7 +151,7 @@ public class Xof_bin_mgr {
if (save_to_fsys) { // noop; already saved to trg
}
else {
- Io_stream_rdr rdr = Io_stream_rdr_.file_(trg); // return stream of resized url; (result of imageMagick / inkscape)
+ Io_stream_rdr rdr = Io_stream_rdr_.New__raw(trg); // return stream of resized url; (result of imageMagick / inkscape)
rdr.Open();
rdr_wrapper.Rdr_(rdr);
}
diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java
index c1298865c..87a744d70 100644
--- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java
+++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java
@@ -25,7 +25,7 @@ public abstract class Xof_bin_wkr__fsys_base implements Xof_bin_wkr, Gfo_invk {
public boolean Resize_allowed() {return resize_allowed;} public void Resize_allowed_(boolean v) {resize_allowed = v;} private boolean resize_allowed = false;
public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm itm, boolean is_thumb, int w) {
Io_url src_url = this.Get_src_url(Xof_img_mode_.By_bool(is_thumb), String_.new_u8(itm.Orig_repo_name()), itm.Orig_ttl(), itm.Orig_ttl_md5(), itm.Orig_ext(), w, itm.Lnki_time(), itm.Lnki_page());
- return (src_url == Io_url_.Empty) ? gplx.core.ios.streams.Io_stream_rdr_.Noop : gplx.core.ios.streams.Io_stream_rdr_.file_(src_url);
+ return (src_url == Io_url_.Empty) ? gplx.core.ios.streams.Io_stream_rdr_.Noop : gplx.core.ios.streams.Io_stream_rdr_.New__raw(src_url);
}
public boolean Get_to_fsys(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) {
return Get_to_fsys(itm.Orig_repo_name(), itm.Orig_ttl(), itm.Orig_ttl_md5(), itm.Orig_ext(), is_thumb, w, itm.Lnki_time(), itm.Lnki_page(), bin_url);
diff --git a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java
index 74eaf8810..caca2e854 100644
--- a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java
+++ b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java
@@ -59,9 +59,9 @@ class Xof_file_fxt {
Fsm_atr_fil atr_fil = mnt_itm.Atr_mgr().Db__core();
Fsm_bin_fil bin_fil = mnt_itm.Bin_mgr().Dbs__get_nth();
if (arg.Is_thumb())
- mnt_itm.Insert_thm(tmp_thm, atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Time(), arg.Page(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.mem_(arg.Bin()));
+ mnt_itm.Insert_thm(tmp_thm, atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Time(), arg.Page(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.New__mem(arg.Bin()));
else
- mnt_itm.Insert_img(atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.mem_(arg.Bin()));
+ mnt_itm.Insert_img(atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.New__mem(arg.Bin()));
}
public void Exec_get(Xof_exec_arg arg) {
byte[] ttl_bry = arg.Ttl();
diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java
index 3c891fdc8..5368e27e6 100644
--- a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java
+++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java
@@ -26,24 +26,27 @@ public class Xog_url_wkr {
private Xoae_app app; private Xog_win_itm win; private Xowe_wiki wiki; private Xoae_page page;
private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2();
private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make();
- public Xog_url_wkr Parse(Xog_win_itm win, String href_str) {
- if (href_str == null) return this; // text is not link; return;
+ public Xoa_url Parse(Xog_win_itm win, String href_str) {
+ if (href_str == null) return tmp_url; // text is not link; return;
byte[] href_bry = Bry_.new_u8(href_str);
this.win = win; this.app = win.App();
this.page = win.Active_page();
this.wiki = win.Active_tab().Wiki();
app.Html__href_parser().Parse_as_url(tmp_url, href_bry, wiki, page.Ttl().Page_url());
- return this;
+ return tmp_url;
}
- public Xoa_url Exec() {
- switch (tmp_url.Tid()) {
+ public void Init(Xowe_wiki wiki) { // TEST:
+ this.wiki = wiki;
+ }
+ public Xoa_url Exec(Xoa_url url) {
+ switch (url.Tid()) {
case Xoa_url_.Tid_unknown: return Xoa_url.Null; // unknown; return null which will become a noop
case Xoa_url_.Tid_inet: return Exec_url_http(app); // http://site.org
case Xoa_url_.Tid_anch: return Exec_url_anchor(win); // #anchor
case Xoa_url_.Tid_xcmd: return Exec_url_xowa(app); // xowa:app.version or /xcmd/app.version
- case Xoa_url_.Tid_file: return Exec_url_file(app, wiki, page, win, tmp_url.Raw()); // file:///xowa/A.png
- case Xoa_url_.Tid_page: return Exec_url_page(app, wiki, page, win, tmp_url.Raw()); // Page /wiki/Page
- default: throw Err_.new_unhandled(tmp_url.Tid());
+ case Xoa_url_.Tid_file: return Exec_url_file(app, wiki, page, win, url.Raw()); // file:///xowa/A.png
+ case Xoa_url_.Tid_page: return Exec_url_page(wiki, url.Orig()); // /wiki/Page
+ default: throw Err_.new_unhandled(url.Tid());
}
}
private Xoa_url Exec_url_xowa(Xoae_app app) { // EX: xowa:app.version
@@ -90,24 +93,13 @@ public class Xog_url_wkr {
}
return Rslt_handled;
}
- private Xoa_url Exec_url_page(Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19
- Xoa_url rv = wiki.Utl__url_parser().Parse(href_bry);// needed for query_args
- Gfo_qarg_itm[] qargs = rv.Qargs_ary();
- int qargs_len = qargs.length;
- if (qargs_len > 0) { // remove anchors from qargs; EX: "to=B#mw_pages"
- for (int i = 0; i < qargs_len; i++) {
- Gfo_qarg_itm arg = qargs[i];
- int anch_pos = Bry_find_.Find_bwd(arg.Val_bry(), Byte_ascii.Hash); // NOTE: must .FindBwd to handle Category args like de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages; DATE:2013-06-18
- if (anch_pos != Bry_find_.Not_found)
- arg.Val_bry_(Bry_.Mid(arg.Val_bry(), 0, anch_pos));
- }
- }
- return rv;
+ private Xoa_url Exec_url_page(Xowe_wiki wiki, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19
+ return wiki.Utl__url_parser().Parse(href_bry);
}
public static Xoa_url Rslt_handled = null;
public static Xoa_url Exec_url(Xog_win_itm win, String href_str) {
Xog_url_wkr url_wkr = new Xog_url_wkr();
- url_wkr.Parse(win, href_str);
- return url_wkr.Exec();
+ Xoa_url url = url_wkr.Parse(win, href_str);
+ return url_wkr.Exec(url);
}
}
diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java
new file mode 100644
index 000000000..b494a1080
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java
@@ -0,0 +1,48 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.guis.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
+import org.junit.*; import gplx.core.tests.*;
+public class Xog_url_wkr__tst {
+ private final Xog_url_wkr__fxt fxt = new Xog_url_wkr__fxt();
+ @Test public void Basic() {
+ fxt.Exec__parse("/wiki/A?k1=B%26C");
+ fxt.Test__raw("/wiki/A?k1=B%26C");
+ }
+ @Test public void Anch_early() { // de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages
+ fxt.Exec__parse("/wiki/A?pagefrom=%23%3A7p#mw-pages");
+ fxt.Test__qarg("?pagefrom=#:7p");
+ fxt.Test__anch("mw-pages");
+ }
+}
+class Xog_url_wkr__fxt {
+ private final Xowe_wiki wiki;
+ private final Xog_url_wkr wkr = new Xog_url_wkr();
+ private Xoa_url url;
+ public Xog_url_wkr__fxt() {
+ Xoae_app app = Xoa_app_fxt.Make__app__edit();
+ this.wiki = Xoa_app_fxt.Make__wiki__edit(app);
+ wkr.Init(wiki);
+ }
+ public void Exec__parse(String href) {
+ this.url = wiki.Utl__url_parser().Parse(Bry_.new_u8(href));
+ this.url = wkr.Exec(url);
+ }
+ public void Test__raw(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Raw()));}
+ public void Test__qarg(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Qargs_mgr().To_bry()));}
+ public void Test__anch(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Anch_bry()));}
+}
diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java
index 9af1c6a0a..a17caddbe 100644
--- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java
+++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java
@@ -60,6 +60,10 @@ public class Xoh_page_wtr_wkr {
if (page_mode == Xopg_page_.Tid_html) // if html, write page again, but wrap it in html skin this time
Write_page_by_tid(ctx, hctx, page_mode, rv, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(rv.To_bry_and_clear()));
wdata_lang_wtr.Page_(null);
+
+ if (page_mode == Xopg_page_.Tid_read) { // EXPERIMENTAL
+ new gplx.xowa.addons.htmls.includes.Xoh_include_mgr().Write(wiki, page);
+ }
}
}
else
@@ -176,7 +180,7 @@ public class Xoh_page_wtr_wkr {
}
// if [[Category]], render rest of html (Subcategories; Pages; Files); note that a category may have other html which requires wikitext processing
- if (ns_id == Xow_ns_.Tid__category) wiki.Html_mgr().Catpage_mgr().Write_catpage(tidy_bfr, wiki, page, hctx);
+ if (ns_id == Xow_ns_.Tid__category) wiki.Ctg__catpage_mgr().Write_catpage(tidy_bfr, page, hctx);
// tidy html
wiki.Html_mgr().Tidy_mgr().Exec_tidy(tidy_bfr, !hctx.Mode_is_hdump(), page.Url_bry_safe());
@@ -192,8 +196,9 @@ public class Xoh_page_wtr_wkr {
&& !wiki.Html_mgr().Importing_ctgs() // do not show categories if importing categories, page will wait for category import to be done; DATE:2014-10-15
) {
if (app.Mode().Tid_is_gui()) app.Usr_dlg().Prog_many("", "", "loading categories: count=~{0}", ctgs_len);
- Xoctg_pagebox_itm[] pagebox_itms = wiki.Html__ctg_pagebox_wtr().Get_catlinks_by_page(wiki, page);
- wiki.Html__ctg_pagebox_wtr().Write_pagebox(app.Ctg_mgr().Pagecats_grouping_enabled(), bfr, wiki, page, pagebox_itms);
+ Xoctg_pagebox_itm[] pagebox_itms = wiki.Ctg__pagebox_wtr().Get_catlinks_by_page(wiki, page);
+ boolean hidden_enabled = wiki.App().Api_root().Addon().Wikis__ctgs__hidden_enabled();
+ wiki.Ctg__pagebox_wtr().Write_pagebox(hidden_enabled, bfr, wiki, page, pagebox_itms);
}
// translate if variants are enabled
diff --git a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java
index 76cfc093d..480cc9c3d 100644
--- a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java
+++ b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java
@@ -23,7 +23,6 @@ import gplx.xowa.parsers.xndes.*;
import gplx.xowa.htmls.portal.*; import gplx.xowa.addons.htmls.tocs.*; import gplx.xowa.wikis.modules.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.htmls.tidy.*; import gplx.xowa.htmls.js.*;
import gplx.langs.htmls.encoders.*;
import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.singles.*;
-import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
public class Xow_html_mgr implements Gfo_invk {
private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make();
public Xow_html_mgr(Xowe_wiki wiki) {
@@ -53,7 +52,6 @@ public class Xow_html_mgr implements Gfo_invk {
public Xop_xatr_whitelist_mgr Whitelist_mgr() {return whitelist_mgr;} private final Xop_xatr_whitelist_mgr whitelist_mgr = new Xop_xatr_whitelist_mgr().Ini();
public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr;
public Xow_module_mgr Head_mgr() {return module_mgr;} private Xow_module_mgr module_mgr;
- public Xoctg_catpage_mgr Catpage_mgr() {return catpage_mgr;} private final Xoctg_catpage_mgr catpage_mgr = new Xoctg_catpage_mgr();
public boolean Importing_ctgs() {return importing_ctgs;} public void Importing_ctgs_(boolean v) {importing_ctgs = v;} private boolean importing_ctgs;
public int Img_thumb_width() {return img_thumb_width;} private int img_thumb_width = 220;
public byte[] Img_xowa_protocol() {return img_xowa_protocol;} private byte[] img_xowa_protocol;
diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java
index 147cc67e8..5b09d880c 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java
@@ -30,7 +30,7 @@ public class Xow_hdump_mgr {
public Xow_hdump_mgr__load Load_mgr() {return load_mgr;} private Xow_hdump_mgr__load load_mgr;
public Xoh_hzip_mgr Hzip_mgr() {return hzip_mgr;} private final Xoh_hzip_mgr hzip_mgr = new Xoh_hzip_mgr();
public void Init_by_db(Xow_wiki wiki) {
- byte dflt_zip_tid = gplx.core.ios.streams.Io_stream_.Tid_raw;
+ byte dflt_zip_tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw;
boolean dflt_hzip_enable = false;
boolean mode_is_b256 = false;
if (wiki.Data__core_mgr() != null) { // TEST: handle null data mgr
diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java
index 842574390..2c7f1b840 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java
@@ -57,10 +57,11 @@ public class Xow_hdump_mgr__load {
byte[] src = Parse(hpg, hpg.Db().Html().Zip_tid(), hpg.Db().Html().Hzip_tid(), hpg.Db().Html().Html_bry());
// write ctgs
- Xoctg_pagebox_itm[] pagebox_itms = wiki.Html__ctg_pagebox_wtr().Get_catlinks_by_page(wiki, hpg);
+ Xoctg_pagebox_itm[] pagebox_itms = wiki.Ctg__pagebox_wtr().Get_catlinks_by_page(wiki, hpg);
if (pagebox_itms.length > 0) {
- tmp_bfr.Add(src);
- wiki.Html__ctg_pagebox_wtr().Write_pagebox(Bool_.Y, tmp_bfr, wiki, hpg, pagebox_itms);
+ tmp_bfr.Add(src);
+ boolean hidden_enabled = wiki.App().Api_root().Addon().Wikis__ctgs__hidden_enabled();
+ wiki.Ctg__pagebox_wtr().Write_pagebox(hidden_enabled, tmp_bfr, wiki, hpg, pagebox_itms);
src = tmp_bfr.To_bry_and_clear();
}
@@ -70,7 +71,7 @@ public class Xow_hdump_mgr__load {
}
public byte[] Decode_as_bry(Bry_bfr bfr, Xoh_page hpg, byte[] src, boolean mode_is_diff) {hzip_mgr.Hctx().Mode_is_diff_(mode_is_diff); hzip_mgr.Decode(bfr, wiki, hpg, src); return bfr.To_bry_and_clear();}
private byte[] Parse(Xoh_page hpg, int zip_tid, int hzip_tid, byte[] src) {
- if (zip_tid > gplx.core.ios.streams.Io_stream_.Tid_raw)
+ if (zip_tid > gplx.core.ios.streams.Io_stream_tid_.Tid__raw)
src = zip_mgr.Unzip((byte)zip_tid, src);
switch (hzip_tid) {
case Xoh_hzip_dict_.Hzip__none:
diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java
index 4fc3ef1b1..122acf63d 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java
@@ -52,7 +52,7 @@ public class Xow_hdump_mgr__save {
private byte[] Write(Xoh_hzip_bfr bfr, Xow_wiki wiki, Xoh_page hpg, Xoh_hzip_mgr hzip_mgr, Io_stream_zip_mgr zip_mgr, int zip_tid, int hzip_tid, byte[] src) {
if (hzip_tid != Xoh_hzip_dict_.Hzip__none) src = hzip_mgr.Encode_as_bry((Xoh_hzip_bfr)bfr.Clear(), wiki, hpg, src);
src_as_hzip = src;
- if (zip_tid > gplx.core.ios.streams.Io_stream_.Tid_raw)
+ if (zip_tid > gplx.core.ios.streams.Io_stream_tid_.Tid__raw)
src = zip_mgr.Zip((byte)zip_tid, src);
return src;
}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java
index f5c1c902e..338a1ed49 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java
@@ -348,6 +348,7 @@ public class Xoh_html_wtr {
case Xop_xnde_tag_.Tid__math:
case Xop_xnde_tag_.Tid__indicator:
case Xop_xnde_tag_.Tid__xowa_html:
+ case Xop_xnde_tag_.Tid__xowa_wiki_setup:
case Xop_xnde_tag_.Tid__graph:
case Xop_xnde_tag_.Tid__random_selection:
case Xop_xnde_tag_.Tid__tabber:
@@ -360,7 +361,7 @@ public class Xoh_html_wtr {
break;
default: // unknown tag
if (tag.Restricted()) { // a; img; script; etc..
- if ( !page.Html_data().Html_restricted() // page is not marked restricted (only [[Special:]])
+ if ( !page.Html_data().Html_restricted() // page is not marked restricted (only [[Special:]])
|| page.Wiki().Domain_tid() == Xow_domain_tid_.Tid__home) { // page is in home wiki
bfr.Add_mid(src, xnde.Src_bgn(), xnde.Src_end());
return;
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java
index af2a256d8..bf49608a1 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java
@@ -212,7 +212,7 @@ public class Xoh_file_wtr__basic {
boolean a_href_is_file = true;
if (xowa_title_bry == null) {xowa_title_bry = lnki_ttl; a_href_is_file = false;}
link_arg = link_arg_html == null ? lnki_href : link_arg_html; // if parse fails, then assign to lnki_href; EX:link={{{1}}}
- link_arg = Gfo_url_encoder_.Href_qarg.Encode(link_arg); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16
+ link_arg = Gfo_url_encoder_.Href_quotes_v2.Encode(link_arg); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16; changed to use "v2" so not to double encode "%" values; DATE:2016-10-10
// if (Bry_.Len_gt_0(tmp_link_parser.Html_xowa_ttl())) lnki_ttl = tmp_link_parser.Html_xowa_ttl(); // DELETE: not sure why this is here; breaks test; DATE:2015-11-28
img_fmtr.Add_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, a_href_is_file, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anch_ttl, Xoh_file_fmtr__basic.Escape_xowa_title(xowa_title_bry), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other);
}
diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__basic__tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__basic__tst.java
new file mode 100644
index 000000000..f343ced7b
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__basic__tst.java
@@ -0,0 +1,96 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.htmls.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
+import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*;
+public class Xoh_href_parser__basic__tst {
+ private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt();
+ @Test public void Site__basic() {
+ fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A").Test__tid(Xoa_url_.Tid_page).Test__to_str("en.wikipedia.org/wiki/A").Test__page("A");
+ }
+ @Test public void Site__ns_case() {
+ fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/file:A").Test__page("File:A");
+ }
+ @Test public void Site__main_page() {
+ fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/").Test__page("Main_Page").Test__page_is_main_y();
+ }
+ @Test public void Site__anch() {
+ fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A#b_c").Test__page("A").Test__anch("b_c");
+ }
+ @Test public void Site__qarg() {
+ fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A?action=edit").Test__page("A").Test__qargs("?action=edit");
+ }
+ @Test public void Site__invalid_ttl_shouldnt_fail() { // PURPOSE: invalid title shouldn't fail; EX: A{{B}} is invalid (b/c of braces);
+ fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A{{B}}").Test__page("");
+ }
+ @Test public void Site__xwiki_cases_correctly() { // PURPOSE: xwiki links should use case_match of xwiki (en.wiktionary.org) not cur_wiki (en.wikipedia.org); EX:w:Alphabet
+ Xowe_wiki en_wiktionary_org = fxt.Prep_create_wiki("en.wiktionary.org");
+ en_wiktionary_org.Ns_mgr().Ns_main().Case_match_(Xow_ns_case_.Tid__all);
+ fxt.Prep_add_xwiki_to_user("en.wiktionary.org", "en.wiktionary.org");
+ fxt.Exec__parse_as_url("/site/en.wiktionary.org/wiki/alphabet");
+ fxt.Test__to_str("en.wiktionary.org/wiki/alphabet").Test__page("alphabet");
+ }
+ @Test public void Site__xwiki_compound() { // PURPOSE: [[[w:wikt:]] not handled; DATE:2013-07-25
+ fxt.Prep_add_xwiki_to_wiki("wikt", "en.wiktionary.org");
+ fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/wikt:")
+ .Test__tid(Xoa_url_.Tid_page)
+ .Test__page("Main_Page")
+ .Test__to_str("en.wiktionary.org/wiki/Main_Page")
+ ;
+ }
+// @Test public void Vnt() {
+// Xowe_wiki wiki = fxt.Wiki();
+// fxt.Prep_add_xwiki_to_user("zh.wikipedia.org");
+// wiki.Lang().Vnt_mgr().Enabled_(true);
+// wiki.Lang().Vnt_mgr().Vnt_grp().Add(new gplx.xowa.langs.vnts.Vnt_mnu_itm(Bry_.new_a7("zh-hans"), Bry_.new_a7("zh-hant")));
+// fxt.Exec__parse_as_url("/site/zh.wikipedia.org/zh-hant/A").Test__page("A").Chk_vnt("zh-hant");
+// }
+ @Test public void Http__basic() {
+ fxt.Exec__parse_as_url("http://a.org/b").Test__tid(Xoa_url_.Tid_inet);
+ }
+ @Test public void Prot__ftp() { // PURPOSE: check that urls with form of "ftp://" return back Tid_ftp; DATE:2014-04-25
+ fxt.Exec__parse_as_url("ftp://a.org").Test__tid(Xoa_url_.Tid_inet);
+ }
+ @Test public void File__basic() {
+ fxt.Exec__parse_as_url("file:///C/xowa/file/a.png").Test__tid(Xoa_url_.Tid_file);
+ }
+ @Test public void Anchor__basic() {
+ fxt.Exec__parse_as_url("#a").Test__tid(Xoa_url_.Tid_anch).Test__to_str("en.wikipedia.org/wiki/Page 1#a").Test__anch("a");
+ }
+ @Test public void Xcmd__basic() {
+ fxt.Exec__parse_as_url("/xcmd/page_edit").Test__tid(Xoa_url_.Tid_xcmd).Test__page("page_edit");
+ }
+ @Test public void Xowa__basic() {
+ fxt.Exec__parse_as_url("xowa-cmd:a%22b*c").Test__tid(Xoa_url_.Tid_xcmd).Test__page("a\"b*c");
+ }
+ // COMMENTED: this seems wrong; [//wikisource.org] should go to https://wikisource.org not https://en.wikisource.org; both sites are different; DATE:2015-08-02
+// @Test public void Site__user_wiki() {// PURPOSE: outlier for wikisource.org which is alias to en.wikisource.org; alias added in user_wiki; EX: [//wikisource.org a]; in browser, automatically goes to http://wikisource.org; in xowa, should go to /site/en.wikisource.org
+// fxt.Prep_xwiki(fxt.App().User().Wikii(), "en_wiki_alias", "en.wikipedia.org", null);
+// fxt.Exec__parse_as_url("/site/en_wiki_alias/wiki/")
+// .Test__tid(Xoa_url_.Tid_page)
+// .Test__page("Main_Page")
+// .Test__to_str("en.wikipedia.org/wiki/Main_Page")
+// ;
+// }
+}
+class Xoh_href_parser_fxt extends Xow_url_parser_fxt { private final Xoh_href_parser href_parser = new Xoh_href_parser();
+ public Xoh_href_parser_fxt Exec__parse_as_url(String raw) {
+ href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), cur_wiki, Bry__page_1);
+ return this;
+ }
+ private static final byte[] Bry__page_1 = Bry_.new_a7("Page 1");
+}
diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__qargs__tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__qargs__tst.java
new file mode 100644
index 000000000..7ed471cfe
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__qargs__tst.java
@@ -0,0 +1,38 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.htmls.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
+import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*;
+public class Xoh_href_parser__qargs__tst {
+ private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt();
+ @Test public void Basic() {
+ fxt.Exec__parse_as_url("/wiki/A?k1=v1&k2=v2");
+ fxt.Test__page("A");
+ fxt.Test__to_str("en.wikipedia.org/wiki/A?k1=v1&k2=v2");
+ }
+ @Test public void Anch() { // PURPOSE.fix: anchor was being placed before qargs; DATE:2016-10-08
+ fxt.Exec__parse_as_url("/wiki/Category:A?pagefrom=A#mw-pages");
+ fxt.Test__page("Category:A");
+ fxt.Test__to_str("en.wikipedia.org/wiki/Category:A?pagefrom=A#mw-pages"); // was Category:A#mw-page?pagefrom=A
+ }
+ // FUTURE: qargs should be unencoded by default; decoded on request
+ @Test public void Encoded() { // PURPOSE.fix: do not use decoded String; DATE:2016-10-08
+ fxt.Exec__parse_as_url("/wiki/Category:A?pagefrom=A%26B#mw-pages");
+ fxt.Test__page("Category:A");
+ fxt.Test__qargs("?pagefrom=A&B");
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__wiki__tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__wiki__tst.java
new file mode 100644
index 000000000..0aa25b416
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__wiki__tst.java
@@ -0,0 +1,50 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.htmls.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
+import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*;
+public class Xoh_href_parser__wiki__tst {
+ private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt();
+ @Test public void Basic() {
+ fxt.Exec__parse_as_url("/wiki/A").Test__tid(Xoa_url_.Tid_page).Test__to_str("en.wikipedia.org/wiki/A").Test__wiki("en.wikipedia.org").Test__page("A");
+ }
+ @Test public void Page__w_question() {
+ fxt.Exec__parse_as_url("/wiki/%3F").Test__page("?");
+ }
+ @Test public void Qarg() {
+ fxt.Exec__parse_as_url("/wiki/A?action=edit").Test__page("A").Test__qargs("?action=edit").Test__to_str("en.wikipedia.org/wiki/A?action=edit");
+ }
+ @Test public void Qarg__w_question() {
+ fxt.Exec__parse_as_url("/wiki/A%3F?action=edit").Test__page("A?").Test__qargs("?action=edit");
+ }
+ @Test public void Anchor() {
+ fxt.Exec__parse_as_url("/wiki/A#b").Test__to_str("en.wikipedia.org/wiki/A#b").Test__anch("b");
+ }
+ @Test public void Xwiki__only() {
+ fxt.Prep_add_xwiki_to_wiki("c", "commons.wikimedia.org");
+ fxt.Exec__parse_as_url("/wiki/c:").Test__page_is_main_y().Test__page("Main_Page").Test__to_str("commons.wikimedia.org/wiki/Main_Page");
+ }
+ @Test public void Encoded() {
+ fxt.Exec__parse_as_url("/wiki/A%22b%22c").Test__page("A\"b\"c");
+ }
+ @Test public void Triple_slash() { // PURPOSE: handle triple slashes; PAGE:esolangs.org/wiki/Language_list; DATE:2015-11-14
+ fxt.Exec__parse_as_url("/wiki////").Test__to_str("en.wikipedia.org/wiki////").Test__wiki("en.wikipedia.org").Test__page("///");
+ }
+ @Test public void Http() { // PURPOSE: variant of triple slashes; DATE:2015-11-14
+ fxt.Exec__parse_as_url("/wiki/http://a").Test__to_str("en.wikipedia.org/wiki/Http://a").Test__wiki("en.wikipedia.org").Test__page("Http://a");
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java
deleted file mode 100644
index 163944cee..000000000
--- a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.htmls.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
-import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*;
-public class Xoh_href_parser_tst {
- private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt();
- @Test public void Wiki__basic() {
- fxt.Run_parse_by_href("/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_to_str("en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A");
- }
- @Test public void Wiki__page__w_question() {
- fxt.Run_parse_by_href("/wiki/%3F").Chk_page("?");
- }
- @Test public void Wiki__qarg() {
- fxt.Run_parse_by_href("/wiki/A?action=edit").Chk_page("A").Chk_qargs("?action=edit").Chk_to_str("en.wikipedia.org/wiki/A?action=edit");
- }
- @Test public void Wiki__qarg__w_question() {
- fxt.Run_parse_by_href("/wiki/A%3F?action=edit").Chk_page("A?").Chk_qargs("?action=edit");
- }
- @Test public void Wiki__anchor() {
- fxt.Run_parse_by_href("/wiki/A#b").Chk_to_str("en.wikipedia.org/wiki/A#b").Chk_anch("b");
- }
- @Test public void Wiki__xwiki__only() {
- fxt.Prep_add_xwiki_to_wiki("c", "commons.wikimedia.org");
- fxt.Run_parse_by_href("/wiki/c:").Chk_page_is_main_y().Chk_page("Main_Page").Chk_to_str("commons.wikimedia.org/wiki/Main_Page");
- }
- @Test public void Wiki__encoded() {
- fxt.Run_parse_by_href("/wiki/A%22b%22c").Chk_page("A\"b\"c");
- }
- @Test public void Wiki__triple_slash() { // PURPOSE: handle triple slashes; PAGE:esolangs.org/wiki/Language_list; DATE:2015-11-14
- fxt.Run_parse_by_href("/wiki////").Chk_to_str("en.wikipedia.org/wiki////").Chk_wiki("en.wikipedia.org").Chk_page("///");
- }
- @Test public void Wiki__http() { // PURPOSE: variant of triple slashes; DATE:2015-11-14
- fxt.Run_parse_by_href("/wiki/http://a").Chk_to_str("en.wikipedia.org/wiki/Http://a").Chk_wiki("en.wikipedia.org").Chk_page("Http://a");
- }
- @Test public void Site__basic() {
- fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_to_str("en.wikipedia.org/wiki/A").Chk_page("A");
- }
- @Test public void Site__ns_case() {
- fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/file:A").Chk_page("File:A");
- }
- @Test public void Site__main_page() {
- fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/").Chk_page("Main_Page").Chk_page_is_main_y();
- }
- @Test public void Site__anch() {
- fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A#b_c").Chk_page("A").Chk_anch("b_c");
- }
- @Test public void Site__qarg() {
- fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A?action=edit").Chk_page("A").Chk_qargs("?action=edit");
- }
- @Test public void Site__invalid_ttl_shouldnt_fail() { // PURPOSE: invalid title shouldn't fail; EX: A{{B}} is invalid (b/c of braces);
- fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A{{B}}").Chk_page("");
- }
- @Test public void Site__xwiki_cases_correctly() { // PURPOSE: xwiki links should use case_match of xwiki (en.wiktionary.org) not cur_wiki (en.wikipedia.org); EX:w:Alphabet
- Xowe_wiki en_wiktionary_org = fxt.Prep_create_wiki("en.wiktionary.org");
- en_wiktionary_org.Ns_mgr().Ns_main().Case_match_(Xow_ns_case_.Tid__all);
- fxt.Prep_add_xwiki_to_user("en.wiktionary.org", "en.wiktionary.org");
- fxt.Run_parse_by_href("/site/en.wiktionary.org/wiki/alphabet");
- fxt.Chk_to_str("en.wiktionary.org/wiki/alphabet").Chk_page("alphabet");
- }
- @Test public void Site__xwiki_compound() { // PURPOSE: [[[w:wikt:]] not handled; DATE:2013-07-25
- fxt.Prep_add_xwiki_to_wiki("wikt", "en.wiktionary.org");
- fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/wikt:")
- .Chk_tid(Xoa_url_.Tid_page)
- .Chk_page("Main_Page")
- .Chk_to_str("en.wiktionary.org/wiki/Main_Page")
- ;
- }
-// @Test public void Vnt() {
-// Xowe_wiki wiki = fxt.Wiki();
-// fxt.Prep_add_xwiki_to_user("zh.wikipedia.org");
-// wiki.Lang().Vnt_mgr().Enabled_(true);
-// wiki.Lang().Vnt_mgr().Vnt_grp().Add(new gplx.xowa.langs.vnts.Vnt_mnu_itm(Bry_.new_a7("zh-hans"), Bry_.new_a7("zh-hant")));
-// fxt.Run_parse_by_href("/site/zh.wikipedia.org/zh-hant/A").Chk_page("A").Chk_vnt("zh-hant");
-// }
- @Test public void Http__basic() {
- fxt.Run_parse_by_href("http://a.org/b").Chk_tid(Xoa_url_.Tid_inet);
- }
- @Test public void Prot__ftp() { // PURPOSE: check that urls with form of "ftp://" return back Tid_ftp; DATE:2014-04-25
- fxt.Run_parse_by_href("ftp://a.org").Chk_tid(Xoa_url_.Tid_inet);
- }
- @Test public void File__basic() {
- fxt.Run_parse_by_href("file:///C/xowa/file/a.png").Chk_tid(Xoa_url_.Tid_file);
- }
- @Test public void Anchor__basic() {
- fxt.Run_parse_by_href("#a").Chk_tid(Xoa_url_.Tid_anch).Chk_to_str("en.wikipedia.org/wiki/Page 1#a").Chk_anch("a");
- }
- @Test public void Xcmd__basic() {
- fxt.Run_parse_by_href("/xcmd/page_edit").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("page_edit");
- }
- @Test public void Xowa__basic() {
- fxt.Run_parse_by_href("xowa-cmd:a%22b*c").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a\"b*c");
- }
- // COMMENTED: this seems wrong; [//wikisource.org] should go to https://wikisource.org not https://en.wikisource.org; both sites are different; DATE:2015-08-02
-// @Test public void Site__user_wiki() {// PURPOSE: outlier for wikisource.org which is alias to en.wikisource.org; alias added in user_wiki; EX: [//wikisource.org a]; in browser, automatically goes to http://wikisource.org; in xowa, should go to /site/en.wikisource.org
-// fxt.Prep_xwiki(fxt.App().User().Wikii(), "en_wiki_alias", "en.wikipedia.org", null);
-// fxt.Run_parse_by_href("/site/en_wiki_alias/wiki/")
-// .Chk_tid(Xoa_url_.Tid_page)
-// .Chk_page("Main_Page")
-// .Chk_to_str("en.wikipedia.org/wiki/Main_Page")
-// ;
-// }
-}
-class Xoh_href_parser_fxt extends Xow_url_parser_fxt { private final Xoh_href_parser href_parser = new Xoh_href_parser();
- public Xoh_href_parser_fxt Run_parse_by_href(String raw) {
- href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), cur_wiki, Bry__page_1);
- return this;
- }
- private static final byte[] Bry__page_1 = Bry_.new_a7("Page 1");
-}
diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java
index 590bd67a1..65acdd743 100644
--- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java
+++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java
@@ -57,6 +57,7 @@ public class Xow_popup_wrdx_mkr {
case Xop_xnde_tag_.Tid__table: case Xop_xnde_tag_.Tid__tr: case Xop_xnde_tag_.Tid__td: case Xop_xnde_tag_.Tid__th:
case Xop_xnde_tag_.Tid__caption: case Xop_xnde_tag_.Tid__thead: case Xop_xnde_tag_.Tid__tfoot: case Xop_xnde_tag_.Tid__tbody:
case Xop_xnde_tag_.Tid__ref: case Xop_xnde_tag_.Tid__gallery: case Xop_xnde_tag_.Tid__imageMap: case Xop_xnde_tag_.Tid__timeline:
+ case Xop_xnde_tag_.Tid__xowa_wiki_setup:
case Xop_xnde_tag_.Tid__xowa_html: // needed for Help:Options, else \n at top of doc; DATE:2014-06-22
add_tkn = add_subs = false; // skip tblxs
xnde = null;
diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java b/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java
index 2a095f3a3..524674378 100644
--- a/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java
+++ b/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java
@@ -84,6 +84,7 @@ public class Xop_tkn_mkr {
public gplx.xowa.xtns.quiz.Quiz_xnde Xnde__quiz() {return new gplx.xowa.xtns.quiz.Quiz_xnde();}
public gplx.xowa.xtns.indicators.Indicator_xnde Xnde__indicator() {return new gplx.xowa.xtns.indicators.Indicator_xnde();}
public gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd Xnde__xowa_html() {return new gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd();}
+ public gplx.xowa.xtns.xowa_cmds.wiki_setups.Xop_wiki_setup_xnde Xnde__xowa_wiki_setup() {return new gplx.xowa.xtns.xowa_cmds.wiki_setups.Xop_wiki_setup_xnde();}
public gplx.xowa.xtns.listings.Listing_xnde Xnde__listing(int tag_id) {return new gplx.xowa.xtns.listings.Listing_xnde(tag_id);}
public gplx.xowa.xtns.scores.Score_xnde Xnde__score() {return new gplx.xowa.xtns.scores.Score_xnde();}
public gplx.xowa.xtns.inputBox.Xtn_inputbox_nde Xnde__inputbox() {return new gplx.xowa.xtns.inputBox.Xtn_inputbox_nde();}
diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java
index c8fbad6f2..5c5d60890 100644
--- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java
+++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java
@@ -169,11 +169,14 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr {
&& Bry_.Match(src, site_bgn, site_end, xwiki.Domain_bry()) // only consider full domains, not alliases; EX: [http://w/b] should not match alias of w for en.wikipedia.org
) {
Xowe_wiki wiki = ctx.Wiki();
- xo_url_parser_url = wiki.Utl__url_parser().Parse(src, lnke_bgn, lnke_end);
+
+ // HACK: this is not correct; "=" or "&" is not handled by Gfo_url_parser which assumes that all "&" separates qargs; DATE:2016-10-10
+ byte[] decoded_src = gplx.xowa.parsers.amps.Xop_amp_mgr.Instance.Decode_as_bry(Bry_.Mid(src, lnke_bgn, lnke_end));
+ xo_url_parser_url = wiki.Utl__url_parser().Parse(decoded_src, 0, decoded_src.length);
+
byte[] xwiki_wiki = xo_url_parser_url.Wiki_bry();
byte[] xwiki_page = xo_url_parser_url.Page_bry();
- byte[] ttl_bry = xo_url_parser_url.Page_bry();
- Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
+ Xoa_ttl ttl = Xoa_ttl.Parse(wiki, xwiki_page);
if (ttl != null && ttl.Wik_itm() != null) {
xwiki_wiki = ttl.Wik_itm().Domain_bry();
xwiki_page = ttl.Page_url();
diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java
index 879b5c2bc..b87a64ed1 100644
--- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java
+++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java
@@ -18,7 +18,7 @@ along with this program. If not, see .
package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import org.junit.*;
public class Xop_lnke_wkr_xwiki_tst {
- @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt();
+ @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt();
@Test public void Xwiki() {
fxt.App().Usere().Wiki().Xwiki_mgr().Add_by_atrs(Bry_.new_a7("en.wikipedia.org"), Bry_.new_a7("en.wikipedia.org"));
fxt.Test__parse__wtxt_to_html("[http://en.wikipedia.org/wiki/A a]", "a");
@@ -49,7 +49,11 @@ public class Xop_lnke_wkr_xwiki_tst {
}
@Test public void Xwiki__qargs() { // PURPOSE: fix null ref error; PAGE:en.w:Wikipedia:Template_standardisation/demometa DATE:2015-08-02
fxt.Init_xwiki_add_user_("en.wikipedia.org");
- fxt.Test__parse__wtxt_to_html("[http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template_standardisation/demometa]"
- , "[1]");
+ fxt.Test__parse__wtxt_to_html
+ ( "[http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template_standardisation/demometa]"
+ // CHANGED: lnke_now decodes html_entities; DATE:2016-10-10
+ //, "[1]"
+ , "[1]"
+ );
}
}
diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java
index 8c224eac2..6d564b327 100644
--- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java
+++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java
@@ -142,8 +142,9 @@ public class Xop_xnde_tag_ {
, Tid__random_selection = 115
, Tid__tabber = 116
, Tid__tabview = 117
+, Tid__xowa_wiki_setup = 118
;
- public static final int Tid__len = 118;
+ public static final int Tid__len = 119;
public static final Xop_xnde_tag[] Ary = new Xop_xnde_tag[Tid__len];
private static Xop_xnde_tag New(int id, String name) {
Xop_xnde_tag rv = new Xop_xnde_tag(id, name);
@@ -269,5 +270,6 @@ public class Xop_xnde_tag_ {
, Tag__random_selection = New(Tid__random_selection, "choose").Xtn_mw_()
, Tag__tabber = New(Tid__tabber, "tabber").Xtn_mw_()
, Tag__tabview = New(Tid__tabview, "tabview").Xtn_mw_()
+, Tag__xowa_wiki_setup = New(Tid__xowa_wiki_setup, "xowa_Wiki_setup").Xtn_()
;
}
diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java
index 7c0e7761b..0174c774a 100644
--- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java
+++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java
@@ -646,6 +646,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr {
case Xop_xnde_tag_.Tid__quiz: xnde_xtn = tkn_mkr.Xnde__quiz(); break;
case Xop_xnde_tag_.Tid__indicator: xnde_xtn = tkn_mkr.Xnde__indicator(); break;
case Xop_xnde_tag_.Tid__xowa_html: xnde_xtn = tkn_mkr.Xnde__xowa_html(); break;
+ case Xop_xnde_tag_.Tid__xowa_wiki_setup: xnde_xtn = tkn_mkr.Xnde__xowa_wiki_setup(); break;
case Xop_xnde_tag_.Tid__graph: xnde_xtn = tkn_mkr.Xnde__graph(); break;
case Xop_xnde_tag_.Tid__random_selection: xnde_xtn = tkn_mkr.Xnde__random_selection(); break;
case Xop_xnde_tag_.Tid__tabber: xnde_xtn = tkn_mkr.Xnde__tabber(); break;
diff --git a/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java b/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java
index 1c88561ed..947250bfb 100644
--- a/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java
+++ b/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java
@@ -29,7 +29,7 @@ import gplx.xowa.parsers.*;
import gplx.xowa.apps.urls.*;
import gplx.fsdb.*; import gplx.fsdb.meta.*;
import gplx.xowa.specials.mgrs.*;
-import gplx.xowa.addons.wikis.htmls.css.bldrs.*; import gplx.xowa.addons.wikis.htmls.css.mgrs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*;
+import gplx.xowa.addons.wikis.htmls.css.bldrs.*; import gplx.xowa.addons.wikis.htmls.css.mgrs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser, Gfo_invk {
private final Xof_fsdb_mgr__sql fsdb_mgr; private Fsdb_db_mgr db_core_mgr;
private boolean init_needed = true;
@@ -50,6 +50,7 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser, Gfo_invk {
this.xwiki_mgr = new Xow_xwiki_mgr(this);
this.stats = new Xow_site_stats_mgr(this);
this.lnki_bldr = new Xoh_lnki_bldr(app, href_wtr);
+ this.ctg_catpage_mgr = new Xoctg_catpage_mgr(this);
}
public Xoa_app App() {return app;}
public boolean Type_is_edit() {return Bool_.N;}
@@ -73,7 +74,8 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser, Gfo_invk {
public Xow_hdump_mgr Html__hdump_mgr() {return html__hdump_mgr;} private final Xow_hdump_mgr html__hdump_mgr;
public boolean Html__css_installing() {return html__css_installing;} public void Html__css_installing_(boolean v) {html__css_installing = v;} private boolean html__css_installing;
public Xoh_page_wtr_mgr Html__wtr_mgr() {return html__wtr_mgr;} private final Xoh_page_wtr_mgr html__wtr_mgr = new Xoh_page_wtr_mgr(Bool_.Y);
- public Xoctg_pagebox_wtr Html__ctg_pagebox_wtr() {return ctg_pagebox_wtr;} private final Xoctg_pagebox_wtr ctg_pagebox_wtr = new Xoctg_pagebox_wtr();
+ public Xoctg_pagebox_wtr Ctg__pagebox_wtr() {return ctg_pagebox_wtr;} private final Xoctg_pagebox_wtr ctg_pagebox_wtr = new Xoctg_pagebox_wtr();
+ public Xoctg_catpage_mgr Ctg__catpage_mgr() {return ctg_catpage_mgr;} private final Xoctg_catpage_mgr ctg_catpage_mgr;
public Xow_msg_mgr Msg_mgr() {return msg_mgr;} private final Xow_msg_mgr msg_mgr;
public byte[] Wtxt__expand_tmpl(byte[] src) {return src;}
public Xow_mw_parser_mgr Mw_parser_mgr() {return mw_parser_mgr;} private final Xow_mw_parser_mgr mw_parser_mgr = new Xow_mw_parser_mgr();
diff --git a/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java b/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java
index 033d9c3ee..c085aad9a 100644
--- a/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java
@@ -58,7 +58,7 @@ public class Xow_cache_mgr {
ifexist_cache.Clear();
wiki.Appe().Wiki_mgr().Wdata_mgr().Clear(); // moved from ctx.Clear(); DATE:2016-07-21
}
- wiki.Html_mgr().Catpage_mgr().Free_mem_all();
+ wiki.Ctg__catpage_mgr().Free_mem_all();
tmpl_result_cache.Clear();
defn_cache.Free_mem_all();
misc_cache.Clear();
diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java b/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java
index 0cc585b04..4dd290c63 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java
@@ -62,7 +62,7 @@ public class Xow_data_mgr_tst {
;
}
@Test public void Update_zip() {
-// fxt.Wiki().Fsys_mgr().Dir_regy()[Xow_ns_.Tid__main].Ext_tid_(gplx.core.ios.streams.Io_stream_.Tid_zip);
+// fxt.Wiki().Fsys_mgr().Dir_regy()[Xow_ns_.Tid__main].Ext_tid_(gplx.core.ios.streams.Io_stream_tid_.Tid__zip);
// fxt.Wiki().Data_mgr().Zip_mgr_(new Io_zip_mgr_mok());
// fxt .Create("A1", "A1 data")
// .Create("B12", "B12 data")
diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java
index b624795c1..0ec36f816 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java
@@ -52,7 +52,7 @@ public class Xowd_core_db_props {
return cfg_tbl.Select_int_or(Cfg_grp, Cfg_key__schema_version, 1) == 1
? new Xowd_core_db_props
( 1, Xow_db_layout.Itm_lot, Xow_db_layout.Itm_lot, Xow_db_layout.Itm_lot, cfg_tbl.Select_byte_or(Xowe_wiki.Invk_db_mgr, Xodb_mgr_sql.Invk_data_storage_format
- , Io_stream_.Tid_gzip), Io_stream_.Tid_gzip, Bool_.Y, Bool_.N)
+ , Io_stream_tid_.Tid__gzip), Io_stream_tid_.Tid__gzip, Bool_.Y, Bool_.N)
: Cfg_load(cfg_tbl);
}
private static Xowd_core_db_props Cfg_load(Db_cfg_tbl tbl) {
@@ -78,5 +78,5 @@ public class Xowd_core_db_props {
, Cfg_key__hzip_enabled = "hzip_enabled"
, Cfg_key__hzip_mode_is_b256 = "hzip_mode_is_b256"
;
- public static final Xowd_core_db_props Test = new Xowd_core_db_props(2, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Io_stream_.Tid_raw, Io_stream_.Tid_raw, Bool_.Y, Bool_.Y);
+ public static final Xowd_core_db_props Test = new Xowd_core_db_props(2, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Io_stream_tid_.Tid__raw, Io_stream_tid_.Tid__raw, Bool_.Y, Bool_.Y);
}
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java
index 7b02a03db..803212088 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java
@@ -18,9 +18,9 @@ along with this program. If not, see .
package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*;
import gplx.dbs.*;
public interface Select_in_cbk {
+ int Hash_max();
void Write_sql(Bry_bfr bfr, int idx);
void Read_data(Db_rdr rdr);
- int Hash_max();
}
class Select_in_wkr {
private final byte[] sql_bgn;
diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java
index 970977908..f440aa1d1 100644
--- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java
+++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java
@@ -157,6 +157,20 @@ public class Xowd_page_tbl implements Rls_able {
return rdr.Move_next() ? rdr.Read_int(fld_id) : Xowd_page_itm.Id_null;
} finally {rdr.Rls();}
}
+ public void Select_in__id(Select_in_cbk cbk) {
+ int pos = 0;
+ Bry_bfr bfr = Bry_bfr_.New();
+ Select_in_wkr wkr = Select_in_wkr.New(bfr, tbl_name, Flds_select_all(), fld_id);
+ while (true) {
+ pos = wkr.Make_sql_or_null(bfr, cbk, pos);
+ if (pos == -1) break;
+ Db_rdr rdr = conn.Stmt_sql(bfr.To_str_and_clear()).Exec_select__rls_auto();
+ try {
+ while (rdr.Move_next())
+ cbk.Read_data(rdr);
+ } finally {rdr.Rls();}
+ }
+ }
public void Select_in__ttl(Cancelable cancelable, Ordered_hash rv, int ns_id, int bgn, int end) {
Xowd_page_tbl__ttl wkr = new Xowd_page_tbl__ttl();
wkr.Ctor(this, tbl_name, fld_title);
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java
index 10796e196..0125dbd64 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java
@@ -27,7 +27,6 @@ public interface Xodb_load_mgr {
void Load_by_ids (Cancelable cancelable, List_adp rv, int bgn, int end);
boolean Load_by_ttl (Xowd_page_itm rv, Xow_ns ns, byte[] ttl);
void Load_by_ttls (Cancelable cancelable, Ordered_hash rv, boolean fill_idx_fields_only, int bgn, int end);
- boolean Load_ctg_v1 (Xoctg_catpage_ctg rv, byte[] ttl);
void Load_ttls_for_all_pages (Cancelable cancelable, List_adp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item);
void Load_ttls_for_search_suggest(Cancelable cancelable, List_adp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item);
byte[] Find_random_ttl (Xow_ns ns);
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java
index 793c081f4..6cecc0e3f 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java
@@ -58,11 +58,6 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr {
}
public boolean Load_by_id (Xowd_page_itm rv, int id) {return db_mgr.Core_data_mgr().Tbl__page().Select_by_id(rv, id);}
public void Load_by_ids(Cancelable cancelable, List_adp rv, int bgn, int end) {db_mgr.Core_data_mgr().Tbl__page().Select_in__id(cancelable, false, true, rv, bgn, end);}
- public boolean Load_ctg_v1(Xoctg_catpage_ctg rv, byte[] ctg_bry) {
- int cat_page_id = db_mgr.Core_data_mgr().Tbl__page().Select_id(Xow_ns_.Tid__category, ctg_bry); if (cat_page_id == Xowd_page_itm.Id_null) return false;
- Xowd_category_itm ctg = fsys_mgr.Db__cat_core().Tbl__cat_core().Select(cat_page_id); if (ctg == Xowd_category_itm.Null) return false;
- return Ctg_select_v1(db_mgr.Wiki(), db_mgr.Core_data_mgr(), rv, ctg.File_idx(), ctg);
- }
public void Load_ttls_for_all_pages(Cancelable cancelable, List_adp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) {
db_mgr.Core_data_mgr().Tbl__page().Select_for_special_all_pages(cancelable, rslt_list, rslt_nxt, rslt_prv, rslt_count, ns, key, max_results, min_page_len, browse_len, include_redirects, fetch_prv_item);
}
@@ -74,31 +69,4 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr {
public byte[] Find_random_ttl(Xow_ns ns) {return db_mgr.Core_data_mgr().Tbl__page().Select_random(ns);}
public Xodb_page_rdr Get_page_rdr(Xowe_wiki wiki) {return new Xodb_page_rdr__sql(wiki);}
public void Clear() {}
- private static boolean Ctg_select_v1(Xowe_wiki wiki, Xow_db_mgr core_data_mgr, Xoctg_catpage_ctg view_ctg, int link_db_id, Xowd_category_itm ctg) {
- List_adp link_list = List_adp_.New();
- core_data_mgr.Dbs__get_by_id_or_fail(link_db_id).Tbl__cat_link().Select_in(link_list, ctg.Id());
- int link_list_len = link_list.Count();
- link_list.Sort_by(Xowd_page_itm_sorter.IdAsc);
- core_data_mgr.Tbl__page().Select_in__id(Cancelable_.Never, false, true, link_list, 0, link_list_len);
- link_list.Sort_by(Xowd_page_itm_sorter.Ns_id_TtlAsc);
- boolean rv = false;
- for (int i = 0; i < link_list.Count(); i++) {
- Xowd_page_itm page = (Xowd_page_itm)link_list.Get_at(i);
- if (page.Ns_id() == Int_.Min_value) continue; // HACK: page not found; ignore
- byte ctg_tid = Load_ctg_v1_tid(page.Ns_id());
- Xoctg_catpage_grp ctg_grp = view_ctg.Grp_by_tid(ctg_tid);
- Xoctg_catpage_itm ctg_itm = new Xoctg_catpage_itm(page.Id(), Xoa_ttl.Parse(wiki, page.Ns_id(), page.Ttl_page_db()), page.Ttl_page_db());
- ctg_grp.Itms__add(ctg_itm);
- rv = true;
- }
- view_ctg.Make_itms();
- return rv;
- }
- public static byte Load_ctg_v1_tid(int ns_id) {
- switch (ns_id) {
- case Xow_ns_.Tid__category: return Xoa_ctg_mgr.Tid__subc;
- case Xow_ns_.Tid__file: return Xoa_ctg_mgr.Tid__file;
- default: return Xoa_ctg_mgr.Tid__page;
- }
- }
}
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java
index 0d831f59c..5ad1e1394 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java
@@ -38,7 +38,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr {
public void Load_page(Xowd_page_itm rv, Xow_ns ns) {Load_page(rv, rv.Text_db_id(), rv.Tdb_row_idx(), ns, false, tmp_xdat_file, tmp_xdat_itm);}
public void Load_page(Xowd_page_itm rv, int txt_fil_idx, int txt_row_idx, Xow_ns ns, boolean timestamp_enabled, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm) {
Io_url file = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ns.Id(), txt_fil_idx);
- byte[] bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(file); int bry_len = bry.length;
+ byte[] bry = Io_mgr.Instance.LoadFilBry(file); int bry_len = bry.length;
xdat_file.Clear().Parse(bry, bry_len, file).GetAt(xdat_itm, txt_row_idx);
Load_page_parse(rv, bry, bry_len, xdat_itm.Itm_bgn(), xdat_itm.Itm_end(), timestamp_enabled);
}
@@ -236,59 +236,6 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr {
count.Val_(tmp_count);
return rv;
}
- public boolean Load_ctg_v1(Xoctg_catpage_ctg view_ctg, byte[] ctg_ttl) {return Load_ctg_v1_wkr(view_ctg, ctg_ttl, null);}
- private boolean Load_ctg_v1_wkr(Xoctg_catpage_ctg view_ctg, byte[] ctg_ttl, Int_obj_ref count_only) {
- Xowd_regy_mgr ctg_regy = Get_regy_by_site(Xotdb_dir_info_.Tid_category);
- int fil_idx = ctg_regy.Files_find(ctg_ttl);
- if (fil_idx == Xowd_regy_mgr.Regy_null) return false; // NOTE: must check for -1, not 0; else defect in which entries in file 0 are ignored; DATE:2013-04-11
- Io_url fil = fsys_mgr.Url_site_fil(Xotdb_dir_info_.Tid_category, fil_idx);
- Load_xdat_file(Cancelable_.Never, tmp_xdat_file, fil);
- tmp_xdat_file.Find(tmp_xdat_itm, ctg_ttl, 0, Byte_ascii.Pipe, true);
- if (tmp_xdat_itm.Missing()) return false;
- List_adp ctgs = List_adp_.New();
- Load_ctg_v1_parse(ctgs, wiki.Appe().Usr_dlg(), tmp_xdat_itm.Itm_bry());
- ctgs.Sort_by(Xowd_page_itm_sorter.IdAsc);
- this.Load_by_ids(Cancelable_.Never, ctgs, 0, ctgs.Count());
- ctgs.Sort_by(Xowd_page_itm_sorter.Ns_id_TtlAsc);
-
- int ctgs_len = ctgs.Count(); if (ctgs_len == 0) return false;
- if (count_only != null) { // Ctg_count specificed
- count_only.Val_(ctgs_len);
- return true;
- }
- for (int i = 0; i < ctgs_len; i++) {
- Xowd_page_itm itm = (Xowd_page_itm)ctgs.Get_at(i);
- byte itm_tid = Xodb_load_mgr_sql.Load_ctg_v1_tid(itm.Ns_id());
- Xoctg_catpage_itm sub = new Xoctg_catpage_itm(itm.Id(), Xoa_ttl.Parse(wiki, itm.Ns_id(), itm.Ttl_page_db()), itm.Ttl_page_db());
- view_ctg.Grp_by_tid(itm_tid).Itms__add(sub);
- }
- view_ctg.Make_itms();
- return true;
- }
- private static void Load_ctg_v1_parse(List_adp rv, Gfo_usr_dlg usr_dlg, byte[] ary) {
- int aryLen = ary.length;
- int pos = Bry_find_.Find_fwd(ary, Byte_ascii.Pipe, 0, aryLen);
- int rowCount = (aryLen - pos + 1) / (Base85_.Len_int + gplx.xowa.apps.progs.Xoa_prog_mgr.Len_dlm_fld);
- rv.Clear();
- boolean garbage = false;
- for (int i = 0; i < rowCount; i++) {
- Xowd_page_itm row = new Xowd_page_itm();
- rv.Add(row);
- if (garbage) continue;
- int bgn = pos + 1 + (i * (Base85_.Len_int + gplx.xowa.apps.progs.Xoa_prog_mgr.Len_dlm_fld));
- try {
- int id = Base85_.To_int_by_bry(ary, bgn, bgn + Base85_.Len_int - 1);
- if (id < 0) throw Err_.new_wo_type("invalid id", "id", id);
- row.Id_(id);
- }
- catch (Exception e) {
- row.Id_(0);
- usr_dlg.Warn_many("xowa.ttl_request", "parse", "failed to parse row: row=~{0} err=~{1}", String_.new_u8(ary), Err_.Message_lang(e));
- garbage = true;
- continue; // NOTE: must break b/c rest of ids are garbage
- }
- }
- }
public static boolean Load_page_or_false(Xowd_page_itm page, Xob_xdat_itm xdat, int ns_id) {
byte[] src = xdat.Src(); int itm_end = xdat.Itm_end();
int bgn = xdat.Itm_bgn();
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java
index a6b054755..00db5fe77 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java
@@ -45,7 +45,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, Gfo_invk {
core_data_mgr.Tbl__cfg().Insert_byte(grp, key, category_version);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
- if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(core_data_mgr.Props().Zip_tid_text());
+ if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_tid_.Obsolete_to_str(core_data_mgr.Props().Zip_tid_text());
else if (ctx.Match(k, Invk_data_storage_format_)) {} // SERIALIZED:000.sqlite3|xowa_cfg; ignore; read from Xow_db_props
else if (ctx.Match(k, Invk_category_version)) return category_version;
else if (ctx.Match(k, Invk_category_version_)) category_version = m.ReadByte("v");
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java
index 9c5151107..7d932e635 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java
@@ -27,7 +27,7 @@ public class Xodb_mgr_txt implements Xodb_mgr {
} private Xowe_wiki wiki;
public byte Tid() {return Tid_txt;} public static final byte Tid_txt = 0;
public String Tid_name() {return "xdat";}
- public byte Data_storage_format() {return data_storage_format;} public void Data_storage_format_(byte v) {data_storage_format = v;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_.Tid_raw;
+ public byte Data_storage_format() {return data_storage_format;} public void Data_storage_format_(byte v) {data_storage_format = v;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_tid_.Tid__raw;
public Xodb_load_mgr Load_mgr() {return load_mgr;} private Xodb_load_mgr_txt load_mgr;
public Xodb_save_mgr Save_mgr() {return save_mgr;} private Xodb_save_mgr_txt save_mgr;
public DateAdp Dump_date_query() {
@@ -46,8 +46,8 @@ public class Xodb_mgr_txt implements Xodb_mgr {
public byte Search_version() {return gplx.xowa.addons.wikis.searchs.specials.Srch_special_page.Version_2;}
public void Search_version_refresh() {throw Err_.new_unimplemented();}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
- if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(data_storage_format);
- else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_.Obsolete_to_tid(m.ReadStr("v"));
+ if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_tid_.Obsolete_to_str(data_storage_format);
+ else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_tid_.Obsolete_to_tid(m.ReadStr("v"));
else if (ctx.Match(k, Invk_category_version)) return this.Category_version();
else if (ctx.Match(k, Invk_category_version_)) category_version = m.ReadByte("v");
else if (ctx.Match(k, Invk_search_version)) return this.Search_version();
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java
index 111feff30..9c6239c1f 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java
@@ -49,7 +49,7 @@ public class Xodb_page_rdr__tdb implements Xodb_page_rdr {
continue;
}
this.cur_file = cur_file_ary[cur_file_idx];
- byte[] bry = Io_stream_rdr_.Load_all(cur_file);
+ byte[] bry = Io_mgr.Instance.LoadFilBry(cur_file);
cur_xdat_file.Clear().Parse(bry, bry.length, cur_file);
this.cur_xdat_len = cur_xdat_file.Count();
this.cur_xdat_idx = -1;
diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java
index e5c9a7e0d..7218486bc 100644
--- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java
+++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java
@@ -43,7 +43,7 @@ public class Xodb_save_mgr_txt implements Xodb_save_mgr {
int ns_id = ttl.Ns().Id();
Xotdb_page_itm_.Txt_page_save(tmp, page_id, Datetime_now.Get(), ttl_bry, text, true);
Io_url page_rdr_url = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ns_id, fil_idx);
- byte[] page_rdr_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(page_rdr_url);
+ byte[] page_rdr_bry = Io_mgr.Instance.LoadFilBry(page_rdr_url);
Xob_xdat_file page_rdr = new Xob_xdat_file();
if (Bry_.Len_gt_0(page_rdr_bry)) page_rdr.Parse(page_rdr_bry, page_rdr_bry.length, page_rdr_url);
int row_idx = page_rdr.Count();
diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java
index 46fff6ace..1d1d7a555 100644
--- a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java
+++ b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java
@@ -30,24 +30,24 @@ public class Xotdb_dir_info {
ext_bry = Wtr_ext(v);
ext_str = String_.new_a7(ext_bry);
return this;
- } byte ext_tid = gplx.core.ios.streams.Io_stream_.Tid_raw;
+ } byte ext_tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw;
public static final String Wtr_xdat_str = ".xdat", Wtr_zip_str = ".zip", Wtr_gz_str = ".gz", Wtr_bz2_str = ".bz2";
public static final byte[] Wtr_xdat_bry = Bry_.new_a7(Wtr_xdat_str), Wtr_zip_bry = Bry_.new_a7(Wtr_zip_str), Wtr_gz_bry = Bry_.new_a7(Wtr_gz_str), Wtr_bz2_bry = Bry_.new_a7(Wtr_bz2_str);
public static String Wtr_dir(byte v) {
switch (v) {
- case gplx.core.ios.streams.Io_stream_.Tid_raw : return "";
- case gplx.core.ios.streams.Io_stream_.Tid_zip : return "_zip";
- case gplx.core.ios.streams.Io_stream_.Tid_gzip : return "_gz";
- case gplx.core.ios.streams.Io_stream_.Tid_bzip2 : return "_bz2";
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__raw : return "";
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__zip : return "_zip";
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__gzip : return "_gz";
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2 : return "_bz2";
default : throw Err_.new_unhandled(v);
}
}
public static byte[] Wtr_ext(byte v) {
switch (v) {
- case gplx.core.ios.streams.Io_stream_.Tid_raw : return Wtr_xdat_bry;
- case gplx.core.ios.streams.Io_stream_.Tid_zip : return Wtr_zip_bry;
- case gplx.core.ios.streams.Io_stream_.Tid_gzip : return Wtr_gz_bry;
- case gplx.core.ios.streams.Io_stream_.Tid_bzip2 : return Wtr_bz2_bry;
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__raw : return Wtr_xdat_bry;
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__zip : return Wtr_zip_bry;
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__gzip : return Wtr_gz_bry;
+ case gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2 : return Wtr_bz2_bry;
default : throw Err_.new_unhandled(v);
}
}
diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java
index d16dddcf2..def9fb700 100644
--- a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java
@@ -56,14 +56,14 @@ public class Xotdb_fsys_mgr {
private static void Scan_dirs_zip(Xotdb_fsys_mgr fsys_mgr, byte id) {
Io_url[] dirs = Io_mgr.Instance.QueryDir_args(fsys_mgr.Ns_dir().GenSubDir_nest("000")).FilPath_("*page*").DirOnly_().Recur_(false).ExecAsUrlAry();
int len = dirs.length;
- byte tid = gplx.core.ios.streams.Io_stream_.Tid_raw; // needed for Xoa_xowa_exec_tst
+ byte tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw; // needed for Xoa_xowa_exec_tst
for (int i = 0; i < len; i++) {
Io_url dir = dirs[i];
String dir_name = dir.NameOnly();
- if (String_.Eq(dir_name, "page")) {tid = gplx.core.ios.streams.Io_stream_.Tid_raw; break;}
- else if (String_.Eq(dir_name, "page_zip")) tid = gplx.core.ios.streams.Io_stream_.Tid_zip;
- else if (String_.Eq(dir_name, "page_gz")) tid = gplx.core.ios.streams.Io_stream_.Tid_gzip;
- else if (String_.Eq(dir_name, "page_bz2")) tid = gplx.core.ios.streams.Io_stream_.Tid_bzip2;
+ if (String_.Eq(dir_name, "page")) {tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw; break;}
+ else if (String_.Eq(dir_name, "page_zip")) tid = gplx.core.ios.streams.Io_stream_tid_.Tid__zip;
+ else if (String_.Eq(dir_name, "page_gz")) tid = gplx.core.ios.streams.Io_stream_tid_.Tid__gzip;
+ else if (String_.Eq(dir_name, "page_bz2")) tid = gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2;
}
fsys_mgr.Tdb_dir_regy()[id].Ext_tid_(tid);
}
diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java
index 91597409c..7bf1e9923 100644
--- a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java
+++ b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java
@@ -31,7 +31,7 @@ class Xow_fsys_mgr_fxt {
wiki = Xoa_app_fxt.Make__wiki__edit(app);
}
Xoae_app app; Xowe_wiki wiki;
- public Xow_fsys_mgr_fxt Zip_(byte tid, boolean v) {wiki.Tdb_fsys_mgr().Tdb_dir_regy()[tid].Ext_tid_(v ? gplx.core.ios.streams.Io_stream_.Tid_zip : gplx.core.ios.streams.Io_stream_.Tid_raw); return this;}
+ public Xow_fsys_mgr_fxt Zip_(byte tid, boolean v) {wiki.Tdb_fsys_mgr().Tdb_dir_regy()[tid].Ext_tid_(v ? gplx.core.ios.streams.Io_stream_tid_.Tid__zip : gplx.core.ios.streams.Io_stream_tid_.Tid__raw); return this;}
public void Url_ns_fil(byte tid, int ns_id, int fil_idx, String expd) {
Tfds.Eq(expd, wiki.Tdb_fsys_mgr().Url_ns_fil(tid, ns_id, fil_idx).Raw());
}
diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java b/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java
index 746cb2aa1..942f627b2 100644
--- a/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java
@@ -37,7 +37,7 @@ public class Xob_hive_mgr {
}
Xob_xdat_file xdat_load_(Xob_xdat_file xdat, byte dir_tid, Xow_ns ns, int fil_idx) {
Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), fil_idx);
- byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url);
+ byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url);
xdat.Parse(xdat_bry, xdat_bry.length, xdat_url);
return xdat;
}
@@ -115,7 +115,7 @@ public class Xob_hive_mgr {
byte dir_tid = Xotdb_dir_info_.Tid_ttl;
int xdat_idx = Regy__find_file_ns(key, dir_tid, ns.Num_str());
Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), xdat_idx);
- byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url);
+ byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url);
xdat.Parse(xdat_bry, xdat_bry.length, xdat_url);
xdat.Find(xdat_itm, key, Xotdb_page_itm_.Txt_ttl_pos, Byte_ascii.Tab, false);
Find_nearby_add_fwd(list, dir_tid, ns, include_redirects, count, xdat_idx, xdat_itm.Itm_idx());
@@ -132,7 +132,7 @@ public class Xob_hive_mgr {
// while (loop) {
// if (fil_idx == -1) break;
// Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), fil_idx);
-// byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url);
+// byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url);
// xdat.Parse(xdat_bry, xdat_bry.length, xdat_url);
// int row_idx = first && row_bgn != -1 ? row_bgn : xdat.Count() - 1;
// first = false;
@@ -155,7 +155,7 @@ public class Xob_hive_mgr {
while (loop) {
if (fil_idx == regy_len) break;
Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), fil_idx);
- byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url);
+ byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url);
xdat.Parse(xdat_bry, xdat_bry.length, xdat_url);
int row_idx = first ? row_bgn : 0;
int rows_len = xdat.Count();
@@ -186,7 +186,7 @@ public class Xob_hive_mgr {
int Regy__find_file_by_url(byte[] key, Io_url regy_url) {regy.Init(regy_url); return regy.Files_find(key);} private Xowd_regy_mgr regy = new Xowd_regy_mgr();
private void Xdat__create_row(byte dir_tid, byte[] key, byte[] row, int xdat_idx) {
Io_url xdat_url = fsys_mgr.Url_site_fil(dir_tid, xdat_idx);
- byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url);
+ byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url);
Xob_xdat_file xdat_fil = new Xob_xdat_file();
if (xdat_bry.length > 0) // if file is not empty, load it and parse it
xdat_fil.Parse(xdat_bry, xdat_bry.length, xdat_url);
diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java
index 6af0d00d4..3b1575d87 100644
--- a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java
+++ b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java
@@ -103,7 +103,7 @@ public class Xob_xdat_file {
public void Save(Io_url url) {
Bry_bfr bfr = Bry_bfr_.New();
Srl_save_bry(bfr);
- Io_stream_wtr wtr = Io_stream_wtr_.new_by_url_(url);
+ Io_stream_wtr wtr = Io_stream_wtr_.New_by_url(url);
try {
wtr.Open();
wtr.Write(bfr.Bfr(), 0, bfr.Len());
diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java
index c5d8b3358..024837c15 100644
--- a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java
+++ b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java
@@ -18,7 +18,7 @@ along with this program. If not, see .
package gplx.xowa.wikis.tdbs.xdats; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.tdbs.*;
import gplx.core.ios.*; import gplx.core.ios.streams.*; import gplx.core.encoders.*; import gplx.xowa.wikis.tdbs.*;
public class Xob_xdat_file_wtr {
- public static Xob_xdat_file_wtr new_file_(int fil_max, Io_url root_dir) {return new Xob_xdat_file_wtr(fil_max, root_dir, Io_stream_.Tid_raw);}
+ public static Xob_xdat_file_wtr new_file_(int fil_max, Io_url root_dir) {return new Xob_xdat_file_wtr(fil_max, root_dir, Io_stream_tid_.Tid__raw);}
public static Xob_xdat_file_wtr new_by_tid_(int fil_max, Io_url root_dir, byte dir_tid, byte tid) {return new Xob_xdat_file_wtr(fil_max, root_dir.GenSubDir(Xotdb_dir_info_.Tid_name(dir_tid) + Xotdb_dir_info.Wtr_dir(tid)), tid);}
Xob_xdat_file_wtr(int fil_max, Io_url root_dir, byte wtr_tid) {
this.fil_max = fil_max;
@@ -27,7 +27,7 @@ public class Xob_xdat_file_wtr {
bfr = Bry_bfr_.New_w_size(fil_max);
idx = new int[fil_max / 8]; // ASSUME: any given row must at least be 8 bytes long
Url_gen(fil_idx); // set 1st url
- wtr = Io_stream_wtr_.new_by_tid_(wtr_tid);
+ wtr = Io_stream_wtr_.New_by_tid(wtr_tid);
} int fil_max; Io_stream_wtr wtr; byte[] fil_ext;
public int Fil_idx() {return fil_idx;} public Xob_xdat_file_wtr Fil_idx_(int v) {fil_idx = v; return this;} private int fil_idx;
public int Ns_ord_idx() {return ns_ord_idx;} public Xob_xdat_file_wtr Ns_ord_idx_(int v) {ns_ord_idx = v; return this;} private int ns_ord_idx; // NOTE: optional; needed for page cmd which will flush all wtrs, but needs ns_idx for stats
diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java
index b93c39ddc..0d40be419 100644
--- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java
@@ -83,8 +83,8 @@ public class Xow_xwiki_mgr {
default: return tid;
}
}
- public static byte[] Get_domain_from_url(Gfo_url_parser url_parser, Gfo_url url, byte[] url_fmt) { // extract "commons.wikimedia.org" from "http://commons.wikimedia.org/wiki/Category:~{0}"
- url_parser.Parse(url, url_fmt, 0, url_fmt.length);
+ public static byte[] Get_domain_from_url(Gfo_url_parser url_parser, byte[] url_fmt) { // extract "commons.wikimedia.org" from "http://commons.wikimedia.org/wiki/Category:~{0}"
+ Gfo_url url = url_parser.Parse(url_fmt, 0, url_fmt.length);
return url.Segs__get_at_1st();
}
public static byte[] Bld_url_fmt(byte[] domain_bry) {return Bry_.Add(gplx.core.net.Gfo_protocol_itm.Itm_https.Text_bry(), domain_bry, Bry__url_fmt_end);}
diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java
index 89227a931..c916678af 100644
--- a/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java
+++ b/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java
@@ -22,10 +22,10 @@ import gplx.xowa.langs.*;
import gplx.xowa.wikis.domains.*;
public class Xow_xwiki_itm_bldr {
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
- private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url();
+ private final Gfo_url_parser url_parser = new Gfo_url_parser();
public Xow_xwiki_itm Bld_mw(Xow_domain_itm cur_domain, byte[] key, byte[] mw_url, byte[] domain_name) {return Bld_xo(cur_domain, key, Gfs_php_converter.To_gfs(tmp_bfr, mw_url), domain_name);} // EX: "//commons.wikimedia.org/wiki/Category:$1" -> "//commons.wikimedia.org/wiki/Category:~{0}"
public Xow_xwiki_itm Bld_xo(Xow_domain_itm cur_domain, byte[] key, byte[] xo_url, byte[] domain_name) {
- byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, xo_url);
+ byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, xo_url);
Xow_domain_itm domain_itm = Xow_domain_itm_.parse(domain_bry);
Xol_lang_stub lang_itm = Xol_lang_stub_.Get_by_key_or_null(domain_itm.Lang_actl_key());
int lang_id = lang_itm == null ? Xol_lang_stub_.Id__unknown : lang_itm.Id();
diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java b/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java
index b3ccadea5..be011a832 100644
--- a/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java
+++ b/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java
@@ -23,7 +23,7 @@ import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.bldrs.*;
public class Xow_xwiki_itm_parser extends Dsv_wkr_base {
private Xow_domain_itm owner_domain_itm;
private int cur_tid = -1; private byte[] cur_fld1, cur_fld2, cur_fld3;
- private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url();
+ private final Gfo_url_parser url_parser = new Gfo_url_parser();
public Ordered_hash Xwiki_list() {return xwiki_list;} private final Ordered_hash xwiki_list = Ordered_hash_.New();
@Override public Dsv_fld_parser[] Fld_parsers() {return new Dsv_fld_parser[] {Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser};}
@Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) {
@@ -46,7 +46,7 @@ public class Xow_xwiki_itm_parser extends Dsv_wkr_base {
case Tid__manual: // EX: "0|domz|http://www.dmoz.org/~{0}|DMOZ"
xwiki_is_mw = false;
url_fmt = cur_fld2;
- domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, url_fmt);
+ domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url_fmt);
break;
case Tid__mw_domain: // EX: "1|w|en.wikipedia.org"
domain_bry = cur_fld2;
diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java
index 4b7d3a4b4..6b89ae730 100644
--- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java
+++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java
@@ -20,7 +20,7 @@ import gplx.core.primitives.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.wikis.dbs.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; import gplx.xowa.parsers.amps.*;
-import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*;
+import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*;
public class Dpl_xnde implements Xox_xnde {
private Dpl_itm itm = new Dpl_itm(); private List_adp pages = List_adp_.New();
public void Xatr__set(Xowe_wiki wiki, byte[] src, Mwh_atr_itm xatr, Object xatr_id_obj) {} // NOTE: has no attributes
@@ -117,7 +117,7 @@ class Dpl_page_finder {
}
}
private static void Find_pages_in_ctg(Ordered_hash rv, Xowe_wiki wiki, Xodb_load_mgr load_mgr, Xowd_page_itm tmp_page, Int_obj_ref tmp_id, byte[] ctg_ttl) {
- Xoctg_catpage_ctg ctg = wiki.Html_mgr().Catpage_mgr().Get_or_load_or_null(wiki, wiki.Ttl_parse(gplx.xowa.wikis.nss.Xow_ns_.Tid__category, ctg_ttl));
+ Xoctg_catpage_ctg ctg = wiki.Ctg__catpage_mgr().Get_or_load_or_null(Xoctg_catpage_url.New__blank(), wiki.Ttl_parse(gplx.xowa.wikis.nss.Xow_ns_.Tid__category, ctg_ttl), -1);
if (ctg == null) return;
// loop grps to get grp
@@ -158,7 +158,8 @@ class Dpl_page_finder {
int found_len = cur_regy.Count();
for (int j = 0; j < found_len; j++) { // if new_page is in cur, add it
Xoctg_catpage_itm cur_itm = (Xoctg_catpage_itm)cur_regy.Get_at(j);
- if (ns_filter != Dpl_itm.Ns_filter_null && ns_filter != cur_itm.Page_ttl().Ns().Id()) continue;
+ Xoa_ttl cur_ttl = cur_itm.Page_ttl(); if (cur_ttl == null) continue;
+ if (ns_filter != Dpl_itm.Ns_filter_null && ns_filter != cur_ttl.Ns().Id()) continue;
tmp_id.Val_(cur_itm.Page_id()); // set tmp_id, since it will be used at least once
if (exclude_pages.Has(tmp_id)) continue; // ignore excluded pages
if (i != 0) { // skip logic for first ctg (which doesn't have a predecessor)
diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java
index ca0e0085e..87207b6f0 100644
--- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java
@@ -307,9 +307,10 @@ class Dpl_xnde_fxt {
ary[i] = Dpl_page_mok.new_(++next_id, ttls[i]);
Init__create_ctg_pages(ctg, ary);
}
- public void Init__create_ctg_pages(String ctg, Dpl_page_mok... pages) {
- Xoctg_catpage_ctg captage_ctg = new Xoctg_catpage_ctg(Bry_.new_u8(ctg));
+ public void Init__create_ctg_pages(String ctg_ttl, Dpl_page_mok... pages) {
+ Xoctg_catpage_ctg ctg = new Xoctg_catpage_ctg(1, Bry_.new_u8(ctg_ttl));
int pages_len = pages.length;
+ Xoctg_catpage_tmp tmp = new Xoctg_catpage_tmp();
for (int i = 0; i < pages_len; i++) {
Dpl_page_mok page = pages[i];
int id = page.Id();
@@ -320,12 +321,13 @@ class Dpl_xnde_fxt {
fxt.Init_page_create(ttl_str, ttl_str);
fxt.Init_id_create (id, 0, 0, false, 5, Xow_ns_.Tid__main, ttl_str);
}
- Xoctg_catpage_itm captage_itm = new Xoctg_catpage_itm(page.Id(), ttl, ttl.Page_db());
- captage_ctg.Pages().Itms__add(captage_itm);
+ byte tid = gplx.xowa.addons.wikis.ctgs.Xoa_ctg_mgr.Tid__page;
+ Xoctg_catpage_itm catpage_itm = Xoctg_catpage_itm.New_by_ttl(tid, page.Id(), ttl);
+ tmp.Add(catpage_itm);
}
- captage_ctg.Make_itms();
- Xoctg_catpage_mgr catpage_mgr = fxt.Wiki().Html_mgr().Catpage_mgr();
- catpage_mgr.Cache__add(Bry_.new_u8("Category:" + ctg), captage_ctg);
+ tmp.Make_by_ctg(ctg);
+ Xoctg_catpage_mgr catpage_mgr = fxt.Wiki().Ctg__catpage_mgr();
+ catpage_mgr.Cache__add(Bry_.new_u8("Category:" + ctg_ttl), ctg);
}
public String Make__html__itms__null(String... pages) {return this.Make__html(null, pages);}
public String Make__html(String itm_html, String... pages) {
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java
index 915f9e140..b9f3c0116 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java
@@ -49,7 +49,7 @@ public class Pfunc_filepath_tst {
}
@Test public void Wiki_is_commons() {
fxt.Init_page_create(commons_wiki, "File:A.png", "");
- commons_wiki.Tdb_fsys_mgr().Tdb_dir_regy()[Xotdb_dir_info_.Tid_page].Ext_tid_(gplx.core.ios.streams.Io_stream_.Tid_raw);
+ commons_wiki.Tdb_fsys_mgr().Tdb_dir_regy()[Xotdb_dir_info_.Tid_page].Ext_tid_(gplx.core.ios.streams.Io_stream_tid_.Tid__raw);
mock_wkr.Redirect_("A.png", "A.png").Repo_idx_(1);
fxt.Test_parse_tmpl_str_test("{{filepath:A.png}}", "{{test}}", "file:///mem/xowa/file/commons/trg/orig/7/0/1/c/A.png");
}
diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java
index 8c733a89e..547a50d4d 100644
--- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java
+++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java
@@ -292,9 +292,11 @@ public class Scrib_lib_mw implements Scrib_lib {
int fnc_name_len = fnc_name.length;
int fnc_name_colon_pos = Bry_find_.Find_fwd(fnc_name, Byte_ascii.Colon, 0, fnc_name_len);
if (fnc_name_colon_pos == Bry_find_.Not_found) {
- Keyval arg_argx = (Keyval)rv.Get_at(0);
- argx_ref.Val_(arg_argx.Val_to_bry());
- rv.Del_at(0);
+ if (rv.Len() > 0) {
+ Keyval arg_argx = (Keyval)rv.Get_at(0);
+ argx_ref.Val_(arg_argx.Val_to_bry());
+ rv.Del_at(0);
+ }
}
else {
argx_ref.Val_(Bry_.Mid(fnc_name, fnc_name_colon_pos + 1, fnc_name_len));
diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java
index e03616801..f41673dfa 100644
--- a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java
+++ b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java
@@ -44,15 +44,45 @@ class Wdata_prop_val_visitor implements Wbase_claim_visitor {
bfr.Add(label);
}
public void Visit_quantity(Wbase_claim_quantity itm) {
- byte[] amount_bry = itm.Amount();
- long val = Bry_.To_long_or(amount_bry, Byte_ascii.Comma_bry, 0, amount_bry.length, 0); // NOTE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02
+ // get val
+ byte[] val_bry = itm.Amount();
+ long val = Bry_.To_long_or(val_bry, Byte_ascii.Comma_bry, 0, val_bry.length, 0); // NOTE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02
+
+ // get lo, hi
+ long lo = itm.Lbound_as_num().To_long();
+ long hi = itm.Ubound_as_num().To_long();
+
+ // fmt val
Xol_lang_itm lang = app.Lang_mgr().Get_by(lang_key);
- bfr.Add(lang.Num_mgr().Format_num_by_long(val)); // amount; EX: 1,234
- if (itm.Lbound_as_num().To_long() != val && itm.Ubound_as_num().To_long() != val) { // NOTE: do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02
- bfr.Add(Bry__quantity_margin_of_error); // symbol: EX: ±
+ if (lo == val && hi == val) // lo, hi, val are same; print val only;
+ bfr.Add(lang.Num_mgr().Format_num_by_long(val)); // amount; EX: 1,234
+ else {
+ long lo_dif = val - lo;
+ long hi_dif = hi - val;
+ if (lo_dif == hi_dif) { // lo_dif, hi_dif are same; print val±dif
+ bfr.Add(lang.Num_mgr().Format_num_by_long(val)); // amount; EX: 1,234
+ bfr.Add(Bry__quantity_margin_of_error); // symbol: EX: ±
+ bfr.Add(lang.Num_mgr().Format_num_by_long(lo_dif)); // amount; EX: 4
+ }
+ else { // lo_dif, hi_dif are diff; print lo - hi; this may not be what MW does
+ bfr.Add(lang.Num_mgr().Format_num_by_long(lo)); // lo; EX: 1,230
+ bfr.Add_byte(Byte_ascii.Dash); // dash: EX: -
+ bfr.Add(lang.Num_mgr().Format_num_by_long(hi)); // hi; EX: 1,238
+ }
+ }
+
+ // output unit
+ bfr.Add_byte_space();
+ int unit_qid_bgn = Bry_find_.Find_fwd(itm.Unit(), Wikidata_url);
+ if (unit_qid_bgn == Bry_find_.Not_found) // entity missing; just output unit literally
bfr.Add(itm.Unit()); // unit; EX: 1
+ else { // entity exists; EX:"http://www.wikidata.org/entity/Q11573" (meter)
+ byte[] xid = Bry_.Mid(itm.Unit(), Wikidata_url.length);
+ Wdata_doc entity_doc = wdata_mgr.Doc_mgr.Get_by_xid_or_null(xid);
+ bfr.Add(entity_doc.Label_list__get_or_fallback(lang));
}
}
+ private static final byte[] Wikidata_url = Bry_.new_a7("http://www.wikidata.org/entity/");
public void Visit_globecoordinate(Wbase_claim_globecoordinate itm) {
Wdata_prop_val_visitor_.Render__geo(bfr, itm.Lat(), itm.Lng());
}
diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java b/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java
index 8aa151692..f33f0b301 100644
--- a/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java
+++ b/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java
@@ -32,7 +32,7 @@ class Io_stream_rdr_mgr {
Io_url src_itm_url = src_itm.Url();
Io_stream_rdr rv = unzip_mgr.Handles(src_itm_url)
? unzip_mgr.New_rdr(src_itm_url)
- : Io_stream_rdr_.file_(src_itm_url);
+ : Io_stream_rdr_.New__raw(src_itm_url);
rv.Len_(src_itm.Size());
return rv;
}
@@ -67,7 +67,7 @@ class Io_stream_unzip_mgr {
public Io_stream_rdr New_rdr(Io_url url) {
return stdout_enabled
? Io_stream_rdr_process.new_(stdout_process.Exe_url(), url, stdout_process.Xto_process_bldr_args(url.Raw()))
- : Io_stream_rdr_.bzip2_(url)
+ : Io_stream_rdr_.New__bzip2(url)
;
}
}
diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java b/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java
index da88cb666..ee9fb631d 100644
--- a/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java
@@ -53,20 +53,33 @@ public class Wdata_pf_property__basic__tst {
fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_geo(1, "6.789", "1.2345")));
fxt.Test_parse("{{#property:p1}}", "1.2345, 6.789");
}
- @Test public void Quantity() {
+ @Test public void Quantity__plus_minus__y() {
fxt.Init_links_add("enwiki", "Test_page", "q1");
- fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "2", "+1236", "+1232")));
- fxt.Test_parse("{{#property:p1}}", "1,234±2");
+ fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "meter", "+1236", "+1232")));
+ fxt.Test_parse("{{#property:p1}}", "1,234±2 meter");
}
- @Test public void Quantity__no_plus_minus() { // PURPOSE:do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02
+ @Test public void Quantity__plus_minus__n() { // PURPOSE:do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02
fxt.Init_links_add("enwiki", "Test_page", "q1");
- fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "1", "+1234", "+1234")));
- fxt.Test_parse("{{#property:p1}}", "1,234");
+ fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "meter", "+1234", "+1234")));
+ fxt.Test_parse("{{#property:p1}}", "1,234 meter");
+ }
+ @Test public void Quantity__range() { // PURPOSE:do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02
+ fxt.Init_links_add("enwiki", "Test_page", "q1");
+ fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "meter", "+1236", "+1233")));
+ fxt.Test_parse("{{#property:p1}}", "1,233-1,236 meter");
}
@Test public void Quantity__long() { // PURPOSE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02
fxt.Init_links_add("enwiki", "Test_page", "q1");
- fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+4321000000", "1", "4321000000", "4321000000")));
- fxt.Test_parse("{{#property:p1}}", "4,321,000,000");
+ fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+4321000000", "meter", "4321000000", "4321000000")));
+ fxt.Test_parse("{{#property:p1}}", "4,321,000,000 meter");
+ }
+ @Test public void Quantity__unit__entity() {// PURPOSE: get entity name; EX:{{#invoke:Wikidata|getUnits|P2386|FETCH_WIKIDATA}} PAGE:en.w:Arecibo_Observatory; DATE:2016-10-11
+ fxt.Init_links_add("enwiki", "Test_page", "q1");
+ fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "http://www.wikidata.org/entity/q2", "+1236", "+1232")));
+ Wdata_doc wdoc = fxt.doc_("q2", fxt.Make_claim_string(2, "a"));
+ wdoc.Label_list().Add(Bry_.new_a7("en"), new gplx.xowa.xtns.wbases.core.Wdata_langtext_itm(Bry_.new_a7("en"), Bry_.new_a7("meter")));
+ fxt.Init__docs__add(wdoc);
+ fxt.Test_parse("{{#property:p1}}", "1,234±2 meter");
}
@Test public void Monolingualtext() {
fxt.Init_links_add("enwiki", "Test_page", "q1");
diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_mgr.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_mgr.java
new file mode 100644
index 000000000..5136156be
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_mgr.java
@@ -0,0 +1,79 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.xtns.xowa_cmds.wiki_setups; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.xowa_cmds.*;
+import gplx.langs.mustaches.*;
+import gplx.xowa.addons.bldrs.centrals.dbs.*; import gplx.xowa.addons.bldrs.centrals.dbs.datas.*; import gplx.xowa.addons.bldrs.centrals.dbs.datas.imports.*; import gplx.xowa.addons.bldrs.centrals.hosts.*;
+import gplx.xowa.addons.bldrs.exports.packs.files.*;
+import gplx.xowa.parsers.*;
+class Xop_wiki_setup_mgr {
+ private final Mustache_tkn_parser parser = new Mustache_tkn_parser();
+ private Xobc_data_db data_db;
+ public Xop_root_tkn Write(Xoae_app app, Xowe_wiki wiki, Xop_ctx ctx, Xoae_page wpg, byte[] language, byte[][] wiki_domains) {
+ Io_url mustache_url = app.Fsys_mgr().Bin_addon_dir().GenSubFil_nest("bldr", "wiki_setup", "wiki_setup_main.mustache.html");
+ Mustache_tkn_itm root = parser.Parse(Io_mgr.Instance.LoadFilBry(mustache_url));
+ Mustache_render_ctx mctx = new Mustache_render_ctx();
+ Bry_bfr tmp_bfr = Bry_bfr_.New();
+ Mustache_bfr mbfr = new Mustache_bfr(tmp_bfr);
+
+ this.data_db = Xobc_data_db.New(app.Fsys_mgr());
+ root.Render(mbfr, mctx.Init(Make_root(language, wiki_domains)));
+
+ return wiki.Parser_mgr().Main().Parse_text_to_wdom(Xop_ctx.New__sub(wiki, ctx, wpg), mbfr.To_bry_and_clear(), true);
+ }
+ private Xows_root_itm Make_root(byte[] language, byte[][] wiki_domains) {
+ Bry_bfr url_list_bfr = Bry_bfr_.New();
+ int len = wiki_domains.length;
+ Xows_wiki_itm[] wiki_ary = new Xows_wiki_itm[len];
+ for (int i = 0; i < len; ++i) {
+ byte[] wiki_domain = wiki_domains[i];
+ wiki_ary[i] = new Xows_wiki_itm(wiki_domain, Make_task_ary(url_list_bfr, wiki_domain));
+ }
+ return new Xows_root_itm(language, url_list_bfr.To_bry_and_clear(), wiki_ary);
+ }
+ private Xows_task_itm[] Make_task_ary(Bry_bfr url_list_bfr, byte[] wiki_domain) {
+ Xobc_task_regy_itm[] task_rows = data_db.Tbl__task_regy().Select_by_wiki(wiki_domain);
+ int len = task_rows.length;
+ Xows_task_itm[] rv = new Xows_task_itm[len];
+ for (int i = 0; i < len; ++i) {
+ Xobc_task_regy_itm task_row = task_rows[i];
+ String[] task_key_parts = Pack_file_mgr.Task_key__parse(String_.new_u8(task_row.Key()));
+ String task_key_type = task_key_parts[2];
+ if (String_.Eq(task_key_type, "html")) task_key_type = "Articles";
+ else if (String_.Eq(task_key_type, "file")) task_key_type = "Images";
+
+ Xows_file_itm[] files = Make_file_ary(url_list_bfr, wiki_domain, task_row.Id());
+ rv[i] = new Xows_task_itm(task_row.Seqn(), wiki_domain, task_row.Name(), Bry_.new_u8(task_key_type), Bry_.Replace(Bry_.new_u8(task_key_parts[1]), Byte_ascii.Dot, Byte_ascii.Dash), files);
+ }
+ Array_.Sort(rv, new Xows_task_itm_sorter());
+ return rv;
+ }
+ private Xows_file_itm[] Make_file_ary(Bry_bfr url_list_bfr, byte[] wiki_domain, int task_id) {
+ Xobc_import_step_itm[] rows = data_db.Tbl__import_step().Select_by_task_id(task_id);
+ int len = rows.length;
+ Xows_file_itm[] rv = new Xows_file_itm[len];
+ Host_eval_itm host_eval = new Host_eval_itm();
+ for (int i = 0; i < len; ++i) {
+ Xobc_import_step_itm row = rows[i];
+ String src_fil = host_eval.Eval_src_fil(data_db, row.Host_id, gplx.xowa.wikis.domains.Xow_domain_itm_.parse(wiki_domain), row.Import_name);
+ url_list_bfr.Add_str_u8(src_fil).Add_byte_nl();
+ rv[i] = new Xows_file_itm(row.Step_id, Bry_.new_u8(src_fil));
+ }
+ Array_.Sort(rv, new Xows_file_itm_sorter());
+ return rv;
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_xnde.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_xnde.java
new file mode 100644
index 000000000..8f96f918c
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_xnde.java
@@ -0,0 +1,52 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.xtns.xowa_cmds.wiki_setups; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.xowa_cmds.*;
+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.htmls.*;
+public class Xop_wiki_setup_xnde implements Xox_xnde, Mwh_atr_itm_owner2 {
+ private byte[] language;
+ private byte[][] wikis_ary;
+ private Xop_root_tkn root;
+ public void Xatr__set(Xowe_wiki wiki, byte[] src, Mwh_atr_itm xatr, byte xatr_id) {
+ switch (xatr_id) {
+ case Xatr__language: language = xatr.Val_as_bry(); break;
+ case Xatr__wikis: wikis_ary = Bry_split_.Split(xatr.Val_as_bry(), Byte_ascii.Pipe_bry); break;
+ default: Gfo_usr_dlg_.Instance.Warn_many("", "", "unhandled xnde atr; key=~{0}", xatr.Key_bry()); break;
+ }
+ }
+ public void Xtn_parse(Xowe_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) {
+ if (!wiki.Sys_cfg().Xowa_cmd_enabled()) { // not allowed; warn and exit
+ wiki.Appe().Usr_dlg().Warn_many("", "", "xowa_wiki_setup only allowed in xowa_home");
+ return;
+ }
+
+ Xox_xnde_.Parse_xatrs(wiki, this, xatr_hash, src, xnde);
+ this.root = new Xop_wiki_setup_mgr().Write(wiki.Appe(), wiki, ctx, ctx.Page(), language, wikis_ary);
+ }
+ public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xoae_page wpg, Xop_xnde_tkn xnde, byte[] src) {
+ html_wtr.Write_tkn_to_html(bfr, ctx, hctx, root.Root_src(), xnde, Xoh_html_wtr.Sub_idx_null, root);
+//
+ }
+
+ public Xop_root_tkn Xtn_root() {throw Err_.new_unimplemented_w_msg("xowa_wiki_setup.xtn_root should not be called");}
+ public byte[] Xtn_html() {throw Err_.new_unimplemented_w_msg("xowa_wiki_setup.xtn_html should not be called");}
+
+ private static final byte Xatr__language = 1, Xatr__wikis = 2;
+ private static final Hash_adp_bry xatr_hash = Hash_adp_bry.ci_a7().Add_str_byte("language", Xatr__language).Add_str_byte("wikis", Xatr__wikis);
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xows_root_itm.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xows_root_itm.java
new file mode 100644
index 000000000..5583fa72c
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xows_root_itm.java
@@ -0,0 +1,108 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.xtns.xowa_cmds.wiki_setups; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.xowa_cmds.*;
+import gplx.langs.mustaches.*;
+class Xows_root_itm implements Mustache_doc_itm {
+ private final byte[] language, url_list;
+ private final Xows_wiki_itm[] wiki_ary;
+ public Xows_root_itm(byte[] language, byte[] url_list, Xows_wiki_itm[] wiki_ary) {
+ this.language = language;
+ this.url_list = url_list;
+ this.wiki_ary = wiki_ary;
+ }
+ public boolean Mustache__write(String key, Mustache_bfr bfr) {
+ if (String_.Eq(key, "language")) bfr.Add_bry(language);
+ else if (String_.Eq(key, "url_list")) bfr.Add_bry(url_list);
+ else if (String_.Eq(key, "wikis__1st")) bfr.Add_bry(wiki_ary[0].Wiki_domain());
+ else return false;
+ return false;
+ }
+ public Mustache_doc_itm[] Mustache__subs(String key) {
+ if (String_.Eq(key, "wikis")) return wiki_ary;
+ return Mustache_doc_itm_.Ary__empty;
+ }
+}
+class Xows_wiki_itm implements Mustache_doc_itm {
+ private final Xows_task_itm[] task_ary;
+ public Xows_wiki_itm(byte[] wiki_domain, Xows_task_itm[] task_ary) {
+ this.wiki_domain = wiki_domain;
+ this.task_ary = task_ary;
+ }
+ public byte[] Wiki_domain() {return wiki_domain;} private final byte[] wiki_domain;
+ public boolean Mustache__write(String key, Mustache_bfr bfr) {
+ if (String_.Eq(key, "wiki_domain")) bfr.Add_bry(wiki_domain);
+ else return false;
+ return true;
+ }
+ public Mustache_doc_itm[] Mustache__subs(String key) {
+ if (String_.Eq(key, "tasks")) return task_ary;
+ return Mustache_doc_itm_.Ary__empty;
+ }
+}
+class Xows_task_itm implements Mustache_doc_itm {
+ private final byte[] wiki_domain, task_full_name, task_name, task_date;
+ private final Xows_file_itm[] file_ary;
+ public Xows_task_itm(int seqn_id, byte[] wiki_domain, byte[] task_full_name, byte[] task_name, byte[] task_date, Xows_file_itm[] file_ary) {
+ this.seqn_id = seqn_id;
+ this.wiki_domain = wiki_domain; this.task_full_name = task_full_name; this.task_name = task_name; this.task_date = task_date;
+ this.file_ary = file_ary;
+ }
+ public int Seqn_id() {return seqn_id;} private final int seqn_id;
+ public boolean Mustache__write(String key, Mustache_bfr bfr) {
+ if (String_.Eq(key, "wiki_domain")) bfr.Add_bry(wiki_domain);
+ else if (String_.Eq(key, "task_name")) bfr.Add_bry(task_name);
+ else if (String_.Eq(key, "task_full_name")) bfr.Add_bry(task_full_name);
+ else if (String_.Eq(key, "task_date")) bfr.Add_bry(task_date);
+ else return false;
+ return true;
+ }
+ public Mustache_doc_itm[] Mustache__subs(String key) {
+ if (String_.Eq(key, "files")) return file_ary;
+ return Mustache_doc_itm_.Ary__empty;
+ }
+}
+class Xows_file_itm implements Mustache_doc_itm {
+ private final byte[] file_href;
+ public Xows_file_itm(int step_id, byte[] file_href) {
+ this.step_id = step_id;
+ this.file_href = file_href;
+ }
+ public int Step_id() {return step_id;} private final int step_id;
+ public boolean Mustache__write(String key, Mustache_bfr bfr) {
+ if (String_.Eq(key, "file_href")) bfr.Add_bry(file_href);
+ else return false;
+ return true;
+ }
+ public Mustache_doc_itm[] Mustache__subs(String key) {
+ return Mustache_doc_itm_.Ary__empty;
+ }
+}
+class Xows_task_itm_sorter implements gplx.core.lists.ComparerAble {
+ public int compare(Object lhsObj, Object rhsObj) {
+ Xows_task_itm lhs = (Xows_task_itm)lhsObj;
+ Xows_task_itm rhs = (Xows_task_itm)rhsObj;
+ return Int_.Compare(lhs.Seqn_id(), rhs.Seqn_id());
+ }
+}
+class Xows_file_itm_sorter implements gplx.core.lists.ComparerAble {
+ public int compare(Object lhsObj, Object rhsObj) {
+ Xows_file_itm lhs = (Xows_file_itm)lhsObj;
+ Xows_file_itm rhs = (Xows_file_itm)rhsObj;
+ return Int_.Compare(lhs.Step_id(), rhs.Step_id());
+ }
+}