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
+ ( ""
+ , " "
+ , " Wiki | "
+ , " Page | "
+ , " Anchor | "
+ , " Qargs | "
+ , " | "
+ , "
~{rows}"
+ , "
"
+ ), "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