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
2015-06-14 21:52:10 -04:00
parent 51e6188c1e
commit fe0ce6340d
159 changed files with 1381 additions and 483 deletions

View File

@@ -16,20 +16,25 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.xowa.*; import gplx.xowa.wikis.data.*;
import gplx.dbs.*; import gplx.xowa.*; import gplx.xowa.wikis.data.*; import gplx.fsdb.meta.*;
public class Fsdb_db_mgr_ {
public static Fsdb_db_mgr new_detect(Xow_wiki wiki, Io_url wiki_dir, Io_url file_dir) {
Gfo_usr_dlg usr_dlg = Xoa_app_.Usr_dlg();
Io_url url = file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name); // EX: /xowa/file/en.wikipedia.org/wiki.mnt.sqlite3
if (Db_conn_bldr.I.Exists(url)) { // NOTE: check v1 before v2; note that as of v2.5.4, v2 files are automatically created on new import; DATE:2015-06-09
usr_dlg.Log_many("", "", "fsdb.db_core.v1: url=~{0}", url.Raw());
usr_dlg.Log_many("", "", "fsdb.db_core.v1 exists: orig=~{0} abc=~{1} atr=~{2}"
, Db_conn_bldr.I.Exists(file_dir.GenSubFil(Fsdb_db_mgr__v1.Orig_name))
, Db_conn_bldr.I.Exists(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Fsdb_db_mgr__v1.Abc_name))
, Db_conn_bldr.I.Exists(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Fsdb_db_mgr__v1.Atr_name))
);
return new Fsdb_db_mgr__v1(file_dir);
}
String domain_str = wiki.Domain_str();
Fsdb_db_mgr rv = null;
rv = load_or_null(Xowd_db_layout.Itm_few, usr_dlg, wiki_dir, wiki, domain_str); if (rv != null) return rv;
rv = load_or_null(Xowd_db_layout.Itm_lot, usr_dlg, wiki_dir, wiki, domain_str); if (rv != null) return rv;
rv = load_or_null(Xowd_db_layout.Itm_all, usr_dlg, wiki_dir, wiki, domain_str); if (rv != null) return rv;
Io_url url = file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name); // EX: /xowa/file/en.wikipedia.org/wiki.mnt.sqlite3
if (Db_conn_bldr.I.Exists(url)) {
usr_dlg.Log_many("", "", "fsdb.db_core.v1: url=~{0}", url.Raw());
return new Fsdb_db_mgr__v1(file_dir);
}
usr_dlg.Log_many("", "", "fsdb.db_core.none: wiki_dir=~{0} file_dir=~{1}", wiki_dir.Raw(), file_dir.Raw());
return null;
}

View File

