1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00
This commit is contained in:
gnosygnu
2014-09-07 22:38:50 -04:00
parent be63adc5af
commit a022d7f26c
293 changed files with 2546 additions and 1942 deletions

View File

@@ -32,7 +32,7 @@ public class Fsdb_cfg_mgr {
this.Update_next_id();
}
public void Rls() {cfg_tbl.Rls();}
private void Update_next_id() {cfg_tbl.Update("core", "next_id", Int_.XtoStr(next_id));}
private void Update_next_id() {cfg_tbl.Update("core", "next_id", Int_.Xto_str(next_id));}
public Fsdb_cfg_mgr Update(String grp, String key, String new_val) {
String cur_val = cfg_tbl.Select_as_str_or(grp, key, null);
if (cur_val == null)

View File

@@ -75,19 +75,19 @@ public class Fsdb_db_abc_mgr implements RlsAble {
atr_mgr.Rls();
bin_mgr.Rls();
cfg_mgr.Rls();
boot_provider.Rls();
boot_provider.Conn_term();
}
private void Init_load(Io_url dir, Io_url boot_url) {
Db_connect connect = Db_connect_sqlite.load_(boot_url);
boot_provider = Db_provider_.new_(connect);
Db_conn_info connect = Db_conn_info__sqlite.load_(boot_url);
boot_provider = Db_provider_.new_and_open_(connect);
atr_mgr = Fsdb_db_atr_mgr.load_(this, boot_provider, dir);
bin_mgr = Fsdb_db_bin_mgr.load_(boot_provider, dir);
cfg_mgr = Fsdb_cfg_mgr.load_(this, boot_provider);
if (!cfg_mgr.Patch_next_id()) Fsdb_db_abc_mgr_.Patch_next_id(this, dir);
}
private void Init_make(Io_url dir, Io_url boot_url) {
Db_connect connect = Db_connect_sqlite.make_(boot_url);
boot_provider = Db_provider_.new_(connect);
Db_conn_info connect = Db_conn_info__sqlite.make_(boot_url);
boot_provider = Db_provider_.new_and_open_(connect);
Sqlite_engine_.Pragma_page_size_4096(boot_provider);
atr_mgr = Fsdb_db_atr_mgr.make_(this, boot_provider, dir);
bin_mgr = Fsdb_db_bin_mgr.make_(boot_provider, dir);

View File

@@ -22,8 +22,8 @@ public class Fsdb_db_atr_fil implements RlsAble {
private Fsdb_dir_tbl tbl_dir; private Fsdb_fil_tbl tbl_fil; private Fsdb_xtn_thm_tbl tbl_thm;
public Fsdb_db_atr_fil(Fsdb_db_abc_mgr abc_mgr, Io_url url, boolean create) {
this.abc_mgr = abc_mgr;
Db_connect connect = create ? Db_connect_sqlite.make_(url) : Db_connect_sqlite.load_(url);
provider = Db_provider_.new_(connect);
Db_conn_info connect = create ? Db_conn_info__sqlite.make_(url) : Db_conn_info__sqlite.load_(url);
provider = Db_provider_.new_and_open_(connect);
Sqlite_engine_.Pragma_page_size_4096(provider);
tbl_dir = new Fsdb_dir_tbl(provider, create);
tbl_fil = new Fsdb_fil_tbl(provider, create);
@@ -40,7 +40,7 @@ public class Fsdb_db_atr_fil implements RlsAble {
tbl_fil.Rls();
tbl_thm.Rls();
provider.Txn_mgr().Txn_end_all();
provider.Rls();
provider.Conn_term();
}
public void Txn_open() {
provider.Txn_mgr().Txn_bgn_if_none();

View File

@@ -69,7 +69,7 @@ public class Fsdb_db_atr_mgr implements RlsAble {
return rv;
}
private static Io_url url_(Io_url dir, int id) {
return dir.GenSubFil_ary("fsdb.atr.", Int_.XtoStr_PadBgn(id, 2), ".sqlite3");
return dir.GenSubFil_ary("fsdb.atr.", Int_.Xto_str_pad_bgn(id, 2), ".sqlite3");
}
public static final int Id_0 = 0;
public static final String Path_bgn_0 = "";

View File

@@ -34,16 +34,16 @@ public class Fsdb_db_bin_fil implements RlsAble {
public Db_provider Provider() {
if (provider == null) {
if (cmd_mode == Db_cmd_mode.Create) {
provider = Db_provider_.new_(Db_connect_sqlite.make_(url));
provider = Db_provider_.new_and_open_(Db_conn_info__sqlite.make_(url));
Sqlite_engine_.Pragma_page_size_4096(provider);
Fsdb_bin_tbl.Create_table(provider);
}
else
provider = Db_provider_.new_(Db_connect_sqlite.load_(url));
provider = Db_provider_.new_and_open_(Db_conn_info__sqlite.load_(url));
}
return provider;
} private Db_provider provider;
public void Rls() {if (provider != null) provider.Rls();}
public void Rls() {if (provider != null) provider.Conn_term();}
public long Insert(int bin_id, byte owner_tid, long bin_len, gplx.ios.Io_stream_rdr bin_rdr) {
Db_stmt stmt = Db_stmt_.Null;
try {

View File

@@ -81,7 +81,7 @@ public class Fsdb_db_bin_mgr implements RlsAble {
Fsdb_db_bin_fil cur = Get_cur();
if (cur != null) {
cur.Provider().Txn_mgr().Txn_end_all();
cur.Provider().Rls();
cur.Provider().Conn_term();
}
int new_itms_len = itms_len + 1;
Fsdb_db_bin_fil[] new_itms = new Fsdb_db_bin_fil[new_itms_len];
@@ -94,6 +94,6 @@ public class Fsdb_db_bin_mgr implements RlsAble {
this.Txn_open();
}
private static Io_url url_(Io_url dir, int id) {
return dir.GenSubFil_ary("fsdb.bin.", Int_.XtoStr_PadBgn(id, 4), ".sqlite3");
return dir.GenSubFil_ary("fsdb.bin.", Int_.Xto_str_pad_bgn(id, 4), ".sqlite3");
}
}

View File

@@ -44,7 +44,7 @@ public class Fsdb_mnt_mgr implements GfoInvkAble {
Fsdb_mnt_tbl.Create_table(provider);
Fsdb_mnt_tbl.Insert(provider, Mnt_idx_main, "fsdb.main", "fsdb.main");
Fsdb_mnt_tbl.Insert(provider, Mnt_idx_user, "fsdb.user", "fsdb.user");
tbl_cfg.Insert("core", "mnt.insert_idx", Int_.XtoStr(Mnt_idx_user));
tbl_cfg.Insert("core", "mnt.insert_idx", Int_.Xto_str(Mnt_idx_user));
}
return Fsdb_mnt_tbl.Select_all(provider);
}

View File

@@ -24,8 +24,9 @@ public class String_surrogate_utl {
int char_count = 0, codepoint_count = 0;
byte_pos = byte_bgn;
while (true) {
if (stop_idx == (stop_idx_is_char ? char_count : codepoint_count)) return codepoint_count - char_count;
if (byte_pos >= src_len) throw Err_.new_("codepoint_idx is not in string; stop_idx={0} stop_idx_is_char={1} byte_bgn={2} string={3}", stop_idx, stop_idx_is_char, byte_bgn, String_.new_utf8_(src));
if ( stop_idx == (stop_idx_is_char ? char_count : codepoint_count) // requested # of chars found
|| byte_pos >= src_len // eos reached; DATE:2014-09-02
) return codepoint_count - char_count;
int char_len_in_bytes = gplx.intl.Utf8_.Len_of_char_by_1st_byte(src[byte_pos]);
++char_count; // char_count always incremented by 1
codepoint_count += (char_len_in_bytes == 4) ? 2 : 1; // codepoint_count incremented by 2 if surrogate pair; else 1

View File

@@ -28,6 +28,7 @@ public class String_surrogate_utl_tst {
fxt.Test_count_surrogates__char_idx (test_str, 7, 2, 0, 10); // bî
fxt.Test_count_surrogates__char_idx (test_str, 7, 3, 1, 14); // bî𡼾
fxt.Test_count_surrogates__char_idx (test_str, 0, 6, 2, 14); // aé𡼾bî𡼾
fxt.Test_count_surrogates__char_idx (test_str, 14, 7, 0, 14); // PURPOSE: test out of bounds; DATE:2014-09-02
}
@Test public void Codepoint_idx() {
String test_str = "aé𡼾bî𡼾";

View File

@@ -27,5 +27,5 @@ public class Json_itm_tmp implements Json_itm {
public boolean Data_eq(byte[] comp) {return false;}
public void Clear() {}
public static Json_itm new_str_(String v) {return new Json_itm_tmp(Json_itm_.Tid_string, "\"" + v + "\"");}
public static Json_itm new_int_(int v) {return new Json_itm_tmp(Json_itm_.Tid_int, Int_.XtoStr(v));}
public static Json_itm new_int_(int v) {return new Json_itm_tmp(Json_itm_.Tid_int, Int_.Xto_str(v));}
}

View File

@@ -28,7 +28,7 @@ public class Json_kv_ary_srl {
}
private static Object Val_by_itm(Json_itm itm) {
switch (itm.Tid()) {
case Json_itm_.Tid_bool: return Bool_.XtoStr_lower(Bool_.cast_(itm.Data()));
case Json_itm_.Tid_bool: return Bool_.Xto_str_lower(Bool_.cast_(itm.Data()));
case Json_itm_.Tid_int:
case Json_itm_.Tid_null:
case Json_itm_.Tid_string:
@@ -44,7 +44,7 @@ public class Json_kv_ary_srl {
KeyVal[] rv = new KeyVal[subs_len];
for (int i = 0; i < subs_len; i++) {
Json_itm sub = itm.Subs_get_at(i);
KeyVal kv = KeyVal_.new_(Int_.XtoStr(i + Int_.Base1), Val_by_itm(sub));
KeyVal kv = KeyVal_.new_(Int_.Xto_str(i + Int_.Base1), Val_by_itm(sub));
rv[i] = kv;
}
return rv;

View File

@@ -45,6 +45,6 @@ class Json_kv_ary_srl_fxt {
public KeyVal kv_obj_(String key, Object val) {return KeyVal_.new_(key, val);}
public KeyVal kv_str_(String key, String val) {return KeyVal_.new_(key, val);}
public KeyVal kv_int_(String key, int val) {return KeyVal_.new_(key, val);}
public KeyVal kv_bool_(String key, boolean val) {return KeyVal_.new_(key, Bool_.XtoStr_lower(val));}
public KeyVal kv_dec_(String key, DecimalAdp val) {return KeyVal_.new_(key, val.XtoStr());}
public KeyVal kv_bool_(String key, boolean val) {return KeyVal_.new_(key, Bool_.Xto_str_lower(val));}
public KeyVal kv_dec_(String key, DecimalAdp val) {return KeyVal_.new_(key, val.Xto_str());}
}

View File

@@ -161,7 +161,7 @@ public class Json_parser {
}
Err err_(byte[] src, int bgn, String fmt, Object... args) {return err_(src, bgn, src.length, fmt, args);}
Err err_(byte[] src, int bgn, int src_len, String fmt, Object... args) {
String msg = String_.Format(fmt, args) + " " + Int_.XtoStr(bgn) + " " + String_.new_utf8_len_safe_(src, bgn, 20);
String msg = String_.Format(fmt, args) + " " + Int_.Xto_str(bgn) + " " + String_.new_utf8_len_safe_(src, bgn, 20);
return Err_.new_(msg);
}
}

View File

@@ -190,7 +190,7 @@ public class Php_srl_parser {
}
Err err_(byte[] raw, int bgn, String fmt, Object... args) {return err_(raw, bgn, raw.length, fmt, args);}
Err err_(byte[] raw, int bgn, int raw_len, String fmt, Object... args) {
String msg = String_.Format(fmt, args) + " " + Int_.XtoStr(bgn) + " " + String_.new_utf8_len_safe_(raw, bgn, 20);
String msg = String_.Format(fmt, args) + " " + Int_.Xto_str(bgn) + " " + String_.new_utf8_len_safe_(raw, bgn, 20);
return Err_.new_(msg);
}
}

View File

@@ -23,7 +23,7 @@ public interface Php_tkn {
}
class Php_tkn_ {
public static final byte Tid_txt = 1, Tid_declaration = 2, Tid_ws = 3, Tid_comment = 4, Tid_var = 5, Tid_eq = 6, Tid_eq_kv = 7, Tid_semic = 8, Tid_comma = 9, Tid_paren_bgn = 10, Tid_paren_end = 11, Tid_null = 12, Tid_false = 13, Tid_true = 14, Tid_ary = 15, Tid_num = 16, Tid_quote = 17, Tid_brack_bgn = 18, Tid_brack_end = 19;
public static String Xto_str(byte tid) {return Byte_.XtoStr(tid);}
public static String Xto_str(byte tid) {return Byte_.Xto_str(tid);}
}
abstract class Php_tkn_base implements Php_tkn {
public abstract byte Tkn_tid();

View File

@@ -34,7 +34,7 @@ class Mok_int_itm implements XtoStrAble {
private String fld_0;
private int fld_1, fld_2;
public Mok_int_itm(String fld_0, int fld_1, int fld_2) {this.fld_0 = fld_0; this.fld_1 = fld_1; this.fld_2 = fld_2;}
public String XtoStr() {return String_.Concat_with_str("|", fld_0, Int_.XtoStr(fld_1), Int_.XtoStr(fld_2));}
public String XtoStr() {return String_.Concat_with_str("|", fld_0, Int_.Xto_str(fld_1), Int_.Xto_str(fld_2));}
}
class Mok_int_mgr extends Mok_mgr_base {
public void Clear() {itms.Clear();}

View File

@@ -83,15 +83,16 @@ public class Xoa_app implements GfoInvkAble {
}
public byte Stage() {return stage;} public Xoa_app Stage_(byte v) {stage = v; return this;} private byte stage = Xoa_stage_.Tid_ctor;
public boolean Term_cbk() {
usr_dlg.Log_many("", "", "term:bgn");
if (setup_mgr.Cmd_mgr().Working()) {
if (!gui_mgr.Kit().Ask_yes_no("", "", "An import is in progress. Are you sure you want to exit?")) return false;
}
gui_mgr.Browser_win().Usr_dlg().Canceled_y_();
user.App_term();
log_wtr.Term();
log_mgr.Rls();
if (Scrib_core.Core() != null) Scrib_core.Core().Term();
wiki_mgr.Rls();
gui_mgr.Browser_win().Usr_dlg().Canceled_y_();
user.App_term(); usr_dlg.Log_many("", "", "term:app_term");
log_wtr.Term(); usr_dlg.Log_many("", "", "term:log_wtr");
log_mgr.Rls(); usr_dlg.Log_many("", "", "term:log_mgr");
if (Scrib_core.Core() != null) {Scrib_core.Core().Term(); usr_dlg.Log_many("", "", "term:scrib");}
wiki_mgr.Rls(); usr_dlg.Log_many("", "", "term:wiki_mgr");
return true;
}
public Xoa_wiki_mgr Wiki_mgr() {return wiki_mgr;} private Xoa_wiki_mgr wiki_mgr;

View File

@@ -23,7 +23,7 @@ public class Xoa_app_ {
boot_mgr.Run(args);
}
public static final String Name = "xowa";
public static final String Version = "1.9.1.1";
public static final String Version = "1.9.2.1";
public static String Build_date = "2012-12-30 00:00:00";
public static String Op_sys;
public static String User_agent = "";

View File

@@ -36,9 +36,9 @@ public class Xoapi_font implements GfoInvkAble {
app.Html_mgr().Page_mgr().Font_enabled_(enabled);
app.Html_mgr().Page_mgr().Font_size_(html_font_size);
app.Cfg_mgr().Set_by_app("app.html.page.font_enabled", "y");
app.Cfg_mgr().Set_by_app("app.html.page.font_size", Float_.XtoStr(app.Html_mgr().Page_mgr().Font_size()));
app.Cfg_mgr().Set_by_app("app.html.page.font_size", Float_.Xto_str(app.Html_mgr().Page_mgr().Font_size()));
app.Gui_mgr().Win_cfg().Font().Size_(gui_font_size);
app.Cfg_mgr().Set_by_app("app.gui.win_opts.font.size", Float_.XtoStr(gui_font_size));
app.Cfg_mgr().Set_by_app("app.gui.win_opts.font.size", Float_.Xto_str(gui_font_size));
app.Cfg_mgr().Db_save_txt();
app.Gui_mgr().Browser_win().Page__reload(); // NOTE: force reload; needed if viewing Help:Options/HTML, else Font size won't update
}

View File

@@ -34,4 +34,9 @@ public class Xoa_ttl__anchor_tst {
@Test public void Anchor_and_slash() { // PURPOSE: slash in anchor was being treated as a subpage; DATE:2014-01-14
fxt.Init_ttl("A#b/c").Expd_full_txt("A").Expd_anch_txt("b/c").Expd_leaf_txt("A").Test(); // NOTE: Leaf_txt should be Page_txt; used to fail
}
@Test public void Decode_ncr() { // PURPOSE: convert &#x23; to #; PAGE:en.s:The_English_Constitution_(1894) DATE:2014-09-07
fxt.Init_ttl("A&#x23;b").Expd_full_txt("A").Expd_page_txt("A").Expd_anch_txt("b").Test();
fxt.Init_ttl("A&#35;b").Expd_full_txt("A").Expd_page_txt("A").Expd_anch_txt("b").Test();
fxt.Init_ttl("A&#36;b").Expd_full_txt("A$b").Expd_page_txt("A$b").Expd_anch_txt("").Test();
}
}

View File

@@ -21,6 +21,7 @@ public class Xoa_ttl__html_entity_tst {
@Before public void init() {fxt.Reset();} private Xoa_ttl_fxt fxt = new Xoa_ttl_fxt();
@Test public void Eacute() {fxt.Init_ttl("&eacute;").Expd_page_txt("é").Test();} //É
@Test public void Amp_at_end() {fxt.Init_ttl("Bisc &").Expd_page_txt("Bisc &").Test();}
@Test public void Ltr_a() {fxt.Init_ttl("A&#98;").Expd_page_txt("Ab").Test();}
@Test public void Ncr_dec() {fxt.Init_ttl("A&#98;").Expd_page_txt("Ab").Test();}
@Test public void Ncr_hex() {fxt.Init_ttl("A&#x62;").Expd_page_txt("Ab").Test();}
@Test public void Nbsp() {fxt.Init_ttl("A&nbsp;b").Expd_page_txt("A b").Test();} // NOTE: &nbsp must convert to space; EX:w:United States [[Image:Dust Bowl&nbsp;- Dallas, South Dakota 1936.jpg|220px|alt=]]
}

View File

@@ -38,7 +38,7 @@ public class Xob_fxt {
public Io_url fil_site_ctg(int idx) {return wiki.Fsys_mgr().Url_site_fil(Xow_dir_info_.Tid_category, idx);}
public Io_url fil_site_id(int idx) {return wiki.Fsys_mgr().Url_site_fil(Xow_dir_info_.Tid_id, idx);}
public Io_url fil_reg(byte tid) {return wiki.Fsys_mgr().Url_site_reg(tid);}
public Io_url fil_reg(int ns_id, byte tid) {return wiki.Fsys_mgr().Url_ns_reg(Int_.XtoStr_PadBgn(ns_id, 3), tid);}
public Io_url fil_reg(int ns_id, byte tid) {return wiki.Fsys_mgr().Url_ns_reg(Int_.Xto_str_pad_bgn(ns_id, 3), tid);}
public Xob_fxt Fil_expd(Io_url url, String... expd) {
String text = String_.Concat_lines_nl_skip_last(expd); // skipLast b/c if trailing line wanted, easier to pass in extra argument for ""
expd_list.Add(new Io_fil_chkr(url, text));

View File

@@ -138,7 +138,7 @@ public class Xob_wiki_cfg_bldr_tst {
if (!String_.Eq(ns_nde.Name(), "ns")) continue;
int id = Int_.parse_(ns_nde.Atrs().FetchValOr("id", "-1"));
String name = String_.Replace(String_.Replace(ns_nde.Text_inner(), " ", "_"), "'", "''");
sb.Add(Int_.XtoStr(id)).Add("|").Add(String_.Trim(name)).Add_char_nl();
sb.Add(Int_.Xto_str(id)).Add("|").Add(String_.Trim(name)).Add_char_nl();
}
sb.Add("\");');\n");
}

View File

@@ -77,6 +77,6 @@ class Xob_diff_regy_sql_runner {
throw Err_.unhandled(fsdb_db_tid);
}
public static String Build_url(String wiki_domain, int fsdb_db_id, String fsdb_db_type) {
return String_.Format("{0}-{1}-{2}.sql", wiki_domain, Int_.XtoStr_PadBgn(fsdb_db_id, 3), fsdb_db_type);
return String_.Format("{0}-{1}-{2}.sql", wiki_domain, Int_.Xto_str_pad_bgn(fsdb_db_id, 3), fsdb_db_type);
}
}

View File

@@ -67,12 +67,12 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm
private void Make_delete_sql_file(Bry_bfr atr_bfr, Bry_bfr bin_bfr, Io_url sql_tmp_dir, int cur_db_id, int cur_count) {
Make_delete_sql_file(atr_bfr, sql_tmp_dir, cur_db_id, cur_count, Fsdb_db_tid_.Tid_atr);
Make_delete_sql_file(bin_bfr, sql_tmp_dir, cur_db_id, cur_count, Fsdb_db_tid_.Tid_bin);
app.Usr_dlg().Note_many("", "", "file.diff:sql generated: db_id=~{0} count=~{1}", Int_.XtoStr_PadBgn_space(cur_db_id, 3), Int_.XtoStr_PadBgn_space(cur_count, 7));
app.Usr_dlg().Note_many("", "", "file.diff:sql generated: db_id=~{0} count=~{1}", Int_.Xto_str_pad_bgn_space(cur_db_id, 3), Int_.Xto_str_pad_bgn_space(cur_count, 7));
}
private void Make_delete_sql_file(Bry_bfr bfr, Io_url sql_dir, int db_id, int cur_count, byte db_tid) {
if (db_id != -1 && cur_count > 0) { // do not write 1st bfr
bfr.Add_str("COMMIT;\n");
String sql_url_name = String_.Format("{0}-{1}-{2}.sql", wiki.Domain_str(), Int_.XtoStr_PadBgn(db_id, 3), Fsdb_db_tid_.Xto_key(db_tid));
String sql_url_name = String_.Format("{0}-{1}-{2}.sql", wiki.Domain_str(), Int_.Xto_str_pad_bgn(db_id, 3), Fsdb_db_tid_.Xto_key(db_tid));
Io_url sql_url = sql_dir.GenSubFil(sql_url_name);
Io_mgr._.SaveFilBfr(sql_url, bfr);
}
@@ -81,12 +81,12 @@ public class Xob_diff_regy_make_cmd extends Xob_itm_basic_base implements Xob_cm
}
private void Make_delete_sql_item(Bry_bfr atr_bfr, Bry_bfr bin_bfr, byte diff_is_orig, int diff_db_id, int diff_fil_id, int diff_thm_id) {
if (diff_is_orig == Byte_.Zero) {
atr_bfr.Add_str("DELETE FROM fsdb_xtn_thm WHERE thm_id = " + Int_.XtoStr(diff_thm_id) + ";\n");
bin_bfr.Add_str("DELETE FROM fsdb_bin WHERE bin_owner_id = " + Int_.XtoStr(diff_thm_id) + ";\n");
atr_bfr.Add_str("DELETE FROM fsdb_xtn_thm WHERE thm_id = " + Int_.Xto_str(diff_thm_id) + ";\n");
bin_bfr.Add_str("DELETE FROM fsdb_bin WHERE bin_owner_id = " + Int_.Xto_str(diff_thm_id) + ";\n");
}
else {
atr_bfr.Add_str("UPDATE fsdb_fil SET fil_bin_db_id = -1 WHERE fil_id = " + Int_.XtoStr(diff_fil_id) + ";\n");
bin_bfr.Add_str("DELETE FROM fsdb_bin WHERE bin_owner_id = " + Int_.XtoStr(diff_fil_id) + ";\n");
atr_bfr.Add_str("UPDATE fsdb_fil SET fil_bin_db_id = -1 WHERE fil_id = " + Int_.Xto_str(diff_fil_id) + ";\n");
bin_bfr.Add_str("DELETE FROM fsdb_bin WHERE bin_owner_id = " + Int_.Xto_str(diff_fil_id) + ";\n");
}
}
}

View File

@@ -63,13 +63,13 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd {
page_id_bmk = Int_.MaxValue;
lnki_id_bmk = Int_.MaxValue;
}
usr_dlg.Note_many("", "", "done: ~{0} ~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).XtoStr("#,###.000"));
usr_dlg.Note_many("", "", "done: ~{0} ~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).Xto_str("#,###.000"));
this.Txn_save();
tbl_cfg.Delete(Cfg_fsdb_make, Cfg_page_id_bmk); tbl_cfg.Delete(Cfg_fsdb_make, Cfg_lnki_id_bmk); // delete bmks if future reruns are needed; DATE:2014-08-20
trg_fsdb_mgr.Txn_save();
trg_fsdb_mgr.Rls(); // save changes and rls all connections
db_select_stmt.Rls();
provider.Rls();
provider.Conn_term();
}
public void Cmd_print() {}
private int db_reset_tries_count = 0, db_reset_tries_max = 5;
@@ -130,8 +130,8 @@ public class Xob_fsdb_make extends Xob_itm_basic_base implements Xob_cmd {
private boolean Init_bmk(Xodb_xowa_cfg_tbl tbl_cfg) {
String page_id_str = tbl_cfg.Select_val(Cfg_fsdb_make, Cfg_page_id_bmk);
if (page_id_str == null) { // bmks not found; new db; insert;
tbl_cfg.Insert_str(Cfg_fsdb_make, Cfg_page_id_bmk , Int_.XtoStr(page_id_bmk));
tbl_cfg.Insert_str(Cfg_fsdb_make, Cfg_lnki_id_bmk , Int_.XtoStr(lnki_id_bmk));
tbl_cfg.Insert_str(Cfg_fsdb_make, Cfg_page_id_bmk , Int_.Xto_str(page_id_bmk));
tbl_cfg.Insert_str(Cfg_fsdb_make, Cfg_lnki_id_bmk , Int_.Xto_str(lnki_id_bmk));
if (page_id_bmk == -1)
page_id_bmk = 0;
if (lnki_id_bmk == -1)

View File

@@ -155,7 +155,7 @@ class Xob_lnki_temp_wkr_ {
for (int i = 0; i < aliases_len; i++) {
String alias = aliases[i];
int id = i < ids_len ? rv[i] : -1;
wiki.App().Usr_dlg().Note_many("", "", "ns: ~{0} <- ~{1}", Int_.XtoStr_fmt(id, "0000"), alias);
wiki.App().Usr_dlg().Note_many("", "", "ns: ~{0} <- ~{1}", Int_.Xto_str_fmt(id, "0000"), alias);
}
if (aliases_len != ids_len) throw Err_.new_fmt_("mismatch in aliases and ids: {0} vs {1}", aliases_len, ids_len);
return rv;

View File

@@ -55,7 +55,7 @@ public class Xob_orig_qry_cmd extends Xob_itm_basic_base implements Xob_cmd {
String sql = String_.Concat_lines_nl_skip_last
( "SELECT lnki_ttl"
, "FROM orig_regy"
, "WHERE lnki_repo >= '" + Byte_.XtoStr(prv_repo_id) + "'"
, "WHERE lnki_repo >= '" + Byte_.Xto_str(prv_repo_id) + "'"
, "AND lnki_ttl > '" + prv_ttl + "'"
, "AND oimg_orig_page_id = -1;"
);

View File

@@ -22,11 +22,12 @@ class Xob_orig_regy_tbl {
public static void Create_data(Gfo_usr_dlg usr_dlg, Db_provider p, Xodb_db_file file_registry_db, boolean repo_0_is_remote, Xow_wiki repo_0_wiki, Xow_wiki repo_1_wiki, boolean wiki_ns_for_file_is_case_match_all) {
usr_dlg.Prog_many("", "", "inserting lnki_regy");
p.Exec_sql(Sql_create_data);
Sqlite_engine_.Idx_create(usr_dlg, p, "orig_regy", Idx_ttl);
Sqlite_engine_.Idx_create(usr_dlg, p, "orig_regy", Idx_ttl_local);
Sqlite_engine_.Db_attach(p, "page_db", file_registry_db.Url().Raw());
Io_url repo_0_dir = repo_0_wiki.Fsys_mgr().Root_dir(), repo_1_dir = repo_1_wiki.Fsys_mgr().Root_dir();
byte repo_0_tid = Xof_repo_itm.Repo_local, repo_1_tid = Xof_repo_itm.Repo_remote;
boolean local_is_remote = Bry_.Eq(repo_0_wiki.Domain_bry(), repo_1_wiki.Domain_bry());
Xow_wiki local_wiki = repo_0_wiki;
if ( repo_0_is_remote // .gfs manually marked specifes repo_0 as remote
|| ( Bry_.Eq(repo_0_wiki.Domain_bry(), Xow_wiki_.Domain_commons_bry) // repo_0 = commons; force repo_0 to be remote; else all orig_repo will be 1; DATE:2014-02-01
&& local_is_remote // repo_0 = repo_1
@@ -34,29 +35,34 @@ class Xob_orig_regy_tbl {
) {
repo_0_tid = Xof_repo_itm.Repo_remote;
repo_1_tid = Xof_repo_itm.Repo_local;
local_wiki = repo_1_wiki;
}
Create_data_for_repo(usr_dlg, p, Byte_.int_(repo_0_tid), repo_0_dir.GenSubFil(Xodb_db_file.Name__wiki_image));
Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.int_(repo_0_tid), repo_0_dir.GenSubFil(Xodb_db_file.Name__wiki_image));
if (!local_is_remote) { // only run for repo_1 if local != remote; only affects commons
Create_data_for_repo(usr_dlg, p, Byte_.int_(repo_1_tid), repo_1_dir.GenSubFil(Xodb_db_file.Name__wiki_image));
Create_data_for_repo(usr_dlg, p, local_wiki, Byte_.int_(repo_1_tid), repo_1_dir.GenSubFil(Xodb_db_file.Name__wiki_image));
if (wiki_ns_for_file_is_case_match_all) {
Io_url repo_remote_dir = repo_0_is_remote ? repo_0_dir : repo_1_dir;
Create_data_for_cs(usr_dlg, p, repo_remote_dir);
Create_data_for_cs(usr_dlg, p, local_wiki, repo_remote_dir);
}
}
Sqlite_engine_.Db_detach(p, "page_db");
Sqlite_engine_.Idx_create(usr_dlg, p, "orig_regy", Idx_xfer_temp);
}
private static void Create_data_for_repo(Gfo_usr_dlg usr_dlg, Db_provider cur, byte wiki_tid, Io_url join) {
private static void Create_data_for_repo(Gfo_usr_dlg usr_dlg, Db_provider cur, Xow_wiki local_wiki, byte repo_tid, Io_url join) {
usr_dlg.Note_many("", "", "inserting page for xowa.wiki.image: ~{0}", join.OwnerDir().NameOnly());
boolean wiki_has_cs_file = repo_tid == Xof_repo_itm.Repo_remote && local_wiki.Ns_mgr().Ns_file().Case_match() == Xow_ns_case_.Id_all;
String lnki_ttl_fld = wiki_has_cs_file ? "Coalesce(o.lnki_commons_ttl, o.lnki_ttl)" : "o.lnki_ttl"; // NOTE: use lnki_commons_ttl if [[File]] is cs PAGE:en.d:water EX:[[image:wikiquote-logo.png|50px|none|alt=]]; DATE:2014-09-05
if (wiki_has_cs_file)
Sqlite_engine_.Idx_create(usr_dlg, cur, "orig_regy", Idx_ttl_remote);
Sqlite_engine_.Db_attach(cur, "image_db", join.Raw());
cur.Exec_sql(String_.Format(Sql_update_repo_page, wiki_tid));
cur.Exec_sql(String_.Format(Sql_update_repo_redirect, wiki_tid));
cur.Exec_sql(String_.Format(Sql_update_repo_page, repo_tid, lnki_ttl_fld));
cur.Exec_sql(String_.Format(Sql_update_repo_redirect, repo_tid, lnki_ttl_fld));
Sqlite_engine_.Db_detach(cur, "image_db");
}
private static void Create_data_for_cs(Gfo_usr_dlg usr_dlg, Db_provider p, Io_url repo_remote_dir) {
private static void Create_data_for_cs(Gfo_usr_dlg usr_dlg, Db_provider p, Xow_wiki local_wiki, Io_url repo_remote_dir) {
p.Exec_sql(Xob_orig_regy_tbl.Sql_cs_mark_dupes); // orig_regy: find dupes; see note in SQL
p.Exec_sql(Xob_orig_regy_tbl.Sql_cs_update_ttls); // orig_regy: update lnki_ttl with lnki_commons_ttl
Create_data_for_repo(usr_dlg, p, Xof_repo_itm.Repo_remote, repo_remote_dir.GenSubFil(Xodb_db_file.Name__wiki_image));
Create_data_for_repo(usr_dlg, p, local_wiki, Xof_repo_itm.Repo_remote, repo_remote_dir.GenSubFil(Xodb_db_file.Name__wiki_image));
p.Exec_sql(Xob_lnki_regy_tbl.Sql_cs_mark_changed); // lnki_regy: update lnki_commons_flag
p.Exec_sql(Xob_lnki_regy_tbl.Sql_cs_update_ttls); // lnki_regy: update cs
}
@@ -68,8 +74,9 @@ class Xob_orig_regy_tbl {
, Fld_orig_media_type = "orig_media_type", Fld_orig_minor_mime = "orig_minor_mime", Fld_orig_file_ext = "orig_file_ext", Fld_orig_timestamp = "orig_timestamp"
;
private static final Db_idx_itm
Idx_ttl = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__ttl ON orig_regy (lnki_ttl);")
, Idx_xfer_temp = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__xfer_temp ON orig_regy (lnki_ttl, orig_file_ttl, orig_timestamp);")
Idx_ttl_local = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__ttl_local ON orig_regy (lnki_ttl);")
, Idx_ttl_remote = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__ttl_remote ON orig_regy (lnki_commons_ttl, lnki_ttl);")
, Idx_xfer_temp = Db_idx_itm.sql_("CREATE INDEX IF NOT EXISTS orig_regy__xfer_temp ON orig_regy (lnki_ttl, orig_file_ttl, orig_timestamp);")
;
private static final String
Tbl_sql = String_.Concat_lines_nl
@@ -134,9 +141,9 @@ class Xob_orig_regy_tbl {
, ", i.img_minor_mime"
, ", i.img_timestamp"
, "FROM orig_regy o"
, " JOIN image_db.image i ON o.lnki_ttl = i.img_name"
, " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 0 AND o.lnki_ttl = m.src_ttl"
, "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20
, " JOIN image_db.image i ON {1} = i.img_name"
, " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 0 AND {1} = m.src_ttl"
, "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20
// , "WHERE i.img_timestamp > o.orig_timestamp" // NOTE: this handles an image in local and remote by taking later version; DATE:2014-07-22
, "ORDER BY 1" // must order by lnki_id since it is PRIMARY KEY, else sqlite will spend hours shuffling rows in table
, ";"
@@ -164,9 +171,9 @@ class Xob_orig_regy_tbl {
, ", i.img_minor_mime"
, ", i.img_timestamp"
, "FROM orig_regy o"
, " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 1 AND o.lnki_ttl = m.src_ttl"
, " JOIN page_db.page_regy m ON m.repo_id = {0} AND m.itm_tid = 1 AND {1} = m.src_ttl"
, " JOIN image_db.image i ON m.trg_ttl = i.img_name"
, "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20
, "WHERE o.orig_file_ttl IS NULL" // NOTE: only insert if file doesn't exist; changed from timestamp b/c old images may exist in both wikis; EX:ar.n:File:Facebook.png; DATE:2014-08-20
// , "WHERE i.img_timestamp > o.orig_timestamp" // NOTE: this handles an image in local and remote by taking later version; DATE:2014-07-22
, "ORDER BY 1" // must order by lnki_id since it is PRIMARY KEY, else sqlite will spend hours shuffling rows in table
, ";"

View File

@@ -41,7 +41,7 @@ public class Xob_search_sql_cmd extends Xob_itm_basic_base implements Xob_cmd {
Db_provider search_provider = search_db.Provider();
usr_dlg.Log_many("", "", "search_title.cmd: droping tables");
Sqlite_engine_.Tbl_delete_many(search_provider, Xodb_tbl_search_title_temp.Tbl_name, Xodb_search_title_word_tbl.Tbl_name, Xodb_search_title_page_tbl.Tbl_name);
usr_dlg.Log_many("", "", "search_title.cmd: creating db connection; conn=~{0}", search_provider.ConnectInfo().Raw_of_db_connect());
usr_dlg.Log_many("", "", "search_title.cmd: creating db connection; conn=~{0}", search_provider.Conn_info().Str_raw());
Xodb_tbl_search_title_temp search_temp_tbl = new Xodb_tbl_search_title_temp().Create_table(search_provider);
try {
usr_dlg.Log_many("", "", "search_title.cmd: starting select;");

View File

@@ -45,7 +45,7 @@ public class Xobc_core_calc_stats extends Xob_itm_basic_base implements Xob_cmd
Xow_ns ns = wiki.Ns_mgr().Ords_ary()[i];
if (ns.Id() < 0) continue;
bfr.Add_byte_nl();
Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_articles_in_ns_, ns.Num_str(), Int_.XtoStr_PadBgn(ns.Count(), 10));
Gen_call(Bool_.N, bfr, Xow_wiki_stats.Invk_number_of_articles_in_ns_, ns.Num_str(), Int_.Xto_str_pad_bgn(ns.Count(), 10));
}
bfr.Add_byte_nl().Add_byte(Byte_ascii.Semic).Add_byte_nl();
Io_url wiki_gfs = Wiki_gfs_url(wiki);

View File

@@ -34,7 +34,7 @@ public abstract class Xoctg_hiddencat_parser_base extends Xob_sql_dump_base impl
case Fld_val:
if (!cur_is_hiddencat) {data.Cancel_row_y_(); return;}
Exec_hook(file_bfr, cur_id, cur_is_hiddencat);
if (++rows % 100000 == 0) usr_dlg.Prog_many("", "", "reading row ~{0}", Int_.XtoStr_fmt(rows, "#,##0"));
if (++rows % 100000 == 0) usr_dlg.Prog_many("", "", "reading row ~{0}", Int_.Xto_str_fmt(rows, "#,##0"));
break;
}
}

View File

@@ -56,7 +56,7 @@ public class Xoctg_hiddencat_parser_sql_tst {
for (int i = 0; i < len; i++) {
int ctg_id = ctgs[i];
Xodb_category_itm ctg_itm = tbl.Select(provider, ctg_id);
Tfds.Eq(expd_hidden, ctg_itm.Hidden(), Int_.XtoStr(ctg_id));
Tfds.Eq(expd_hidden, ctg_itm.Hidden(), Int_.Xto_str(ctg_id));
}
}
}

View File

@@ -71,11 +71,11 @@ public class Xob_bmk_mgr implements GfoInvkAble {
}
public void Save() {
if (repo_enable && repo_dirty) {
Save(Cfg_repo_prv, Byte_.XtoStr(repo_prv));
Save(Cfg_repo_prv, Byte_.Xto_str(repo_prv));
repo_dirty = false;
}
if (ns_enable && ns_dirty) {
Save(Cfg_ns_prv, Int_.XtoStr(ns_prv));
Save(Cfg_ns_prv, Int_.Xto_str(ns_prv));
ns_dirty = false;
}
if (ttl_enable && ttl_dirty) {

View File

@@ -39,7 +39,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
ctx = wiki.Ctx();
root = ctx.Tkn_mkr().Root(Bry_.Empty);
wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql
wiki.Db_mgr_as_sql().Init_load(Db_connect_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable provider which is closed)
wiki.Db_mgr_as_sql().Init_load(Db_conn_info_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable provider which is closed)
db_fsys_mgr = wiki.Db_mgr_as_sql().Fsys_mgr();
db_ary = Xob_dump_src_ttl.Init_text_files_ary(db_fsys_mgr);
poll_interval = poll_mgr.Poll_interval();
@@ -171,7 +171,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
Exec_commit(-1, -1, -1, Bry_.Empty);
Exec_end_hook();
Free();
usr_dlg.Note_many("", "", "done: ~{0} ~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).XtoStr("#,###.000"));
usr_dlg.Note_many("", "", "done: ~{0} ~{1}", exec_count, DecimalAdp_.divide_safe_(exec_count, Env_.TickCount_elapsed_in_sec(time_bgn)).Xto_str("#,###.000"));
}
private void Free() {
ctx.App().Free_mem(true);
@@ -278,13 +278,13 @@ class Xob_rate_mgr {
int dif = (int)(end - bgn) / 1000;
DecimalAdp rate = DecimalAdp_.divide_safe_(count, dif);
save_bfr
.Add_str(rate.XtoStr("#,##0.000")).Add_byte_pipe()
.Add_str(rate.Xto_str("#,##0.000")).Add_byte_pipe()
.Add_int_variable(count).Add_byte_pipe()
.Add_int_variable(dif).Add_byte_nl()
;
Io_mgr._.AppendFilByt(log_file, save_bfr.XtoAryAndClear());
}
public String Rate_as_str() {return Int_.XtoStr(Rate());}
public String Rate_as_str() {return Int_.Xto_str(Rate());}
public int Rate() {
int elapsed = Env_.TickCount_elapsed_in_sec(time_bgn);
return Math_.Div_safe_as_int(item_len, elapsed);

View File

@@ -66,9 +66,9 @@ public class Xob_xfer_update_cmd extends Xob_itm_basic_base implements Xob_cmd {
, ", cur.lnki_count"
, ", CASE"
, " WHEN old.lnki_ttl IS NULL THEN" // not in old table; mark todo
, " " + Byte_.XtoStr(Xob_xfer_regy_tbl.Status_todo)
, " " + Byte_.Xto_str(Xob_xfer_regy_tbl.Status_todo)
, " ELSE" // in old table; mark processed
, " " + Byte_.XtoStr(Xob_xfer_regy_tbl.Status_ignore_processed)
, " " + Byte_.Xto_str(Xob_xfer_regy_tbl.Status_ignore_processed)
, " END"
, ", cur.xfer_bin_tid"
, ", cur.xfer_bin_msg"

View File

@@ -135,7 +135,7 @@ class Xob_subpage_tst_fxt {
int ns_len = wiki.Ns_list().Count();
for (int i = 0; i < ns_len; i++) {
Xob_subpage_ns ns = (Xob_subpage_ns)wiki.Ns_list().FetchAt(i);
sb.Add(ns.Id()).Add("=").Add(Bool_.XtoStr_lower(ns.Enabled())).Add_char_nl();
sb.Add(ns.Id()).Add("=").Add(Bool_.Xto_str_lower(ns.Enabled())).Add_char_nl();
}
sb.Add_char_nl();
}

View File

@@ -26,9 +26,9 @@ public class Xodb_file {
public long File_len() {return file_len;} public Xodb_file File_len_add(int v) {file_len += v; return this;} private long file_len;
public long File_max() {return file_max;} public Xodb_file File_max_(long v) {file_max = v; return this;} private long file_max;
public byte Cmd_mode() {return cmd_mode;} public Xodb_file Cmd_mode_(byte v) {cmd_mode = v; return this;} private byte cmd_mode;
public Db_connect Connect() {return connect;} public Xodb_file Connect_(Db_connect v) {connect = v; return this;} private Db_connect connect;
public Db_conn_info Connect() {return connect;} public Xodb_file Connect_(Db_conn_info v) {connect = v; return this;} private Db_conn_info connect;
public Db_provider Provider() {
if (provider == null) provider = Db_provider_pool._.FetchOrNew(connect);
if (provider == null) provider = Db_provider_pool._.Get_or_new(connect);
return provider;
} private Db_provider provider;
public void Provider_(Db_provider p) {provider = p;}
@@ -36,7 +36,7 @@ public class Xodb_file {
if (provider == null) return;
try {
provider.Txn_mgr().Txn_end_all(); // close any open transactions
provider.Rls();
provider.Conn_term();
} finally {provider = null;}
}
public static Xodb_file load_(int id, byte tid, String url) {return new Xodb_file(id, tid).Url_rel_(url).Cmd_mode_(Db_cmd_mode.Ignore);}

View File

@@ -33,7 +33,7 @@ public class Xodb_fsys_mgr {
for (int i = 0; i < files_ary_len; i++) {
Xodb_file file = files_ary[i];
Io_url url = trg_dir.GenSubFil(file.Url_rel()); // relative name only
file.Connect_(Db_connect_.sqlite_(url)).Url_(url);
file.Connect_(Db_conn_info_.sqlite_(url)).Url_(url);
switch (file.Tid()) {
case Xodb_file_tid.Tid_core : file.Provider_(p); Set_file_core(file); break;
case Xodb_file_tid.Tid_category : if (category_provider_core_null) {Provider_ctg_(file); category_provider_core_null = false;} break;
@@ -80,13 +80,13 @@ public class Xodb_fsys_mgr {
for (int i = 0; i < files_ary_len; i++) {
Xodb_file file = files_ary[i];
if (Byte_.In(file.Tid(), tids))
Sqlite_engine_.Idx_create(usr_dlg, file.Provider(), Int_.XtoStr(file.Id()), idxs);
Sqlite_engine_.Idx_create(usr_dlg, file.Provider(), Int_.Xto_str(file.Id()), idxs);
}
}
public Xodb_file Make(byte file_tid) {
int file_idx = files_ary_len;
Io_url url = Create_sqlite3(src_dir, trg_dir, wiki_name, file_idx);
Xodb_file rv = Xodb_file.make_(file_idx, file_tid, url.NameAndExt()).Connect_(Db_connect_.sqlite_(url));
Xodb_file rv = Xodb_file.make_(file_idx, file_tid, url.NameAndExt()).Connect_(Db_conn_info_.sqlite_(url));
Xodb_xowa_cfg_tbl.Insert_str(rv.Provider(), "db.meta", "type_name", Xodb_file_tid.Xto_key(file_tid));
files_ary = (Xodb_file[])Array_.Resize(files_ary, files_ary_len + 1);
files_ary[files_ary_len++] = rv;
@@ -98,7 +98,7 @@ public class Xodb_fsys_mgr {
}
private static Io_url Create_sqlite3(Io_url src_dir, Io_url trg_dir, String wiki_name, int file_idx) {
Io_url src_fil = src_dir.GenSubFil("xowa.sqlite3"); // /bin/any/sql/xowa/xowa.sqlite3
Io_url trg_fil = trg_dir.GenSubFil_ary(wiki_name, ".", Int_.XtoStr_PadBgn(file_idx, 3), ".sqlite3"); // /wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3
Io_url trg_fil = trg_dir.GenSubFil_ary(wiki_name, ".", Int_.Xto_str_pad_bgn(file_idx, 3), ".sqlite3"); // /wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3
Io_mgr._.CopyFil(src_fil, trg_fil, true);
return trg_fil;
}

View File

@@ -181,7 +181,7 @@ class Xoctg_mok_ctg {
int ns_id = Xow_ns_.Id_main;
byte ctg_tid = Xoa_ctg_mgr.Tid_page;
for (int i = bgn; i < end; i++) {
byte[] ttl = Bry_.Add(ttl_prefix, Bry_.new_ascii_(Int_.XtoStr_PadBgn(i, 3)));
byte[] ttl = Bry_.Add(ttl_prefix, Bry_.new_ascii_(Int_.Xto_str_pad_bgn(i, 3)));
Xoctg_page_xtn db_ctg = new Xoctg_page_xtn(ctg_tid, ttl);
Xodb_page page = new Xodb_page();
int page_id = next_id.Val_add_post();

View File

@@ -73,8 +73,8 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble {
Core_provider_(fsys_mgr.Provider_core());
state = State_make;
}
public void Init_load(Db_connect connect) {
Db_provider provider = Db_provider_pool._.FetchOrNew(connect);
public void Init_load(Db_conn_info connect) {
Db_provider provider = Db_provider_pool._.Get_or_new(connect);
Xodb_file[] files = tbl_db.Select_all(provider);
fsys_mgr.Init_by_files(provider, files);
Core_provider_(provider);
@@ -157,7 +157,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble {
// if (category_version != Xoa_ctg_mgr.Version_null)
tbl_cfg.Delete(grp, key);// always delete ctg version
category_version = version_is_1 ? Xoa_ctg_mgr.Version_1 : Xoa_ctg_mgr.Version_2;
tbl_cfg.Insert_str(grp, key, Byte_.XtoStr(category_version));
tbl_cfg.Insert_str(grp, key, Byte_.Xto_str(category_version));
}
public void Delete_by_tid(byte tid) {
Xodb_file[] ary = fsys_mgr.Files_ary();
@@ -166,12 +166,12 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble {
Xodb_file file = ary[i] ;
if (file.Tid() != tid) continue;
file.Rls();
gplx.dbs.Db_connect_sqlite sqlite = (gplx.dbs.Db_connect_sqlite)file.Connect();
gplx.dbs.Db_conn_info__sqlite sqlite = (gplx.dbs.Db_conn_info__sqlite)file.Connect();
Io_mgr._.DeleteFil_args(sqlite.Url()).MissingFails_off().Exec();
file.Cmd_mode_(Db_cmd_mode.Delete);
}
tbl_db.Commit_all(fsys_mgr.Provider_core(), ary);
this.Init_load(fsys_mgr.Provider_core().ConnectInfo());
this.Init_load(fsys_mgr.Provider_core().Conn_info());
}
public static final String Grp_wiki_init = "wiki.init";
@@ -194,7 +194,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, GfoInvkAble {
Xodb_mgr_sql rv = db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? wiki.Db_mgr_create_as_sql() : wiki.Db_mgr_as_sql();
byte state = rv.State();
switch (state) {
case Xodb_mgr_sql.State_init: rv.Init_load(Db_connect_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); break; // load
case Xodb_mgr_sql.State_init: rv.Init_load(Db_conn_info_.sqlite_(Xodb_mgr_sql.Find_core_url(wiki))); break; // load
case Xodb_mgr_sql.State_make: break; // noop; being made; don't load from db;
case Xodb_mgr_sql.State_load: break; // noop; already loaded;
default: throw Err_.unhandled(state);

View File

@@ -32,7 +32,7 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr {
if (page_id == null) {
DataRdr rdr = db_mgr.Tbl_page().Provider().Exec_sql_as_rdr("SELECT (Max(page_id) + 1) AS max_page_id FROM page;");
if (rdr.MoveNextPeer()) {
page_id = Int_.XtoStr(rdr.ReadInt("max_page_id"));
page_id = Int_.Xto_str(rdr.ReadInt("max_page_id"));
page_id_int = Int_.parse_(page_id);
db_mgr.Tbl_xowa_cfg().Insert_int("db", "page.id_next", page_id_int);
}

View File

@@ -18,6 +18,64 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*;
import gplx.dbs.*; import gplx.criterias.*;
public class Xodb_page_tbl {
public static final String Tbl_name = "page"
, Fld_page_id = "page_id", Fld_page_ns = "page_namespace", Fld_page_title = "page_title"
, Fld_page_is_redirect = "page_is_redirect", Fld_page_touched = "page_touched", Fld_page_len = "page_len"
, Fld_page_random_int = "page_random_int", Fld_page_file_idx = "page_file_idx"
, Fld_page_html_db_id = "page_html_db_id";
private static final String[] Select_by_id_flds__basic = new String[] {Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx};
private static final String[] Select_by_id_flds__hdump = new String[] {Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx, Fld_page_html_db_id};
// public boolean Select_by_id(Xodb_page rv, int page_id) {
// Db_rdr rdr = Db_rdr_.Null;
// Db_stmt stmt = Db_stmt_.Null;
// try {
// stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_id), html_db_enabled ? Select_by_id_flds__hdump : Select_by_id_flds__basic));
// rdr = stmt.Val_int_(page_id).Exec_select_as_rdr();
// while (rdr.Move_next()) {
// Read_page__all2(rv, rdr, html_db_enabled);
// return true;
// }
// } finally {rdr.Close(); stmt.Rls();}
// return false;
// }
public boolean Select_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) {
Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null;
try {
stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title), html_db_enabled ? Select_by_id_flds__hdump : Select_by_id_flds__basic));
rdr = stmt.Val_int_(ns.Id()).Val_str_(String_.new_utf8_(ttl)).Exec_select_as_rdr();
if (rdr.Move_next()) {
Read_page__all2(rv, rdr, html_db_enabled);
return true;
}
} finally {rdr.Close(); stmt.Rls();}
return false;
}
public static void Read_page__all2(Xodb_page page, Db_rdr rdr, boolean html_db_enabled) {
page.Id_ (rdr.Read_int(1));
page.Ns_id_ (rdr.Read_int(2));
page.Ttl_wo_ns_ (rdr.Read_bry_by_str(3));
page.Modified_on_ (DateAdp_.parse_fmt(rdr.Read_str(4), Page_touched_fmt));
page.Type_redirect_ (rdr.Read_byte(5) == 1);
page.Text_len_ (rdr.Read_int(6));
page.Db_file_idx_ (rdr.Read_int(7));
if (html_db_enabled)
page.Html_db_id_(rdr.Read_int(8));
}
public boolean Select_by_id(Xodb_page rv, int page_id) {
DataRdr rdr = DataRdr_.Null;
Db_stmt stmt = Db_stmt_.Null;
try {
stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_id));
rdr = stmt
.Val_int_(page_id)
.Exec_select();
while (rdr.MoveNextPeer()) {
Read_page__all(rv, rdr, html_db_enabled);
return true;
}
} finally {rdr.Rls(); stmt.Rls();}
return false;
}
private Xow_wiki wiki;
public Xodb_page_tbl(Xow_wiki wiki) {this.wiki = wiki;}
public void Html_db_enabled_(boolean v) {html_db_enabled = v;} private boolean html_db_enabled;
@@ -59,21 +117,6 @@ public class Xodb_page_tbl {
Db_qry_select qry = Db_qry_select.new_().From_(Tbl_name).Cols_(Fld_page_id, Fld_page_title).OrderBy_asc_(Fld_page_id);
return p.Exec_qry_as_rdr(qry);
}
public boolean Select_by_id(Xodb_page rv, int page_id) {
DataRdr rdr = DataRdr_.Null;
Db_stmt stmt = Db_stmt_.Null;
try {
stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_id));
rdr = stmt
.Val_int_(page_id)
.Exec_select();
while (rdr.MoveNextPeer()) {
Read_page__all(rv, rdr, html_db_enabled);
return true;
}
} finally {rdr.Rls(); stmt.Rls();}
return false;
}
private DataRdr Load_ttls_starting_with_rdr(int ns_id, byte[] ttl_frag, boolean include_redirects, int max_results, int min_page_len, int browse_len, boolean fwd, boolean search_suggest) {
Criteria crt_ttl = fwd ? Db_crt_.mte_(Fld_page_title, String_.new_utf8_(ttl_frag)) : Db_crt_.lt_(Fld_page_title, String_.new_utf8_(ttl_frag));
Criteria crt = Criteria_.And_many(Db_crt_.eq_(Fld_page_ns, ns_id), crt_ttl, Db_crt_.mte_(Fld_page_len, min_page_len));
@@ -128,7 +171,7 @@ public class Xodb_page_tbl {
public void Load_ttls_for_search_suggest(Cancelable cancelable, ListAdp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) {
String search_bgn = String_.new_utf8_(key);
String search_end = String_.new_utf8_(gplx.intl.Utf8_.Increment_char_at_last_pos(key));
Db_qry qry = Db_qry_sql.rdr_("SELECT page_id, page_namespace, page_title, page_len FROM page INDEXED BY page__title WHERE page_namespace = " + Int_.XtoStr(ns.Id()) + " AND page_title BETWEEN '" + search_bgn + "' AND '" + search_end + "' ORDER BY page_len DESC LIMIT " + Int_.XtoStr(max_results) + ";");
Db_qry qry = Db_qry_sql.rdr_("SELECT page_id, page_namespace, page_title, page_len FROM page INDEXED BY page__title WHERE page_namespace = " + Int_.Xto_str(ns.Id()) + " AND page_title BETWEEN '" + search_bgn + "' AND '" + search_end + "' ORDER BY page_len DESC LIMIT " + Int_.Xto_str(max_results) + ";");
DataRdr rdr = DataRdr_.Null;
try {
rdr = provider.Exec_qry_as_rdr(qry);
@@ -159,22 +202,6 @@ public class Xodb_page_tbl {
wkr.Select_in(provider, cancelable, wiki, bgn, end);
return true;
}
public boolean Select_by_ttl(Xodb_page rv, Xow_ns ns, byte[] ttl) {
DataRdr rdr = DataRdr_.Null;
Db_stmt stmt = Db_stmt_.Null;
try {
stmt = Db_stmt_.new_select_(provider, Tbl_name, String_.Ary(Fld_page_ns, Fld_page_title));
rdr = stmt
.Val_int_(ns.Id())
.Val_str_(String_.new_utf8_(ttl))
.Exec_select();
if (rdr.MoveNextPeer()) {
Read_page__all(rv, rdr, html_db_enabled);
return true;
}
} finally {rdr.Rls(); stmt.Rls();}
return false;
}
public byte[] Select_random(Xow_ns ns) {// ns should be ns_main
int random_int = RandomAdp_.new_().Next(ns.Count());
DataRdr rdr = DataRdr_.Null;
@@ -261,9 +288,6 @@ public class Xodb_page_tbl {
}
private static final String Page_touched_fmt = "yyyyMMddHHmmss";
private static String Xto_touched_str(DateAdp v) {return v.XtoStr_fmt(Page_touched_fmt);}
public static final String Tbl_name = "page"
, Fld_page_id = "page_id", Fld_page_ns = "page_namespace", Fld_page_title = "page_title", Fld_page_is_redirect = "page_is_redirect", Fld_page_touched = "page_touched", Fld_page_len = "page_len"
, Fld_page_random_int = "page_random_int", Fld_page_file_idx = "page_file_idx", Fld_page_html_db_id = "page_html_db_id";
public static final String[]
Flds_insert__html_n = String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_is_redirect, Fld_page_touched, Fld_page_len, Fld_page_random_int, Fld_page_file_idx)
, Flds_insert__html_y = String_.Ary(Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_is_redirect, Fld_page_touched, Fld_page_len, Fld_page_random_int, Fld_page_file_idx, Fld_page_html_db_id)

View File

@@ -60,8 +60,8 @@ public class Xodb_xowa_cfg_tbl {
stmt.Val_str_(grp).Val_str_(key).Exec_delete();
} finally {stmt.Rls();}
}
public void Insert_byte(String grp, String key, byte val) {Insert_str(grp, key, Byte_.XtoStr(val));}
public void Insert_int(String grp, String key, int val) {Insert_str(grp, key, Int_.XtoStr(val));}
public void Insert_byte(String grp, String key, byte val) {Insert_str(grp, key, Byte_.Xto_str(val));}
public void Insert_int(String grp, String key, int val) {Insert_str(grp, key, Int_.Xto_str(val));}
public void Insert_str_by_bry(String grp, String key, byte[] val) {Insert_str(grp, key, String_.new_utf8_(val));}
public void Insert_str(String grp, String key, String val) {Insert_str(provider, grp, key, val);}
public static void Insert_str(Db_provider p, String grp, String key, String val) {
@@ -73,8 +73,8 @@ public class Xodb_xowa_cfg_tbl {
p.Exec_qry(qry);
}
public Db_stmt Update_stmt() {return Db_stmt_.new_update_(provider, Tbl_name, String_.Ary(Fld_cfg_grp, Fld_cfg_key), Fld_cfg_val);}
public void Update(Db_stmt stmt, String grp, String key, long val) {Update(stmt, grp, key, Long_.XtoStr(val));}
public void Update(Db_stmt stmt, String grp, String key, int val) {Update(stmt, grp, key, Int_.XtoStr(val));}
public void Update(Db_stmt stmt, String grp, String key, long val) {Update(stmt, grp, key, Long_.Xto_str(val));}
public void Update(Db_stmt stmt, String grp, String key, int val) {Update(stmt, grp, key, Int_.Xto_str(val));}
public void Update(Db_stmt stmt, String grp, String key, String val) {
stmt.Clear()
.Val_str_(val)
@@ -82,7 +82,7 @@ public class Xodb_xowa_cfg_tbl {
.Val_str_(key)
.Exec_update();
}
public void Update(String grp, String key, int val) {Update(grp, key, Int_.XtoStr(val));}
public void Update(String grp, String key, int val) {Update(grp, key, Int_.Xto_str(val));}
public void Update(String grp, String key, String val) {
Db_qry qry = Db_qry_.update_common_(Tbl_name, Where_grp_key(grp, key), KeyVal_.new_(Fld_cfg_val, val));
provider.Exec_qry(qry);

View File

@@ -22,7 +22,7 @@ public class Xof_doc_thumb {
public static int Db_save_int(double v) {return (int)v;}
public static double Db_load_int(DataRdr rdr, String fld) {return rdr.ReadInt(fld);}
public static int X_int(double v) {return (int)v;}
public static String X_str(double v) {return Double_.XtoStr(v);}
public static String X_str(double v) {return Double_.Xto_str(v);}
public static final double Null = -1;
public static boolean Null_y(double v) {return v == Null;}
public static boolean Null_n(double v) {return v != Null;}

View File

@@ -106,7 +106,7 @@ public class Xof_lnki_file_mgr {
}
private void Init_fsdb_by_xfer(Xof_fsdb_itm fsdb_itm, Xof_xfer_itm xfer_itm) { // DELETE: DATE:2014-02-04
fsdb_itm.Lnki_size_(xfer_itm.Lnki_w(), xfer_itm.Lnki_h()); // NOTE: must overwrite fsdb_itm.size with xfer_itm.size when the same image shows up in multiple sizes on a page; (only one item in wiki_orig); EX: w:Portal:Canada; [[File:Flag of Canada.svg|300x150px]]; [[File:Flag of Canada.svg|23px]]; DATE:2014-02-14
fsdb_itm.Lnki_type_(xfer_itm.Lnki_type()); // NOTE: must overwrite lnki_type, else multiple images on same page with different type wont show; EX:en.w:History_of_painting; DATE:2014-03-06
fsdb_itm.Lnki_type_(xfer_itm.Lnki_type()); // NOTE: must overwrite lnki_type, else multiple images on same page with different type wont show; PAGE:en.w:History_of_painting; DATE:2014-03-06
fsdb_itm.Lnki_page_(xfer_itm.Lnki_page());
fsdb_itm.Lnki_thumbtime_(xfer_itm.Lnki_thumbtime());
// byte[] lnki_ttl = xfer_itm.Lnki_ttl();

View File

@@ -30,7 +30,7 @@ public class Xof_bin_wkr_fsdb_regy implements Xof_bin_wkr {
provider = Sqlite_engine_.Provider_load_or_make_(regy_url);
}
public void Rls() {
provider.Rls();
provider.Conn_term();
}
public Io_stream_rdr Bin_wkr_get_as_rdr(ListAdp temp_files, Xof_fsdb_itm itm, boolean is_thumb, int w) {
return null;

View File

@@ -124,7 +124,7 @@ public class Xof_fsdb_mgr_sql implements Xof_fsdb_mgr, GfoInvkAble {
public void Rls() {
this.Txn_save(); // NOTE: must call save, else user db will not update next id; DATE:2014-02-11
mnt_mgr.Rls();
img_regy_provider.Rls();
img_regy_provider.Conn_term();
}
public static Io_url Wiki_orig_url(Io_url root_dir) {return root_dir.GenSubFil("wiki.orig#00.sqlite3");}
public static Db_provider Wiki_orig_provider(Io_url root_dir) {

View File

@@ -35,10 +35,10 @@ class Cache_cfg_mgr {
}
public void Db_when_new(Db_provider provider) {
cfg_tbl.Provider_(provider);
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__next_id, Int_.XtoStr(1));
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_len, Long_.XtoStr(0));
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_min, Long_.XtoStr(cache_min));
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_max, Long_.XtoStr(cache_max));
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__next_id, Int_.Xto_str(1));
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_len, Long_.Xto_str(0));
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_min, Long_.Xto_str(cache_min));
cfg_tbl.Insert_str(Cfg_grp, Cfg_key__cache_max, Long_.Xto_str(cache_max));
}
public void Db_save() {
if (update_stmt == null) update_stmt = cfg_tbl.Update_stmt();

View File

@@ -55,7 +55,7 @@ class Fs_root_dir {
if (Xof_ext_.Id_is_image(rv.Fil_ext_id()))
img_size = img_size_wkr.Exec(rv.Fil_url());
rv.Init_by_size(++fil_id_next, img_size.Width(), img_size.Height());
cfg_tbl.Update(Cfg_grp_root_dir, Cfg_key_fil_id_next, Int_.XtoStr(fil_id_next));
cfg_tbl.Update(Cfg_grp_root_dir, Cfg_key_fil_id_next, Int_.Xto_str(fil_id_next));
fil_tbl.Insert(rv);
return rv;
}
@@ -85,7 +85,7 @@ class Fs_root_dir {
cfg_tbl.Ctor(provider, created);
fil_tbl.Ctor(provider, created);
if (created)
cfg_tbl.Insert(Cfg_grp_root_dir, Cfg_key_fil_id_next, Int_.XtoStr(fil_id_next));
cfg_tbl.Insert(Cfg_grp_root_dir, Cfg_key_fil_id_next, Int_.Xto_str(fil_id_next));
else {
fil_id_next = cfg_tbl.Select_as_int_or_fail(Cfg_grp_root_dir, Cfg_key_fil_id_next);
}

View File

@@ -40,7 +40,7 @@ public class Fs_root_wkr_fsdb {
int upright_patch = wiki.File_mgr().Fsdb_mgr().Patch_upright();
img_size.Html_size_calc(exec_tid, fsdb_itm.Lnki_w(), fsdb_itm.Lnki_h(), fsdb_itm.Lnki_type(), upright_patch, fsdb_itm.Lnki_upright(), fsdb_itm.Lnki_ext().Id(), orig_itm.Fil_w(), orig_itm.Fil_h(), Xof_img_size.Thumb_width_img);
int html_w = img_size.Html_w(), html_h = img_size.Html_h();
String thumb_name = Int_.XtoStr(html_w) + orig_url.Ext();
String thumb_name = Int_.Xto_str(html_w) + orig_url.Ext();
Io_url thumb_url = thumb_dir.GenSubFil_ary(thumb_rel + orig_url.Info().DirSpr(), thumb_name);
if (!Io_mgr._.ExistsFil(thumb_url)) {
if (!wiki.App().File_mgr().Img_mgr().Wkr_resize_img().Exec(orig_url, thumb_url, html_w, html_h, fsdb_itm.Lnki_ext().Id(), tmp_resize_result))

View File

@@ -209,7 +209,7 @@ public class Xog_bnd_mgr {
}
private void Init_itm(String cmd, int idx, int box, String ipt) {Init_itm(cmd, idx, box, IptArg_.parse_or_none_(ipt));}
private void Init_itm(String cmd, int idx, int box, IptArg ipt) {
String key = cmd + "-" + Int_.XtoStr(idx + ListAdp_.Base1); // EX: xowa.widgets.url.focus-1 xowa.widgets.url.focus-2
String key = cmd + "-" + Int_.Xto_str(idx + ListAdp_.Base1); // EX: xowa.widgets.url.focus-1 xowa.widgets.url.focus-2
Xog_bnd_itm itm = new Xog_bnd_itm(key, Bool_.Y, cmd, box, ipt);
boxs[box].Add(itm);
regy.Add(itm.Key(), itm);

View File

@@ -69,7 +69,7 @@ public abstract class Xog_mnu_base implements GfoInvkAble {
return itm;
}
public Xog_mnu_itm Add_spr() {
String key = "xowa.spr" + Int_.XtoStr(list.Count());
String key = "xowa.spr" + Int_.Xto_str(list.Count());
Xog_mnu_itm rv = new Xog_mnu_itm(gui_mgr, key).Tid_(Xog_mnu_itm.Tid_spr);
list.Add(rv);
return rv;

View File

@@ -87,7 +87,7 @@ public class Xog_html_js_cbk implements GfoInvkAble {
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ttl_bry);
wiki.Db_mgr().Load_mgr().Load_by_ttl(tmp_page, ttl.Ns(), ttl.Page_db());
}
return String_.Ary(tmp_page.Exists() ? "1" : "0", Int_.XtoStr(tmp_page.Id()), Int_.XtoStr(tmp_page.Ns_id()), String_.new_utf8_(tmp_page.Ttl_wo_ns()), Bool_.XtoStr_lower(tmp_page.Type_redirect()), tmp_page.Modified_on().XtoStr_fmt("yyyy-MM-dd HH:mm:ss"), Int_.XtoStr(tmp_page.Text_len()));
return String_.Ary(tmp_page.Exists() ? "1" : "0", Int_.Xto_str(tmp_page.Id()), Int_.Xto_str(tmp_page.Ns_id()), String_.new_utf8_(tmp_page.Ttl_wo_ns()), Bool_.Xto_str_lower(tmp_page.Type_redirect()), tmp_page.Modified_on().XtoStr_fmt("yyyy-MM-dd HH:mm:ss"), Int_.Xto_str(tmp_page.Text_len()));
} private static final Xodb_page tmp_page = Xodb_page.tmp_();
private String[][] Get_titles_meta(GfoMsg m) {
Xow_wiki wiki = html_itm.Owner_tab().Page().Wiki();

View File

@@ -21,8 +21,8 @@ public class Xog_html_js_cbk_tst {
@Before public void init() {fxt.Clear();} private Xog_html_js_cbk_fxt fxt = new Xog_html_js_cbk_fxt();
@Test public void Get_title() {
fxt.Fxt().Init_page_create("exists");
fxt.Test_get_title("exists", "1" , "0" , Int_.XtoStr(Int_.MinValue), "Exists", "false", "0001-01-01 00:00:00", "0");
fxt.Test_get_title("absent", "0", "-1", Int_.XtoStr(Int_.MinValue), null , "false", "0001-01-01 00:00:00", "0");
fxt.Test_get_title("exists", "1" , "0" , Int_.Xto_str(Int_.MinValue), "Exists", "false", "0001-01-01 00:00:00", "0");
fxt.Test_get_title("absent", "0", "-1", Int_.Xto_str(Int_.MinValue), null , "false", "0001-01-01 00:00:00", "0");
}
}
class Xog_html_js_cbk_fxt {

View File

@@ -51,7 +51,13 @@ class Xog_launcher_tabs {
}
}
private void Restore_tab_failover(Xoa_app app, Xow_wiki home_wiki, Xog_win_itm win) {
Launch_tab(win.Active_tab(), win, home_wiki, gplx.xowa.users.Xouc_pages_mgr.Page_xowa);
try {
Xog_tab_itm tab = win.Tab_mgr().Tabs_new_init(); // NOTE: was win.Active_tab which throws a nullRef; DATE:2014-09-01
Launch_tab(tab, win, home_wiki, gplx.xowa.users.Xouc_pages_mgr.Page_xowa);
}
catch (Exception e) {
app.Usr_dlg().Warn_many("", "", "failed to launch failover tab: err=~{0}", Err_.Message_gplx(e));
}
}
private void Launch_tab(Xog_tab_itm tab, Xog_win_itm win, Xow_wiki home_wiki, String launch_str) {
Xoa_url launch_url = Xoa_url_parser.Parse_from_url_bar(win.App(), home_wiki, launch_str);

View File

@@ -30,7 +30,7 @@ public class Xog_tab_itm implements GfoInvkAble {
public void Make_html_box(int uid, Gfui_tab_itm tab_box, Xog_win_itm win, GfuiElem owner) {
this.tab_box = tab_box;
Xoa_app app = win.App(); Xoa_gui_mgr gui_mgr = win.Gui_mgr(); Gfui_kit kit = win.Kit();
Gfui_html html_box = kit.New_html("html_box" + Int_.XtoStr(uid), owner);
Gfui_html html_box = kit.New_html("html_box" + Int_.Xto_str(uid), owner);
html_box.Html_js_enabled_(gui_mgr.Html_mgr().Javascript_enabled());
html_box.Html_invk_src_(win);
html_itm.Html_box_(html_box);

View File

@@ -85,7 +85,7 @@ public class Xog_tab_mgr implements GfoEvObj {
return rv;
}
private Xog_tab_itm Tabs_new(boolean focus, boolean active_tab_is_null) {
String tab_key = "tab_" + Int_.XtoStr(tab_uid++); int tab_idx = tab_regy.Count();
String tab_key = "tab_" + Int_.Xto_str(tab_uid++); int tab_idx = tab_regy.Count();
Gfui_tab_itm_data tab_data = new Gfui_tab_itm_data(tab_key, tab_idx);
Xog_tab_itm rv = new Xog_tab_itm(this, tab_data);
Gfui_tab_itm tab_box = tab_mgr.Tabs_add(tab_data);

View File

@@ -74,8 +74,7 @@ class Xodb_hdump_mgr__save_fxt extends Xodb_hdump_mgr__base_fxt {
}
public Hdump_text_row Make_row_body(int imgs_count, String body) {
page.Hdump_data().Body_(Bry_.new_utf8_(body));
for (int i = 0; i < imgs_count; ++i)
page.Hdump_data().Imgs().Add(null);
page.Hdump_data().Data_count_imgs_(imgs_count);
Hdump_page_body_srl.Save(tmp_bfr, page);
return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, tmp_bfr.XtoAryAndClear());
}

View File

@@ -135,14 +135,14 @@ class Xodb_hdump_mgr__write_fxt extends Xodb_hdump_mgr__base_fxt {
Tfds.Eq_true(String_.Has(actl_html, expd_html), actl_html);
else
Tfds.Eq_str_lines(expd_html, actl_html);
if (expd_itms_xfers.Count() > 0) Tfds.Eq_ary_str(Xfer_to_str_ary(expd_itms_xfers), Xfer_to_str_ary(page.Hdump_data().Imgs()));
if (expd_itms_xfers.Count() > 0) Tfds.Eq_ary_str(Xfer_to_str_ary(expd_itms_xfers), Xfer_to_str_ary(page.Hdump_data().Data()));
}
private static String[] Xfer_to_str_ary(ListAdp list) {
int len = list.Count();
String[] rv = new String[len];
for (int i = 0; i < len; ++i) {
Hdump_data_img__base itm = (Hdump_data_img__base)list.FetchAt(i);
rv[i] = itm.XtoStr();
rv[i] = itm.Data_print();
}
return rv;
}

View File

@@ -38,7 +38,7 @@ public class Xodb_hdump_mgr_setup {
try {
Xodb_xowa_cfg_tbl.Insert_str(core_provider, "db.meta", "html_db.exists", "y");
core_provider.Exec_sql("ALTER TABLE page ADD COLUMN page_html_db_id integer NOT NULL DEFAULT '-1'");
} catch (Exception e) {Gfo_usr_dlg_._.Warn_many("", "", "failed to update core: db=~{0} err=~{1}", core_provider.ConnectInfo().Raw_of_db_connect(), Err_.Message_gplx(e));}
} catch (Exception e) {Gfo_usr_dlg_._.Warn_many("", "", "failed to update core: db=~{0} err=~{1}", core_provider.Conn_info().Str_raw(), Err_.Message_gplx(e));}
}
private static Xodb_file Create_db(Xodb_mgr_sql db_mgr, Xodb_fsys_mgr fsys_mgr) {
Xodb_file html_db_file = fsys_mgr.Make(Xodb_file_tid.Tid_html);

View File

@@ -0,0 +1,34 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
public class Hdump_data_gallery implements Hdump_data_itm {
public Hdump_data_gallery(int uid, int box_max) {
this.uid = uid;
this.box_max = box_max;
}
public int Data_tid() {return Hdump_data_tid.Tid_gallery;}
public void Data_write(Bry_bfr bfr) {
bfr .Add_int_variable(Hdump_data_tid.Tid_gallery).Add_byte_pipe()
.Add_int_variable(box_max).Add_byte_pipe()
;
bfr.Add_byte_nl();
}
public String Data_print() {return Int_.Xto_str(box_max);}
public int Uid() {return uid;} private int uid;
public int Box_max() {return box_max;} private int box_max;
}

View File

@@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
import gplx.xowa.hdumps.dbs.*;
public abstract class Hdump_data_img__base implements XtoStrAble {
public abstract class Hdump_data_img__base implements Hdump_data_itm {
public Hdump_data_img__base Init_by_base(int uid, int view_w, int view_h, byte[] lnki_ttl, byte[] view_src) {
this.uid = uid;
this.view_w = view_w;
@@ -26,28 +26,30 @@ public abstract class Hdump_data_img__base implements XtoStrAble {
this.view_src = view_src;
return this;
}
public abstract int Tid();
public int Data_tid() {return Hdump_data_tid.Tid_img;}
public abstract int Img_tid();
public int Uid() {return uid;} private int uid;
public int View_w() {return view_w;} private int view_w;
public int View_h() {return view_h;} private int view_h;
public byte[] Lnki_ttl() {return lnki_ttl;} private byte[] lnki_ttl;
public byte[] View_src() {return view_src;} private byte[] view_src;
public String XtoStr() {
return String_.Concat_with_str("|", Int_.XtoStr(this.Tid()), Int_.XtoStr(uid), Int_.XtoStr(view_w), Int_.XtoStr(view_h), String_.new_utf8_(lnki_ttl), String_.new_utf8_(view_src));
public String Data_print() {
return String_.Concat_with_str("|", Int_.Xto_str(this.Img_tid()), Int_.Xto_str(uid), Int_.Xto_str(view_w), Int_.Xto_str(view_h), String_.new_utf8_(lnki_ttl), String_.new_utf8_(view_src));
}
public void Write(Bry_bfr bfr) {
public void Data_write(Bry_bfr bfr) {
bfr .Add_int_variable(Hdump_data_tid.Tid_img).Add_byte_pipe()
.Add_int_variable(this.Tid()).Add_byte_pipe()
.Add_int_variable(this.Img_tid()).Add_byte_pipe()
.Add_int_variable(uid).Add_byte_pipe()
.Add_int_variable(view_w).Add_byte_pipe()
.Add_int_variable(view_h).Add_byte_pipe()
.Add(lnki_ttl).Add_byte_pipe()
.Add(view_src).Add_byte_pipe()
;
Write_hook(bfr);
Data_write_hook(bfr);
bfr.Add_byte_nl();
}
@gplx.Virtual public void Write_hook(Bry_bfr bfr) {}
@gplx.Virtual public void Data_write_hook(Bry_bfr bfr) {}
public static final Hdump_data_img__base[] Ary_empty = new Hdump_data_img__base[0];
public static final int Tid_basic = 0, Tid_gallery = 1;
@Override public String toString() {return this.Data_print();} // TEST
}

View File

@@ -17,5 +17,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
public class Hdump_data_img__basic extends Hdump_data_img__base {
@Override public int Tid() {return Hdump_data_img__base.Tid_basic;}
@Override public int Img_tid() {return Hdump_data_img__base.Tid_basic;}
}

View File

@@ -17,21 +17,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
public class Hdump_data_img__gallery extends Hdump_data_img__base {
@Override public int Tid() {return Hdump_data_img__base.Tid_gallery;}
public Hdump_data_img__base Init_by_gallery(int box_max, int box_w, int img_w, int img_pad) {
this.box_max = box_max;
@Override public int Img_tid() {return Hdump_data_img__base.Tid_gallery;}
public Hdump_data_img__base Init_by_gallery(int box_w, int img_w, int img_pad) {
this.box_w = box_w;
this.img_w = img_w;
this.img_pad = img_pad;
return this;
}
public int Box_max() {return box_max;} private int box_max;
public int Box_w() {return box_w;} private int box_w;
public int Img_w() {return img_w;} private int img_w;
public int Img_pad() {return img_pad;} private int img_pad;
@Override public void Write_hook(Bry_bfr bfr) {
bfr .Add_int_variable(box_max).Add_byte_pipe()
.Add_int_variable(box_w).Add_byte_pipe()
@Override public void Data_write_hook(Bry_bfr bfr) {
bfr .Add_int_variable(box_w).Add_byte_pipe()
.Add_int_variable(img_w).Add_byte_pipe()
.Add_int_variable(img_pad).Add_byte_pipe()
;

View File

@@ -0,0 +1,23 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
public interface Hdump_data_itm {
int Data_tid();
void Data_write(Bry_bfr bfr);
String Data_print();
}

View File

@@ -15,7 +15,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.hdumps.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
public class Hdump_data_tid { // SERIALIZED
public static final int Tid_img = 1, Tid_redlink = 2, Tid_gallery = 3, Tid_imap = 4;
}

View File

@@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.hdumps.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
import gplx.dbs.*;
public class Hdump_text_tbl {
public static final String Tbl_name = "html_text", Fld_page_id = "page_id", Fld_text_tid = "text_tid", Fld_text_data = "text_data";
private Db_stmt stmt_select, stmt_insert, stmt_delete;
public Db_provider Provider() {return provider;} public Hdump_text_tbl Provider_(Db_provider v) {this.Rls_all(); provider = v; return this;} private Db_provider provider;
@gplx.Virtual public void Delete_by_page(int page_id) {
@@ -47,14 +48,30 @@ public class Hdump_text_tbl {
catch (Exception exc) {stmt_select = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail
finally {stmt_select.Rls();}
}
// private static final String[] Select_by_page_flds = new String[] {Fld_page_id, Fld_text_tid, Fld_text_data};
// public virtual void Select_by_page2(ListAdp rv, int page_id) {
// // if (stmt_select == null) stmt_select = provider.Stmt_select(Tbl_name, Select_by_page_flds, String_.Ary(Fld_page_id));
// try {
// Db_rdr rdr = null; //stmt_select.Clear().Val_int_(page_id).Exec_select_as_rdr();
// while(rdr.Move_next()) {
// Hdump_text_row row = new Hdump_text_row
// ( rdr.Read_int(0)
// , rdr.Read_int(1)
// , rdr.Read_bry_by_str(2)
// );
// rv.Add(row);
// }
// rdr.Close();
// }
// catch (Exception exc) {stmt_select = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail
// finally {stmt_select.Rls();}
// }
public void Rls_all() {
if (stmt_select != null) {stmt_select.Rls(); stmt_select = null;}
if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;}
if (stmt_delete != null) {stmt_delete.Rls(); stmt_delete = null;}
provider = null;
}
public static final String Tbl_name = "html_text"
, Fld_page_id = "page_id", Fld_text_tid = "text_tid", Fld_text_data = "text_data";
private static final String[] Flds_all = new String[] {Fld_page_id, Fld_text_tid, Fld_text_data};
public static final String Tbl_sql = String_.Concat_lines_nl
( "CREATE TABLE IF NOT EXISTS html_text"

View File

@@ -84,8 +84,8 @@ public class Hdump_html_fmtr__body implements Bry_fmtr_arg {
case Hdump_html_consts.Tid_file_mgnf: fmtr.Html_thumb_part_magnify(bfr, uid, a_href, a_title, html_mgr.Img_thumb_magnify()); return rv;
case Hdump_html_consts.Tid_file_play: fmtr.Html_thumb_part_play (bfr, uid, img_view_w, Xoh_file_wtr__basic.Play_btn_max_width, a_href, a_title, html_mgr.Img_media_play_btn()); return rv;
case Hdump_html_consts.Tid_gallery_box_max: {
Hdump_data_img__gallery gly = (Hdump_data_img__gallery)img;
if (gly.Box_max() > 0) { // -1 means no box_max
Hdump_data_gallery gly = (Hdump_data_gallery)hpg.Gly_itms().Fetch(uid);
if (gly != null) { // -1 means no box_max
byte[] style = Gallery_mgr_base.box_style_max_width_fmtr.Bld_bry_many(tmp_bfr, gly.Box_max());
Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style);
}

View File

@@ -20,7 +20,7 @@ import org.junit.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.
public class Hdump_html_mgr_tst {
@Before public void init() {
fxt.Clear();
fxt.Init_img(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png");
fxt.Init_data_img_basic(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png");
} private Hdump_html_mgr_fxt fxt = new Hdump_html_mgr_fxt();
@Test public void Img() {
fxt .Init_body("<img xowa_img='0' />")
@@ -69,7 +69,8 @@ public class Hdump_html_mgr_tst {
}
@Test public void Gallery() {
fxt.Clear_imgs();
fxt .Init_gly(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png", 800, 155, 150, 15);
fxt .Init_data_gly(0, 800);
fxt .Init_data_img_gly(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png", 155, 150, 15);
fxt .Init_body(String_.Concat_lines_nl_skip_last
( "<ul xowa_gly_box_max='0'>"
, " <li class='gallerybox' xowa_gly_box_w='0'>"
@@ -99,8 +100,9 @@ class Hdump_html_mgr_fxt {
}
public void Clear_imgs() {img_list.Clear();}
public Hdump_html_mgr_fxt Init_body(String body) {hpg.Page_body_(Bry_.new_utf8_(body)); return this;}
public Hdump_html_mgr_fxt Init_img(int id, int w, int h, String ttl, String src) {img_list.Add(new Hdump_data_img__basic().Init_by_base(id, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;}
public Hdump_html_mgr_fxt Init_gly(int id, int w, int h, String ttl, String src, int box_max, int box_w, int img_w, int img_pad) {img_list.Add(new Hdump_data_img__gallery().Init_by_gallery(box_max, box_w, img_w, img_pad).Init_by_base(id, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;}
public Hdump_html_mgr_fxt Init_data_gly(int uid, int box_max) {hpg.Gly_itms().Add(uid, new Hdump_data_gallery(uid, box_max)); return this;}
public Hdump_html_mgr_fxt Init_data_img_basic(int uid, int w, int h, String ttl, String src) {img_list.Add(new Hdump_data_img__basic().Init_by_base(uid, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;}
public Hdump_html_mgr_fxt Init_data_img_gly(int uid, int w, int h, String ttl, String src, int box_w, int img_w, int img_pad) {img_list.Add(new Hdump_data_img__gallery().Init_by_gallery(box_w, img_w, img_pad).Init_by_base(uid, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;}
public Hdump_html_mgr_fxt Test_html(String expd) {
if (img_list.Count() > 0) hpg.Img_itms_((Hdump_data_img__base[])img_list.XtoAryAndClear(Hdump_data_img__base.class));
html_mgr.Write(bfr, wiki, hpg);

View File

@@ -46,8 +46,8 @@ public class Hdump_load_mgr {
while (!rdr.Pos_is_eos()) {
int tid = rdr.Read_int_to_pipe();
switch (tid) {
case Hdump_data_tid.Tid_img :
case Hdump_data_tid.Tid_gallery : Load_data_img(); break; // 1|0|220|110|A.png|commons/7/0/orig/A.png
case Hdump_data_tid.Tid_img : Load_data_img(); break; // 1|0|220|110|A.png|commons/7/0/orig/A.png
case Hdump_data_tid.Tid_gallery : Load_data_gallery(hpg); break; // 3|0|800
case Hdump_data_tid.Tid_redlink : Load_data_redlink(hpg); break; // 2|2|0|1
}
}
@@ -63,7 +63,7 @@ public class Hdump_load_mgr {
Hdump_data_img__base img_itm = null;
switch (tid) {
case Hdump_data_img__base.Tid_basic : img_itm = new Hdump_data_img__basic().Init_by_base(uid, w, h, ttl, src); break;
case Hdump_data_img__base.Tid_gallery : img_itm = new Hdump_data_img__gallery().Init_by_gallery(rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe()).Init_by_base(uid, w, h, ttl, src); break;
case Hdump_data_img__base.Tid_gallery : img_itm = new Hdump_data_img__gallery().Init_by_gallery(rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe()).Init_by_base(uid, w, h, ttl, src); break;
}
rdr.Pos_add_one();
img_itms.Add(img_itm);
@@ -75,4 +75,9 @@ public class Hdump_load_mgr {
redlink_uids[i] = rdr.Read_int_to_pipe();
hpg.Redlink_uids_(redlink_uids);
}
public void Load_data_gallery(Hdump_page hpg) {
int uid = rdr.Read_int_to_pipe();
int box_max = rdr.Read_int_to_pipe();
hpg.Gly_itms().Add(uid, new Hdump_data_gallery(uid, box_max));
}
}

View File

@@ -23,7 +23,7 @@ public class Hdump_page_body_srl {
public static void Save(Bry_bfr bfr, Xoa_page page) {
bfr.Add_int_fixed(0, 1).Add_byte_pipe(); // version
Xopg_hdump_data hdump_data = page.Hdump_data();
bfr.Add_int_variable(hdump_data.Imgs().Count()); // imgs_count
bfr.Add_int_variable(hdump_data.Data_count_imgs()); // imgs_count
Xopg_html_data html_data = page.Html_data();
Save_html_modules(bfr, html_data);
Save_data(bfr, Tid_display_ttl , html_data.Display_ttl());

View File

@@ -20,16 +20,20 @@ import gplx.xowa.hdumps.core.*; import gplx.xowa.files.*;
public class Xopg_hdump_data {
private final int file_dir_bry_len;
public Xopg_hdump_data(Xoa_app app) {file_dir_bry_len = app.Fsys_mgr().File_dir_bry_len();}
public ListAdp Imgs() {return imgs;} private final ListAdp imgs = ListAdp_.new_();
public void Imgs_add(Hdump_data_img__base img, Xof_xfer_itm xfer_itm, int tid) {
public int Data_count_imgs() {return data_count_imgs;} public void Data_count_imgs_(int v) {data_count_imgs = v;} private int data_count_imgs;
public ListAdp Data() {return data;} private final ListAdp data = ListAdp_.new_();
public void Data_add(Hdump_data_itm itm) {data.Add(itm);}
public void Data_add_img(Hdump_data_img__base img, Xof_xfer_itm xfer_itm, int tid) {
byte[] img_src = xfer_itm.Html_view_src();
img_src = Bry_.Len_eq_0(img_src) ? Bry_.Empty : Bry_.Mid(img_src, file_dir_bry_len);
img.Init_by_base(xfer_itm.Html_uid(), xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Lnki_ttl(), img_src);
imgs.Add(img);
data.Add(img);
++data_count_imgs;
}
public byte[] Body() {return body;} public void Body_(byte[] v) {body = v;} private byte[] body;
public void Clear() {
imgs.Clear();
data_count_imgs = 0;
data.Clear();
body = null;
}
}

View File

@@ -33,14 +33,14 @@ public class Hdump_save_mgr {
text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_body, tmp_bfr.XtoAryAndClear());
byte[] redlinks_bry = Write_redlinks(tmp_bfr, page.Html_data().Redlink_mgr());
if (redlinks_bry != null) text_tbl.Insert(page_id, Hdump_data_tid.Tid_redlink, redlinks_bry);
byte[] imgs_bry = Write_imgs(tmp_bfr, page.Hdump_data().Imgs());
byte[] imgs_bry = Write_imgs(tmp_bfr, page.Hdump_data().Data());
if (imgs_bry != null) text_tbl.Insert(page_id, Hdump_data_tid.Tid_img, imgs_bry);
}
public static byte[] Write_imgs(Bry_bfr bfr, ListAdp imgs) {
int len = imgs.Count(); if (len == 0) return null; // no images; exit early, else will write blank String
for (int i = 0; i < len; ++i) {
Hdump_data_img__base img = (Hdump_data_img__base)imgs.FetchAt(i);
img.Write(bfr);
Hdump_data_itm itm = (Hdump_data_itm)imgs.FetchAt(i);
itm.Data_write(bfr);
}
return bfr.XtoAryAndClear();
}

View File

@@ -51,7 +51,8 @@ public class Xoh_html_wtr_tst {
// @Test public void Img_alt() { // FUTURE: enable; WHEN: after fixing xnde to handle bad xnde; EX: France
// fxt.Test_parse_page_wiki_str("[[File:A.png|none|9x8px|alt=a<b>b</b>\"c\"d]]", Xop_fxt.html_img_none("File:A.png", "ab&quot;c&quot;d"));
// }
@Test public void Url_encode() {fxt.Test_parse_page_wiki_str("[[a;@$!*(),/ _^b|z]]" , "<a href=\"/wiki/a;@$!*(),/__%5Eb\">z</a>");}
@Test public void Url_encode() {fxt.Test_parse_page_wiki_str("[[a;@$!*(),/ _^b|z]]" , "<a href=\"/wiki/A;@$!*(),/_%5Eb\">z</a>");} // NOTE: was "a" instead of "A"; "__" instead of "_" DATE:2014-09-07
@Test public void Url_encode_space() {fxt.Test_parse_page_wiki_str("[[a _b|z]]" , "<a href=\"/wiki/A_b\">z</a>");}
@Test public void Apos_i() {fxt.Test_parse_page_wiki_str("''a''" , "<i>a</i>");}
@Test public void Apos_b() {fxt.Test_parse_page_wiki_str("'''a'''" , "<b>a</b>");}
@Test public void Apos_ib() {fxt.Test_parse_page_wiki_str("'''''a'''''" , "<i><b>a</b></i>");}

View File

@@ -50,7 +50,7 @@ public class Xoh_page_wtr_mgr implements GfoInvkAble {
public byte[] Css_common_bry() {return css_common_bry;} public Xoh_page_wtr_mgr Css_common_bry_(Io_url v) {css_common_bry = app.Encoder_mgr().Fsys().Encode_http(v); return this;} private byte[] css_common_bry;
public byte[] Css_wiki_bry() {return css_wiki_bry;} public Xoh_page_wtr_mgr Css_wiki_bry_(Io_url v) {css_wiki_bry = app.Encoder_mgr().Fsys().Encode_http(v); return this;} private byte[] css_wiki_bry;
private Bry_fmtr page_read_fmtr = Bry_fmtr.new_(""
, "page_id", "page_name", "page_title", "page_content_sub", "page_data", "page_langs", "page_modified_on_msg", "page_lang_ltr"
, "page_id", "page_name", "page_title", "page_content_sub", "page_jumpto", "page_data", "page_langs", "page_modified_on_msg", "page_lang_ltr"
, "html_css_common_path", "html_css_wiki_path", "html_content_editable"
, "xowa_head"
, "portal_div_personal", "portal_div_ns", "portal_div_view"
@@ -59,7 +59,7 @@ public class Xoh_page_wtr_mgr implements GfoInvkAble {
, "app_version", "app_build_date", "app_root_dir", "js_wikidata", "js_edit_toolbar", "xowa_mode_is_server"
);
public Bry_fmtr Page_edit_fmtr() {return page_edit_fmtr;} private Bry_fmtr page_edit_fmtr = Bry_fmtr.new_(""
, "page_id", "page_name", "page_title", "page_content_sub", "page_data", "page_langs", "page_modified_on_msg", "page_lang_ltr"
, "page_id", "page_name", "page_title", "page_content_sub", "page_jumpto", "page_data", "page_langs", "page_modified_on_msg", "page_lang_ltr"
, "html_css_common_path", "html_css_wiki_path", "html_content_editable"
, "xowa_head"
, "portal_div_personal", "portal_div_ns", "portal_div_view"
@@ -68,7 +68,7 @@ public class Xoh_page_wtr_mgr implements GfoInvkAble {
, "app_version", "app_build_date", "app_root_dir", "js_wikidata", "js_edit_toolbar", "xowa_mode_is_server"
);
public Bry_fmtr Page_html_fmtr() {return page_html_fmtr;} private Bry_fmtr page_html_fmtr = Bry_fmtr.new_(""
, "page_id", "page_name", "page_title", "page_content_sub", "page_data", "page_langs", "page_modified_on_msg", "page_lang_ltr"
, "page_id", "page_name", "page_title", "page_content_sub", "page_jumpto", "page_data", "page_langs", "page_modified_on_msg", "page_lang_ltr"
, "html_css_common_path", "html_css_wiki_path", "html_content_editable"
, "xowa_head"
, "portal_div_personal", "portal_div_ns", "portal_div_view"

View File

@@ -66,7 +66,9 @@ public class Xoh_page_wtr_wkr implements Bry_fmtr_arg {
fmtr.Bld_bfr_many(html_bfr, page.Revision_data().Id()
, Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page.Ttl(), null) // NOTE: page_name does not show display_title (<i>). always pass in null
, Xoh_page_wtr_wkr_.Bld_page_name(tmp_bfr, page.Ttl(), page.Html_data().Display_ttl())
, page_content_sub, page_data, wtr_page_lang, page_modified_on_msg, page.Lang().Dir_bry()
, page_content_sub
, wiki.Html_mgr().Portal_mgr().Div_jump_to()
, page_data, wtr_page_lang, page_modified_on_msg, page.Lang().Dir_bry()
, mgr.Css_common_bry(), mgr.Css_wiki_bry(), html_content_editable
, page.Html_data().Module_mgr().Init(app, wiki, page).Init_dflts()
, portal_mgr.Div_personal_bry(), portal_mgr.Div_ns_bry(app.Utl_bry_bfr_mkr(), page.Ttl(), wiki.Ns_mgr()), portal_mgr.Div_view_bry(app.Utl_bry_bfr_mkr(), view_tid, page.Html_data().Xtn_search_text())

View File

@@ -19,7 +19,7 @@ package gplx.xowa.html; import gplx.*; import gplx.xowa.*;
import gplx.html.*; import gplx.xowa.xtns.relatedSites.*;
public class Xoh_page_wtr_wkr_ {
public static byte[] Bld_page_content_sub(Xoa_app app, Xow_wiki wiki, Xoa_page page, Bry_bfr tmp_bfr) {
byte[] subpages = app.Html_mgr().Page_mgr().Subpages_bldr().Bld(page.Ttl());
byte[] subpages = app.Html_mgr().Page_mgr().Subpages_bldr().Bld(wiki.Ns_mgr(), page.Ttl());
byte[] page_content_sub = page.Html_data().Content_sub(); // contentSub exists; SEE: {{#isin}}
byte[] redirect_msg = Xop_redirect_mgr.Bld_redirect_msg(app, wiki, page);
return Bry_.Add(subpages, page_content_sub, redirect_msg);

View File

@@ -77,7 +77,7 @@ public class Xoh_file_wtr__basic {
this.Write_file_image(bfr, ctx, hctx, src, lnki, xfer_itm, uid, div_width, lnki_halign, lnki_halign_bry, lnki_ttl, lnki_ext, lnki_href, img_view_src, img_orig_src, img_alt);
}
if (hctx.Mode_is_hdump() && Xof_html_elem.Tid_is_file(xfer_itm.Html_elem_tid())) {
page.Hdump_data().Imgs_add(new Hdump_data_img__basic(), xfer_itm, Hdump_data_img__gallery.Tid_basic);
page.Hdump_data().Data_add_img(new Hdump_data_img__basic(), xfer_itm, Hdump_data_img__gallery.Tid_basic);
}
}
private void Write_file_ns_media(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src) {
@@ -128,7 +128,7 @@ public class Xoh_file_wtr__basic {
}
Arg_nde_tkn lnki_link_tkn = lnki.Link_tkn();
if (lnki_link_tkn == Arg_nde_tkn.Null) // full
lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, lnki_href, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(lnki));
lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, lnki_href, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(scratch_bfr, lnki));
else { // thumb
Arg_itm_tkn link_tkn = lnki_link_tkn.Val_tkn();
byte[] link_ref = link_tkn.Dat_to_bry(src);
@@ -136,7 +136,7 @@ public class Xoh_file_wtr__basic {
link_ref = link_ref_new == null ? lnki_href: link_ref_new; // if parse fails, then assign to lnki_href; EX:link={{{1}}}
link_ref = ctx.App().Encoder_mgr().Href_quotes().Encode(link_ref); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16
lnki_ttl = Bry_.Coalesce(lnki_ttl, tmp_link_parser.Html_xowa_ttl());
lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, link_ref, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(lnki));
lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, link_ref, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(scratch_bfr, lnki));
}
if (div_align_exists) bfr.Add(Html_tag_.Div_rhs); // close div from above
}
@@ -220,14 +220,35 @@ public class Xoh_file_wtr__basic {
tmp_bfr.Add_byte(Byte_ascii.Quote);
return tmp_bfr.XtoAryAndClear();
}
private static byte[] Arg_img_cls(Xop_lnki_tkn lnki) {return lnki.Border() == Bool_.Y_byte ? Atr_cls_thumbborder : Bry_.Empty;}
private static byte[] Arg_img_cls(Bry_bfr tmp_bfr, Xop_lnki_tkn lnki) {
byte[] cls_border = lnki.Border() == Bool_.Y_byte ? Bry_cls_thumbborder : null;
byte[] cls_custom = lnki.Lnki_cls() == null ? null : lnki.Lnki_cls(); // PAGE:en.s:Page:Notes_on_Osteology_of_Baptanodon._With_a_Description_of_a_New_Species.pdf/3; DATE:2014-09-06
return cls_border == null && cls_custom == null
? Bry_.Empty
: Cls_coalesce(tmp_bfr, cls_border, cls_custom);
}
private static byte[] Cls_coalesce(Bry_bfr tmp_bfr, byte[]... cls_ary) {
tmp_bfr.Add(Bry_cls);
int written = 0;
int len = cls_ary.length;
for (int i = 0; i < len; ++i) {
byte[] cls_itm = cls_ary[i];
if (cls_itm == null) continue;
if (written != 0) tmp_bfr.Add_byte(Byte_ascii.Semic);
tmp_bfr.Add(cls_itm);
++written;
}
tmp_bfr.Add(Byte_ascii.Quote_bry);
return tmp_bfr.XtoAryAndClear();
}
public static final int Play_btn_max_width = 1024;
private static final byte[]
Div_center_bgn = Bry_.new_ascii_("<div class=\"center\">")
, Div_float_none = Bry_.new_ascii_("<div class=\"floatnone\">")
, Div_float_left = Bry_.new_ascii_("<div class=\"floatleft\">")
, Div_float_right = Bry_.new_ascii_("<div class=\"floatright\">")
, Atr_cls_thumbborder = Bry_.new_ascii_(" class=\"thumbborder\"")
, Atr_title = Bry_.new_ascii_(" title=\"")
, Bry_cls = Bry_.new_ascii_(" class=\"")
, Bry_cls_thumbborder = Bry_.new_ascii_("thumbborder")
;
}

View File

@@ -98,10 +98,20 @@ public class Xoh_file_wtr_basic_tst {
, ""
));
}
@Test public void Border() {
@Test public void Cls_border() {
fxt.Test_parse_page_wiki_str
( "[[File:A.png|border]]"
, "<a href=\"/wiki/File:A.png\" class=\"image\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" class=\"thumbborder\" /></a>");
( "[[File:A.png|border]]"
, "<a href=\"/wiki/File:A.png\" class=\"image\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" class=\"thumbborder\" /></a>");
}
@Test public void Cls_custom() {
fxt.Test_parse_page_wiki_str
( "[[File:A.png|class=abc]]"
, "<a href=\"/wiki/File:A.png\" class=\"image\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" class=\"abc\" /></a>");
}
@Test public void Cls_border_custom() {
fxt.Test_parse_page_wiki_str
( "[[File:A.png|border|class=abc]]"
, "<a href=\"/wiki/File:A.png\" class=\"image\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" class=\"thumbborder;abc\" /></a>");
}
@Test public void Lnki_full_svg() {
fxt.Test_parse_page_wiki_str

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.html.modules.popups; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*;
public class Xow_popup_itm implements Cancelable {
public Xow_popup_itm(int id, byte[] page_href, byte[] tooltip, int init_words_needed) {
this.popup_id = "popup_" + Int_.XtoStr(id);
this.popup_id = "popup_" + Int_.Xto_str(id);
this.words_needed = init_words_needed;
this.page_href = page_href;
this.tooltip = tooltip;

View File

@@ -43,7 +43,7 @@ public class Xoa_available_wikis_mgr implements GfoInvkAble {
else if (ctx.Match(k, Invk_itms_refresh)) Itms_reset();
else if (ctx.Match(k, Invk_visible)) return Yn.Xto_str(visible);
else if (ctx.Match(k, Invk_visible_)) visible = m.ReadYn("v");
else if (ctx.Match(k, Invk_visible_toggle)) {visible = !visible; app.Gui_mgr().Browser_win().Active_html_box().Html_js_eval_proc("xowa-portal-wikis-visible-toggle", Bool_.XtoStr_lower(visible));}
else if (ctx.Match(k, Invk_visible_toggle)) {visible = !visible; app.Gui_mgr().Browser_win().Active_html_box().Html_js_eval_proc("xowa-portal-wikis-visible-toggle", Bool_.Xto_str_lower(visible));}
else if (ctx.Match(k, Invk_itms_as_html_fmtr_)) itms_as_html_fmtr.Fmt_(m.ReadBry("v"));
else return GfoInvkAble_.Rv_unhandled;
return this;

View File

@@ -21,8 +21,13 @@ public class Xoh_subpages_bldr implements Bry_fmtr_arg {
private Bry_bfr tmp_bfr = Bry_bfr.reset_(255), ttl_bfr = Bry_bfr.reset_(255);
private byte[][] segs;
public Xoh_subpages_bldr(Xoa_app app) {this.app = app;}
public byte[] Bld(Xoa_ttl ttl) {
if (!(ttl.Ns().Subpages_enabled() && ttl.Leaf_bgn() != Bry_.NotFound)) return Bry_.Empty; // only continue if ns has subpages and ttl has leaf; EX:Help:A/B
public byte[] Bld(Xow_ns_mgr ns_mgr, Xoa_ttl ttl) {
Xow_ns ns = ttl.Ns();
if (! ( ns.Subpages_enabled() // ns has subpages
&& ttl.Leaf_bgn() != Bry_.NotFound // ttl has leaf text; EX: Help:A/B
&& ns.Id() != ns_mgr.Ns_page_id() // ns is not [[Page:]]; PAGE:en.s:Notes_on_Osteology_of_Baptanodon._With_a_Description_of_a_New_Species DATE:2014-09-06
)
) return Bry_.Empty; // doesn't match above; return empty;
byte[] raw = ttl.Raw();
this.segs = Bry_.Split(raw, Byte_ascii.Slash);
fmtr_grp.Bld_bfr(tmp_bfr, this);

View File

@@ -27,10 +27,16 @@ public class Xoh_subpages_bldr_tst {
, "</span>"
));
}
@Test public void Skip_page() {
fxt.Wiki().Ns_mgr().Add_new(104, "Page");
fxt.Wiki().Ns_mgr().Ns_page_id_(104);
fxt.Test_bld("Page:A/B/C", "");
}
}
class Xoh_subpages_bldr_fxt {
private Xoa_app app; private Xow_wiki wiki;
private Xoa_app app;
private Xoh_subpages_bldr subpages_bldr;
public Xow_wiki Wiki() {return wiki;} private Xow_wiki wiki;
public void Init() {
this.app = Xoa_app_fxt.app_();
this.wiki = Xoa_app_fxt.wiki_tst_(app);
@@ -38,7 +44,7 @@ class Xoh_subpages_bldr_fxt {
this.subpages_bldr = new Xoh_subpages_bldr(app);
}
public void Test_bld(String ttl_str, String expd) {
byte[] actl = subpages_bldr.Bld(Xoa_ttl.parse_(wiki, Bry_.new_utf8_(ttl_str)));
byte[] actl = subpages_bldr.Bld(wiki.Ns_mgr(), Xoa_ttl.parse_(wiki, Bry_.new_utf8_(ttl_str)));
Tfds.Eq_str_lines(expd, String_.new_utf8_(actl));
}
}

View File

@@ -34,8 +34,9 @@ public class Xow_portal_mgr implements GfoInvkAble {
api_skin = app.Mode() == Xoa_app_.Mode_gui ? skins.Desktop() : skins.Server();
}
public Xowh_sidebar_mgr Sidebar_mgr() {return sidebar_mgr;} private Xowh_sidebar_mgr sidebar_mgr;
public Bry_fmtr Div_home_fmtr() {return div_home_fmtr;} Bry_fmtr div_home_fmtr = Bry_fmtr.new_("");
public Bry_fmtr Div_home_fmtr() {return div_home_fmtr;} private Bry_fmtr div_home_fmtr = Bry_fmtr.new_("");
public Xow_portal_mgr Init_assert() {if (init_needed) Init(); return this;}
public byte[] Div_jump_to() {return div_jump_to;} private byte[] div_jump_to = Bry_.Empty;
public void Init() {
init_needed = false;
if (missing_ns_cls == null) // if missing_ns_cls not set for wiki, use the home wiki's
@@ -50,6 +51,8 @@ public class Xow_portal_mgr implements GfoInvkAble {
div_logo_bry = Init_fmtr(tmp_bfr, eval_mgr, div_logo_fmtr, main_page_href_bry, wiki.App().Encoder_mgr().Fsys().Encode_http(wiki.App().User().Fsys_mgr().Wiki_root_dir().GenSubFil_nest(wiki.Domain_str(), "html", "logo.png")));
div_home_bry = Init_fmtr(tmp_bfr, eval_mgr, div_home_fmtr);
div_wikis_fmtr.Eval_mgr_(eval_mgr);
Xow_msg_mgr msg_mgr = wiki.Msg_mgr();
div_jump_to = Div_jump_to_fmtr.Bld_bry_many(tmp_bfr, msg_mgr.Val_by_key_obj("jumpto"), msg_mgr.Val_by_key_obj("jumptonavigation"), msg_mgr.Val_by_key_obj("comma-separator"), msg_mgr.Val_by_key_obj("jumptosearch"));
tmp_bfr.Mkr_rls();
sidebar_mgr.Init();
} private boolean init_needed = true;
@@ -127,4 +130,7 @@ public class Xow_portal_mgr implements GfoInvkAble {
public static final String Invk_div_logo_ = "div_logo_";
private static KeyVal[] Options_missing_ns_cls_list = KeyVal_.Ary(KeyVal_.new_("", "Show as blue link"), KeyVal_.new_("new", "Show as red link"), KeyVal_.new_("xowa_display_none", "Hide"));
private static final byte[] Missing_ns_cls_hide = Bry_.new_ascii_("xowa_display_none");
private static final Bry_fmtr Div_jump_to_fmtr = Bry_fmtr.new_
( "\n <div id=\"jump-to-nav\" class=\"mw-jump\">~{jumpto}<a href=\"#mw-navigation\">~{jumptonavigation}</a>~{comma-separator}<a href=\"#p-search\">~{jumptosearch}</a></div>"
, "jumpto", "jumptonavigation", "comma-separator", "jumptosearch");
}

View File

@@ -1107,7 +1107,7 @@ public class Xol_case_mgr_ {
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(199,136), Bry_.ints_(199,137)) // Lj -> lj -- LATIN LETTER CAPITAL L SMALL J
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(199,139), Bry_.ints_(199,140)) // Nj -> nj -- LATIN LETTER CAPITAL N SMALL J
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(199,178), Bry_.ints_(199,179)) // Dz -> dz -- LATIN CAPITAL LETTER D WITH SMALL LETTER Z
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(206,185), Bry_.ints_(206,153)) // ι -> Ι -- GREEK CAPITAL LETTER IOTA
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(206,153), Bry_.ints_(206,185)) // Ι -> ι -- GREEK CAPITAL LETTER IOTA; NOTE: reversed; PAGE:en.d:ἀρχιερεύς DATE:2014-09-02
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(207,180), Bry_.ints_(206,184)) // ϴ -> θ -- GREEK CAPITAL THETA SYMBOL
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(225,186,158), Bry_.ints_(195,159)) // ẞ -> ß -- LATIN CAPITAL LETTER SHARP S
, Xol_case_itm_.new_(Xol_case_itm_.Tid_lower, Bry_.ints_(226,132,166), Bry_.ints_(207,137)) // Ω -> ω -- OHM

View File

@@ -37,6 +37,7 @@ public class Xol_case_mgr_tst {
fxt.Test_reuse_1st_upper("Abc");
fxt.Test_reuse_1st_upper("é", "É");
fxt.Test_reuse_1st_upper("É");
fxt.Lower("Ι", "ι"); // PURPOSE:test reversal; PAGE:en.d:ἀρχιερεύς DATE:2014-09-02
}
// @Test public void Hack() {
// Xol_case_itm[] ary = Xol_case_mgr_.Utf_8;
@@ -92,7 +93,7 @@ class Xol_case_mgr_fxt {
int ary_len = ary.length;
for (int i = 0; i < ary_len; i++) {
Xol_case_itm itm = ary[i];
sb.Add(Byte_.XtoStr(itm.Tid())).Add_char_pipe().Add(String_.new_utf8_(itm.Src_ary())).Add_char_pipe().Add(String_.new_utf8_(itm.Trg_ary())).Add_char_nl();
sb.Add(Byte_.Xto_str(itm.Tid())).Add_char_pipe().Add(String_.new_utf8_(itm.Src_ary())).Add_char_pipe().Add(String_.new_utf8_(itm.Trg_ary())).Add_char_nl();
}
return sb.XtoStrAndClear();
}

View File

@@ -54,7 +54,7 @@ public class Xol_num_fmtr_base implements GfoInvkAble {
}
return tmp.XtoAryAndClear();
}
public byte[] Fmt(int val) {return Fmt(Bry_.new_ascii_(Int_.XtoStr(val)));}
public byte[] Fmt(int val) {return Fmt(Bry_.new_ascii_(Int_.Xto_str(val)));}
public byte[] Fmt(byte[] src) { // SEE: DOC_1:Fmt
int src_len = src.length;
int num_bgn = -1, dec_pos = -1;

View File

@@ -31,7 +31,7 @@ public class Xol_num_mgr implements GfoInvkAble {
return num;
}
public byte[] Format_num_no_separators(byte[] num) {return Format_num(num, true);}
public byte[] Format_num(int val) {return Format_num(Bry_.new_ascii_(Int_.XtoStr(val)));}
public byte[] Format_num(int val) {return Format_num(Bry_.new_ascii_(Int_.Xto_str(val)));}
public byte[] Format_num(byte[] num) {return Format_num(num, false);}
public byte[] Format_num(byte[] num, boolean skip_commafy) {
if (!skip_commafy) {

View File

@@ -125,7 +125,7 @@ public class Xop_apos_wkr_tst {
@Test public void Apos_broken_by_tblw_th() { // DATE:2013-04-24
fxt.Test_parse_page_all_str("A ''[[b!!]]'' c", "A <i><a href=\"/wiki/B!!\">b!!</a></i> c");
}
@Test public void Nowiki() { // EX:en.w:Wiki; DATE:2013-05-13
@Test public void Nowiki() { // PAGE:en.w:Wiki; DATE:2013-05-13
fxt.Test_parse_page_all_str("<nowiki>''a''</nowiki>", "&#39;&#39;a&#39;&#39;");
}
@Test public void Lnki_multi_line() { // PURPOSE: handle apos within multi-line lnki caption; DATE:2013-11-10

View File

@@ -45,12 +45,6 @@ public class Xop_list_wkr implements Xop_ctx_wkr {
cur_pos = SymAry_fill(src, cur_pos, src_len, symByt);
symByt = src[cur_pos - 1]; // NOTE: get symByt again b/c cur_pos may have changed; EX: "#*"; # may have triggered list, but last symByt should be *
if (SymAry_fill_overflow) return ctx.Lxr_make_txt_(cur_pos);
int trim_line_end = Trim_empty_item(src, src_len, cur_pos);
if (trim_line_end != Bry_.NotFound) {
curSymLen = prvSymLen;
ctx.Tkn_mkr().Ignore(bgn_pos, trim_line_end, Xop_ignore_tkn.Ignore_tid_empty_li);
return trim_line_end;
}
PrvItm_compare();
ctx.Para().Process_block__bgn__nl_w_symbol(ctx, root, src, bgn_pos, cur_pos - 1, Xop_xnde_tag_.Tag_li); // -1 b/c cur_pos includes sym_byte; EX: \n*; pass li; should pass correct tag, but for purposes of para_wkr, <li> doesn't matter
if (prvSymMatch) {
@@ -108,21 +102,6 @@ public class Xop_list_wkr implements Xop_ctx_wkr {
// if (empty_ignored) ctx.Empty_ignore(root, bgn.Tkn_sub_idx()); // commented; code was incorrectly deactivating "*a" when "<li>" encountered; PAGE:en.w:Bristol_Bullfinch DATE:2014-06-24
ctx.Para().Process_block__bgn_n__end_y(Xop_xnde_tag_.Tag_ul);
}
private int Trim_empty_item(byte[] src, int src_len, int pos) {
while (pos < src_len) {
byte b = src[pos];
switch (b) {
case Byte_ascii.Tab: case Byte_ascii.CarriageReturn: case Byte_ascii.Space:
++pos;
break;
case Byte_ascii.NewLine:
return pos;
default:
return Bry_.NotFound;
}
}
return Bry_.NotFound;
}
private Xop_list_tkn PopTil(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, byte subLast) {
int acs_pos = ctx.Stack_idx_find_but_stop_at_tbl(Xop_tkn_itm_.Tid_list);
if (acs_pos == -1) return null;

View File

@@ -22,144 +22,150 @@ public class Xop_list_wkr_uncommon_tst {
@After public void term() {fxt.Init_para_n_();}
@Test public void Bug_specified_div() { // FIX: </div> was not clearing state for lnki; PAGE:en.w:Ananke (moon)
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( "<div>"
, "#<i>a"
, "</div>"
, "*b"
) , String_.Concat_lines_nl_skip_last
( "<div>"
, "<ol>"
, " <li><i>a"
, "</i>"
, " </li>"
, "</ol></div>"
, "<ul>"
, " <li>b"
, " </li>"
, "</ul>"
));
( "<div>"
, "#<i>a"
, "</div>"
, "*b"
), String_.Concat_lines_nl_skip_last
( "<div>"
, "<ol>"
, " <li><i>a"
, "</i>"
, " </li>"
, "</ol></div>"
, "<ul>"
, " <li>b"
, " </li>"
, "</ul>"
));
}
@Test public void Bug_mismatched() { // FIX: </div> was not clearing state for lnki; PAGE:en.w:Ananke (moon)
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( "::a"
, ":::1"
, "::::11"
, ":::::111"
, "::b"
) , String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dd>"
, " <dl>"
, " <dd>a"
, " <dl>"
, " <dd>1"
, " <dl>"
, " <dd>11"
, " <dl>"
, " <dd>111"
, " </dd>"
, " </dl>"
, " </dd>"
, " </dl>"
, " </dd>"
, " </dl>"
, " </dd>"
, " <dd>b"
, " </dd>"
, " </dl>"
, " </dd>"
, "</dl>"
));
( "::a"
, ":::1"
, "::::11"
, ":::::111"
, "::b"
), String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dd>"
, " <dl>"
, " <dd>a"
, " <dl>"
, " <dd>1"
, " <dl>"
, " <dd>11"
, " <dl>"
, " <dd>111"
, " </dd>"
, " </dl>"
, " </dd>"
, " </dl>"
, " </dd>"
, " </dl>"
, " </dd>"
, " <dd>b"
, " </dd>"
, " </dl>"
, " </dd>"
, "</dl>"
));
}
@Test public void Empty_li_ignored() { // PURPOSE: inner template can cause dupe li; PAGE:en.w:any Calendar day and NYT link; EX: 1/1
@Test public void Empty_li_ignored() { // PURPOSE: inner template can cause dupe li; PAGE:en.w:any Calendar day and NYT link; NOTE:deactivated prune_empty_list logic; DATE:2014-09-05
fxt.Init_para_y_();
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( "*a"
, "* "
, "*b"
, "*c"
) , String_.Concat_lines_nl_skip_last
( "<ul>"
, " <li>a"
, " </li>"
, " <li>b"
, " </li>"
, " <li>c"
, " </li>"
, "</ul>"
, ""
));
( "*a"
, "* "
, "*b"
, "*c"
), String_.Concat_lines_nl_skip_last
( "<ul>"
, " <li>a"
, " </li>"
, " <li> "
, " </li>"
, " <li>b"
, " </li>"
, " <li>c"
, " </li>"
, "</ul>"
, ""
));
fxt.Init_para_n_();
}
@Test public void List_in_tblw() { // PURPOSE: list inside table should not be close outer list; PAGE:en.w:Cato the Elder
fxt.Init_para_y_();
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( "*a"
, "{|"
, "|b"
, "::c"
, "|}"
) , String_.Concat_lines_nl_skip_last
( "<ul>"
, " <li>a"
, " </li>"
, "</ul>"
, "<table>"
, " <tr>"
, " <td>b"
, ""
, " <dl>"
, " <dd>"
, " <dl>"
, " <dd>c"
, " </dd>"
, " </dl>"
, " </dd>"
, " </dl>"
, " </td>"
, " </tr>"
, "</table>"
, ""
));
( "*a"
, "{|"
, "|b"
, "::c"
, "|}"
), String_.Concat_lines_nl_skip_last
( "<ul>"
, " <li>a"
, " </li>"
, "</ul>"
, "<table>"
, " <tr>"
, " <td>b"
, ""
, " <dl>"
, " <dd>"
, " <dl>"
, " <dd>c"
, " </dd>"
, " </dl>"
, " </dd>"
, " </dl>"
, " </td>"
, " </tr>"
, "</table>"
, ""
));
fxt.Init_para_n_();
}
@Test public void Dt_dd_colon_at_eol() { // PURPOSE: dangling ":" should not put next line in <dt>; PAGE:en.w:Stein; b was being wrapped in <dt>b</dt>
@Test public void Dt_dd_colon_at_eol() { // PURPOSE: dangling ":" should not put next line in <dt>; PAGE:en.w:Stein; b was being wrapped in <dt>b</dt>; NOTE:deactivated prune_empty_list logic; DATE:2014-09-05
fxt.Init_para_y_();
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( ";a:"
, "*b"
, ""
, ";c"
, "*d"
) , String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dt>a"
, " </dt>"
, "</dl>"
, "<ul>"
, " <li>b"
, " </li>"
, "</ul>"
, ""
, "<dl>"
, " <dt>c"
, " </dt>"
, "</dl>"
, "<ul>"
, " <li>d"
, " </li>"
, "</ul>"
, ""
));
( ";a:"
, "*b"
, ""
, ";c"
, "*d"
), String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dt>a"
, " </dt>"
, " <dd>"
, " </dd>"
, "</dl>"
, "<ul>"
, " <li>b"
, " </li>"
, "</ul>"
, ""
, "<dl>"
, " <dt>c"
, " </dt>"
, "</dl>"
, "<ul>"
, " <li>d"
, " </li>"
, "</ul>"
, ""
));
fxt.Init_para_n_();
}
@Test public void Dd_should_not_print_colon() {// PURPOSE: ;a:\n should show as ";a" not ";a:". colon should still be considered as part of empty list; DATE:2013-11-07
@Test public void Dd_should_not_print_colon() {// PURPOSE: ;a:\n should show as ";a" not ";a:". colon should still be considered as part of empty list; DATE:2013-11-07; NOTE:deactivated prune_empty_list logic; DATE:2014-09-05
fxt.Test_parse_page_all_str
( ";a:\nb"
, String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dt>a"
, " </dt>"
, " <dd>"
, " </dd>"
, "</dl>"
, "b"
));
@@ -167,160 +173,170 @@ public class Xop_list_wkr_uncommon_tst {
@Test public void Dt_dd_colon_in_lnki() { // PURPOSE: "; [[Portal:a]]" should not split lnki; PAGE:en.w:Wikipedia:WikiProject Military history/Operation Majestic Titan; "; [[Wikipedia:WikiProject Military history/Operation Majestic Titan/Phase I|Phase I]]: a b"
fxt.Init_para_y_();
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( ";[[Portal:a]]"
) , String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dt><a href=\"/wiki/Portal:A\">Portal:A</a>"
, " </dt>"
, "</dl>"
, ""
));
( ";[[Portal:a]]"
), String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dt><a href=\"/wiki/Portal:A\">Portal:A</a>"
, " </dt>"
, "</dl>"
, ""
));
fxt.Init_para_n_();
}
@Test public void Max_list_depth() { // PURPOSE: 256+ * caused list parser to fail; ignore; PAGE:en.w:Bariatric surgery
String multiple = String_.Repeat("*", 300);
fxt.Test_parse_page_all_str(multiple
, String_.Concat_lines_nl_skip_last
( multiple
));
fxt.Test_parse_page_all_str(multiple, multiple);
}
@Test public void Numbered_list_resets_incorrectly() { // PURPOSE: as description
fxt.Init_para_y_();
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( "#A"
, "#*Aa"
, "#**Aaa"
, "#*Ab"
, "#B"
) , String_.Concat_lines_nl_skip_last
( "<ol>"
, " <li>A"
, ""
, " <ul>"
, " <li>Aa"
, ""
, " <ul>"
, " <li>Aaa"
, " </li>"
, " </ul>"
, " </li>"
, " <li>Ab"
, " </li>"
, " </ul>" // was showing as </ol>
, " </li>"
, " <li>B"
, " </li>"
, "</ol>"
, ""
));
( "#A"
, "#*Aa"
, "#**Aaa"
, "#*Ab"
, "#B"
), String_.Concat_lines_nl_skip_last
( "<ol>"
, " <li>A"
, ""
, " <ul>"
, " <li>Aa"
, ""
, " <ul>"
, " <li>Aaa"
, " </li>"
, " </ul>"
, " </li>"
, " <li>Ab"
, " </li>"
, " </ul>" // was showing as </ol>
, " </li>"
, " <li>B"
, " </li>"
, "</ol>"
, ""
));
fxt.Init_para_n_();
}
@Test public void List_should_not_end_indented_table() {// PURPOSE: :{| was being closed by \n*; EX:w:Maxwell's equations; DATE:20121231
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( ":{|"
, "|-"
, "|"
, "*a"
, "|b"
, "|}"
) , String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dd>"
, " <table>"
, " <tr>"
, " <td>"
, " <ul>"
, " <li>a"
, " </li>"
, " </ul>"
, " </td>"
, " <td>b"
, " </td>"
, " </tr>"
, " </table>"
, " </dd>"
, "</dl>"
));
( ":{|"
, "|-"
, "|"
, "*a"
, "|b"
, "|}"
), String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dd>"
, " <table>"
, " <tr>"
, " <td>"
, " <ul>"
, " <li>a"
, " </li>"
, " </ul>"
, " </td>"
, " <td>b"
, " </td>"
, " </tr>"
, " </table>"
, " </dd>"
, "</dl>"
));
}
@Test public void Dt_dd_broken_by_xnde() { // PURPOSE.fix: xnde was resetting dl incorrectly; EX:w:Virus; DATE:2013-01-31
fxt.Test_parse_page_all_str(";<b>a</b>:c"
, String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dt><b>a</b>"
, " </dt>"
, " <dd>c"
, " </dd>"
, "</dl>"
, String_.Concat_lines_nl_skip_last
( "<dl>"
, " <dt><b>a</b>"
, " </dt>"
, " <dd>c"
, " </dd>"
, "</dl>"
));
}
@Test public void Trim_empty_list_items() { // PURPOSE: empty list items should be ignored; DATE:2013-07-02
fxt.Test_parse_page_all_str("*** \n"
, String_.Concat_lines_nl_skip_last
( ""
@Test public void Trim_empty_list_items() { // PURPOSE: empty list items should be ignored; DATE:2013-07-02; NOTE:deactivated prune_empty_list logic; DATE:2014-09-05
fxt.Test_parse_page_all_str
("*** \n"
, String_.Concat_lines_nl_skip_last
( "<ul>"
, " <li>"
, " <ul>"
, " <li>"
, " <ul>"
, " <li> "
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, "</ul>"
, ""
));
}
@Test public void Trim_empty_list_items_error() { // PURPOSE.fix: do not add empty itm's nesting to current list; DATE:2013-07-07
@Test public void Trim_empty_list_items_error() { // PURPOSE.fix: do not add empty itm's nesting to current list; DATE:2013-07-07; NOTE:deactivated prune_empty_list logic; DATE:2014-09-05
fxt.Test_parse_page_all_str(String_.Concat_lines_nl
( "* a"
, "** " // do not add ** to nest
, "*** b"
, "* c"
) , String_.Concat_lines_nl
( "<ul>"
, " <li> a"
, " <ul>"
, " <li>"
, " <ul>"
, " <li> b"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " <li> c"
, " </li>"
, "</ul>"
( "* a"
, "** " // was: do not add ** to nest; now: add ** and \s
, "*** b"
, "* c"
), String_.Concat_lines_nl
( "<ul>"
, " <li> a"
, " <ul>"
, " <li> "
, " <ul>"
, " <li> b"
, " </li>"
, " </ul>"
, " </li>"
, " </ul>"
, " </li>"
, " <li> c"
, " </li>"
, "</ul>"
));
}
@Test public void Tblw_should_autoclose() {// PURPOSE: tblw should auto-close open list
fxt.Test_parse_page_all_str(String_.Concat_lines_nl_skip_last
( "#a"
, "{|"
, "|b"
, "|}"
) , String_.Concat_lines_nl_skip_last
( "<ol>"
, " <li>a"
, " </li>"
, "</ol>"
, "<table>"
, " <tr>"
, " <td>b"
, " </td>"
, " </tr>"
, "</table>"
, ""
( "#a"
, "{|"
, "|b"
, "|}"
), String_.Concat_lines_nl_skip_last
( "<ol>"
, " <li>a"
, " </li>"
, "</ol>"
, "<table>"
, " <tr>"
, " <td>b"
, " </td>"
, " </tr>"
, "</table>"
, ""
));
}
@Test public void Tblx_should_not_autoclose() { // PURPOSE: do not auto-close list if table is xnde; DATE:2014-02-05
fxt.Test_parse_page_all_str(String_.Concat_lines_nl
( "#a"
, "# <table><tr><td>b</td></tr></table>"
, "c"
) , String_.Concat_lines_nl
( "<ol>"
, " <li>a"
, " </li>"
, " <li> "
, " <table>"
, " <tr>"
, " <td>b"
, " </td>"
, " </tr>"
, " </table>"
, " </li>"
, "</ol>"
, "c"
( "#a"
, "# <table><tr><td>b</td></tr></table>"
, "c"
), String_.Concat_lines_nl
( "<ol>"
, " <li>a"
, " </li>"
, " <li> "
, " <table>"
, " <tr>"
, " <td>b"
, " </td>"
, " </tr>"
, " </table>"
, " </li>"
, "</ol>"
, "c"
));
}
@Test public void Li_disappears() { // PURPOSE: "\n*" disappears when followed by "<li>"; PAGE:en.w:Bristol_Bullfinch; DATE:2014-06-24

View File

@@ -38,71 +38,73 @@ public class Xop_lnki_logger_redlinks_wkr implements GfoInvkAble {
return this;
} public static final String Invk_run = "run";
public void Redlink() {
ListAdp work_list = ListAdp_.new_();
OrderedHash page_hash = OrderedHash_.new_bry_();
page_hash.Clear(); // NOTE: do not clear in Page_bgn, else will fail b/c of threading; EX: Open Page -> Preview -> Save; DATE:2013-11-17
work_list.Clear();
int len = lnki_list.Count();
if (log_enabled) usr_dlg.Log_many("", "", "redlink.redlink_bgn: page=~{0} total_links=~{1}", String_.new_utf8_(page.Ttl().Raw()), len);
for (int i = 0; i < len; i++) { // make a copy of list else thread issues
if (win.Usr_dlg().Canceled()) return;
if (redlinks_mgr.Request_idx() != request_idx) return;
work_list.Add(lnki_list.FetchAt(i));
}
for (int i = 0; i < len; i++) {
if (win.Usr_dlg().Canceled()) return;
if (redlinks_mgr.Request_idx() != request_idx) return;
Xop_lnki_tkn lnki = (Xop_lnki_tkn)work_list.FetchAt(i);
Xoa_ttl ttl = lnki.Ttl();
Xodb_page db_page = new Xodb_page().Ttl_(ttl);
byte[] full_txt = ttl.Full_db();
if (!page_hash.Has(full_txt))
page_hash.Add(full_txt, db_page);
}
int page_len = page_hash.Count();
for (int i = 0; i < page_len; i += Batch_size) {
if (win.Usr_dlg().Canceled()) return;
if (redlinks_mgr.Request_idx() != request_idx) return;
int end = i + Batch_size;
if (end > page_len) end = page_len;
wiki.Db_mgr().Load_mgr().Load_by_ttls(win.Usr_dlg(), page_hash, Xodb_page_tbl.Load_idx_flds_only_y, i, end);
}
redlink_count = 0;
Bry_bfr bfr = null;
boolean variants_enabled = wiki.Lang().Vnt_mgr().Enabled();
Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr();
Int_list redlink_mgr = page.Html_data().Redlink_mgr();
for (int j = 0; j < len; j++) {
Xop_lnki_tkn lnki = (Xop_lnki_tkn)work_list.FetchAt(j);
byte[] full_db = lnki.Ttl().Full_db();
Xodb_page db_page = (Xodb_page)page_hash.Fetch(full_db);
if (db_page == null) continue; // pages shouldn't be null, but just in case
if (!db_page.Exists()) {
String lnki_id = Xop_lnki_logger_redlinks_mgr.Lnki_id_prefix + Int_.XtoStr(lnki.Html_id());
if (variants_enabled) {
Xodb_page vnt_page = vnt_mgr.Convert_ttl(wiki, lnki.Ttl());
if (vnt_page != null) {
Xoa_ttl vnt_ttl = Xoa_ttl.parse_(wiki, lnki.Ttl().Ns().Id(), vnt_page.Ttl_wo_ns());
html_itm.Html_atr_set(lnki_id, "href", "/wiki/" + String_.new_utf8_(vnt_ttl.Full_url()));
if (!String_.Eq(vnt_mgr.Html_style(), ""))
html_itm.Html_atr_set(lnki_id, "style", vnt_mgr.Html_style());
continue;
}
}
if (log_enabled) {
if (bfr == null) bfr = Bry_bfr.new_();
bfr.Add_int_variable(lnki.Html_id()).Add_byte_pipe().Add(Xop_tkn_.Lnki_bgn).Add(full_db).Add(Xop_tkn_.Lnki_end).Add_byte(Byte_ascii.Semic).Add_byte_space();
}
synchronized (this) { // NOTE: attempt to eliminate random IndexBounds errors; DATE:2014-09-02
ListAdp work_list = ListAdp_.new_();
OrderedHash page_hash = OrderedHash_.new_bry_();
page_hash.Clear(); // NOTE: do not clear in Page_bgn, else will fail b/c of threading; EX: Open Page -> Preview -> Save; DATE:2013-11-17
work_list.Clear();
int len = lnki_list.Count();
if (log_enabled) usr_dlg.Log_many("", "", "redlink.redlink_bgn: page=~{0} total_links=~{1}", String_.new_utf8_(page.Ttl().Raw()), len);
for (int i = 0; i < len; i++) { // make a copy of list else thread issues
if (win.Usr_dlg().Canceled()) return;
if (redlinks_mgr.Request_idx() != request_idx) return;
int uid = lnki.Html_id();
gplx.xowa.files.gui.Js_img_mgr.Update_link_missing(html_itm, Xop_lnki_logger_redlinks_mgr.Lnki_id_prefix + Int_.XtoStr(uid));
redlink_mgr.Add(uid);
++redlink_count;
work_list.Add(lnki_list.FetchAt(i));
}
for (int i = 0; i < len; i++) {
if (win.Usr_dlg().Canceled()) return;
if (redlinks_mgr.Request_idx() != request_idx) return;
Xop_lnki_tkn lnki = (Xop_lnki_tkn)work_list.FetchAt(i);
Xoa_ttl ttl = lnki.Ttl();
Xodb_page db_page = new Xodb_page().Ttl_(ttl);
byte[] full_txt = ttl.Full_db();
if (!page_hash.Has(full_txt))
page_hash.Add(full_txt, db_page);
}
int page_len = page_hash.Count();
for (int i = 0; i < page_len; i += Batch_size) {
if (win.Usr_dlg().Canceled()) return;
if (redlinks_mgr.Request_idx() != request_idx) return;
int end = i + Batch_size;
if (end > page_len) end = page_len;
wiki.Db_mgr().Load_mgr().Load_by_ttls(win.Usr_dlg(), page_hash, Xodb_page_tbl.Load_idx_flds_only_y, i, end);
}
redlink_count = 0;
Bry_bfr bfr = null;
boolean variants_enabled = wiki.Lang().Vnt_mgr().Enabled();
Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr();
Int_list redlink_mgr = page.Html_data().Redlink_mgr();
for (int j = 0; j < len; j++) {
Xop_lnki_tkn lnki = (Xop_lnki_tkn)work_list.FetchAt(j);
byte[] full_db = lnki.Ttl().Full_db();
Xodb_page db_page = (Xodb_page)page_hash.Fetch(full_db);
if (db_page == null) continue; // pages shouldn't be null, but just in case
if (!db_page.Exists()) {
String lnki_id = Xop_lnki_logger_redlinks_mgr.Lnki_id_prefix + Int_.Xto_str(lnki.Html_id());
if (variants_enabled) {
Xodb_page vnt_page = vnt_mgr.Convert_ttl(wiki, lnki.Ttl());
if (vnt_page != null) {
Xoa_ttl vnt_ttl = Xoa_ttl.parse_(wiki, lnki.Ttl().Ns().Id(), vnt_page.Ttl_wo_ns());
html_itm.Html_atr_set(lnki_id, "href", "/wiki/" + String_.new_utf8_(vnt_ttl.Full_url()));
if (!String_.Eq(vnt_mgr.Html_style(), ""))
html_itm.Html_atr_set(lnki_id, "style", vnt_mgr.Html_style());
continue;
}
}
if (log_enabled) {
if (bfr == null) bfr = Bry_bfr.new_();
bfr.Add_int_variable(lnki.Html_id()).Add_byte_pipe().Add(Xop_tkn_.Lnki_bgn).Add(full_db).Add(Xop_tkn_.Lnki_end).Add_byte(Byte_ascii.Semic).Add_byte_space();
}
if (win.Usr_dlg().Canceled()) return;
if (redlinks_mgr.Request_idx() != request_idx) return;
int uid = lnki.Html_id();
gplx.xowa.files.gui.Js_img_mgr.Update_link_missing(html_itm, Xop_lnki_logger_redlinks_mgr.Lnki_id_prefix + Int_.Xto_str(uid));
redlink_mgr.Add(uid);
++redlink_count;
}
}
if (log_enabled)
usr_dlg.Log_many("", "", "redlink.redlink_end: redlinks_run=~{0} links=~{1}", redlink_count, bfr == null ? String_.Empty : bfr.XtoStrAndClear());
}
if (log_enabled)
usr_dlg.Log_many("", "", "redlink.redlink_end: redlinks_run=~{0} links=~{1}", redlink_count, bfr == null ? String_.Empty : bfr.XtoStrAndClear());
}
public static final Xop_lnki_logger_redlinks_wkr Null = new Xop_lnki_logger_redlinks_wkr(); Xop_lnki_logger_redlinks_wkr() {}
private static final int Batch_size = 32;

View File

@@ -59,7 +59,7 @@ public class Xop_log_mgr implements GfoInvkAble {
public void Txn_end() {provider.Txn_mgr().Txn_end_all();}
public void Rls() {
if (log_tbl != null) log_tbl.Rls();
if (provider != null) {provider.Rls(); provider = null;}
if (provider != null) {provider.Conn_term(); provider = null;}
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_commit_interval_)) commit_interval = m.ReadInt("v");

View File

@@ -129,7 +129,7 @@ public class Http_server_mgr implements GfoInvkAble {
if (wkr == null)
wkr = new Http_server_wkr(this, port);
new Thread(wkr, "thread:xowa.http_server").start();
Note("HTTP Server started: Navigate to http://localhost:" + Int_.XtoStr(port));
Note("HTTP Server started: Navigate to http://localhost:" + Int_.Xto_str(port));
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_port)) return port;

View File

@@ -26,7 +26,7 @@ public class Xosrv_msg_rdr {
if (bytes_read == -1) return Xosrv_msg.Exit; // stream closed; should only occur when shutting down
else return Xosrv_msg.fail_("header is invalid; hdr:{0}", String_.new_utf8_(header_bry, 0, bytes_read));
}
byte version = header_bry[0]; if (version != Byte_ascii.Num_0) return Xosrv_msg.fail_("version must be 0; version:{0}", Byte_.XtoStr(version));
byte version = header_bry[0]; if (version != Byte_ascii.Num_0) return Xosrv_msg.fail_("version must be 0; version:{0}", Byte_.Xto_str(version));
int body_len = Bry_.Xto_int_or(header_bry, 2, 12, -1); if (body_len == -1) return Xosrv_msg.fail_("body_len is not number; body_len:{0}", String_.new_utf8_(header_bry, 2, 23));
int cksum = Bry_.Xto_int_or(header_bry, 13, 23, -1); if (cksum == -1) return Xosrv_msg.fail_("checksum is not number; cksum:{0}", String_.new_utf8_(header_bry, 13, 23));
if (!Chk_bytes(header_bry, Byte_ascii.Pipe, 1, 12, 23)) return Xosrv_msg.fail_("message should be delimited by pipes at 1, 12 and 23; message:{0}", String_.new_utf8_(header_bry, 0, 24));

View File

@@ -25,7 +25,7 @@ public class Xosrv_server implements GfoInvkAble {
public int Wtr_port() {return wtr_port;} public Xosrv_server Wtr_port_(int v) {wtr_port = v; return this;} private int wtr_port = 55001;
public int Shutdown_interval() {return shutdown_interval;} public Xosrv_server Shutdown_interval_(int v) {shutdown_interval = v; return this;} private int shutdown_interval = -1;
public String Wtr_host() {return wtr_host;} private String wtr_host = "localhost";
public boolean Running() {return running;} public Xosrv_server Running_(boolean v) {running = v; running_str = Bool_.XtoStr_lower(running); return this;} private boolean running = false;
public boolean Running() {return running;} public Xosrv_server Running_(boolean v) {running = v; running_str = Bool_.Xto_str_lower(running); return this;} private boolean running = false;
public String Running_str() {return running_str;} String running_str = "false";
public void App_ctor(Xoa_app app) {this.app = app;}
public Xoa_app App() {return app;} private Xoa_app app;

View File

@@ -106,7 +106,7 @@ class Wmf_dump_list_parser_fxt {
private Wmf_dump_list_parser parser = new Wmf_dump_list_parser();
public String itm(String wiki_abrv, String dump_date, byte status_done, String status_msg, String status_time) {
return String_.Concat_with_str("\n", wiki_abrv, dump_date
, Byte_.XtoStr(status_done)
, Byte_.Xto_str(status_done)
, status_msg
, status_time
);
@@ -126,7 +126,7 @@ class Wmf_dump_list_parser_fxt {
DateAdp status_time = itm.Status_time();
String status_time_str = status_time == null ? "" : status_time.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time);
return String_.Concat_with_str("\n", String_.new_ascii_(itm.Wiki_abrv()), itm.Dump_date().XtoStr_fmt("yyyyMMdd")
, Byte_.XtoStr(itm.Status_tid())
, Byte_.Xto_str(itm.Status_tid())
, String_.new_ascii_(itm.Status_msg())
, status_time_str
);

View File

@@ -34,7 +34,7 @@ public class Xow_maint_mgr implements GfoInvkAble {
} private DateAdp wiki_dump_date;
public boolean Wiki_update_needed() {
if (this.Wiki_dump_date() == null) return false; // will be null if a custom wiki (i.e.: not on http://dumps.wikimedia.org/backup-index.html)
return this.Wmf_dump_date().Diff(this.Wiki_dump_date()).Total_days().XtoDouble() > 1;
return this.Wmf_dump_date().Diff(this.Wiki_dump_date()).Total_days().Xto_double() > 1;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_wmf_dump_date)) return DateAdp_.Xto_str_fmt_or(Wmf_dump_date(), "yyyy-MM-dd", "");

View File

@@ -108,7 +108,7 @@ class Xop_statistics_stats_ns_itm implements Bry_fmtr_arg {
class Xop_statistics_stats_wiki_grp implements Bry_fmtr_arg {
public void Wiki_(Xow_wiki v) {this.wiki = v;} private Xow_wiki wiki;
public void XferAry(Bry_bfr bfr, int idx) {
fmtr_wiki.Bld_bfr_many(bfr, wiki.Db_mgr().Tid_name(), wiki.Fsys_mgr().Root_dir().Raw(), Byte_.XtoStr(wiki.Db_mgr().Category_version()), wiki.Maint_mgr().Wiki_dump_date().XtoStr_fmt_iso_8561());
fmtr_wiki.Bld_bfr_many(bfr, wiki.Db_mgr().Tid_name(), wiki.Fsys_mgr().Root_dir().Raw(), Byte_.Xto_str(wiki.Db_mgr().Category_version()), wiki.Maint_mgr().Wiki_dump_date().XtoStr_fmt_iso_8561());
}
private Bry_fmtr fmtr_wiki = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( ""

Some files were not shown because too many files have changed in this diff Show More