diff --git a/100_core/src/gplx/core/threads/Thread_adp.java b/100_core/src/gplx/core/threads/Thread_adp.java index bc8c999ec..a1513bff8 100644 --- a/100_core/src/gplx/core/threads/Thread_adp.java +++ b/100_core/src/gplx/core/threads/Thread_adp.java @@ -23,27 +23,23 @@ public class Thread_adp implements Runnable { this.name = name; this.invk = invk; this.cmd = cmd; this.msg = msg; this.ctor_ThreadAdp(); } - public Thread_adp Start() {thread.start(); return this;} + void ctor_ThreadAdp() { + this.thread = name == null ? new Thread(this) : new Thread(this, name); + } + public Thread Under_thread() {return thread;} private Thread thread; + public Thread_adp Start() { + thread.start(); + return this; + } public void Interrupt() {thread.interrupt();} public void Join() { - try { - thread.join(); - } - catch (Exception e) { - Err_.Noop(e); - } + try {thread.join();} + catch (Exception e) {Err_.Noop(e);} } // public void Stop() {thread.stop();} public boolean IsAlive() {return thread.isAlive();} - void ctor_ThreadAdp() { - if (name == null) - thread = new Thread(this); - else - thread = new Thread(this, name); - } @Override public void run() { invk.Invk(GfsCtx._, 0, cmd, msg); } - public Thread Under_thread() {return thread;} private Thread thread; public static final Thread_adp Null = new Thread_adp(Thread_adp_.Name_null, GfoInvkAble_.Null, "", GfoMsg_.Null); } diff --git a/100_core/src/gplx/core/threads/Thread_adp_.java b/100_core/src/gplx/core/threads/Thread_adp_.java index cd09b634a..078794873 100644 --- a/100_core/src/gplx/core/threads/Thread_adp_.java +++ b/100_core/src/gplx/core/threads/Thread_adp_.java @@ -25,9 +25,9 @@ public class Thread_adp_ { try {o.wait();} catch (InterruptedException e) {throw Err_.err_key_(e, "gplx.Thread", "thread wait");} } - public static Thread_adp invk_(GfoInvkAble invk, String cmd) {return invk_(Name_null, invk, cmd);} + public static Thread_adp invk_(GfoInvkAble invk, String cmd) {return invk_(Name_null, invk, cmd);} public static Thread_adp invk_(String name, GfoInvkAble invk, String cmd) {return new Thread_adp(name, invk, cmd, GfoMsg_.Null);} - public static Thread_adp invk_msg_(GfoInvkAble invk, GfoMsg msg) {return invk_msg_(Name_null, invk, msg);} + public static Thread_adp invk_msg_(GfoInvkAble invk, GfoMsg msg) {return invk_msg_(Name_null, invk, msg);} public static Thread_adp invk_msg_(String name, GfoInvkAble invk, GfoMsg msg) {return new Thread_adp(name, invk, msg.Key(), msg);} public static void Run_invk_msg(String name, GfoInvkAble invk, GfoMsg m) { Thread_adp_.invk_msg_(name, invk, m).Start(); diff --git a/100_core/src_110_primitive/gplx/Bry_.java b/100_core/src_110_primitive/gplx/Bry_.java index 54d98967c..44528d201 100644 --- a/100_core/src_110_primitive/gplx/Bry_.java +++ b/100_core/src_110_primitive/gplx/Bry_.java @@ -101,7 +101,7 @@ public class Bry_ { } } } - public static byte[] Coalesce(byte[] orig, byte[] val_if_not_blank) {return Bry_.Len_eq_0(val_if_not_blank) ? orig : val_if_not_blank;} + public static byte[] Coalesce(byte[] orig, byte[] val_if_not_blank) {return Bry_.Len_eq_0(orig) ? val_if_not_blank : orig;} public static byte Get_at_end_or_fail(byte[] bry) { if (bry == null) throw Err_.new_("bry is null"); int bry_len = bry.length; diff --git a/100_core/src_110_primitive/gplx/Bry_bfr.java b/100_core/src_110_primitive/gplx/Bry_bfr.java index 491791db6..014a2cac0 100644 --- a/100_core/src_110_primitive/gplx/Bry_bfr.java +++ b/100_core/src_110_primitive/gplx/Bry_bfr.java @@ -393,7 +393,7 @@ public class Bry_bfr { else if (o_type == Bry_bfr.class) Add_bfr_and_preserve((Bry_bfr)o); else if (o_type == DateAdp.class) Add_dte((DateAdp)o); else if (o_type == Io_url.class) Add(((Io_url)o).RawBry()); - else if (o_type == boolean.class) Add_yn(Bool_.cast_(o)); + else if (o_type == Boolean.class) Add_yn(Bool_.cast_(o)); else if (o_type == Double.class) Add_double(Double_.cast_(o)); else if (o_type == Float.class) Add_float(Float_.cast_(o)); else ((Bry_fmtr_arg)o).XferAry(this, 0); diff --git a/100_core/src_120_basicDataType/gplx/DateAdp_.java b/100_core/src_120_basicDataType/gplx/DateAdp_.java index 5ef8c7c63..7e3760f2a 100644 --- a/100_core/src_120_basicDataType/gplx/DateAdp_.java +++ b/100_core/src_120_basicDataType/gplx/DateAdp_.java @@ -47,6 +47,10 @@ public class DateAdp_ implements GfoInvkAble { return new DateAdp(y, M, d, h, m, s, f); } public static DateAdp cast_(Object arg) {try {return (DateAdp)arg;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, DateAdp.class, arg);}} + public static DateAdp parse_iso8561_or(String raw, DateAdp or) { + try {return parse_iso8561(raw);} + catch (Exception e) {Err_.Noop(e); return or;} + } public static DateAdp parse_iso8561(String raw) { // NOTE: for now, same as parse_gplx int[] ary = date_parser.Parse_iso8651_like(raw); if (ary[1] < 1 || ary[1] > 12) return DateAdp_.MinValue; // guard against invalid month diff --git a/100_core/src_150_text/gplx/texts/RegxAdp.java b/100_core/src_150_text/gplx/texts/RegxAdp.java index 116bab291..a2e881ab9 100644 --- a/100_core/src_150_text/gplx/texts/RegxAdp.java +++ b/100_core/src_150_text/gplx/texts/RegxAdp.java @@ -20,10 +20,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegxAdp { void Under_sync() { - try {under = Pattern.compile(pattern, Pattern.DOTALL);} + try {under = Pattern.compile(pattern, Pattern.DOTALL | Pattern.UNICODE_CHARACTER_CLASS);} // JRE.7:UNICODE_CHARACTER_CLASS; added during %w fix for en.w:A#; DATE:2015-06-10 catch (Exception e) { // NOTE: if invalid, then default to empty pattern (which should return nothing); EX:d:〆る generates [^]; DATE:2013-10-20 pattern_is_invalid = true; - under = Pattern.compile("", Pattern.DOTALL); + under = Pattern.compile("", Pattern.DOTALL | Pattern.UNICODE_CHARACTER_CLASS); } } private Pattern under; public RegxMatch Match(String input, int bgn) { diff --git a/100_core/src_200_io/gplx/ios/IoEngine_memory.java b/100_core/src_200_io/gplx/ios/IoEngine_memory.java index 2444c8461..5bd2cf02a 100644 --- a/100_core/src_200_io/gplx/ios/IoEngine_memory.java +++ b/100_core/src_200_io/gplx/ios/IoEngine_memory.java @@ -185,7 +185,7 @@ public class IoEngine_memory extends IoEngine_base { Io_url src = Io_url_.mem_fil_(xrg.Src()); if (!ExistsFil_api(src)) { xrg.Rslt_(IoEngine_xrg_downloadFil.Rslt_fail_file_not_found); - return Io_stream_rdr_.Null; + return Io_stream_rdr_.Noop; } byte[] bry = Bry_.new_u8(FetchFil(Io_url_.mem_fil_(xrg.Src())).Text()); return Io_stream_rdr_.mem_(bry); diff --git a/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java b/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java index f669735a3..6f783ac35 100644 --- a/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java +++ b/100_core/src_200_io/gplx/ios/Io_stream_rdr_.java @@ -63,7 +63,7 @@ public class Io_stream_rdr_ { } } finally {rdr.Rls();} } - public static final Io_stream_rdr Null = new Io_stream_rdr_noop(); + public static final Io_stream_rdr Noop = new Io_stream_rdr_noop(); public static Io_stream_rdr mem_(String v) {return mem_(Bry_.new_u8(v));} public static Io_stream_rdr mem_(byte[] v) { Io_stream_rdr rv = new Io_stream_rdr_adp(Stream_new_mem(v)); diff --git a/100_core/src_330_store/gplx/DataRdr_.java b/100_core/src_330_store/gplx/DataRdr_.java index 464209c26..f76a702f6 100644 --- a/100_core/src_330_store/gplx/DataRdr_.java +++ b/100_core/src_330_store/gplx/DataRdr_.java @@ -45,7 +45,7 @@ class DataRdr_null implements DataRdr { public byte ReadByte(String key) {return Byte_.Min_value;} public byte ReadByteOr(String key, byte or) {return or;} public DecimalAdp ReadDecimal(String key) {return DecimalAdp_.Zero;}public DecimalAdp ReadDecimalOr(String key, DecimalAdp or) {return or;} public DateAdp ReadDate(String key) {return DateAdp_.MinValue;} public DateAdp ReadDateOr(String key, DateAdp or) {return or;} - public gplx.ios.Io_stream_rdr ReadRdr(String key) {return gplx.ios.Io_stream_rdr_.Null;} + public gplx.ios.Io_stream_rdr ReadRdr(String key) {return gplx.ios.Io_stream_rdr_.Noop;} public boolean MoveNextPeer() {return false;} public DataRdr Subs() {return this;} public DataRdr Subs_byName(String name) {return this;} diff --git a/100_core/src_330_store/gplx/stores/DataRdr_base.java b/100_core/src_330_store/gplx/stores/DataRdr_base.java index fea8e42d4..7003cbc9a 100644 --- a/100_core/src_330_store/gplx/stores/DataRdr_base.java +++ b/100_core/src_330_store/gplx/stores/DataRdr_base.java @@ -179,7 +179,7 @@ public abstract class DataRdr_base implements SrlMgr { try {return (byte[])val;} catch (Exception exc) {Err_dataRdr_ReadFailed_useOr(exc, byte[].class, key, val, or); return or;} } - public gplx.ios.Io_stream_rdr ReadRdr(String key) {return gplx.ios.Io_stream_rdr_.Null;} + public gplx.ios.Io_stream_rdr ReadRdr(String key) {return gplx.ios.Io_stream_rdr_.Noop;} public boolean SrlBoolOr(String key, boolean or) {return ReadBoolOr(key, or);} public byte SrlByteOr(String key, byte or) {return ReadByteOr(key, or);} public int SrlIntOr(String key, int or) {return ReadIntOr(key, or);} diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java index fe33ab6be..7c21d0151 100644 --- a/140_dbs/src/gplx/dbs/Db_conn.java +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -44,6 +44,7 @@ public class Db_conn { public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);} public void Ddl_append_fld(String tbl, Db_meta_fld fld) {engine.Ddl_append_fld(tbl, fld);} public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);} + public boolean Schema_tbl_exists(String tbl) {return engine.Schema_tbl_exists(tbl);} public void Rls_reg(RlsAble rls) {rls_list.Add(rls);} public void Rls_conn() { int len = rls_list.Count(); diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine.java b/140_dbs/src/gplx/dbs/engines/Db_engine.java index 1a044a1c1..9c8da6527 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine.java @@ -38,4 +38,5 @@ public interface Db_engine { void Ddl_delete_tbl(String tbl); void Env_db_attach(String alias, Io_url db_url); void Env_db_detach(String alias); + boolean Schema_tbl_exists(String name); } diff --git a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java index 7e35f3f2e..e496078b7 100644 --- a/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java +++ b/140_dbs/src/gplx/dbs/engines/Db_engine_sql_base.java @@ -74,6 +74,7 @@ public abstract class Db_engine_sql_base implements Db_engine { public void Ddl_delete_tbl(String tbl) {Exec_as_int(Db_sqlbldr__sqlite.I.Bld_drop_tbl(tbl));} @gplx.Virtual public void Env_db_attach(String alias, Io_url db_url) {} @gplx.Virtual public void Env_db_detach(String alias) {} + @gplx.Virtual public boolean Schema_tbl_exists(String name) {return false;} @gplx.Virtual public DataRdr New_rdr(ResultSet rdr, String sql) {return gplx.stores.Db_data_rdr_.new_(rdr, sql);} @gplx.Virtual public Sql_qry_wtr SqlWtr() {return Sql_qry_wtr_.new_ansi();} private Db_rdr New_rdr(Db_stmt stmt, Object rdr, String sql) { diff --git a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java index a1e4f9bb5..d7ff88f65 100644 --- a/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java +++ b/140_dbs/src/gplx/dbs/engines/mems/Db_engine__mem.java @@ -45,6 +45,7 @@ public class Db_engine__mem implements Db_engine { public void Ddl_append_fld(String tbl, Db_meta_fld fld) {} public void Ddl_delete_tbl(String tbl) {} public void Env_db_attach(String alias, Io_url db_url) {} - public void Env_db_detach(String alias) {} + public void Env_db_detach(String alias) {} + public boolean Schema_tbl_exists(String name) {return tbl_hash.Has(name);} public static final Db_engine__mem _ = new Db_engine__mem(); Db_engine__mem() {} } diff --git a/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java b/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java index 1becb9db6..e864405ff 100644 --- a/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java +++ b/140_dbs/src/gplx/dbs/engines/nulls/Null_engine.java @@ -38,5 +38,6 @@ public class Null_engine implements Db_engine { public void Ddl_delete_tbl(String tbl) {} public void Env_db_attach(String alias, Io_url db_url) {} public void Env_db_detach(String alias) {} + public boolean Schema_tbl_exists(String name) {return false;} public static final Null_engine _ = new Null_engine(); Null_engine() {} } diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java index 217ffe944..d18adb41b 100644 --- a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_engine.java @@ -20,9 +20,10 @@ import java.sql.*; import gplx.stores.*; import gplx.dbs.engines.*; import gplx.dbs.engines.sqlite.*; import gplx.dbs.qrys.*; public class Sqlite_engine extends Db_engine_sql_base { - private final Sqlite_txn_mgr txn_mgr; + private final Sqlite_txn_mgr txn_mgr; private final Sqlite_schema_mgr schema_mgr; Sqlite_engine() { this.txn_mgr = new Sqlite_txn_mgr(this); + this.schema_mgr = new Sqlite_schema_mgr(this); } @Override public String Tid() {return Sqlite_conn_info.Tid_const;} @Override public Db_engine New_clone(Db_conn_info connectInfo) { @@ -38,6 +39,7 @@ public class Sqlite_engine extends Db_engine_sql_base { @Override public void Txn_end() {txn_mgr.Txn_end();} @Override public void Txn_cxl() {txn_mgr.Txn_cxl();} @Override public void Txn_sav() {txn_mgr.Txn_sav();} + @Override public boolean Schema_tbl_exists(String name) {return schema_mgr.Tbl_exists(name);} static boolean loaded = false; @gplx.Internal @Override protected Connection Conn_new() { if (!loaded) { @@ -77,7 +79,7 @@ class Db_rdr__sqlite extends Db_rdr__basic { @Override public byte Read_byte(int @Override public DateAdp Read_date_by_str(String k) { try { String val = rdr.getString(k); - return val == null ? null : DateAdp_.parse_fmt(val, "M/dd/yyyy hh:mm tt"); + return val == null ? null : DateAdp_.parse_fmt(val, "yyyyMMdd_HHmmss"); } catch (Exception e) {throw Err_.new_("read failed: i={0} type={1} err={2}", k, DateAdp_.Cls_ref_type, Err_.Message_lang(e));} } // @Override public DecimalAdp ReadDecimalOr(String key, DecimalAdp or) { diff --git a/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java new file mode 100644 index 000000000..c44e3b445 --- /dev/null +++ b/140_dbs/src/gplx/dbs/engines/sqlite/Sqlite_schema_mgr.java @@ -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 . +*/ +package gplx.dbs.engines.sqlite; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*; +import gplx.dbs.schemas.*; import gplx.dbs.qrys.*; +public class Sqlite_schema_mgr { + private final Db_engine engine; private boolean init = true; + public Sqlite_schema_mgr(Db_engine engine) {this.engine = engine;} + public Schema_tbl_mgr Tbl_mgr() {return tbl_mgr;} private final Schema_tbl_mgr tbl_mgr = new Schema_tbl_mgr(); + public Schema_idx_mgr Idx_mgr() {return idx_mgr;} private final Schema_idx_mgr idx_mgr = new Schema_idx_mgr(); + public boolean Tbl_exists(String name) { + if (init) Init(engine); + return tbl_mgr.Has(name); + } + private void Init(Db_engine engine) { + init = false; + Gfo_usr_dlg_.I.Log_many("", "", "db.schema.load.bgn: conn=~{0}", engine.Conn_info().Xto_api()); + Db_qry__select_in_tbl qry = Db_qry__select_in_tbl.new_("sqlite_master", String_.Ary_empty, String_.Ary("type", "name", "sql"), Db_qry__select_in_tbl.Order_by_null); + Db_rdr rdr = engine.New_stmt_prep(qry).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + String type_str = rdr.Read_str(0); + int type_int = Schema_itm_tid.Xto_int(type_str); + switch (type_int) { + case Schema_itm_tid.Tid_table: + Schema_tbl_itm tbl_itm = new Schema_tbl_itm(rdr.Read_str(1), rdr.Read_str(2)); + tbl_mgr.Add(tbl_itm); + break; + case Schema_itm_tid.Tid_index: + Schema_idx_itm idx_itm = new Schema_idx_itm(rdr.Read_str(1), rdr.Read_str(2)); + idx_mgr.Add(idx_itm); + break; + default: + Gfo_usr_dlg_.I.Log_many("", "", "db.schema.unknown type: conn=~{0} type=~{1} name=~{2} sql=~{3}", engine.Conn_info().Xto_api(), type_str, rdr.Read_str(1), rdr.Read_str(2)); + break; + } + } + } finally {rdr.Rls();} + Gfo_usr_dlg_.I.Log_many("", "", "db.schema.load.end"); + } +} diff --git a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java index d3cdb2612..2279d25fb 100644 --- a/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java +++ b/140_dbs/src/gplx/dbs/engines/tdbs/TdbEngine.java @@ -62,7 +62,8 @@ public class TdbEngine implements Db_engine { public void Ddl_append_fld(String tbl, Db_meta_fld fld) {throw Err_.not_implemented_();} public void Ddl_delete_tbl(String tbl) {} public void Env_db_attach(String alias, Io_url db_url) {} - public void Env_db_detach(String alias) {} + public void Env_db_detach(String alias) {} + public boolean Schema_tbl_exists(String name) {return false;} Hash_adp wkrs = Hash_adp_.new_(); TdbDbLoadMgr loadMgr = TdbDbLoadMgr.new_(); TdbDbSaveMgr saveMgr = TdbDbSaveMgr.new_(); public static final TdbEngine _ = new TdbEngine(); diff --git a/140_dbs/src/gplx/dbs/schemas/Schema_idx_itm.java b/140_dbs/src/gplx/dbs/schemas/Schema_idx_itm.java new file mode 100644 index 000000000..f08b3b230 --- /dev/null +++ b/140_dbs/src/gplx/dbs/schemas/Schema_idx_itm.java @@ -0,0 +1,23 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.dbs.schemas; import gplx.*; import gplx.dbs.*; +public class Schema_idx_itm { + public Schema_idx_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; +} diff --git a/140_dbs/src/gplx/dbs/schemas/Schema_idx_mgr.java b/140_dbs/src/gplx/dbs/schemas/Schema_idx_mgr.java new file mode 100644 index 000000000..f38e21bbd --- /dev/null +++ b/140_dbs/src/gplx/dbs/schemas/Schema_idx_mgr.java @@ -0,0 +1,24 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.dbs.schemas; import gplx.*; import gplx.dbs.*; +public class Schema_idx_mgr { + private final Ordered_hash hash = Ordered_hash_.new_(); + public void Add(Schema_idx_itm itm) {hash.Add(itm.Name(), itm);} + public boolean Has(String name) {return hash.Has(name);} + public Schema_idx_itm Get(String name) {return (Schema_idx_itm)hash.Get_by(name);} +} diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_itm_tid.java b/140_dbs/src/gplx/dbs/schemas/Schema_itm_tid.java similarity index 89% rename from 400_xowa/src/gplx/dbs/schemas/Schema_itm_tid.java rename to 140_dbs/src/gplx/dbs/schemas/Schema_itm_tid.java index f00cff1bc..20752bd07 100644 --- a/400_xowa/src/gplx/dbs/schemas/Schema_itm_tid.java +++ b/140_dbs/src/gplx/dbs/schemas/Schema_itm_tid.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ 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 int Tid_unknown = 0, 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); + else return Tid_unknown; } } diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_tbl_itm.java b/140_dbs/src/gplx/dbs/schemas/Schema_tbl_itm.java similarity index 100% rename from 400_xowa/src/gplx/dbs/schemas/Schema_tbl_itm.java rename to 140_dbs/src/gplx/dbs/schemas/Schema_tbl_itm.java diff --git a/400_xowa/src/gplx/dbs/schemas/Schema_tbl_mgr.java b/140_dbs/src/gplx/dbs/schemas/Schema_tbl_mgr.java similarity index 94% rename from 400_xowa/src/gplx/dbs/schemas/Schema_tbl_mgr.java rename to 140_dbs/src/gplx/dbs/schemas/Schema_tbl_mgr.java index ff718691e..76e4795d3 100644 --- a/400_xowa/src/gplx/dbs/schemas/Schema_tbl_mgr.java +++ b/140_dbs/src/gplx/dbs/schemas/Schema_tbl_mgr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.dbs.schemas; import gplx.*; import gplx.dbs.*; public class Schema_tbl_mgr { - private Ordered_hash hash = Ordered_hash_.new_(); + private final 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);} diff --git a/140_dbs/src/gplx/stores/Db_data_rdr.java b/140_dbs/src/gplx/stores/Db_data_rdr.java index 1c1c236e7..b92d3ac9e 100644 --- a/140_dbs/src/gplx/stores/Db_data_rdr.java +++ b/140_dbs/src/gplx/stores/Db_data_rdr.java @@ -56,7 +56,7 @@ public class Db_data_rdr extends DataRdr_base implements DataRdr { java.io.InputStream input_stream = rdr.getBinaryStream(key); return gplx.ios.Io_stream_rdr_.file_(input_stream); } - catch (SQLException e) {return gplx.ios.Io_stream_rdr_.Null;} + catch (SQLException e) {return gplx.ios.Io_stream_rdr_.Noop;} } public boolean MoveNextPeer() { diff --git a/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java index e29d33063..61e4832ef 100644 --- a/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java +++ b/150_gfui/src_300_gxw/gplx/gfui/Gxw_html.java @@ -25,10 +25,9 @@ public interface Gxw_html extends GxwElem { String Html_doc_selected_get_href_or_text(); String Html_doc_selected_get_src_or_empty(); String Html_doc_selected_get_active_or_selection(); // gets selected anchor or highlighted text for opening a new page - boolean Html_doc_find(String id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find); + boolean Html_doc_find(String id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight); void Html_doc_body_focus(); void Html_doc_selection_focus_toggle(); - boolean Html_doc_loaded(); String Html_elem_atr_get_str (String id, String atr_key); boolean Html_elem_atr_get_bool (String id, String atr_key); boolean Html_elem_atr_set (String id, String atr_key, String val); diff --git a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java index 96227ea3b..5937bec0f 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html.java @@ -27,7 +27,7 @@ public class Gfui_html extends GfuiElemBase { public String Html_doc_selected_get_href_or_text() {return under.Html_doc_selected_get_href_or_text();} public String Html_doc_selected_get_src_or_empty() {return under.Html_doc_selected_get_src_or_empty();} public String Html_doc_selected_get_active_or_selection() {return under.Html_doc_selected_get_active_or_selection();} - public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find) {return under.Html_doc_find(elem_id, find, dir_fwd, case_match, wrap_find);} + public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) {return under.Html_doc_find(elem_id, find, dir_fwd, case_match, wrap_find, highlight_matches);} public void Html_doc_body_focus() {under.Html_doc_body_focus();} public void Html_doc_selection_focus_toggle() {under.Html_doc_selection_focus_toggle();} @gplx.Virtual public String Html_elem_atr_get_str(String elem_id, String atr_key) {return under.Html_elem_atr_get_str(elem_id, atr_key);} @@ -47,7 +47,6 @@ public class Gfui_html extends GfuiElemBase { public String Html_active_atr_get_str(String atrKey, String or) {return under.Html_active_atr_get_str(atrKey, or);} public void Html_js_enabled_(boolean v) {under.Html_js_enabled_(v);} public void Html_js_eval_proc(String name, String... args) {under.Html_js_eval_proc(name, args);} - public boolean Html_doc_loaded() {return under.Html_doc_loaded();} public String Html_js_eval_script(String script) {return under.Html_js_eval_script(script);} public void Html_js_cbks_add(String js_func_name, GfoInvkAble invk) {under.Html_js_cbks_add(js_func_name, invk);} public void Html_invk_src_(GfoEvObj v) {under.Html_invk_src_(v);} diff --git a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java index 660aba71f..0bfb5d834 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/Gfui_html_cfg.java @@ -25,10 +25,9 @@ public class Gfui_html_cfg implements GfoInvkAble { public String Doc_selected_get_href_or_text() {return Exec_fmt(fmtr_doc_selected_get_href_or_text);} private Bry_fmtr fmtr_doc_selected_get_href_or_text = Bry_fmtr.keys_(); public String Doc_selected_get_src_or_empty() {return Exec_fmt(fmtr_doc_selected_get_src_or_empty);} private Bry_fmtr fmtr_doc_selected_get_src_or_empty = Bry_fmtr.keys_(); public String Doc_selected_get_active_or_selection() {return Exec_fmt(fmtr_doc_selected_get_active_or_selection);} private Bry_fmtr fmtr_doc_selected_get_active_or_selection = Bry_fmtr.keys_(); - public String Doc_loaded() {return Exec_fmt(fmtr_doc_loaded);} private Bry_fmtr fmtr_doc_loaded = Bry_fmtr.keys_(); - public String Doc_find_html(String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean search_text_is_diff, int prv_find_bgn) { - return Exec_fmt(fmtr_doc_find_html, find, Bool_.Xto_str_lower(dir_fwd), Bool_.Xto_str_lower(case_match), Bool_.Xto_str_lower(wrap_find), Bool_.Xto_str_lower(search_text_is_diff), Int_.Xto_str(prv_find_bgn)); - } private Bry_fmtr fmtr_doc_find_html = Bry_fmtr.keys_("find_text", "dir_fwd", "case_match", "wrap_find", "find_text_is_diff", "prv_find_bgn"); + public String Doc_find_html(String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) { + return Exec_fmt(fmtr_doc_find_html, find, Bool_.Xto_str_lower(dir_fwd), Bool_.Xto_str_lower(case_match), Bool_.Xto_str_lower(wrap_find), Bool_.Xto_str_lower(highlight_matches)); + } private Bry_fmtr fmtr_doc_find_html = Bry_fmtr.keys_("find_text", "dir_fwd", "case_match", "wrap_find", "highlight_matches"); public String Doc_find_edit(String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean search_text_is_diff, int prv_find_bgn) { return Exec_fmt(fmtr_doc_find_edit, find, Bool_.Xto_str_lower(dir_fwd), Bool_.Xto_str_lower(case_match), Bool_.Xto_str_lower(wrap_find), Bool_.Xto_str_lower(search_text_is_diff), Int_.Xto_str(prv_find_bgn)); } private Bry_fmtr fmtr_doc_find_edit = Bry_fmtr.keys_("find_text", "dir_fwd", "case_match", "wrap_find", "find_text_is_diff", "prv_find_bgn"); @@ -75,7 +74,6 @@ public class Gfui_html_cfg implements GfoInvkAble { else if (ctx.Match(k, Invk_doc_selected_get_active_or_selection_)) fmtr_doc_selected_get_active_or_selection.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_doc_find_html_)) fmtr_doc_find_html.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_doc_find_edit_)) fmtr_doc_find_edit.Fmt_(m.ReadBry("v")); - else if (ctx.Match(k, Invk_doc_loaded_)) fmtr_doc_loaded.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_elem_atr_get_)) fmtr_elem_atr_get.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_elem_atr_get_toString_)) fmtr_elem_atr_get_toString.Fmt_(m.ReadBry("v")); else if (ctx.Match(k, Invk_elem_atr_set_)) fmtr_elem_atr_set.Fmt_(m.ReadBry("v")); @@ -104,7 +102,7 @@ public class Gfui_html_cfg implements GfoInvkAble { node_path.Val_(node_path_val); } public static final String Invk_debug_file_ = "debug_file_" - , Invk_doc_html_ = "doc_html_", Invk_doc_body_focus_ = "doc_body_focus_", Invk_doc_selection_focus_toggle_ = "doc_selection_focus_toggle_", Invk_doc_loaded_ = "doc_loaded" + , Invk_doc_html_ = "doc_html_", Invk_doc_body_focus_ = "doc_body_focus_", Invk_doc_selection_focus_toggle_ = "doc_selection_focus_toggle_" , Invk_doc_active_atr_get_ = "doc_active_atr_get_", Invk_doc_find_html_ = "doc_find_html_", Invk_doc_find_edit_ = "doc_find_edit_" , Invk_doc_selected_get_text_or_href_ = "doc_selected_get_text_or_href_", Invk_doc_selected_get_href_or_text_ = "doc_selected_get_href_or_text_", Invk_doc_selected_get_src_or_empty_ = "doc_selected_get_src_or_empty_", Invk_doc_selected_get_active_or_selection_ = "doc_selected_get_active_or_selection_" , Invk_win_print_preview_ = "win_print_preview_" diff --git a/150_gfui/src_700_env/gplx/gfui/Mem_html.java b/150_gfui/src_700_env/gplx/gfui/Mem_html.java index d9b80e143..124d653c4 100644 --- a/150_gfui/src_700_env/gplx/gfui/Mem_html.java +++ b/150_gfui/src_700_env/gplx/gfui/Mem_html.java @@ -25,7 +25,6 @@ class Mem_html extends GxwTextMemo_lang implements Gxw_html { public String Htm public String Html_doc_selected_get_href_or_text() {return "";} public String Html_doc_selected_get_src_or_empty() {return "";} public String Html_doc_selected_get_active_or_selection() {return "";} - public boolean Html_doc_loaded() {return true;} public boolean Html_window_print_preview() {return false;} public void Html_invk_src_(GfoEvObj v) {} public String Html_elem_atr_get_str(String elem_id, String atr_key) { @@ -87,7 +86,7 @@ class Mem_html extends GxwTextMemo_lang implements Gxw_html { public String Htm if (!Int_.Between(pos, q0, q1)) return null; // current pos is not between nearest quotes return String_.Mid(txt, q0 + 1, q1); } - public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find) { + public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) { // String txt = this.TextVal(); // int pos = this.SelBgn(); // int bgn = String_.FindFwd(txt, find, pos); if (bgn == String_.Find_none) return false; diff --git a/150_gfui/xtn/gplx/gfui/Swt_html.java b/150_gfui/xtn/gplx/gfui/Swt_html.java index 5801541e2..78085a57c 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_html.java +++ b/150_gfui/xtn/gplx/gfui/Swt_html.java @@ -40,10 +40,9 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { this.kit = kit; lnr_location = new Swt_html_lnr_location(this); lnr_status = new Swt_html_lnr_status(this); - int browser_type = Swt_html.Browser_tid_none; - Object browser_type_obj = ctorArgs.FetchValOr(Swt_kit.Cfg_Html_BrowserType, null); - if (browser_type_obj != null) browser_type = Int_.cast_(browser_type_obj); - browser = new Browser(owner_control.Under_composite(), browser_type); + Object browser_tid_obj = ctorArgs.FetchValOr(Swt_kit.Cfg_Html_BrowserType, null); + this.browser_tid = browser_tid_obj == null ? Browser_tid_none : Int_.cast_(browser_tid_obj); + browser = new Browser(owner_control.Under_composite(), browser_tid); core = new Swt_core_cmds_html(this, browser); browser.addKeyListener(new Swt_lnr_key(this)); browser.addMouseListener(new Swt_html_lnr_mouse(this, browser, kit)); @@ -58,6 +57,7 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { @Override public Control Under_control() {return browser;} private Browser browser; @Override public Composite Under_composite() {return null;} @Override public Control Under_menu_control() {return browser;} + public int Browser_tid() {return browser_tid;} private final int browser_tid; public String Html_doc_html() {return Eval_script_as_str(kit.Html_cfg().Doc_html());} public void Html_doc_html_load_by_mem(String html) { html_doc_html_load_tid = Gxw_html_load_tid_.Tid_mem; @@ -75,7 +75,6 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { public String Html_doc_selected_get_src_or_empty() {return Eval_script_as_str(kit.Html_cfg().Doc_selected_get_src_or_empty());} public String Html_doc_selected_get_active_or_selection() {return Eval_script_as_str(kit.Html_cfg().Doc_selected_get_active_or_selection());} public void Html_doc_body_focus() {Eval_script_as_exec(kit.Html_cfg().Doc_body_focus());} - public boolean Html_doc_loaded() {return Bool_.parse_((String)Eval_script(kit.Html_cfg().Doc_loaded()));} public void Html_doc_selection_focus_toggle() {Eval_script_as_exec(kit.Html_cfg().Doc_selection_focus_toggle());} public String Html_elem_atr_get_str(String elem_id, String atr_key) {return Eval_script_as_str(kit.Html_cfg().Elem_atr_get(elem_id, atr_key));} public boolean Html_elem_atr_get_bool(String elem_id, String atr_key) {return Bool_.parse_((String)Eval_script(kit.Html_cfg().Elem_atr_get_toString(elem_id, atr_key)));} @@ -119,20 +118,16 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener { Gfui_html_cfg.Html_window_vpos_parse(v, scroll_top, node_path); return Eval_script_as_exec(kit.Html_cfg().Window_vpos_(node_path.Val(), scroll_top.Val())); } private String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_(); - public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find) { + public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) { // if (String_.Eq(find, String_.Empty)) return false; find = String_.Replace(find, "\\", "\\\\"); // escape \ -> \\ find = String_.Replace(find, "'", "\\'"); // escape ' -> \'; NOTE: \\' instead of \' - boolean search_text_is_diff = !String_.Eq(find, prv_find_str); - prv_find_str = find; String script = String_.Eq(elem_id, Gfui_html.Elem_id_body) - ? kit.Html_cfg().Doc_find_html(find, dir_fwd, case_match, wrap_find, search_text_is_diff, prv_find_bgn) - : kit.Html_cfg().Doc_find_edit(find, dir_fwd, case_match, wrap_find, search_text_is_diff, prv_find_bgn); - Object result_obj = Eval_script(script); - try {prv_find_bgn = (int)Double_.cast_(result_obj);} - catch (Exception e) {Err_.Noop(e); return false;} + ? kit.Html_cfg().Doc_find_html(find, dir_fwd, case_match, wrap_find, highlight_matches) + : kit.Html_cfg().Doc_find_edit(find, dir_fwd, case_match, wrap_find, false, -1); + Eval_script(script); return true; - } private String prv_find_str = ""; private int prv_find_bgn; + } public void Html_invk_src_(GfoEvObj invk) {lnr_location.Host_set(invk); lnr_status.Host_set(invk);} public void Html_dispose() { browser.dispose(); @@ -186,8 +181,8 @@ class Swt_html_eval_rslt { public Object Result() {return result;} public void Result_set(Object v) {result = v; error = null;} private Object result; public String Error () {return error;} public void Error_set(String v) {error = v; result = null;} private String error; } -class Swt_html_lnr_Traverse implements TraverseListener { - public Swt_html_lnr_Traverse(Swt_html html_box) {} +class Swt_html_lnr_traverse implements TraverseListener { + public Swt_html_lnr_traverse(Swt_html html_box) {} @Override public void keyTraversed(TraverseEvent arg0) {} } class Swt_html_lnr_title implements TitleListener { @@ -240,6 +235,10 @@ class Swt_html_lnr_location implements LocationListener { private void Pub_evt(LocationEvent arg, String evt) { String location = arg.location; if (String_.Eq(location, "about:blank")) return; // location changing event fires once when page is loaded; ignore + if ( html_box.Browser_tid() == Swt_html.Browser_tid_webkit // webkit prefixes "about:blank" to anchors; causes TOC to fail when clicking on links; EX:about:blank#TOC1; DATE:2015-06-09 + && String_.HasAtBgn(location, "about:blank")) { + location = String_.Mid(location, 11); // 11 = "about:blank".length + } if ( html_box.Html_doc_html_load_tid() == Gxw_html_load_tid_.Tid_url // navigating to file://page.html will fire location event; ignore if url mode && String_.HasAtBgn(location, "file:") && String_.HasAtEnd(location, ".html") diff --git a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java index 437ff48fa..a990087f3 100644 --- a/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java +++ b/400_xowa/src/gplx/fsdb/Fsdb_db_mgr_.java @@ -16,20 +16,25 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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; } diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java index 08cf84963..0b98826f4 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java @@ -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) { diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java index 07f5646bb..57667570b 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_mgr.java @@ -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(); diff --git a/400_xowa/src/gplx/html/Html_utl.java b/400_xowa/src/gplx/html/Html_utl.java index b4761b81c..ca6dc56d9 100644 --- a/400_xowa/src/gplx/html/Html_utl.java +++ b/400_xowa/src/gplx/html/Html_utl.java @@ -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)); diff --git a/400_xowa/src/gplx/xowa/Xoa_app.java b/400_xowa/src/gplx/xowa/Xoa_app.java index 13e4df0f8..f8d079692 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app.java +++ b/400_xowa/src/gplx/xowa/Xoa_app.java @@ -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(); } diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 67bb03c21..87315b65e 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -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 = ""; diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index 47c589cd3..f3bb773db 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -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(); diff --git a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_find.java b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_find.java index 1b497ba1e..0aa650448 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_find.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/gui/browsers/Xoapi_find.java @@ -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() { diff --git a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java index 67ba28832..de3bd9d3e 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_bookmarks.java @@ -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")); diff --git a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_cache.java b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_cache.java index 20c58976f..12f5a49d1 100644 --- a/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_cache.java +++ b/400_xowa/src/gplx/xowa/apis/xowa/usrs/Xoapi_cache.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java index 480cd228b..46968b880 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_keys.java @@ -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" diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java index 3b4f9360b..0845076e4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_cmd_mgr.java @@ -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)); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java index e24aabef9..43b5dc06f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java index 3b33ebb09..debefb2d3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java @@ -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(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_ns_to_db_wkr__text.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_ns_to_db_wkr__text.java new file mode 100644 index 000000000..e7bac059a --- /dev/null +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_ns_to_db_wkr__text.java @@ -0,0 +1,30 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.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(); + } +} diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java index fda13acb6..221f36204 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/sqls/Xob_page_cmd.java @@ -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(); - } -} diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java index f1d717b39..272bd7ff4 100644 --- a/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/dbs/Xodb_save_mgr_sql.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java index e162f0c36..62250a7fd 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_fxt.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java index 5e7d1a608..475ad9cfc 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java @@ -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), "", ""); - } - } -} diff --git a/400_xowa/src/gplx/xowa/files/Xof_redlink_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_redlink_wkr.java new file mode 100644 index 000000000..f69bd5a04 --- /dev/null +++ b/400_xowa/src/gplx/xowa/files/Xof_redlink_wkr.java @@ -0,0 +1,35 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.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), "", ""); + } + } +} diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java index 14a1c0982..5cc3ac37b 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java index dd06d8d1a..3409faab8 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsdb_sql.java @@ -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()); } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java index eac1f7a75..bca433c4b 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java @@ -25,7 +25,7 @@ public abstract class Xof_bin_wkr__fsys_base implements Xof_bin_wkr, 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); diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java index 74d2a2f91..20f8ce5b4 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__http_wmf.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java index d6fee7d46..ee49ce3f5 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_mgr_tst.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java index 788dcadfb..52b0d2711 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/Xof_fsdb_mgr__sql.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java index 7ec97f929..12c9e0f8e 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java index f81e5637d..6c16c679c 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr_.java @@ -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;} } diff --git a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java index d3e2d5b2c..3cdd26486 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java +++ b/400_xowa/src/gplx/xowa/files/gui/Xog_js_wkr__log.java @@ -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" + ; } diff --git a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java index 78f455e27..0c49fac74 100644 --- a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java +++ b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack.java @@ -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; } diff --git a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java index 684b888af..59f639d2c 100644 --- a/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java +++ b/400_xowa/src/gplx/xowa/gui/history/Xog_history_stack_tst.java @@ -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; diff --git a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java index fbc4f1a8b..cf677561b 100644 --- a/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java +++ b/400_xowa/src/gplx/xowa/gui/urls/Xog_url_wkr.java @@ -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(); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java index 744d08ed3..316ddb498 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_html_itm.java @@ -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" diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java index 0617fcdd9..10fc2a0f0 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm.java @@ -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) { diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java index 6255fb7b3..624785722 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_tab_itm_edit_mgr.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java index e014e2118..4447d04c4 100644 --- a/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java +++ b/400_xowa/src/gplx/xowa/gui/views/Xog_win_itm.java @@ -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; diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java index 54da801f3..ae335850d 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java @@ -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: { diff --git a/400_xowa/src/gplx/xowa/html/css/Xob_css_status.java b/400_xowa/src/gplx/xowa/html/css/Xob_css_status.java new file mode 100644 index 000000000..41a702f3f --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/css/Xob_css_status.java @@ -0,0 +1,79 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.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"; +} diff --git a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java index f6807bf7c..dfa06124f 100644 --- a/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java +++ b/400_xowa/src/gplx/xowa/html/css/Xowd_css_core_mgr.java @@ -16,7 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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(); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java index ef487a207..e209599e0 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_rdr.java @@ -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; diff --git a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java index 66adc938a..f81330a4b 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/Xohd_hdump_wtr.java @@ -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(); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java index ecbe32fe7..3dba2d867 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/abrvs/Xohd_abrv_mgr.java @@ -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 ? "" : img.Data_print(), Err_.Message_gplx(e));} return rv; } private int Write_redlink(Bry_bfr bfr, Xog_page hpg, int uid, int rv) { diff --git a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java index 877764e8a..4aaf309c1 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/bldrs/Xob_hdump_bldr.java @@ -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 } } diff --git a/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__base.java b/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__base.java index 44bd83cb9..27dc18b05 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__base.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__base.java @@ -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(); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__gallery_mgr.java b/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__gallery_mgr.java index 33f1b228e..70bc3331b 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__gallery_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/core/Xohd_data_itm__gallery_mgr.java @@ -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(); diff --git a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java index e44eec403..b1a1ee4f2 100644 --- a/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java +++ b/400_xowa/src/gplx/xowa/html/hdumps/data/Xohd_page_html_mgr__load.java @@ -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 } } diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java index 089f8cf71..2296073e8 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java @@ -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:[[A]]; 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 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("AB"); fxt.Test_load(brys, "AB"); } + @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("A1"), Xow_hzip_dict.Bry_a_rhs); + fxt.Test_save(brys, "A1"); + } @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, "http://a.org"); diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java index 728d47bf4..06fcc80e9 100644 --- a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java @@ -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(""); 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 diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_mgr.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_mgr.java index 55985b511..9df1ff7b4 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_mgr.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_mgr.java @@ -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); } diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java index 83c20ff27..e3779abe6 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java @@ -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 diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java index ffdecd8d4..e3237b8d9 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java @@ -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 diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java index 9f425b756..6318037b7 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import 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; diff --git a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java index e303733a1..8e5738b7e 100644 --- a/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java +++ b/400_xowa/src/gplx/xowa/servers/Gxw_html_server.java @@ -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));} diff --git a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java index 6cdfbf86d..99da005f3 100644 --- a/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java +++ b/400_xowa/src/gplx/xowa/servers/http/Http_server_mgr.java @@ -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 diff --git a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java index 923405be4..17e21584b 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_mgr.java @@ -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) { diff --git a/400_xowa/src/gplx/xowa/specials/Xows_special_meta_.java b/400_xowa/src/gplx/xowa/specials/Xows_special_meta_.java index 81ea46c16..6d8267a92 100644 --- a/400_xowa/src/gplx/xowa/specials/Xows_special_meta_.java +++ b/400_xowa/src/gplx/xowa/specials/Xows_special_meta_.java @@ -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) ; } diff --git a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java index d7d2de291..f9bb9391b 100644 --- a/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java +++ b/400_xowa/src/gplx/xowa/specials/randoms/Xop_randomRootPage_page_tst.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java index d15d30287..78142830a 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xog_search_suggest_mgr.java @@ -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 diff --git a/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Xows_bmk_page.java b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Xows_bmk_page.java new file mode 100644 index 000000000..bb41d8c74 --- /dev/null +++ b/400_xowa/src/gplx/xowa/specials/xowa/bookmarks/Xows_bmk_page.java @@ -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 . +*/ +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_(); + } +} diff --git a/400_xowa/src/gplx/xowa/users/Xou_user.java b/400_xowa/src/gplx/xowa/users/Xou_user.java index 71f62c58a..dcf68f599 100644 --- a/400_xowa/src/gplx/xowa/users/Xou_user.java +++ b/400_xowa/src/gplx/xowa/users/Xou_user.java @@ -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(); } diff --git a/400_xowa/src/gplx/xowa/users/Xoue_user.java b/400_xowa/src/gplx/xowa/users/Xoue_user.java index 3887fbb8d..36341eb92 100644 --- a/400_xowa/src/gplx/xowa/users/Xoue_user.java +++ b/400_xowa/src/gplx/xowa/users/Xoue_user.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/users/Xouv_user.java b/400_xowa/src/gplx/xowa/users/Xouv_user.java index 382894dc4..13c07074f 100644 --- a/400_xowa/src/gplx/xowa/users/Xouv_user.java +++ b/400_xowa/src/gplx/xowa/users/Xouv_user.java @@ -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); } } diff --git a/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java index f51cea4d6..40e74ea0b 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java +++ b/400_xowa/src/gplx/xowa/users/data/Xou_db_file.java @@ -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(); +// } } } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_db_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xou_db_mgr.java similarity index 56% rename from 400_xowa/src/gplx/xowa/users/data/Xoud_db_mgr.java rename to 400_xowa/src/gplx/xowa/users/data/Xou_db_mgr.java index b15af380f..5edd49769 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_db_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xou_db_mgr.java @@ -16,20 +16,36 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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)); diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_hwtr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_hwtr.java new file mode 100644 index 000000000..1c6fae402 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_hwtr.java @@ -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 . +*/ +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 + ( "" + , " " + , " " + , " " + , " " + , " " + , " " + , " ~{rows}" + , "
WikiPageAnchorQargs
" + ), "rows"); +// private static final Bry_fmtr row_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl +// ( " " +// , " ~{wiki}" +// , " ~{page}" +// , " ~{anchor}" +// , " ~{qarg}" +// , " delete_btn" +// , " " +// ), "wiki", "page", "anchor", "qarg"); +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_mgr.java new file mode 100644 index 000000000..9a8cbd849 --- /dev/null +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_mgr.java @@ -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 . +*/ +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); + } +} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java index 14ae1691b..be62b9dd8 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_row.java @@ -17,19 +17,9 @@ along with this program. If not, see . */ 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; } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java index 3ff4e4334..b3e50f008 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_bmk_tbl.java @@ -18,54 +18,40 @@ along with this program. If not, see . 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() {} diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java index 77650355b..15b093258 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_cfg_mgr.java @@ -17,9 +17,9 @@ along with this program. If not, see . */ 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(); } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java index d63062a19..527cfc31f 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_mgr.java @@ -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(); } diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java index 25c610754..0e77d5399 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_history_special.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_site_mgr.java b/400_xowa/src/gplx/xowa/users/data/Xoud_site_mgr.java index 048079e17..63024ea0e 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_site_mgr.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_site_mgr.java @@ -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(); } diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java index 649cfd67f..57da4f1a9 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java @@ -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 diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java index 1838b5076..6f51d0c3c 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_db_mgr.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java index 3eaaf69c7..0f35376dd 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java @@ -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;} diff --git a/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xtn_mgr.java index e9c13030d..06bfd0ff9 100644 --- a/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xtn_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/hieros/Hiero_xtn_mgr.java @@ -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;} } diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java index 8601af4d0..be811640b 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ 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(); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__lib_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__lib_tst.java index f40336590..8190bd9b0 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__lib_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_ustring__lib_tst.java @@ -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"); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java index 5098ace94..28df9e75e 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java @@ -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())); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java index 9302e8da7..3707112a9 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java @@ -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:" diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_visitor.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_visitor.java index 2044a724a..4a3fde0f8 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_visitor.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_visitor.java @@ -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; } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_regx_converter.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_regx_converter.java index 58a302a00..4d41df4eb 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_regx_converter.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_regx_converter.java @@ -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�r�_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}"); diff --git a/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java b/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java index 81253e9e4..1aa929149 100644 --- a/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/translates/Xop_mylanguage_page_tst.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_doc_wtr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_doc_wtr.java index 8ea57586e..7a22f48d3 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_doc_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_doc_wtr.java @@ -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; diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java index a97b842ea..3c3a6847b 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_prop_val_visitor.java @@ -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 diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java index 87db43689..d7308f710 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java @@ -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) { diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java index 9dfb1bdbe..fd79c2a25 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr_fxt.java @@ -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)); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_entity.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_entity.java index eaf20ce28..4e02c9ceb 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_entity.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_claim_itm_entity.java @@ -17,16 +17,33 @@ along with this program. If not, see . */ 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)); } } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_mainsnak.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_mainsnak.java index 9a192a56a..384636bbc 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_mainsnak.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_mainsnak.java @@ -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) ; } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_value_entity.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_value_entity.java index 85fc349a4..a081f7e45 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_value_entity.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_value_entity.java @@ -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) - ; } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_value_entity_tid.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_value_entity_tid.java new file mode 100644 index 000000000..de00ae1f8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_dict_value_entity_tid.java @@ -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 . +*/ +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(); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_wkr_wiki.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_wkr_wiki.java index 54a84395c..8c9861294 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_wkr_wiki.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_lbl_wkr_wiki.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java index 011434fc4..68b3bd5ce 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr.java @@ -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()); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java index 181282535..d53a29cef 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__html_wtr_tst.java @@ -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) , "item_1" ); } + @Test public void Entity_pid() { + fxt + .Init_resolved_pid(1, "item_1") + .Test_claim_val + ( fxt.Wdata_fxt().Make_claim_entity_pid(1, 1) + , "item_1" + ); + } @Test public void Globecoordinate() { fxt .Init_resolved_qid(2, "Earth") diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__lbl_gatherer.java b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__lbl_gatherer.java index 5012ad83d..06aa8d2fd 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__lbl_gatherer.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/hwtrs/Wdata_visitor__lbl_gatherer.java @@ -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()); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Io_stream_rdr_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Io_stream_rdr_mgr.java new file mode 100644 index 000000000..e51793365 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Io_stream_rdr_mgr.java @@ -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 . +*/ +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) + ; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_cmd.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_cmd.java new file mode 100644 index 000000000..2805eab61 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_cmd.java @@ -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 . +*/ +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_"; +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_db.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_db.java new file mode 100644 index 000000000..af53f4bd0 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_db.java @@ -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 . +*/ +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"); +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_parser.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_parser.java new file mode 100644 index 000000000..90954e499 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wbase_json_dump_parser.java @@ -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 . +*/ +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; + } + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java index 67a804136..63c799961 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_db_cmd.java @@ -414,7 +414,7 @@ class Xob_wdata_db_visitor implements Wdata_claim_visitor { public void Visit_globecoordinate(Wdata_claim_itm_globecoordinate itm) {rv = Bry_.Add_w_dlm(Byte_ascii.Comma, itm.Lat(), itm.Lng());} public void Visit_system(Wdata_claim_itm_system itm) {rv = Bry_.Empty;} public void Visit_entity(Wdata_claim_itm_entity itm) { - Wdata_doc entity_doc = wdata_mgr.Pages_get(Bry_.Add(Wdata_wiki_mgr.Bry_q, itm.Entity_id_bry())); + Wdata_doc entity_doc = wdata_mgr.Pages_get(itm.Page_ttl_db()); rv = entity_doc == null ? Bry_.Empty : entity_doc.Label_list_get(lang_key); } } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java index 5d505cc3b..591474859 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_base.java @@ -37,6 +37,9 @@ public abstract class Xob_wdata_pid_base extends Xob_itm_dump_base implements Xo bldr.Usr_dlg().Warn_many(GRP_KEY, "json.invalid", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_u8(page.Ttl_page_db())); return; } + Parse_jdoc(jdoc); + } + public void Parse_jdoc(Json_doc jdoc) { Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc); byte[] qid = wdoc_parser.Parse_qid(jdoc); Ordered_hash list = wdoc_parser.Parse_langvals(qid, jdoc, Bool_.Y); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java index 02f385674..59c3b0bc6 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_pid_sql.java @@ -21,7 +21,7 @@ public class Xob_wdata_pid_sql extends Xob_wdata_pid_base { private Xowd_wbase_pid_tbl tbl; @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_pid;} @Override public void Pid_bgn() { - Xowd_db_mgr db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); + Xowd_db_mgr db_mgr = wiki.Data_mgr__core_mgr(); tbl = db_mgr.Db__wbase().Tbl__wbase_pid(); tbl.Create_tbl(); tbl.Insert_bgn(); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java index 7c1c9e37b..d91bfc7a9 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_base.java @@ -35,6 +35,9 @@ public abstract class Xob_wdata_qid_base extends Xob_itm_dump_base implements Xo if (page.Ns_id() != Xow_ns_.Id_main) return; // qid pages are only in the Main namespace Json_doc jdoc = parser.Parse(page.Text()); if (jdoc == null) {bldr.Usr_dlg().Warn_many("", "", "json is invalid: ns=~{0} id=~{1}", page.Ns_id(), String_.new_u8(page.Ttl_page_db())); return;} + this.Parse_jdoc(jdoc); + } + public void Parse_jdoc(Json_doc jdoc) { Wdata_doc_parser wdoc_parser = app.Wiki_mgr().Wdata_mgr().Wdoc_parser(jdoc); byte[] qid = wdoc_parser.Parse_qid(jdoc); Bry_bfr tmp_bfr = Bry_bfr.reset_(255); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java index 39bfa22d9..87c0caaa8 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xob_wdata_qid_sql.java @@ -22,10 +22,12 @@ public class Xob_wdata_qid_sql extends Xob_wdata_qid_base { @Override public String Wkr_key() {return gplx.xowa.bldrs.Xob_cmd_keys.Key_wbase_qid;} @Override public void Qid_bgn() { Xowd_db_mgr db_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); - Xowd_db_file wbase_db = db_mgr.Props().Layout_text().Tid_is_all_or_few() + boolean db_is_all_or_few = db_mgr.Props().Layout_text().Tid_is_all_or_few(); + Xowd_db_file wbase_db = db_is_all_or_few ? db_mgr.Db__core() - : db_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_wbase) - ; + : db_mgr.Dbs__make_by_tid(Xowd_db_file_.Tid_wbase); + if (db_is_all_or_few) + db_mgr.Db__wbase_(wbase_db); tbl = wbase_db.Tbl__wbase_qid(); tbl.Create_tbl(); tbl.Insert_bgn(); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_mgr.java index 789d6924b..977c90577 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/imports/Xow_wmf_api_mgr.java @@ -27,9 +27,18 @@ public class Xow_wmf_api_mgr { String wiki = wiki_ary[i]; if (!wkr.Api_wiki_enabled(wiki)) continue; String call = String_.Format("https://{0}/w/api.php?{1}", wiki, wkr.Api_qargs()); // EX: https://en.wikipedia.org/w/api.php?action=query&meta=siteinfo&siprop=namespaces - usr_dlg.Prog_many("", "", "wmf_api:calling; wiki~{0} api=~{1}", wiki, call); - byte[] rslt = Io_mgr.I.DownloadFil_args("", null).Trg_engine_key_(trg_engine_key).Exec_as_bry(call); - if (rslt == null) {usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; api=~{0}", call); continue;} + usr_dlg.Prog_many("", "", "wmf_api:calling; wiki=~{0} api=~{1}", wiki, call); + byte[] rslt = null; + for (int j = 0; j < 5; ++j) { + rslt = Io_mgr.I.DownloadFil_args("", null).User_agent_(Xoa_app_.User_agent).Trg_engine_key_(trg_engine_key).Exec_as_bry(call); + if (rslt != null) break; + usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; retrying; api=~{0}", call); + gplx.core.threads.Thread_adp_.Sleep(1000); + } + if (rslt == null) { + usr_dlg.Warn_many("", "", "wmf_api:wmf api returned nothing; api=~{0}", call); + continue; + } wkr.Api_exec(wiki, rslt); } wkr.Api_term(); @@ -872,9 +881,6 @@ public class Xow_wmf_api_mgr { , "zu.wikipedia.org" , "zu.wiktionary.org" , "zu.wikibooks.org" -, "ne.wikipedia.org" -, "ne.wiktionary.org" -, "ne.wikibooks.org" }; //, "als.wikisource.org" //, "als.wikinews.org" diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java index 6f79be43d..e93fdf387 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java @@ -121,6 +121,7 @@ class Wdata_claims_parser_v2 { switch (tid) { case Wdata_dict_mainsnak.Tid_snaktype: snak_tid = Wdata_dict_snak_tid.Xto_tid(sub.Val().Data_bry()); break; case Wdata_dict_mainsnak.Tid_datavalue: return Parse_datavalue(qid, pid, snak_tid, Json_itm_nde.cast_(sub.Val())); + case Wdata_dict_mainsnak.Tid_datatype: break; // ignore: has values like "wikibase-property"; EX: www.wikidata.org/wiki/Property:P397; DATE:2015-06-12 case Wdata_dict_mainsnak.Tid_property: break; // ignore: pid already available above case Wdata_dict_mainsnak.Tid_hash: break; // ignore: "84487fc3f93b4f74ab1cc5a47d78f596f0b49390" } @@ -153,17 +154,18 @@ class Wdata_claims_parser_v2 { private Wdata_claim_itm_entity Parse_datavalue_entity(byte[] qid, int pid, byte snak_tid, Json_itm_nde nde) { Hash_adp_bry dict = Wdata_dict_value_entity.Dict; int len = nde.Subs_len(); + byte entity_tid = Byte_.Max_value_127; byte[] entity_id_bry = null; for (int i = 0; i < len; ++i) { Json_itm_kv sub = Json_itm_kv.cast_(nde.Subs_get_at(i)); byte tid = Wdata_dict_utl.Get_tid_or_invalid(qid, dict, sub.Key().Data_bry()); if (tid == Wdata_dict_utl.Tid_invalid) continue; switch (tid) { - case Wdata_dict_value_entity.Tid_entity_type: break; // ignore: "item" + case Wdata_dict_value_entity.Tid_entity_type: entity_tid = Wdata_dict_value_entity_tid.Xto_tid(sub.Val().Data_bry()); break; case Wdata_dict_value_entity.Tid_numeric_id: entity_id_bry = sub.Val().Data_bry(); break; } } if (entity_id_bry == null) throw Err_.new_("pid is invalid entity; pid={0}", pid); - return new Wdata_claim_itm_entity(pid, snak_tid, entity_id_bry); + return new Wdata_claim_itm_entity(pid, snak_tid, entity_tid, entity_id_bry); } private Wdata_claim_itm_monolingualtext Parse_datavalue_monolingualtext(byte[] qid, int pid, byte snak_tid, Json_itm_nde nde) { Hash_adp_bry dict = Wdata_dict_value_monolingualtext.Dict; diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_fxt_base.java b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_fxt_base.java index f45362288..f29cce1b1 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_fxt_base.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_fxt_base.java @@ -27,7 +27,8 @@ abstract class Wdata_doc_parser_fxt_base { public Wdata_langtext_itm Make_langval(String lang, String text) {return new Wdata_langtext_itm(Bry_.new_u8(lang), Bry_.new_u8(text));} public Wdata_alias_itm Make_alias(String lang, String... vals) {return new Wdata_alias_itm(Bry_.new_u8(lang), Bry_.Ary(vals));} public Wdata_claim_itm_core Make_claim_str(int pid, String val) {return new Wdata_claim_itm_str(pid, Wdata_dict_snak_tid.Tid_value, Bry_.new_u8(val));} - public Wdata_claim_itm_core Make_claim_entity(int pid, int entityId) {return new Wdata_claim_itm_entity(pid, Wdata_dict_snak_tid.Tid_value, Int_.Xto_bry(entityId));} + public Wdata_claim_itm_core Make_claim_entity_qid(int pid, int entityId) {return new Wdata_claim_itm_entity(pid, Wdata_dict_snak_tid.Tid_value, Wdata_dict_value_entity_tid.Tid_item, Int_.Xto_bry(entityId));} + public Wdata_claim_itm_core Make_claim_entity_pid(int pid, int entityId) {return new Wdata_claim_itm_entity(pid, Wdata_dict_snak_tid.Tid_value, Wdata_dict_value_entity_tid.Tid_property, Int_.Xto_bry(entityId));} public Wdata_claim_itm_core Make_claim_monolingualtext(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_globecoordinate(int pid, String lat, String lng, String prc) {return new Wdata_claim_itm_globecoordinate(pid, Wdata_dict_snak_tid.Tid_value, Bry_.new_u8(lat), Bry_.new_u8(lng), Bry_.new_a7("null"), Bry_.new_u8(prc), Bry_.new_a7("http://www.wikidata.org/entity/Q2"));} public Wdata_claim_itm_core Make_claim_quantity(int pid, int val, int unit, int ubound, int lbound) {return new Wdata_claim_itm_quantity(pid, Wdata_dict_snak_tid.Tid_value, Bry_.new_u8(Int_.Xto_str(val)), Bry_.new_u8(Int_.Xto_str(unit)), Bry_.new_u8(Int_.Xto_str(ubound)), Bry_.new_u8(Int_.Xto_str(lbound)));} diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v1.java b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v1.java index d9516445d..3b9b0bbf5 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v1.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v1.java @@ -194,7 +194,7 @@ public class Wdata_doc_parser_v1 implements Wdata_doc_parser { case Wdata_dict_val_tid.Tid_entity: { Json_itm_nde sub_nde = Json_itm_nde.cast_(ary.Subs_get_at(3)); Json_itm_kv entity_kv = Json_itm_kv.cast_(sub_nde.Subs_get_at(1)); - return new Wdata_claim_itm_entity(pid, snak_tid, entity_kv.Val().Data_bry()); + return new Wdata_claim_itm_entity(pid, snak_tid, Wdata_dict_value_entity_tid.Tid_item, entity_kv.Val().Data_bry()); } case Wdata_dict_val_tid.Tid_time: { Json_itm_nde sub_nde = Json_itm_nde.cast_(ary.Subs_get_at(3)); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v2_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v2_tst.java index 2869fc185..7e56af84c 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v2_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_doc_parser_v2_tst.java @@ -205,7 +205,19 @@ public class Wdata_doc_parser_v2_tst { , ", 'type':'wikibase-entityid'" , "}" ) - , fxt.Make_claim_entity(1, 123) + , fxt.Make_claim_entity_qid(1, 123) + ); + } + @Test public void Claims_data_property() { + fxt.Test_claims_data(String_.Concat_lines_nl_skip_last + ( "{ 'value':" + , " { 'entity-type':'property'" + , " , 'numeric-id':'398'" + , " }" + , ", 'type':'wikibase-entityid'" + , "}" + ) + , fxt.Make_claim_entity_pid(1, 398) ); } @Test public void Claims_data_monolingualtext() { @@ -311,7 +323,7 @@ public class Wdata_doc_parser_v2_tst { , " ]" , " }" , "}" - ), fxt.Make_claim_entity(1, 11), fxt.Make_claim_entity(1, 12), fxt.Make_claim_entity(2, 21) + ), fxt.Make_claim_entity_qid(1, 11), fxt.Make_claim_entity_qid(1, 12), fxt.Make_claim_entity_qid(2, 21) ); } @Test public void Pid_order() { @@ -362,7 +374,7 @@ public class Wdata_doc_parser_v2_tst { , " }" , " ]" , "}" - ), Int_.Ary(2, 3), fxt.Make_claim_entity(2, 21), fxt.Make_claim_entity(3, 31)) + ), Int_.Ary(2, 3), fxt.Make_claim_entity_qid(2, 21), fxt.Make_claim_entity_qid(3, 31)) ; } @Test public void References_empty() { // PURPOSE:sometimes references can have 0 snaks; return back an empty Wdata_claim_grp_list, not null; PAGE:Птичкин,_Евгений_Николаевич; DATE:2015-02-16 diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java index 34e4f14f7..a1c81c157 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/pfuncs/Wdata_pf_property_tst.java @@ -28,20 +28,20 @@ public class Wdata_pf_property_tst { @Test public void Entity() { fxt.Init_links_add("enwiki", "Test_page", "q1"); fxt.Init_pages_add(fxt.Wdoc_bldr("q2").Add_label("en", "b").Xto_wdoc()); - fxt.Init_pages_add(fxt.doc_("q1", fxt.Make_claim_entity(1, 2))); + fxt.Init_pages_add(fxt.doc_("q1", fxt.Make_claim_entity_qid(1, 2))); fxt.Test_parse("{{#property:p1}}", "b"); } @Test public void Entity_fr() { // PURPOSE: non-English wiki should default to English label if non-English label not available; DATE:2013-12-19 - fxt.Wiki().Wdata_wiki_lang_(Bry_.new_a7("fr")); // set wiki to French - fxt.Init_links_add("frwiki", "Test_page", "q1"); // create link for en:Test_page in wikidata - fxt.Init_pages_add(fxt.doc_("q1", fxt.Make_claim_entity(1, 2))); // create wdata page Q1 with prop entity reference to Q2 + fxt.Wiki().Wdata_wiki_lang_(Bry_.new_a7("fr")); // set wiki to French + fxt.Init_links_add("frwiki", "Test_page", "q1"); // create link for en:Test_page in wikidata + fxt.Init_pages_add(fxt.doc_("q1", fxt.Make_claim_entity_qid(1, 2))); // create wdata page Q1 with prop entity reference to Q2 fxt.Init_pages_add(fxt.Wdoc_bldr("q2").Add_label("en", "b").Xto_wdoc()); // create wdata page Q2 with label in en (not fr) - fxt.Test_parse("{{#property:p1}}", "b"); // parse; should get en label + fxt.Test_parse("{{#property:p1}}", "b"); // parse; should get en label } @Test public void Entity_missing() { // PURPOSE: 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 - fxt.Init_links_add("enwiki", "Test_page", "q1"); // create link for en:Test_page in wikidata - fxt.Init_pages_add(fxt.doc_("q1", fxt.Make_claim_entity(1, 2))); // create wdata page Q1 with prop entity reference to Q2; note that Q2 is not created - fxt.Test_parse("{{#property:p1}}", ""); // parse; get "" + fxt.Init_links_add("enwiki", "Test_page", "q1"); // create link for en:Test_page in wikidata + fxt.Init_pages_add(fxt.doc_("q1", fxt.Make_claim_entity_qid(1, 2))); // create wdata page Q1 with prop entity reference to Q2; note that Q2 is not created + fxt.Test_parse("{{#property:p1}}", ""); // parse; get "" } @Test public void Time() { fxt.Init_links_add("enwiki", "Test_page", "q1"); diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java index e0504063e..dd390b60f 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/specials/Wdata_itemByTitle_page_tst.java @@ -61,7 +61,7 @@ class Wdata_itemByTitle_page_fxt { } public void Test_open(String link, String expd) { Xoae_page page = wiki.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); diff --git a/400_xowa/src/gplx/xowa2/apps/Xoav_app.java b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java index b9fef6894..2c242aa27 100644 --- a/400_xowa/src/gplx/xowa2/apps/Xoav_app.java +++ b/400_xowa/src/gplx/xowa2/apps/Xoav_app.java @@ -22,12 +22,13 @@ import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa2.apps.urls.*; import gplx.xowa.files.caches.*; import gplx.xowa.files.imgs.*; import gplx.xowa.bldrs.css.*; import gplx.xowa.html.wtrs.*; import gplx.xowa.users.*; +import gplx.xowa.wikis.*; import gplx.xowa.wmfs.*; import gplx.xowa.urls.encoders.*; public class Xoav_app implements Xoa_app { private Xoa_url_parser url_parser = new Xoa_url_parser(); public Xoav_app(Gfo_usr_dlg usr_dlg, Xoa_app_type app_type, String plat_name, Io_url root_dir, Io_url file_dir, Io_url css_dir) { - Xoa_app_.Usr_dlg_(usr_dlg); this.app_type = app_type; + Xoa_app_.Usr_dlg_(usr_dlg); this.usr_dlg = usr_dlg; this.app_type = app_type; this.fsys_mgr = new Xoa_fsys_mgr(plat_name, root_dir, root_dir.GenSubDir("wiki"), file_dir, css_dir); this.file__cache_mgr = new Xof_cache_mgr(usr_dlg, null, null); this.file__img_mgr = new Xof_img_mgr(); @@ -37,24 +38,24 @@ public class Xoav_app implements Xoa_app { this.html__lnki_bldr = new Xoh_lnki_bldr(this, href_parser); this.user = new Xouv_user("anonymous"); } - public Xou_user User() {return user;} private final Xouv_user user; - public Xoa_app_type App_type() {return app_type;} private final Xoa_app_type app_type; - public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xoa_fsys_mgr fsys_mgr; - public Xof_cache_mgr File__cache_mgr() {return file__cache_mgr;} private final Xof_cache_mgr file__cache_mgr; - public Xof_img_mgr File__img_mgr() {return file__img_mgr;} private final Xof_img_mgr file__img_mgr; - public Io_download_fmt File__download_fmt() {return file__download_fmt;} private final Io_download_fmt file__download_fmt = new Io_download_fmt(); - 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 Xoh_href_parser Html__href_parser() {return href_parser;} private Xoh_href_parser href_parser; - public Xoh_lnki_bldr Html__lnki_bldr() {return html__lnki_bldr;} private final Xoh_lnki_bldr html__lnki_bldr; - public Xoa_css_extractor Html__css_installer() {return html__css_installer;} private final Xoa_css_extractor html__css_installer = new Xoa_css_extractor(); - public boolean Xwiki_mgr__missing(byte[] domain) {return wiki_mgr.Get_by_domain(domain) == null;} + public Xou_user User() {return user;} private final Xouv_user user; + public Xoa_app_type App_type() {return app_type;} private final Xoa_app_type app_type; + public Xoa_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xoa_fsys_mgr fsys_mgr; + public Xoav_wiki_mgr Wiki_mgr() {return wiki_mgr;} private final Xoav_wiki_mgr wiki_mgr; + public Xoa_wiki_mgr Wiki_mgri() {return wiki_mgr;} + public Xof_cache_mgr File__cache_mgr() {return file__cache_mgr;} private final Xof_cache_mgr file__cache_mgr; + public Xof_img_mgr File__img_mgr() {return file__img_mgr;} private final Xof_img_mgr file__img_mgr; + public Io_download_fmt File__download_fmt() {return file__download_fmt;} private final Io_download_fmt file__download_fmt = new Io_download_fmt(); + public Xoh_href_parser Html__href_parser() {return href_parser;} private Xoh_href_parser href_parser; + public Xoh_lnki_bldr Html__lnki_bldr() {return html__lnki_bldr;} private final Xoh_lnki_bldr html__lnki_bldr; + public Xoa_css_extractor Html__css_installer() {return html__css_installer;} private final Xoa_css_extractor html__css_installer = new Xoa_css_extractor(); + public boolean Xwiki_mgr__missing(byte[] domain) {return wiki_mgr.Get_by_domain(domain) == null;} + public Xowmf_mgr Wmf_mgr() {return wmf_mgr;} private final Xowmf_mgr wmf_mgr = new Xowmf_mgr(); + public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v; Xoa_app_.Usr_dlg_(usr_dlg);} private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Noop; + 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 Xoav_wiki_mgr Wiki_mgr() {return wiki_mgr;} private final Xoav_wiki_mgr wiki_mgr; - public Xoud_db_mgr User_data_mgr() {return user_data_mgr;} private Xoud_db_mgr user_data_mgr = new Xoud_db_mgr(); - - public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v;} private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Noop; public Xop_amp_mgr Utl_amp_mgr() {return utl_amp_mgr;} private Xop_amp_mgr utl_amp_mgr = new Xop_amp_mgr(); public Xol_case_mgr Utl_case_mgr() {return utl_case_mgr;} private Xol_case_mgr utl_case_mgr = Xol_case_mgr_.Utf8(); public Url_encoder Utl_encoder_fsys() {return utl_encoder_fsys;} private Url_encoder utl_encoder_fsys = Url_encoder.new_fsys_lnx_(); @@ -62,7 +63,7 @@ public class Xoav_app implements Xoa_app { public Xoav_url_parser Utl_url_parser_xo() {return utl_url_parser_xo;} private Xoav_url_parser utl_url_parser_xo = new Xoav_url_parser(); public Gfo_url_parser Utl_url_parser_gfo() {return utl_url_parser_gfo;} private final Gfo_url_parser utl_url_parser_gfo = new Gfo_url_parser(); - public void Init_by_app() { - user.Init_db(wiki_mgr, fsys_mgr.File_dir()); + public void Init_by_app(Io_url user_db_url) { + user.Init_db(this, wiki_mgr, user_db_url); } } diff --git a/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java b/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java index 4b955fbcb..24e30b66c 100644 --- a/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa2/apps/Xoav_wiki_mgr.java @@ -25,11 +25,11 @@ public class Xoav_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble { public Xowv_wiki Import_by_fil(Io_url fil) { Io_url wiki_dir = fil.OwnerDir(); Xowv_wiki rv = Load(Gen_domain_str(fil.NameOnly()), wiki_dir); - app.User_data_mgr().Site_mgr().Import(rv.Domain_str(), rv.Domain_str(), wiki_dir.Raw(), ""); + app.User().User_db_mgr().Site_mgr().Import(rv.Domain_str(), rv.Domain_str(), wiki_dir.Raw(), ""); return rv; } public void Load_by_user_data() { - Xoud_site_row[] ary = app.User_data_mgr().Site_mgr().Get_all(); + Xoud_site_row[] ary = app.User().User_db_mgr().Site_mgr().Get_all(); int len = ary.length; for (int i = 0; i < len; ++i) { Xoud_site_row itm = ary[i]; diff --git a/400_xowa/src/gplx/xowa2/gui/Xogv_page_load_wkr.java b/400_xowa/src/gplx/xowa2/gui/Xogv_page_load_wkr.java new file mode 100644 index 000000000..ab9489aea --- /dev/null +++ b/400_xowa/src/gplx/xowa2/gui/Xogv_page_load_wkr.java @@ -0,0 +1,49 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa2.gui; import gplx.*; import gplx.xowa2.*; +import gplx.core.threads.*; +import gplx.xowa.*; +import gplx.xowa.gui.history.*; +import gplx.xowa2.apps.*; import gplx.xowa2.wikis.*; +class Xogv_page_load_wkr implements Gfo_thread_wkr, GfoInvkAble { + private final Xoav_wiki_mgr wiki_mgr; private final Gfo_url_parser url_parser; + private final Xogv_tab_base tab; private final Xog_history_itm old_itm, new_itm; + public Xogv_page_load_wkr(Xoav_wiki_mgr wiki_mgr, Gfo_url_parser url_parser, Xogv_tab_base tab, Xog_history_itm old_itm, Xog_history_itm new_itm) { + this.wiki_mgr = wiki_mgr; this.url_parser = url_parser; this.tab = tab; this.old_itm = old_itm; this.new_itm = new_itm; + } + public String Name() {return Thread_name;} public static final String Thread_name = "xowa.page_load"; + public boolean Resume() {return true;} + public void Exec() { + Xog_page new_hpg = Fetch_page(new_itm.Wiki(), new_itm.Page(), new_itm.Qarg()); + tab.Show_page(old_itm, new_itm, new_hpg); + } + private Xog_page Fetch_page(byte[] wiki_domain, byte[] page_bry, byte[] qarg_bry) { + Xowv_wiki wiki = wiki_mgr.Get_by_domain(wiki_domain); + if (wiki == null) return new Xog_page().Exists_n_(); // wiki does not exist; happens with xwiki; PAGE:s.w:Photon; EX:[[wikt:transmit]]; DATE:2015-04-27 + Xoa_ttl ttl = wiki.Ttl_parse(page_bry); + Gfo_url url = url_parser.Parse(Bry_.Add(wiki_domain, Byte_ascii.Slash_bry, page_bry, qarg_bry)); + Xog_page rv = new Xog_page(); + wiki.Pages_get(rv, url, ttl); + return rv; + } + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk_exec)) this.Exec(); + else return GfoInvkAble_.Rv_unhandled; + return this; + } public static final String Invk_exec = "exec"; +} diff --git a/400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.java b/400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.java index 3bacc5a22..2d51e336b 100644 --- a/400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.java +++ b/400_xowa/src/gplx/xowa2/gui/Xogv_tab_base.java @@ -19,11 +19,15 @@ package gplx.xowa2.gui; import gplx.*; import gplx.xowa2.*; import gplx.xowa.*; import gplx.xowa.html.hdumps.core.*; import gplx.xowa.gui.history.*; import gplx.xowa2.apps.*; import gplx.xowa2.wikis.*; import gplx.xowa2.gui.*; import gplx.xowa2.apps.urls.*; +import gplx.core.threads.*; public abstract class Xogv_tab_base { - private Xog_history_stack history_stack = new Xog_history_stack(); private Gfo_url_parser url_parser; + private Gfo_url_parser url_parser; private Xoav_wiki_mgr wiki_mgr; - public void Ctor(Xoav_wiki_mgr wiki_mgr, Gfo_url_parser url_parser) {this.wiki_mgr = wiki_mgr; this.url_parser = url_parser;} - public Xog_history_itm Cur_itm() {return history_stack.Cur_itm();} + private Gfo_thread_pool thread_pool; + public void Ctor(Xoav_wiki_mgr wiki_mgr, Gfo_thread_pool thread_pool, Gfo_url_parser url_parser) {this.wiki_mgr = wiki_mgr; this.thread_pool = thread_pool; this.url_parser = url_parser;} + public Xog_history_stack History_stack() {return history_stack;} private final Xog_history_stack history_stack = new Xog_history_stack(); + public Xog_history_itm Cur_itm() {return history_stack.Cur_itm();} + public Xow_wiki Get_wiki_or_null(byte[] key) {return wiki_mgr.Get_by_domain(key);} public Xog_page Go_to(byte[] page) {return Go_to(history_stack.Cur_itm().Wiki(), page, Bry_.Empty, Bry_.Empty, false, "");} public Xog_page Go_to(byte[] wiki, byte[] page) {return Go_to(wiki, page, Bry_.Empty, Bry_.Empty, false, "");} public Xog_page Go_to(byte[] wiki, byte[] page, byte[] anch, byte[] qarg, boolean redirect_force, String bmk_pos) { @@ -36,6 +40,7 @@ public abstract class Xogv_tab_base { } public Xog_page Go_bwd() {return Go_by_dir(Bool_.Y);} public Xog_page Go_fwd() {return Go_by_dir(Bool_.N);} + public Xog_page Reload() {return Fetch_page_and_show(Cur_itm(), Cur_itm());} private Xog_page Go_by_dir(boolean bwd) { Xog_history_itm old_itm = this.Cur_itm(); Xog_history_itm new_itm = bwd ? history_stack.Go_bwd() : history_stack.Go_fwd(); @@ -43,21 +48,15 @@ public abstract class Xogv_tab_base { } private Xog_page Fetch_page_and_show(Xog_history_itm old_itm, Xog_history_itm new_itm) { if (new_itm == Xog_history_itm.Null) return new Xog_page().Exists_n_(); - Xog_page new_hpg = Fetch_page(new_itm.Wiki(), new_itm.Page(), new_itm.Qarg()); - if (new_hpg.Exists()) - Show_page(old_itm, new_itm, new_hpg); + Fetch_page__bgn(new_itm.Wiki(), new_itm.Page(), new_itm.Qarg()); + Xog_page new_hpg = new Xog_page(); + // Thread_adp_.invk_(Xogv_page_load_wkr.Thread_name, new Xogv_page_load_wkr(wiki_mgr, url_parser, this, old_itm, new_itm), Xogv_page_load_wkr.Invk_exec).Start(); + thread_pool.Add_at_end(new Xogv_page_load_wkr(wiki_mgr, url_parser, this, old_itm, new_itm)); + thread_pool.Run(); return new_hpg; } - private Xog_page Fetch_page(byte[] wiki_domain, byte[] page_bry, byte[] qarg_bry) { - Xowv_wiki wiki = wiki_mgr.Get_by_domain(wiki_domain); - if (wiki == null) return new Xog_page().Exists_n_(); // wiki does not exist; happens with xwiki; PAGE:s.w:Photon; EX:[[wikt:transmit]]; DATE:2015-04-27 - Xoa_ttl ttl = wiki.Ttl_parse(page_bry); - Gfo_url url = url_parser.Parse(Bry_.Add(wiki_domain, Byte_ascii.Slash_bry, page_bry, qarg_bry)); - Xog_page rv = new Xog_page(); - wiki.Pages_get(rv, url, ttl); - return rv; - } + @gplx.Virtual protected void Fetch_page__bgn(byte[] wiki_domain, byte[] page_bry, byte[] qarg_bry) {} public void Srl_save(Bry_bfr bfr) {history_stack.Srl_save(bfr);} public void Srl_load(byte[] raw) {history_stack.Srl_load(raw);} - protected abstract void Show_page(Xog_history_itm old_itm, Xog_history_itm new_itm, Xog_page new_hpg); + public abstract void Show_page(Xog_history_itm old_itm, Xog_history_itm new_itm, Xog_page new_hpg); } diff --git a/400_xowa/src/gplx/xowa2/users/Xouv_cfg_keys.java b/400_xowa/src/gplx/xowa2/users/Xouv_cfg_keys.java index 57fb9c068..da9d31761 100644 --- a/400_xowa/src/gplx/xowa2/users/Xouv_cfg_keys.java +++ b/400_xowa/src/gplx/xowa2/users/Xouv_cfg_keys.java @@ -19,5 +19,6 @@ package gplx.xowa2.users; import gplx.*; import gplx.xowa2.*; public class Xouv_cfg_keys { public static final String Key_history_stack = "xowa.gui.history_stack" + , Key_history_idx = "xowa.gui.history.idx" ; } diff --git a/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java index 19e2fb7de..01ac47228 100644 --- a/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java +++ b/400_xowa/src/gplx/xowa2/wikis/Xowv_wiki.java @@ -52,6 +52,7 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser { public Xowd_db_mgr Data_mgr__core_mgr() {return data_mgr__core_mgr;} private Xowd_db_mgr data_mgr__core_mgr; public Xow_repo_mgr File__repo_mgr() {return file_mgr__repo_mgr;} private Xowv_repo_mgr file_mgr__repo_mgr = new Xowv_repo_mgr(); public Xof_fsdb_mode File__fsdb_mode() {return file_mgr__fsdb_mode;} private final Xof_fsdb_mode file_mgr__fsdb_mode = Xof_fsdb_mode.new_v2_gui(); + public Fsdb_db_mgr File__fsdb_core() {return db_core_mgr;} public Xof_orig_mgr File__orig_mgr() {return orig_mgr;} private final Xof_orig_mgr orig_mgr = new Xof_orig_mgr(); public Xof_bin_mgr File__bin_mgr() {return fsdb_mgr.Bin_mgr();} public Fsm_mnt_mgr File__mnt_mgr() {return fsdb_mgr.Mnt_mgr();} diff --git a/400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java b/400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java index e594ea02b..a6c3c4afc 100644 --- a/400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java +++ b/400_xowa/src/gplx/xowa2/wikis/specials/Xosp_special_mgr.java @@ -17,14 +17,36 @@ along with this program. If not, see . */ package gplx.xowa2.wikis.specials; import gplx.*; import gplx.xowa2.*; import gplx.xowa2.wikis.*; import gplx.xowa.*; import gplx.xowa2.gui.*; -import gplx.xowa.specials.xowa.file_browsers.*; +import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.file_browsers.*; public class Xosp_special_mgr { private final Xowv_wiki wiki; - public Xosp_special_mgr(Xowv_wiki wiki) {this.wiki = wiki;} + private final Hash_adp_bry hash; + public Xosp_special_mgr(Xowv_wiki wiki) { + this.wiki = wiki; +// this.hash = Hash_adp_bry.ci_utf8_(wiki.Lang().Case_mgr()); + this.hash = Hash_adp_bry.cs_(); + } public void Get_by_ttl(Xog_page rv, Gfo_url url, Xoa_ttl ttl) { Xosp_fbrow_rslt rslt = Xosp_fbrow_special.Gen(url.Args(), wiki.Appv().Wiki_mgr()); rv.Init(wiki, -1, null, ttl); rv.Page_body_(rslt.Html_body()); rv.Html_head_xtn_(rslt.Html_head()); } + public void Get_by_url(Xow_wiki wiki, Xoa_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 + Object o = hash.Get_by_bry(special_name); + if (o == null) { + gplx.xowa.Xol_specials_itm special_itm = wiki.Lang().Specials_mgr().Get_by_alias(special_name); + if (special_itm != null) + o = hash.Get_by_bry(special_itm.Special()); + } + if (o != null) { + // Xows_page special = (Xows_page)o; + // page.Revision_data().Modified_on_(DateAdp_.Now()); + // special.Special_gen(wiki, page, url, ttl); + } + } } diff --git a/400_xowa/src_040_io/gplx/ios/Io_buffer_rdr.java b/400_xowa/src_040_io/gplx/ios/Io_buffer_rdr.java index e4b5c544a..b6168e4b2 100644 --- a/400_xowa/src_040_io/gplx/ios/Io_buffer_rdr.java +++ b/400_xowa/src_040_io/gplx/ios/Io_buffer_rdr.java @@ -17,16 +17,18 @@ along with this program. If not, see . */ package gplx.ios; import gplx.*; import gplx.ios.*;/*IoStream*/ -public class Io_buffer_rdr implements RlsAble { //_20120115 +public class Io_buffer_rdr implements RlsAble { + private Io_stream_rdr rdr; Io_buffer_rdr(Io_stream_rdr rdr, Io_url url, int bfr_len) { + this.rdr = rdr; this.url = url; if (bfr_len <= 0) throw Err_.new_("bfr_len must be > 0").Add("bfr_len", bfr_len); bfr = new byte[bfr_len]; this.bfr_len = bfr_len; - this.rdr = rdr; IoItmFil fil = Io_mgr.I.QueryFil(url); if (!fil.Exists()) throw Err_.new_("fil does not exist").Add("url", url); fil_len = fil.Size(); fil_pos = 0; fil_eof = false; - } Io_stream_rdr rdr; + } + public Io_url Url() {return url;} private Io_url url; public byte[] Bfr() {return bfr;} private byte[] bfr; public int Bfr_len() {return bfr_len;} private int bfr_len; public long Fil_len() {return fil_len;} long fil_len; @@ -39,7 +41,7 @@ public class Io_buffer_rdr implements RlsAble { //_20120115 bfr[i - bfr_pos] = bfr[i]; return Bfr_load(bfr_len - bfr_pos, bfr_pos); // fill rest of bfr; EX: [2]... will come from file } - boolean Bfr_load(int bgn, int len) { + private boolean Bfr_load(int bgn, int len) { int read = rdr.Read(bfr, bgn, len); if (read == gplx.ios.Io_stream_rdr_.Read_done) {fil_eof = true; return false;} fil_pos += read; @@ -57,15 +59,15 @@ public class Io_buffer_rdr implements RlsAble { //_20120115 bfr_len = -1; if (rdr != null) rdr.Rls(); } - @gplx.Internal protected void DumpToFil(int bgn, int len, String urlStr, String msg) { + @gplx.Internal protected void Dump_to_file(int bgn, int len, String url_str, String msg) { // DBG: String text = String_.new_u8_by_len(bfr, bgn, len); - Io_mgr.I.AppendFilStr(Io_url_.new_any_(urlStr), msg + text + "\n"); + Io_mgr.I.AppendFilStr(Io_url_.new_any_(url_str), msg + text + "\n"); } public static Io_buffer_rdr new_(Io_stream_rdr rdr, int bfr_len) { Io_buffer_rdr rv = new Io_buffer_rdr(rdr, rdr.Url(), bfr_len); rdr.Open(); rv.Bfr_load(0, bfr_len); return rv; - } Io_buffer_rdr() {} - public static final Io_buffer_rdr Null = new Io_buffer_rdr(); + } + public static final Io_buffer_rdr Null = new Io_buffer_rdr(); Io_buffer_rdr() {} } diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java index 481b5ce27..386935c50 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java @@ -17,28 +17,30 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.core.primitives.*; -import gplx.xowa.wikis.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; -import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.fsdb.meta.*; +import gplx.xowa.wikis.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.xwikis.*; +import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.fsdb.meta.*; import gplx.fsdb.*; import gplx.xowa.html.*; import gplx.xowa.html.wtrs.*; import gplx.xowa.html.hzips.*; import gplx.xowa.html.hdumps.*; public interface Xow_wiki extends Xow_ttl_parser { boolean Type_is_edit(); + Xoa_app App(); + Xol_lang Lang(); byte[] Domain_bry(); // EX: en.wikipedia.org String Domain_str(); int Domain_tid(); // Xow_domain_type_.Tid_wikipedia byte[] Domain_abrv(); // enwiki Xow_domain Domain_itm(); Xow_fsys_mgr Fsys_mgr(); - Xoa_app App(); - Xol_lang Lang(); + Xowd_db_mgr Data_mgr__core_mgr(); Xof_fsdb_mode File__fsdb_mode(); + Fsdb_db_mgr File__fsdb_core(); Xow_repo_mgr File__repo_mgr(); Xof_orig_mgr File__orig_mgr(); Xof_bin_mgr File__bin_mgr(); Fsm_mnt_mgr File__mnt_mgr(); - Xowd_db_mgr Data_mgr__core_mgr(); boolean Html__hdump_enabled(); Xow_hzip_mgr Html__hzip_mgr(); Xohd_hdump_rdr Html__hdump_rdr(); Xoh_page_wtr_mgr_base Html__page_wtr_mgr(); + Xow_xwiki_mgr Xwiki_mgr(); void Init_by_wiki(); } diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java index 6655aba2d..07c6e8f28 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xowe_wiki.java @@ -35,7 +35,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { domain_tid = domain_itm.Domain_tid(); domain_abrv = Xow_wiki_alias.Build_alias(Xow_domain_.parse(domain_bry)); fsys_mgr = new Xow_fsys_mgr(wiki_dir, app.Fsys_mgr().File_dir().GenSubDir(domain_str)); - xwiki_mgr = new Xow_xwiki_mgr(this, app.Url_parser().Url_parser()); + xwiki_mgr = new Xow_xwiki_mgr(this, app.Utl__url_parser().Url_parser()); xwiki_mgr.Add_full(domain_bry, domain_bry); // add full name to xwiki_mgr; needed for lookup in home ns; EX: [[en.wikipedia.org:Earth]] html_mgr = new Xow_html_mgr(this); this.html_mgr__hdump_rdr = new Xohd_hdump_rdr(app, this); @@ -77,56 +77,55 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble { maint_mgr = new Xow_maint_mgr(this); cache_mgr = new Xow_cache_mgr(this); } - public boolean Type_is_edit() {return Bool_.Y;} - public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; - public String Domain_str() {return domain_str;} private final String domain_str; - public int Domain_tid() {return domain_tid;} private final int domain_tid; - public byte[] Domain_abrv() {return domain_abrv;} private final byte[] domain_abrv; - public Xow_domain Domain_itm() {return domain_itm;} private final Xow_domain domain_itm; - public Xoa_app App() {return app;} - public Xol_lang Lang() {return lang;} private final Xol_lang lang; - public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr; - public Xow_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xow_fsys_mgr fsys_mgr; - public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse_(this, ttl);} - public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) {return Xoa_ttl.parse_(this, ns_id, ttl);} - public Xowd_db_mgr Data_mgr__core_mgr() {return db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? null : this.Db_mgr_as_sql().Core_data_mgr();} // TEST: - public Xow_repo_mgr File__repo_mgr() {return file_mgr.Repo_mgr();} - public Xof_orig_mgr File__orig_mgr() {return file_mgr.Orig_mgr();} - public Xof_bin_mgr File__bin_mgr() {return file_mgr.Fsdb_mgr().Bin_mgr();} - public Fsm_mnt_mgr File__mnt_mgr() {return file_mgr.Fsdb_mgr().Mnt_mgr();} - public Xof_fsdb_mode File__fsdb_mode() {return file_mgr.Fsdb_mode();} - public Fsdb_db_mgr File__file_db_core() {return file_mgr.Db_core();} + public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr; + public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse_(this, ttl);} + public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) {return Xoa_ttl.parse_(this, ns_id, ttl);} + public boolean Type_is_edit() {return Bool_.Y;} + public Xoa_app App() {return app;} + public Xol_lang Lang() {return lang;} private final Xol_lang lang; + public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; + public String Domain_str() {return domain_str;} private final String domain_str; + public int Domain_tid() {return domain_tid;} private final int domain_tid; + public byte[] Domain_abrv() {return domain_abrv;} private final byte[] domain_abrv; + public Xow_domain Domain_itm() {return domain_itm;} private final Xow_domain domain_itm; + public Xow_fsys_mgr Fsys_mgr() {return fsys_mgr;} private final Xow_fsys_mgr fsys_mgr; + public Xowd_db_mgr Data_mgr__core_mgr() {return db_mgr.Tid() == Xodb_mgr_txt.Tid_txt ? null : this.Db_mgr_as_sql().Core_data_mgr();} // TEST: + public Xof_fsdb_mode File__fsdb_mode() {return file_mgr.Fsdb_mode();} + public Fsdb_db_mgr File__fsdb_core() {return file_mgr.Db_core();} + public Xow_repo_mgr File__repo_mgr() {return file_mgr.Repo_mgr();} + public Xof_orig_mgr File__orig_mgr() {return file_mgr.Orig_mgr();} + public Xof_bin_mgr File__bin_mgr() {return file_mgr.Fsdb_mgr().Bin_mgr();} + public Fsm_mnt_mgr File__mnt_mgr() {return file_mgr.Fsdb_mgr().Mnt_mgr();} + public boolean Html__hdump_enabled() {return html_mgr__hdump_enabled;} private boolean html_mgr__hdump_enabled = Bool_.N; + public Xow_hzip_mgr Html__hzip_mgr() {return html_mgr.Hzip_mgr();} + public Xohd_hdump_rdr Html__hdump_rdr() {return html_mgr__hdump_rdr;} private final Xohd_hdump_rdr html_mgr__hdump_rdr; + public Xoh_page_wtr_mgr_base Html__page_wtr_mgr() {return html_mgr.Page_wtr_mgr();} + public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private final Xow_xwiki_mgr xwiki_mgr; - public boolean Html__hdump_enabled() {return html_mgr__hdump_enabled;} private boolean html_mgr__hdump_enabled = Bool_.N; - public Xow_hzip_mgr Html__hzip_mgr() {return html_mgr.Hzip_mgr();} - public Xohd_hdump_rdr Html__hdump_rdr() {return html_mgr__hdump_rdr;} private final Xohd_hdump_rdr html_mgr__hdump_rdr; - public Xohd_hdump_wtr Html__hdump_wtr() {return html_mgr__hdump_wtr;} private final Xohd_hdump_wtr html_mgr__hdump_wtr; - public Xoh_page_wtr_mgr_base Html__page_wtr_mgr() {return html_mgr.Page_wtr_mgr();} + public Xohd_hdump_wtr Html__hdump_wtr() {return html_mgr__hdump_wtr;} private final Xohd_hdump_wtr html_mgr__hdump_wtr; + public int Xwiki_domain_tid() {return xwiki_domain_tid;} private int xwiki_domain_tid; + public Xoae_app Appe() {return app;} private Xoae_app app; + public Xow_utl_mgr Utl_mgr() {return utl_mgr;} private Xow_utl_mgr utl_mgr; + public Xow_gui_mgr Gui_mgr() {return gui_mgr;} private Xow_gui_mgr gui_mgr = new Xow_gui_mgr(); + public Xow_user User() {return user;} private Xow_user user = new Xow_user(); + public Xow_data_mgr Data_mgr() {return data_mgr;} private Xow_data_mgr data_mgr; + public Xodb_mgr Db_mgr() {return db_mgr;} private Xodb_mgr db_mgr; + public Xodb_mgr_sql Db_mgr_as_sql() {return (Xodb_mgr_sql)db_mgr;} + public Xows_mgr Special_mgr() {return special_mgr;} private Xows_mgr special_mgr; + public Xow_html_mgr Html_mgr() {return html_mgr;} private Xow_html_mgr html_mgr; + public Xow_xtn_mgr Xtn_mgr() {return xtn_mgr;} private Xow_xtn_mgr xtn_mgr; + public Xow_cache_mgr Cache_mgr() {return cache_mgr;} private Xow_cache_mgr cache_mgr; + public Xow_page_mgr Page_mgr() {return page_mgr;} private Xow_page_mgr page_mgr = new Xow_page_mgr(); - public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private final Xow_xwiki_mgr xwiki_mgr; - public int Xwiki_domain_tid() {return xwiki_domain_tid;} private int xwiki_domain_tid; - public Xoae_app Appe() {return app;} private Xoae_app app; - public Xow_utl_mgr Utl_mgr() {return utl_mgr;} private Xow_utl_mgr utl_mgr; - public Xow_gui_mgr Gui_mgr() {return gui_mgr;} private Xow_gui_mgr gui_mgr = new Xow_gui_mgr(); - public Xow_user User() {return user;} private Xow_user user = new Xow_user(); - public Xow_data_mgr Data_mgr() {return data_mgr;} private Xow_data_mgr data_mgr; - public Xodb_mgr Db_mgr() {return db_mgr;} private Xodb_mgr db_mgr; - public Xodb_mgr_sql Db_mgr_as_sql() {return (Xodb_mgr_sql)db_mgr;} - public Xows_mgr Special_mgr() {return special_mgr;} private Xows_mgr special_mgr; - public Xow_html_mgr Html_mgr() {return html_mgr;} private Xow_html_mgr html_mgr; - public Xow_xtn_mgr Xtn_mgr() {return xtn_mgr;} private Xow_xtn_mgr xtn_mgr; - public Xow_cache_mgr Cache_mgr() {return cache_mgr;} private Xow_cache_mgr cache_mgr; - public Xow_page_mgr Page_mgr() {return page_mgr;} private Xow_page_mgr page_mgr = new Xow_page_mgr(); - - public byte[] Commons_wiki_key() {return commons_wiki_key;} private byte[] commons_wiki_key = Xow_domain_.Domain_bry_commons; - public Xob_hive_mgr Hive_mgr() {return hive_mgr;} private Xob_hive_mgr hive_mgr; - public Xow_msg_mgr Msg_mgr() {return msg_mgr;} private Xow_msg_mgr msg_mgr; - public Xow_fragment_mgr Fragment_mgr() {return fragment_mgr;} private Xow_fragment_mgr fragment_mgr; - public Bfmtr_eval_wiki Eval_mgr() {return eval_mgr;} private Bfmtr_eval_wiki eval_mgr; - public Bry_bfr_mkr Utl__bfr_mkr() {return app.Utl__bfr_mkr();} - public byte[] Wdata_wiki_lang() {return wdata_wiki_lang;} private byte[] wdata_wiki_lang; - public void Wdata_wiki_lang_(byte[] v) {this.wdata_wiki_lang = v; Wdata_wiki_abrv_();} // TEST: - public byte[] Wdata_wiki_abrv() {return wdata_wiki_abrv;} private byte[] wdata_wiki_abrv; private int wdata_wiki_tid; + public byte[] Commons_wiki_key() {return commons_wiki_key;} private byte[] commons_wiki_key = Xow_domain_.Domain_bry_commons; + public Xob_hive_mgr Hive_mgr() {return hive_mgr;} private Xob_hive_mgr hive_mgr; + public Xow_msg_mgr Msg_mgr() {return msg_mgr;} private Xow_msg_mgr msg_mgr; + public Xow_fragment_mgr Fragment_mgr() {return fragment_mgr;} private Xow_fragment_mgr fragment_mgr; + public Bfmtr_eval_wiki Eval_mgr() {return eval_mgr;} private Bfmtr_eval_wiki eval_mgr; + public Bry_bfr_mkr Utl__bfr_mkr() {return app.Utl__bfr_mkr();} + public byte[] Wdata_wiki_lang() {return wdata_wiki_lang;} private byte[] wdata_wiki_lang; + public void Wdata_wiki_lang_(byte[] v) {this.wdata_wiki_lang = v; Wdata_wiki_abrv_();} // TEST: + public byte[] Wdata_wiki_abrv() {return wdata_wiki_abrv;} private byte[] wdata_wiki_abrv; private int wdata_wiki_tid; private void Wdata_wiki_abrv_() { Bry_bfr bfr = app.Utl__bfr_mkr().Get_b128(); Xow_wiki_alias.Build_alias_by_lang_tid(bfr, wdata_wiki_lang, Int_obj_ref.new_(wdata_wiki_tid)); diff --git a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java index 7a53c2638..cf6108b2e 100644 --- a/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java +++ b/400_xowa/src_121_wiki_data/gplx/xowa/Xow_data_mgr.java @@ -25,8 +25,8 @@ public class Xow_data_mgr implements GfoInvkAble { public Xow_data_mgr(Xowe_wiki wiki) {this.wiki = wiki; this.redirect_mgr = wiki.Redirect_mgr();} public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; public boolean Version_is_1() {return Bool_.Y;} - public Xoae_page Get_page(Xoa_ttl ttl, boolean called_from_tmpl) {wiki.Appe().Url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, called_from_tmpl, false);} - public Xoae_page Get_page_from_msg(Xoa_ttl ttl) {wiki.Appe().Url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, false, true);} + public Xoae_page Get_page(Xoa_ttl ttl, boolean called_from_tmpl) {wiki.Appe().Utl__url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, called_from_tmpl, false);} + public Xoae_page Get_page_from_msg(Xoa_ttl ttl) {wiki.Appe().Utl__url_parser().Parse(tmp_url, ttl.Raw()); return Get_page(tmp_url, ttl, false, true);} public Xoae_page Get_page(Xoa_url url, Xoa_ttl ttl, boolean called_from_tmpl, boolean called_from_msg) { Xoae_page rv = Xoae_page.new_(wiki, ttl); return Get_page(rv, url, ttl, called_from_tmpl, called_from_msg); diff --git a/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java b/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java index 11a60853c..12c0a8a79 100644 --- a/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java +++ b/400_xowa/src_300_html/gplx/xowa/Xop_link_parser.java @@ -24,7 +24,7 @@ public class Xop_link_parser { public byte[] Parse(Bry_bfr tmp_bfr, Xoa_url tmp_url, Xowe_wiki wiki, byte[] raw, byte[] or) { html_xowa_ttl = null; html_anchor_cls = Xoh_lnki_consts.Tid_a_cls_image; html_anchor_rel = Xoh_lnki_consts.Tid_a_rel_none; // default member variables for html Xoae_app app = wiki.Appe(); int raw_len = raw.length; - app.Url_parser().Parse(tmp_url, raw); + app.Utl__url_parser().Parse(tmp_url, raw); switch (tmp_url.Protocol_tid()) { case Xoo_protocol_itm.Tid_http: case Xoo_protocol_itm.Tid_https: // "http:" or "https:"; check if to offline wiki and redirect byte[] wiki_bry = tmp_url.Wiki_bry(), page_bry = tmp_url.Page_bry(); diff --git a/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java b/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java index ce25b67c2..f661301e3 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoa_url_parser.java @@ -136,12 +136,12 @@ public class Xoa_url_parser { return Parse_url(Xoa_url.blank_(), app, cur_wiki, raw_bry, 0, raw_bry.length, false); } public static Xoa_url Parse_url(Xoae_app app, Xowe_wiki cur_wiki, byte[] raw, int bgn, int end, boolean from_url_bar) {return Parse_url(Xoa_url.blank_(), app, cur_wiki, raw, bgn, end, from_url_bar);} - public static Xoa_url Parse_url(Xoa_url rv, Xoae_app app, Xowe_wiki cur_wiki, byte[] raw, int bgn, int end, boolean from_url_bar) { + public static Xoa_url Parse_url(Xoa_url rv, Xoae_app app, Xow_wiki cur_wiki, byte[] raw, int bgn, int end, boolean from_url_bar) { Xowe_wiki wiki = null; Bry_bfr_mkr bfr_mkr = app.Utl__bfr_mkr(); byte[] cur_wiki_key = cur_wiki.Domain_bry(); byte[] page_bry = Bry_.Empty; boolean page_is_main_page = false; - if (app.Url_parser().Parse(rv, raw, bgn, end)) { // parse passed; url has protocol; take Page; EX: "http://en.wikipedia.org/wiki/Earth" + if (app.Utl__url_parser().Parse(rv, raw, bgn, end)) { // parse passed; url has protocol; take Page; EX: "http://en.wikipedia.org/wiki/Earth" wiki = Parse_url__wiki(app, rv.Wiki_bry()); if (rv.Segs_ary().length == 0 && rv.Page_bry() != null && Bry_.Eq(rv.Page_bry(), Xoa_url_parser.Bry_wiki_name)) // wiki, but directly after site; EX:en.wikipedia.org/wiki page_is_main_page = true; @@ -214,7 +214,7 @@ public class Xoa_url_parser { byte[] anchor_bry = Xoa_app_.Utl__encoder_mgr().Id().Encode(rv.Anchor_bry()); // reencode for anchors (which use . encoding, not % encoding); PAGE:en.w:Enlightenment_Spain#Enlightened_despotism_.281759%E2%80%931788.29 rv.Anchor_bry_(anchor_bry); } - Xoa_ttl ttl = Xoa_ttl.parse_(wiki, page_bry); + Xoa_ttl ttl = wiki.Ttl_parse(page_bry); if (ttl != null) { // can still be empty; EX: "en.wikipedia.org" Xow_xwiki_itm lang_xwiki = ttl.Wik_itm(); if (lang_xwiki != null && lang_xwiki.Type_is_xwiki_lang(wiki.Lang().Lang_id())) { // format of http://en.wikipedia.org/wiki/fr:A @@ -267,7 +267,7 @@ public class Xoa_url_parser { } private static byte[] Parse_from_url_bar__strip_mobile(byte[] v) {// DATE:2014-05-03 int pos = Bry_finder.Find_fwd(v, Byte_ascii.Dot); - if ( pos == Bry_finder.Not_found // no dot; EX: "A" + if ( pos == Bry_finder.Not_found // no dot; EX: "A" || pos + 2 >= v.length // not enough space for .m.; EX: "A.b" ) return v; @@ -285,7 +285,7 @@ public class Xoa_url_parser { private static final byte Id_arg_redirect = 0, Id_arg_uselang = 1, Id_arg_title = 2, Id_arg_action = 3, Id_arg_fulltext = 4, Id_arg_xowa_vnt = 5; private static final byte[] Bry_arg_redirect = Bry_.new_a7("redirect"), Bry_arg_uselang = Bry_.new_a7("uselang"), Bry_arg_title = Bry_.new_a7("title"), Bry_arg_fulltext = Bry_.new_a7("fulltext"); private static final byte[] Bry_upload_wikimedia_org = Bry_.new_a7("upload.wikimedia.org"), Bry_dot_org = Bry_.new_a7(".org") - , Bry_file = Bry_.new_a7("File:"); // NOTE: File does not need i18n; is a canonical namespace + , Bry_file = Bry_.new_a7("File:"); // NOTE: File does not need i18n; is a canonical namespace public static final byte[] Bry_wiki_name = Bry_.new_a7("wiki"); private static final byte[][] Bry_wiki_name_bry = new byte[][] {Bry_wiki_name}; public static final byte[] Bry_arg_action_eq_edit = Bry_.new_a7("action=edit") diff --git a/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser_tst.java b/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser_tst.java index 9b5a5ca71..3cd191d66 100644 --- a/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser_tst.java +++ b/400_xowa/src_310_url/gplx/xowa/Xoh_href_parser_tst.java @@ -200,7 +200,7 @@ class Xoh_href_parser_fxt { wiki = Xoa_app_fxt.wiki_tst_(app); wiki.Xwiki_mgr().Add_bulk(Bry_.new_a7("wikt|en.wiktionary.org")); app.Usere().Wiki().Xwiki_mgr().Add_bulk(Bry_.new_a7("en.wiktionary.org|en.wiktionary.org")); - href_parser = new Xoh_href_parser(Xoa_app_.Utl__encoder_mgr().Href(), app.Url_parser().Url_parser()); + href_parser = new Xoh_href_parser(Xoa_app_.Utl__encoder_mgr().Href(), app.Utl__url_parser().Url_parser()); } public Xoae_app App() {return app;} private Xoae_app app; public Xoh_href_parser_fxt Init_xwiki_alias(String alias, String domain) { diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_whitelist_mgr.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_whitelist_mgr.java index 3906192b8..0f62d7201 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_whitelist_mgr.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xatr_whitelist_mgr.java @@ -119,6 +119,7 @@ public class Xop_xatr_whitelist_mgr { Ini_nde(Xop_xnde_tag_.Tid_bdi , "common"); Ini_nde(Xop_xnde_tag_.Tid_data , "common", "value"); Ini_nde(Xop_xnde_tag_.Tid_mark , "common"); + Ini_nde(Xop_xnde_tag_.Tid_q , "common"); Ini_all_loose("data"); return this; } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java index 3b04216ca..1cad72d84 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_tag_.java @@ -136,8 +136,9 @@ public class Xop_xnde_tag_ { , Tid_xowa_tag_end = 110 , Tid_quiz = 111 , Tid_indicator = 112 +, Tid_q = 113 ; - public static final int _MaxLen = 113; + public static final int _MaxLen = 114; public static final Xop_xnde_tag[] Ary = new Xop_xnde_tag[_MaxLen]; private static Xop_xnde_tag new_(int id, String name) { Xop_xnde_tag rv = new Xop_xnde_tag(id, name); @@ -258,5 +259,6 @@ public class Xop_xnde_tag_ { , Tag_xowa_tag_end = new_(Tid_xowa_tag_end, "xtag_end").Xtn_() , Tag_quiz = new_(Tid_quiz, "quiz").Xtn_() , Tag_indicator = new_(Tid_indicator, "indicator").Xtn_() +, Tag_q = new_(Tid_q, "q") ; } diff --git a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__basic_tst.java b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__basic_tst.java index a4dd78934..9794951bb 100644 --- a/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__basic_tst.java +++ b/400_xowa/src_490_xnde/gplx/xowa/Xop_xnde_wkr__basic_tst.java @@ -152,4 +152,7 @@ public class Xop_xnde_wkr__basic_tst { fxt.Test_parse_page_all_str("{{test}}", "
{{a}}
"); fxt.Init_defn_clear(); } + @Test public void Quote() {// PURPOSE: handle element; DATE:2015-05-29 + fxt.Test_parse_page_wiki_str("a", "a"); + } } diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa index 09be724b2..645c81a0e 100644 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa differ