diff --git a/150_gfui/src_210_lyt/gplx/gfui/GftBand_tst.java b/150_gfui/src_210_lyt/gplx/gfui/GftBand_tst.java
index 7bd58c6e0..d75464e75 100644
--- a/150_gfui/src_210_lyt/gplx/gfui/GftBand_tst.java
+++ b/150_gfui/src_210_lyt/gplx/gfui/GftBand_tst.java
@@ -21,19 +21,19 @@ public class GftBand_tst {
@Before public void setup() {
fx.Clear().ini_OwnerSize(200, 400);
} GftGrid_fx fx = new GftGrid_fx();
- @Test public void Bands_1() {
+ @Test public void Bands_1() {
fx .ini_AddItms(2)
.ini_Set(0, GftBand.new_().Cells_num_(2))
.run()
.tst_Filter(0, 1).tst_X(0, 100).tst_W_all(100).tst_H_all(20).tst_Y_all(0);
}
- @Test public void Bands_1_half() { // only add 1 to 2 cell-band
+ @Test public void Bands_1_half() { // only add 1 to 2 cell-band
fx .ini_AddItms(1)
.ini_Set(0, GftBand.new_().Cells_num_(2))
.run()
.tst_Filter(0).tst_X(0).tst_W(100).tst_H(20).tst_Y(0);
}
- @Test public void Bands_2() { // put cells 2, 3 on band 1
+ @Test public void Bands_2() { // put cells 2, 3 on band 1
fx .ini_AddItms(4)
.ini_Set(0, GftBand.new_().Cells_num_(2))
.ini_Set(1, GftBand.new_().Cells_num_(2))
@@ -41,43 +41,43 @@ public class GftBand_tst {
.tst_Filter(0, 1).tst_X(0, 100).tst_W_all(100).tst_H_all(20).tst_Y_all(0)
.tst_Filter(2, 3).tst_X(0, 100).tst_W_all(100).tst_H_all(20).tst_Y_all(20); // put on 2nd row
}
- @Test public void Pct_one() {
+ @Test public void Pct_one() {
fx .ini_AddItms(1)
.ini_Set(0, GftBand.new_().Cell_pct_(50))
.run()
.tst_Filter(0).tst_X(0).tst_W(100).tst_H_all(20).tst_Y_all(0);
}
- @Test public void Pct_many() {
+ @Test public void Pct_many() {
fx .ini_AddItms(3)
.ini_Set(0, GftBand.new_().Cell_pct_(20).Cell_pct_(70).Cell_pct_(10))
.run()
.tst_Filter(0, 2).tst_W(40, 140, 20).tst_X(0, 40, 180).tst_H_all(20).tst_Y_all(0);
}
- @Test public void Mix_pctAtEnd() {
+ @Test public void Mix_pctAtEnd() {
fx .ini_AddItms(2)
.ini_Set(0, GftBand.new_().Cell_abs_(60).Cell_pct_(100))
.run()
.tst_Filter(0, 1).tst_X(0, 60).tst_W(60, 140).tst_H_all(20).tst_Y_all(0);
}
- @Test public void Mix_pctAtBgn() {
+ @Test public void Mix_pctAtBgn() {
fx .ini_AddItms(2)
.ini_Set(0, GftBand.new_().Cell_pct_(100).Cell_abs_(60))
.run()
.tst_Filter(0, 1).tst_X(0, 140).tst_W(140, 60).tst_H_all(20).tst_Y_all(0);
}
- @Test public void Mix_pctAtMid() {
+ @Test public void Mix_pctAtMid() {
fx .ini_AddItms(3)
.ini_Set(0, GftBand.new_().Cell_abs_(60).Cell_pct_(100).Cell_abs_(40))
.run()
.tst_Filter(0, 2).tst_X(0, 60, 160).tst_W(60, 100, 40).tst_H_all(20).tst_Y_all(0);
}
- @Test public void Height_pct() {
+ @Test public void Height_pct() {
fx .ini_AddItms(1)
.ini_Set(0, GftBand.new_().Cell_pct_(100).Len1_pct_(100))
.run()
.tst_Filter(0).tst_X(0).tst_W(200).tst_H_all(400).tst_Y_all(0);
}
- @Test public void Height_mix() {
+ @Test public void Height_mix() {
fx .ini_AddItms(3)
.ini_Set(0, GftBand.new_().Cells_num_(1).Len1_abs_( 60))
.ini_Set(1, GftBand.new_().Cells_num_(1).Len1_pct_(100))
@@ -87,14 +87,14 @@ public class GftBand_tst {
.tst_Filter(1).tst_H(320).tst_Y_all( 60).tst_X(0).tst_W(200)
.tst_Filter(2).tst_H( 20).tst_Y_all(380).tst_X(0).tst_W(200);
}
- @Test public void RevDir() {
+ @Test public void RevDir() {
fx .ini_AddItms(2).ini_BandDir(DirInt.Bwd)
.ini_Set(0, 1, GftBand.new_().Cells_num_(1).Len1_abs_(20))
.run()
.tst_Filter(0).tst_W(200).tst_H(20).tst_X(0).tst_Y(380)
.tst_Filter(1).tst_W(200).tst_H(20).tst_X(0).tst_Y(360);
}
- @Test public void SubLyts() {
+ @Test public void SubLyts() {
fx .ini_AddItms(2).ini_AddLyts(2)
.ini_Lyt(0).ini_Set(0, GftBand.new_().Cells_num_(1).Len1_pct_(100))
.ini_Lyt(1).ini_Set(0, GftBand.new_().Cells_num_(1).Len1_abs_( 20)).ini_BandDir(DirInt.Bwd)
@@ -102,7 +102,7 @@ public class GftBand_tst {
.tst_Filter(0).tst_W(200).tst_H(400).tst_X(0).tst_Y( 0)
.tst_Filter(1).tst_W(200).tst_H( 20).tst_X(0).tst_Y(380);
}
- @Test public void Var() {
+ @Test public void Var() {
fx .ini_AddItms(2)
.ini_ItmWidth(0, 30).ini_ItmWidth(1, 40)
.ini_Set(0, GftBand.new_().Cells_var_(2))
diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java
index 4379195b9..af15e90b4 100644
--- a/400_xowa/src/gplx/xowa/Xoa_app_.java
+++ b/400_xowa/src/gplx/xowa/Xoa_app_.java
@@ -24,7 +24,7 @@ public class Xoa_app_ {
boot_mgr.Run(args);
}
public static final String Name = "xowa";
- public static final String Version = "1.10.4.1";
+ public static final String Version = "1.11.1.1";
public static String Build_date = "2012-12-30 00:00:00";
public static String Op_sys;
public static String User_agent = "";
diff --git a/400_xowa/src/gplx/xowa/apps/ttls/Xoa_ttl_parser.java b/400_xowa/src/gplx/xowa/apps/ttls/Xoa_ttl_parser.java
new file mode 100644
index 000000000..d03417f52
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/apps/ttls/Xoa_ttl_parser.java
@@ -0,0 +1,23 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.apps.ttls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*;
+public interface Xoa_ttl_parser {
+ Xoa_ttl Ttl_parse(byte[] ttl);
+ Xoa_ttl Ttl_parse(int ns_id, byte[] ttl);
+ Xow_ns_mgr Ns_mgr();
+}
diff --git a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java
index 797f5d1c6..5b913a630 100644
--- a/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java
+++ b/400_xowa/src/gplx/xowa/dbs/Xodb_load_mgr_sql.java
@@ -31,7 +31,7 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr {
public void Load_init(Xow_wiki wiki) {
Load_init_cfg(wiki);
db_mgr.Tbl_site_stats().Select(wiki);
- db_mgr.Tbl_xowa_ns().Load(wiki.Ns_mgr());
+ db_mgr.Tbl_xowa_ns().Select_all(wiki.Ns_mgr());
}
private void Load_init_cfg(Xow_wiki wiki) {
String_obj_ref version_val = String_obj_ref.null_();
diff --git a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java
index 5a4282e7c..e1be40c04 100644
--- a/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java
+++ b/400_xowa/src/gplx/xowa/dbs/tbls/Xodb_xowa_ns_tbl.java
@@ -18,18 +18,7 @@ along with this program. If not, see .
package gplx.xowa.dbs.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.dbs.*;
import gplx.dbs.*;
public class Xodb_xowa_ns_tbl {
- public void Provider_(Db_provider provider) {this.provider = provider;} Db_provider provider;
- public int Select_ns_count(int ns_id) {
- Db_qry_select qry = Db_qry_.select_val_(Tbl_name, Fld_ns_count, Db_crt_.eq_(Fld_ns_id, ns_id));
- return Int_.cast_(qry.ExecRdr_val(provider));
- }
- public void Update_ns_count(int ns_id, int ns_count) {
- provider.Exec_qry(Db_qry_.update_common_(Tbl_name
- , Db_crt_.eq_(Fld_ns_id, ns_id)
- , KeyVal_.Ary
- ( KeyVal_.new_(Fld_ns_count, ns_count)
- )));
- }
+ public void Provider_(Db_provider provider) {this.provider = provider;} private Db_provider provider;
public void Insert(Xow_ns_mgr ns_mgr) {
Db_stmt stmt = Db_stmt_.Null;
try {
@@ -48,25 +37,40 @@ public class Xodb_xowa_ns_tbl {
}
} finally {stmt.Rls();}
}
- public void Load(Xow_ns_mgr ns_mgr) {
- ns_mgr.Clear();
- DataRdr rdr = DataRdr_.Null;
+ public void Select_all(Xow_ns_mgr ns_mgr) {
+ Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null;
try {
- rdr = provider.Exec_qry_as_rdr(Db_qry_.select_tbl_(Tbl_name));
- while (rdr.MoveNextPeer()) {
- int ns_id = rdr.ReadInt(Fld_ns_id);
- byte ns_case_match = rdr.ReadByte(Fld_ns_case);
- byte[] ns_name = rdr.ReadBryByStr(Fld_ns_name);
- boolean ns_is_alias = rdr.ReadBool(Fld_ns_is_alias);
+ stmt = Db_stmt_.new_select_as_rdr(provider, Db_qry__select_in_tbl.new_(Tbl_name, Db_qry__select_in_tbl.Where_flds__all, Flds__all));
+ rdr = stmt.Exec_select_as_rdr();
+ ns_mgr.Clear();
+ while (rdr.Move_next()) {
+ int ns_id = rdr.Read_int(0);
+ byte[] ns_name = rdr.Read_bry_by_str(1);
+ byte ns_case_match = rdr.Read_byte(2);
+ int ns_count = rdr.Read_int(3);
+ boolean ns_is_alias = rdr.Read_byte(4) == Bool_.Y_byte;
ns_mgr.Add_new(ns_id, ns_name, ns_case_match, ns_is_alias);
- if (ns_id < 0) continue; // don't load counts for Special / Media
- int ns_count = rdr.ReadInt(Fld_ns_count);
+ if (ns_id < 0) continue; // don't load counts for Special / Media
Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id);
ns.Count_(ns_count);
if (ns_count > 0) ns.Exists_(true); // ns has article; mark it as exists, else Talk tab won't show; DATE:2013-12-04
}
ns_mgr.Init();
- } finally {rdr.Rls();}
+ } finally {rdr.Close(); stmt.Rls();}
}
- public static final String Tbl_name = "xowa_ns", Fld_ns_id = "ns_id", Fld_ns_name = "ns_name", Fld_ns_case = "ns_case", Fld_ns_count = "ns_count", Fld_ns_is_alias = "ns_is_alias";
+ public int Select_ns_count(int ns_id) {
+ Db_qry_select qry = Db_qry_.select_val_(Tbl_name, Fld_ns_count, Db_crt_.eq_(Fld_ns_id, ns_id));
+ return Int_.cast_(qry.ExecRdr_val(provider));
+ }
+ public void Update_ns_count(int ns_id, int ns_count) {
+ provider.Exec_qry(Db_qry_.update_common_(Tbl_name
+ , Db_crt_.eq_(Fld_ns_id, ns_id)
+ , KeyVal_.Ary
+ ( KeyVal_.new_(Fld_ns_count, ns_count)
+ )));
+ }
+ public static final String Tbl_name = "xowa_ns"
+ , Fld_ns_id = "ns_id", Fld_ns_name = "ns_name", Fld_ns_case = "ns_case", Fld_ns_count = "ns_count", Fld_ns_is_alias = "ns_is_alias"
+ ;
+ private static final String[] Flds__all = new String[] {Fld_ns_id, Fld_ns_name, Fld_ns_case, Fld_ns_count, Fld_ns_is_alias};
}
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xoav_app.java b/400_xowa/src/gplx/xowa/hdumps/Xoav_app.java
index 23cff6033..4dca55ae7 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xoav_app.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xoav_app.java
@@ -33,7 +33,7 @@ public class Xoav_app {
public Gfo_usr_dlg Usr_dlg() {return usr_dlg;} private Gfo_usr_dlg usr_dlg;
public Bry_bfr_mkr Utl_bfr_mkr() {return utl_bfr_mkr;} private Bry_bfr_mkr utl_bfr_mkr = new Bry_bfr_mkr();
public Xop_amp_mgr Utl_amp_mgr() {return utl_amp_mgr;} private Xop_amp_mgr utl_amp_mgr = new Xop_amp_mgr();
- public Xol_case_mgr Utl_case_mgr() {return utl_case_mgr;} private Xol_case_mgr utl_case_mgr = new Xol_case_mgr(Gfo_case_mgr_.Tid_utf8);
+ public Xol_case_mgr Utl_case_mgr() {return utl_case_mgr;} private Xol_case_mgr utl_case_mgr = Xol_case_mgr_.Utf8();
public Url_encoder Utl_encoder_fsys() {return utl_encoder_fsys;} private Url_encoder utl_encoder_fsys = Url_encoder.new_fsys_lnx_();
public Gfo_msg_log Utl_msg_log() {return utl_msg_log;} private Gfo_msg_log utl_msg_log;
}
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xoav_wiki_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xoav_wiki_mgr.java
index 49c882c63..468a30a0a 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xoav_wiki_mgr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xoav_wiki_mgr.java
@@ -21,7 +21,10 @@ public class Xoav_wiki_mgr {
private final Xoav_app app; private final OrderedHash hash = OrderedHash_.new_bry_();
private Io_url wiki_root_dir;
public Xoav_wiki_mgr(Xoav_app app, Io_url wiki_root_dir, Xol_case_mgr case_mgr) {this.app = app; this.wiki_root_dir = wiki_root_dir;}
- public Xowv_wiki Get_by_domain(byte[] domain) {return (Xowv_wiki)hash.Fetch(domain);}
+ public Xowv_wiki Get_by_domain(byte[] domain) {
+ Xowv_wiki rv = (Xowv_wiki)hash.Fetch(domain);
+ return rv.Init_assert();
+ }
public void Load_default() {
Io_url[] wiki_dirs = Io_mgr._.QueryDir_args(wiki_root_dir).DirOnly_().ExecAsUrlAry();
for (Io_url wiki_dir : wiki_dirs) {
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java
index db45b58fe..736983df4 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xob_hdump_bldr.java
@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
-import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.core.*;
+import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.dbs.*; import gplx.xowa.dbs.tbls.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.html.hzips.*;
public class Xob_hdump_bldr {
private Xodb_fsys_mgr fsys_mgr; private Xodb_file core_db; private Xodb_xowa_db_tbl db_tbl; private Xodb_xowa_cfg_tbl cfg_tbl; private Db_stmt cfg_update_stmt;
private int hdump_db_id; private long hdump_db_size, hdump_db_max; private Db_provider hdump_db_provider;
@@ -39,10 +39,10 @@ public class Xob_hdump_bldr {
this.Commit();
Db_term(core_db, hdump_db_provider, hdump_db_id);
}
- private Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_mb);
+ private Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_mb); private Xow_hzip_stats hzip_stats = new Xow_hzip_stats();
public void Insert_page(Xoa_page page) {
- hdump_mgr.Write2(tmp_bfr, page);
- hdump_db_size += hdump_save_mgr.Insert_body(page, page.Revision_data().Id());
+ hdump_mgr.Write2(tmp_bfr, page, hzip_stats);
+ hdump_db_size += hdump_save_mgr.Insert_body(page, hzip_stats, page.Revision_data().Id());
if (hdump_db_size > hdump_db_max) {
Db_term(core_db, hdump_db_provider, hdump_db_id);
Db_init(Db_make(fsys_mgr), 0);
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java
index 29fa1f17d..d92158136 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java
@@ -17,9 +17,9 @@ along with this program. If not, see .
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.html.*; import gplx.xowa.gui.*;
-import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.loads.*; import gplx.xowa.hdumps.htmls.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.hzips.*;
+import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.loads.*; import gplx.xowa.hdumps.htmls.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.html.hzips.*;
public class Xodb_hdump_mgr {
- private Xodb_file hdump_db_file; private Xoa_hzip_mgr hzip_mgr;
+ private Xodb_file hdump_db_file; private Xow_hzip_mgr hzip_mgr;
public Xodb_hdump_mgr(Xow_wiki wiki) {
this.wiki = wiki;
load_mgr = new Hdump_load_mgr();
@@ -27,7 +27,7 @@ public class Xodb_hdump_mgr {
text_tbl.Init_by_wiki(wiki);
Xoa_app app = wiki.App();
html_mgr.Init_by_app(app.Usr_dlg(), app.Fsys_mgr(), app.Encoder_mgr().Fsys());
- hzip_mgr = new Xoa_hzip_mgr(app.Usr_dlg(), wiki);
+ hzip_mgr = wiki.Html_mgr().Hzip_mgr();
}
public Xow_wiki Wiki() {return wiki;} private final Xow_wiki wiki;
@gplx.Internal protected Hdump_load_mgr Load_mgr() {return load_mgr;} private Hdump_load_mgr load_mgr;
@@ -59,11 +59,11 @@ public class Xodb_hdump_mgr {
wkr.Write_body(bfr, Xoh_wtr_ctx.Hdump, page);
page.Hdump_data().Body_(bfr.Xto_bry_and_clear());
}
- public void Write2(Bry_bfr tmp_bfr, Xoa_page page) {
+ public void Write2(Bry_bfr tmp_bfr, Xoa_page page, Xow_hzip_stats stats) {
page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last
Xoh_page_wtr_wkr wkr = wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode.Tid_read);
wkr.Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page);
- hzip_mgr.Save(tmp_bfr, page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear());
+ hzip_mgr.Save(tmp_bfr, stats, page.Url().Xto_full_bry(), tmp_bfr.Xto_bry_and_clear());
page.Hdump_data().Body_(tmp_bfr.Xto_bry_and_clear());
hpg.Init(tmp_bfr, page);
} private Hdump_page hpg = new Hdump_page();
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java b/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java
index eed0bf565..68cd39241 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xodbv_dbs_tbl.java
@@ -49,8 +49,3 @@ public class Xodbv_dbs_tbl {
}
//Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(Tbl_name, String_.Ary(Fld_db_id), Fld_db_type, Fld_db_url);
}
-// class Xod_db_fil {
-// public Xod_db_fil(int idx, Io_url url) {this.idx = idx; this.url = url;}
-// public int Idx() {return idx;} private int idx;
-// public Io_url Url() {return url;} private Io_url url;
-// }
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java b/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java
index 5966c3322..d4278ccf9 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xodbv_page_tbl.java
@@ -18,12 +18,6 @@ along with this program. If not, see .
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*;
public class Xodbv_page_tbl {
- public static final String Tbl_name = "page"
- , Fld_page_id = "page_id", Fld_page_ns = "page_namespace", Fld_page_title = "page_title"
- , Fld_page_is_redirect = "page_is_redirect", Fld_page_touched = "page_touched", Fld_page_len = "page_len"
- , Fld_page_random_int = "page_random_int", Fld_page_file_idx = "page_file_idx"
- , Fld_page_html_db_id = "page_html_db_id", Fld_page_redirect_id = "page_redirect_id";
- private static final String[] Select_by_id_flds__hdump = new String[] {Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx, Fld_page_html_db_id, Fld_page_redirect_id};
public boolean Select_by_ttl(Xodb_page rv, Db_provider provider, Xow_ns ns, byte[] ttl) {
Db_rdr rdr = Db_rdr_.Null; Db_stmt stmt = Db_stmt_.Null;
try {
@@ -60,4 +54,12 @@ public class Xodbv_page_tbl {
page.Redirect_id_ (rdr.Read_int(8));
}
private static final String Page_touched_fmt = "yyyyMMddHHmmss";
+ public static final String Tbl_name = "page"
+ , Fld_page_id = "page_id", Fld_page_ns = "page_namespace", Fld_page_title = "page_title"
+ , Fld_page_is_redirect = "page_is_redirect", Fld_page_touched = "page_touched", Fld_page_len = "page_len"
+ , Fld_page_random_int = "page_random_int", Fld_page_file_idx = "page_file_idx"
+ , Fld_page_html_db_id = "page_html_db_id", Fld_page_redirect_id = "page_redirect_id";
+ private static final String[] Select_by_id_flds__hdump = new String[]
+ { Fld_page_id, Fld_page_ns, Fld_page_title, Fld_page_touched, Fld_page_is_redirect, Fld_page_len, Fld_page_file_idx, Fld_page_html_db_id, Fld_page_redirect_id
+ };
}
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xowd_db_tbl_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xowd_db_tbl_mgr.java
index 521343311..e018022e3 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xowd_db_tbl_mgr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xowd_db_tbl_mgr.java
@@ -16,7 +16,9 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
+import gplx.xowa.dbs.tbls.*;
public class Xowd_db_tbl_mgr {
- public Xodbv_page_tbl Tbl__page() {return tbl__page;} private Xodbv_page_tbl tbl__page = new Xodbv_page_tbl();
+ public Xodbv_page_tbl Tbl__page() {return tbl__page;} private final Xodbv_page_tbl tbl__page = new Xodbv_page_tbl();
+ public Xodb_xowa_ns_tbl Tbl__ns() {return tbl__ns;} private final Xodb_xowa_ns_tbl tbl__ns = new Xodb_xowa_ns_tbl();
public Xodbv_dbs_tbl Tbl__dbs_new() {return new Xodbv_dbs_tbl();}
}
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java
index 149c6f48a..9bb41bb5e 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xowd_hdump_mgr.java
@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
-import gplx.intl.*; import gplx.dbs.*;
+import gplx.intl.*; import gplx.dbs.*; import gplx.xowa.html.hzips.*;
import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.loads.*; import gplx.xowa.hdumps.htmls.*; import gplx.xowa.apps.fsys.*;
public class Xowd_hdump_mgr {
private final Xoav_app app; private final Xowv_wiki wiki; private final Xowv_db_mgr wiki_db_mgr;
@@ -35,6 +35,7 @@ public class Xowd_hdump_mgr {
load_mgr.Load2(rv, app.Db_mgr().Get(wiki_db_mgr.Key_by_idx(dbpg.Html_db_id())), dbpg.Id(), ttl);
Bry_bfr bfr = app.Utl_bfr_mkr().Get_m001();
html_body.Init_by_page(wiki.Domain_bry(), rv).Write(bfr);
+ wiki.Hzip_mgr().Load(bfr, ttl_bry, bfr.Xto_bry_and_clear());
rv.Page_body_(bfr.Mkr_rls().Xto_bry_and_clear());
}
private void Select_by_id(Hdump_page hpg, Xodb_page dbpg) {
diff --git a/400_xowa/src/gplx/xowa/hdumps/Xowv_wiki.java b/400_xowa/src/gplx/xowa/hdumps/Xowv_wiki.java
index 3f8b72cf0..bab422cff 100644
--- a/400_xowa/src/gplx/xowa/hdumps/Xowv_wiki.java
+++ b/400_xowa/src/gplx/xowa/hdumps/Xowv_wiki.java
@@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*;
-import gplx.xowa.wikis.xwikis.*; import gplx.xowa.langs.cases.*;
-public class Xowv_wiki {
+import gplx.xowa.wikis.xwikis.*; import gplx.xowa.langs.cases.*; import gplx.xowa.apps.ttls.*; import gplx.xowa.html.hzips.*;
+import gplx.xowa.dbs.tbls.*; import gplx.dbs.*;
+public class Xowv_wiki implements Xoa_ttl_parser {
private Xoav_app app;
public Xowv_wiki(Xoav_app app, String domain_str, Io_url wiki_root_dir) {
this.app = app;
@@ -26,14 +27,29 @@ public class Xowv_wiki {
this.db_mgr = new Xowv_db_mgr(domain_str, wiki_root_dir);
this.hdump_mgr = new Xowd_hdump_mgr(app, this);
this.xwiki_mgr = new Xow_xwiki_mgr();
+ this.hzip_mgr = new Xow_hzip_mgr(app.Usr_dlg(), this);
}
public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry;
public String Domain_str() {return domain_str;} private final String domain_str;
public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr;
public Xowv_db_mgr Db_mgr() {return db_mgr;} private final Xowv_db_mgr db_mgr;
public Xowd_hdump_mgr Hdump_mgr() {return hdump_mgr;} private final Xowd_hdump_mgr hdump_mgr;
+ public Xow_hzip_mgr Hzip_mgr() {return hzip_mgr;} private Xow_hzip_mgr hzip_mgr;
public Xow_xwiki_mgr Xwiki_mgr() {return xwiki_mgr;} private Xow_xwiki_mgr xwiki_mgr;
- public Xoa_ttl Ttl_parse(byte[] ttl) {
- return Xoa_ttl.parse(app.Utl_bfr_mkr(), app.Utl_amp_mgr(), app.Utl_case_mgr(), xwiki_mgr, ns_mgr, app.Utl_msg_log(), ttl, 0, ttl.length);
+ private boolean init_done = false;
+ public Xowv_wiki Init_assert() {
+ if (init_done) return this;
+ init_done = true;
+ Db_provider core_provider = app.Db_mgr().Get(db_mgr.Key__core());
+ Xodb_xowa_ns_tbl ns_tbl = db_mgr.Tbl_mgr().Tbl__ns();
+ ns_tbl.Provider_(core_provider);
+ ns_tbl.Select_all(ns_mgr);
+ return this;
+ }
+ public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse(app.Utl_bfr_mkr(), app.Utl_amp_mgr(), app.Utl_case_mgr(), xwiki_mgr, ns_mgr, app.Utl_msg_log(), ttl, 0, ttl.length);}
+ public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) {
+ Xow_ns ns = ns_mgr.Ids_get_or_null(ns_id);
+ byte[] raw = Bry_.Add(ns.Name_db_w_colon(), ttl);
+ return Xoa_ttl.parse(app.Utl_bfr_mkr(), app.Utl_amp_mgr(), app.Utl_case_mgr(), xwiki_mgr, ns_mgr, app.Utl_msg_log(), raw, 0, raw.length);
}
}
diff --git a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_itm__lnki.java b/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_itm__lnki.java
deleted file mode 100644
index 82576d7c5..000000000
--- a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_itm__lnki.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.hdumps.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
-import gplx.html.*;
-public class Xoa_hzip_itm__lnki {
- private Xoa_hzip_mgr hzip_mgr; private Xow_wiki wiki;
- public Xoa_hzip_itm__lnki(Xoa_hzip_mgr hzip_mgr, Xow_wiki wiki) {this.hzip_mgr = hzip_mgr; this.wiki = wiki;}
- public int Save(Bry_bfr bfr, byte[] src, int src_len, int bgn, int pos) {
- int xtid_bgn = pos + Find_xtid_len; if (!Bry_.Match(src, pos, xtid_bgn, Find_xtid_bry)) return Xoa_hzip_mgr.Unhandled; // next atr should be "xtid='"
- int xtid_end = Bry_finder.Find_fwd(src, Byte_ascii.Apos, xtid_bgn); if (xtid_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.xtid_end_missing", bgn, xtid_bgn);
- Object xtid_obj = Xtids.Get_by_mid(src, xtid_bgn, xtid_end); if (xtid_obj == null) return hzip_mgr.Warn_by_pos("a.xtid_invalid", xtid_bgn, xtid_end);
- byte xtid = ((Byte_obj_val)xtid_obj).Val();
- switch (xtid) {
- case Xtid_ttl_int: return Save_basic(bfr, src, src_len, bgn, xtid_end, Bool_.N);
- case Xtid_capt_int: return Save_basic(bfr, src, src_len, bgn, xtid_end, Bool_.Y);
- default: return hzip_mgr.Warn_by_pos("a.xtid_unknown", xtid_bgn, xtid_end);
- }
- }
- private int Save_basic(Bry_bfr bfr, byte[] src, int src_len, int bgn, int pos, boolean caption) {
- int ttl_bgn = Bry_finder.Find_fwd(src, Find_href_bry, pos, src_len); if (ttl_bgn == Bry_finder.Not_found) return Xoa_hzip_mgr.Unhandled;//hzip_mgr.Warn_by_pos_add_dflt("a.ttl_bgn_missing", bgn, pos);
- ttl_bgn += Find_href_len;
- int ttl_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, ttl_bgn , src_len); if (ttl_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_end_missing", bgn, ttl_bgn);
- Xoa_ttl ttl = Xoa_ttl.parse_(wiki, Bry_.Mid(src, ttl_bgn, ttl_end)); if (ttl == null) return hzip_mgr.Warn_by_pos("a.ttl_invalid", ttl_bgn, ttl_end);
- int a_lhs_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, ttl_end, src_len); if (a_lhs_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_lhs_end_missing", bgn, ttl_end);
- ++a_lhs_end; // skip >
- int a_rhs_bgn = Bry_finder.Find_fwd(src, Find_a_rhs_bgn_bry, a_lhs_end, src_len); if (a_rhs_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_rhs_bgn_missing", bgn, ttl_end);
- if (caption)
- bfr.Add(Xoa_hzip_dict.Bry_lnki_capt);
- else
- bfr.Add(Xoa_hzip_dict.Bry_lnki_ttl);
- bfr.Add_byte((byte)ttl.Ns().Ord()); // ASSUME:NS_MAX_255
- if (caption)
- bfr.Add(ttl.Page_db());
- else {
- int capt_len = a_rhs_bgn - a_lhs_end;
- int ttl_len = ttl_end - ttl_bgn;
- if (capt_len == ttl_len && Bry_.Match(src, ttl_bgn, ttl_end, src, a_lhs_end, a_rhs_bgn))
- bfr.Add(ttl.Page_db());
- else
- bfr.Add_mid(src, a_lhs_end, a_rhs_bgn);
- }
- bfr.Add_byte(Xoa_hzip_dict.Escape);
- if (caption) {
- bfr.Add_mid(src, a_lhs_end, a_rhs_bgn);
- bfr.Add(Xoa_hzip_dict.Bry_a_end);
- }
- return a_rhs_bgn + Find_a_rhs_bgn_len;
- }
- public int Load_ttl(Bry_bfr bfr, byte[] src, int src_len, int bgn, byte tid) {
- byte ns_ord = src[bgn];
- Xow_ns ns = wiki.Ns_mgr().Ords_get_at(ns_ord);
- int ttl_bgn = bgn + 1;
- int ttl_end = Bry_finder.Find_fwd(src, Xoa_hzip_dict.Escape, ttl_bgn, src_len); if (ttl_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_end_missing", bgn, ttl_bgn);
- byte[] ttl_bry = Bry_.Mid(src, ttl_bgn, ttl_end);
- Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ns.Id(), ttl_bry);
- bfr.Add_str("").Add(ttl_bry);
- }
- else {
- int capt_end = Bry_finder.Find_fwd(src, Xoa_hzip_dict.Bry_a_end, rv, src_len); if (capt_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.capt_end_missing", bgn, rv);
- ttl_bry = Bry_.Mid(src, rv, capt_end);
- bfr.Add(Html_utl.Escape_html_as_bry(ttl_bry)).Add_str("'>").Add(ttl_bry);
- rv = capt_end + Xoa_hzip_dict.Bry_a_end.length;
- }
- bfr.Add_str("");
- return rv;
- }
- public void Html(Bry_bfr bfr, boolean caption) {bfr.Add(caption ? Html_capt : Html_ttl);}
- private static final byte[] Html_ttl = Bry_.new_ascii_("")
- ;
- private static final int
- Find_xtid_len = Find_xtid_bry.length
- , Find_href_len = Find_href_bry.length
- , Find_a_rhs_bgn_len = Find_a_rhs_bgn_bry.length
- ;
- private static final byte[]
- Xtid_ttl_bry = Bry_.new_ascii_("a_ttl")
- , Xtid_capt_bry = Bry_.new_ascii_("a_capt")
- ;
- private static final byte
- Xtid_ttl_int = 0
- , Xtid_capt_int = 1
- ;
- private static final Hash_adp_bry Xtids = Hash_adp_bry.cs_()
- .Add_bry_byte(Xtid_ttl_bry , Xtid_ttl_int)
- .Add_bry_byte(Xtid_capt_bry , Xtid_capt_int)
- ;
-}
diff --git a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_itm__lnki_tst.java b/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_itm__lnki_tst.java
deleted file mode 100644
index 2bc801bc5..000000000
--- a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_itm__lnki_tst.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-XOWA: the XOWA Offline Wiki Application
-Copyright (C) 2012 gnosygnu@gmail.com
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, either version 3 of the
-License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-package gplx.xowa.hdumps.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
-import org.junit.*; import gplx.xowa.html.*;
-public class Xoa_hzip_itm__lnki_tst {
- @Before public void init() {fxt.Clear();} private Xoa_hzip_itm__lnki_fxt fxt = new Xoa_hzip_itm__lnki_fxt();
- @Test public void Srl_ttl() {
- byte[][] brys = Bry_.Ary(Xoa_hzip_dict.Bry_lnki_ttl, Bry_.ints_(2), Bry_.new_ascii_("A"), Xoa_hzip_dict.Escape_bry);
- fxt.Test_save(brys, "A");
- fxt.Test_load(brys, "A");
- }
- @Test public void Srl_ttl_alt_case() {
- byte[][] brys = Bry_.Ary(Xoa_hzip_dict.Bry_lnki_ttl, Bry_.ints_(2), Bry_.new_ascii_("a"), Xoa_hzip_dict.Escape_bry);
- fxt.Test_save(brys, "a");
- fxt.Test_load(brys, "a");
- }
- @Test public void Srl_ttl_ns() {
- byte[][] brys = Bry_.Ary(Xoa_hzip_dict.Bry_lnki_ttl, Bry_.ints_(12), Bry_.new_ascii_("A"), Xoa_hzip_dict.Escape_bry);
- fxt.Test_save(brys, "Template:A");
- fxt.Test_load(brys, "Template:A");
- }
- @Test public void Srl_ttl_smoke() {
- byte[][] brys = Bry_.Ary(Bry_.new_ascii_("a_1"), Xoa_hzip_dict.Bry_lnki_ttl, Bry_.ints_(2), Bry_.new_ascii_("A"), Xoa_hzip_dict.Escape_bry, Bry_.new_ascii_("a_2"));
- fxt.Test_save(brys, "a_1Aa_2");
- fxt.Test_load(brys, "a_1Aa_2");
- }
- @Test public void Srl_capt() {
- byte[][] brys = Bry_.Ary(Xoa_hzip_dict.Bry_lnki_capt, Bry_.ints_(2), Bry_.new_ascii_("A"), Xoa_hzip_dict.Escape_bry, Bry_.new_ascii_("A1"), Xoa_hzip_dict.Bry_a_end);
- fxt.Test_save(brys, "A1");
- fxt.Test_load(brys, "A1");
- }
- @Test public void Srl_noop() {
- fxt.Test_save("A", Bry_.new_utf8_("A"));
- }
- @Test public void Html_ttl() {
- fxt.Test_html("[[A]]", "A");
- }
- @Test public void Html_capt() {
- fxt.Test_html("[[A|a]]", "a");
- }
-}
-class Xoa_hzip_itm__lnki_fxt {
- private Bry_bfr bfr = Bry_bfr.reset_(Io_mgr.Len_mb); private Xoa_hzip_mgr hzip_mgr; private Xow_wiki wiki;
- public void Clear() {
- if (hzip_mgr == null) {
- Xoa_app app = Xoa_app_fxt.app_();
- wiki = Xoa_app_fxt.wiki_tst_(app);
- hzip_mgr = new Xoa_hzip_mgr(Gfo_usr_dlg_._, wiki);
- }
- }
- public void Test_save(byte[][] expd_brys, String html) {Test_save(html, expd_brys);}
- public void Test_save(String html, byte[]... expd_brys) {
- byte[] expd = Bry_.Add(expd_brys);
- hzip_mgr.Save(bfr, Bry_.Empty, Bry_.new_utf8_(html));
- Tfds.Eq_ary(expd, bfr.Xto_bry_and_clear());
- }
- public void Test_load(byte[][] src_brys, String expd) {
- byte[] src = Bry_.Add(src_brys);
- hzip_mgr.Load(bfr, Bry_.Empty, src);
- Tfds.Eq_ary(Bry_.new_utf8_(expd), bfr.Xto_bry_and_clear());
- }
- public void Test_html(String html, String expd) {
- Xop_ctx ctx = wiki.Ctx(); Xop_parser parser = wiki.Parser(); Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
- ctx.Para().Enabled_n_();
- ctx.Cur_page().Lnki_redlinks_mgr().Clear();
- byte[] html_bry = Bry_.new_utf8_(html);
- Xop_root_tkn root = ctx.Tkn_mkr().Root(html_bry);
- parser.Parse_page_all_clear(root, ctx, tkn_mkr, html_bry);
- Xoh_wtr_ctx hctx = Xoh_wtr_ctx.Hdump;
- Xoh_html_wtr html_wtr = wiki.Html_mgr().Html_wtr();
- html_wtr.Write_all(bfr, ctx, hctx, html_bry, root);
- Tfds.Eq(expd, bfr.Xto_str_and_clear());
- }
-}
-class Xoa_hzip_itm__href {
- //
- // e // xwiki [[simple:xx
- // "Descriptor Terms (Feature Types)"
- // 255,5,
- public static final byte
- Tid_proto_none = 0
- , Tid_proto_http = 1
- , Tid_proto_https = 2
- , Tid_proto_other = 3
- ;
- public static final byte
- Tid_domain_com = 0
- , Tid_domain_org = 1
- , Tid_domain_net = 2
- , Tid_domain_gov = 3
- , Tid_domain_other = 4
- ;
- public static final byte
- Tid_ext_none = 0
- , Tid_ext_htm = 1
- , Tid_ext_html = 2
- , Tid_ext_php = 3
- , Tid_ext_jsp = 4
- , Tid_ext_asp = 5
- , Tid_ext_aspx = 6
- , Tid_ext_other = 7
- ;
-}
diff --git a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java
index 9e89341f9..a0237217a 100644
--- a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java
+++ b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java
@@ -16,31 +16,31 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.hdumps.saves; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
-import gplx.dbs.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.srls.*;
+import gplx.dbs.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.srls.*; import gplx.xowa.html.hzips.*;
import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.hdumps.loads.*;
public class Hdump_save_mgr {
- private Bry_bfr tmp_bfr = Bry_bfr.reset_(1 * Io_mgr.Len_mb);
+ private Bry_bfr tmp_bfr = Bry_bfr.reset_(1 * Io_mgr.Len_mb); private Xow_hzip_stats hzip_stats = new Xow_hzip_stats();
public Xodb_wiki_page_html_tbl Tbl() {return text_tbl;} public void Tbl_(Xodb_wiki_page_html_tbl v) {text_tbl = v;} private Xodb_wiki_page_html_tbl text_tbl;
public void Update(Xoa_page page) {
int page_id = page.Revision_data().Id();
text_tbl.Delete(page_id);
- this.Insert(page);
+ this.Insert(page, hzip_stats);
}
public void Hdump_stats_enable_y_(Db_provider p) {hdump_stats_tbl = new Hdump_stats_tbl().Provider_(p).Create_tbl();} private Hdump_stats_tbl hdump_stats_tbl;
- public void Insert(Xoa_page page) {
+ public void Insert(Xoa_page page, Xow_hzip_stats hzip_stats) {
int page_id = page.Revision_data().Id();
- Insert_body(page, page_id);
+ Insert_body(page, hzip_stats, page_id);
byte[] redlinks_bry = Write_redlinks(tmp_bfr, page.Hdump_data().Redlink_mgr());
if (redlinks_bry != null) text_tbl.Insert(page_id, Hdump_data_tid.Tid_redlink, redlinks_bry);
byte[] imgs_bry = Write_imgs(tmp_bfr, page.Hdump_data().Data());
if (imgs_bry != null) text_tbl.Insert(page_id, Hdump_data_tid.Tid_img, imgs_bry);
}
- public int Insert_body(Xoa_page page, int page_id) {
+ public int Insert_body(Xoa_page page, Xow_hzip_stats hzip_stats, int page_id) {
hpg.Init(tmp_bfr, page);
srl_mgr.Save(hpg, tmp_bfr);
byte[] body_bry = tmp_bfr.Xto_bry_and_clear();
int insert_len = text_tbl.Insert(page_id, Xodb_wiki_page_html_row.Tid_page, body_bry);
- if (hdump_stats_tbl != null) hdump_stats_tbl.Insert(hpg, page.Root().Root_src().length, body_bry.length, insert_len);
+ if (hdump_stats_tbl != null) hdump_stats_tbl.Insert(hpg, hzip_stats, page.Root().Root_src().length, body_bry.length, insert_len);
return insert_len;
} private Hpg_srl_mgr srl_mgr = Hpg_srl_mgr._i_; private Hdump_page hpg = new Hdump_page();
public static byte[] Write_imgs(Bry_bfr bfr, ListAdp imgs) {
@@ -60,53 +60,3 @@ public class Hdump_save_mgr {
return bfr.Xto_bry_and_clear();
}
}
-class Hdump_stats_tbl {
- private Db_stmt stmt_insert;
- public Db_provider Provider() {return provider;} public Hdump_stats_tbl Provider_(Db_provider v) {this.Rls_all(); provider = v; return this;} private Db_provider provider;
- public Hdump_stats_tbl Create_tbl() {Sqlite_engine_.Tbl_create_and_delete(provider, Tbl_name, Tbl_sql); return this;}
- public void Insert(Hdump_page hpg, int wtxt_len, int row_orig_len, int row_zip_len) {
- Hdump_module_mgr js_mgr = hpg.Module_mgr();
- Insert
- ( hpg.Page_id(), wtxt_len, row_orig_len, row_zip_len
- , Len_or_0(hpg.Page_body()), Len_or_0(hpg.Display_ttl()), Len_or_0(hpg.Content_sub()), Len_or_0(hpg.Sidebar_div())
- , js_mgr.Math_exists(), js_mgr.Imap_exists(), js_mgr.Gallery_packed_exists(), js_mgr.Hiero_exists()
- );
- }
- private int Len_or_0(byte[] bry) {return bry == null ? 0 : bry.length;}
- public void Insert(int page_id, int wtxt_len, int row_orig_len, int row_zip_len, int body_len, int display_ttl_len, int content_sub_len, int sidebar_div_len, boolean js_math, boolean js_imap, boolean js_packed, boolean js_hiero) {
- if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(provider, Tbl_name, Flds__all);
- try {
- stmt_insert.Clear()
- .Val_int_(page_id).Val_int_(wtxt_len).Val_int_(row_orig_len).Val_int_(row_zip_len).Val_int_(body_len).Val_int_(display_ttl_len).Val_int_(content_sub_len).Val_int_(sidebar_div_len)
- .Val_byte_by_bool_(js_math).Val_byte_by_bool_(js_imap).Val_byte_by_bool_(js_packed).Val_byte_by_bool_(js_hiero)
- .Exec_insert();
- }
- catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail
- }
- public void Rls_all() {
- if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;}
- provider = null;
- }
- public static final String Tbl_name = "hdump_stats"
- , Fld_page_id = "page_id", Fld_wtxt_len = "wtxt_len", Fld_row_orig_len = "row_orig_len", Fld_row_zip_len = "row_zip_len"
- , Fld_body_len = "body_len", Fld_display_ttl_len = "display_ttl_len", Fld_content_sub_len = "content_sub_len", Fld_sidebar_div_len = "sidebar_div_len"
- , Fld_js_math = "js_math", Fld_js_imap = "js_imap", Fld_js_packed = "js_packed", Fld_js_hiero = "js_hiero"
- ;
- private static final String[] Flds__all = new String[] {Fld_page_id, Fld_wtxt_len, Fld_row_orig_len, Fld_row_zip_len, Fld_body_len, Fld_display_ttl_len, Fld_content_sub_len, Fld_sidebar_div_len, Fld_js_math, Fld_js_imap, Fld_js_packed, Fld_js_hiero};
- public static final String Tbl_sql = String_.Concat_lines_nl
- ( "CREATE TABLE IF NOT EXISTS hdump_stats"
- , "( page_id integer NOT NULL PRIMARY KEY"
- , ", wtxt_len integer NOT NULL"
- , ", row_orig_len integer NOT NULL"
- , ", row_zip_len integer NOT NULL"
- , ", body_len integer NOT NULL"
- , ", display_ttl_len integer NOT NULL"
- , ", content_sub_len integer NOT NULL"
- , ", sidebar_div_len integer NOT NULL"
- , ", js_math integer NOT NULL"
- , ", js_imap integer NOT NULL"
- , ", js_packed integer NOT NULL"
- , ", js_hiero integer NOT NULL"
- , ");"
- );
-}
diff --git a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_stats_tbl.java b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_stats_tbl.java
new file mode 100644
index 000000000..ed623702f
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_stats_tbl.java
@@ -0,0 +1,94 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.hdumps.saves; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
+import gplx.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.html.hzips.*;
+class Hdump_stats_tbl {
+ private Db_stmt stmt_insert;
+ public Db_provider Provider() {return provider;} public Hdump_stats_tbl Provider_(Db_provider v) {this.Rls_all(); provider = v; return this;} private Db_provider provider;
+ public Hdump_stats_tbl Create_tbl() {Sqlite_engine_.Tbl_create_and_delete(provider, Tbl_name, Tbl_sql); return this;}
+ public void Insert(Hdump_page hpg, Xow_hzip_stats hzip, int wtxt_len, int row_orig_len, int row_zip_len) {
+ Hdump_module_mgr js_mgr = hpg.Module_mgr();
+ Insert
+ ( hpg.Page_id(), wtxt_len, row_orig_len, row_zip_len
+ , Len_or_0(hpg.Page_body()), Len_or_0(hpg.Display_ttl()), Len_or_0(hpg.Content_sub()), Len_or_0(hpg.Sidebar_div())
+ , js_mgr.Math_exists(), js_mgr.Imap_exists(), js_mgr.Gallery_packed_exists(), js_mgr.Hiero_exists()
+ , hzip.A_rhs(), hzip.Lnki_text_n(), hzip.Lnki_text_y()
+ , hzip.Lnke_txt(), hzip.Lnke_brk_text_n(), hzip.Lnke_brk_text_y()
+ );
+ }
+ private int Len_or_0(byte[] bry) {return bry == null ? 0 : bry.length;}
+ public void Insert
+ ( int page_id, int wtxt_len, int row_orig_len, int row_zip_len, int body_len
+ , int display_ttl_len, int content_sub_len, int sidebar_div_len
+ , boolean js_math, boolean js_imap, boolean js_packed, boolean js_hiero
+ , int a_rhs, int lnki_text_n, int lnki_text_y
+ , int lnke_txt, int lnke_brk_text_n, int lnke_brk_text_y
+ ) {
+ if (stmt_insert == null) stmt_insert = Db_stmt_.new_insert_(provider, Tbl_name, Flds__all);
+ try {
+ stmt_insert.Clear()
+ .Val_int_(page_id).Val_int_(wtxt_len).Val_int_(row_orig_len).Val_int_(row_zip_len)
+ .Val_int_(body_len).Val_int_(display_ttl_len).Val_int_(content_sub_len).Val_int_(sidebar_div_len)
+ .Val_byte_by_bool_(js_math).Val_byte_by_bool_(js_imap).Val_byte_by_bool_(js_packed).Val_byte_by_bool_(js_hiero)
+ .Val_int_(a_rhs).Val_int_(lnki_text_n).Val_int_(lnki_text_y)
+ .Val_int_(lnke_txt).Val_int_(lnke_brk_text_n).Val_int_(lnke_brk_text_y)
+ .Exec_insert();
+ }
+ catch (Exception exc) {stmt_insert = null; throw Err_.err_(exc, "stmt failed");} // must reset stmt, else next call will fail
+ }
+ public void Rls_all() {
+ if (stmt_insert != null) {stmt_insert.Rls(); stmt_insert = null;}
+ provider = null;
+ }
+ public static final String Tbl_name = "hdump_stats"
+ , Fld_page_id = "page_id", Fld_wtxt_len = "wtxt_len", Fld_row_orig_len = "row_orig_len", Fld_row_zip_len = "row_zip_len"
+ , Fld_body_len = "body_len", Fld_display_ttl_len = "display_ttl_len", Fld_content_sub_len = "content_sub_len", Fld_sidebar_div_len = "sidebar_div_len"
+ , Fld_js_math = "js_math", Fld_js_imap = "js_imap", Fld_js_packed = "js_packed", Fld_js_hiero = "js_hiero"
+ , Fld_a_rhs = "a_rhs", Fld_lnki_text_n = "lnki_text_n", Fld_lnki_text_y = "lnki_text_y"
+ , Fld_lnke_txt = "lnke_txt", Fld_lnke_brk_text_n = "lnke_brk_text_n", Fld_lnke_brk_text_y = "lnke_brk_text_y"
+ ;
+ private static final String[] Flds__all = new String[]
+ { Fld_page_id, Fld_wtxt_len, Fld_row_orig_len, Fld_row_zip_len
+ , Fld_body_len, Fld_display_ttl_len, Fld_content_sub_len, Fld_sidebar_div_len
+ , Fld_js_math, Fld_js_imap, Fld_js_packed, Fld_js_hiero
+ , Fld_a_rhs, Fld_lnki_text_n, Fld_lnki_text_y
+ , Fld_lnke_txt, Fld_lnke_brk_text_n, Fld_lnke_brk_text_y
+ };
+ public static final String Tbl_sql = String_.Concat_lines_nl
+ ( "CREATE TABLE IF NOT EXISTS hdump_stats"
+ , "( page_id integer NOT NULL PRIMARY KEY"
+ , ", wtxt_len integer NOT NULL"
+ , ", row_orig_len integer NOT NULL"
+ , ", row_zip_len integer NOT NULL"
+ , ", body_len integer NOT NULL"
+ , ", display_ttl_len integer NOT NULL"
+ , ", content_sub_len integer NOT NULL"
+ , ", sidebar_div_len integer NOT NULL"
+ , ", js_math integer NOT NULL"
+ , ", js_imap integer NOT NULL"
+ , ", js_packed integer NOT NULL"
+ , ", js_hiero integer NOT NULL"
+ , ", a_rhs integer NOT NULL"
+ , ", lnki_text_n integer NOT NULL"
+ , ", lnki_text_y integer NOT NULL"
+ , ", lnke_txt integer NOT NULL"
+ , ", lnke_brk_text_n integer NOT NULL"
+ , ", lnke_brk_text_y integer NOT NULL"
+ , ");"
+ );
+}
diff --git a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java
index d85148a46..2159ce640 100644
--- a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java
+++ b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm.java
@@ -22,135 +22,3 @@ public interface Hpg_srl_itm {
int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref);
void Save(Hdump_page hpg, Bry_bfr bfr);
}
-class Hpg_srl_itm_ {
- public static final byte // SERIALIZED
- Tid_body = 0
- , Tid_html_module = 1
- , Tid_display_ttl = 2
- , Tid_content_sub = 3
- , Tid_sidebar_div = 4
- ;
- public static final Hpg_srl_itm[] Itms = new Hpg_srl_itm[] // NOTE: ary_idx must match tid above
- { new Hpg_srl_itm__body()
- , new Hpg_srl_itm__html_module()
- , new Hpg_srl_itm__display_ttl()
- , new Hpg_srl_itm__content_sub()
- , new Hpg_srl_itm__sidebar_div()
- };
- private static final int Base_255_int = 255;
- private static final byte Base_255_byte = (byte)255;
- public static void Save_bin_int_abrv(Bry_bfr bfr, int val_int) { // save int in binary little endian form; range from -2,080,766,977 to 2,147,483,648; 255^4 or 4,228,250,625
- if (val_int == 0) {bfr.Add_byte(Byte_ascii.Nil); return;}
- long val = val_int;
- if (val < 0) val = Int_.MaxValue + -val;
- int count = 0;
- while (val > 0) {
- byte mod = (byte)(val % Base_255_int);
- int adj = 0;
- if (mod == 0) {mod = Base_255_byte; adj = 1;} // if 0, then set byte to 255; also set adj to 1 to properly decrement value
- bfr.Add_byte(mod);
- ++count;
- val = (val - adj) / Base_255_int;
- }
- if (count < 4) bfr.Add_byte(Byte_ascii.Nil);
- }
- public static int Load_bin_int_abrv(byte[] bry, int bry_len, int bgn, Int_obj_ref count_ref) {
- int end = bgn + 4; // read no more than 4 bytes
- int count = 0;
- long rv = 0; int mult = 1;
- for (int i = bgn; i < end; ++i) {
- if (i == bry_len) break;
- else {
- ++count;
- int b = bry[i] & 0xFF; // PATCH.JAVA:need to convert to unsigned byte
- if (b == 0) break;
- rv += (b * mult);
- mult *= Base_255_int;
- }
- }
- if (rv > Int_.MaxValue) {
- rv -= Int_.MaxValue;
- rv *= -1;
- }
- count_ref.Val_(count);
- return (int)rv;
- }
-}
-abstract class Hpg_srl_itm__blob_base implements Hpg_srl_itm {
- public abstract byte Tid();
- public void Save_tid_n_() {save_tid = false;} private boolean save_tid = true;
- public void Save(Hdump_page hpg, Bry_bfr bfr) {
- byte[] bry = Save_itm(hpg); if (bry == null) return;
- int len = bry.length; if (len == 0) return;
- if (save_tid) // body won't save tid
- bfr.Add_byte(this.Tid());
- Hpg_srl_itm_.Save_bin_int_abrv(bfr, len);
- bfr.Add(bry);
- }
- public int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) {
- int itm_len = Hpg_srl_itm_.Load_bin_int_abrv(bry, bry_len, itm_bgn, count_ref); if (itm_len == -1) throw Err_.new_("bry_itm has invalid len: page={0} tid={1}", hpg.Page_id(), this.Tid());
- int data_bgn = itm_bgn + count_ref.Val();
- if (itm_len == 0) return data_bgn;
- int data_end = data_bgn + itm_len;
- byte[] itm_data = Bry_.Mid(bry, data_bgn, data_end);
- this.Load_itm(hpg, itm_data);
- return data_end - itm_bgn;
- }
- public abstract void Load_itm(Hdump_page hpg, byte[] data);
- public abstract byte[] Save_itm(Hdump_page hpg);
-}
-class Hpg_srl_itm__body extends Hpg_srl_itm__blob_base {
- public Hpg_srl_itm__body() {this.Save_tid_n_();}
- @Override public byte Tid() {return Hpg_srl_itm_.Tid_body;}
- @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Page_body();}
- @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Page_body_(data);}
-}
-class Hpg_srl_itm__display_ttl extends Hpg_srl_itm__blob_base {
- @Override public byte Tid() {return Hpg_srl_itm_.Tid_display_ttl;}
- @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Display_ttl();}
- @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Display_ttl_(data);}
-}
-class Hpg_srl_itm__content_sub extends Hpg_srl_itm__blob_base {
- @Override public byte Tid() {return Hpg_srl_itm_.Tid_content_sub;}
- @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Content_sub();}
- @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Content_sub_(data);}
-}
-class Hpg_srl_itm__sidebar_div extends Hpg_srl_itm__blob_base {
- @Override public byte Tid() {return Hpg_srl_itm_.Tid_sidebar_div;}
- @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Sidebar_div();}
- @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Sidebar_div_(data);}
-}
-class Hpg_srl_itm__html_module implements Hpg_srl_itm {
- public byte Tid() {return Hpg_srl_itm_.Tid_html_module;}
- public int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) {
- itm_bgn += 2; // skip bin_int_abrv of [1, 0]
- byte flag = bry[itm_bgn];
- hpg.Module_mgr().Init(Enm_.Has_byte(flag, Tid_math), Enm_.Has_byte(flag, Tid_imap), Enm_.Has_byte(flag, Tid_packed), Enm_.Has_byte(flag, Tid_hiero));
- return 3;
- }
- public void Save(Hdump_page hpg, Bry_bfr bfr) {
- byte flag = Calc_flag(hpg);
- if (flag == 0) return;
- bfr.Add_byte(this.Tid());
- Hpg_srl_itm_.Save_bin_int_abrv(bfr, 1);
- bfr.Add_byte(flag);
- }
- private static byte Calc_flag(Hdump_page hpg) {
- Hdump_module_mgr module_mgr = hpg.Module_mgr();
- return Calc_flag(module_mgr.Math_exists(), module_mgr.Imap_exists(), module_mgr.Gallery_packed_exists(), module_mgr.Hiero_exists());
- }
- public static byte Calc_flag(boolean math, boolean imap, boolean packed, boolean hiero) {
- byte rv = 0;
- if (math) rv = Enm_.Add_byte(rv, Tid_math);
- if (imap) rv = Enm_.Add_byte(rv, Tid_imap);
- if (packed) rv = Enm_.Add_byte(rv, Tid_packed);
- if (hiero) rv = Enm_.Add_byte(rv, Tid_hiero);
- return rv;
- }
- private static final byte // SERIALIZED; only supports 8 different types
- Tid_math = 1
- , Tid_imap = 2
- , Tid_packed = 4
- , Tid_hiero = 8
- ;
-}
diff --git a/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_.java b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_.java
new file mode 100644
index 000000000..a1a09b10b
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/hdumps/srls/Hpg_srl_itm_.java
@@ -0,0 +1,156 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.hdumps.srls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
+import gplx.xowa.hdumps.core.*;
+public class Hpg_srl_itm_ {
+ public static final byte // SERIALIZED
+ Tid_body = 0
+ , Tid_html_module = 1
+ , Tid_display_ttl = 2
+ , Tid_content_sub = 3
+ , Tid_sidebar_div = 4
+ ;
+ public static final Hpg_srl_itm[] Itms = new Hpg_srl_itm[] // NOTE: ary_idx must match tid above
+ { new Hpg_srl_itm__body()
+ , new Hpg_srl_itm__html_module()
+ , new Hpg_srl_itm__display_ttl()
+ , new Hpg_srl_itm__content_sub()
+ , new Hpg_srl_itm__sidebar_div()
+ };
+ private static final int Base_255_int = 255;
+ private static final byte Base_255_byte = (byte)255;
+ public static byte[] Save_bin_int_abrv(int val_int) {
+ Bry_bfr bfr = Bry_bfr.reset_(10);
+ Save_bin_int_abrv(bfr, val_int);
+ return bfr.Xto_bry_and_clear();
+ }
+ public static void Save_bin_int_abrv(Bry_bfr bfr, int val_int) { // save int in binary little endian form; range from -2,080,766,977 to 2,147,483,648; 255^4 or 4,228,250,625
+ if (val_int == 0) {bfr.Add_byte(Byte_ascii.Nil); return;}
+ long val = val_int;
+ if (val < 0) val = Int_.MaxValue + -val;
+ int count = 0;
+ while (val > 0) {
+ byte mod = (byte)(val % Base_255_int);
+ int adj = 0;
+ if (mod == 0) {mod = Base_255_byte; adj = 1;} // if 0, then set byte to 255; also set adj to 1 to properly decrement value
+ bfr.Add_byte(mod);
+ ++count;
+ val = (val - adj) / Base_255_int;
+ }
+ if (count < 4) bfr.Add_byte(Byte_ascii.Nil);
+ }
+ public static int Load_bin_int_abrv(byte[] bry, int bry_len, int bgn, Int_obj_ref count_ref) {
+ int end = bgn + 4; // read no more than 4 bytes
+ int count = 0;
+ long rv = 0; int mult = 1;
+ for (int i = bgn; i < end; ++i) {
+ if (i == bry_len) break;
+ else {
+ ++count;
+ int b = bry[i] & 0xFF; // PATCH.JAVA:need to convert to unsigned byte
+ if (b == 0) break;
+ rv += (b * mult);
+ mult *= Base_255_int;
+ }
+ }
+ if (rv > Int_.MaxValue) {
+ rv -= Int_.MaxValue;
+ rv *= -1;
+ }
+ count_ref.Val_(count);
+ return (int)rv;
+ }
+}
+abstract class Hpg_srl_itm__blob_base implements Hpg_srl_itm {
+ public abstract byte Tid();
+ public void Save_tid_n_() {save_tid = false;} private boolean save_tid = true;
+ public void Save(Hdump_page hpg, Bry_bfr bfr) {
+ byte[] bry = Save_itm(hpg); if (bry == null) return;
+ int len = bry.length; if (len == 0) return;
+ if (save_tid) // body won't save tid
+ bfr.Add_byte(this.Tid());
+ Hpg_srl_itm_.Save_bin_int_abrv(bfr, len);
+ bfr.Add(bry);
+ }
+ public int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) {
+ int itm_len = Hpg_srl_itm_.Load_bin_int_abrv(bry, bry_len, itm_bgn, count_ref); if (itm_len == -1) throw Err_.new_("bry_itm has invalid len: page={0} tid={1}", hpg.Page_id(), this.Tid());
+ int data_bgn = itm_bgn + count_ref.Val();
+ if (itm_len == 0) return data_bgn;
+ int data_end = data_bgn + itm_len;
+ byte[] itm_data = Bry_.Mid(bry, data_bgn, data_end);
+ this.Load_itm(hpg, itm_data);
+ return data_end - itm_bgn;
+ }
+ public abstract void Load_itm(Hdump_page hpg, byte[] data);
+ public abstract byte[] Save_itm(Hdump_page hpg);
+}
+class Hpg_srl_itm__body extends Hpg_srl_itm__blob_base {
+ public Hpg_srl_itm__body() {this.Save_tid_n_();}
+ @Override public byte Tid() {return Hpg_srl_itm_.Tid_body;}
+ @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Page_body();}
+ @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Page_body_(data);}
+}
+class Hpg_srl_itm__display_ttl extends Hpg_srl_itm__blob_base {
+ @Override public byte Tid() {return Hpg_srl_itm_.Tid_display_ttl;}
+ @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Display_ttl();}
+ @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Display_ttl_(data);}
+}
+class Hpg_srl_itm__content_sub extends Hpg_srl_itm__blob_base {
+ @Override public byte Tid() {return Hpg_srl_itm_.Tid_content_sub;}
+ @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Content_sub();}
+ @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Content_sub_(data);}
+}
+class Hpg_srl_itm__sidebar_div extends Hpg_srl_itm__blob_base {
+ @Override public byte Tid() {return Hpg_srl_itm_.Tid_sidebar_div;}
+ @Override public byte[] Save_itm(Hdump_page hpg) {return hpg.Sidebar_div();}
+ @Override public void Load_itm(Hdump_page hpg, byte[] data) {hpg.Sidebar_div_(data);}
+}
+class Hpg_srl_itm__html_module implements Hpg_srl_itm {
+ public byte Tid() {return Hpg_srl_itm_.Tid_html_module;}
+ public int Load(Hdump_page hpg, byte[] bry, int bry_len, int itm_bgn, Int_obj_ref count_ref) {
+ itm_bgn += 2; // skip bin_int_abrv of [1, 0]
+ byte flag = bry[itm_bgn];
+ hpg.Module_mgr().Init(Enm_.Has_byte(flag, Tid_math), Enm_.Has_byte(flag, Tid_imap), Enm_.Has_byte(flag, Tid_packed), Enm_.Has_byte(flag, Tid_hiero));
+ return 3;
+ }
+ public void Save(Hdump_page hpg, Bry_bfr bfr) {
+ byte flag = Calc_flag(hpg);
+ if (flag == 0) return;
+ bfr.Add_byte(this.Tid());
+ Hpg_srl_itm_.Save_bin_int_abrv(bfr, 1);
+ bfr.Add_byte(flag);
+ }
+ private static byte Calc_flag(Hdump_page hpg) {
+ Hdump_module_mgr module_mgr = hpg.Module_mgr();
+ return Calc_flag(module_mgr.Math_exists(), module_mgr.Imap_exists(), module_mgr.Gallery_packed_exists(), module_mgr.Hiero_exists());
+ }
+ public static byte Calc_flag(boolean math, boolean imap, boolean packed, boolean hiero) {
+ byte rv = 0;
+ if (math) rv = Enm_.Add_byte(rv, Tid_math);
+ if (imap) rv = Enm_.Add_byte(rv, Tid_imap);
+ if (packed) rv = Enm_.Add_byte(rv, Tid_packed);
+ if (hiero) rv = Enm_.Add_byte(rv, Tid_hiero);
+ return rv;
+ }
+ private static final byte // SERIALIZED; only supports 8 different types
+ Tid_math = 1
+ , Tid_imap = 2
+ , Tid_packed = 4
+ , Tid_hiero = 8
+ ;
+}
diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java
index 4612ab193..4d8d0597e 100644
--- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java
+++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java
@@ -104,7 +104,6 @@ public class Xoh_html_wtr {
private static final byte[] Bry_hdr_bgn = Bry_.new_ascii_("");
+ bfr.Add_bfr_and_clear(cur);
+ bfr.Add_str("");
+ }
+ public static Hzip_bfr_itm__base new_(Bry_bfr cur, byte[] src, int src_len, int pos) {
+ Hzip_bfr_itm__anchor rv = new Hzip_bfr_itm__anchor();
+ rv.Init(cur);
+ return rv;
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_dict.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_dict.java
similarity index 52%
rename from 400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_dict.java
rename to 400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_dict.java
index 13265eebc..655fae1f1 100644
--- a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_dict.java
+++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_dict.java
@@ -15,20 +15,28 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
-package gplx.xowa.hdumps.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*;
-class Xoa_hzip_dict {// SERIALIZED
+package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
+class Xow_hzip_dict {// SERIALIZED
public static final byte Escape = Byte_.int_(255);
public static final byte[] Escape_bry = Bry_.ints_(255);
public static final byte
- Tid_a_end = 0
- , Tid_lnki_ttl = 1
- , Tid_lnki_capt = 2
- , Tid_lnke = 3 // blog -> 255,4,h,xowa.sourceforge/blog.html,255,blog,255,0
+ Tid_a_rhs = 0
+ , Tid_lnki_text_n = 1
+ , Tid_lnki_text_y = 2
+ , Tid_lnke_txt = 3
+ , Tid_lnke_brk_text_n = 4
+ , Tid_lnke_brk_text_y = 5
+ , Tid_hdr_lhs = 6
+ , Tid_hdr_rhs = 7
;
public static final byte[]
- Bry_a_end = Bry_.ints_(Escape, Tid_a_end)
- , Bry_lnki_ttl = Bry_.ints_(Escape, Tid_lnki_ttl)
- , Bry_lnki_capt = Bry_.ints_(Escape, Tid_lnki_capt)
- , Bry_lnke = Bry_.ints_(Escape, Tid_lnke) // blog -> 255,4,h,xowa.sourceforge/blog.html,255,blog,255,0
+ Bry_a_rhs = Bry_.ints_(Escape, Tid_a_rhs)
+ , Bry_lnki_text_n = Bry_.ints_(Escape, Tid_lnki_text_n)
+ , Bry_lnki_text_y = Bry_.ints_(Escape, Tid_lnki_text_y)
+ , Bry_lnke_txt = Bry_.ints_(Escape, Tid_lnke_txt)
+ , Bry_lnke_brk_text_n = Bry_.ints_(Escape, Tid_lnke_brk_text_n)
+ , Bry_lnke_brk_text_y = Bry_.ints_(Escape, Tid_lnke_brk_text_y)
+ , Bry_hdr_lhs = Bry_.ints_(Escape, Tid_hdr_lhs)
+ , Bry_hdr_rhs = Bry_.ints_(Escape, Tid_hdr_rhs)
;
}
diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java
new file mode 100644
index 000000000..6a69a5700
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor.java
@@ -0,0 +1,159 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
+import gplx.html.*; import gplx.xowa.apps.ttls.*; import gplx.xowa.hdumps.srls.*;
+public class Xow_hzip_itm__anchor {
+ private Xow_hzip_mgr hzip_mgr; private Xoa_ttl_parser ttl_parser; private Byte_obj_ref xtid_ref = Byte_obj_ref.zero_();
+ public Xow_hzip_itm__anchor(Xow_hzip_mgr hzip_mgr, Xoa_ttl_parser ttl_parser) {this.hzip_mgr = hzip_mgr; this.ttl_parser = ttl_parser;}
+ public int Save_a_rhs(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos) {
+ bfr.Add(Xow_hzip_dict.Bry_a_rhs);
+ stats.A_rhs_add();
+ return pos;
+ }
+ public int Save(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos) {
+ int xtid_end = Xow_hzip_xtid.Find_xtid(hzip_mgr, src, src_len, bgn, pos, xtid_ref); if (xtid_end == Xow_hzip_mgr.Unhandled) return Xow_hzip_mgr.Unhandled;
+ byte xtid_val = xtid_ref.Val();
+ switch (xtid_val) {
+ case Xow_hzip_dict.Tid_lnki_text_n:
+ case Xow_hzip_dict.Tid_lnki_text_y: return Save_lnki(bfr, stats, src, src_len, bgn, xtid_end, xtid_val == Xow_hzip_dict.Tid_lnki_text_y);
+ case Xow_hzip_dict.Tid_lnke_txt:
+ case Xow_hzip_dict.Tid_lnke_brk_text_n:
+ case Xow_hzip_dict.Tid_lnke_brk_text_y: return Save_lnke(bfr, stats, src, src_len, bgn, xtid_end, xtid_val);
+ default: return hzip_mgr.Warn_by_pos("a.xtid_unknown", bgn, pos);
+ }
+ }
+ // //
+ public int Save_lnki(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos, boolean caption) {
+ int ttl_bgn = Bry_finder.Find_fwd(src, Find_href_wiki_bry, pos, src_len); if (ttl_bgn == Bry_finder.Not_found) return Xow_hzip_mgr.Unhandled;//hzip_mgr.Warn_by_pos_add_dflt("a.ttl_bgn_missing", bgn, pos);
+ ttl_bgn += Find_href_wiki_len;
+ int ttl_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, ttl_bgn , src_len); if (ttl_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_end_missing", bgn, ttl_bgn);
+ Xoa_ttl ttl = ttl_parser.Ttl_parse(Bry_.Mid(src, ttl_bgn, ttl_end)); if (ttl == null) return hzip_mgr.Warn_by_pos("a.ttl_invalid", ttl_bgn, ttl_end);
+ int a_lhs_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, ttl_end, src_len); if (a_lhs_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_lhs_end_missing", bgn, ttl_end);
+ ++a_lhs_end; // skip >
+ int a_rhs_bgn = Bry_finder.Find_fwd(src, Find_a_rhs_bgn_bry, a_lhs_end, src_len); if (a_rhs_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_rhs_bgn_missing", bgn, ttl_end);
+ if (caption)
+ bfr.Add(Xow_hzip_dict.Bry_lnki_text_y);
+ else
+ bfr.Add(Xow_hzip_dict.Bry_lnki_text_n);
+ bfr.Add_byte((byte)ttl.Ns().Ord()); // ASSUME:NS_MAX_255
+ int ttl_len = ttl_end - ttl_bgn;
+ if (caption) {
+ bfr.Add(ttl.Page_db());
+ bfr.Add_byte(Xow_hzip_dict.Escape);
+ stats.Lnki_text_y_add();
+ return a_lhs_end;
+ }
+ else {
+ int capt_len = a_rhs_bgn - a_lhs_end;
+ if (capt_len == ttl_len && Bry_.Match(src, ttl_bgn, ttl_end, src, a_lhs_end, a_rhs_bgn))
+ bfr.Add(ttl.Page_db());
+ else
+ bfr.Add_mid(src, a_lhs_end, a_rhs_bgn);
+ bfr.Add_byte(Xow_hzip_dict.Escape);
+ stats.Lnki_text_n_add();
+ return a_rhs_bgn + Find_a_rhs_bgn_len;
+ }
+ }
+ public int Save_lnke(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos, byte xtid) {// http://a.org
+ int href_bgn = Bry_finder.Find_fwd(src, Find_href_bry, pos, src_len); if (href_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.href_missing", bgn, pos);
+ href_bgn += Find_href_len;
+ int href_end = Bry_finder.Find_fwd(src, Byte_ascii.Quote, href_bgn, src_len); if (href_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.href_missing", bgn, href_bgn);
+ bfr.Add_byte(Xow_hzip_dict.Escape).Add_byte(xtid);
+ bfr.Add_mid(src, href_bgn, href_end);
+ bfr.Add_byte(Xow_hzip_dict.Escape);
+ switch (xtid) {
+ case Xow_hzip_dict.Tid_lnke_txt: {
+ int a_rhs_bgn = Bry_finder.Find_fwd(src, Find_a_rhs_bgn_bry, href_end, src_len); if (a_rhs_bgn == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_rhs_bgn_missing", bgn, href_end);
+ stats.Lnke_txt_add();
+ return a_rhs_bgn + Find_a_rhs_bgn_len;
+ }
+ case Xow_hzip_dict.Tid_lnke_brk_text_n: {
+ int a_lhs_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, href_end, src_len); if (a_lhs_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_lhs_end_missing", bgn, href_end);
+ int num_bgn = a_lhs_end + 2; // skip >[
+ int num_end = Bry_finder.Find_fwd(src, Byte_ascii.Brack_end, num_bgn, src_len); if (num_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.num_end_missing", bgn, href_end);
+ int num = Bry_.Xto_int_or(src, num_bgn, num_end, -1); if (num == -1) return hzip_mgr.Warn_by_pos_add_dflt("a.num_invalid", num_bgn, num_end);
+ Hpg_srl_itm_.Save_bin_int_abrv(bfr, num);
+ int a_rhs_bgn = num_end + 1;
+ int a_rhs_end = a_rhs_bgn + Find_a_rhs_bgn_len;
+ if (!Bry_.Match(src, a_rhs_bgn, a_rhs_end, Find_a_rhs_bgn_bry)) return hzip_mgr.Warn_by_pos_add_dflt("a.rhs_missing", bgn, href_end);
+ stats.Lnke_brk_text_n_add();
+ return a_rhs_end;
+ }
+ case Xow_hzip_dict.Tid_lnke_brk_text_y: {
+ int a_lhs_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, href_end, src_len); if (a_lhs_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.a_lhs_end_missing", bgn, href_end);
+ stats.Lnke_brk_text_y_add();
+ return a_lhs_end + 1;
+ }
+ default:
+ return hzip_mgr.Warn_by_pos("a.xtid_unknown", bgn, href_end);
+ }
+ }
+ private Int_obj_ref count_ref = Int_obj_ref.zero_();
+ public int Load_lnke(Bry_bfr bfr, byte[] src, int src_len, int href_bgn, byte xtid) {
+ int href_end = Bry_finder.Find_fwd(src, Xow_hzip_dict.Escape, href_bgn, src_len); if (href_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.href_missing", href_bgn, href_bgn);
+ switch (xtid) {
+ case Xow_hzip_dict.Tid_lnke_txt:
+ bfr.Add_str("").Add_mid(src, href_bgn, href_end).Add_str("");
+ return href_end + 1; // +1 to skip escape
+ case Xow_hzip_dict.Tid_lnke_brk_text_n:
+ int num = Hpg_srl_itm_.Load_bin_int_abrv(src, src_len, href_end + 1, count_ref);
+ bfr.Add_str("[").Add_int_variable(num).Add_str("]");
+ return href_end + 1 + count_ref.Val(); // +1 to skip escape
+ case Xow_hzip_dict.Tid_lnke_brk_text_y:
+ bfr.Add_str("");
+ return href_end + 1; // +1 to skip escape
+ default:
+ return hzip_mgr.Warn_by_pos("a.xtid_unknown", href_bgn, href_end);
+ }
+ }
+ public int Load_lnki(Bry_bfr bfr, byte[] src, int src_len, int bgn, byte tid) {
+ byte ns_ord = src[bgn];
+ Xow_ns ns = ttl_parser.Ns_mgr().Ords_get_at(ns_ord);
+ int ttl_bgn = bgn + 1;
+ int ttl_end = Bry_finder.Find_fwd(src, Xow_hzip_dict.Escape, ttl_bgn, src_len); if (ttl_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("a.ttl_end_missing", bgn, ttl_bgn);
+ byte[] ttl_bry = Bry_.Mid(src, ttl_bgn, ttl_end);
+ Xoa_ttl ttl = ttl_parser.Ttl_parse(ns.Id(), ttl_bry);
+ bfr.Add_str("").Add(ttl_bry);
+ bfr.Add_str("");
+ }
+ else {
+ bfr.Add(ttl.Page_txt()).Add_str("'>");
+ }
+ return rv;
+ }
+ public void Html_plain(Bry_bfr bfr, Xop_lnki_tkn lnki) {
+ bfr.Add_str(lnki.Caption_exists() ? "")
+ ;
+ private static final int
+ Find_href_wiki_len = Find_href_wiki_bry.length
+ , Find_href_len = Find_href_bry.length
+ , Find_a_rhs_bgn_len = Find_a_rhs_bgn_bry.length
+ ;
+}
diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor_tst.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor_tst.java
new file mode 100644
index 000000000..3ceb51f36
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__anchor_tst.java
@@ -0,0 +1,128 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
+import org.junit.*; import gplx.xowa.html.*; import gplx.xowa.hdumps.srls.*;
+public class Xow_hzip_itm__anchor_tst {
+ @Before public void init() {fxt.Clear();} private Xow_hzip_itm__anchor_fxt fxt = new Xow_hzip_itm__anchor_fxt();
+ @Test public void Srl_lnki_text_n() {
+ byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry);
+ fxt.Test_save(brys, "A");
+ fxt.Test_load(brys, "A");
+ }
+ @Test public void Srl_lnki_text_n_alt_case() {
+ byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(2), Bry_.new_ascii_("a"), Xow_hzip_dict.Escape_bry);
+ fxt.Test_save(brys, "a");
+ fxt.Test_load(brys, "a");
+ }
+ @Test public void Srl_lnki_text_n_ns() {
+ byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(12), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry);
+ fxt.Test_save(brys, "Template:A");
+ fxt.Test_load(brys, "Template:A");
+ }
+ @Test public void Srl_lnki_text_n_smoke() {
+ byte[][] brys = Bry_.Ary(Bry_.new_ascii_("a_1"), Xow_hzip_dict.Bry_lnki_text_n, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry, Bry_.new_ascii_("a_2"));
+ fxt.Test_save(brys, "a_1Aa_2");
+ fxt.Test_load(brys, "a_1Aa_2");
+ }
+ @Test public void Srl_lnki_text_y() {
+ byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnki_text_y, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry, Bry_.new_ascii_("A1"), Xow_hzip_dict.Bry_a_rhs);
+ fxt.Test_save(brys, "A1");
+ fxt.Test_load(brys, "A1");
+ }
+ @Test public void Srl_lnki_text_y_nest() {
+ byte[][] brys = Bry_.Ary
+ ( Xow_hzip_dict.Bry_lnki_text_y, Bry_.ints_(2), Bry_.new_ascii_("A"), Xow_hzip_dict.Escape_bry
+ , Bry_.new_ascii_("B"), Xow_hzip_dict.Bry_lnki_text_y, Bry_.ints_(2), Bry_.new_ascii_("C"), Xow_hzip_dict.Escape_bry, Bry_.new_ascii_("C1"), Xow_hzip_dict.Bry_a_rhs, Bry_.new_ascii_("D")
+ , Xow_hzip_dict.Bry_a_rhs
+ );
+ fxt.Test_save(brys, "BC1D");
+ fxt.Test_load(brys, "BC1D");
+ }
+ @Test public void Srl_noop() {
+ byte[][] brys = Bry_.Ary(Bry_.new_utf8_("A"), Xow_hzip_dict.Bry_a_rhs);
+ fxt.Test_save(brys, "A");
+ }
+ @Test public void Srl_lnke_txt() {
+ byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnke_txt, Bry_.new_ascii_("http://a.org"), Xow_hzip_dict.Escape_bry);
+ fxt.Test_save(brys, "http://a.org");
+ fxt.Test_load(brys, "http://a.org");
+ }
+ @Test public void Srl_lnke_brk_y() {
+ byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnke_brk_text_y, Bry_.new_ascii_("http://a.org"), Xow_hzip_dict.Escape_bry, Bry_.new_ascii_("A1"), Xow_hzip_dict.Bry_a_rhs);
+ fxt.Test_save(brys, "A1");
+ fxt.Test_load(brys, "A1");
+ }
+ @Test public void Srl_lnke_brk_n() {
+ byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_lnke_brk_text_n, Bry_.new_ascii_("http://a.org"), Xow_hzip_dict.Escape_bry, Hpg_srl_itm_.Save_bin_int_abrv(123));
+ fxt.Test_save(brys, "[123]");
+ fxt.Test_load(brys, "[123]");
+ }
+// @Test public void Srl_hdr() {
+// byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.new_ascii_("A"));
+// fxt.Test_save(brys, "A
");
+// }
+ @Test public void Html_ttl() {
+ fxt.Test_html("[[A]]", "A");
+ }
+ @Test public void Html_capt() {
+ fxt.Test_html("[[A|a]]", "a");
+ }
+ @Test public void Html_lnke_txt() {
+ fxt.Test_html("http://a.org", "http://a.org");
+ }
+ @Test public void Html_lnke_brk_n() {
+ fxt.Test_html("[http://a.org]", "[1]");
+ }
+ @Test public void Html_lnke_brk_y() {
+ fxt.Test_html("[http://a.org A]", "A");
+ }
+}
+class Xow_hzip_itm__anchor_fxt {
+ private Bry_bfr bfr = Bry_bfr.reset_(Io_mgr.Len_mb); private Xow_hzip_mgr hzip_mgr; private Xow_wiki wiki;
+ private Xow_hzip_stats stats = new Xow_hzip_stats();
+ public void Clear() {
+ if (hzip_mgr == null) {
+ Xoa_app app = Xoa_app_fxt.app_();
+ wiki = Xoa_app_fxt.wiki_tst_(app);
+ hzip_mgr = new Xow_hzip_mgr(Gfo_usr_dlg_._, wiki);
+ }
+ }
+ public void Test_save(byte[][] expd_brys, String html) {Test_save(html, expd_brys);}
+ public void Test_save(String html, byte[]... expd_brys) {
+ byte[] expd = Bry_.Add(expd_brys);
+ hzip_mgr.Save(bfr, stats, Bry_.Empty, Bry_.new_utf8_(html));
+ Tfds.Eq_ary(expd, bfr.Xto_bry_and_clear());
+ }
+ public void Test_load(byte[][] src_brys, String expd) {
+ byte[] src = Bry_.Add(src_brys);
+ hzip_mgr.Load(bfr, Bry_.Empty, src);
+ Tfds.Eq(expd, bfr.Xto_str_and_clear());
+ }
+ public void Test_html(String html, String expd) {
+ Xop_ctx ctx = wiki.Ctx(); Xop_parser parser = wiki.Parser(); Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
+ ctx.Para().Enabled_n_();
+ ctx.Cur_page().Lnki_redlinks_mgr().Clear();
+ byte[] html_bry = Bry_.new_utf8_(html);
+ Xop_root_tkn root = ctx.Tkn_mkr().Root(html_bry);
+ parser.Parse_page_all_clear(root, ctx, tkn_mkr, html_bry);
+ Xoh_wtr_ctx hctx = Xoh_wtr_ctx.Hdump;
+ Xoh_html_wtr html_wtr = wiki.Html_mgr().Html_wtr();
+ html_wtr.Write_all(bfr, ctx, hctx, html_bry, root);
+ Tfds.Eq(expd, bfr.Xto_str_and_clear());
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header.java
new file mode 100644
index 000000000..81fb06455
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__header.java
@@ -0,0 +1,41 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
+import gplx.html.*; import gplx.xowa.apps.ttls.*; import gplx.xowa.hdumps.srls.*;
+public class Xow_hzip_itm__header {
+ private Xow_hzip_mgr hzip_mgr;
+ public Xow_hzip_itm__header(Xow_hzip_mgr hzip_mgr) {this.hzip_mgr = hzip_mgr;}
+ public int Save(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos) {
+ if (pos >= src_len) return Xow_hzip_mgr.Unhandled;
+ byte hdr_num_byte = src[pos];
+ switch (hdr_num_byte) {
+ case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3:
+ case Byte_ascii.Num_4: case Byte_ascii.Num_5: case Byte_ascii.Num_6:
+ break;
+ default:
+ return Xow_hzip_mgr.Unhandled;
+ }
+ int span_lhs_bgn = pos + 2; // +2 to skip # and >; EX: "