v3.3.4 v3.4.2.1
gnosygnu 8 years ago
parent b2a06b8125
commit 14471ca656

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx;
import gplx.core.brys.*;
public class Bry_split_ {
private static final Object thread_lock = new Object();
private static final Object thread_lock = new Object();
public static byte[][] Split(byte[] src, byte dlm) {return Split(src, dlm, false);}
public static byte[][] Split(byte[] src, byte dlm, boolean trim) {
synchronized (thread_lock) {
@ -70,19 +70,22 @@ public class Bry_split_ {
}
return count;
}
public static byte[][] Split(byte[] src, byte[] dlm) {
if (Bry_.Len_eq_0(src)) return Bry_.Ary_empty;
int cur_pos = 0, src_len = src.length, dlm_len = dlm.length;
public static byte[][] Split(byte[] src, byte[] dlm) {return Split(src, 0, src.length, dlm);}
public static byte[][] Split(byte[] src, int src_bgn, int src_end, byte[] dlm) {
if (src == null) return Bry_.Ary_empty;
int src_len = src.length;
if (src_len == 0) return Bry_.Ary_empty;
int cur_pos = src_bgn, dlm_len = dlm.length;
List_adp rv = List_adp_.new_();
while (true) {
int find_pos = Bry_find_.Find_fwd(src, dlm, cur_pos);
if (find_pos == Bry_find_.Not_found) {
if (cur_pos == src_len) break; // dlm is last sequence in src; do not create empty itm
find_pos = src_len;
if (cur_pos >= src_end) break; // dlm is last sequence in src; do not create empty itm
find_pos = src_end;
}
rv.Add(Bry_.Mid(src, cur_pos, find_pos));
if (find_pos == src_len) break;
cur_pos = find_pos + dlm_len;
if (cur_pos >= src_end) break;
}
return (byte[][])rv.To_ary(byte[].class);
}
@ -115,7 +118,7 @@ public class Bry_split_ {
public static final int Rv__ok = 0, Rv__extend = 1, Rv__cancel = 2;
}
class Bry_split_wkr__to_ary implements gplx.core.brys.Bry_split_wkr {
private final List_adp list = List_adp_.new_();
private final List_adp list = List_adp_.new_();
public int Split(byte[] src, int itm_bgn, int itm_end) {
synchronized (list) {
byte[] bry = itm_end == itm_bgn ? Bry_.Empty : Bry_.Mid(src, itm_bgn, itm_end);
@ -128,5 +131,5 @@ class Bry_split_wkr__to_ary implements gplx.core.brys.Bry_split_wkr {
return (byte[][])list.To_ary_and_clear(byte[].class);
}
}
public static final Bry_split_wkr__to_ary Instance = new Bry_split_wkr__to_ary(); Bry_split_wkr__to_ary() {}
public static final Bry_split_wkr__to_ary Instance = new Bry_split_wkr__to_ary(); Bry_split_wkr__to_ary() {}
}

@ -18,39 +18,46 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx;
import org.junit.*;
public class Bry_split__tst {
private final Bry_split__fxt fxt = new Bry_split__fxt();
private final Bry_split__fxt fxt = new Bry_split__fxt();
@Test public void Split() {
fxt.Test_Split("a" , Byte_ascii.Pipe, Bool_.N, "a"); // no trim
fxt.Test_Split("a|" , Byte_ascii.Pipe, Bool_.N, "a");
fxt.Test_Split("|a" , Byte_ascii.Pipe, Bool_.N, "", "a");
fxt.Test_Split("|" , Byte_ascii.Pipe, Bool_.N, "");
fxt.Test_Split("" , Byte_ascii.Pipe, Bool_.N);
fxt.Test_Split("a|b|c" , Byte_ascii.Pipe, Bool_.N, "a", "b", "c");
fxt.Test_Split(" a " , Byte_ascii.Pipe, Bool_.Y, "a"); // trim
fxt.Test_Split(" a |" , Byte_ascii.Pipe, Bool_.Y, "a");
fxt.Test_Split("| a " , Byte_ascii.Pipe, Bool_.Y, "", "a");
fxt.Test_Split(" | " , Byte_ascii.Pipe, Bool_.Y, "");
fxt.Test_Split(" " , Byte_ascii.Pipe, Bool_.Y);
fxt.Test_Split(" a | b | c " , Byte_ascii.Pipe, Bool_.Y, "a", "b", "c");
fxt.Test_Split(" a b | c d " , Byte_ascii.Pipe, Bool_.Y, "a b", "c d");
fxt.Test_Split(" a \n b " , Byte_ascii.Nl , Bool_.N, " a ", " b "); // ws as dlm
fxt.Test_Split(" a \n b " , Byte_ascii.Nl , Bool_.Y, "a", "b"); // ws as dlm; trim
fxt.Test_Split("a|extend|b" , Byte_ascii.Pipe, Bool_.Y, "a", "extend|b"); // extend
fxt.Test_Split("extend|a" , Byte_ascii.Pipe, Bool_.Y, "extend|a"); // extend
fxt.Test_Split("a|cancel|b" , Byte_ascii.Pipe, Bool_.Y, "a"); // cancel
fxt.Test_split("a" , Byte_ascii.Pipe, Bool_.N, "a"); // no trim
fxt.Test_split("a|" , Byte_ascii.Pipe, Bool_.N, "a");
fxt.Test_split("|a" , Byte_ascii.Pipe, Bool_.N, "", "a");
fxt.Test_split("|" , Byte_ascii.Pipe, Bool_.N, "");
fxt.Test_split("" , Byte_ascii.Pipe, Bool_.N);
fxt.Test_split("a|b|c" , Byte_ascii.Pipe, Bool_.N, "a", "b", "c");
fxt.Test_split(" a " , Byte_ascii.Pipe, Bool_.Y, "a"); // trim
fxt.Test_split(" a |" , Byte_ascii.Pipe, Bool_.Y, "a");
fxt.Test_split("| a " , Byte_ascii.Pipe, Bool_.Y, "", "a");
fxt.Test_split(" | " , Byte_ascii.Pipe, Bool_.Y, "");
fxt.Test_split(" " , Byte_ascii.Pipe, Bool_.Y);
fxt.Test_split(" a | b | c " , Byte_ascii.Pipe, Bool_.Y, "a", "b", "c");
fxt.Test_split(" a b | c d " , Byte_ascii.Pipe, Bool_.Y, "a b", "c d");
fxt.Test_split(" a \n b " , Byte_ascii.Nl , Bool_.N, " a ", " b "); // ws as dlm
fxt.Test_split(" a \n b " , Byte_ascii.Nl , Bool_.Y, "a", "b"); // ws as dlm; trim
fxt.Test_split("a|extend|b" , Byte_ascii.Pipe, Bool_.Y, "a", "extend|b"); // extend
fxt.Test_split("extend|a" , Byte_ascii.Pipe, Bool_.Y, "extend|a"); // extend
fxt.Test_split("a|cancel|b" , Byte_ascii.Pipe, Bool_.Y, "a"); // cancel
}
@Test public void Split__bry() {
fxt.Test_split("a|b|c|d" , 2, 6, "|", "b", "c");
fxt.Test_split("a|b|c|d" , 2, 4, "|", "b");
}
}
class Bry_split__fxt {
private final Bry_split_wkr__example wkr = new Bry_split_wkr__example();
public void Test_Split(String raw_str, byte dlm, boolean trim, String... expd) {
private final Bry_split_wkr__example wkr = new Bry_split_wkr__example();
public void Test_split(String raw_str, byte dlm, boolean trim, String... expd) {
byte[] src = Bry_.new_a7(raw_str);
Bry_split_.Split(src, 0, src.length, dlm, trim, wkr);
byte[][] actl_ary = wkr.To_ary();
Tfds.Eq_ary_str(expd, String_.Ary(actl_ary));
}
public void Test_split(String src, int src_bgn, int src_end, String dlm, String... expd) {
Tfds.Eq_ary_str(Bry_.Ary(expd), Bry_split_.Split(Bry_.new_u8(src), src_bgn, src_end, Bry_.new_u8(dlm)));
}
}
class Bry_split_wkr__example implements gplx.core.brys.Bry_split_wkr {
private final List_adp list = List_adp_.new_();
private final List_adp list = List_adp_.new_();
public int Split(byte[] src, int itm_bgn, int itm_end) {
byte[] bry = itm_end == itm_bgn ? Bry_.Empty : Bry_.Mid(src, itm_bgn, itm_end);
if (Bry_.Eq(bry, Bry_.new_a7("extend"))) return Bry_split_.Rv__extend;

@ -95,8 +95,8 @@ public class Byte_ascii {
? (byte)(b + 32)
: b;
}
public static final byte[] Space_len2 = new byte[] {Space, Space}, Space_len4 = new byte[] {Space, Space, Space, Space};
public static final byte[]
public static final byte[] Space_len2 = new byte[] {Space, Space}, Space_len4 = new byte[] {Space, Space, Space, Space};
public static final byte[]
Tab_bry = new byte[] {Byte_ascii.Tab}
, Nl_bry = new byte[] {Byte_ascii.Nl}
, Space_bry = new byte[] {Byte_ascii.Space}
@ -123,5 +123,7 @@ public class Byte_ascii {
, Star_bry = new byte[] {Byte_ascii.Star}
, Dash_bry = new byte[] {Byte_ascii.Dash}
, Cr_lf_bry = new byte[] {Byte_ascii.Cr, Byte_ascii.Nl}
, Num_0_bry = new byte[] {Byte_ascii.Num_0}
, Num_1_bry = new byte[] {Byte_ascii.Num_1}
;
}

@ -153,7 +153,12 @@ public class IoEngine_system extends IoEngine_base {
}
@Override public IoItmDir QueryDir(Io_url url) {
IoItmDir rv = IoItmDir_.scan_(url);
File dirInfo = new File(url.Xto_api());
String url_api = url.Xto_api();
if ( gplx.core.envs.Op_sys.Cur().Tid_is_wnt() // op_sys is wnt
&& String_.Eq(url.OwnerDir().Raw(), String_.Empty) // folder is drive; EX: "C:"
)
url_api = url_api + "\\"; // add "\\"; else listFiles will return working folder's files, not C:; DATE:2016-04-07
File dirInfo = new File(url_api);
if (!dirInfo.exists()) {
rv.Exists_set(false);
return rv;
@ -488,7 +493,7 @@ public class IoEngine_system extends IoEngine_base {
}
void MarkFileWritable(File fil, Io_url url, boolean readOnlyFails, String op) {
if (Fil_ReadOnly(fil)) {
if (readOnlyFails) // NOTE: java will always allow final files to be deleted; programmer api is responsible for check
if (readOnlyFails) // NOTE: java will always allow final files to be deleted; programmer api is responsible for check
throw Err_.new_(IoEngineArgs.Instance.Err_ReadonlyFileNotWritable, "writable operation attempted on readOnly file", "op", op, "url", url.Xto_api());
else
Fil_Writable(fil);
@ -510,7 +515,7 @@ class IoEngineArgs {
public String Err_ReadonlyFileNotWritable = "gplx.core.ios.ReadonlyFileNotWritable";
public String Err_FileNotFound = "gplx.core.ios.FileNotFound";
public String Err_IoException = "gplx.core.ios.IoException";
public static final IoEngineArgs Instance = new IoEngineArgs();
public static final IoEngineArgs Instance = new IoEngineArgs();
}
class IoEngine_system_xtn {
// PATCH.DROID:VerifyError if file.setExecutable is referenced directly in IoEngine_system. However, if placed in separate class

@ -18,7 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.core.ios; import gplx.*; import gplx.core.*;
import gplx.core.brys.*;
public class Io_size_ {
public static String To_str(long val) {
public static String To_str(long val) {return To_str(val, "#,##0.000");}
public static String To_str(long val, String val_fmt) {
long cur = val; int pow = 0;
while (cur >= 1024) {
cur /= 1024;
@ -27,7 +28,7 @@ public class Io_size_ {
long div = (long)Math_.Pow((long)1024, (long)pow);
Decimal_adp valDecimal = Decimal_adp_.divide_(val, div);
String[] unit = Io_size_.Units[pow];
return valDecimal.To_str("#,##0.000") + " " + String_.PadBgn(unit[0], 2, " ");
return valDecimal.To_str(val_fmt) + " " + String_.PadBgn(unit[0], 2, " ");
}
public static String To_str(long val, int exp_1024, String val_fmt, String unit_pad, boolean round_0_to_1) {
long exp_val = (long)Math_.Pow(1024, exp_1024);
@ -68,7 +69,7 @@ public class Io_size_ {
}
return unitPow;
}
private static final String[][] Units = new String[][]
private static final String[][] Units = new String[][]
{ String_.Ary("B", "BYTE")
, String_.Ary("KB", "KILOBYTE")
, String_.Ary("MB", "MEGABYTE")
@ -77,7 +78,7 @@ public class Io_size_ {
, String_.Ary("PB", "PETABYTE")
, String_.Ary("EB", "EXABYTE")
};
public static final byte[][] Units_bry = new byte[][]
public static final byte[][] Units_bry = new byte[][]
{ Bry_.new_a7("B")
, Bry_.new_a7("KB")
, Bry_.new_a7("MB")

@ -111,10 +111,11 @@ public class Db_attach_mgr {
Exec_sql(sql, args);
return this;
}
public void Exec_sql(String sql, Object... args) {
public Db_attach_mgr Exec_sql(String sql, Object... args) {
String attach_sql = String_.Format(Resolve_sql(sql), args);
this.Attach();
try {main_conn.Exec_sql(attach_sql);}
finally {this.Detach();}
return this;
}
}

@ -41,6 +41,7 @@ public class Db_conn {
public void Meta_tbl_delete(String tbl) {engine.Meta_tbl_delete(tbl);}
public void Meta_tbl_remake(Dbmeta_tbl_itm meta) {engine.Meta_tbl_delete(meta.Name()); engine.Meta_tbl_create(meta);}
public void Meta_idx_create(Dbmeta_idx_itm... idxs) {engine.Meta_idx_create(Gfo_usr_dlg_.Instance, idxs);}
public void Meta_idx_delete(String idx) {engine.Meta_idx_delete(idx);}
public void Meta_idx_create(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... idxs) {engine.Meta_idx_create(usr_dlg, idxs);}
public void Meta_fld_append(String tbl, Dbmeta_fld_itm fld) {engine.Meta_fld_append(tbl, fld);}
public void Meta_fld_assert(String tbl, String fld, Dbmeta_fld_tid tid, Object dflt) {if (!Meta_fld_exists(tbl, fld)) this.Meta_fld_append(tbl, new Dbmeta_fld_itm(fld, tid).Default_(dflt));}

@ -43,6 +43,9 @@ public class Db_rdr__basic implements Db_rdr {
@gplx.Virtual public void Rls() {
try {rdr.close();}
catch (Exception e) {throw Err_.new_exc(e, "db", "close failed");}
if (stmt != null) stmt.Rls();
if (stmt != null) {
stmt.Rls();
stmt = null; // NOTE: must null reference else will throw SQLException during statements DATE:2016-04-10
}
}
}

@ -34,6 +34,7 @@ public interface Db_engine {
void Meta_tbl_delete(String tbl);
void Meta_fld_append(String tbl, Dbmeta_fld_itm fld);
void Meta_idx_create(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary);
void Meta_idx_delete(String idx);
Dbmeta_tbl_mgr Meta_mgr();
boolean Meta_tbl_exists(String tbl);
boolean Meta_fld_exists(String tbl, String fld);

@ -70,6 +70,9 @@ public abstract class Db_engine_sql_base implements Db_engine {
}
this.Meta_mgr().Load_all();
}
@gplx.Virtual public void Meta_idx_delete(String idx) {
if (Meta_idx_exists(idx)) Exec_as_int("DROP INDEX " + idx);
}
public void Meta_fld_append(String tbl, Dbmeta_fld_itm fld) {
Gfo_usr_dlg_.Instance.Plog_many("", "", "adding column to table: db=~{0} tbl=~{1} fld=~{2}", conn_info.Database(), tbl, fld.Name());
try {

@ -56,6 +56,7 @@ public class Mem_engine implements Db_engine {
if (tbl != null) tbl.rows.Clear();
}
public void Meta_idx_create(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {} // TODO: implement unique index
public void Meta_idx_delete(String idx) {}
public void Meta_fld_append(String tbl, Dbmeta_fld_itm fld) {}
public Dbmeta_tbl_mgr Meta_mgr() {return meta_mgr;} private final Dbmeta_tbl_mgr meta_mgr = new Dbmeta_tbl_mgr(Dbmeta_reload_cmd_.Noop);
public boolean Meta_tbl_exists(String tbl) {return tbl_hash.Has(tbl);}

@ -37,9 +37,10 @@ public class Noop_engine implements Db_engine {
public void Txn_sav() {}
public Object Exec_as_obj(Db_qry cmd) {return cmd.Exec_is_rdr() ? (Object)DataRdr_.Null : -1;}
public void Meta_tbl_create(Dbmeta_tbl_itm meta) {}
public void Meta_tbl_delete(String tbl) {}
public void Meta_idx_create(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {}
public void Meta_idx_delete(String idx) {}
public void Meta_fld_append(String tbl, Dbmeta_fld_itm fld) {}
public void Meta_tbl_delete(String tbl) {}
public void Env_db_attach(String alias, Db_conn conn) {}
public void Env_db_attach(String alias, Io_url db_url) {}
public void Env_db_detach(String alias) {}

@ -62,6 +62,7 @@ public class TdbEngine implements Db_engine {
}
public void Meta_tbl_create(Dbmeta_tbl_itm meta) {throw Err_.new_unimplemented();}
public void Meta_idx_create(Gfo_usr_dlg usr_dlg, Dbmeta_idx_itm... ary) {throw Err_.new_unimplemented();}
public void Meta_idx_delete(String idx) {throw Err_.new_unimplemented();}
public void Meta_fld_append(String tbl, Dbmeta_fld_itm fld) {throw Err_.new_unimplemented();}
public void Meta_tbl_delete(String tbl) {}
public boolean Meta_tbl_exists(String name) {return false;}

@ -34,7 +34,7 @@ public class Db_cfg_tbl implements Rls_able {
stmt_update = Db_stmt_.Rls(stmt_update);
stmt_select = Db_stmt_.Rls(stmt_select);
}
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)));}
public Db_cfg_tbl Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds, Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val))); return this;}
public void Delete_val(String grp, String key) {conn.Stmt_delete(tbl_name, fld_grp, fld_key).Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_delete();}
public void Delete_grp(String grp) {conn.Stmt_delete(tbl_name, fld_grp).Crt_str(fld_grp, grp).Exec_delete();}
public void Delete_all() {conn.Stmt_delete(tbl_name, Dbmeta_fld_itm.Str_ary_empty).Exec_delete();}

@ -20,9 +20,9 @@ import gplx.dbs.*; import gplx.dbs.cfgs.*;
public class Fsdb_db_file {
public Fsdb_db_file(Io_url url, Db_conn conn) {
this.url = url; this.conn = conn;
this.tbl__core_cfg = new Db_cfg_tbl(conn, "xowa_cfg");
this.tbl__core_cfg = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(conn);
}
public Io_url Url() {return url;} private final Io_url url;
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Db_cfg_tbl Tbl__cfg() {return tbl__core_cfg;} private final Db_cfg_tbl tbl__core_cfg;
public Io_url Url() {return url;} private final Io_url url;
public Db_conn Conn() {return conn;} private final Db_conn conn;
public Db_cfg_tbl Tbl__cfg() {return tbl__core_cfg;} private final Db_cfg_tbl tbl__core_cfg;
}

@ -18,9 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.fsdb; import gplx.*;
import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.fsdb.meta.*; import gplx.xowa.files.origs.*; import gplx.xowa.wikis.data.*;
public class Fsdb_db_mgr__v2 implements Fsdb_db_mgr {
private final Xowd_db_layout layout; private final Io_url wiki_dir;
private final Fsdb_db_file file_main_core, file_user_core;
private final Xof_orig_tbl[] orig_tbl_ary;
private final Xowd_db_layout layout; private final Io_url wiki_dir;
private final Fsdb_db_file file_main_core, file_user_core;
private final Xof_orig_tbl[] orig_tbl_ary;
public Fsdb_db_mgr__v2(Xowd_db_layout layout, Io_url wiki_dir, Fsdb_db_file file_main_core, Fsdb_db_file file_user_core) {
this.layout = layout; this.wiki_dir = wiki_dir;
this.file_main_core = file_main_core; this.file_user_core = file_user_core;
@ -31,7 +31,7 @@ public class Fsdb_db_mgr__v2 implements Fsdb_db_mgr {
}
public boolean File__schema_is_1() {return Bool_.N;}
public boolean File__solo_file() {return layout.Tid_is_all_or_few();}
public String File__cfg_tbl_name() {return Cfg_tbl_name;}
public String File__cfg_tbl_name() {return gplx.xowa.wikis.data.Xowd_cfg_tbl_.Tbl_name;}
public Xof_orig_tbl[] File__orig_tbl_ary() {return orig_tbl_ary;}
public Fsdb_db_file File__mnt_file() {return file_main_core;}
public Fsdb_db_file File__abc_file__at(int mnt_id) {return mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? file_main_core: file_user_core;}
@ -52,12 +52,11 @@ public class Fsdb_db_mgr__v2 implements Fsdb_db_mgr {
if (layout.Tid_is_all_or_few()) return Fsdb_db_mgr__v2_bldr.Make_bin_tbl(file_main_core);
Io_url url = wiki_dir.GenSubFil(file_name);
Db_conn conn = Db_conn_bldr.Instance.New(url);
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, Cfg_tbl_name); cfg_tbl.Create_tbl();
gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(conn).Create_tbl();
return Fsdb_db_mgr__v2_bldr.Make_bin_tbl(new Fsdb_db_file(url, conn));
}
public static final String Cfg_tbl_name = "xowa_cfg";
public static Xowd_db_layout Cfg__layout_file__get(Db_conn main_core_conn) {
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(main_core_conn, "xowa_cfg");
Db_cfg_tbl cfg_tbl = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(main_core_conn);
return Xowd_db_layout.get_(cfg_tbl.Select_str_or(gplx.xowa.wikis.Xow_cfg_consts.Grp__bldr_fsdb, Cfg_key__layout_file, Xowd_db_layout.Name_few));
}
public static void Cfg__layout_file__set(Db_cfg_tbl cfg_tbl, Xowd_db_layout v) {

@ -18,10 +18,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.langs.htmls; import gplx.*; import gplx.langs.*;
public class Gfh_tag_ {
public static final int
Id__eos = -2
Id__comment = -3
, Id__eos = -2
, Id__any = -1
, Id__unknown = 0
, Id__comment = 1
, Id__h2 = 2
, Id__h3 = 3
, Id__h4 = 4
@ -38,13 +38,13 @@ public class Gfh_tag_ {
, Id__hr = 15
, Id__td = 16
;
public static final byte[]
public static final byte[]
Bry__a = Bry_.new_a7("a")
, Bry__ul = Bry_.new_a7("ul")
, Bry__td = Bry_.new_a7("td")
, Bry__th = Bry_.new_a7("th")
;
public static final Hash_adp_bry Hash = Hash_adp_bry.ci_a7()
public static final Hash_adp_bry Hash = Hash_adp_bry.ci_a7()
.Add_bry_int(Bry__a , Id__a)
.Add_str_int("h2" , Id__h2)
.Add_str_int("h3" , Id__h3)
@ -85,7 +85,7 @@ public class Gfh_tag_ {
default: throw Err_.new_unhandled(tid);
}
}
public static final byte[]
public static final byte[]
Br_inl = Bry_.new_a7("<br/>")
, Br_lhs = Bry_.new_a7("<br>")
, Hr_inl = Bry_.new_a7("<hr/>")
@ -113,10 +113,10 @@ public class Gfh_tag_ {
, Comm_end_str = "-->"
, Anchor_str = "#"
;
public static final byte[]
public static final byte[]
Comm_bgn = Bry_.new_a7(Comm_bgn_str), Comm_end = Bry_.new_a7(Comm_end_str)
;
public static final int
public static final int
Comm_bgn_len = Comm_bgn.length
, Comm_end_len = Comm_end.length
;

@ -19,17 +19,19 @@ package gplx.langs.htmls.docs; import gplx.*; import gplx.langs.*; import gplx.l
import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.btries.*;
import gplx.xowa.parsers.htmls.*;
public class Gfh_tag_rdr {
private final Hash_adp_bry name_hash = Gfh_tag_.Hash;
private final Mwh_atr_parser atr_parser = new Mwh_atr_parser();
private final Gfh_tag tag__tmp__move = new Gfh_tag(), tag__tmp__peek = new Gfh_tag(), tag__eos = new Gfh_tag(), tag__comment = new Gfh_tag();
private final Int_obj_ref tmp_depth = Int_obj_ref.zero_();
private final Hash_adp_bry name_hash;
private final Mwh_atr_parser atr_parser = new Mwh_atr_parser();
private final Gfh_tag tag__tmp__move = new Gfh_tag(), tag__tmp__peek = new Gfh_tag(), tag__eos = new Gfh_tag(), tag__comment = new Gfh_tag();
private final Int_obj_ref tmp_depth = Int_obj_ref.zero_();
Gfh_tag_rdr(Hash_adp_bry name_hash) {this.name_hash = name_hash;}
public byte[] Src() {return src;} private byte[] src;
public int Src_end() {return src_end;} private int src_end;
public Bry_err_wkr Err_wkr() {return err_wkr;} private final Bry_err_wkr err_wkr = new Bry_err_wkr();
public void Init(byte[] ctx, byte[] src, int src_bgn, int src_end) {
public Bry_err_wkr Err_wkr() {return err_wkr;} private final Bry_err_wkr err_wkr = new Bry_err_wkr();
public Gfh_tag_rdr Reg(String tag_name, int tag_id) {name_hash.Add_str_int(tag_name, tag_id); return this;}
public void Init(byte[] ctx_name, byte[] src, int src_bgn, int src_end) {
this.src = src; this.pos = src_bgn; this.src_end = src_end;
tag__eos.Init(this, src, Bool_.N, Bool_.N, src_end, src_end, src_end, src_end, Gfh_tag_.Id__eos, Bry_.Empty);
err_wkr.Init_by_page(String_.new_u8(ctx), src);
err_wkr.Init_by_page(String_.new_u8(ctx_name), src);
}
public int Pos() {return pos;} private int pos;
public void Pos_(int v) {this.pos = v;}
@ -218,5 +220,7 @@ public class Gfh_tag_rdr {
int tag_end = tag_bgn + 255; if (tag_end > src_end) tag_end = src_end;
return tag__comment.Init(this, src, Bool_.N, Bool_.N, tag_bgn, tag_end, tag_end, tag_end, Gfh_tag_.Id__eos, Bry_.Empty);
}
private static final byte[] Bry__comment__mid = Bry_.new_a7("--");
private static final byte[] Bry__comment__mid = Bry_.new_a7("--");
public static Gfh_tag_rdr New__html() {return new Gfh_tag_rdr(Gfh_tag_.Hash);}
public static Gfh_tag_rdr New__custom() {return new Gfh_tag_rdr(Hash_adp_bry.cs());}
}

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.langs.htmls.docs; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*;
import org.junit.*;
public class Gfh_tag_rdr_tst {
private final Gfh_tag_rdr_fxt fxt = new Gfh_tag_rdr_fxt();
private final Gfh_tag_rdr_fxt fxt = new Gfh_tag_rdr_fxt();
@Test public void Basic() {
fxt.Init("1<div id='1'>2</div>3<div id='2'>4</div>5<div id='3'>6</div>7");
fxt.Test__move_fwd_head("<div id='1'>"); fxt.Test__pos("2");
@ -47,7 +47,7 @@ public class Gfh_tag_rdr_tst {
}
}
class Gfh_tag_rdr_fxt {
private final Gfh_tag_rdr rdr = new Gfh_tag_rdr();
private final Gfh_tag_rdr rdr = Gfh_tag_rdr.New__html();
public void Init(String src_str) {
byte[] src_bry = Bry_.new_u8(src_str);
rdr.Init(Bry_.Empty, src_bry, 0, src_bry.length);

@ -0,0 +1,39 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
public class Mustache_bfr {
private final Bry_bfr bfr;
public Mustache_bfr(Bry_bfr bfr) {this.bfr = bfr;}
public Bry_bfr Bfr() {return bfr;}
public Mustache_bfr Escape_(boolean v) {escape = v; return this;} private boolean escape;
public void Add_int (int v) {bfr.Add_int_variable(v);}
public void Add_double (double v) {bfr.Add_double(v);}
public void Add_str_u8 (String v) {bfr.Add_str_u8(v);}
public void Add_mid (byte[] src, int bgn, int end) {bfr.Add_mid(src, bgn, end);}
public void Add_bry (byte[] v) {
if (v == null) return; // allow items to have null props
if (escape)
gplx.langs.htmls.Gfh_utl.Escape_html_to_bfr(bfr, v, 0, v.length, Bool_.Y, Bool_.Y, Bool_.Y, Bool_.Y, Bool_.Y);
else
bfr.Add(v);
}
public byte[] To_bry_and_clear() {return bfr.To_bry_and_clear();}
public String To_str_and_clear() {return bfr.To_str_and_clear();}
public static Mustache_bfr New() {return new Mustache_bfr(Bry_bfr.new_());}
public static Mustache_bfr New_bfr(Bry_bfr v) {return new Mustache_bfr(v);}
}

@ -18,6 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
import gplx.langs.jsons.*;
public interface Mustache_doc_itm {
byte[] Get_prop(String key);
Mustache_doc_itm[] Get_subs(String key);
boolean Mustache__write(String key, Mustache_bfr bfr);
Mustache_doc_itm[] Mustache__subs(String key);
}

@ -17,15 +17,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
public class Mustache_doc_itm_ {
public static final byte[] Null_val = null;
public static final Mustache_doc_itm Null_itm = null;
public static final Mustache_doc_itm Itm__bool__y = new Mustache_doc_itm__bool(Bool_.Y), Itm__bool__n = new Mustache_doc_itm__bool(Bool_.N);
public static final Mustache_doc_itm[] Ary__empty = new Mustache_doc_itm[0], Ary__bool__y = new Mustache_doc_itm[] {Itm__bool__y}, Ary__bool__n = new Mustache_doc_itm[] {Itm__bool__n};
public static final byte[] Null_val = null;
public static final Mustache_doc_itm Null_itm = null;
public static final Mustache_doc_itm Itm__bool__y = new Mustache_doc_itm__bool(Bool_.Y), Itm__bool__n = new Mustache_doc_itm__bool(Bool_.N);
public static final Mustache_doc_itm[] Ary__empty = new Mustache_doc_itm[0], Ary__bool__y = new Mustache_doc_itm[] {Itm__bool__y}, Ary__bool__n = new Mustache_doc_itm[] {Itm__bool__n};
public static Mustache_doc_itm[] Ary__bool(boolean v) {return v ? Ary__bool__y : Ary__bool__n;}
}
class Mustache_doc_itm__bool implements Mustache_doc_itm {
public Mustache_doc_itm__bool(boolean val) {this.val = val;}
public boolean Val() {return val;} private final boolean val;
public byte[] Get_prop(String key) {return Mustache_doc_itm_.Null_val;}
public Mustache_doc_itm[] Get_subs(String key) {return Mustache_doc_itm_.Ary__empty;}
public boolean Val() {return val;} private final boolean val;
public boolean Mustache__write(String key, Mustache_bfr bfr) {return false;}
public Mustache_doc_itm[] Mustache__subs(String key) {return Mustache_doc_itm_.Ary__empty;}
}

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
import org.junit.*; import gplx.core.primitives.*;
public class Mustache_itm_render_tst {
private final Mustache_itm_render_fxt fxt = new Mustache_itm_render_fxt();
private final Mustache_itm_render_fxt fxt = new Mustache_itm_render_fxt();
@Test public void Text() {
fxt.Test__parse("a b c", "a b c");
}
@ -38,6 +38,12 @@ public class Mustache_itm_render_tst {
fxt.Test__parse("a{{#bool_n}}b{{/bool_n}}c", "ac");
fxt.Test__parse("a{{#bool_y}}b{{/bool_y}}c{{#bool_n}}d{{/bool_n}}e", "abce");
}
@Test public void Section_not() {
fxt.Init__root(fxt.Make_mock(0).Add_bool_y("bool_y").Add_bool_n("bool_n"));
fxt.Test__parse("a{{^bool_y}}b{{/bool_y}}c", "ac");
fxt.Test__parse("a{{^bool_n}}b{{/bool_n}}c", "abc");
fxt.Test__parse("a{{^bool_y}}b{{/bool_y}}c{{^bool_n}}d{{/bool_n}}e", "acde");
}
@Test public void Section_ws() {
fxt.Init__root(fxt.Make_mock(0).Add_bool_y("bool_y"));
fxt.Test__parse("a\n {{#bool_y}} \nb\n {{/bool_y}} \nc", "a\nb\nc");
@ -107,9 +113,9 @@ public class Mustache_itm_render_tst {
}
}
class Mustache_itm_render_fxt {
private final Mustache_tkn_parser parser = new Mustache_tkn_parser();
private final Mustache_render_ctx ctx = new Mustache_render_ctx();
private final Bry_bfr tmp_bfr = Bry_bfr.new_();
private final Mustache_tkn_parser parser = new Mustache_tkn_parser();
private final Mustache_render_ctx ctx = new Mustache_render_ctx();
private final Mustache_bfr bfr = Mustache_bfr.New();
private Mustache_doc_itm__mock root;
public Mustache_doc_itm__mock Make_mock(int id) {return new Mustache_doc_itm__mock(id);}
public void Init__root(Mustache_doc_itm__mock v) {this.root = v;}
@ -117,23 +123,25 @@ class Mustache_itm_render_fxt {
byte[] src_bry = Bry_.new_a7(src_str);
Mustache_tkn_itm actl_itm = parser.Parse(src_bry, 0, src_bry.length);
ctx.Init(root);
actl_itm.Render(tmp_bfr, ctx);
Tfds.Eq_str_lines(expd, tmp_bfr.To_str_and_clear());
actl_itm.Render(bfr, ctx);
Tfds.Eq_str_lines(expd, bfr.To_str_and_clear());
}
}
class Mustache_doc_itm__mock implements Mustache_doc_itm {
private final Hash_adp hash_prop = Hash_adp_.new_(), hash_bool = Hash_adp_.new_(), hash_subs = Hash_adp_.new_();
private final Hash_adp hash_prop = Hash_adp_.new_(), hash_bool = Hash_adp_.new_(), hash_subs = Hash_adp_.new_();
public Mustache_doc_itm__mock(int id) {this.id = id;}
public int id;
public Mustache_doc_itm__mock Add_prop(String key, String val) {hash_prop.Add(key, Bry_.new_u8(val)); return this;}
public Mustache_doc_itm__mock Add_bool_y(String key) {hash_bool.Add(key, Bool_obj_ref.y_()); return this;}
public Mustache_doc_itm__mock Add_bool_n(String key) {hash_bool.Add(key, Bool_obj_ref.n_()); return this;}
public Mustache_doc_itm__mock Add_subs(String key, Mustache_doc_itm__mock... ary) {hash_subs.Add(key, ary); return this;}
public byte[] Get_prop(String key) {
public boolean Mustache__write(String key, Mustache_bfr bfr) {
byte[] rv = (byte[])hash_prop.Get_by(key);
return rv == null ? Mustache_doc_itm_.Null_val : rv;
if (rv == null) return false;
bfr.Add_bry(rv);
return true;
}
public Mustache_doc_itm[] Get_subs(String key) {
public Mustache_doc_itm[] Mustache__subs(String key) {
Object rv = hash_bool.Get_by(key);
if (rv != null) {
boolean bool_val = ((Bool_obj_ref)rv).Val();

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
public class Mustache_render_ctx {
private final List_adp stack = List_adp_.new_();
private final List_adp stack = List_adp_.new_();
private Mustache_doc_itm cur;
private Mustache_doc_itm[] subs; private int subs_idx, subs_len; private byte cur_is_bool;
public Mustache_render_ctx Init(Mustache_doc_itm cur) {
@ -26,12 +26,12 @@ public class Mustache_render_ctx {
this.subs_idx = subs_len = 0; this.cur_is_bool = Bool_.__byte;
return this;
}
public byte[] Render_variable(String key) {
byte[] rv = Mustache_doc_itm_.Null_val;
public boolean Render_variable(Mustache_bfr bfr, String key) {
boolean rv = false;
Mustache_doc_itm itm = cur;
while (itm != Mustache_doc_itm_.Null_itm) {
rv = cur.Get_prop(key);
if (rv != Mustache_doc_itm_.Null_val) break;
boolean resolved = cur.Mustache__write(key, bfr);
if (resolved) {rv = true; break;}
else break; // TODO: itm = itm.Get_owner();
}
return rv;
@ -39,21 +39,25 @@ public class Mustache_render_ctx {
public void Section_bgn(String key) {
Mustache_stack_itm stack_itm = new Mustache_stack_itm(cur, subs, subs_idx, subs_len, cur_is_bool); // note that cur is "owner" since subs_idx == 0
stack.Add(stack_itm);
subs = cur.Get_subs(key); if (subs == null) subs = Mustache_doc_itm_.Ary__empty; // subs == null if property does not exist; EX: "folder{{#files}}file{{/files}}" and folder = new Folder(File[0]);
subs = cur.Mustache__subs(key); if (subs == null) subs = Mustache_doc_itm_.Ary__empty; // subs == null if property does not exist; EX: "folder{{#files}}file{{/files}}" and folder = new Folder(File[0]);
subs_len = subs.length;
subs_idx = -1;
}
public boolean Section_do() {
public boolean Section_do(boolean inverted) {
if (++subs_idx >= subs_len) return false;
Mustache_doc_itm sub = subs[subs_idx];
if (subs_idx == 0) { // special logic to handle 1st item; note that there always be at least one item
if (sub == Mustache_doc_itm_.Itm__bool__n) {
cur_is_bool = Bool_.N_byte;
return Bool_.N;
boolean rv = Bool_.N;
if (inverted) rv = !rv;
cur_is_bool = Bool_.To_byte(rv);
return rv;
}
else if (sub == Mustache_doc_itm_.Itm__bool__y) {
cur_is_bool = Bool_.Y_byte;
return Bool_.Y;
boolean rv = Bool_.Y;
if (inverted) rv = !rv;
cur_is_bool = Bool_.To_byte(rv);
return rv;
}
else
cur_is_bool = Bool_.__byte;
@ -78,9 +82,9 @@ class Mustache_stack_itm {
this.subs_idx = subs_idx;
this.subs_len = subs_len;
}
public final Mustache_doc_itm cur;
public final byte cur_is_bool;
public final Mustache_doc_itm[] subs;
public final int subs_idx;
public final int subs_len;
public final Mustache_doc_itm cur;
public final byte cur_is_bool;
public final Mustache_doc_itm[] subs;
public final int subs_idx;
public final int subs_len;
}

@ -21,26 +21,26 @@ public interface Mustache_tkn_itm {
String Key();
Mustache_tkn_itm[] Subs_ary();
void Subs_ary_(Mustache_tkn_itm[] v);
void Render(Bry_bfr bfr, Mustache_render_ctx ctx);
void Render(Mustache_bfr bfr, Mustache_render_ctx ctx);
}
class Mustache_tkn_itm_ {// for types, see http://mustache.github.io/mustache.5.html
public static final int Tid__root = 0, Tid__text = 1, Tid__variable = 2, Tid__escape = 3, Tid__section = 4, Tid__inverted = 5, Tid__comment = 6, Tid__partial = 7, Tid__delimiter = 8;
public static final Mustache_tkn_itm[] Ary_empty = new Mustache_tkn_itm[0];
public static final Mustache_tkn_itm[] Ary_empty = new Mustache_tkn_itm[0];
}
abstract class Mustache_tkn_base implements Mustache_tkn_itm {
public Mustache_tkn_base(int tid, byte[] key_bry) {this.tid = tid; this.key = String_.new_u8(key_bry);}
public int Tid() {return tid;} private final int tid;
public String Key() {return key;} private final String key;
@gplx.Virtual public Mustache_tkn_itm[] Subs_ary() {return Mustache_tkn_itm_.Ary_empty;}
@gplx.Virtual public void Subs_ary_(Mustache_tkn_itm[] v) {throw Err_.new_unsupported();} // fail if trying to set and not overridden
@gplx.Virtual public void Render(Bry_bfr bfr, Mustache_render_ctx ctx) {throw Err_.new_unsupported();} // should be abstract
public int Tid() {return tid;} private final int tid;
public String Key() {return key;} private final String key;
@gplx.Virtual public Mustache_tkn_itm[] Subs_ary() {return Mustache_tkn_itm_.Ary_empty;}
@gplx.Virtual public void Subs_ary_(Mustache_tkn_itm[] v) {throw Err_.new_unsupported();} // fail if trying to set and not overridden
@gplx.Virtual public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {throw Err_.new_unsupported();} // should be abstract
}
class Mustache_tkn_root extends Mustache_tkn_base { // EX: {{variable}} -> &lt;a&gt;
private Mustache_tkn_itm[] subs_ary;
public Mustache_tkn_root() {super(Mustache_tkn_itm_.Tid__root, Bry_.Empty);}
@Override public Mustache_tkn_itm[] Subs_ary() {return subs_ary;}
@Override public void Subs_ary_(Mustache_tkn_itm[] v) {subs_ary = v;}
@Override public void Render(Bry_bfr bfr, Mustache_render_ctx ctx) {
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {
int subs_len = subs_ary.length;
for (int i = 0; i < subs_len; ++i) {
Mustache_tkn_itm sub = subs_ary[i];
@ -49,36 +49,32 @@ class Mustache_tkn_root extends Mustache_tkn_base { // EX: {{variable}} -> &lt;
}
}
class Mustache_tkn_text extends Mustache_tkn_base { // EX: text -> text
private final byte[] src; private final int src_bgn, src_end;
private final byte[] src; private final int src_bgn, src_end;
public Mustache_tkn_text(byte[] src, int src_bgn, int src_end) {super(Mustache_tkn_itm_.Tid__text, Bry_.Empty);
this.src = src;
this.src_bgn = src_bgn;
this.src_end = src_end;
}
@Override public void Render(Bry_bfr bfr, Mustache_render_ctx ctx) {
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {
bfr.Add_mid(src, src_bgn, src_end);
}
}
class Mustache_tkn_comment extends Mustache_tkn_base { // EX: {{!section}}comment{{/section}} ->
public Mustache_tkn_comment() {super(Mustache_tkn_itm_.Tid__comment, Bry_.Empty);}
@Override public void Render(Bry_bfr bfr, Mustache_render_ctx ctx) {}
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {}
}
class Mustache_tkn_variable extends Mustache_tkn_base { // EX: {{variable}} -> &lt;a&gt;
public Mustache_tkn_variable(byte[] key) {super(Mustache_tkn_itm_.Tid__variable, key);}
@Override public void Render(Bry_bfr bfr, Mustache_render_ctx ctx) {
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {
String key = this.Key();
byte[] val = ctx.Render_variable(key);
if (val != Mustache_doc_itm_.Null_val) // if not found, return empty String by default
gplx.langs.htmls.Gfh_utl.Escape_html_to_bfr(bfr, val, 0, val.length, Bool_.Y, Bool_.Y, Bool_.Y, Bool_.Y, Bool_.Y);
ctx.Render_variable(bfr.Escape_(Bool_.Y), key);
}
}
class Mustache_tkn_escape extends Mustache_tkn_base { // EX: {{{variable}}} -> <a>
public Mustache_tkn_escape(byte[] key) {super(Mustache_tkn_itm_.Tid__escape, key);}
@Override public void Render(Bry_bfr bfr, Mustache_render_ctx ctx) {
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {
String key = this.Key();
byte[] val = ctx.Render_variable(key);
if (val != Mustache_doc_itm_.Null_val) // if not found, return empty String by default
bfr.Add(val);
ctx.Render_variable(bfr.Escape_(Bool_.N), key);
}
}
class Mustache_tkn_section extends Mustache_tkn_base { // EX: {{#section}}val{{/section}} -> val (if boolean) or valvalval (if list)
@ -86,11 +82,12 @@ class Mustache_tkn_section extends Mustache_tkn_base { // EX: {{#section}}val{{/
public Mustache_tkn_section(byte[] key) {super(Mustache_tkn_itm_.Tid__section, key);}
@Override public Mustache_tkn_itm[] Subs_ary() {return subs_ary;}
@Override public void Subs_ary_(Mustache_tkn_itm[] v) {subs_ary = v;}
@Override public void Render(Bry_bfr bfr, Mustache_render_ctx ctx) {
String key = this.Key();
Mustache_tkn_itm[] subs_ary = this.Subs_ary();
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {Render_static(Bool_.N, this, bfr, ctx);}
public static void Render_static(boolean inverted, Mustache_tkn_base tkn, Mustache_bfr bfr, Mustache_render_ctx ctx) {
String key = tkn.Key();
Mustache_tkn_itm[] subs_ary = tkn.Subs_ary();
ctx.Section_bgn(key);
while (ctx.Section_do()) {
while (ctx.Section_do(inverted)) {
int subs_len = subs_ary.length;
for (int i = 0; i < subs_len; ++i) {
Mustache_tkn_itm sub = subs_ary[i];
@ -101,7 +98,11 @@ class Mustache_tkn_section extends Mustache_tkn_base { // EX: {{#section}}val{{/
}
}
class Mustache_tkn_inverted extends Mustache_tkn_base { // EX: {{^section}}missing{{/section}} -> missing
private Mustache_tkn_itm[] subs_ary;
public Mustache_tkn_inverted(byte[] key) {super(Mustache_tkn_itm_.Tid__inverted, key);}
@Override public Mustache_tkn_itm[] Subs_ary() {return subs_ary;}
@Override public void Subs_ary_(Mustache_tkn_itm[] v) {subs_ary = v;}
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {Mustache_tkn_section.Render_static(Bool_.Y, this, bfr, ctx);}
}
class Mustache_tkn_partial extends Mustache_tkn_base { // EX: {{>a}} -> abc (deferred eval)
public Mustache_tkn_partial(byte[] key) {super(Mustache_tkn_itm_.Tid__partial, key);}

@ -18,7 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
public class Mustache_tkn_parser {
private byte[] src; private int src_end;
private final Mustache_tkn_def tkn_def = new Mustache_tkn_def();
private final Mustache_tkn_def tkn_def = new Mustache_tkn_def();
public Mustache_tkn_itm Parse(byte[] src) {return Parse(src, 0, src.length);}
public Mustache_tkn_itm Parse(byte[] src, int src_bgn, int src_end) {
this.src = src; this.src_end = src_end;
Mustache_tkn_root root = new Mustache_tkn_root();

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
import org.junit.*;
public class Mustache_tkn_parser_tst {
private final Mustache_tkn_parser_fxt fxt = new Mustache_tkn_parser_fxt();
private final Mustache_tkn_parser_fxt fxt = new Mustache_tkn_parser_fxt();
@Test public void Basic() {
fxt.Test_parse("a{{b}}c", "ac");
}
@ -27,13 +27,13 @@ public class Mustache_tkn_parser_tst {
}
}
class Mustache_tkn_parser_fxt {
private final Mustache_tkn_parser parser = new Mustache_tkn_parser();
private final Mustache_render_ctx ctx = new Mustache_render_ctx();
private final Bry_bfr tmp_bfr = Bry_bfr.new_();
private final Mustache_tkn_parser parser = new Mustache_tkn_parser();
private final Mustache_render_ctx ctx = new Mustache_render_ctx();
private final Mustache_bfr bfr = Mustache_bfr.New();
public void Test_parse(String src_str, String expd) {
byte[] src_bry = Bry_.new_a7(src_str);
Mustache_tkn_itm actl_itm = parser.Parse(src_bry, 0, src_bry.length);
actl_itm.Render(tmp_bfr, ctx);
Tfds.Eq_str_lines(expd, tmp_bfr.To_str_and_clear());
actl_itm.Render(bfr, ctx);
Tfds.Eq_str_lines(expd, bfr.To_str_and_clear());
}
}

@ -0,0 +1,29 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
public class Mustache_wtr_ {
public static byte[] Write_to_bry(byte[] src, Mustache_doc_itm itm) {return Write_to_bry(Bry_bfr.new_(), src, itm);}
public static byte[] Write_to_bry(Bry_bfr bfr, byte[] src, Mustache_doc_itm itm) {
Mustache_tkn_parser parser = new Mustache_tkn_parser();
Mustache_tkn_itm root = parser.Parse(src, 0, src.length);
Mustache_render_ctx ctx = new Mustache_render_ctx().Init(itm);
Mustache_bfr mbfr = new Mustache_bfr(bfr);
root.Render(mbfr, ctx);
return mbfr.To_bry_and_clear();
}
}

@ -27,6 +27,8 @@ import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wiki
import gplx.xowa.langs.*;
import gplx.xowa.bldrs.wms.*;
import gplx.xowa.users.*;
import gplx.xowa.bldrs.*;
import gplx.xowa.addons.*; import gplx.xowa.addons.apps.specials.*;
public interface Xoa_app extends GfoInvkAble {
boolean Tid_is_edit();
Xoa_app_mode Mode();
@ -55,4 +57,7 @@ public interface Xoa_app extends GfoInvkAble {
Gfo_inet_conn Utl__inet_conn();
Xoa_meta_mgr Dbmeta_mgr();
Xoa_site_cfg_mgr Site_cfg_mgr();
Xoax_addon_mgr Addon_mgr();
Xob_bldr Bldr();
Xoa_special_regy Special_regy();
}

@ -34,7 +34,7 @@ public class Xoa_app_ {
}
}
public static final String Name = "xowa";
public static final String Version = "3.4.1.1";
public static final String Version = "3.4.2.1";
public static String Build_date = "2012-12-30 00:00:00";
public static String Op_sys_str;
public static String User_agent = "";

@ -23,6 +23,8 @@ public interface Xoa_page {
byte[] Url_bry_safe();
Xoa_ttl Ttl();
boolean Exists();
Xopg_revision_data Revision_data();
Xopg_html_data Html_data();
Xoa_page__commons_mgr Commons_mgr();
void Xtn_gallery_packed_exists_y_();

@ -28,7 +28,7 @@ import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtn
import gplx.xowa.parsers.utils.*; import gplx.xowa.parsers.logs.*; import gplx.xowa.apps.servers.tcp.*; import gplx.xowa.apps.servers.http.*;
import gplx.xowa.bldrs.wms.*;
import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.tdbs.hives.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.addons.*;
import gplx.xowa.addons.*; import gplx.xowa.addons.apps.specials.*;
public class Xoae_app implements Xoa_app, GfoInvkAble {
public Xoae_app(Gfo_usr_dlg usr_dlg, Xoa_app_mode mode, Io_url root_dir, Io_url wiki_dir, Io_url file_dir, Io_url user_dir, Io_url css_dir, String bin_dir_name) {
Xoa_app_.Usr_dlg_(usr_dlg);
@ -91,6 +91,8 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
public boolean Xwiki_mgr__exists(byte[] wiki_key) {return user.Wiki().Xwiki_mgr().Get_by_key(wiki_key) != null;}
public Xow_xwiki_itm_parser Xwiki_mgr__itm_parser() {return xwiki_mgr__itm_parser;} private final Xow_xwiki_itm_parser xwiki_mgr__itm_parser = new Xow_xwiki_itm_parser();
public Xoax_addon_mgr Addon_mgr() {return addon_mgr;} private final Xoax_addon_mgr addon_mgr = new Xoax_addon_mgr();
public Xoa_special_regy Special_regy() {return special_regy;} private final Xoa_special_regy special_regy = new Xoa_special_regy();
public Xob_bldr Bldr() {return bldr;} private Xob_bldr bldr;
public Xoae_wiki_mgr Wiki_mgr() {return wiki_mgr;} private Xoae_wiki_mgr wiki_mgr;
@ -101,7 +103,6 @@ public class Xoae_app implements Xoa_app, GfoInvkAble {
public Xoa_gui_mgr Gui_mgr() {return gui_mgr;} private Xoa_gui_mgr gui_mgr;
public Xou_user User() {return user;}
public Xoue_user Usere() {return user;} private Xoue_user user;
public Xob_bldr Bldr() {return bldr;} private Xob_bldr bldr;
public Xow_xtn_mgr Xtn_mgr() {return xtn_mgr;} private Xow_xtn_mgr xtn_mgr;
public Xoapi_root Api_root() {return api_root;} private Xoapi_root api_root;
public Gfo_usr_dlg Usr_dlg() {return Xoa_app_.Usr_dlg();}

@ -35,15 +35,15 @@ public class Xoae_page implements Xoa_page {
public byte[] Url_bry_safe() {return url == null ? Bry_.Empty : url.Raw();}
public boolean Exists() {return !Missing();}
public void Xtn_gallery_packed_exists_y_() {html_data.Xtn_gallery_packed_exists_y_();}
public Xoa_page__commons_mgr Commons_mgr() {return commons_mgr;} private final Xoa_page__commons_mgr commons_mgr = new Xoa_page__commons_mgr();
public Xopg_revision_data Revision_data() {return revision_data;} private Xopg_revision_data revision_data = new Xopg_revision_data();
public Xopg_html_data Html_data() {return html_data;} private Xopg_html_data html_data = new Xopg_html_data();
public Xoa_page__commons_mgr Commons_mgr() {return commons_mgr;} private final Xoa_page__commons_mgr commons_mgr = new Xoa_page__commons_mgr();
public Xowe_wiki Wikie() {return wiki;} private Xowe_wiki wiki;
public Xopg_redlink_lnki_list Redlink_lnki_list() {return redlink_lnki_list;} private Xopg_redlink_lnki_list redlink_lnki_list;
public Xol_lang_itm Lang() {return lang;} public Xoae_page Lang_(Xol_lang_itm v) {lang = v; return this;} private Xol_lang_itm lang;
public Xopg_html_data Html_data() {return html_data;} private Xopg_html_data html_data = new Xopg_html_data();
public Xopg_tab_data Tab_data() {return tab_data;} private final Xopg_tab_data tab_data = new Xopg_tab_data();
public Xopg_hdump_data Hdump_data() {return hdump_data;} private final Xopg_hdump_data hdump_data = new Xopg_hdump_data();
public Xopg_tab_data Tab_data() {return tab_data;} private final Xopg_tab_data tab_data = new Xopg_tab_data();
public Xopg_hdump_data Hdump_data() {return hdump_data;} private final Xopg_hdump_data hdump_data = new Xopg_hdump_data();
public boolean Missing() {return missing;} public Xoae_page Missing_() {return Missing_(true);} public Xoae_page Missing_(boolean v) {missing = v; return this;} private boolean missing;
public boolean Redirected() {return redirected;} public Xoae_page Redirected_(boolean v) {redirected = v; return this;} private boolean redirected;
public List_adp Redirected_ttls() {return redirected_ttls;} private List_adp redirected_ttls = List_adp_.new_();
@ -102,7 +102,7 @@ public class Xoae_page implements Xoa_page {
commons_mgr.Clear();
}
private Xoae_page Edit_mode_create_() {edit_mode = Xoa_page_.Edit_mode_create; return this;}
public static final Xoae_page Empty = new Xoae_page().Missing_();
public static final Xoae_page Empty = new Xoae_page().Missing_();
public static Xoae_page New(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl);}
public static Xoae_page New_test(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl);}
public static Xoae_page New_edit(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl).Edit_mode_create_();}

@ -50,7 +50,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj {
props.SiteName_(domain_tid).ServerName_(domain_bry);
props.ContentLanguage_(lang.Key_bry());
stats = new Xow_site_stats_mgr(this);
Pf_func_.Reg(lang.Func_regy(), lang);
Pf_func_.Reg(domain_itm, lang.Func_regy(), lang);
special_mgr = new Xows_mgr(this, lang);
sys_cfg = new Xow_sys_cfg(this);
hive_mgr = new Xob_hive_mgr(this);

@ -17,6 +17,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons; import gplx.*; import gplx.xowa.*;
import gplx.xowa.bldrs.wkrs.*;
public interface Xoax_addon_bldr {
public interface Xoax_addon_itm__bldr {
Xob_cmd[] Cmds_ary();
}

@ -15,10 +15,8 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*;
public class Xosp_fbrow_rslt {
public Xosp_fbrow_rslt(byte[] html_head, byte[] html_body) {this.html_head = html_head; this.html_body = html_body;}
public byte[] Html_head() {return html_head;} private final byte[] html_head;
public byte[] Html_body() {return html_body;} private final byte[] html_body;
public static Xosp_fbrow_rslt err_(String msg) {return new Xosp_fbrow_rslt(Bry_.Empty, Bry_.new_u8(msg));}
package gplx.xowa.addons; import gplx.*; import gplx.xowa.*;
import gplx.xowa.bldrs.wkrs.*;
public interface Xoax_addon_itm__sp {
gplx.xowa.specials.Xows_page[] Pages_ary();
}

@ -30,7 +30,7 @@ public class Xoax_addon_mgr {
hash.Add(itm.Addon__key(), itm);
}
}
public Xoax_addon_mgr Add_dflts_by_app(Xoae_app app) {
public Xoax_addon_mgr Add_dflts_by_app(Xoa_app app) {
app.Bldr().Cmd_regy().Add_many
( gplx.xowa.bldrs.cmds.utils.Xob_alert_cmd.Prototype
);
@ -39,19 +39,23 @@ public class Xoax_addon_mgr {
, new gplx.xowa.addons.builds.pagelinks .Xoax_builds_pagelinks_addon()
, new gplx.xowa.addons.builds.utils_rankings .Xoax_builds_utils_rankings_addon()
, new gplx.xowa.addons.apps.searchs .Xoax_builds_search_addon()
, new gplx.xowa.addons.apps.file_browsers .Fbrow_addon()
, new gplx.xowa.addons.updates.files .Xoax_updates_files_addon()
);
return this;
}
public void Run_by_app(Xoae_app app) {
public void Run_by_app(Xoa_app app) {
int len = hash.Len();
gplx.xowa.bldrs.Xob_bldr bldr = app.Bldr();
for (int i = 0; i < len; ++i) {
Xoax_addon_itm addon = (Xoax_addon_itm)hash.Get_at(i);
if (!Type_adp_.Implements_intf_obj(addon, Xoax_addon_bldr.class)) continue;
Xoax_addon_bldr addon_bldr = (Xoax_addon_bldr)addon;
bldr.Cmd_regy().Add_many(addon_bldr.Cmds_ary());
if (Type_adp_.Implements_intf_obj(addon, Xoax_addon_itm__bldr.class)) {
Xoax_addon_itm__bldr addon_bldr = (Xoax_addon_itm__bldr)addon;
app.Bldr().Cmd_regy().Add_many(addon_bldr.Cmds_ary());
}
if (Type_adp_.Implements_intf_obj(addon, Xoax_addon_itm__sp.class)) {
Xoax_addon_itm__sp addon_sp = (Xoax_addon_itm__sp)addon;
app.Special_regy().Add_many(addon_sp.Pages_ary());
}
}
}
}

@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.specials.*;
public class Fbrow_addon implements Xoax_addon_itm, Xoax_addon_itm__sp {
public Xows_page[] Pages_ary() {
return new Xows_page[]
{ Fbrow_special_page.Prototype
, Wikis_list_page.Prototype
};
}
public static final byte[] ADDON_KEY = Bry_.new_a7("xowa.apps.file_browsers");
public byte[] Addon__key() {return ADDON_KEY;}
}

@ -0,0 +1,78 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.ios.*;
import gplx.langs.mustaches.*;
class Fbrow_file_itm implements Mustache_doc_itm {
private final boolean is_dir, is_core_xowa;
private final byte[] owner_dir_enc, path, name, date, size, color;
private final Fbrow_file_itm[] subs;
public Fbrow_file_itm(boolean is_dir, boolean is_core_xowa, int color, byte[] owner_dir, byte[] path, byte[] name, byte[] date, byte[] size, Fbrow_file_itm[] subs) {
this.is_dir = is_dir; this.is_core_xowa = is_core_xowa;
this.color = color % 2 == 0 ? Byte_ascii.Num_0_bry : Byte_ascii.Num_1_bry;
this.owner_dir_enc = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode(owner_dir);
this.path = path; this.name = name; this.date = date; this.size = size;
this.subs = subs;
}
public boolean Mustache__write(String key, Mustache_bfr bfr) {
if (String_.Eq(key, "path")) bfr.Add_bry(path);
else if (String_.Eq(key, "path_enc")) bfr.Add_bry(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode(path));
else if (String_.Eq(key, "owner_dir_enc")) bfr.Add_bry(owner_dir_enc);
else if (String_.Eq(key, "name")) bfr.Add_bry(name);
else if (String_.Eq(key, "date")) bfr.Add_bry(date);
else if (String_.Eq(key, "size")) bfr.Add_bry(size);
else if (String_.Eq(key, "color")) bfr.Add_bry(color);
else return false;
return true;
}
public Mustache_doc_itm[] Mustache__subs(String key) {
if (String_.Eq(key, "is_dir")) return Mustache_doc_itm_.Ary__bool(is_dir);
else if (String_.Eq(key, "is_core_xowa")) return Mustache_doc_itm_.Ary__bool(is_core_xowa);
else if (String_.Eq(key, "subs")) return subs;
return Mustache_doc_itm_.Ary__empty;
}
public static final Fbrow_file_itm[] Ary_empty = new Fbrow_file_itm[0];
public static Fbrow_file_itm New(IoItmDir owner_dir) {
List_adp sub_list = List_adp_.new_();
New_subs(owner_dir.Url(), sub_list, owner_dir.SubDirs());
New_subs(owner_dir.Url(), sub_list, owner_dir.SubFils());
Fbrow_file_itm[] subs = (Fbrow_file_itm[])sub_list.To_ary_and_clear(Fbrow_file_itm.class);
return new Fbrow_file_itm(Bool_.Y, Bool_.N, 0, owner_dir.Url().OwnerDir().RawBry(), owner_dir.Url().RawBry(), Bry_.new_u8(owner_dir.Name()), Bry_.Empty, Bry_.Empty, subs);
}
private static void New_subs(Io_url owner_dir, List_adp list, IoItmList subs) {
subs.Sort();
int len = subs.Len();
int list_total = list.Len();
byte[] owner_dir_bry = owner_dir.RawBry();
for (int i = 0; i < len; ++i) {
IoItm_base src = (IoItm_base)subs.Get_at(i);
Fbrow_file_itm trg = null;
if (src.Type_dir()) {
byte[] trg_url = src.Url().RawBry();
trg = new Fbrow_file_itm(Bool_.Y, Bool_.N, list_total + i, owner_dir_bry, trg_url, Bry_.new_u8(src.Url().NameAndExt_noDirSpr()), Bry_.Empty, Bry_.Empty, Ary_empty);
}
else {
IoItmFil src_as_fil = (IoItmFil)src;
String size_str = Io_size_.To_str(src_as_fil.Size(), "#,###");
boolean is_xowa_core = gplx.xowa.wikis.data.Xowd_db_mgr.Maybe_core(owner_dir.NameOnly(), src.Url().NameAndExt());
trg = new Fbrow_file_itm(Bool_.N, is_xowa_core, list_total + i, owner_dir_bry, src.Url().RawBry(), Bry_.new_u8(src.Name()), Bry_.new_u8(src_as_fil.ModifiedTime().XtoStr_fmt("yyyy-MM-dd")), Bry_.new_u8(size_str), Ary_empty);
}
list.Add(trg);
}
}
}

@ -0,0 +1,51 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.ios.*; import gplx.core.net.*;
import gplx.xowa.specials.*;
import gplx.xowa.wikis.pages.*;
public class Fbrow_special_page implements Xows_page {
public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) {
Xopage_html_data html_data = Write_html(wiki.App(), url.Qargs_ary());
html_data.Apply(page);
}
private static Xopage_html_data Write_html(Xoa_app app, Gfo_qarg_itm[] args_ary) {
// scan owner_dir
Xoa_url_arg_mgr arg_mgr = new Xoa_url_arg_mgr(null).Init(args_ary);
String owner_str = arg_mgr.Read_str_or_null("path"); if (owner_str == null) return Xopage_html_data.err_("url has unknown path");
IoItmDir owner_dir = Io_mgr.Instance.QueryDir_args(Io_url_.new_any_(owner_str)).DirInclude_(true).ExecAsDir();
Fbrow_file_itm owner_itm = Fbrow_file_itm.New(owner_dir);
// write body
Io_url addon_dir = app.Fsys_mgr().Bin_addon_dir().GenSubDir_nest("import", "file_browser");
byte[] template_src = Io_mgr.Instance.LoadFilBry(addon_dir.GenSubFil_nest("bin", "file_browser.mustache.html"));
Bry_bfr tmp_bfr = Bry_bfr.new_();
byte[] body = gplx.langs.mustaches.Mustache_wtr_.Write_to_bry(tmp_bfr, template_src, owner_itm);
// write head
Xopage_html_data rv = new Xopage_html_data(Display_ttl, body);
rv.Head_tags().Add(Xopg_tag_itm.New_css(addon_dir.GenSubFil_nest("bin", "file_browser.css")));
return rv;
}
public static final String SPECIAL_KEY = "XowaFileBrowser";
public static final byte[] Display_ttl = Bry_.new_a7("Import XOWA Wikis");
public Xows_special_meta Special__meta() {return new Xows_special_meta(Xows_special_meta_.Src__xowa, SPECIAL_KEY);}
public static final Xows_page Prototype = new Fbrow_special_page();
public Xows_page Special__clone() {return this;}
}

@ -0,0 +1,46 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.ios.*;
import gplx.langs.mustaches.*;
class Wikis_list_mgr implements Mustache_doc_itm {
private final byte[] import_root;
private final Wikis_list_itm[] subs;
public Wikis_list_mgr(byte[] import_root, Wikis_list_itm[] subs) {this.import_root = import_root; this.subs = subs;}
public boolean Mustache__write(String key, Mustache_bfr bfr) {
if (String_.Eq(key, "import_root")) bfr.Add_bry(import_root);
return false;
}
public Mustache_doc_itm[] Mustache__subs(String key) {
if (String_.Eq(key, "subs")) return subs;
return Mustache_doc_itm_.Ary__empty;
}
}
class Wikis_list_itm implements Mustache_doc_itm {
private final byte[] domain, date;
public Wikis_list_itm(byte[] domain, byte[] date) {
this.domain = domain; this.date = date;
}
public boolean Mustache__write(String key, Mustache_bfr bfr) {
if (String_.Eq(key, "domain")) bfr.Add_bry(domain);
else if (String_.Eq(key, "date")) bfr.Add_bry(date);
else return false;
return true;
}
public Mustache_doc_itm[] Mustache__subs(String key) {return Mustache_doc_itm_.Ary__empty;}
}

@ -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 <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.specials.*; import gplx.core.ios.*; import gplx.core.net.*;
public class Wikis_list_page implements Xows_page {
public void Special__gen(Xow_wiki wiki, Xoa_page page, Xoa_url url, Xoa_ttl ttl) {
Xoa_url_arg_mgr arg_mgr = new Xoa_url_arg_mgr(null).Init(url.Qargs_ary());
Wikis_list_wtr wtr = new Wikis_list_wtr();
byte[] cmd = arg_mgr.Read_bry_or_null("cmd");
if (cmd == null) {
Xopage_html_data html_data = wtr.Write(wiki.App(), url.Qargs_ary(), GfoInvkAble_.Null);
html_data.Apply(page);
}
else {
if (Bry_.Eq(cmd, Bry_.new_a7("add"))) {
byte[] file = arg_mgr.Read_bry_or_null("file");
if (file != null) {
if (wiki.App().Tid_is_edit()) {
wiki.App().User().User_db_mgr().Init_site_mgr();
}
wiki.App().Wiki_mgri().Import_by_url(Io_url_.new_fil_(String_.new_u8(file)));
Xopage_html_data html_data = wtr.Write(wiki.App(), url.Qargs_ary(), GfoInvkAble_.Null);
html_data.Apply(page);
}
}
}
}
public static final String SPECIAL_KEY = "XowaWikis";
public static final byte[] Display_ttl = Bry_.new_a7("XOWA Wikis");
public Xows_special_meta Special__meta() {return new Xows_special_meta(Xows_special_meta_.Src__xowa, SPECIAL_KEY);}
public static final Xows_page Prototype = new Wikis_list_page();
public Xows_page Special__clone() {return this;}
}

@ -0,0 +1,57 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.net.*;
import gplx.xowa.wikis.xwikis.*;
import gplx.langs.mustaches.*;
import gplx.xowa.users.data.*; import gplx.xowa.wikis.pages.*;
class Wikis_list_wtr {
public Xopage_html_data Write(Xoa_app app, Gfo_qarg_itm[] args, GfoInvkAble select_invkable) {
// scan wikis
List_adp list = List_adp_.new_();
app.User().User_db_mgr().Init_site_mgr();
Xoud_site_row[] site_ary = app.User().User_db_mgr().Site_mgr().Get_all();
int len = site_ary.length;
for (int i = 0; i < len; ++i) {
Xoud_site_row site_itm = site_ary[i];
if (String_.Eq(site_itm.Domain(), gplx.xowa.wikis.domains.Xow_domain_itm_.Str__home)) continue;
list.Add(new Wikis_list_itm(Bry_.new_u8(site_itm.Domain()), Bry_.new_a7("2016-03-05")));
}
Wikis_list_mgr mgr = new Wikis_list_mgr(Get_root_url(), (Wikis_list_itm[])list.To_ary_and_clear(Wikis_list_itm.class));
// write body
Io_url addon_dir = app.Fsys_mgr().Bin_addon_dir().GenSubDir_nest("app", "wiki_list");
byte[] template_src = Io_mgr.Instance.LoadFilBry(addon_dir.GenSubFil_nest("bin", "wiki_list.mustache.html"));
Bry_bfr tmp_bfr = Bry_bfr.new_();
byte[] body = gplx.langs.mustaches.Mustache_wtr_.Write_to_bry(tmp_bfr, template_src, mgr);
// write to html
Xopage_html_data rv = new Xopage_html_data(Wikis_list_page.Display_ttl, body);
rv.Head_tags().Add(Xopg_tag_itm.New_css(addon_dir.GenSubFil_nest("bin", "wiki_list.css")));
return rv;
}
private static byte[] Get_root_url() {
byte tid = gplx.core.envs.Op_sys.Cur().Tid();
byte[] rv = Bry_.new_a7("/");
switch (tid) {
case gplx.core.envs.Op_sys.Tid_wnt : rv = Bry_.new_a7("C:\\"); break;
}
rv = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode(rv);
return rv;
}
}

@ -15,19 +15,20 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.specials.xowa.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.*;
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.primitives.*; import gplx.core.net.*;
class Xoa_url_arg_mgr {
private final Hash_adp_bry hash = Hash_adp_bry.cs();
private final Xoa_url_enum_mgr enm_mgr;
private final Hash_adp_bry hash = Hash_adp_bry.cs();
private final Xoa_url_enum_mgr enm_mgr;
public Xoa_url_arg_mgr(Xoa_url_enum_mgr enm_mgr) {this.enm_mgr = enm_mgr;}
public void Init(Gfo_qarg_itm[] args) {
public Xoa_url_arg_mgr Init(Gfo_qarg_itm[] args) {
hash.Clear();
int len = args.length;
for (int i = 0; i < len; ++i) {
Gfo_qarg_itm arg = args[i];
hash.Add_bry_obj(arg.Key_bry(), arg);
}
return this;
}
public int Read_enm_or_neg1(byte[] key) {
Xoa_url_enum_itm enm = enm_mgr.Get(key); if (enm == null) return -1;
@ -35,6 +36,7 @@ class Xoa_url_arg_mgr {
return enm.Get_as_int_or(arg.Val_bry(), -1);
}
public byte[] Read_bry_or_empty(byte[] key) {return Read_bry_or(key, Bry_.Empty);}
public byte[] Read_bry_or_null(String key) {return Read_bry_or_null(Bry_.new_u8(key));}
public byte[] Read_bry_or_null(byte[] key) {return Read_bry_or(key, null);}
public byte[] Read_bry_or(byte[] key, byte[] or) {
Gfo_qarg_itm arg = (Gfo_qarg_itm)hash.Get_by_bry(key);
@ -47,7 +49,7 @@ class Xoa_url_arg_mgr {
}
}
class Xoa_url_enum_mgr {
private final Hash_adp_bry hash = Hash_adp_bry.cs();
private final Hash_adp_bry hash = Hash_adp_bry.cs();
public Xoa_url_enum_mgr(Xoa_url_enum_itm... ary) {
int len = ary.length;
for (int i = 0; i < len; ++i) {
@ -58,9 +60,9 @@ class Xoa_url_enum_mgr {
public Xoa_url_enum_itm Get(byte[] key) {return (Xoa_url_enum_itm)hash.Get_by_bry(key);}
}
class Xoa_url_enum_itm {
private final Hash_adp_bry hash = Hash_adp_bry.cs();
private final Hash_adp_bry hash = Hash_adp_bry.cs();
public Xoa_url_enum_itm(byte[] key) {this.key = key;}
public byte[] Key() {return key;} private final byte[] key;
public byte[] Key() {return key;} private final byte[] key;
public Xoa_url_enum_itm Add(String key, int val) {
hash.Add_bry_obj(Bry_.new_u8(key), Int_obj_val.new_(val));
return this;

@ -0,0 +1,43 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.file_browsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.wikis.pages.*;
public class Xopage_html_data {
public Xopage_html_data(byte[] display_ttl, byte[] body) {
this.display_ttl = display_ttl;
this.body = body;
}
public byte[] Display_ttl() {return display_ttl;} private byte[] display_ttl;
public byte[] Body() {return body;} private final byte[] body;
public Xopg_tag_mgr Head_tags() {return head_tags;} private final Xopg_tag_mgr head_tags = new Xopg_tag_mgr();
public Xopg_tag_mgr Tail_tags() {return tail_tags;} private final Xopg_tag_mgr tail_tags = new Xopg_tag_mgr();
public void Apply(Xoa_page page) {
page.Html_data().Html_restricted_n_();
page.Html_data().Skip_parse_(Bool_.Y);
Bry_bfr bfr = Bry_bfr.new_();
page.Html_data().Custom_head_end_concat(head_tags.To_html(bfr));
page.Html_data().Custom_html_end_concat(tail_tags.To_html(bfr));
page.Html_data().Display_ttl_(display_ttl);
page.Html_data().Custom_body_(this.Body());
page.Html_data().Custom_head_tags().Copy(head_tags);
page.Html_data().Custom_tail_tags().Copy(head_tags);
}
public static Xopage_html_data err_(String msg) {return new Xopage_html_data(Bry_.Empty, Bry_.new_u8(msg));}
}

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.searchs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.addons.apps.searchs.bldrs.cmds.*;
public class Xoax_builds_search_addon implements Xoax_addon_itm, Xoax_addon_bldr {
public class Xoax_builds_search_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr {
public Xob_cmd[] Cmds_ary() {
return new Xob_cmd[]
{ Xobldr__link__link_score.Prototype

@ -44,38 +44,81 @@ class Srch_temp_tbl_wkr implements Srch_text_parser_wkr {
public void Term() {
// end inserts
search_temp_tbl.Insert_end();
// init
Srch_db_mgr search_db_mgr = search_addon.Db_mgr().Init(); // NOTE: must call .Init for import-offline else Cfg_tbl will be null; note that .Init will bind to newly created search_word / search_link tbl; DATE:2016-04-04
Db_conn word_conn = search_temp_tbl.conn;
Db_conn page_conn = wiki.Data__core_mgr().Tbl__page().conn;
// update search_word ids if they exist
Srch_db_mgr.Optimize_unsafe_(word_conn, Bool_.Y);
Update_word_id(word_conn, wiki);
word_conn.Exec_sql("filling search_word (please wait)", Sql__create_word);
Search_word__insert(word_conn);
Srch_db_mgr.Optimize_unsafe_(word_conn, Bool_.N);
// create search_link
Db_conn page_conn = wiki.Data__core_mgr().Tbl__page().conn;
if (search_db_mgr.Tbl__link__len() == 1) {
// single_db; just run sql;
Xoa_app_.Usr_dlg().Plog_many("", "", "creating search_link");
Srch_link_tbl link_tbl = search_db_mgr.Tbl__link__ary()[0];
new Db_attach_mgr(word_conn, new Db_attach_itm("link_db", link_tbl.conn))
.Exec_sql(Sql__create_link__one);
.Exec_sql(String_.Concat_lines_nl_skip_last
( "INSERT INTO <link_db>search_link (word_id, page_id)"
, "SELECT w.word_id"
, ", t.page_id"
, "FROM search_temp t"
, " JOIN search_word w ON t.word_text = w.word_text"
));
link_tbl.Create_idx__page_id();
} else {
// many_db; split into main links and non-main; ASSUME:link_dbs_is_2
int len = search_db_mgr.Tbl__link__len();
Db_attach_mgr attach_mgr = new Db_attach_mgr();
for (int i = 0; i < len; ++i) {
Srch_link_tbl link_tbl = search_db_mgr.Tbl__link__ary()[i];
attach_mgr.Main_conn_(word_conn).Init
( new Db_attach_itm("page_db", page_conn)
, new Db_attach_itm("link_db", link_tbl.conn));
attach_mgr.Exec_sql(Sql__create_link__many, i == 0 ? " = 0" : " != 0");
link_tbl.Create_idx__page_id();
}
Search_link__insert(search_db_mgr, word_conn, page_conn);
}
// remove search_temp
word_conn.Meta_tbl_delete(search_temp_tbl.tbl_name);
}
private static void Search_link__insert(Srch_db_mgr search_db_mgr, Db_conn word_conn, Db_conn page_conn) {
// many_db; split into main links and non-main; ASSUME:link_dbs_is_2
Db_attach_mgr attach_mgr = new Db_attach_mgr();
// dump everything into a temp table in order to index it
page_conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_name("page", "page_ns__page_id", "page_namespace", "page_id"));
Srch_db_mgr.Optimize_unsafe_(word_conn, Bool_.Y);
word_conn.Meta_tbl_remake(Dbmeta_tbl_itm.New("search_link_temp", Dbmeta_fld_itm.new_int("word_id"), Dbmeta_fld_itm.new_int("page_id"), Dbmeta_fld_itm.new_int("page_namespace")));
attach_mgr.Main_conn_(word_conn).Init(new Db_attach_itm("page_db", page_conn));
attach_mgr.Exec_sql_w_msg
( "filling search_link_temp (please wait)", String_.Concat_lines_nl_skip_last
( "INSERT INTO search_link_temp (word_id, page_id, page_namespace)"
, "SELECT w.word_id"
, ", t.page_id"
, ", p.page_namespace"
, "FROM search_temp t"
, " JOIN search_word w ON t.word_text = w.word_text"
, " JOIN <page_db>page p ON t.page_id = p.page_id"
));
word_conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_name("search_link_temp", "main", "page_namespace", "word_id", "page_id"));
Srch_db_mgr.Optimize_unsafe_(word_conn, Bool_.N);
page_conn.Meta_idx_delete("page__page_ns__page_id");
int len = search_db_mgr.Tbl__link__len();
for (int i = 0; i < len; ++i) {
Xoa_app_.Usr_dlg().Plog_many("", "", "creating search_link_temp: ~{0}", i);
Srch_link_tbl link_tbl = search_db_mgr.Tbl__link__ary()[i];
Srch_db_mgr.Optimize_unsafe_(link_tbl.conn, Bool_.Y);
attach_mgr.Main_conn_(link_tbl.conn).Init(new Db_attach_itm("word_db", word_conn));
attach_mgr.Exec_sql_w_msg
( Bry_fmt.Make_str("filling search_link: ~{idx} of ~{len}", i, len), String_.Concat_lines_nl_skip_last
( "INSERT INTO search_link (word_id, page_id)"
, "SELECT t.word_id"
, ", t.page_id"
, "FROM <word_db>search_link_temp t"
, "WHERE t.page_namespace" + (i == 0 ? " = 0" : " != 0")
));
link_tbl.Create_idx__page_id();
Srch_db_mgr.Optimize_unsafe_(link_tbl.conn, Bool_.N);
}
word_conn.Meta_tbl_delete("search_link_temp");
}
public void Exec_by_wkr(int page_id, byte[] page_ttl) {
this.page_id = page_id;
title_parser.Parse(this, page_ttl);
@ -141,34 +184,36 @@ class Srch_temp_tbl_wkr implements Srch_text_parser_wkr {
}
}
}
private static final String
Sql__create_word = String_.Concat_lines_nl
( "INSERT INTO search_word (word_id, word_text, link_count)"
, "SELECT word_id"
, ", word_text"
, ", Count(DISTINCT page_id)"
, "FROM search_temp"
, "GROUP BY "
, " word_text"
, ";"
)
, Sql__create_link__one = String_.Concat_lines_nl
( "INSERT INTO <link_db>search_link (word_id, page_id)"
, "SELECT w.word_id"
, ", t.page_id"
, "FROM search_temp t"
, " JOIN search_word w ON t.word_text = w.word_text"
, ";"
)
, Sql__create_link__many = String_.Concat_lines_nl
( "INSERT INTO <link_db>search_link (word_id, page_id)"
, "SELECT w.word_id"
, ", t.page_id"
, "FROM search_temp t"
, " JOIN search_word w ON t.word_text = w.word_text"
, " JOIN <page_db>page p ON t.page_id = p.page_id"
, "WHERE p.page_namespace {0}"
, ";"
)
;
private static void Search_word__insert(Db_conn word_conn) {
// fill search_word; need to insert into temp first b/c PRIMARY KEY on search_word will dramatically slow down insertion
word_conn.Meta_tbl_create(Dbmeta_tbl_itm.New("search_word_temp"
, Dbmeta_fld_itm.new_int("word_id")
, Dbmeta_fld_itm.new_str("word_text", 255)
, Dbmeta_fld_itm.new_int("link_count")
));
word_conn.Exec_sql_concat_w_msg
( "filling search_word_temp (please wait)"
, "INSERT INTO search_word_temp (word_id, word_text, link_count)"
, "SELECT Min(word_id)"
, ", word_text"
, ", Count(word_id)" // NOTE: no need to be Count(DISTINCT page_id); each search_temp row will only insert one word per page
, "FROM search_temp"
, "GROUP BY "
, " word_text"
, ";"
);
word_conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_name("search_word_temp", "main", "word_id"));
word_conn.Exec_sql_concat_w_msg
( "filling search_word (please wait)"
, "INSERT INTO search_word (word_id, word_text, link_count)"
, "SELECT word_id"
, ", word_text"
, ", link_count"
, "FROM search_word_temp"
, "ORDER BY "
, " word_id"
, ";"
);
word_conn.Meta_tbl_delete("search_word_temp");
}
}

@ -121,6 +121,8 @@ public class Xobldr__link__link_score extends Xob_cmd__base {
Srch_db_mgr search_db_mgr = Srch_search_addon.Get(wiki).Db_mgr();
Srch_word_tbl word_tbl = search_db_mgr.Tbl__word();
if (!page_tbl.conn.Eq(word_tbl.conn)) page_tbl.conn.Env_vacuum(); // don't vacuum if single-db
// Srch_db_mgr.Optimize_unsafe_(word_tbl.conn, Bool_.Y);
word_tbl.conn.Meta_tbl_remake(Dbmeta_tbl_itm.New("link_score_mnx", Dbmeta_fld_itm.new_int("word_id"), Dbmeta_fld_itm.new_int("mnx_val")));
int link_tbls_len = search_db_mgr.Tbl__link__len();
for (int i = 0; i < link_tbls_len; ++i) {
Srch_link_tbl link_tbl = search_db_mgr.Tbl__link__get_at(i);
@ -134,37 +136,15 @@ public class Xobldr__link__link_score extends Xob_cmd__base {
( "UPDATE search_link"
, "SET link_score = Coalesce((SELECT page_score FROM <page_db>page p WHERE p.page_id = search_link.page_id), 0)"
));
// update word_tbl.page_score_max
new Db_attach_mgr(word_tbl.conn
, new Db_attach_itm("link_db", link_tbl.conn)
)
.Exec_sql_w_msg
( Bry_fmt.Make_str("updating link_score_min: ~{idx} of ~{total}", i + 1, link_tbls_len)
, String_.Concat_lines_nl_skip_last
( "REPLACE INTO search_word (word_id, word_text, link_count, link_score_min, link_score_max)"
, "SELECT sw.word_id, sw.word_text, sw.link_count, Min(sl.link_score), sw.link_score_max"
, "FROM search_word sw"
, " JOIN <link_db>search_link sl ON sl.word_id = sw.word_id"
, "GROUP BY sw.word_id, sw.word_text, sw.link_count, sw.link_score_max"
, "HAVING sw.link_score_min > Min(sl.link_score)"
))
.Exec_sql_w_msg
( Bry_fmt.Make_str("updating link_score_max: ~{idx} of ~{total}", i + 1, link_tbls_len)
, String_.Concat_lines_nl_skip_last
( "REPLACE INTO search_word (word_id, word_text, link_count, link_score_min, link_score_max)"
, "SELECT sw.word_id, sw.word_text, sw.link_count, sw.link_score_min, Max(sl.link_score)"
, "FROM search_word sw"
, " JOIN <link_db>search_link sl ON sl.word_id = sw.word_id"
, "GROUP BY sw.word_id, sw.word_text, sw.link_count, sw.link_score_min"
, "HAVING sw.link_score_max < Max(sl.link_score)"
))
;
Calc_min_max(Bool_.Y, word_tbl, link_tbl, i, link_tbls_len);
Calc_min_max(Bool_.N, word_tbl, link_tbl, i, link_tbls_len);
link_tbl.Create_idx__link_score();
if (!link_tbl.conn.Eq(word_tbl.conn)) link_tbl.conn.Env_vacuum(); // don't vacuum if single-db
word_tbl.Create_idx();
}
word_tbl.conn.Meta_tbl_delete("link_score_mnx");
Srch_db_cfg_.Update__bldr__link(search_db_mgr.Tbl__cfg(), search_db_mgr.Cfg(), link_score_max);
// Srch_db_mgr.Optimize_unsafe_(word_tbl.conn, Bool_.N);
if (delete_plink_db) {
Xob_db_file plink_db = Xob_db_file.New__page_link(wiki);
@ -172,6 +152,38 @@ public class Xobldr__link__link_score extends Xob_cmd__base {
Io_mgr.Instance.DeleteFil(plink_db.Url());
}
}
private void Calc_min_max(boolean min, Srch_word_tbl word_tbl, Srch_link_tbl link_tbl, int i, int link_tbls_len) {
word_tbl.conn.Meta_idx_delete("link_score_mnx__main");
word_tbl.conn.Exec_sql_concat("DELETE FROM link_score_mnx");
String prc_name = "Max";
String fld_name = "link_score_max";
if (min) {
prc_name = "Min";
fld_name = "link_score_min";
}
new Db_attach_mgr(word_tbl.conn, new Db_attach_itm("link_db", link_tbl.conn))
.Exec_sql_w_msg
( Bry_fmt.Make_str("creating temp.link_score_max: ~{idx} of ~{total}", i + 1, link_tbls_len)
, String_.Concat_lines_nl_skip_last
( "INSERT INTO link_score_mnx (word_id, mnx_val)"
, "SELECT sw.word_id, " + prc_name + "(sl.link_score)"
, "FROM search_word sw"
, " JOIN <link_db>search_link sl ON sl.word_id = sw.word_id"
, "GROUP BY sw.word_id"
))
;
word_tbl.conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_name("link_score_mnx", "main", "word_id", "mnx_val"));
word_tbl.conn.Exec_sql_concat_w_msg
( Bry_fmt.Make_str("creating temp.link_score_max: ~{idx} of ~{total}", i + 1, link_tbls_len)
, "UPDATE search_word"
, "SET " + fld_name + " = "
, " Coalesce(("
, " SELECT mnx_val"
, " FROM link_score_mnx lsm"
, " WHERE lsm.word_id = search_word.word_id"
, " ), " + fld_name + ")"
);
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__page_rank_enabled_)) page_rank_enabled = m.ReadYn("v");
else if (ctx.Match(k, Invk__delete_plink_db_)) delete_plink_db = m.ReadYn("v");
@ -182,5 +194,5 @@ public class Xobldr__link__link_score extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "search.link__link_score";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__link__link_score(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__link__link_score(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__link__link_score(bldr, wiki);}
}

@ -109,5 +109,5 @@ public class Xobldr__page__page_score extends Xob_cmd__base implements Xob_cmd {
public static final String BLDR_CMD_KEY = "search.page__page_score";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__page__page_score(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__page__page_score(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__page__page_score(bldr, wiki);}
}

@ -52,5 +52,5 @@ public class Xobldr__word__link_count extends Xob_cmd__base implements Xob_cmd {
public static final String BLDR_CMD_KEY = "search.word__link_count";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__word__link_count(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__word__link_count(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__word__link_count(bldr, wiki);}
}

@ -39,7 +39,7 @@ public class Srch_db_mgr {
|| db_props.Layout_text().Tid_is_all_or_few()) {
// single_db; core_db has search_word and search_link
word_db = db_mgr.Db__core();
tbl__cfg = new Db_cfg_tbl(word_db.Conn(), "xowa_cfg");
tbl__cfg = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(word_db.Conn());
tbl__word = new Srch_word_tbl(word_db.Conn());
tbl__link__ary = new Srch_link_tbl[1];
Tbl__link__ary__set(tbl__link__ary, 0, word_db);
@ -47,7 +47,7 @@ public class Srch_db_mgr {
// many_db; figure out link_dbs
word_db = db_mgr.Dbs__get_by_tid_or_null(Srch_db_mgr_.Dbtid__search_core);
if (word_db == null) return this; // HACK: called during db build; skip;
tbl__cfg = new Db_cfg_tbl(word_db.Conn(), "xowa_cfg");
tbl__cfg = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(word_db.Conn());
tbl__word = new Srch_word_tbl(word_db.Conn());
Ordered_hash hash = db_mgr.Dbs__get_hash_by_tid(Srch_db_mgr_.Dbtid__search_link);
if (hash == null) { // v2 file layout where search_word and search_link is in 1 search_db
@ -117,4 +117,14 @@ public class Srch_db_mgr {
tbl.Create_tbl();
lreg_tbl.Insert(idx, db.Id(), Srch_link_reg_tbl.Db_type__title, ns_ids_is_main ? Srch_link_reg_tbl.Ns_type__main : Srch_link_reg_tbl.Ns_type__rest, 0, -1, -1);
}
public static void Optimize_unsafe_(gplx.dbs.Db_conn conn, boolean v) {
if (v) {
conn.Exec_qry(gplx.dbs.engines.sqlite.Sqlite_pragma.New__journal__off());
conn.Exec_qry(gplx.dbs.engines.sqlite.Sqlite_pragma.New__synchronous__off());
}
else {
conn.Exec_qry(gplx.dbs.engines.sqlite.Sqlite_pragma.New__journal__delete());
conn.Exec_qry(gplx.dbs.engines.sqlite.Sqlite_pragma.New__synchronous__full());
}
}
}

@ -40,6 +40,9 @@ public class Srch_temp_tbl {
public void Insert_end() {
conn.Txn_end();
stmt_insert = Db_stmt_.Rls(stmt_insert);
conn.Meta_idx_create(Xoa_app_.Usr_dlg(), Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "main", fld_word_text, fld_page_id));
Srch_db_mgr.Optimize_unsafe_(conn, Bool_.Y);
conn.Meta_idx_create(Xoa_app_.Usr_dlg(), Dbmeta_idx_itm.new_unique_by_tbl(tbl_name, "word_text__word_id", fld_word_text, fld_word_id));
// conn.Meta_idx_create(Xoa_app_.Usr_dlg(), Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "page_id", fld_page_id));
Srch_db_mgr.Optimize_unsafe_(conn, Bool_.N);
}
}

@ -33,8 +33,9 @@ public class Srch_special_page implements Xows_page, GfoInvkAble, GfoEvObj {
GfoEvMgr_.SubSame_many(search_api, this, Xoapi_search.Evt_multi_wikis_changed, Xoapi_search.Evt_multi_wikis_changed);
}
public GfoEvMgr EvMgr() {return ev_mgr;} private final GfoEvMgr ev_mgr;
public Xows_special_meta Special_meta() {return Xows_special_meta_.Itm__search;}
public void Special_gen(Xowe_wiki wiki, Xoae_page page, Xoa_url url, Xoa_ttl ttl) {
public Xows_special_meta Special__meta() {return Xows_special_meta_.Itm__search;}
public void Special__gen(Xow_wiki wikii, Xoa_page pagei, Xoa_url url, Xoa_ttl ttl) {
Xowe_wiki wiki = (Xowe_wiki)wikii; Xoae_page page = (Xoae_page)pagei;
if (search_domain_ary == null) Multi_wikis_changed();
// get args from urls while applying defaults from search_cfg
@ -120,4 +121,6 @@ public class Srch_special_page implements Xows_page, GfoInvkAble, GfoEvObj {
}
return (Xow_domain_itm[])rv.To_ary_and_clear(Xow_domain_itm.class);
}
public Xows_page Special__clone() {return this;}
}

@ -192,7 +192,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Xoae_page page = Xoae_page.New_test(wiki, ttl);
// byte[] url_bry = Bry_.new_a7("http://en.wikipedia.org/wiki/Special:Search/" + ttl_str + args_str);
// Xoa_url url = wiki.Appe().Url_parser().Parse(url_bry);
// search_mgr.Special_gen(url, page, wiki, ttl);
// search_mgr.Special__gen(url, page, wiki, ttl);
// Tfds.Eq_str_lines(expd_html, String_.new_u8(page.Root().Data_htm()));
// }
// public void Test_search2(byte match_tid, String ttl_str, int page_idx, byte sort_tid, params String[] expd_ary) {
@ -202,7 +202,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Xoa_url url = url_parser.Parse(url_raw);
// Xoa_ttl ttl = Xoa_ttl.parse(wiki, url_raw);
// Xoae_page page = wiki.Ctx().Page();
// search_mgr.Special_gen(url, page, wiki, ttl);
// search_mgr.Special__gen(url, page, wiki, ttl);
// Xosrh_rslt_grp cur_grp = search_mgr.Cur_grp();
// bfr.Mkr_rls();
// Tfds.Eq_ary(expd_ary, Search_itms_to_int_ary(cur_grp));

@ -0,0 +1,25 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.specials.*;
public class Xoa_special_regy {
private final Ordered_hash hash = Ordered_hash_.New_bry(); // NOTE: case-sensitive; case-insensitive requires lang
public void Add(Xows_page page) {hash.Add(page.Special__meta().Key_bry(), page);}
public void Add_many(Xows_page... ary) {for (Xows_page itm : ary) Add(itm);}
public Xows_page Get_by_or_null(byte[] key) {return (Xows_page)hash.Get_by(key);}
}

@ -15,24 +15,24 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.wikis.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
package gplx.xowa.addons.apps.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.core.net.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.specials.*;
import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.file_browsers.*;
import gplx.xowa.htmls.*;
import gplx.xowa.wikis.*;
import gplx.xowa.langs.specials.*;
public class Xosp_special_mgr {
private final Xowv_wiki wiki;
private final Hash_adp_bry hash;
// private final Xowv_wiki wiki;
private final Hash_adp_bry hash;
public Xosp_special_mgr(Xowv_wiki wiki) {
this.wiki = wiki;
// hash.Add_str_obj(Xows_special_meta_.Key__statistics , page_statistics);
// this.wiki = wiki;
// hash.Add_str_obj(Xows_special_meta_.Ttl__statistics , page_statistics);
this.hash = Hash_adp_bry.cs();
}
public void Get_by_ttl(Xoh_page rv, Gfo_url url, Xoa_ttl ttl) {
Xosp_fbrow_rslt rslt = Xosp_fbrow_special.Gen(url.Qargs(), wiki.Appv().Wiki_mgr());
rv.Init(wiki, null, ttl, -1);
rv.Body_(rslt.Html_body());
rv.Html_head_xtn_(rslt.Html_head());
// Xosp_fbrow_rslt rslt = Xosp_fbrow_special.Gen(url.Qargs(), wiki.Appv().Wiki_mgr());
// rv.Init(wiki, null, ttl, -1);
// rv.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_find_.Find_fwd(ttl.Page_txt_wo_qargs(), Xoa_ttl.Subpage_spr); // check for slash
@ -48,7 +48,7 @@ public class Xosp_special_mgr {
if (o != null) {
// Xows_page special = (Xows_page)o;
// page.Revision_data().Modified_on_(DateAdp_.Now());
// special.Special_gen(wiki, page, url, ttl);
// special.Special__gen(wiki, page, url, ttl);
}
}
}

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.addons.builds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.builds.*;
import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.addons.builds.files.cmds.*;
public class Xoax_builds_files_addon implements Xoax_addon_itm, Xoax_addon_bldr {
public class Xoax_builds_files_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr {
public Xob_cmd[] Cmds_ary() {
return new Xob_cmd[]
{ Xobldr__lnki_temp__create.Prototype

@ -339,7 +339,7 @@ public class Xobldr__fsdb_db__create_data extends Xob_cmd__base implements Xob_c
public static final String BLDR_CMD_KEY = "file.fsdb_make";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__fsdb_db__create_data(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__fsdb_db__create_data(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__fsdb_db__create_data(bldr, wiki);}
public static Fsdb_db_mgr new_src_bin_db_mgr(Xow_wiki wiki, String version) {
String domain_str = wiki.Domain_str();

@ -118,5 +118,5 @@ public class Xobldr__fsdb_db__create_orig extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.orig_reg";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__fsdb_db__create_orig(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__fsdb_db__create_orig(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__fsdb_db__create_orig(bldr, wiki);}
}

@ -119,5 +119,5 @@ public class Xobldr__image__create extends Xob_itm_dump_base implements Xob_cmd,
public static final String BLDR_CMD_KEY = "wiki.image";
public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__image__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__image__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__image__create(bldr, wiki);}
}

@ -29,5 +29,5 @@ public class Xobldr__lnki_regy__create extends Xob_cmd__base implements Xob_cmd
public static final String BLDR_CMD_KEY = "file.lnki_regy";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__lnki_regy__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__lnki_regy__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__lnki_regy__create(bldr, wiki);}
}

@ -36,7 +36,7 @@ public class Xobldr__lnki_temp__create extends Xob_dump_mgr_base implements gplx
@Override public byte Init_redirect() {return Bool_.N_byte;} // lnki_temp does not look at redirect pages
@Override public int[] Init_ns_ary() {return ns_ids;} private int[] ns_ids = Int_.Ary(Xow_ns_.Tid__main);
@Override protected void Init_reset(Db_conn conn) {
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg");
Db_cfg_tbl cfg_tbl = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(conn);
cfg_tbl.Delete_all();
invoke_wkr.Init_reset();
property_wkr.Init_reset();
@ -160,7 +160,7 @@ public class Xobldr__lnki_temp__create extends Xob_dump_mgr_base implements gplx
public static final String BLDR_CMD_KEY = "file.lnki_temp";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__lnki_temp__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__lnki_temp__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__lnki_temp__create(bldr, wiki);}
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();

@ -44,5 +44,5 @@ public class Xobldr__orig_regy__create extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.orig_regy";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__orig_regy__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__orig_regy__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__orig_regy__create(bldr, wiki);}
}

@ -158,5 +158,5 @@ public class Xobldr__page_file_map__create extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.page_file_map.create";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__page_file_map__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__page_file_map__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__page_file_map__create(bldr, wiki);}
}

@ -48,5 +48,5 @@ public class Xobldr__page_regy__create extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.page_regy";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__page_regy__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__page_regy__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__page_regy__create(bldr, wiki);}
}

@ -29,7 +29,7 @@ public class Xobldr__redirect__create extends Xob_dump_mgr_base {
@Override public int[] Init_ns_ary() {return Int_.Ary(Xow_ns_.Tid__file);} // restrict to file ns
@Override public byte Init_redirect() {return Bool_.Y_byte;} // restrict to redirects
@Override protected void Init_reset(Db_conn conn) {
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg");
Db_cfg_tbl cfg_tbl = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(conn);
cfg_tbl.Delete_all();
conn.Exec_sql("DELETE FROM " + Xob_redirect_tbl.Tbl_name);
}
@ -61,5 +61,5 @@ public class Xobldr__redirect__create extends Xob_dump_mgr_base {
public static final String BLDR_CMD_KEY = "wiki.redirect";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__redirect__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__redirect__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__redirect__create(bldr, wiki);}
}

@ -40,5 +40,5 @@ public class Xobldr__text_db__drop_page extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "wiki.page_dump.drop";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__text_db__drop_page(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__text_db__drop_page(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__text_db__drop_page(bldr, wiki);}
}

@ -42,5 +42,5 @@ public class Xobldr__text_db__make_page extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "wiki.page_dump.make";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__text_db__make_page(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__text_db__make_page(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__text_db__make_page(bldr, wiki);}
}

@ -33,5 +33,5 @@ public class Xobldr__xfer_regy__create extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.xfer_regy";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__xfer_regy__create(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_regy__create(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_regy__create(bldr, wiki);}
}

@ -66,5 +66,5 @@ public class Xobldr__xfer_regy__update_downloaded extends Xob_cmd__base implemen
public static final String BLDR_CMD_KEY = "file.xfer_regy_update";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__xfer_regy__update_downloaded(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_regy__update_downloaded(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_regy__update_downloaded(bldr, wiki);}
}

@ -104,5 +104,5 @@ public class Xobldr__xfer_temp__insert_orig extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.xfer_temp.orig";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__xfer_temp__insert_orig(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_temp__insert_orig(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_temp__insert_orig(bldr, wiki);}
}

@ -77,5 +77,5 @@ public class Xobldr__xfer_temp__insert_thm extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.xfer_temp.thumb";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__xfer_temp__insert_thm(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_temp__insert_thm(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__xfer_temp__insert_thm(bldr, wiki);}
}

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.addons.builds.pagelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.builds.*;
import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.addons.builds.pagelinks.bldrs.*;
public class Xoax_builds_pagelinks_addon implements Xoax_addon_itm, Xoax_addon_bldr {
public class Xoax_builds_pagelinks_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr {
public Xob_cmd[] Cmds_ary() {
return new Xob_cmd[]
{ Pglnk_bldr_cmd.Prototype

@ -74,5 +74,5 @@ public class Pglnk_bldr_cmd extends Xob_sql_dump_base implements Sql_file_parser
public static final String BLDR_CMD_KEY = "wiki.page_link";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Pglnk_bldr_cmd(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Pglnk_bldr_cmd(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Pglnk_bldr_cmd(bldr, wiki);}
}

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.addons.builds.utils_rankings; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.builds.*;
import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.addons.builds.utils_rankings.bldrs.*;
public class Xoax_builds_utils_rankings_addon implements Xoax_addon_itm, Xoax_addon_bldr {
public class Xoax_builds_utils_rankings_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr {
public Xob_cmd[] Cmds_ary() {
return new Xob_cmd[]
{ Sqlite_percentile_cmd.Prototype

@ -86,5 +86,5 @@ public class Sqlite_percentile_cmd extends Xob_cmd__base implements Xob_cmd {
public static final String BLDR_CMD_KEY = "util.sqlite.normalize";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Sqlite_percentile_cmd(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Sqlite_percentile_cmd(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Sqlite_percentile_cmd(bldr, wiki);}
}

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.addons.updates.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.updates.*;
import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.addons.builds.utils_rankings.bldrs.*;
public class Xoax_updates_files_addon implements Xoax_addon_itm, Xoax_addon_bldr {
public class Xoax_updates_files_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr {
public Xob_cmd[] Cmds_ary() {
return new Xob_cmd[]
{ Xobldr__deletion_db__make.Prototype

@ -28,8 +28,8 @@ public class Xobldr__deletion_db__exec extends Xob_cmd__base {
Db_conn conn = Db_conn_bldr.Instance.Get_or_noop(deletion_db_url);
if (conn == Db_conn_.Noop) throw Err_.new_("bldr", "file does not exist", "file", deletion_db_url.Raw());
if (!conn.Meta_tbl_exists("xowa_cfg")) throw Err_.new_("bldr", "xowa_cfg tbl does not exist", "file", deletion_db_url.Raw());
Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg");
Db_cfg_tbl cfg_tbl = gplx.xowa.wikis.data.Xowd_cfg_tbl_.Get_or_null(conn);
if (cfg_tbl == null) throw Err_.new_("bldr", "xowa_cfg tbl does not exist", "file", deletion_db_url.Raw());
byte[] domain_bry = cfg_tbl.Select_bry_or("", Xobldr__deletion_db__make.Cfg__deletion_db__domain, null);
if (domain_bry == null) throw Err_.new_("bldr", "no domain found in deletion db", "file", deletion_db_url.Raw());
this.wiki = bldr.App().Wiki_mgr().Get_by_or_make(domain_bry);
@ -127,7 +127,7 @@ public class Xobldr__deletion_db__exec extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "fsdb.deletion_db.exec";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__deletion_db__exec(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__exec(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__exec(bldr, wiki);}
}
class Xob_img_prune_itm {
public Xob_img_prune_itm(int item_id, boolean item_is_orig) {

@ -69,7 +69,7 @@ public class Xobldr__deletion_db__make extends Xob_cmd__base implements Xob_cmd
public static final String BLDR_CMD_KEY = "file.deletion_db.make";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__deletion_db__make(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__make(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__make(bldr, wiki);}
}
class Xob_delete_regy {
public final String tbl_name = "delete_regy";

@ -59,7 +59,7 @@ public class Xobldr__deletion_db__small_files extends Xob_cmd__base {
public static final String BLDR_CMD_KEY = "file.deletion_db.small_files";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__deletion_db__small_files(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__small_files(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__small_files(bldr, wiki);}
}
class Xobldr__fsdb_db__delete_small_files_ {
public static int[] New_ext_max_ary() {

@ -17,31 +17,79 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.updates.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.updates.*;
import gplx.dbs.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.files.*;
import gplx.langs.mustaches.*;
public class Xobldr__deletion_db__temp extends Xob_cmd__base {
private Io_url template_url, dump_root;
public Xobldr__deletion_db__temp(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);}
@Override public void Cmd_run() {
Mustache_tkn_parser parser = new Mustache_tkn_parser();
Mustache_tkn_itm root = parser.Parse(Io_mgr.Instance.LoadFilBry(template_url));
Mustache_render_ctx ctx = new Mustache_render_ctx();
Bry_bfr bfr = Bry_bfr.new_();
Mustache_bfr mbfr = new Mustache_bfr(bfr);
Xo_page_dump_to_html page_itm = new Xo_page_dump_to_html();
wiki.Init_assert();
gplx.xowa.wikis.data.tbls.Xowd_page_tbl page_tbl = wiki.Data__core_mgr().Db__core().Tbl__page();
Db_conn conn = page_tbl.conn;
Db_rdr rdr = conn.Exec_rdr("SELECT page_id, page_title FROM page WHERE page_namespace = 0;");
Io_url html_dir = wiki.Fsys_mgr().Root_dir().GenSubDir("html");
int count = 0;
Db_rdr rdr = conn.Exec_rdr("SELECT page_id, page_title, page_touched FROM page WHERE page_namespace = 0;");
Xoh_wtr_ctx hctx = Xoh_wtr_ctx.File_dump(Bry_.new_a7("/page/"), Bry_.new_a7(".html"));
while (rdr.Move_next()) {
String page_ttl = rdr.Read_str("page_title");
Xoa_ttl ttl = wiki.Ttl_parse(Bry_.new_u8(page_ttl));
Xoae_page page = wiki.Data_mgr().Load_page_by_ttl(wiki.Utl__url_parser().Parse(Bry_.new_u8(page_ttl)), ttl);
wiki.Parser_mgr().Parse(page, true);
page.Wikie().Html_mgr().Page_wtr_mgr().Page_read_fmtr().Fmt_("<html><head></head><body>~{page_data}</body></html>");
byte[] html_src = page.Wikie().Html_mgr().Page_wtr_mgr().Gen(page, gplx.xowa.wikis.pages.Xopg_page_.Tid_read); // NOTE: must use wiki of page, not of owner tab; DATE:2015-03-05
Io_mgr.Instance.SaveFilBry(Io_url_.new_fil_(html_dir.Gen_sub_path_for_os(page_ttl) + ".html"), html_src);
if (++count > 10) break;
try {
Xoa_ttl ttl = wiki.Ttl_parse(Bry_.new_u8(page_ttl));
DateAdp page_modified_last = DateAdp_.parse_fmt(rdr.Read_str("page_touched"), gplx.xowa.wikis.data.tbls.Xowd_page_tbl.Page_touched_fmt);
Xoae_page page = wiki.Data_mgr().Load_page_by_ttl(wiki.Utl__url_parser().Parse(Bry_.new_u8(page_ttl)), ttl);
wiki.Parser_mgr().Parse(page, true);
page.Wikie().Html_mgr().Page_wtr_mgr().Page_read_fmtr().Fmt_("~{page_data}");
page.Wikie().Html_mgr().Page_wtr_mgr().Wkr(gplx.xowa.wikis.pages.Xopg_page_.Tid_read).Write_body(bfr, hctx, page);
byte[] html_src = bfr.To_bry_and_clear();//page.Wikie().Html_mgr().Page_wtr_mgr().Gen(page, gplx.xowa.wikis.pages.Xopg_page_.Tid_read); // NOTE: must use wiki of page, not of owner tab; DATE:2015-03-05
page_itm.Init(page_ttl, Bry_.Empty, Bry_.Empty, html_src);
root.Render(mbfr, ctx.Init(page_itm));
Io_url dump_fil_url = Io_url_.new_fil_(dump_root.Gen_sub_path_for_os(page_ttl) + ".html");
if (Io_mgr.Instance.QueryFil(dump_fil_url).ModifiedTime().Eq(page_modified_last)) continue;
Io_mgr.Instance.SaveFilBry(dump_fil_url, mbfr.To_bry_and_clear());
Io_mgr.Instance.UpdateFilModifiedTime(dump_fil_url, page_modified_last);
} catch (Exception e) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "err: ~{0}", Err_.Message_gplx_log(e));
}
}
}
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__template_url_)) this.template_url = m.ReadIoUrl("v");
else if (ctx.Match(k, Invk__dump_root_)) this.dump_root = m.ReadIoUrl("v");
else return GfoInvkAble_.Rv_unhandled;
return this;
} private static final String Invk__template_url_ = "template_url_", Invk__dump_root_ = "dump_root_";
public static final String BLDR_CMD_KEY = "file.deletion_db.temp";
public static final String BLDR_CMD_KEY = "html.dump_to_file";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xobldr__deletion_db__temp(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__temp(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xobldr__deletion_db__temp(bldr, wiki);}
}
class Xo_page_dump_to_html implements Mustache_doc_itm {
private String page_title;
private byte[] page_head_extra;
private byte[] page_caption;
private byte[] page_body;
public Xo_page_dump_to_html Init(String page_title, byte[] page_head_extra, byte[] page_caption, byte[] page_body) {
this.page_title = page_title;
this.page_head_extra = page_head_extra;
this.page_caption = page_caption;
this.page_body = page_body;
return this;
}
public boolean Mustache__write(String key, Mustache_bfr mbfr) {
if (String_.Eq(key, "page_title")) mbfr.Add_str_u8(page_title);
else if (String_.Eq(key, "page_head_extra")) mbfr.Add_bry(page_head_extra);
else if (String_.Eq(key, "page_caption")) mbfr.Add_bry(page_caption);
else if (String_.Eq(key, "page_body")) mbfr.Add_bry(page_body);
else return false;
return true;
}
public Mustache_doc_itm[] Mustache__subs(String key) {
return Mustache_doc_itm_.Ary__empty;
}
}

@ -28,6 +28,8 @@ import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wiki
import gplx.xowa.langs.*;
import gplx.xowa.bldrs.wms.*;
import gplx.langs.htmls.encoders.*;
import gplx.xowa.bldrs.*;
import gplx.xowa.addons.*; import gplx.xowa.addons.apps.specials.*;
public class Xoav_app implements Xoa_app, GfoInvkAble {
public Xoav_app(Gfo_usr_dlg usr_dlg, Xoa_app_mode mode, String plat_name, Io_url root_dir, Io_url file_dir, Io_url css_dir) {
Xoa_app_.Usr_dlg_(usr_dlg); this.usr_dlg = usr_dlg; this.mode = mode;
@ -44,44 +46,49 @@ public class Xoav_app implements Xoa_app, GfoInvkAble {
this.user = new Xouv_user("anonymous");
this.api_root = null;
this.site_cfg_mgr = new Xoa_site_cfg_mgr(this);
this.bldr = new Xob_bldr(null);
}
public boolean Tid_is_edit() {return Bool_.N;}
public Xoa_app_mode Mode() {return mode;} private final Xoa_app_mode mode;
public Xou_user User() {return user;} private final Xouv_user user;
public Xoapi_root Api_root() {return api_root;} private final Xoapi_root api_root;
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_app_mode Mode() {return mode;} private final Xoa_app_mode mode;
public Xou_user User() {return user;} private final Xouv_user user;
public Xoapi_root Api_root() {return api_root;} private final Xoapi_root api_root;
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 Xoa_lang_mgr Lang_mgr() {return lang_mgr;} private final Xoa_lang_mgr lang_mgr;
public Xoa_gfs_mgr Gfs_mgr() {return gfs_mgr;} private final Xoa_gfs_mgr gfs_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 final Xoh_href_parser href_parser = new Xoh_href_parser();
public Xoh_href_wtr Html__href_wtr() {return html__href_wtr;} private final Xoh_href_wtr html__href_wtr = new Xoh_href_wtr();
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 Xoh_bridge_mgr Html__bridge_mgr() {return html__bridge_mgr;} private final Xoh_bridge_mgr html__bridge_mgr;
public Xoa_meta_mgr Dbmeta_mgr() {return meta_mgr;} private final Xoa_meta_mgr meta_mgr;
public Gfo_inet_conn Utl__inet_conn() {return inet_conn;} private final Gfo_inet_conn inet_conn = Gfo_inet_conn_.new_();
public Xoa_site_cfg_mgr Site_cfg_mgr() {return site_cfg_mgr;} private final Xoa_site_cfg_mgr site_cfg_mgr;
public Xoa_lang_mgr Lang_mgr() {return lang_mgr;} private final Xoa_lang_mgr lang_mgr;
public Xoa_gfs_mgr Gfs_mgr() {return gfs_mgr;} private final Xoa_gfs_mgr gfs_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 final Xoh_href_parser href_parser = new Xoh_href_parser();
public Xoh_href_wtr Html__href_wtr() {return html__href_wtr;} private final Xoh_href_wtr html__href_wtr = new Xoh_href_wtr();
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 Xoh_bridge_mgr Html__bridge_mgr() {return html__bridge_mgr;} private final Xoh_bridge_mgr html__bridge_mgr;
public Xoa_meta_mgr Dbmeta_mgr() {return meta_mgr;} private final Xoa_meta_mgr meta_mgr;
public Gfo_inet_conn Utl__inet_conn() {return inet_conn;} private final Gfo_inet_conn inet_conn = Gfo_inet_conn_.new_();
public Xoa_site_cfg_mgr Site_cfg_mgr() {return site_cfg_mgr;} private final Xoa_site_cfg_mgr site_cfg_mgr;
public boolean Xwiki_mgr__missing(byte[] domain) {return wiki_mgr.Get_by_or_null(domain) == null;}
public Xoa_sitelink_mgr Xwiki_mgr__sitelink_mgr() {return xwiki_mgr__sitelink_mgr;} private final Xoa_sitelink_mgr xwiki_mgr__sitelink_mgr = new Xoa_sitelink_mgr();
public Xow_xwiki_itm_parser Xwiki_mgr__itm_parser() {return xwiki_mgr__itm_parser;} private final Xow_xwiki_itm_parser xwiki_mgr__itm_parser = new Xow_xwiki_itm_parser();
public Xoa_sitelink_mgr Xwiki_mgr__sitelink_mgr() {return xwiki_mgr__sitelink_mgr;} private final Xoa_sitelink_mgr xwiki_mgr__sitelink_mgr = new Xoa_sitelink_mgr();
public Xow_xwiki_itm_parser Xwiki_mgr__itm_parser() {return xwiki_mgr__itm_parser;} private final Xow_xwiki_itm_parser xwiki_mgr__itm_parser = new Xow_xwiki_itm_parser();
public Xoax_addon_mgr Addon_mgr() {return addon_mgr;} private final Xoax_addon_mgr addon_mgr = new Xoax_addon_mgr();
public Xob_bldr Bldr() {return bldr;} private final Xob_bldr bldr;
public Xoa_special_regy Special_regy() {return special_regy;} private final Xoa_special_regy special_regy = new Xoa_special_regy();
public Xowmf_mgr Wmf_mgr() {return wmf_mgr;} private final Xowmf_mgr wmf_mgr = new Xowmf_mgr();
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 Json_parser Utl__json_parser() {return utl__json_parser;} private final Json_parser utl__json_parser = new Json_parser();
public Json_parser Utl__json_parser() {return utl__json_parser;} private final Json_parser utl__json_parser = new Json_parser();
public boolean Bldr__running() {return bldr__running;} public void Bldr__running_(boolean v) {this.bldr__running = v;} private boolean bldr__running;
public Xop_amp_mgr Utl_amp_mgr() {return utl_amp_mgr;} private Xop_amp_mgr utl_amp_mgr = Xop_amp_mgr.Instance;
public Xol_case_mgr Utl_case_mgr() {return utl_case_mgr;} private Xol_case_mgr utl_case_mgr = Xol_case_mgr_.U8();
// public Gfo_url_encoder Utl_encoder_fsys() {return utl_encoder_fsys;} private Gfo_url_encoder utl_encoder_fsys = Gfo_url_encoder.New_fsys_lnx();
public Gfo_msg_log Utl_msg_log() {return utl_msg_log;} private Gfo_msg_log utl_msg_log;
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 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 Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {throw Err_.new_unimplemented_w_msg("implemented for Xoa_cfg_mgr");}
public void Init_by_app(Io_url user_db_url) {
user.Init_db(this, wiki_mgr, user_db_url);
this.Addon_mgr().Add_dflts_by_app(this).Run_by_app(this);
}
}

@ -18,8 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.apps; import gplx.*; import gplx.xowa.*;
import gplx.xowa.*; import gplx.xowa.langs.cases.*; import gplx.xowa.users.data.*;
import gplx.xowa.wikis.*;
public class Xoav_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble {
private final Xoav_app app; private final Ordered_hash hash = Ordered_hash_.New_bry();
public class Xoav_wiki_mgr implements Xoa_wiki_mgr {
private final Xoav_app app; private final Ordered_hash hash = Ordered_hash_.New_bry();
public Xoav_wiki_mgr(Xoav_app app, Xol_case_mgr case_mgr) {this.app = app;}
public int Count() {return hash.Count();}
public boolean Has(byte[] key) {return hash.Has(key);}
@ -32,34 +32,15 @@ public class Xoav_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble {
}
public Xow_wiki Get_by_or_make_init_n(byte[] key) {return Get_by_or_make_init_y(key);}
public void Add(Xow_wiki wiki) {hash.Add_if_dupe_use_nth(wiki.Domain_bry(), wiki);}
public Xow_wiki Load_by_fil(Io_url fil) {
Io_url wiki_dir = fil.OwnerDir();
Xow_wiki rv = Load(Gen_domain_str(fil.NameOnly()), wiki_dir);
app.User().User_db_mgr().Site_mgr().Import(rv.Domain_str(), rv.Domain_str(), wiki_dir.Raw(), "");
return rv;
}
public Xow_wiki Make(byte[] domain_bry, Io_url wiki_root_dir) {return new Xowv_wiki(app, domain_bry, wiki_root_dir);}
public Xow_wiki Import_by_url(Io_url url) {return Xoa_wiki_mgr_.Import_by_url(app, this, url);}
public void Load_by_user_data() {
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];
Load(itm.Domain(), Io_url_.new_dir_(itm.Path()));
Xow_wiki wiki = Make(Bry_.new_u8(itm.Domain()), Io_url_.new_dir_(itm.Path()));
this.Add(wiki);
}
}
private Xow_wiki Load(String domain_str, Io_url wiki_dir) {
byte[] domain_bry = Bry_.new_u8(domain_str);
Xow_wiki rv = new Xowv_wiki(app, domain_bry, wiki_dir);
hash.Add_if_dupe_use_nth(domain_bry, rv);
return rv;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_import_by_fil)) return Load_by_fil(Io_url_.new_fil_(m.ReadStr("v")));
else return GfoInvkAble_.Rv_unhandled;
}
public static final String Invk_import_by_fil = "import_by_fil";
private static String Gen_domain_str(String file_name) {
int dash_pos = String_.FindFwd(file_name, "-");
if (dash_pos != Bry_find_.Not_found) file_name = String_.Mid(file_name, 0, dash_pos);
return file_name;
}
}

@ -29,34 +29,36 @@ public class Xoa_fsys_mgr implements GfoInvkAble {
this.bin_xowa_dir = bin_any_dir.GenSubDir("xowa");
this.bin_xowa_file_dir = bin_xowa_dir.GenSubDir_nest("file");
this.bin_xtns_dir = bin_xowa_dir.GenSubDir_nest("xtns");
this.bin_addon_dir = bin_xowa_dir.GenSubDir_nest("addon");
this.cfg_app_fil = bin_xowa_dir.GenSubFil_nest("cfg", "app", "xowa.gfs");
this.cfg_lang_core_dir = bin_xowa_dir.GenSubDir_nest("cfg", "lang", "core");
this.cfg_wiki_core_dir = bin_xowa_dir.GenSubDir_nest("cfg", "wiki", "core");
this.cfg_site_meta_fil = bin_xowa_dir.GenSubFil_nest("cfg", "wiki", "site_meta.sqlite3");
this.home_wiki_dir = bin_xowa_dir.GenSubDir_nest("wiki", Xow_domain_itm_.Str__home);
}
public Io_url Root_dir() {return root_dir;} private final Io_url root_dir;
public Io_url Wiki_dir() {return wiki_dir;} private final Io_url wiki_dir;
public Io_url File_dir() {return file_dir;} private final Io_url file_dir;
public Io_url Css_dir() {return css_dir;} private final Io_url css_dir;
public Io_url Bin_plat_dir() {return bin_plat_dir;} private final Io_url bin_plat_dir;
public Io_url Bin_any_dir() {return bin_any_dir;} private final Io_url bin_any_dir;
public Io_url Bin_xowa_dir() {return bin_xowa_dir;} private final Io_url bin_xowa_dir;
public Io_url Bin_xowa_file_dir() {return bin_xowa_file_dir;} private final Io_url bin_xowa_file_dir;
public Io_url Bin_xtns_dir() {return bin_xtns_dir;} private final Io_url bin_xtns_dir;
public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private final Io_url cfg_lang_core_dir;
public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private final Io_url cfg_wiki_core_dir;
public Io_url Cfg_site_meta_fil() {return cfg_site_meta_fil;} private final Io_url cfg_site_meta_fil;
public Io_url Root_dir() {return root_dir;} private final Io_url root_dir;
public Io_url Wiki_dir() {return wiki_dir;} private final Io_url wiki_dir;
public Io_url File_dir() {return file_dir;} private final Io_url file_dir;
public Io_url Css_dir() {return css_dir;} private final Io_url css_dir;
public Io_url Bin_plat_dir() {return bin_plat_dir;} private final Io_url bin_plat_dir;
public Io_url Bin_any_dir() {return bin_any_dir;} private final Io_url bin_any_dir;
public Io_url Bin_xowa_dir() {return bin_xowa_dir;} private final Io_url bin_xowa_dir;
public Io_url Bin_xowa_file_dir() {return bin_xowa_file_dir;} private final Io_url bin_xowa_file_dir;
public Io_url Bin_xtns_dir() {return bin_xtns_dir;} private final Io_url bin_xtns_dir;
public Io_url Bin_addon_dir() {return bin_addon_dir;} private final Io_url bin_addon_dir;
public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private final Io_url cfg_lang_core_dir;
public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private final Io_url cfg_wiki_core_dir;
public Io_url Cfg_site_meta_fil() {return cfg_site_meta_fil;} private final Io_url cfg_site_meta_fil;
public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);}
public Io_url Wiki_css_dir(String wiki) {return css_dir.GenSubDir_nest(wiki, "html");} // EX: /xowa/temp/simple.wikipedia.org/html/xowa_common.css
public Io_url Wiki_file_dir(String wiki) {return file_dir.GenSubDir_nest(wiki);} // EX: /xowa/temp/simple.wikipedia.org/orig/
public Io_url Home_wiki_dir() {return home_wiki_dir;} private final Io_url home_wiki_dir;
public Io_url Cfg_app_fil() {return cfg_app_fil;} private final Io_url cfg_app_fil;
public Io_url Home_wiki_dir() {return home_wiki_dir;} private final Io_url home_wiki_dir;
public Io_url Cfg_app_fil() {return cfg_app_fil;} private final Io_url cfg_app_fil;
public void Init_by_app(GfoInvkAble app_mgr_invk) {this.app_mgr_invk = app_mgr_invk;} private GfoInvkAble app_mgr_invk; // for gfs and app.launcher
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_apps)) return app_mgr_invk;
else if (ctx.Match(k, Invk_root_dir)) return root_dir;
else return GfoInvkAble_.Rv_unhandled;
}
private static final String Invk_apps = "apps", Invk_root_dir = "root_dir";
private static final String Invk_apps = "apps", Invk_root_dir = "root_dir";
}

@ -21,17 +21,17 @@ import gplx.core.primitives.*; import gplx.core.net.*; import gplx.langs.htmls.e
import gplx.xowa.apps.*;
import gplx.xowa.htmls.js.*;
class Http_server_wkr_v2 implements GfoInvkAble {
private final int uid;
private final Http_server_mgr server_mgr;
private final Http_server_wtr server_wtr;
private final Http_client_wtr client_wtr = Http_client_wtr_.new_stream();
private final Http_client_rdr client_rdr = Http_client_rdr_.new_stream();
private final Http_request_parser request_parser;
private final Gfo_url_encoder url_encoder;
private final Xoae_app app;
private final String root_dir_http;
private final byte[] root_dir_fsys;
private final Bry_bfr tmp_bfr = Bry_bfr.new_(64);
private final int uid;
private final Http_server_mgr server_mgr;
private final Http_server_wtr server_wtr;
private final Http_client_wtr client_wtr = Http_client_wtr_.new_stream();
private final Http_client_rdr client_rdr = Http_client_rdr_.new_stream();
private final Http_request_parser request_parser;
private final Gfo_url_encoder url_encoder;
private final Xoae_app app;
private final String root_dir_http;
private final byte[] root_dir_fsys;
private final Bry_bfr tmp_bfr = Bry_bfr.new_(64);
private Socket_adp socket;
private Http_data__client data__client;
public Http_server_wkr_v2(Http_server_mgr server_mgr, int uid){
@ -132,9 +132,9 @@ class Http_server_wkr_v2 implements GfoInvkAble {
rv = Convert_page(rv, root_dir_http , "<<MISSING_WIKI>>");
Xosrv_http_wkr_.Write_response_as_html(client_wtr, app_mode_itm.Tid() == Xoa_app_mode.Itm_file.Tid(), rv);
}
private static final byte[] Key__msg = Bry_.new_a7("msg"), Key__app_mode = Bry_.new_a7("app_mode");
private static final byte[] Key__msg = Bry_.new_a7("msg"), Key__app_mode = Bry_.new_a7("app_mode");
private static final int Tid_post_url_json = 1, Tid_post_url_gfs = 2;
private static final Hash_adp_bry post_url_hash = Hash_adp_bry.ci_a7()
private static final Hash_adp_bry post_url_hash = Hash_adp_bry.ci_a7()
.Add_str_int("/exec/json" , Tid_post_url_json)
.Add_str_int("/exec/gfs" , Tid_post_url_gfs)
;
@ -152,19 +152,20 @@ class Http_server_wkr_v2 implements GfoInvkAble {
else return GfoInvkAble_.Rv_unhandled;
return this;
} public static final String Invk_run = "run";
private static final byte[]
private static final byte[]
Url__home = Bry_.new_a7("/"), Url__fsys = Bry_.new_a7("/fsys/")
, Url__exec = Bry_.new_a7("/exec/"), Url__exec_2 = Bry_.new_a7("/xowa-cmd:")
;
private static final int Url__fsys_len = Url__fsys.length;
private static final int Url__fsys_len = Url__fsys.length;
}
class Xosrv_http_wkr_ {
public static void Write_response_as_html(Http_client_wtr client_wtr, boolean cross_domain, String html) {Write_response_as_html(client_wtr, cross_domain, Bry_.new_u8(html));}
public static void Write_response_as_html(Http_client_wtr client_wtr, boolean cross_domain, byte[] html) {
try{
client_wtr.Write_bry(Rsp__http_ok);
if (cross_domain)
client_wtr.Write_str("Access-Control-Allow-Origin: *\n"); // No 'Access-Control-Allow-Origin' header is present on the requested resource.
// TODO: add command-line argument to allow testing from local file
// if (cross_domain)
// client_wtr.Write_str("Access-Control-Allow-Origin: *\n"); // No 'Access-Control-Allow-Origin' header is present on the requested resource.
client_wtr.Write_bry(Rsp__content_type_html);
client_wtr.Write_bry(Byte_ascii.Nl_bry);
client_wtr.Write_bry(html);
@ -173,7 +174,7 @@ class Xosrv_http_wkr_ {
client_wtr.Rls();
}
}
public static final byte[]
public static final byte[]
Rsp__http_ok = Bry_.new_a7("HTTP/1.1 200 OK:\n")
, Rsp__content_type_html = Bry_.new_a7("Content-Type: text/html; charset=utf-8\n")
;
@ -187,7 +188,7 @@ class Http_file_utl {
Object o = mime_hash.Get_by_mid(ext_bry, bgn, end);
return o == null ? Mime_octet_stream : (byte[])o;
}
private static final byte[]
private static final byte[]
Mime_html = Bry_.new_a7("text/html")
, Mime_jpg = Bry_.new_a7("image/jpeg")
, Mime_png = Bry_.new_a7("image/png")
@ -196,7 +197,7 @@ class Http_file_utl {
, Mime_js = Bry_.new_a7("application/javascript")
, Mime_octet_stream = Bry_.new_a7("application/octet-stream")
;
private static final Hash_adp_bry mime_hash = Hash_adp_bry.ci_a7()
private static final Hash_adp_bry mime_hash = Hash_adp_bry.ci_a7()
.Add_str_obj(".htm" , Mime_html)
.Add_str_obj(".html" , Mime_html)
.Add_str_obj(".jpg" , Mime_jpg)

@ -59,7 +59,7 @@ public class Xob_bldr implements GfoInvkAble {
if (prime == null) throw Err_.new_("bldr", "bldr.cmd does not exists: cmd={0}", key);
byte[] wiki_key = cmd.Get_bry_or_null("wiki");
Xowe_wiki wiki = wiki_key == null ? app.Usere().Wiki() : app.Wiki_mgr().Get_by_or_make(wiki_key);
Xob_cmd clone = prime.Cmd_new(this, wiki);
Xob_cmd clone = prime.Cmd_clone(this, wiki);
int atrs_len = cmd.Len();
for (int j = 0; j < atrs_len; ++j) {
Json_kv atr_kv = cmd.Get_at_as_kv(j);

@ -31,9 +31,9 @@ public class Xob_cmd_mgr implements GfoInvkAble {
public Xob_cmd Get_at(int i) {return (Xob_cmd)list.Get_at(i);}
public Xob_cmd Add(Xob_cmd cmd) {list.Add(cmd); return cmd;}
public GfoInvkAble Add_cmd(Xowe_wiki wiki, String cmd_key) {
Xob_cmd prototype = cmd_regy.Get_or_null(cmd_key);
if (prototype != null) {
Xob_cmd clone = prototype.Cmd_new(bldr, wiki);
Xob_cmd prime = cmd_regy.Get_or_null(cmd_key);
if (prime != null) {
Xob_cmd clone = prime.Cmd_clone(bldr, wiki);
Add(clone);
return clone;
}

@ -20,7 +20,7 @@ import gplx.dbs.*; import gplx.dbs.cfgs.*;
public class Xob_db_file {
Xob_db_file(Io_url url, Db_conn conn) {
this.url = url; this.conn = conn;
this.tbl__cfg = new Db_cfg_tbl(conn, "xowa_cfg");
this.tbl__cfg = gplx.xowa.wikis.data.Xowd_cfg_tbl_.New(conn);
}
public Io_url Url() {return url;} private final Io_url url;
public Db_conn Conn() {return conn;} private final Db_conn conn;

@ -23,7 +23,7 @@ public class Xob_page_wkr_cmd implements Xob_cmd {
private final Xob_bldr bldr; private final Xowe_wiki wiki;
public Xob_page_wkr_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki;}
public String Cmd_key() {return KEY;} public static final String KEY = "dump_mgr";
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public void Cmd_run() {
Xob_page_wkr[] wkr_ary = (Xob_page_wkr[])wkrs.To_ary(Xob_page_wkr.class); int wkr_ary_len = wkr_ary.length;
for (int i = 0; i < wkr_ary_len; i++)

@ -23,7 +23,7 @@ import gplx.xowa.bldrs.wtrs.*;
public class Xob_category_registry_sql implements Xob_cmd {
public Xob_category_registry_sql(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki;} private Xowe_wiki wiki;
public String Cmd_key() {return Xob_cmd_keys.Key_text_cat_core;}
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public void Cmd_end() { // NOTE: placing in end, b/c must run *after* page_sql
// setup
wiki.Html_mgr().Importing_ctgs_(Bool_.Y);

@ -23,7 +23,7 @@ public class Xob_diff_build_cmd implements Xob_cmd {
private int[] db_ids = Int_.Ary_empty; private String bld_name = "all";
public Xob_diff_build_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki;}
public String Cmd_key() {return Xob_cmd_keys.Key_diff_build;}
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public void Cmd_run() {
new Xob_diff_build_wkr(bldr, wiki, prev_url, curr_url, diff_url, commit_interval, new Xowd_tbl_mapr(bld_name, db_ids)).Exec();
}

@ -24,7 +24,7 @@ public abstract class Xob_init_base implements Xob_cmd, GfoInvkAble {
private byte wbase_enabled = Bool_.__byte;
public Xob_init_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.usr_dlg = wiki.Appe().Usr_dlg(); return this;}
public abstract String Cmd_key();
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public abstract void Cmd_ini_wdata(Xob_bldr bldr, Xowe_wiki wiki);
public abstract void Cmd_run_end(Xowe_wiki wiki);
@gplx.Virtual public void Cmd_init(Xob_bldr bldr) { // add other cmds; EX: wikidata

@ -20,7 +20,7 @@ import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.x
public abstract class Xob_term_base implements Xob_cmd, GfoInvkAble {
public Xob_term_base Ctor(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki; return this;} private Xowe_wiki wiki;
public abstract String Cmd_key();
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public void Cmd_init(Xob_bldr bldr) {}
public void Cmd_bgn(Xob_bldr bldr) {}
public void Cmd_run() {}

@ -22,7 +22,7 @@ public class Xob_css_cmd implements Xob_cmd {
private Io_url css_dir; private String css_key;
public Xob_css_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.bldr = bldr; this.wiki = wiki; this.usr_dlg = wiki.Appe().Usr_dlg();}
public String Cmd_key() {return Xob_cmd_keys.Key_text_css;}
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public void Cmd_init(Xob_bldr bldr) {
if (css_dir == null) css_dir = wiki.App().Fsys_mgr().Wiki_css_dir(wiki.Domain_str()); // EX: /xowa/user/anonymous/wiki/en.wikipedia.org
if (css_key == null) css_key = Xowd_css_core_mgr.Key_default;

@ -86,7 +86,7 @@ public class Xob_page_cmd extends Xob_itm_basic_base implements Xob_page_wkr, Gf
Xowd_db_file db_core = db_mgr.Db__core();
db_core.Tbl__site_stats().Update(page_count_main, page_count_all, 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", modified_latest.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time));
db_mgr.Tbl__cfg().Insert_str(Xow_cfg_consts.Grp__wiki_init, Xow_cfg_consts.Key__init__modified_latest, modified_latest.XtoStr_fmt(DateAdp_.Fmt_iso8561_date_time));
if (idx_mode.Tid_is_end()) page_core_tbl.Create_index();
if (redirect_id_enabled) {
redirect_tbl.Conn().Txn_end();

@ -36,5 +36,5 @@ public class Xob_alert_cmd extends Xob_cmd__base implements Xob_cmd {
public static final String BLDR_CMD_KEY = "ui.alert";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Xob_alert_cmd(null, null);
@Override public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return new Xob_alert_cmd(bldr, wiki);}
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xob_alert_cmd(bldr, wiki);}
}

@ -21,7 +21,7 @@ import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.dbs.*;
public class Xob_exec_sql_cmd implements Xob_cmd {
private Xowe_wiki wiki; private int file_idx = -1; private String sql;
public Xob_exec_sql_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki;}
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public String Cmd_key() {return Xob_cmd_keys.Key_exec_sql;}
public void Cmd_run() {
Xoae_app app = wiki.Appe();

@ -24,7 +24,7 @@ public class Xob_site_meta_cmd implements Xob_cmd {
private final Xob_bldr bldr;
private String[] wikis; private Io_url db_url; private DateAdp cutoff_time;
public Xob_site_meta_cmd(Xob_bldr bldr, Xow_wiki wiki) {this.bldr = bldr;}
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public String Cmd_key() {return Xob_cmd_keys.Key_site_meta;}
public void Cmd_run() {
Xoa_app app = bldr.App();

@ -23,7 +23,7 @@ public class Xob_xml_dumper_cmd implements Xob_cmd {
private final Xob_xml_dumper xml_dumper = new Xob_xml_dumper(); private int commit_interval = 1000;
private Io_url dump_url;
public Xob_xml_dumper_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.wiki = wiki; this.usr_dlg = wiki.Appe().Usr_dlg();}
public Xob_cmd Cmd_new(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return null;}
public String Cmd_key() {return Xob_cmd_keys.Key_util_xml_dump;}
public void Cmd_init(Xob_bldr bldr) {
dump_url = wiki.Fsys_mgr().Root_dir().GenSubFil(wiki.Domain_str() + "-dump.xml");

@ -119,8 +119,8 @@ public class Xoi_cmd_mgr implements GfoInvkAble {
}
public static final String[] Wiki_cmds_valid = new String[] {Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_unzip.KEY_dump, Xoi_cmd_wiki_import.KEY, Xoi_cmd_wiki_zip.KEY, Xoi_cmd_category2_build.KEY, Xoi_cmd_category2_page_props.KEY_category2, Xoi_cmd_category2_categorylinks.KEY_category2};
public static final String Wiki_cmd_custom = "wiki.custom", Wiki_cmd_dump_file = "wiki.dump_file";
public Gfo_thread_cmd Cmd_add(GfoMsg m) {Gfo_thread_cmd rv = Cmd_new(m); cmds.Add(rv); return rv;}
Gfo_thread_cmd Cmd_new(GfoMsg m) {
public Gfo_thread_cmd Cmd_add(GfoMsg m) {Gfo_thread_cmd rv = Cmd_clone(m); cmds.Add(rv); return rv;}
Gfo_thread_cmd Cmd_clone(GfoMsg m) {
String cmd_key = m.ReadStr("v");
if (String_.Eq(cmd_key, Gfo_thread_cmd_download.KEY)) return new Gfo_thread_cmd_download().Init("downloading", m.ReadStr("src"), Bry_fmtr_eval_mgr_.Eval_url(app.Url_cmd_eval(), m.ReadBry("trg"))).Url_eval_mgr_(app.Url_cmd_eval()).Owner_(this).Ctor(app.Usr_dlg(), app.Gui_mgr().Kit());
else if (String_.Eq(cmd_key, Gfo_thread_cmd_unzip.KEY)) return new Gfo_thread_cmd_unzip().Url_eval_mgr_(app.Url_cmd_eval()).Owner_(this).Init(app.Usr_dlg(), app.Gui_mgr().Kit(), app.Prog_mgr().App_decompress_bz2(), app.Prog_mgr().App_decompress_zip(), app.Prog_mgr().App_decompress_gz(), Bry_fmtr_eval_mgr_.Eval_url(app.Url_cmd_eval(), m.ReadBry("src")), Bry_fmtr_eval_mgr_.Eval_url(app.Url_cmd_eval(), m.ReadBry("trg")));

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

Loading…
Cancel
Save