@@ -54,7 +54,7 @@ public class Fsd_bin_tbl implements RlsAble {
public Io_stream_rdr Select_as_rdr(int owner_id) {
byte[] rv = Select(owner_id);
return rv == null
? Io_stream_rdr_.Null
? Io_stream_rdr_.Noop
: Io_stream_rdr_.mem_(rv);
}
public boolean Select_to_url(int owner_id, Io_url url) {

View File

@@ -26,8 +26,9 @@ public class Fsm_mnt_mgr implements GfoInvkAble {
this.mnt_tbl = new Fsm_mnt_tbl (conn, db_core.File__schema_is_1());
this.mnt_ary = mnt_tbl.Select_all();
this.mnt_ary_len = mnt_ary.length;
for (int i = 0; i < mnt_ary_len; ++i)
for (int i = 0; i < mnt_ary_len; ++i) {
mnt_ary[i].Ctor_by_load(db_core);
}
this.insert_idx = cfg_tbl.Select_int(Cfg_grp_core, Cfg_key_mnt_insert_idx);
Db_cfg_hash cfg_hash = this.Mnts__get_main().Cfg_mgr().Grps_get_or_load(Xof_fsdb_mgr_cfg.Grp_xowa);
boolean use_thumb_w = cfg_hash.Get(Xof_fsdb_mgr_cfg.Key_upright_use_thumb_w).To_yn_or_n();

View File

@@ -24,6 +24,7 @@ public class Html_utl {
byte[] escaped = Escape_html_as_bry(tmp_bfr, key, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.Y);
return encoder_id.Encode(escaped);
}
public static String Escape_for_atr_val_as_str(Bry_bfr bfr, byte quote_byte, String s) {return String_.new_u8(Escape_for_atr_val_as_bry(bfr, quote_byte, s));}
public static byte[] Escape_for_atr_val_as_bry(Bry_bfr bfr, byte quote_byte, String s) {
if (s == null) return null;
return Escape_for_atr_val_as_bry(bfr, quote_byte, Bry_.new_u8(s));

View File

@@ -21,22 +21,25 @@ import gplx.xowa.apps.*; import gplx.xowa.apps.fsys.*;
import gplx.xowa.bldrs.css.*;
import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*;
import gplx.xowa.urls.encoders.*;
import gplx.xowa.wikis.*;
import gplx.xowa.wmfs.*;
import gplx.xowa.html.wtrs.*;
import gplx.xowa.users.*;
public interface Xoa_app {
Xoa_app_type App_type();
Xoa_fsys_mgr Fsys_mgr();
Xoa_wiki_mgr Wiki_mgri();
Xof_cache_mgr File__cache_mgr();
Xof_img_mgr File__img_mgr();
Io_download_fmt File__download_fmt();
Xowmf_mgr Wmf_mgr();
Gfo_usr_dlg Usr_dlg();
Bry_bfr_mkr Utl__bfr_mkr();
Url_encoder_mgr Utl__encoder_mgr();
Xoh_href_parser Html__href_parser();
Xoh_lnki_bldr Html__lnki_bldr();
Xoa_css_extractor Html__css_installer();
boolean Xwiki_mgr__missing(byte[] domain);
Xou_user User();
Xowmf_mgr Wmf_mgr();
boolean Xwiki_mgr__missing(byte[] domain);
Gfo_usr_dlg Usr_dlg();
Bry_bfr_mkr Utl__bfr_mkr();
Url_encoder_mgr Utl__encoder_mgr();
Xoa_url_parser Utl__url_parser();
}

View File

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

View File

@@ -45,7 +45,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
gui_mgr = new Xoa_gui_mgr(this);
bldr = new Xob_bldr(this);
file_mgr.Ctor_by_app(this);
href_parser = new Xoh_href_parser(Xoa_app_.Utl__encoder_mgr().Href(), url_parser.Url_parser());
href_parser = new Xoh_href_parser(Xoa_app_.Utl__encoder_mgr().Href(), utl_url_parser.Url_parser());
sanitizer = new Xop_sanitizer(parser_amp_mgr, msg_log);
user_mgr = new Xou_user_mgr(this, user);
sys_cfg = new Xoa_sys_cfg(this);
@@ -74,8 +74,10 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
public Xowmf_mgr Wmf_mgr() {return wmf_mgr;} private final Xowmf_mgr wmf_mgr = new Xowmf_mgr();
public Bry_bfr_mkr Utl__bfr_mkr() {return Xoa_app_.Utl__bfr_mkr();}
public Url_encoder_mgr Utl__encoder_mgr() {return Xoa_app_.Utl__encoder_mgr();}
public Xoa_url_parser Utl__url_parser() {return utl_url_parser;} private final Xoa_url_parser utl_url_parser = new Xoa_url_parser();
public Xoae_wiki_mgr Wiki_mgr() {return wiki_mgr;} private Xoae_wiki_mgr wiki_mgr;
public Xoa_wiki_mgr Wiki_mgri() {return wiki_mgr;}
public Xou_user_mgr User_mgr() {return user_mgr;} private Xou_user_mgr user_mgr;
public Xof_file_mgr File_mgr() {return file_mgr;} private Xof_file_mgr file_mgr = new Xof_file_mgr();
public Xoa_lang_mgr Lang_mgr() {return lang_mgr;} private Xoa_lang_mgr lang_mgr;
@@ -95,7 +97,6 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
public Xoa_shell Shell() {return shell;} private Xoa_shell shell;
public Xoa_thread_mgr Thread_mgr() {return thread_mgr;} private Xoa_thread_mgr thread_mgr = new Xoa_thread_mgr();
public Xoa_hive_mgr Hive_mgr() {return hive_mgr;} private Xoa_hive_mgr hive_mgr;
public Xoa_url_parser Url_parser() {return url_parser;} private Xoa_url_parser url_parser = new Xoa_url_parser();
public Xoh_href_parser Href_parser() {return href_parser;}
public Xop_sanitizer Sanitizer() {return sanitizer;} private Xop_sanitizer sanitizer;
public Xop_xatr_parser Xatr_parser() {return xatr_parser;} private Xop_xatr_parser xatr_parser = new Xop_xatr_parser();

View File

@@ -40,7 +40,7 @@ public class Xoapi_find implements GfoInvkAble {
}
class Xog_find_box {
private Xoae_app app; private Xog_win_itm win; private GfuiTextBox find_box;
private boolean dir_fwd = true, case_match = false, wrap_search = true;
private String prv_find_text; private boolean dir_fwd = true, case_match = false, wrap_search = true;
public Xog_find_box(Xoae_app app) {
this.app = app;
this.win = app.Gui_mgr().Browser_win();
@@ -49,10 +49,11 @@ class Xog_find_box {
public void Show() {app.Gui_mgr().Layout().Find_show();}
public void Hide() {
app.Gui_mgr().Layout().Find_close();
if (win.Tab_mgr().Active_tab_is_null()) return; // if no active_tab, just exit
win.Active_html_itm().Html_box().Html_js_eval_script("return xowa_find_html_all_del();");
Xog_tab_itm tab = win.Tab_mgr().Active_tab(); if (tab == Xog_tab_itm_.Null) return;
if (tab.View_mode() == Xopg_view_mode.Tid_read) // do not fire find("") for edit / html, else focus issues; DATE:2015-06-10
Exec_find(prv_find_text, Bool_.N);
}
public void Show_by_paste() {
public void Show_by_paste() {
this.Show();
if (win.Tab_mgr().Active_tab_is_null()) return; // if no active_tab, just show box; don't try to copy what's on tab;
find_box.Text_(win.Active_html_itm().Html_selected_get_text_or_href());
@@ -65,12 +66,16 @@ class Xog_find_box {
win.Usr_dlg().Prog_direct("Find direction changed to " + (fwd ? "forward" : "backward"));
}
public void Exec() {
prv_find_text = find_box.Text();
Exec_find(prv_find_text, Bool_.Y);
}
private void Exec_find(String find, boolean highlight_matches) {
Xog_tab_itm tab = win.Tab_mgr().Active_tab(); if (tab == Xog_tab_itm_.Null) return;
String elem_id = tab.View_mode() == Xopg_view_mode.Tid_read
? Gfui_html.Elem_id_body
: Xog_html_itm.Elem_id__xowa_edit_data_box
;
tab.Html_box().Html_doc_find(elem_id, find_box.Text(), dir_fwd, case_match, wrap_search);
tab.Html_box().Html_doc_find(elem_id, find, dir_fwd, case_match, wrap_search, highlight_matches);
win.Usr_dlg().Prog_direct("");
}
public void Case_toggle() {

View File

@@ -41,6 +41,17 @@ public class Xoapi_bookmarks implements GfoInvkAble {
app.Usr_dlg().Prog_many("", "", "bookmark added: ~{0}", String_.new_u8(ttl_full_txt));
}
public void Show() {win.Page__navigate_by_url_bar("home/wiki/Data:Bookmarks");}
// public void Add(String url_str) {
// Xoa_url url = null;
// if (url_str == null) {
// Xog_tab_itm tab = win.Active_tab(); if (tab == Xog_tab_itm_.Null) return;
// url = tab.Page().Url();
// }
// else
// url = app.Utl__url_parser().Parse(Bry_.new_u8(url_str));
// app.User().User_db_mgr().Bmk_mgr().Add(url);
// }
// public void Show() {win.Page__navigate_by_url_bar("home/wiki/System:XowaBookmarks");}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(this.Enabled());
else if (ctx.Match(k, Invk_enabled_)) Enabled_(m.ReadYn("v"));

View File

@@ -19,7 +19,7 @@ package gplx.xowa.apis.xowa.usrs; import gplx.*; import gplx.xowa.*; import gplx
import gplx.ios.*; import gplx.xowa.files.caches.*;
public class Xoapi_cache implements GfoInvkAble {
private Xou_cache_mgr cache_mgr;
public void Init_by_app(Xoa_app app) {this.cache_mgr = app.User().File__cache_mgr();}
public void Init_by_app(Xoa_app app) {this.cache_mgr = app.User().User_db_mgr().Cache_mgr();}
private String Info() {
cache_mgr.Page_bgn();
Bry_bfr bfr = Bry_bfr.new_(255);

View File

@@ -47,6 +47,7 @@ public class Xob_cmd_keys {
, Key_util_cleanup = "util.cleanup" // "core.cleanup"
, Key_util_download = "util.download" // "file.download"
, Key_util_xml_dump = "util.xml_dump"
, Key_wbase_json_dump = "wbase.json_dump"
, Key_wbase_qid = "wbase.qid" // "text.wdata.qid"
, Key_wbase_pid = "wbase.pid" // "text.wdata.pid"
, Key_wbase_db = "wbase.db" // "wiki.wdata_db"

View File

@@ -56,6 +56,7 @@ public class Xob_cmd_mgr implements GfoInvkAble {
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_cleanup)) return Add(new Xob_cleanup_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_download)) return Add(new Xob_download_wkr(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_util_xml_dump)) return Add(new Xob_xml_dumper_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_json_dump)) return Add(new Xob_wbase_json_dump_cmd(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_qid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_qid_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_pid)) return Xml_rdr_direct_add(wiki, new Xob_wdata_pid_sql().Ctor(bldr, wiki));
else if (String_.Eq(cmd_key, Xob_cmd_keys.Key_wbase_db)) return Add(new Xob_wdata_db_cmd(bldr, wiki));

View File

@@ -209,7 +209,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd {
private void Download_exec(Xodb_tbl_oimg_xfer_itm fsdb) {
Io_stream_rdr src_rdr = src_bin_mgr.Find_as_rdr(Xof_exec_tid.Tid_wiki_page, fsdb);
try {
if (src_rdr == Io_stream_rdr_.Null) { // download failed
if (src_rdr == Io_stream_rdr_.Noop) { // download failed
++exec_fail;
usr_dlg.Warn_many("", "", "failed: ttl=~{0}", String_.Format("[[File:{0}|{1}px]]", fsdb.Orig_ttl(), fsdb.Html_w()));
Print_progress(fsdb);

View File

@@ -25,7 +25,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
private Xob_lnki_temp_tbl tbl; private boolean wdata_enabled = true, xtn_ref_enabled = true, gen_html, gen_hdump;
private Xop_log_invoke_wkr invoke_wkr; private Xop_log_property_wkr property_wkr;
private boolean ns_file_is_case_match_all = true; private Xowe_wiki commons_wiki;
private Xob_hdump_bldr hdump_bldr; private Xob_link_dump_cmd link_dump_cmd;
private Xob_hdump_bldr hdump_bldr; private Xob_link_dump_cmd link_dump_cmd; private boolean hzip_enabled = true;
public Xob_lnki_temp_wkr(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
@Override public String Cmd_key() {return Xob_cmd_keys.Key_file_lnki_temp;}
@Override public byte Init_redirect() {return Bool_.N_byte;} // lnki_temp does not look at redirect pages
@@ -76,7 +76,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
Fsm_mnt_mgr.Patch(trg_mnt_mgr.Mnts__get_main().Cfg_mgr().Tbl()); // NOTE: see fsdb_make; DATE:2014-04-26
if (gen_hdump) {
gplx.xowa.apis.xowa.bldrs.imports.Xoapi_import import_cfg = wiki.Appe().Api_root().Bldr().Wiki().Import();
hdump_bldr = new Xob_hdump_bldr(wiki.Ns_mgr(), wiki.Db_mgr_as_sql(), tbl.Conn(), import_cfg.Html_db_max());
hdump_bldr = new Xob_hdump_bldr(wiki.Ns_mgr(), wiki.Db_mgr_as_sql(), tbl.Conn(), import_cfg.Html_db_max(), hzip_enabled);
link_dump_cmd = new Xob_link_dump_cmd();
link_dump_cmd.Init_by_wiki(wiki);
}
@@ -153,6 +153,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
else if (ctx.Match(k, Invk_xtn_ref_enabled_)) xtn_ref_enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk_gen_html_)) gen_html = m.ReadYn("v");
else if (ctx.Match(k, Invk_gen_hdump_)) gen_hdump = m.ReadYn("v");
else if (ctx.Match(k, Invk_hzip_enabled_)) hzip_enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk_ns_ids_)) ns_ids = Int_.Ary_parse(m.ReadStr("v"), "|");
else if (ctx.Match(k, Invk_ns_ids_by_aliases)) ns_ids = Xob_lnki_temp_wkr_.Ns_ids_by_aliases(wiki, m.ReadStrAry("v", "|"));
else if (ctx.Match(k, Invk_property_wkr)) return this.Property_wkr();
@@ -163,7 +164,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink
private static final String Invk_wdata_enabled_ = "wdata_enabled_", Invk_xtn_ref_enabled_ = "xtn_ref_enabled_"
, Invk_ns_ids_ = "ns_ids_", Invk_ns_ids_by_aliases = "ns_ids_by_aliases"
, Invk_invoke_wkr = "invoke_wkr", Invk_property_wkr = "property_wkr"
, Invk_gen_html_ = "gen_html_", Invk_gen_hdump_ = "gen_hdump_"
, Invk_gen_html_ = "gen_html_", Invk_gen_hdump_ = "gen_hdump_", Invk_hzip_enabled_ = "hzip_enabled_"
;
private Xop_log_invoke_wkr Invoke_wkr() {
if (invoke_wkr == null) invoke_wkr = ((Scrib_xtn_mgr)bldr.App().Xtn_mgr().Get_or_fail(Scrib_xtn_mgr.XTN_KEY)).Invoke_wkr_or_new();

View File

@@ -15,14 +15,16 @@ 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.dbs.schemas; import gplx.*; import gplx.dbs.*;
public class Schema_itm_tid {
public static final int Tid_table = 1, Tid_index = 2;
public static final String Key_table = "table", Key_index = "index";
public static int Xto_int(String s) {
s = String_.Lower(s);
if (String_.Eq(s, Key_table)) return Tid_table;
else if (String_.Eq(s, Key_index)) return Tid_index;
else throw Err_.unhandled(s);
package gplx.xowa.bldrs.cmds.texts.sqls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*;
public class Xob_ns_to_db_wkr__text implements Xob_ns_to_db_wkr {
public byte Db_tid() {return Xowd_db_file_.Tid_text;}
public void Tbl_init(Xowd_db_file db) {
Xowd_text_tbl tbl = db.Tbl__text();
tbl.Create_tbl();
tbl.Insert_bgn();
}
public void Tbl_term(Xowd_db_file db) {
db.Tbl__text().Insert_end();
}
}

View File

@@ -98,14 +98,3 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xobd_wkr, GfoInv
public void Wkr_ini(Xob_bldr bldr) {}
public void Wkr_print() {}
}
class Xob_ns_to_db_wkr__text implements Xob_ns_to_db_wkr {
public byte Db_tid() {return Xowd_db_file_.Tid_text;}
public void Tbl_init(Xowd_db_file db) {
Xowd_text_tbl tbl = db.Tbl__text();
tbl.Create_tbl();
tbl.Insert_bgn();
}
public void Tbl_term(Xowd_db_file db) {
db.Tbl__text().Insert_end();
}
}

View File

@@ -70,9 +70,9 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr {
db_mgr.Load_mgr().Load_by_id(db_page, page.Revision_data().Id());
Xowd_text_tbl text_tbl = db_mgr.Core_data_mgr().Dbs__get_at(db_page.Text_db_id()).Tbl__text();
text_tbl.Update(page.Revision_data().Id(), text_raw);
int html_db_id = db_page.Html_db_id();
if (html_db_id != -1)
db_mgr.Core_data_mgr().Tbl__page().Update__html_db_id(page_id, -1); // zap html_db_id so that next load will repopulate it
// int html_db_id = db_page.Html_db_id();
// if (html_db_id != -1)
// db_mgr.Core_data_mgr().Tbl__page().Update__html_db_id(page_id, -1); // zap html_db_id so that next load will repopulate it
}
public void Data_rename(Xoae_page page, int trg_ns, byte[] trg_ttl) {
db_mgr.Core_data_mgr().Tbl__page().Update__ns__ttl(page.Revision_data().Id(), trg_ns, trg_ttl);

View File

@@ -32,7 +32,10 @@ public class Xof_file_fxt {
Xow_repo_mgr_.Assert_repos(wiki.Appe(), wiki);
return this;
}
public Xof_file_fxt Init_cache() {wiki.Appe().Usere().Init_db(); return this;}
public Xof_file_fxt Init_cache() {
wiki.App().User().User_db_mgr().Init_by_app(Bool_.N, wiki.App().Fsys_mgr().Root_dir().GenSubFil_nest("user", "xowa.user.anonymous.sqlite3"));
return this;
}
public Xof_file_fxt Init_orig() {
Db_conn conn = Db_conn_bldr.I.Get_or_new(Io_url_.mem_fil_("mem/xowa/wiki/" + wiki.Domain_str() + "/orig.xowa")).Conn();
Xof_orig_tbl orig_tbl = new Xof_orig_tbl(conn, Bool_.Y);

View File

@@ -36,6 +36,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr {
int len = imgs.Count();
for (int i = 0; i < len; ++i)
Ctor_by_hdump(hpg, (Xohd_data_itm__base)imgs.Get_at(i));
Xoa_app_.Usr_dlg().Prog_none("", "", "");
}
private void Ctor_by_hdump(Xoa_page hpg, Xohd_data_itm__base hdump) {
Xof_fsdb_itm fsdb = new Xof_fsdb_itm();
@@ -48,6 +49,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr {
}
public static boolean Show_img(Xof_fsdb_itm fsdb, Gfo_usr_dlg usr_dlg, Xof_bin_mgr bin_mgr, Fsm_mnt_mgr mnt_mgr, Xou_cache_mgr cache_mgr, Xow_repo_mgr repo_mgr, Xog_js_wkr js_wkr, Xof_img_size img_size, Xof_url_bldr url_bldr, Xoa_page page) {
try {
usr_dlg.Log_many("", "", "file.get: file=~{0} width=~{1} page=~{2}", fsdb.Orig_ttl(), fsdb.Lnki_w(), page.Ttl().Full_db());
if (fsdb.Orig_ext() == null) {
usr_dlg.Warn_many("", "", "file.missing.ext: file=~{0} width=~{1} page=~{2}", fsdb.Orig_ttl(), fsdb.Lnki_w(), page.Ttl().Full_db());
return false;
@@ -91,7 +93,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr {
if (fsdb_sql_wkr != null) {
Io_stream_rdr file_rdr = fsdb_sql_wkr.Get_to_fsys_near(fsdb, fsdb.Orig_repo_name(), fsdb.Orig_ttl(), fsdb.Orig_ext(), fsdb.Lnki_time(), fsdb.Lnki_page());
try {
if (file_rdr != Io_stream_rdr_.Null) {
if (file_rdr != Io_stream_rdr_.Noop) {
Xof_repo_itm repo = repo_mgr.Get_trg_by_id_or_null(fsdb.Orig_repo_id(), fsdb.Lnki_ttl(), page.Url_bry_safe());
Io_url file_url = url_bldr.Init_for_trg_file(Xof_repo_itm_.Mode_by_bool(!fsdb.File_is_orig()), repo, fsdb.Orig_ttl(), fsdb.Orig_ttl_md5(), fsdb.Orig_ext(), fsdb.File_w(), fsdb.Lnki_time(), fsdb.Lnki_page()).Xto_url();
Io_stream_wtr_.Save_rdr(file_url, file_rdr, Io_download_fmt.Null);
@@ -131,18 +133,3 @@ public class Xof_file_wkr implements Gfo_thread_wkr {
finally {rdr.Rls();}
}
}
class Xof_redlink_wkr implements Gfo_thread_wkr {
private Xog_js_wkr js_wkr; private int[] uids;
public Xof_redlink_wkr(Xog_js_wkr js_wkr, int[] uids) {
this.js_wkr = js_wkr; this.uids = uids;
}
public String Name() {return "xowa.redlinks";}
public boolean Resume() {return true;}
public void Exec() {
int len = uids.length;
for (int i = 0; i < len; ++i) {
int uid = uids[i];
js_wkr.Html_atr_set(Int_.Xto_str(uid), "", "");
}
}
}

View File

@@ -15,9 +15,21 @@ 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.dbs.schemas; import gplx.*; import gplx.dbs.*;
public class Schema_tbl_itm {
public Schema_tbl_itm(String name, String sql) {this.name = name; this.sql = sql;}
public String Name() {return name;} private final String name;
public String Sql() {return sql;} private final String sql;
package gplx.xowa.files; import gplx.*; import gplx.xowa.*;
import gplx.core.threads.*;
import gplx.xowa.files.gui.*;
class Xof_redlink_wkr implements Gfo_thread_wkr {
private Xog_js_wkr js_wkr; private int[] uids;
public Xof_redlink_wkr(Xog_js_wkr js_wkr, int[] uids) {
this.js_wkr = js_wkr; this.uids = uids;
}
public String Name() {return "xowa.redlinks";}
public boolean Resume() {return true;}
public void Exec() {
int len = uids.length;
for (int i = 0; i < len; ++i) {
int uid = uids[i];
js_wkr.Html_atr_set(Int_.Xto_str(uid), "", "");
}
}
}

View File

@@ -56,7 +56,7 @@ public class Xof_bin_mgr {
public boolean Find_to_url_as_bool(int exec_tid, Xof_fsdb_itm fsdb) {return Find_to_url(exec_tid, fsdb) != Io_url_.Empty;}
private Io_url Find_to_url(int exec_tid, Xof_fsdb_itm fsdb) {
Io_stream_rdr rdr = Find_as_rdr(exec_tid, fsdb);
if (rdr == Io_stream_rdr_.Null) return Io_url_.Empty;
if (rdr == Io_stream_rdr_.Noop) return Io_url_.Empty;
Io_url trg = fsdb.Html_view_url();
fsdb.File_size_(rdr.Len());
if (fsdb.File_resized()) return trg; // rdr is opened directly from trg; return its url; occurs when url goes through imageMagick / inkscape, or when thumb is already on disk;
@@ -64,7 +64,7 @@ public class Xof_bin_mgr {
return trg;
}
public Io_stream_rdr Find_as_rdr(int exec_tid, Xof_fsdb_itm fsdb) {
Io_stream_rdr rv = Io_stream_rdr_.Null;
Io_stream_rdr rv = Io_stream_rdr_.Noop;
Xof_repo_itm repo = repo_mgr.Repos_get_by_wiki(fsdb.Orig_repo_name()).Trg();
boolean file_is_orig = fsdb.File_is_orig();
if (file_is_orig || exec_tid == Xof_exec_tid.Tid_viewer_app) { // orig or viewer_app; note that viewer_app always return orig
@@ -73,7 +73,7 @@ public class Xof_bin_mgr {
for (int i = 0; i < wkrs_len; i++) {
Xof_bin_wkr wkr = wkrs[i];
rv = wkr.Get_as_rdr(fsdb, Bool_.N, fsdb.Html_w());
if (rv == Io_stream_rdr_.Null) continue; // orig not found; continue;
if (rv == Io_stream_rdr_.Noop) continue; // orig not found; continue;
fsdb.File_exists_y_();
return rv;
}
@@ -84,12 +84,12 @@ public class Xof_bin_mgr {
for (int i = 0; i < wkrs_len; i++) {
Xof_bin_wkr wkr = wkrs[i];
rv = wkr.Get_as_rdr(fsdb, Bool_.Y, fsdb.Html_w()); // get thumb's bin
if (rv != Io_stream_rdr_.Null) { // thumb's bin exists;
if (rv != Io_stream_rdr_.Noop) { // thumb's bin exists;
fsdb.File_exists_y_();
return rv;
}
rv = wkr.Get_as_rdr(fsdb, Bool_.N, fsdb.Orig_w()); // thumb missing; get orig;
if (rv == Io_stream_rdr_.Null) {
if (rv == Io_stream_rdr_.Noop) {
usr_dlg.Log_direct(String_.Format("bin_mgr:thumb not found; wkr={0} ttl={1} w={2}", wkr.Key(), fsdb.Orig_ttl(), fsdb.Lnki_w()));
continue; // nothing found; continue;
}
@@ -104,7 +104,7 @@ public class Xof_bin_mgr {
return rv;
}
}
return Io_stream_rdr_.Null;
return Io_stream_rdr_.Noop;
}
private boolean Resize(int exec_tid, Xof_fsdb_itm itm, boolean file_is_orig, Io_url src, Io_url trg) {
tmp_size.Html_size_calc(exec_tid, itm.Lnki_w(), itm.Lnki_h(), itm.Lnki_type(), mnt_mgr.Patch_upright(), itm.Lnki_upright(), itm.Orig_ext().Id(), itm.Orig_w(), itm.Orig_h(), Xof_img_size.Thumb_width_img);

View File

@@ -30,10 +30,10 @@ public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr {
public void Skip_mgr_init(Fsm_cfg_mgr cfg_mgr, String[] wkrs) {this.skip_mgr = new Xof_bin_skip_mgr(cfg_mgr, wkrs);}
public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm fsdb, boolean is_thumb, int w) {
Find_ids(fsdb, is_thumb, w);
int bin_db_id = tmp_ids.Bin_db_id(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return Io_stream_rdr_.Null;
int bin_db_id = tmp_ids.Bin_db_id(); if (bin_db_id == Fsd_bin_tbl.Bin_db_id_null) return Io_stream_rdr_.Noop;
Fsm_bin_fil bin_db = mnt_mgr.Bins__at(tmp_ids.Mnt_id(), bin_db_id);
Io_stream_rdr rdr = bin_db.Select_as_rdr(tmp_ids.Itm_id());
if (skip_mgr != null && skip_mgr.Skip(fsdb, rdr)) return Io_stream_rdr_.Null;
if (skip_mgr != null && skip_mgr.Skip(fsdb, rdr)) return Io_stream_rdr_.Noop;
return rdr;
}
public boolean Get_to_fsys(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) {return Get_to_fsys(itm.Orig_repo_name(), itm.Orig_ttl(), itm.Orig_ext(), is_thumb, w, itm.Lnki_time(), itm.Lnki_page(), bin_url);}
@@ -53,7 +53,7 @@ public class Xof_bin_wkr__fsdb_sql implements Xof_bin_wkr {
}
else {
Fsd_fil_itm fil_itm = Select_fil_bin(orig_repo, orig_ttl); // find orig
if (fil_itm == Fsd_fil_itm.Null) return Io_stream_rdr_.Null;
if (fil_itm == Fsd_fil_itm.Null) return Io_stream_rdr_.Noop;
tmp_ids.Init_by_fil(fil_itm);
rv.Init_by_fsdb_near(Bool_.Y, rv.Orig_w());
}

View File

@@ -25,7 +25,7 @@ public abstract class Xof_bin_wkr__fsys_base implements Xof_bin_wkr, GfoInvkAble
public boolean Resize_allowed() {return resize_allowed;} public void Resize_allowed_(boolean v) {resize_allowed = v;} private boolean resize_allowed = false;
public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm itm, boolean is_thumb, int w) {
Io_url src_url = this.Get_src_url(Xof_repo_itm_.Mode_by_bool(is_thumb), String_.new_u8(itm.Orig_repo_name()), itm.Orig_ttl(), itm.Orig_ttl_md5(), itm.Orig_ext(), w, itm.Lnki_time(), itm.Lnki_page());
return (src_url == Io_url_.Empty) ? gplx.ios.Io_stream_rdr_.Null : gplx.ios.Io_stream_rdr_.file_(src_url);
return (src_url == Io_url_.Empty) ? gplx.ios.Io_stream_rdr_.Noop : gplx.ios.Io_stream_rdr_.file_(src_url);
}
public boolean Get_to_fsys(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) {
return Get_to_fsys(itm.Orig_repo_name(), itm.Orig_ttl(), itm.Orig_ttl_md5(), itm.Orig_ext(), is_thumb, w, itm.Lnki_time(), itm.Lnki_page(), bin_url);

View File

@@ -31,7 +31,7 @@ public class Xof_bin_wkr__http_wmf implements Xof_bin_wkr {
boolean rv = rdr.Exists(); // NOTE: use Exists which detects for response_code 200, not content length > 0; DATE:2015-05-20
if (!rv) Handle_error();
fsdb.Fsdb_insert_y_();
return rv ? rdr : Io_stream_rdr_.Null;
return rv ? rdr : Io_stream_rdr_.Noop;
}
public boolean Get_to_fsys(Xof_fsdb_itm fsdb, boolean is_thumb, int w, Io_url bin_url) {
boolean rv = Get_to_fsys(fsdb.Orig_repo_name(), fsdb.Orig_ttl(), fsdb.Orig_ttl_md5(), fsdb.Orig_ext(), is_thumb, w, fsdb.Lnki_time(), fsdb.Lnki_page(), bin_url);

View File

@@ -63,11 +63,11 @@ class Xou_cache_mgr_fxt {
Tfds.Now_set(DateAdp_.new_(1970, 1, 1, 0, 0, 0, 0));
Io_mgr.I.InitEngine_mem();
Db_conn_bldr.I.Reg_default_mem();
Xoae_app app = Xoa_app_fxt.app_();
app.Usere().Init_db();
Xoae_app app = Xoa_app_fxt.app_();
app.User().User_db_mgr().Init_by_app(Bool_.N, app.Fsys_mgr().Root_dir().GenSubFil_nest("user", "xowa.user.anonymous.sqlite3"));
Xoa_app_fxt.repo_(app, Xoa_app_fxt.wiki_(app, "en.wikipedia.org"));
Xoa_app_fxt.repo_(app, Xoa_app_fxt.wiki_(app, "fr.wikipedia.org"));
this.mgr = new Xou_cache_mgr(app.Wiki_mgr(), app.Fsys_mgr().File_dir(), app.User().Data__db_file());
this.mgr = new Xou_cache_mgr(app.Wiki_mgr(), app.Fsys_mgr().File_dir(), app.User().User_db_mgr().Db_file());
}
public void Init_delete(long min, long max) {
mgr.Fsys_size_min_(min);

View File

@@ -31,23 +31,24 @@ public class Xof_fsdb_mgr__sql implements Xof_fsdb_mgr, GfoInvkAble {
try {
init = true;
// if (wiki.File__fsdb_mode().Tid_v0()) return;
this.url_bldr = Xof_url_bldr.new_v2();
this.repo_mgr = wiki.File__repo_mgr();
Fsdb_db_mgr core = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir());
if (core == null) return;
this.url_bldr = Xof_url_bldr.new_v2();
this.repo_mgr = wiki.File__repo_mgr();
Fsdb_db_mgr fsdb_core = wiki.File__fsdb_core();
// Fsdb_db_mgr fsdb_core = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir());
if (fsdb_core == null) return;
fsdb_enabled = true;
mnt_mgr.Ctor_by_load(core);
mnt_mgr.Ctor_by_load(fsdb_core);
this.bin_mgr = new Xof_bin_mgr(mnt_mgr, repo_mgr, wiki.App().File__img_mgr().Wkr_resize_img(), wiki.App().Wmf_mgr().Download_wkr().Download_xrg().Download_fmt());
bin_mgr.Wkrs__add(Xof_bin_wkr__fsdb_sql.new_(mnt_mgr));
bin_mgr.Wkrs__add(Xof_bin_wkr__http_wmf.new_(wiki));
} catch (Exception exc) {throw Err_.new_fmt_("failed to initialize fsdb_mgr: wiki={0) err={1}", wiki.Domain_str(), Err_.Message_gplx_brief(exc));}
} catch (Exception exc) {throw Err_.new_fmt_("failed to initialize fsdb_mgr: wiki={0} dbg={1} err={2}", wiki.Domain_str(), Err_.Message_gplx_brief(exc));}
}
public void Fsdb_search_by_list(List_adp itms, Xow_wiki cur_wiki, Xoa_page page, Xog_js_wkr js_wkr) {
if (!fsdb_enabled) return;
int len = itms.Count();
Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.I;
Xow_wiki wiki = page.Commons_mgr().Source_wiki_or(cur_wiki);
Xou_cache_mgr cache_mgr = wiki.App().User().File__cache_mgr();
Xou_cache_mgr cache_mgr = wiki.App().User().User_db_mgr().Cache_mgr();
for (int i = 0; i < len; i++) {
if (usr_dlg.Canceled()) return;
Xof_fsdb_itm fsdb = (Xof_fsdb_itm)itms.Get_at(i);

View File

@@ -19,7 +19,6 @@ package gplx.xowa.files.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa
public interface Xog_js_wkr {
void Html_img_update (String uid, String src, int w, int h);
void Html_redlink (String html_uid);
boolean Html_doc_loaded ();
void Html_atr_set (String uid, String key, String val);
void Html_elem_replace_html (String uid, String html);

View File

@@ -25,5 +25,4 @@ class Xog_js_wkr__noop implements Xog_js_wkr {
public void Html_elem_replace_html (String uid, String html) {}
public void Html_elem_append_above (String uid, String html) {}
public void Html_redlink (String html_uid) {}
public boolean Html_doc_loaded () {return true;}
}

View File

@@ -23,11 +23,12 @@ public class Xog_js_wkr__log implements Xog_js_wkr {
public void Html_redlink (String uid) {log_list.Add(Object_.Ary(Proc_redlink, uid));}
public void Html_elem_replace_html (String uid, String html) {log_list.Add(Object_.Ary(Proc_replace_html, uid, html));}
public void Html_elem_append_above (String uid, String html) {log_list.Add(Object_.Ary(Proc_append_above, uid, html));}
public boolean Html_doc_loaded () {log_list.Add(Object_.Ary(Proc_doc_loaded)); return true;}
public void Log__clear() {log_list.Clear();}
public int Log__len() {return log_list.Count();}
public Object[] Log__get_at(int i) {return (Object[])log_list.Get_at(i);}
public static final String Proc_img_update = "img_update", Proc_atr_set = "atr_set", Proc_redlink = "redlink", Proc_replace_html = "replace_html", Proc_append_above = "append_above", Proc_doc_loaded = "doc_loaded";
public static final String
Proc_img_update = "img_update", Proc_atr_set = "atr_set", Proc_redlink = "redlink", Proc_replace_html = "replace_html", Proc_append_above = "append_above"
;
}

View File

@@ -65,5 +65,6 @@ public class Xog_history_stack {
this.Add(itm);
}
}
public void Cur_pos_(int v) {this.cur_pos = v;}
public static final byte Nav_fwd = 1, Nav_bwd = 2, Nav_by_anchor = 3;
}

View File

@@ -44,7 +44,7 @@ class Xog_history_stack_fxt {
if (app == null) {
app = Xoa_app_fxt.app_();
wiki = Xoa_app_fxt.wiki_tst_(app);
url_parser = app.Url_parser();
url_parser = app.Utl__url_parser();
}
return this;
} private Xoae_app app; private Xowe_wiki wiki; private Xog_history_stack stack = new Xog_history_stack(); private Xoa_url_parser url_parser;

View File

@@ -81,7 +81,7 @@ public class Xog_url_wkr {
Xof_fsdb_itm fsdb = Xof_orig_file_downloader.Make_fsdb(wiki, lnki_ttl, img_size, url_bldr);
if (!Io_mgr.I.ExistsFil(href_url)) {
// if (!Xof_orig_file_downloader.Get_to_url(fsdb, href_url, wiki, lnki_ttl, url_bldr))
if (!Xof_file_wkr.Show_img(fsdb, Xoa_app_.Usr_dlg(), wiki.File__bin_mgr(), wiki.File__mnt_mgr(), wiki.App().User().File__cache_mgr(), wiki.File__repo_mgr(), gplx.xowa.files.gui.Xog_js_wkr_.Noop, img_size, url_bldr, page))
if (!Xof_file_wkr.Show_img(fsdb, Xoa_app_.Usr_dlg(), wiki.File__bin_mgr(), wiki.File__mnt_mgr(), wiki.App().User().User_db_mgr().Cache_mgr(), wiki.File__repo_mgr(), gplx.xowa.files.gui.Xog_js_wkr_.Noop, img_size, url_bldr, page))
return Rslt_handled;
}
gplx.ios.IoItmFil fil = Io_mgr.I.QueryFil(href_url);
@@ -89,14 +89,14 @@ public class Xog_url_wkr {
ProcessAdp media_player = app.Prog_mgr().App_by_ext(href_url.Ext());
media_player.Run(href_url);
fsdb.File_size_(fil.Size());
gplx.xowa.files.caches.Xou_cache_mgr cache_mgr = wiki.Appe().User().File__cache_mgr();
gplx.xowa.files.caches.Xou_cache_mgr cache_mgr = wiki.Appe().User().User_db_mgr().Cache_mgr();
cache_mgr.Update(fsdb);
cache_mgr.Db_save();
}
return Rslt_handled;
}
private Xoa_url Exec_url_page(Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19
Xoa_url rv = app.Url_parser().Parse(href_bry); // needed for query_args
Xoa_url rv = app.Utl__url_parser().Parse(href_bry); // needed for query_args
byte[] anchor_bry = href.Anchor();
byte[] page_bry = rv.Page_bry();
byte[][] segs_ary = rv.Segs_ary();

View File

@@ -122,10 +122,6 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_append_above, m);
}
}
public boolean Html_doc_loaded() {
GfoMsg m = GfoMsg_.new_cast_(Invk_html_doc_loaded);
return Bool_.cast_(GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_doc_loaded, m));
}
public void Html_gallery_packed_exec() {
if (!String_.Eq(owner_tab.Tab_key(), owner_tab.Tab_mgr().Active_tab().Tab_key())) return; // do not exec unless active;
GfoMsg m = GfoMsg_.new_cast_(Invk_html_gallery_packed_exec);
@@ -191,7 +187,6 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
else if (ctx.Match(k, Invk_html_elem_append_above)) html_box.Html_elem_append_above(m.ReadStr("id"), m.ReadStr("html"));
else if (ctx.Match(k, Invk_html_gallery_packed_exec)) html_box.Html_gallery_packed_exec();
else if (ctx.Match(k, Invk_html_popups_bind_hover_to_doc)) html_box.Html_js_eval_script("xowa_popups_bind_doc();");
else if (ctx.Match(k, Invk_html_doc_loaded)) return html_box.Html_doc_loaded();
else if (ctx.Match(k, Invk_scroll_page_by_bmk)) Scroll_page_by_bmk();
else if (ctx.Match(k, Invk_scroll_page_by_id)) Scroll_page_by_id(m.ReadStr("v"));
else if (ctx.Match(k, Invk_html_elem_focus)) html_box.Html_elem_focus(m.ReadStr("v"));
@@ -203,7 +198,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
Invk_html_gallery_packed_exec = "html_gallery_packed_exec", Invk_html_popups_bind_hover_to_doc = "html_popups_bind_hover_to_doc"
, Invk_html_img_update = "html_img_update", Invk_html_elem_atr_set = "html_elem_atr_set"
, Invk_html_elem_atr_set_append = "html_elem_atr_set_append", Invk_html_elem_delete = "html_elem_delete", Invk_html_elem_replace_html = "html_elem_replace_html", Invk_html_elem_append_above = "html_elem_append_above"
, Invk_scroll_page_by_bmk = "scroll_page_by_bmk", Invk_scroll_page_by_id = "scroll_page_by_id", Invk_html_doc_loaded = "html_doc_loaded"
, Invk_scroll_page_by_bmk = "scroll_page_by_bmk", Invk_scroll_page_by_id = "scroll_page_by_id"
;
public static final String
Elem_id__xowa_edit_data_box = "xowa_edit_data_box"

View File

@@ -157,7 +157,7 @@ public class Xog_tab_itm implements GfoInvkAble {
Xog_tab_itm_read_mgr.Show_page(this, page, true);
if (app.Api_root().Usr().History().Enabled()) {
app.Usere().History_mgr().Add(page);
app.Usere().Data_mgr().History_mgr().Update_async(app.Async_mgr(), ttl, url);
app.User().User_db_mgr().History_mgr().Update_async(app.Async_mgr(), ttl, url);
}
usr_dlg.Prog_none("", "", "rendering html");
// html_itm.Html_box().Size_(tab_mgr.Tab_mgr().Size()); // COMMENTED: causes clicks on macosx to be off by 4 px; NOTE: must resize tab here, else scrolling to anchor in background tab doesn't work (html_box has size of 0, 0) DATE:2015-05-03
@@ -166,7 +166,7 @@ public class Xog_tab_itm implements GfoInvkAble {
if (wkr.Hdump_enabled()) {
wiki.File_mgr().Init_file_mgr_by_load(wiki);
Xof_fsdb_mgr fsdb_mgr = wiki.File_mgr().Fsdb_mgr();
async_wkr = new Xof_file_wkr(wiki.File__orig_mgr(), fsdb_mgr.Bin_mgr(), fsdb_mgr.Mnt_mgr(), app.Usere().File__cache_mgr(), wiki.File__repo_mgr(), html_itm, page, page.Hdump_data().Imgs());
async_wkr = new Xof_file_wkr(wiki.File__orig_mgr(), fsdb_mgr.Bin_mgr(), fsdb_mgr.Mnt_mgr(), app.Usere().User_db_mgr().Cache_mgr(), wiki.File__repo_mgr(), html_itm, page, page.Hdump_data().Imgs());
if (wiki.Html__hdump_enabled() && page.Revision_data().Html_db_id() == -1) {
wiki.Html__hdump_wtr().Save(page);
}
@@ -185,7 +185,7 @@ public class Xog_tab_itm implements GfoInvkAble {
if (imgs.Count() > 0) {
Xof_file_wkr file_thread = new Xof_file_wkr
( wiki.File__orig_mgr(), wiki.File__bin_mgr(), wiki.File__mnt_mgr()
, app.User().File__cache_mgr(), wiki.File__repo_mgr(), html_itm, page, imgs
, app.User().User_db_mgr().Cache_mgr(), wiki.File__repo_mgr(), html_itm, page, imgs
);
thread_pool.Add_at_end(file_thread); thread_pool.Run();
}
@@ -253,7 +253,7 @@ public class Xog_tab_itm implements GfoInvkAble {
} catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.redlinks: page=~{0} err=~{1}", page_ttl_str, Err_.Message_gplx_brief(e));}
try {app.File_mgr().Cache_mgr().Compress_check();}
catch (Exception e) {usr_dlg.Warn_many("", "", "page.thread.cache: page=~{0} err=~{1}", page_ttl_str, Err_.Message_gplx_brief(e));}
app.Usere().File__cache_mgr().Page_end(app.Wiki_mgr());
app.Usere().User_db_mgr().Cache_mgr().Page_end(app.Wiki_mgr());
app.Log_wtr().Queue_enabled_(false);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {

View File

@@ -26,11 +26,13 @@ public class Xog_tab_itm_edit_mgr {
wiki.Db_mgr().Save_mgr().Data_create(page.Ttl(), new_text);
page.Edit_mode_update_(); // set to update so that next save does not try to create
}
else
else {
wiki.Db_mgr().Save_mgr().Data_update(page, new_text);
}
Invalidate(wiki);
page.Data_raw_(new_text);
wiki.ParsePage_root(page, true); // refresh html
if (wiki.Html__hdump_enabled()) wiki.Html__hdump_wtr().Save(page); // must go after wiki.ParsePage_root
win_itm.Usr_dlg().Prog_one("", "", "saved page ~{0}", String_.new_u8(page.Ttl().Full_txt_raw())); // NOTE: show message after ParsePage_root, b/c ParsePage_root will flash "Loading page"; DATE:2014-05-17
if (!quick_save) { // full_save; save page and go to read mode
page.Html_data().Edit_preview_(Bry_.Empty);

View File

@@ -156,7 +156,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
wiki.ParsePage_root(page, true); // NOTE: must reparse page if (a) Edit -> Read; or (b) "Options" save
Xoa_url url = page.Url();
if (url.Args_exists(Xoa_url_parser.Bry_arg_action, Xoa_url_parser.Bry_arg_action_edit)) // url has ?action=edit
app.Url_parser().Parse(url, url.Xto_full_bry()); // remove all query args; handle (1) s.w:Earth?action=edit; (2) click on Read; DATE:2014-03-06
app.Utl__url_parser().Parse(url, url.Xto_full_bry()); // remove all query args; handle (1) s.w:Earth?action=edit; (2) click on Read; DATE:2014-03-06
}
tab.View_mode_(new_mode_tid);
if (page.Missing()) return;

View File

@@ -337,6 +337,7 @@ public class Xoh_html_wtr {
case Xop_xnde_tag_.Tid_table: case Xop_xnde_tag_.Tid_tr: case Xop_xnde_tag_.Tid_td: case Xop_xnde_tag_.Tid_th: case Xop_xnde_tag_.Tid_caption: case Xop_xnde_tag_.Tid_tbody:
case Xop_xnde_tag_.Tid_ruby: case Xop_xnde_tag_.Tid_rt: case Xop_xnde_tag_.Tid_rb: case Xop_xnde_tag_.Tid_rp:
case Xop_xnde_tag_.Tid_time: case Xop_xnde_tag_.Tid_bdi: case Xop_xnde_tag_.Tid_data: case Xop_xnde_tag_.Tid_mark: case Xop_xnde_tag_.Tid_wbr: case Xop_xnde_tag_.Tid_bdo: // HTML 5: write literally and let browser handle them
case Xop_xnde_tag_.Tid_q:
Write_xnde(bfr, ctx, hctx, xnde, tag, tag_id, src);
break;
case Xop_xnde_tag_.Tid_pre: {

View File

@@ -0,0 +1,79 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.html.css; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*;
import gplx.xowa.bldrs.css.*;
public class Xob_css_status {
public int Update_tid() {return update_tid;} private int update_tid;
public boolean Fs_exists() {return fs_exists;} private boolean fs_exists;
public Io_url Fs_dir() {return fs_dir;} private Io_url fs_dir;
public boolean Db_exists() {return db_exists;} private boolean db_exists;
public void Fs_exists_(boolean fs_exists, Io_url fs_dir) {
this.fs_exists = fs_exists;
this.fs_dir = fs_dir;
}
public void Db_exists_(boolean db_exists) {
this.db_exists = db_exists;
}
public void Update_tid_none_y_() {this.update_tid = Update_tid_none;}
public void Update_tid_wmf_y_() {this.update_tid = Update_tid_wmf;}
public void Update_tid_db_y_() {this.update_tid = Update_tid_db;}
public static final int Update_tid_none = 0, Update_tid_db = 1, Update_tid_wmf = 2;
public static Xob_css_status Chk(Xow_wiki wiki, Io_url css_dir, String key) {
Xob_css_status rv = new Xob_css_status();
Chk_fs(rv, wiki);
Chk_db(rv, wiki, css_dir);
return rv;
}
private static void Chk_fs(Xob_css_status rv, Xow_wiki wiki) {
Io_url css_dir = wiki.App().Fsys_mgr().Wiki_css_dir(wiki.Domain_str()); // EX: /xowa/user/anonymous/wiki/en.wikipedia.org/html/
Io_url css_fil_wiki = css_dir.GenSubFil(Xoa_css_extractor.Css_wiki_name); // EX: /xowa/user/anonymous/wiki/en.wikipedia.org/html/xowa_wiki.css
boolean exists = Io_mgr.I.ExistsFil(css_fil_wiki);
rv.Fs_exists_(exists, css_dir);
}
private static void Chk_db(Xob_css_status rv, Xow_wiki wiki, Io_url css_dir) {
Xowd_db_mgr core_db_mgr = wiki.Data_mgr__core_mgr();
if ( core_db_mgr == null
|| core_db_mgr.Props() != null
|| !core_db_mgr.Props().Schema_is_1()
|| core_db_mgr.Tbl__cfg().Select_yn_or(Xow_cfg_consts.Grp__wiki_schema, Xowd_db_file_schema_props.Key__tbl_css_core, Bool_.N)
) {
rv.Db_exists_(false);
if (rv.Fs_exists())
rv.Update_tid_none_y_(); // v1_db and fs_exists; don't do update; legacy behavior
else
rv.Update_tid_wmf_y_(); // v1_db and fs_missing; update from wmf; legacy behavior
}
if (rv.Fs_exists()) {
DateAdp fs_timestamp = Timestamp_load(css_dir);
DateAdp db_timestamp = DateAdp_.Now();
if (db_timestamp.compareTo(fs_timestamp) == CompareAble_.More)
rv.Update_tid_db_y_(); // v2_db and later_version; update from db
else
rv.Update_tid_none_y_(); // v2_db and current version; noop
}
}
public static void Timestamp_save(Io_url css_dir, DateAdp time) {
Io_mgr.I.SaveFilStr(css_dir.GenSubFil(Timestamp_filename), time.XtoStr_fmt_yyyyMMdd_HHmmss());
}
public static DateAdp Timestamp_load(Io_url css_dir) {
String rv = Io_mgr.I.LoadFilStr(css_dir.GenSubFil(Timestamp_filename));
return rv == null ? DateAdp_.MinValue : DateAdp_.parse_iso8561_or(rv, DateAdp_.MinValue);
}
private static final String Timestamp_filename = "xowa.css.timestamp.txt";
}

View File

@@ -16,7 +16,9 @@ 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.html.css; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.dbs.*;
import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.bldrs.css.*;
public class Xowd_css_core_mgr {
public static void Set(Xowd_css_core_tbl core_tbl, Xowd_css_file_tbl file_tbl, Io_url css_dir, String key) {
Db_conn conn = core_tbl.Conn();

View File

@@ -52,13 +52,16 @@ public class Xohd_hdump_rdr {
return;
}
Bry_bfr bfr = bfr_mkr.Get_m001();
Xoa_app_.Usr_dlg().Plog_many("", "", "hdump.load.abrv: ttl=~{0}", ttl.Full_db_as_str());
byte[] body_bry = abrv_mgr.Parse(bfr, rv);
Xoa_app_.Usr_dlg().Plog_many("", "", "hdump.load.hzip: ttl=~{0}", ttl.Full_db_as_str());
body_bry = hzip_mgr.Parse(bfr, ttl.Page_db(), body_bry, rv.Redlink_uids());
bfr.Mkr_rls();
rv.Page_body_(body_bry);
}
}
private boolean Get_by_ttl__fill_hpg(Xog_page rv, Xoa_ttl ttl) {
Xoa_app_.Usr_dlg().Plog_many("", "", "hdump.load.meta: ttl=~{0}", ttl.Full_db_as_str());
core_data_mgr.Tbl__page().Select_by_ttl(dbpg, ttl.Ns(), ttl.Page_db()); // get rows from db
if (dbpg.Redirect_id() != -1) Get_by_ttl__resolve_redirect(dbpg, rv);
if (dbpg.Html_db_id() == -1) return false; // dbpg does not hdump; exit;

View File

@@ -43,7 +43,7 @@ public class Xohd_hdump_wtr {
else {
hdump_db = core_data_mgr.Dbs__get_at(html_db_id);
html_db_id = hdump_db.Id();
return;
// return; // DELETE: don't remember why return was here; DATE:2015-06-06
}
save_mgr.Update(tmp_bfr, hdump_db.Tbl__html(), page);
tmp_bfr.Mkr_rls();

View File

@@ -91,43 +91,45 @@ public class Xohd_abrv_mgr {
}
byte[] a_title = img.Lnki_ttl();
byte[] a_href = Bry_.Add(Xohd_abrv_.A_href_bgn, a_title);
switch (tid) {
case Xohd_abrv_.Tid_file_info: fmtr.Html_thumb_part_info (bfr, uid, a_href, cfg_file.Img_media_info_btn()); return rv;
case Xohd_abrv_.Tid_file_mgnf: fmtr.Html_thumb_part_magnify (bfr, uid, a_href, a_title, cfg_file.Img_thumb_magnify()); return rv;
case Xohd_abrv_.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, cfg_file.Img_media_play_btn()); return rv;
case Xohd_abrv_.Tid_gallery_box_max: {
Xohd_data_itm__gallery_mgr gly = (Xohd_data_itm__gallery_mgr)hpg.Gallery_itms().Get_by(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);
try {
switch (tid) {
case Xohd_abrv_.Tid_file_info: fmtr.Html_thumb_part_info (bfr, uid, a_href, cfg_file.Img_media_info_btn()); return rv;
case Xohd_abrv_.Tid_file_mgnf: fmtr.Html_thumb_part_magnify (bfr, uid, a_href, a_title, cfg_file.Img_thumb_magnify()); return rv;
case Xohd_abrv_.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, cfg_file.Img_media_play_btn()); return rv;
case Xohd_abrv_.Tid_gallery_box_max: {
Xohd_data_itm__gallery_mgr gly = (Xohd_data_itm__gallery_mgr)hpg.Gallery_itms().Get_by(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);
}
return rv;
}
case Xohd_abrv_.Tid_gallery_box_w: {
Xohd_data_itm__gallery_itm gly = (Xohd_data_itm__gallery_itm)img;
byte[] style = Gallery_mgr_base.hdump_box_w_fmtr.Bld_bry_many(tmp_bfr, gly.Box_w());
Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style);
return rv;
}
case Xohd_abrv_.Tid_gallery_img_w: {
Xohd_data_itm__gallery_itm gly = (Xohd_data_itm__gallery_itm)img;
byte[] style = Gallery_mgr_base.hdump_box_w_fmtr.Bld_bry_many(tmp_bfr, gly.Img_w());
Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style);
return rv;
}
case Xohd_abrv_.Tid_gallery_img_pad: {
Xohd_data_itm__gallery_itm gly = (Xohd_data_itm__gallery_itm)img;
byte[] style = Gallery_mgr_base.hdump_img_pad_fmtr.Bld_bry_many(tmp_bfr, gly.Img_pad());
Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style);
return rv;
}
return rv;
}
case Xohd_abrv_.Tid_gallery_box_w: {
Xohd_data_itm__gallery_itm gly = (Xohd_data_itm__gallery_itm)img;
byte[] style = Gallery_mgr_base.hdump_box_w_fmtr.Bld_bry_many(tmp_bfr, gly.Box_w());
Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style);
return rv;
url_bldr.Init_by_root(img.Orig_repo_id() == Xof_repo_itm_.Repo_remote ? file_dir_comm : file_dir_wiki, Byte_ascii.Slash, false, false, 2);
url_bldr.Init_by_itm(img.File_is_orig() ? Xof_repo_itm_.Mode_orig : Xof_repo_itm_.Mode_thumb, img.Lnki_ttl(), Xof_file_wkr_.Md5_(img.Lnki_ttl()), Xof_ext_.new_by_id_(img.Orig_ext()), img.File_w(), img.Lnki_time(), img.Lnki_page());
byte[] img_src = url_bldr.Xto_bry();
if (tid == Xohd_abrv_.Tid_img) {
fmtr_img.Bld_bfr_many(bfr, img_src, img_view_w, img.Html_h());
}
case Xohd_abrv_.Tid_gallery_img_w: {
Xohd_data_itm__gallery_itm gly = (Xohd_data_itm__gallery_itm)img;
byte[] style = Gallery_mgr_base.hdump_box_w_fmtr.Bld_bry_many(tmp_bfr, gly.Img_w());
Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style);
return rv;
}
case Xohd_abrv_.Tid_gallery_img_pad: {
Xohd_data_itm__gallery_itm gly = (Xohd_data_itm__gallery_itm)img;
byte[] style = Gallery_mgr_base.hdump_img_pad_fmtr.Bld_bry_many(tmp_bfr, gly.Img_pad());
Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style);
return rv;
}
}
url_bldr.Init_by_root(img.Orig_repo_id() == Xof_repo_itm_.Repo_remote ? file_dir_comm : file_dir_wiki, Byte_ascii.Slash, false, false, 2);
url_bldr.Init_by_itm(img.File_is_orig() ? Xof_repo_itm_.Mode_orig : Xof_repo_itm_.Mode_thumb, img.Lnki_ttl(), Xof_file_wkr_.Md5_(img.Lnki_ttl()), Xof_ext_.new_by_id_(img.Orig_ext()), img.File_w(), img.Lnki_time(), img.Lnki_page());
byte[] img_src = url_bldr.Xto_bry();
if (tid == Xohd_abrv_.Tid_img) {
fmtr_img.Bld_bfr_many(bfr, img_src, img_view_w, img.Html_h());
}
} catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "abrv.read: page=~{0} itm=~{1} err=~{2}", hpg.Url_bry_safe(), img == null ? "<NULL>" : img.Data_print(), Err_.Message_gplx(e));}
return rv;
}
private int Write_redlink(Bry_bfr bfr, Xog_page hpg, int uid, int rv) {

View File

@@ -23,12 +23,14 @@ public class Xob_hdump_bldr {
private final Xowd_db_mgr wiki_db_mgr; private final Xob_ns_to_db_mgr ns_to_db_mgr; int prv_row_len = 0;
private final Xodump_stats_itm stats_itm = new Xodump_stats_itm(); private final Xodump_stats_tbl stats_tbl;
private final Xog_page tmp_hpg = new Xog_page(); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_mb);
private final Xohd_page_html_mgr__save hdump_save_mgr = new Xohd_page_html_mgr__save();
public Xob_hdump_bldr(Xow_ns_mgr ns_mgr, Xodb_mgr_sql db_mgr, Db_conn make_conn, long hdump_db_max) {
private final Xohd_page_html_mgr__save hdump_save_mgr = new Xohd_page_html_mgr__save();
private final boolean hzip_enabled;
public Xob_hdump_bldr(Xow_ns_mgr ns_mgr, Xodb_mgr_sql db_mgr, Db_conn make_conn, long hdump_db_max, boolean hzip_enabled) {
this.wiki_db_mgr = db_mgr.Core_data_mgr();
this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__html(wiki_db_mgr.Db__core()), wiki_db_mgr, hdump_db_max);
this.stats_tbl = new Xodump_stats_tbl(make_conn);
Xob_ns_file_itm.Init_ns_bldr_data(Xowd_db_file_.Tid_html_data, ns_mgr, gplx.xowa.apis.xowa.bldrs.imports.Xoapi_import.Ns_file_map__each);
this.hzip_enabled = hzip_enabled;
}
public void Bld_term() {
this.Commit();
@@ -54,7 +56,7 @@ public class Xob_hdump_bldr {
Xow_hzip_mgr hzip_mgr = wiki.Html_mgr().Hzip_mgr();
page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last
wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); // write to html again, except in hdump mode
hzip_mgr.Write(tmp_bfr, stats_itm, page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear()); // hzip data
if (hzip_enabled) hzip_mgr.Write(tmp_bfr, stats_itm, page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear()); // hzip data
page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear()); // write to body bry
}
}

View File

@@ -74,7 +74,7 @@ public abstract class Xohd_data_itm__base implements Xohd_data_itm {
);
}
@gplx.Virtual public void Data_parse(Bry_rdr rdr) {
this.lnki_ttl = rdr.Read_bry_to_pipe();
this.lnki_ttl = Xoa_app_.Utl__encoder_mgr().Http_url().Decode(rdr.Read_bry_to_pipe());
this.orig_ext = rdr.Read_int_to_pipe();
this.lnki_type = rdr.Read_byte_to_pipe();
this.lnki_w = rdr.Read_int_to_pipe();

View File

@@ -24,6 +24,7 @@ public class Xohd_data_itm__gallery_mgr implements Xohd_data_itm {
public int Data_tid() {return Xohd_data_tid.Tid_gallery;}
public void Data_write(Bry_bfr bfr) {
bfr .Add_int_variable(Xohd_data_tid.Tid_gallery).Add_byte_pipe()
.Add_int_variable(uid).Add_byte_pipe()
.Add_int_variable(box_max).Add_byte_pipe()
;
bfr.Add_byte_nl();

View File

@@ -23,6 +23,7 @@ public class Xohd_page_html_mgr__load {
private final Xohd_page_srl_mgr srl_mgr = Xohd_page_srl_mgr.I;
private final Bry_rdr rdr = new Bry_rdr(); private final List_adp rows = List_adp_.new_(), imgs = List_adp_.new_();
public void Load_page(Xow_wiki wiki, Xog_page hpg, Xowd_html_tbl tbl, int page_id, Xoa_ttl page_ttl) {
Xoa_app_.Usr_dlg().Plog_many("", "", "hdump.load.text: ttl=~{0}", page_ttl.Full_db_as_str());
tbl.Select_by_page(rows, page_id);
Parse_rows(wiki, hpg, page_id, Xoa_url.blank_(), page_ttl, rows);
}
@@ -62,6 +63,7 @@ public class Xohd_page_html_mgr__load {
default : throw Err_.unhandled(tid);
}
img_itm.Data_parse(rdr);
// Xoa_app_.Usr_dlg().Log_many("", "", "itm: ~{0}", img_itm.Data_print());
rdr.Pos_add_one();
return img_itm;
}
@@ -80,6 +82,6 @@ public class Xohd_page_html_mgr__load {
private void Load_data_gallery(Xog_page hpg) {
int uid = rdr.Read_int_to_pipe();
int box_max = rdr.Read_int_to_pipe();
hpg.Gallery_itms().Add(uid, new Xohd_data_itm__gallery_mgr(uid, box_max));
hpg.Gallery_itms().Add_if_dupe_use_nth(uid, new Xohd_data_itm__gallery_mgr(uid, box_max)); // TODO: temporarily added b/c last build did not add gallery uid correctly
}
}

View File

@@ -82,6 +82,13 @@ public class Xow_hzip_itm__anchor {
int id_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, id_bgn, src_len); if (id_end == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled;
int id = Bry_.Xto_int_or(src, id_bgn, id_end, -1); if (id == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled;
int a_rhs_bgn = Bry_finder.Find_fwd(src, Find_a_rhs_bgn_bry, a_lhs_end, src_len); if (a_rhs_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_rhs_bgn_missing", bgn, ttl_end);
int ttl_len = ttl_end - ttl_bgn;
int html_text_len = a_rhs_bgn - a_lhs_end;
if ( !caption // lnki_text_n; EX: [[A]] not [[A|A1]]
&& site == null // not xwiki; EX: [[wikt:A]]
&& html_text_len != ttl_len) { // note that in 99% of lnki_text_n cases, html_text_len == text_len; however, tidy sometimes relocates html inside html_text; PAGE:en.w:Abyssal_plain; EX:<font color='green'>[[A]]</font>; DATE:2015-06-02
caption = true; // change to lnki_text_y
}
// caption
if (caption)
bfr.Add(Xow_hzip_dict.Bry_lnki_text_y);
@@ -92,7 +99,6 @@ public class Xow_hzip_itm__anchor {
if (site != null) {
bfr.Add_byte_pipe().Add(site).Add_byte_pipe();
}
int ttl_len = ttl_end - ttl_bgn;
if (caption) {
bfr.Add(ttl.Page_db());
bfr.Add_byte(Xow_hzip_dict.Escape);
@@ -100,10 +106,9 @@ public class Xow_hzip_itm__anchor {
return a_lhs_end;
}
else {
int capt_len = a_rhs_bgn - a_lhs_end;
if (capt_len == ttl_len && Bry_.Match(src, ttl_bgn, ttl_end, src, a_lhs_end, a_rhs_bgn))
if (!ttl.Ns().Id_main()) // non-main ns should write page_db only; EX: "Template:A" should write "A" since "Template" will be inferred by ns_id
bfr.Add(ttl.Page_db());
else
else // main ns should write html_text; handles [[a]] which has <a href="A">a</a>
bfr.Add_mid(src, a_lhs_end, a_rhs_bgn);
bfr.Add_byte(Xow_hzip_dict.Escape);
stats.Lnki_text_n_add();
@@ -181,7 +186,7 @@ public class Xow_hzip_itm__anchor {
// page
int ttl_end = Bry_finder.Find_fwd(src, Xow_hzip_dict.Escape, ttl_bgn, src_len); if (ttl_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_end_missing", bgn, ttl_bgn);
byte[] ttl_bry = Bry_.Mid(src, ttl_bgn, ttl_end);
Xoa_ttl ttl = ttl_parser.Ttl_parse(ns.Id(), ttl_bry);
Xoa_ttl ttl = ttl_parser.Ttl_parse(ns.Id(), ttl_bry); if (ttl == null) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_is_invalid", bgn, ttl_bgn);
byte[] ttl_full = ttl.Full_db();
bfr.Add_str_a7("<a href='");
if (site_bry != null) {
@@ -206,7 +211,7 @@ public class Xow_hzip_itm__anchor {
return rv;
}
public void Html_plain(Bry_bfr bfr, Xop_lnki_tkn lnki) {
bfr.Add_str
bfr.Add_str_a7
( lnki.Caption_exists() // caption exists; EX: [[A|b]]
|| lnki.Tail_bgn() != -1 // trailing chars; EX: [[A]]b
? "<a xtid='a_lnki_text_y' href=\"" // embed caption

View File

@@ -76,6 +76,10 @@ public class Xow_hzip_itm__anchor_tst {
fxt.Test_save(brys, "<a xtid='a_lnki_text_n' href=\"/wiki/A\" title=\"A\">A</a><a xtid='a_lnki_text_n' href=\"/wiki/B\" id=\"xowa_lnki_3\" title=\"B\">B</a>");
fxt.Test_load(brys, "<a xtid='a_lnki_text_n' href=\"/wiki/A\" title=\"A\">A</a><a href='/wiki/B' id='xowa_lnki_3' title='B'>B</a>");
}
@Test public void Srl_lnki_text_y__html() { // PURPOSE: PAGE:en.w:Abyssal_plain; DATE:2015-06-02
byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_y, Bry_.ints_(2), fxt.Make_int(3), Bry_.new_a7("A"), Xow_hzip_dict.Escape_bry, Bry_.new_a7("<font color='white'>A1</font>"), Xow_hzip_dict.Bry_a_rhs);
fxt.Test_save(brys, "<a xtid='a_lnki_text_n' href=\"/wiki/A\" id=\"xowa_lnki_3\" title='A'><font color='white'>A1</font></a>");
}
@Test public void Srl_lnke_txt() {
byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnke_txt, Bry_.new_a7("http://a.org"), Xow_hzip_dict.Escape_bry);
fxt.Test_save(brys, "<a xtid='a_lnke_txt' rel=\"nofollow\" class=\"external free\" href=\"http://a.org\">http://a.org</a>");

View File

@@ -77,6 +77,7 @@ public class Xow_hzip_mgr {
case Xow_hzip_dict.Tid_lnke_brk_text_y: pos = itm__anchor.Load_lnke(rv, src, src_len, itm_pos, tid); break;
case Xow_hzip_dict.Tid_a_rhs: pos = itm_pos; rv.Add_str("</a>"); break;
case Xow_hzip_dict.Tid_hdr_lhs: pos = itm__header.Load(rv, src, src_len, itm_pos); break;
default: pos = itm_pos; Warn_by_pos("hzip.load.unknown", pos, itm_pos); break; // NOTE: should not happen, but handle else infinite loop; DATE:2015-06-08
}
}
else {
@@ -92,7 +93,7 @@ public class Xow_hzip_mgr {
private int Warn_by_pos(String err, int bgn, int end, int end_adj) {
end += end_adj; if (end > src_len) end = src_len;
usr_dlg.Warn_many("", "", "hzip failed: page=~{0} err=~{1} mid=~{2}", String_.new_u8(page_url), err, String_.new_u8(src, bgn, end));
return Unhandled;
return end + 1;
}
public static final int Unhandled = -1;
private static final byte

View File

@@ -50,7 +50,7 @@ public class Xoh_file_mgr {
)
return false;
if (source_wiki.File_mgr().Version() == Xow_file_mgr.Version_2)
return ctx.App().Usere().File__xfer_itm_finder().Find(source_wiki, xfer.Lnki_exec_tid(), xfer, ctx.Cur_page().Url_bry_safe());
return ctx.App().User().User_db_mgr().File__xfer_itm_finder().Find(source_wiki, xfer.Lnki_exec_tid(), xfer, ctx.Cur_page().Url_bry_safe());
else
return source_wiki.File_mgr().Find_meta(xfer);
}

View File

@@ -140,7 +140,7 @@ public class Xoh_file_wtr__basic {
byte[] link_ref_new = tmp_link_parser.Parse(tmp_bfr, tmp_url, wiki, link_ref, lnki_href);
link_ref = link_ref_new == null ? lnki_href: link_ref_new; // if parse fails, then assign to lnki_href; EX:link={{{1}}}
link_ref = Xoa_app_.Utl__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());
if (Bry_.Len_gt_0(tmp_link_parser.Html_xowa_ttl())) 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, img_cls_tid, img_cls_other);
}
if (div_align_exists) bfr.Add(Html_tag_.Div_rhs); // close div from above

View File

@@ -51,7 +51,7 @@ public class Xoh_lnke_wtr {
byte[] lnke_xwiki_wiki = lnke.Lnke_xwiki_wiki();
if (lnke_xwiki_wiki == null) {
if (lnke.Lnke_relative()) { // relative; EX: //a.org
bfr.Add(app.Url_parser().Url_parser().Relative_url_protocol_bry()).Add_mid(src, lnke_bgn, lnke_end);
bfr.Add(app.Utl__url_parser().Url_parser().Relative_url_protocol_bry()).Add_mid(src, lnke_bgn, lnke_end);
return true;
}
else { // xowa or regular; EX: http://a.org

View File

@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.xowa.apps.progs.*; import gplx.xowa.net.*; import gplx.xowa.wikis.xwikis.*;
public class Xop_lnke_wkr implements Xop_ctx_wkr {
public void Ctor_ctx(Xop_ctx ctx) {url_parser = ctx.App().Url_parser().Url_parser();} Gfo_url_parser url_parser; Gfo_url_site_data site_data = new Gfo_url_site_data(); Xoa_url_parser xo_url_parser = new Xoa_url_parser(); Xoa_url xo_url_parser_url = Xoa_url.blank_();
public void Ctor_ctx(Xop_ctx ctx) {url_parser = ctx.App().Utl__url_parser().Url_parser();} Gfo_url_parser url_parser; Gfo_url_site_data site_data = new Gfo_url_site_data(); Xoa_url_parser xo_url_parser = new Xoa_url_parser(); Xoa_url xo_url_parser_url = Xoa_url.blank_();
public void Page_bgn(Xop_ctx ctx, Xop_root_tkn root) {}
public void Page_end(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int src_len) {}
public boolean Dangling_goes_on_stack() {return dangling_goes_on_stack;} public void Dangling_goes_on_stack_(boolean v) {dangling_goes_on_stack = v;} private boolean dangling_goes_on_stack;

View File

@@ -36,10 +36,9 @@ public class Gxw_html_server implements Gxw_html {
public String Html_doc_selected_get_href_or_text() {return Exec(cfg.Doc_selected_get_href_or_text());}
public String Html_doc_selected_get_src_or_empty() {return Exec(cfg.Doc_selected_get_src_or_empty());}
public String Html_doc_selected_get_active_or_selection() {return Exec(cfg.Doc_selected_get_active_or_selection());}
public boolean Html_doc_find(String id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find) {throw Err_.not_implemented_();}
public boolean Html_doc_find(String id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) {throw Err_.not_implemented_();}
public void Html_doc_body_focus() {Exec(cfg.Doc_body_focus());}
public void Html_doc_selection_focus_toggle() {Exec(cfg.Doc_selection_focus_toggle());}
public boolean Html_doc_loaded() {return Bool_.cast_(Exec(cfg.Doc_loaded()));}
public String Html_elem_atr_get_str (String id, String atr_key) {return Exec(cfg.Elem_atr_get(id, atr_key));}
public boolean Html_elem_atr_get_bool (String id, String atr_key) {return Bool_.parse_(Exec(cfg.Elem_atr_get(id, atr_key)));}
public boolean Html_elem_atr_set (String id, String atr_key, String val) {return Exec_as_bool(cfg.Elem_atr_set(id, atr_key, val));}

View File

@@ -75,7 +75,7 @@ public class Http_server_mgr implements GfoInvkAble {
byte[] wiki_domain = Bry_.new_u8(wiki_domain_str);
byte[] page_ttl = Bry_.new_u8(page_ttl_str);
Xowe_wiki wiki = app.Wiki_mgr().Get_by_key_or_make(wiki_domain); // get the wiki
Xoa_url page_url = app.Url_parser().Parse(page_ttl); // get the url (needed for query args)
Xoa_url page_url = app.Utl__url_parser().Parse(page_ttl); // get the url (needed for query args)
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, page_ttl); // get the ttl
Xoae_page page = wiki.Load_page_by_ttl(page_url, ttl); // get page and parse it
Gxw_html_server.Assert_tab(app, page); // HACK: assert at least 1 tab

View File

@@ -19,7 +19,7 @@ package gplx.xowa.specials; import gplx.*; import gplx.xowa.*;
import gplx.xowa.users.history.*;
import gplx.xowa.specials.*;
import gplx.xowa.specials.allPages.*; import gplx.xowa.specials.search.*; import gplx.xowa.specials.nearby.*; import gplx.xowa.specials.randoms.*; import gplx.xowa.specials.statistics.*; import gplx.xowa.xtns.translates.*; import gplx.xowa.specials.movePage.*;
import gplx.xowa.specials.xowa.system_data.*; import gplx.xowa.specials.xowa.default_tab.*; import gplx.xowa.specials.xowa.popup_history.*; import gplx.xowa.specials.xowa.file_browsers.*;
import gplx.xowa.specials.xowa.system_data.*; import gplx.xowa.specials.xowa.default_tab.*; import gplx.xowa.specials.xowa.popup_history.*; import gplx.xowa.specials.xowa.file_browsers.*; import gplx.xowa.specials.xowa.bookmarks.*;
import gplx.xowa.xtns.wdatas.specials.*;
import gplx.xowa.users.data.*;
public class Xows_mgr {
@@ -46,6 +46,7 @@ public class Xows_mgr {
public Default_tab_page Page_default_tab() {return page_default_tab;} private final Default_tab_page page_default_tab = new Default_tab_page();
public Popup_history_page Page_popup_history() {return page_popup_history;} private final Popup_history_page page_popup_history = new Popup_history_page();
public Xosp_fbrow_special Page_file_browser() {return page_file_browser;} private final Xosp_fbrow_special page_file_browser = new Xosp_fbrow_special();
public Xows_bmk_page Page_bmk() {return page_bmk;} private final Xows_bmk_page page_bmk = new Xows_bmk_page();
public void Evt_lang_changed(Xol_lang lang) {
hash.Clear();
hash.Add_str_obj(Xows_special_meta_.Key__search , page_search);
@@ -65,12 +66,13 @@ public class Xows_mgr {
hash.Add_str_obj(Xows_special_meta_.Key__default_tab , page_default_tab);
hash.Add_str_obj(Xows_special_meta_.Key__popup_history , page_popup_history);
hash.Add_str_obj(Xows_special_meta_.Key__file_browser , page_file_browser);
hash.Add_str_obj(Xows_special_meta_.Key__bookmarks , page_bmk);
}
public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) {
int slash_pos = Bry_finder.Find_fwd(ttl.Page_txt_wo_qargs(), Xoa_ttl.Subpage_spr); // check for slash
byte[] special_name = slash_pos == Bry_.NotFound
? ttl.Base_txt_wo_qarg() // no slash found; use base_txt; ignore qry args and just get page_names; EX: Search/Earth?fulltext=y; Allpages?from=Earth...
: Bry_.Mid(ttl.Page_txt_wo_qargs(), 0, slash_pos); // slash found; use root page; EX: Special:ItemByTitle/enwiki/Earth
? ttl.Base_txt_wo_qarg() // no slash found; use base_txt; ignore qry args and just get page_names; EX: Search/Earth?fulltext=y; Allpages?from=Earth...
: Bry_.Mid(ttl.Page_txt_wo_qargs(), 0, slash_pos); // slash found; use root page; EX: Special:ItemByTitle/enwiki/Earth
// byte[] special_name = ttl.Base_txt_wo_qarg(); // NOTE: ignore qry args and just get page_names; EX: Search/Earth?fulltext=y; Allpages?from=Earth...
Object o = hash.Get_by_bry(special_name);
if (o == null) {

View File

@@ -33,6 +33,7 @@ public class Xows_special_meta_ {
, Uid__system_data = 12
, Uid__nearby = 13
, Uid__page_history = 14
, Uid__bookmarks = 15
;
public static final String
Key__all_pages = "AllPages"
@@ -49,6 +50,7 @@ public class Xows_special_meta_ {
, Key__system_data = "XowaSystemData"
, Key__nearby = "Nearby"
, Key__page_history = "XowaHistory"
, Key__bookmarks = "XowaBookmarks"
;
public static final Xows_special_meta
Itm__all_pages = new Xows_special_meta(Src__mw , Uid__all_pages , Key__all_pages)
@@ -65,5 +67,6 @@ public class Xows_special_meta_ {
, Itm__system_data = new Xows_special_meta(Src__xowa , Uid__system_data , Key__system_data)
, Itm__nearby = new Xows_special_meta(Src__xowa , Uid__nearby , Key__nearby)
, Itm__page_history = new Xows_special_meta(Src__xowa , Uid__page_history , Key__page_history)
, Itm__bookmarks = new Xows_special_meta(Src__xowa , Uid__bookmarks , Key__bookmarks)
;
}

View File

@@ -45,7 +45,7 @@ class Xop_randomRootPage_page_fxt {
}
public static Xoae_page Test_special_open(Xowe_wiki wiki, Xows_page special_page, String special_url) {
Xoae_page page = wiki.Ctx().Cur_page();
Xoa_url url = Xoa_url_parser.Parse_url(wiki.Appe(), wiki, special_url);
Xoa_url url = wiki.Appe().Utl__url_parser().Parse(Bry_.new_u8(special_url));
page.Url_(url);
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_a7(special_url));
page.Ttl_(ttl);

View File

@@ -35,7 +35,7 @@ public class Xog_search_suggest_mgr implements GfoInvkAble {
this.args_default_str = v;
byte[] bry = Bry_.new_u8("http://x.org/a?" + v);
Gfo_url tmp_url = new Gfo_url();
app.Url_parser().Url_parser().Parse(tmp_url, bry, 0, bry.length);
app.Utl__url_parser().Url_parser().Parse(tmp_url, bry, 0, bry.length);
args_default = tmp_url.Args();
}
private String args_default_str = "";// default args for search

View File

@@ -0,0 +1,28 @@
/*
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.specials.xowa.bookmarks; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*;
import gplx.core.primitives.*;
public class Xows_bmk_page implements Xows_page {
public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__bookmarks;}
public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) {
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_m001();
wiki.App().User().User_db_mgr().Bmk_mgr().Get_all(tmp_bfr);
page.Data_raw_(tmp_bfr.To_bry_and_rls());
page.Html_data().Html_restricted_n_();
}
}

View File

@@ -20,7 +20,6 @@ import gplx.xowa.users.data.*;
import gplx.xowa.files.caches.*;
public interface Xou_user {
String Key();
Xou_db_file Data__db_file();
Xou_cache_mgr File__cache_mgr();
Xou_file_itm_finder File__xfer_itm_finder();
Xou_db_mgr User_db_mgr();
Xow_wiki Wikii();
}

View File

@@ -22,20 +22,20 @@ import gplx.xowa.files.*; import gplx.xowa.files.caches.*;
public class Xoue_user implements Xou_user, GfoEvMgrOwner, GfoInvkAble {
public Xoue_user(Xoae_app app, Io_url user_dir) {
this.app = app; this.key = user_dir.NameOnly();
this.fsys_mgr = new Xou_fsys_mgr(app, this, user_dir);
this.history_mgr = new Xou_history_mgr(fsys_mgr.App_data_history_fil());
this.ev_mgr = GfoEvMgr.new_(this);
this.fsys_mgr = new Xou_fsys_mgr(app, this, user_dir);
this.user_db_mgr = new Xou_db_mgr(app);
this.history_mgr = new Xou_history_mgr(fsys_mgr.App_data_history_fil());
this.prefs_mgr = new gplx.xowa.users.prefs.Prefs_mgr(app);
this.cfg_mgr = new Xou_cfg(this);
this.session_mgr = new Xou_session(this);
}
public String Key() {return key;} private String key;
public Xou_db_file Data__db_file() {return db_file;} private Xou_db_file db_file;
public Xou_cache_mgr File__cache_mgr() {return cache_mgr;} private Xou_cache_mgr cache_mgr;
public Xou_file_itm_finder File__xfer_itm_finder() {return xfer_itm_finder;} private Xou_file_itm_finder xfer_itm_finder;
public Xoae_app Appe() {return app;} private final Xoae_app app;
public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr;
public Xoud_db_mgr Data_mgr() {return data_mgr;} private Xoud_db_mgr data_mgr = new Xoud_db_mgr();
public String Key() {return key;} private String key;
public Xou_db_mgr User_db_mgr() {return user_db_mgr;} private final Xou_db_mgr user_db_mgr;
public Xow_wiki Wikii() {return wiki;}
public Xoae_app Appe() {return app;} private final Xoae_app app;
public Xol_lang Lang() {if (lang == null) {lang = app.Lang_mgr().Get_by_key_or_new(app.Sys_cfg().Lang()); lang.Init_by_load();} return lang;} private Xol_lang lang;
public void Lang_(Xol_lang v) {
lang = v;
@@ -57,20 +57,12 @@ public class Xoue_user implements Xou_user, GfoEvMgrOwner, GfoInvkAble {
public void Init_by_app(Xoae_app app) {
Io_url user_system_cfg = fsys_mgr.App_data_cfg_dir().GenSubFil(Xou_fsys_mgr.Name_user_system_cfg);
if (!Io_mgr.I.ExistsFil(user_system_cfg)) Xou_user_.User_system_cfg_make(app.Usr_dlg(), user_system_cfg);
Init_db();
user_db_mgr.Init_by_app(Bool_.N, fsys_mgr.Root_dir().OwnerDir().GenSubFil("xowa.user." + key + ".sqlite3")); // EX: /xowa/user/xowa.user.anonymous.sqlite3
if (!Env_.Mode_testing()) {
this.Available_from_fsys();
// data_mgr.Init_by_app(app);
}
}
public void Init_db() { // TEST:
Io_url db_url = fsys_mgr.Root_dir().OwnerDir().GenSubFil("xowa.user." + key + ".sqlite3"); // EX: /xowa/user/xowa.user.anonymous.sqlite3
Db_conn_bldr_data db_conn_bldr = Db_conn_bldr.I.Get_or_new(db_url);
this.db_file = new Xou_db_file(db_conn_bldr.Conn());
db_file.Init_assert();
this.cache_mgr = new Xou_cache_mgr(app.Wiki_mgr(), app.Fsys_mgr().File_dir(), db_file);
this.xfer_itm_finder = new Xou_file_itm_finder(cache_mgr);
}
public void App_term() {
session_mgr.Window_mgr().Save_window(app.Gui_mgr().Browser_win().Win_box());
history_mgr.Save(app);

View File

@@ -21,17 +21,14 @@ import gplx.xowa.users.data.*;
import gplx.xowa.files.*; import gplx.xowa.files.caches.*;
import gplx.xowa.wikis.*;
public class Xouv_user implements Xou_user {
private Xoa_wiki_mgr wiki_mgr;
public Xouv_user(String key) {this.key = key;}
public String Key() {return key;} private String key;
public Xou_db_file Data__db_file() {return db_file;} private Xou_db_file db_file;
public Xou_cache_mgr File__cache_mgr() {return cache_mgr;} private Xou_cache_mgr cache_mgr;
public Xou_file_itm_finder File__xfer_itm_finder() {return xfer_itm_finder;} private Xou_file_itm_finder xfer_itm_finder;
public void Init_db(Xoa_wiki_mgr wiki_mgr, Io_url user_root_dir) {
Io_url db_url = user_root_dir.OwnerDir().GenSubFil("xowa.user." + key + ".sqlite3"); // EX: /xowa/user/xowa.user.anonymous.sqlite3
Db_conn_bldr_data db_conn_bldr = Db_conn_bldr.I.Get_or_new(db_url);
this.db_file = new Xou_db_file(db_conn_bldr.Conn());
db_file.Init_assert();
this.cache_mgr = new Xou_cache_mgr(wiki_mgr, user_root_dir, db_file);
this.xfer_itm_finder = new Xou_file_itm_finder(cache_mgr);
public Xou_db_mgr User_db_mgr() {return user_db_mgr;} private Xou_db_mgr user_db_mgr;
public Xow_wiki Wikii() {if (wiki == null) wiki = wiki_mgr.Get_by_key_or_make_2(Xow_domain_.Domain_bry_home); return wiki;} private Xow_wiki wiki;
public void Init_db(Xoa_app app, Xoa_wiki_mgr wiki_mgr, Io_url db_url) {
this.wiki_mgr = wiki_mgr;
this.user_db_mgr = new Xou_db_mgr(app);
user_db_mgr.Init_by_app(Bool_.Y, db_url);
}
}

View File

@@ -34,19 +34,12 @@ public class Xou_db_file {
public Xou_cache_tbl Tbl__cache() {return tbl__cache;} private final Xou_cache_tbl tbl__cache;
public Xoud_bmk_tbl Tbl__bmk() {return tbl__bmk;} private final Xoud_bmk_tbl tbl__bmk;
public void Init_assert() {
boolean create = false;
if (Env_.Mode_testing()) {
create = true;
}
else {
Schema_db_mgr schema_db_mgr = new Schema_db_mgr();
schema_db_mgr.Loader_(Schema_loader_mgr_.Sqlite);
schema_db_mgr.Init(conn);
create = !schema_db_mgr.Tbl_mgr().Has(tbl__cache.Tbl_name());
}
if (create) {
if (!conn.Schema_tbl_exists(tbl__cache.Tbl_name())) {
tbl__cfg.Create_tbl();
tbl__cache.Create_tbl();
}
// if (!conn.Schema_tbl_exists(tbl__bmk.Tbl_name())) {
// tbl__bmk.Create_tbl();
// }
}
}

View File

@@ -16,20 +16,36 @@ 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.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*;
import gplx.core.threads.*; import gplx.dbs.*; import gplx.dbs.schemas.updates.*; import gplx.dbs.schemas.*;
public class Xoud_db_mgr {
import gplx.core.threads.*; import gplx.dbs.*; import gplx.dbs.schemas.updates.*; import gplx.dbs.schemas.*;
import gplx.xowa.files.caches.*;
public class Xou_db_mgr {
private final Xoa_app app;
private final Xoud_id_mgr id_mgr;
public Xoud_db_mgr() {
id_mgr = new Xoud_id_mgr(cfg_mgr);
site_mgr = new Xoud_site_mgr(id_mgr);
public Xou_db_mgr(Xoa_app app) {
this.app = app;
this.id_mgr = new Xoud_id_mgr(cfg_mgr);
this.site_mgr = new Xoud_site_mgr(id_mgr);
}
public Xou_db_file Db_file() {return db_file;} private Xou_db_file db_file;
public Xoud_cfg_mgr Cfg_mgr() {return cfg_mgr;} private final Xoud_cfg_mgr cfg_mgr = new Xoud_cfg_mgr();
public Xoud_site_mgr Site_mgr() {return site_mgr;} private final Xoud_site_mgr site_mgr;
public Xoud_history_mgr History_mgr() {return history_mgr;} private final Xoud_history_mgr history_mgr = new Xoud_history_mgr();
public void Init_by_boot(Db_conn user_conn, boolean created, int user_id) {
cfg_mgr.Conn_(user_conn, created, user_id);
site_mgr.Conn_(user_conn, created, user_id);
history_mgr.Conn_(user_conn, created, user_id);
public Xoud_bmk_mgr Bmk_mgr() {return bmk_mgr;} private final Xoud_bmk_mgr bmk_mgr = new Xoud_bmk_mgr();
public Xou_cache_mgr Cache_mgr() {return cache_mgr;} private Xou_cache_mgr cache_mgr;
public Xou_file_itm_finder File__xfer_itm_finder() {return xfer_itm_finder;} private Xou_file_itm_finder xfer_itm_finder;
public void Init_by_app(boolean drd, Io_url db_url) {
bmk_mgr.Init_by_app(app);
Db_conn_bldr_data db_conn_bldr = Db_conn_bldr.I.Get_or_new(db_url);
Db_conn conn = db_conn_bldr.Conn(); boolean created = db_conn_bldr.Created();
this.db_file = new Xou_db_file(conn); db_file.Init_assert();
this.cache_mgr = new Xou_cache_mgr(app.Wiki_mgri(), app.Fsys_mgr().File_dir(), db_file);
this.xfer_itm_finder = new Xou_file_itm_finder(cache_mgr);
if (drd) {
cfg_mgr.Conn_(conn, created);
site_mgr.Conn_(conn, created);
// bmk_mgr.Conn_(conn, created);
// history_mgr.Conn_(user_conn, created);
}
}
// private void Init_user_db_changes(Schema_update_mgr updater) {
// updater.Add(Schema_update_cmd_.Make_tbl_create(Xoud_regy_tbl.Tbl_name , Xoud_regy_tbl.Tbl_sql , Xoud_regy_tbl.Idx_core));

View File

@@ -0,0 +1,64 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*;
import gplx.xowa.wikis.*; import gplx.xowa.html.wtrs.*;
class Xoud_bmk_hwtr implements Bry_fmtr_arg {
// private Xoa_wiki_mgr wiki_mgr; private Xoh_lnki_bldr lnki_bldr;
// private Xoa_url_parser url_parser;
// private Xoud_bmk_row[] row_ary;
public void Init_by_app(Xoa_app app) {
// Xoae_app app; app.Url_parser()
// this.wiki_mgr = app.Wiki_mgri();
// this.lnki_bldr = app.Html__lnki_bldr();
}
public void Write(Bry_bfr bfr, Xoud_bmk_row[] row_ary) {
// this.row_ary = row_ary;
grp_fmtr.Bld_bfr_many(bfr, this);
}
public void XferAry(Bry_bfr bfr, int idx) {
// int row_ary_len = row_ary.length;
// for (int i = 0; i < row_ary_len; ++i) {
// Xoud_bmk_row row = row_ary[i];
// byte[] wiki_bry = Bry_.new_u8(row.Wiki());
// Xow_wiki wiki = wiki_mgr.Get_by_key_or_make_2(wiki_bry);
// byte[] page_bry = Bry_.new_u8(row.Page());
// byte[] page_url = lnki_bldr.Href_(wiki, page_bry).Caption_(Xoa_ttl.Replace_unders(page_bry)).Bld_to_bry();
// row_fmtr.Bld_bfr_many(bfr, wiki_bry, page_url, row.Anch(), row.Qarg());
// }
}
private static final Bry_fmtr grp_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl
( "<table class='wikitable'>"
, " <tr>"
, " <th>Wiki</th>"
, " <th>Page</th>"
, " <th>Anchor</th>"
, " <th>Qargs</th>"
, " <th></th>"
, " </tr>~{rows}"
, "</table>"
), "rows");
// private static final Bry_fmtr row_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl
// ( " <tr>"
// , " <td>~{wiki}</td>"
// , " <td>~{page}</td>"
// , " <td>~{anchor}</td>"
// , " <td>~{qarg}</td>"
// , " <td>delete_btn</td>"
// , " </tr>"
// ), "wiki", "page", "anchor", "qarg");
}

View File

@@ -15,10 +15,23 @@ 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.dbs.schemas; import gplx.*; import gplx.dbs.*;
public class Schema_tbl_mgr {
private Ordered_hash hash = Ordered_hash_.new_();
public void Add(Schema_tbl_itm itm) {hash.Add(itm.Name(), itm);}
public boolean Has(String name) {return hash.Has(name);}
public Schema_tbl_itm Get(String name) {return (Schema_tbl_itm)hash.Get_by(name);}
package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*;
import gplx.dbs.*;
public class Xoud_bmk_mgr {
private Xoud_bmk_tbl tbl;
private Xoud_bmk_hwtr hwtr = new Xoud_bmk_hwtr();
public void Init_by_app(Xoa_app app) {
hwtr.Init_by_app(app);
}
public void Conn_(Db_conn conn, boolean created) {
this.tbl = new Xoud_bmk_tbl(conn);
if (created) tbl.Create_tbl();
}
public void Add(Xoa_url url) {
tbl.Insert(url.Raw());
}
public void Get_all(Bry_bfr bfr) {
Xoud_bmk_row[] row_ary = tbl.Select_all();
hwtr.Write(bfr, row_ary);
}
}

View File

@@ -17,19 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*;
public class Xoud_bmk_row {
public Xoud_bmk_row(int id, String wiki, String page, String qarg, String name, String comment, String tag, int sort, int count, DateAdp time) {
this.id = id; this.wiki = wiki; this.page = page; this.qarg = qarg;
this.name = name; this.comment = comment; this.tag = tag;
this.sort = sort; this.count = count; this.time = time;
public Xoud_bmk_row(int id, byte[] url) {
this.id = id; this.url = url;
}
public int Id() {return id;} private final int id;
public String Wiki() {return wiki;} private final String wiki;
public String Page() {return page;} private final String page;
public String Qarg() {return qarg;} private final String qarg;
public String Name() {return name;} private final String name;
public String Comment() {return comment;} private final String comment;
public String Tag() {return tag;} private final String tag;
public int Sort() {return sort;} private final int sort;
public int Count() {return count;} private final int count;
public DateAdp Time() {return time;} private final DateAdp time;
public byte[] Url() {return url;} private final byte[] url;
}

View File

@@ -18,54 +18,40 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*;
import gplx.dbs.*; import gplx.dbs.qrys.*;
public class Xoud_bmk_tbl implements RlsAble {
private final String tbl_name = "user_bmk"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_id, fld_wiki, fld_page, fld_qarg, fld_name, fld_comment, fld_tag, fld_sort, fld_time, fld_count;
private final String tbl_name = "bmk_core"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
private final String fld_id, fld_url;
public Xoud_bmk_tbl(Db_conn conn) {
this.conn = conn;
fld_id = flds.Add_int_pkey_autonum("bmk_id");
fld_wiki = flds.Add_str("bmk_wiki", 255);
fld_page = flds.Add_str("bmk_page", 255);
fld_qarg = flds.Add_str("bmk_qarg", 255);
fld_name = flds.Add_str("bmk_name", 255);
fld_comment = flds.Add_str("bmk_comment", 2048);
fld_tag = flds.Add_str("bmk_tag", 2048);
fld_sort = flds.Add_int("bmk_sort");
fld_count = flds.Add_int("bmk_count");
fld_time = flds.Add_str("bmk_time", 20);
fld_url = flds.Add_str("bmk_url", 255);
conn.Rls_reg(this);
}
public Db_conn Conn() {return conn;} private final Db_conn conn;
public void Insert(String wiki, String page, String qarg, String name, String comment, String tag, int sort, DateAdp time, int count) {
public String Tbl_name() {return tbl_name;}
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds.To_fld_ary()));}
public void Insert(byte[] url) {
Db_stmt stmt_insert = conn.Stmt_insert(tbl_name, flds);
stmt_insert.Clear().Val_str(fld_wiki, wiki).Val_str(fld_page, page).Val_str(fld_qarg, qarg)
.Val_str(fld_name, name).Val_str(fld_comment, comment).Val_str(fld_tag, tag)
.Val_int(fld_sort, sort).Val_int(fld_count, count).Val_str(fld_time, time.XtoStr_fmt_iso_8561())
stmt_insert.Clear().Val_bry_as_str(fld_url, url)
.Exec_insert();
}
public void Delete(int id) {
Db_stmt stmt_delete = conn.Stmt_delete(tbl_name, fld_id);
stmt_delete.Clear().Crt_int(fld_id, id).Exec_delete();
}
public void Select_all(List_adp rv) {
public Xoud_bmk_row[] Select_all() {
List_adp list = List_adp_.new_();
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Clear().Exec_select__rls_auto();
try {
while (rdr.Move_next())
rv.Add(new_row(rdr));
list.Add(new_row(rdr));
}
finally {rdr.Rls();}
return (Xoud_bmk_row[])list.To_ary_and_clear(Xoud_bmk_row.class);
}
private Xoud_bmk_row new_row(Db_rdr rdr) {
return new Xoud_bmk_row
( rdr.Read_int(fld_id)
, rdr.Read_str(fld_wiki)
, rdr.Read_str(fld_page)
, rdr.Read_str(fld_qarg)
, rdr.Read_str(fld_name)
, rdr.Read_str(fld_comment)
, rdr.Read_str(fld_tag)
, rdr.Read_int(fld_sort)
, rdr.Read_int(fld_count)
, rdr.Read_date_by_str(fld_time)
, rdr.Read_bry_by_str(fld_url)
);
}
public void Rls() {}

View File

@@ -17,9 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*;
public class Xoud_cfg_mgr {
private Db_cfg_tbl tbl;
public void Conn_(Db_conn new_conn, boolean created, int user_id) {
public class Xoud_cfg_mgr {
public Db_cfg_tbl Tbl() {return tbl;} private Db_cfg_tbl tbl;
public void Conn_(Db_conn new_conn, boolean created) {
tbl = new Db_cfg_tbl(new_conn, "user_opt");
if (created) tbl.Create_tbl();
}

View File

@@ -20,7 +20,7 @@ import gplx.core.threads.*; import gplx.dbs.*;
import gplx.xowa.specials.*;
public class Xoud_history_mgr implements GfoInvkAble {
private Xoud_history_tbl history_tbl;
public void Conn_(Db_conn new_conn, boolean created, int user_id) {
public void Conn_(Db_conn new_conn, boolean created) {
history_tbl = new Xoud_history_tbl(new_conn);
if (created) history_tbl.Create_tbl();
}

View File

@@ -22,7 +22,7 @@ public class Xoud_history_special implements Bry_fmtr_arg, Xows_page {
public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__page_history;}
public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) {
Xoae_app app = wiki.Appe();
Xoud_history_mgr mgr = app.Usere().Data_mgr().History_mgr();
Xoud_history_mgr mgr = app.User().User_db_mgr().History_mgr();
mgr.Select(rows, 100);
Bry_bfr bfr = app.Utl__bfr_mkr().Get_m001();
html_grp.Bld_bfr_many(bfr, this);

View File

@@ -21,7 +21,7 @@ public class Xoud_site_mgr {
private Xoud_site_tbl tbl;
private final Xoud_id_mgr id_mgr;
public Xoud_site_mgr(Xoud_id_mgr id_mgr) {this.id_mgr = id_mgr;}
public void Conn_(Db_conn conn, boolean created, int user_id) {
public void Conn_(Db_conn conn, boolean created) {
tbl = new Xoud_site_tbl(conn);
if (created) tbl.Create_tbl();
}

View File

@@ -70,7 +70,7 @@ class Xou_history_mgr_fxt {
page.Revision_data().Modified_on_(DateAdp_.Now());
byte[] url_bry = ttl_bry;
if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_u8(arg_str));
Xoa_url url = app.Url_parser().Parse(url_bry);
Xoa_url url = app.Utl__url_parser().Parse(url_bry);
url.Wiki_bry_(wiki.Domain_bry());
page.Url_(url); // set url b/c history_mgr.Add uses url
// page.Url_(Xoa_url.new_(wiki.Key_bry(), url_bry)); // set url b/c history_mgr.Add uses url

View File

@@ -29,9 +29,10 @@ public class Xowd_db_mgr {
public Xowd_db_file Db__text() {return db__text;} private Xowd_db_file db__text;
public Xowd_db_file Db__html() {return db__html;} private Xowd_db_file db__html;
public Xowd_db_file Db__cat_core() {return db__cat_core;} private Xowd_db_file db__cat_core;
public Xowd_db_file Db__search() {return db__search;} private Xowd_db_file db__search;
public Xowd_db_file Db__search() {return db__search;} private Xowd_db_file db__search;
public Xowd_db_file Db__wbase() {return db__wbase;} private Xowd_db_file db__wbase;
public int Dbs__len() {return dbs__ary.length;}
public void Db__wbase_(Xowd_db_file v) {db__wbase = v;}
public Xowd_db_file Dbs__get_at(int i) {return dbs__ary[i];}
public Xowd_db_file Dbs__make_by_tid(byte tid) {
int tid_idx = Get_tid_idx(db_file_hash, tid);

View File

@@ -39,6 +39,11 @@ public class Xowd_css_core_tbl implements RlsAble {
Db_stmt stmt_update = conn.Stmt_update_exclude(tbl_name, flds, fld_id);
stmt_update.Val_str(fld_key, key).Val_str(fld_updated_on, updated_on.XtoStr_fmt_yyyyMMdd_HHmmss()).Crt_int(fld_id, id).Exec_update();
}
public Xowd_css_core_itm Select_by_key(String key) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_key).Crt_str(fld_key, key).Exec_select__rls_auto();
try {return rdr.Move_next() ? new_itm(rdr) : null;}
finally {rdr.Rls();}
}
public int Select_id_by_key(String key) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_key).Crt_str(fld_key, key).Exec_select__rls_auto();
try {return rdr.Move_next() ? rdr.Read_int(fld_id) : Id_null;}

View File

@@ -52,5 +52,6 @@ public class Hiero_xtn_mgr extends Xox_mgr_base implements GfoInvkAble {
else return super.Invk(ctx, ikey, k, m);
}
public static final String Invk_prefabs = "prefabs", Invk_files = "files", Invk_phonemes = "phonemes";
public static Io_url Hiero_root_dir(Xoa_fsys_mgr fsys_mgr) {return fsys_mgr.Bin_xtns_dir().GenSubDir("Wikihiero");}
public static void Hiero_root_dir_(Io_url v) {hiero_root_dir = v;} private static Io_url hiero_root_dir;
public static Io_url Hiero_root_dir(Xoa_fsys_mgr fsys_mgr) {return hiero_root_dir == null ? fsys_mgr.Bin_xtns_dir().GenSubDir("Wikihiero") : hiero_root_dir;}
}

View File

@@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.xowa.files.*; import gplx.xowa.html.*; import gplx.xowa.files.gui.*; import gplx.xowa.gui.views.*; import gplx.xowa.html.lnkis.*;
import gplx.xowa.html.hdumps.core.*;
public class Imap_map implements Xoh_file_img_wkr, Js_img_wkr {
private static final Imap_map_fmtr map_fmtr_arg = new Imap_map_fmtr();
public Imap_map(int id) {this.id = id;}
@@ -42,6 +43,8 @@ public class Imap_map implements Xoh_file_img_wkr, Js_img_wkr {
xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_imap);
this.a_href = a_href; this.img_alt = img_alt; this.img_cls_tid = img_cls; this.img_cls_other = img_cls_other;
Write_imap_div(tmp_bfr, hctx, uid, img_w, img_h, img_src, xfer_itm.Orig_w(), xfer_itm.Orig_h());
if (hctx.Mode_is_hdump())
page.Hdump_data().Imgs_add_img(new Xohd_data_itm__img(), xfer_itm, Xohd_data_itm__gallery_itm.Tid_basic);
}
public void Html_update(Xoa_page page, Xog_js_wkr js_wkr, int html_uid, int html_w, int html_h, Io_url html_view_url, int orig_w, int orig_h, Io_url html_orig_url, byte[] lnki_ttl) {
Xowe_wiki wiki = xtn_mgr.Wiki();

View File

@@ -82,6 +82,9 @@ public class Scrib_lib_ustring__lib_tst {
@Test public void Gsub_replace_is_int() { // PURPOSE: do not fail if integer is passed in for @replace; PAGE:en.d:λύω DATE:2014-09-02
Exec_gsub_regx("abcd", 1 , -1, 1 , "abcd;0");
}
@Test public void Gsub_word_class() { // PURPOSE: handle %w in extended regex; PAGE:en.w:A♯_(musical_note) DATE:2015-06-10
Exec_gsub_regx("(a b)", "[^%w%p%s]", -1, "x", "(a b);0"); // was returning "(x x)" b/c ^%w was incorrectly matching "a" and "b"
}
@Test public void Gmatch_init() {
fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_ustring.Invk_gmatch_init, Object_.Ary("abcabc", "a(b)") , "1=a(b)\n2=\n 1=false");
fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_ustring.Invk_gmatch_init, Object_.Ary("abcabc", "a()(b)") , "1=a()(b)\n2=\n 1=true\n 2=false");

View File

@@ -23,7 +23,7 @@ class Scrib_lib_wikibase_srl {
List_adp rv = List_adp_.new_();
if (header_enabled) {
rv.Add(KeyVal_.new_("id", wdoc.Qid()));
rv.Add(KeyVal_.new_("type", Wdata_dict_value_entity.Val_entity_type_item_str));
rv.Add(KeyVal_.new_("type", Wdata_dict_value_entity_tid.Str_item));
rv.Add(KeyVal_.new_("schemaVersion", base_adj + 1)); // NOTE: needed by mw.wikibase.lua
}
Srl_root(rv, Wdata_doc_parser_v2.Str_labels , Srl_langtexts (Wdata_dict_langtext.Str_language , Wdata_dict_langtext.Str_value, wdoc.Label_list()));

View File

@@ -177,7 +177,7 @@ public class Scrib_lib_wikibase_srl_tst {
);
}
@Test public void Claims_entity() {
fxt.Init_prop(fxt.Wdata_fxt().Make_claim_entity(2, 3));
fxt.Init_prop(fxt.Wdata_fxt().Make_claim_entity_qid(2, 3));
fxt.Test
( "claims:"
, " P2:"
@@ -197,7 +197,7 @@ public class Scrib_lib_wikibase_srl_tst {
);
}
@Test public void Claims_base_0() { // PURPOSE: test for legacyStyle (aka base_0); used by pl.w:Module:Wikidane; DATE:2014-05-09
fxt.Init_prop(fxt.Wdata_fxt().Make_claim_entity(2, 3));
fxt.Init_prop(fxt.Wdata_fxt().Make_claim_entity_qid(2, 3));
fxt.Test(true
, "claims:"
, " P2:"

View File

@@ -32,7 +32,7 @@ class Scrib_lib_wikibase_srl_visitor implements Wdata_claim_visitor {
private static KeyVal[] Entity_value(Wdata_claim_itm_core itm) {
Wdata_claim_itm_entity claim_entity = (Wdata_claim_itm_entity)itm;
KeyVal[] rv = new KeyVal[2];
rv[0] = KeyVal_.new_(Wdata_dict_value_entity.Str_entity_type, Wdata_dict_value_entity.Val_entity_type_item_str);
rv[0] = KeyVal_.new_(Wdata_dict_value_entity.Str_entity_type, claim_entity.Entity_tid_str());
rv[1] = KeyVal_.new_(Wdata_dict_value_entity.Str_numeric_id, Int_.Xto_str(claim_entity.Entity_id()));
return rv;
}

View File

@@ -36,7 +36,7 @@ public class Scrib_regx_converter {
switch (cur) {
case Byte_ascii.Pow:
q_flag = i != 0;
bfr.Add(anchor == Anchor_null || q_flag ? Bry_pow_escaped : anchor); // NOTE: must add anchor \G when using offsets; EX:cs.n:Category:1._z<EFBFBD>r<EFBFBD>_2008; DATE:2014-05-07
bfr.Add(anchor == Anchor_null || q_flag ? Bry_pow_escaped : anchor); // NOTE: must add anchor \G when using offsets; EX:cs.n:Category:1._zárí_2008; DATE:2014-05-07
break;
case Byte_ascii.Dollar:
q_flag = i < len - 1;
@@ -221,10 +221,9 @@ public class Scrib_regx_converter {
;
public static final byte[] Anchor_null = null, Anchor_G = Bry_.new_a7("\\G"), Anchor_pow = Bry_.new_a7("^");
private void Init() {
// REF:tchrist@http://stackoverflow.com/questions/4304928/unicode-equivalents-for-w-and-b-in-java-regular-expressions; PAGE:pl.w:Benjamin_Franklin DATE:2014-08-13
String regx_w = "[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]";
String regx_W = "[^\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]";
Init_itm(Bool_.Y, "d", "\\p{Nd}");
String regx_w = "\\w"; // JRE.7: \w not support in JRE.6; PAGE:en.w:A♯_(musical_note) DATE:2015-06-10
String regx_W = "\\W"; // JRE.7: \w not support in JRE.6; PAGE:en.w:A♯_(musical_note) DATE:2015-06-10
Init_itm(Bool_.Y, "d", "\\p{Nd}");
Init_itm(Bool_.Y, "l", "\\p{Ll}");
Init_itm(Bool_.Y, "u", "\\p{Lu}");
Init_itm(Bool_.Y, "a", "\\p{L}");

View File

@@ -47,7 +47,7 @@ class Xop_mylanguage_page_fxt {
public void Init_cur_lang(String lang) {app.Sys_cfg().Lang_(Bry_.new_a7(lang));}
public void Test_open(String link, String expd) {
Xoae_page page = parser_fxt.Ctx().Cur_page();
Xoa_url url = Xoa_url_parser.Parse_url(app, wiki, link);
Xoa_url url = app.Utl__url_parser().Parse(Bry_.new_u8(link));
page.Url_(url);
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.new_a7(link));
page.Ttl_(ttl);

View File

@@ -103,7 +103,7 @@ public class Wdata_doc_wtr {
wtr.Val(Bool_.Y, Wdata_dict_val_tid.Bry_entity);
wtr.Comma();
wtr.Nde_bgn();
wtr.Kv(Bool_.N, Wdata_dict_value_entity.Bry_entity_type , Wdata_dict_value_entity.Val_entity_type_item_bry);
wtr.Kv(Bool_.N, Wdata_dict_value_entity.Bry_entity_type , claim_entity.Entity_tid_bry());
wtr.Kv(Bool_.Y, Wdata_dict_value_entity.Bry_numeric_id , claim_entity.Entity_id());
wtr.Nde_end();
break;

View File

@@ -25,7 +25,7 @@ class Wdata_prop_val_visitor implements Wdata_claim_visitor {
public void Visit_time(Wdata_claim_itm_time itm) {bfr.Add(itm.Time());}
public void Visit_monolingualtext(Wdata_claim_itm_monolingualtext itm) {bfr.Add(itm.Text());} // phrase only; PAGE:en.w:Alberta; EX: {{#property:motto}} -> "Fortis et libre"; DATE:2014-08-28
public void Visit_entity(Wdata_claim_itm_entity itm) {
Wdata_doc entity_doc = wdata_mgr.Pages_get(Bry_.Add(Byte_ascii.Ltr_q, itm.Entity_id_bry()));
Wdata_doc entity_doc = wdata_mgr.Pages_get(itm.Page_ttl_db());
if (entity_doc == null) return; // NOTE: wiki may refer to entity that no longer exists; EX: {{#property:p1}} which links to Q1, but p1 links to Q2 and Q2 was deleted; DATE:2014-02-01
byte[] label = entity_doc.Label_list_get(lang_key);
if (label == null && !Bry_.Eq(lang_key, Xol_lang_.Key_en)) // NOTE: some properties may not exist in language of wiki; default to english; DATE:2013-12-19

View File

@@ -41,7 +41,9 @@ public class Wdata_wiki_mgr implements GfoEvObj, GfoInvkAble {
public void Init_by_app() {}
public Wdata_doc_parser Wdoc_parser(Json_doc jdoc) {
Json_itm_kv itm_0 = Json_itm_kv.cast_(jdoc.Root().Subs_get_at(0)); // get 1st node
return Bry_.Eq(itm_0.Key().Data_bry(), Wdata_doc_parser_v2.Bry_type) ? wdoc_parser_v2 : wdoc_parser_v1; // if "type", must be v2
return Bry_.Eq(itm_0.Key().Data_bry(), Wdata_doc_parser_v2.Bry_type)
|| Bry_.Eq(itm_0.Key().Data_bry(), Wdata_doc_parser_v2.Bry_id)
? wdoc_parser_v2 : wdoc_parser_v1; // if "type", must be v2
}
public Xop_log_property_wkr Property_wkr() {return property_wkr;} private Xop_log_property_wkr property_wkr;
public Int_obj_ref Tmp_prop_ref() {return tmp_prop_ref;} Int_obj_ref tmp_prop_ref = Int_obj_ref.zero_();
@@ -202,6 +204,11 @@ public class Wdata_wiki_mgr implements GfoEvObj, GfoInvkAble {
public static final int Ns_property = 120;
public static final String Ns_property_name = "Property";
public static final byte[] Ns_property_name_bry = Bry_.new_a7(Ns_property_name);
public static final byte[]
Ttl_prefix_qid_bry_db = Bry_.new_a7("q") // NOTE: for historical reasons this is standardized as lowercase q not Q; DATE:2015-06-12
, Ttl_prefix_qid_bry_gui = Bry_.new_a7("Q") // NOTE: use uppercase Q for writing html; DATE:2015-06-12
, Ttl_prefix_pid_bry = Bry_.new_a7("Property:P")
;
public static final int Pid_null = -1;
public static final byte[] Html_json_id = Bry_.new_a7("xowa-wikidata-json");
public static boolean Wiki_page_is_json(int wiki_tid, int ns_id) {

View File

@@ -48,7 +48,8 @@ public class Wdata_wiki_mgr_fxt {
}
public Wdata_claim_itm_core Make_claim_monolingual(int pid, String lang, String text) {return new Wdata_claim_itm_monolingualtext(pid, Wdata_dict_snak_tid.Tid_value, Bry_.new_u8(lang), Bry_.new_u8(text));}
public Wdata_claim_itm_core Make_claim_quantity(int pid, String amount, String unit, String ubound, String lbound) {return new Wdata_claim_itm_quantity(pid, Wdata_dict_snak_tid.Tid_value, Bry_.new_a7(amount), Bry_.new_a7(unit), Bry_.new_a7(ubound), Bry_.new_a7(lbound));}
public Wdata_claim_itm_core Make_claim_entity(int pid, int val) {return new Wdata_claim_itm_entity(pid, Wdata_dict_snak_tid.Tid_value, Int_.Xto_bry(val));}
public Wdata_claim_itm_core Make_claim_entity_qid(int pid, int val) {return new Wdata_claim_itm_entity(pid, Wdata_dict_snak_tid.Tid_value, Wdata_dict_value_entity_tid.Tid_item, Int_.Xto_bry(val));}
public Wdata_claim_itm_core Make_claim_entity_pid(int pid, int val) {return new Wdata_claim_itm_entity(pid, Wdata_dict_snak_tid.Tid_value, Wdata_dict_value_entity_tid.Tid_property, Int_.Xto_bry(val));}
public Wdata_claim_itm_core Make_claim_geo(int pid, String lon, String lat) {return Make_claim_geo(pid, lon, lat, ".000277777", null, "Q2");}
public Wdata_claim_itm_core Make_claim_geo(int pid, String lon, String lat, String prc, String alt, String glb) {
return new Wdata_claim_itm_globecoordinate(pid, Wdata_dict_snak_tid.Tid_value, Bry_.new_a7(lat), Bry_.new_a7(lon), Bry_.new_a7(alt), Bry_.new_a7(prc), Bry_.new_a7(glb));

View File

@@ -17,16 +17,33 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.wdatas.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*;
import gplx.xowa.xtns.wdatas.hwtrs.*;
public class Wdata_claim_itm_entity extends Wdata_claim_itm_core { public Wdata_claim_itm_entity(int pid, byte snak_tid, byte[] entity_id_bry) {
public class Wdata_claim_itm_entity extends Wdata_claim_itm_core { public Wdata_claim_itm_entity(int pid, byte snak_tid, byte entity_tid, byte[] entity_id_bry) {
this.Ctor(pid, snak_tid);
this.entity_tid = entity_tid;
this.entity_id_bry = entity_id_bry;
this.entity_id = Bry_.Xto_int_or_fail(entity_id_bry);
}
@Override public byte Val_tid() {return Wdata_dict_val_tid.Tid_entity;}
public byte[] Entity_id_bry() {return entity_id_bry;} private final byte[] entity_id_bry;
public int Entity_id() {return entity_id;} private final int entity_id;
public byte[] Entity_id_bry() {return entity_id_bry;} private final byte[] entity_id_bry;
public byte Entity_tid() {return entity_tid;} private final byte entity_tid;
public boolean Entity_tid_is_qid() {return entity_tid == Wdata_dict_value_entity_tid.Tid_item;}
public String Entity_tid_str() {return Wdata_dict_value_entity_tid.Xto_str(entity_tid);}
public byte[] Entity_tid_bry() {return Wdata_dict_value_entity_tid.Xto_bry(entity_tid);}
public byte[] Page_ttl_db() {
return entity_tid == Wdata_dict_value_entity_tid.Tid_item
? Bry_.Add(Wdata_wiki_mgr.Ttl_prefix_qid_bry_db, entity_id_bry)
: Bry_.Add(Wdata_wiki_mgr.Ttl_prefix_pid_bry, entity_id_bry)
;
}
public byte[] Page_ttl_gui() {
return entity_tid == Wdata_dict_value_entity_tid.Tid_item
? Bry_.Add(Wdata_wiki_mgr.Ttl_prefix_qid_bry_gui, entity_id_bry)
: Bry_.Add(Wdata_wiki_mgr.Ttl_prefix_pid_bry, entity_id_bry)
;
}
@Override public void Welcome(Wdata_claim_visitor visitor) {visitor.Visit_entity(this);}
@Override public String toString() {// TEST:
return String_.Concat_with_str("|", Wdata_dict_snak_tid.Xto_str(this.Snak_tid()), Wdata_dict_val_tid.Xto_str(this.Val_tid()), Int_.Xto_str(entity_id));
return String_.Concat_with_str("|", Wdata_dict_snak_tid.Xto_str(this.Snak_tid()), Wdata_dict_val_tid.Xto_str(this.Val_tid()), this.Entity_tid_str(), Int_.Xto_str(entity_id));
}
}

View File

@@ -23,6 +23,7 @@ public class Wdata_dict_mainsnak {
, Tid_hash = 2
, Tid_datavalue = 3
, Tid_type = 4
, Tid_datatype = 5
;
public static byte[]
Bry_snaktype = Bry_.new_a7("snaktype")
@@ -30,6 +31,7 @@ public class Wdata_dict_mainsnak {
, Bry_hash = Bry_.new_a7("hash")
, Bry_datavalue = Bry_.new_a7("datavalue")
, Bry_type = Bry_.new_a7("type")
, Bry_datatype = Bry_.new_a7("datatype")
;
public static final Hash_adp_bry Dict = Hash_adp_bry.cs_()
.Add_bry_byte(Bry_snaktype , Tid_snaktype)
@@ -37,5 +39,6 @@ public class Wdata_dict_mainsnak {
.Add_bry_byte(Bry_hash , Tid_hash)
.Add_bry_byte(Bry_datavalue , Tid_datavalue)
.Add_bry_byte(Bry_type , Tid_type)
.Add_bry_byte(Bry_datatype , Tid_datatype)
;
}

View File

@@ -33,10 +33,4 @@ public class Wdata_dict_value_entity {
.Add_bry_byte(Bry_entity_type , Tid_entity_type)
.Add_bry_byte(Bry_numeric_id , Tid_numeric_id)
;
public static final String
Val_entity_type_item_str = "item"
;
public static final byte[]
Val_entity_type_item_bry = Bry_.new_a7(Val_entity_type_item_str)
;
}

View File

@@ -0,0 +1,55 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.wdatas.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*;
import gplx.core.primitives.*;
public class Wdata_dict_value_entity_tid {
public static final byte
Tid_item = 0
, Tid_property = 1
;
public static final String
Str_item = "item"
, Str_property = "property"
;
public static final byte[]
Bry_item = Bry_.new_a7(Str_item)
, Bry_property = Bry_.new_a7(Str_property)
;
private static Hash_adp_bry Dict = Hash_adp_bry.cs_()
.Add_bry_byte(Bry_item , Tid_item)
.Add_bry_byte(Bry_property , Tid_property)
;
public static String Xto_str(byte v) {
switch (v) {
case Tid_item: return Str_item;
case Tid_property: return Str_property;
default: return null;
}
}
public static byte[] Xto_bry(byte v) {
switch (v) {
case Tid_item: return Bry_item;
case Tid_property: return Bry_property;
default: return null;
}
}
public static byte Xto_tid(byte[] v) {
Object rv_obj = Dict.Get_by_bry(v); if (rv_obj == null) throw Err_.new_fmt_("unknown entity_tid: val=~{0}", v);
return ((Byte_obj_val)rv_obj).Val();
}
}

View File

@@ -27,6 +27,10 @@ public class Wdata_lbl_wkr_wiki implements Wdata_lbl_wkr {
for (int i = 0; i < len; ++i) {
Wdata_lbl_itm itm = (Wdata_lbl_itm)queue.Get_at(i);
Wdata_doc wdoc = wdata_mgr.Pages_get(itm.Ttl());
if (wdoc == null) {
Xoa_app_.Usr_dlg().Warn_many("", "", "wbase.lbl_wkr:page does not exists; page=~{0}", itm.Ttl());
continue; // handle incomplete wikidata dumps; DATE:2015-06-11
}
Ordered_hash labels = wdoc.Label_list();
if (labels.Count() == 0) continue;
labels.Sort_by(sorter);

View File

@@ -29,8 +29,12 @@ class Wdata_visitor__html_wtr implements Wdata_claim_visitor {
}
public void Visit_entity(Wdata_claim_itm_entity itm) {
int entity_id = itm.Entity_id();
byte[] text = lbl_mgr.Get_text__qid(entity_id);
Wdata_hwtr_mgr.Write_link_wikidata(tmp_bfr, Bry_.Add(Byte_ascii.Ltr_Q, Int_.Xto_bry(entity_id)), text);
byte[] text = itm.Entity_tid_is_qid() ? lbl_mgr.Get_text__qid(entity_id) : lbl_mgr.Get_text__pid(entity_id);
if (text == null) {// handle incomplete wikidata dumps; DATE:2015-06-11
Xoa_app_.Usr_dlg().Warn_many("", "", "wbase.html_visitor:page does not exists; page=~{0}", entity_id);
return;
}
Wdata_hwtr_mgr.Write_link_wikidata(tmp_bfr, itm.Page_ttl_gui(), text);
}
public void Visit_monolingualtext(Wdata_claim_itm_monolingualtext itm) {
tmp_bfr.Add(itm.Text());

View File

@@ -55,14 +55,22 @@ public class Wdata_visitor__html_wtr_tst {
, "+0.1234 ±0.0001 units"
);
}
@Test public void Entity() {
@Test public void Entity_qid() {
fxt
.Init_resolved_qid(1, "item_1")
.Test_claim_val
( fxt.Wdata_fxt().Make_claim_entity(1, 1)
( fxt.Wdata_fxt().Make_claim_entity_qid(1, 1)
, "<a href='/wiki/Q1'>item_1</a>"
);
}
@Test public void Entity_pid() {
fxt
.Init_resolved_pid(1, "item_1")
.Test_claim_val
( fxt.Wdata_fxt().Make_claim_entity_pid(1, 1)
, "<a href='/wiki/Property:P1'>item_1</a>"
);
}
@Test public void Globecoordinate() {
fxt
.Init_resolved_qid(2, "Earth")

View File

@@ -21,7 +21,10 @@ class Wdata_visitor__lbl_gatherer implements Wdata_claim_visitor {
private Wdata_lbl_mgr lbl_mgr;
public Wdata_visitor__lbl_gatherer(Wdata_lbl_mgr lbl_mgr) {this.lbl_mgr = lbl_mgr;}
public void Visit_entity(Wdata_claim_itm_entity itm) {
lbl_mgr.Queue_if_missing__qid(itm.Entity_id());
if (itm.Entity_tid_is_qid())
lbl_mgr.Queue_if_missing__qid(itm.Entity_id());
else
lbl_mgr.Queue_if_missing__pid(itm.Entity_id());
}
public void Visit_time(Wdata_claim_itm_time itm) {
byte[] ttl = Wdata_lbl_itm.Extract_ttl(itm.Calendar());

View File

@@ -0,0 +1,74 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*;
import gplx.ios.*;
import gplx.core.criterias.*;
class Io_stream_rdr_mgr {
public static Io_stream_rdr Get_rdr_or_null(Io_url src_fil, Io_url src_dir, Io_stream_unzip_mgr unzip_mgr, String... filter_ary) {
IoItmFil src_itm = null;
if (src_fil != null) src_itm = Io_mgr.I.QueryFil(src_fil);
// specified file doesn't exist; try to find similar file based on filter
if (src_itm == null || !src_itm.Exists()) {
src_itm = Get_itm_by_filters(src_dir, filter_ary);
if (src_itm == null) return null;
}
// return rdr
Io_url src_itm_url = src_itm.Url();
Io_stream_rdr rv = unzip_mgr.Handles(src_itm_url)
? unzip_mgr.New_rdr(src_itm_url)
: Io_stream_rdr_.file_(src_itm_url);
rv.Len_(src_itm.Size());
return rv;
}
private static IoItmFil Get_itm_by_filters(Io_url dir, String... filter_ary) {
// create array of matches based on filters
int match_ary_len = filter_ary.length;
Criteria_ioMatch[] match_ary = new Criteria_ioMatch[match_ary_len];
for (int i = 0; i < match_ary_len; ++i)
match_ary[i] = Criteria_ioMatch.parse_(true, filter_ary[i], dir.Info().CaseSensitive());
// get files and check each file for match
IoItmFil rv = null;
IoItmHash itm_hash = Io_mgr.I.QueryDir_args(dir).ExecAsItmHash();
int len = itm_hash.Count();
for (int i = 0; i < len; ++i) {
IoItm_base itm = itm_hash.Get_at(i);
for (int j = 0; j < match_ary_len; ++j) {
if (itm.Type_fil() && match_ary[j].Matches(itm.Url()))
rv = (IoItmFil)itm; // NOTE: this will return the last match; useful for getting latest dump when multiple dumps are in one dir; (assuming latest should alphabetize last)
}
}
return rv;
}
}
class Io_stream_unzip_mgr {
private final String[] zip_exts;
private final boolean stdout_enabled; private final ProcessAdp stdout_process;
public Io_stream_unzip_mgr(boolean stdout_enabled, ProcessAdp stdout_process, String[] zip_exts) {
this.stdout_enabled = stdout_enabled; this.stdout_process = stdout_process; this.zip_exts = zip_exts;
}
public boolean Handles(Io_url url) {return String_.In(url.Ext(), zip_exts);}
public Io_stream_rdr New_rdr(Io_url url) {
return stdout_enabled
? Io_stream_rdr_process.new_(stdout_process.Exe_url(), url, stdout_process.Xto_process_bldr_args(url.Raw()))
: Io_stream_rdr_.bzip2_(url)
;
}
}

View File

@@ -0,0 +1,37 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*;
import gplx.xowa.bldrs.*;
public class Xob_wbase_json_dump_cmd implements Xob_cmd {
private final Xob_wbase_json_dump_parser json_dump_parser;
private Io_url src_fil;
public Xob_wbase_json_dump_cmd(Xob_bldr bldr, Xowe_wiki wiki) {
this.json_dump_parser = new Xob_wbase_json_dump_parser(bldr, wiki);
}
public String Cmd_key() {return Xob_cmd_keys.Key_wbase_json_dump;}
public void Cmd_run() {json_dump_parser.Parse(src_fil);}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_end() {}
public void Cmd_term() {}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_src_fil_)) this.src_fil = m.ReadIoUrl("v");
else return GfoInvkAble_.Rv_unhandled;
return this;
} private static final String Invk_src_fil_ = "src_fil_";
}

View File

@@ -0,0 +1,95 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*;
import gplx.ios.*;
import gplx.json.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.bldrs.cmds.texts.sqls.*;
import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.apis.xowa.bldrs.imports.*;
import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.xtns.wdatas.parsers.*;
class Xob_wbase_json_dump_db {
private final Gfo_usr_dlg usr_dlg; private final Xoae_app app; private final Xowe_wiki wiki; private final Xob_bldr bldr;
private final Json_parser json_parser;
private final Xob_wdata_pid_sql pid_cmd = new Xob_wdata_pid_sql(); private final Xob_wdata_qid_sql qid_cmd = new Xob_wdata_qid_sql();
private Xowd_page_tbl page_tbl;
private final Xow_page_mgr page_mgr;
private Xob_ns_to_db_mgr ns_to_db_mgr;
private DateAdp page_modified_on;
private Xowd_db_mgr db_mgr;
private Xowd_page_tbl page_core_tbl;
private Io_stream_zip_mgr text_zip_mgr; private byte text_zip_tid;
private Xow_ns_mgr ns_mgr;
public Xob_wbase_json_dump_db(Xob_bldr bldr, Xowe_wiki wiki) {
this.app = bldr.App(); this.usr_dlg = app.Usr_dlg(); this.wiki = wiki; this.bldr = bldr;
this.json_parser = bldr.App().Wiki_mgr().Wdata_mgr().Jdoc_parser();
this.ns_mgr = wiki.Ns_mgr();
this.page_mgr = wiki.Page_mgr();
}
public void Parse_bgn(long src_fil_len, String src_fil_name) {
Xowe_wiki_bldr.Create(wiki, src_fil_len, src_fil_name);
this.db_mgr = wiki.Data_mgr__core_mgr();
this.page_tbl = db_mgr.Tbl__page();
pid_cmd.Cmd_ctor(bldr, wiki); qid_cmd.Cmd_ctor(bldr, wiki);
wiki.Ns_mgr().Add_defaults();
wiki.Ns_mgr().Add_new(Wdata_wiki_mgr.Ns_property, Wdata_wiki_mgr.Ns_property_name);
wiki.Ns_mgr().Init();
Xoapi_import import_cfg = app.Api_root().Bldr().Wiki().Import();
this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__text(), db_mgr, import_cfg.Text_db_max());
this.text_zip_mgr = Xoa_app_.Utl__zip_mgr(); text_zip_tid = import_cfg.Zip_tid_text();
byte[] ns_file_map = import_cfg.New_ns_file_map(src_fil_len);
Xob_ns_file_itm.Init_ns_bldr_data(Xowd_db_file_.Tid_text, wiki.Ns_mgr(), ns_file_map);
this.page_modified_on = DateAdp_.Now();
this.page_core_tbl = db_mgr.Tbl__page();
page_tbl.Insert_bgn();
qid_cmd.Wkr_bgn(bldr);
pid_cmd.Pid_bgn();
}
private int page_id = 0, page_count_main = 0;
public void Parse_cmd(byte[] json_bry) {
Json_doc jdoc = json_parser.Parse(json_bry);
if (jdoc == null) {usr_dlg.Warn_many("", "", "wbase.json_dump:json is invalid: json=~{0}", json_bry); return;}
byte[] id = jdoc.Get_val_as_bry_or(id_key, null);
if (id == null) {usr_dlg.Warn_many("", "", "wbase.json_dump:id is invalid: json=~{0}", json_bry); return;}
boolean jdoc_is_qid = Bry_.HasAtBgn(id, Byte_ascii.Ltr_Q, 0);
Xow_ns ns = jdoc_is_qid ? ns_mgr.Ns_main() : ns_mgr.Ids_get_or_null(Wdata_wiki_mgr.Ns_property);
int random_int = ns.Count() + 1; ns.Count_(random_int);
byte[] json_zip = text_zip_mgr.Zip(text_zip_tid, json_bry);
Xowd_db_file text_db = ns_to_db_mgr.Get_by_ns(ns.Bldr_data(), json_zip.length);
page_mgr.Create(page_core_tbl, text_db.Tbl__text(), ++page_id, ns.Id(), id, Bool_.N, page_modified_on, json_zip, json_bry.length, random_int, text_db.Id(), -1);
if (jdoc_is_qid) {
qid_cmd.Parse_jdoc(jdoc);
++page_count_main;
}
else
pid_cmd.Parse_jdoc(jdoc);
}
public void Parse_end() {
page_tbl.Insert_end();
page_tbl.Create_index();
qid_cmd.Qid_end();
pid_cmd.Pid_end();
ns_to_db_mgr.Rls_all();
Xowd_db_file db_core = db_mgr.Db__core();
db_core.Tbl__site_stats().Update(page_count_main, page_id, ns_mgr.Ns_file().Count()); // save page stats
db_core.Tbl__ns().Insert(ns_mgr); // save ns
db_mgr.Tbl__cfg().Insert_str(Xow_cfg_consts.Grp_wiki_init, "props.modified_latest", page_modified_on.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time));
}
private static final byte[] id_key = Bry_.new_a7("id");
}

View File

@@ -0,0 +1,89 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.xtns.wdatas.imports; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.wdatas.*;
import gplx.ios.*;
import gplx.xowa.wikis.data.tbls.*;
class Xob_wbase_json_dump_parser {
private final Gfo_usr_dlg usr_dlg; private final Xoae_app app; private final Xob_bldr bldr; private final Xowe_wiki wiki;
private final Xob_wbase_json_dump_db dump_db;
private final Io_stream_unzip_mgr unzip_mgr;
public Xob_wbase_json_dump_parser(Xob_bldr bldr, Xowe_wiki wiki) {
this.bldr = bldr; this.wiki = wiki;
this.app = bldr.App(); this.usr_dlg = app.Usr_dlg();
this.dump_db = new Xob_wbase_json_dump_db(bldr, wiki);
this.unzip_mgr = new Io_stream_unzip_mgr(app.Setup_mgr().Dump_mgr().Import_bz2_by_stdout(), app.Prog_mgr().App_decompress_bz2_by_stdout(), String_.Ary(".bz2", ".gz", ".zip"));
}
public void Parse(Io_url src_fil) {
byte[] json_bgn = Bry_.new_a7("[\n"), id_bgn = Bry_.new_a7("{\"id\":");
String prog_fmt = "reading ~{0} MB: ~{1} ~{2}";
Io_stream_rdr stream_rdr = Io_stream_rdr_mgr.Get_rdr_or_null(src_fil, wiki.Fsys_mgr().Root_dir(), unzip_mgr, "*wikidata-*-all.json", "*wikidata-*-all.json.gz");
if (stream_rdr == null) {usr_dlg.Warn_many("", "", "wbase.import:file not found: src_dir=~{0}", wiki.Fsys_mgr().Root_dir()); return;}
Io_buffer_rdr buffer_rdr = Io_buffer_rdr.new_(stream_rdr, 10 * Io_mgr.Len_mb); long buffer_rdr_len = buffer_rdr.Fil_len();
try {
Io_url stream_rdr_url = stream_rdr.Url();
int page_bgn = Bry_finder.Find_fwd(buffer_rdr.Bfr(), id_bgn);
if (page_bgn == Bry_finder.Not_found) {usr_dlg.Warn_many("", "", "wbase.import:initial id not found: url=~{0}", stream_rdr_url.Raw()); return;}
if (!Bry_.Match(buffer_rdr.Bfr(), 0, page_bgn, json_bgn)) {usr_dlg.Warn_many("", "", "wbase.import:doc_bgn is not '[\n': url=~{0}", stream_rdr_url.Raw()); return;}
Xowd_page_itm page = new Xowd_page_itm();
dump_db.Parse_bgn(stream_rdr.Len(), stream_rdr.Url().NameAndExt());
while (true) {
int cur_pos = Extract_page(page, buffer_rdr, page_bgn);
if (cur_pos == -1) break;
if (cur_pos < page_bgn)
bldr.Print_prog_msg(buffer_rdr.Fil_pos(), buffer_rdr_len, 1, prog_fmt, Int_.Xto_str_pad_bgn_zero((int)(buffer_rdr.Fil_pos() / Io_mgr.Len_mb), Int_.DigitCount((int)(buffer_rdr.Fil_len() / Io_mgr.Len_mb))), "", page.Ttl_page_db());
page_bgn = cur_pos;
}
dump_db.Parse_end();
}
catch (Exception e) {
String msg = usr_dlg.Warn_many("", "", "dump_rdr:error while reading; url=~{0} err=~{1}", src_fil.Raw(), Err_.Message_lang(e));
throw Err_.new_(msg);
}
finally {buffer_rdr.Rls();}
}
private int Extract_page(Xowd_page_itm page, Io_buffer_rdr rdr, int page_bgn) {
int pos = page_bgn;
byte[] bry = rdr.Bfr();
int bry_len = rdr.Bfr_len();
while (true) {
if (pos == bry_len) {
rdr.Bfr_load_from(page_bgn); // refill src from pos;
bry_len = rdr.Bfr_len();
pos -= page_bgn;
page_bgn = 0;
}
byte b = Byte_.Zero;
boolean exit = false;
if (pos < bry_len)
b = bry[pos];
else {
b = Byte_ascii.NewLine;
pos = bry_len;
exit = true;
}
if (b == Byte_ascii.NewLine) {
byte[] json_bry = Bry_.Mid(bry, page_bgn, pos);
if (json_bry.length == 1 && json_bry[0] == Byte_ascii.Brack_end) return -1;
if (exit) return -1;
dump_db.Parse_cmd(json_bry);
return pos + 1;
}
++pos;
}
}
}

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