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: "

" + int span_lhs_end = Bry_finder.Find_fwd(src, Byte_ascii.Gt, span_lhs_bgn, src_len); if (span_lhs_end == Bry_finder.Not_found) return hzip_mgr.Warn_by_pos_add_dflt("h.span_end_missing", bgn, pos); + bfr.Add(Xow_hzip_dict.Bry_hdr_lhs); + bfr.Add_byte((byte)(hdr_num_byte - Byte_ascii.Num_0)); + stats.Hdr_add(); + return span_lhs_end; + } + public void Html(Bry_bfr bfr, boolean caption) {} +} diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__href.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__href.java new file mode 100644 index 000000000..ff9e2c6ee --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_itm__href.java @@ -0,0 +1,98 @@ +/* +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.core.btries.*; +class Xow_hzip_itm__href { + public void Save(Bry_bfr bfr, Xow_hzip_stats stats, byte[] src, int src_len, int bgn, int pos, byte bgn_quote) { +// // ignore anchors; EX: "#a" +// int proto_bgn = pos; +// int proto_end = Bry_finder.Find_fwd(src, Byte_ascii.Colon, proto_bgn, src_len); +// byte proto_tid = Tid_proto_other; +// if (proto_end != Bry_finder.Not_found) { +// Object proto_obj = proto_trie.Match_exact(src, pos, proto_bgn); +// if (proto_obj != null) +// proto_tid = ((Byte_obj_val)proto_obj).Val(); +// pos = Bry_finder.Find_fwd_while(src, proto_bgn + 1, src_len, Byte_ascii.Slash); // eat /; EX: http:// should position after / +// } +// // stats.Lnke_proto_reg(proto_tid, src, proto_bgn, proto_end); +// +// int domain_bgn = pos; +// int domain_end = Bry_finder.Find_fwd(src, Byte_ascii.Slash, domain_bgn, src_len); +// if (domain_end == Bry_finder.Not_found) // href has no slash; assume entire String is domain EX: "www.a.org" +// domain_end = Bry_finder.Find_fwd(src, bgn_quote, pos, src_len); +// +// int tld_pos = Bry_finder.Find_bwd(src, Byte_ascii.Dot, domain_bgn, src_len); +// byte tld_tid = Tid_tld_other; +// if (tld_pos != Bry_.NotFound) { +// Object tld_obj = tld_trie.Match_exact(src, domain_bgn, domain_end); +// if (tld_obj != null) +// tld_tid = ((Byte_obj_val)tld_obj).Val(); +// pos = Bry_finder.Find_fwd_while(src, domain_bgn + 1, src_len, Byte_ascii.Slash); // eat /; EX: http:// should position after / +// } +// // stats.Lnke_tld_reg(tld_tid, src, domain_bgn, domain_end); + } + public static final byte // 2 + Tid_proto_other = 0 + , Tid_proto_http = 1 + , Tid_proto_https = 2 + ; + public static final byte // 3 + Tid_tld_other = 0 + , Tid_tld_com = 1 + , Tid_tld_org = 2 + , Tid_tld_net = 3 + , Tid_tld_gov = 4 + ; + public static final byte // 3 + Tid_ext_other = 0 + , Tid_ext_none = 1 + , Tid_ext_htm = 2 + , Tid_ext_html = 3 + , Tid_ext_php = 4 + , Tid_ext_jsp = 5 + , Tid_ext_asp = 6 + , Tid_ext_aspx = 7 + ; +// private static final Btrie_slim_mgr proto_trie = Btrie_slim_mgr.ci_ascii_() +// .Add_str_byte("http", Tid_proto_http) +// .Add_str_byte("https", Tid_proto_http) +// ; +// private static final Btrie_slim_mgr tld_trie = Btrie_slim_mgr.ci_ascii_() +// .Add_str_byte("com", Tid_tld_com) +// .Add_str_byte("org", Tid_tld_org) +// .Add_str_byte("net", Tid_tld_net) +// .Add_str_byte("gov", Tid_tld_gov) +// ; +// private static final Btrie_slim_mgr ext_trie = Btrie_slim_mgr.ci_ascii_() +// .Add_str_byte("htm", Tid_ext_htm) +// .Add_str_byte("html", Tid_ext_html) +// .Add_str_byte("php", Tid_ext_php) +// .Add_str_byte("jsp", Tid_ext_jsp) +// .Add_str_byte("asp", Tid_ext_asp) +// .Add_str_byte("aspx", Tid_ext_aspx) +// ; + // e // xwiki [[simple:xx + // "Descriptor Terms (Feature Types)" + /* + 0: proto,tld,ext + 1-n: domain + n: 0: domain_end + n: url remainder + n: 0: url_end + */ +} diff --git a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_mgr.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java similarity index 54% rename from 400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_mgr.java rename to 400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java index 65ba9f205..390d8fa27 100644 --- a/400_xowa/src/gplx/xowa/hdumps/hzips/Xoa_hzip_mgr.java +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_mgr.java @@ -15,21 +15,22 @@ 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.core.btries.*; -public class Xoa_hzip_mgr { +package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +import gplx.core.btries.*; import gplx.xowa.apps.ttls.*; +public class Xow_hzip_mgr { private Gfo_usr_dlg usr_dlg; private byte[] page_url; private byte[] src; private int src_len; - public Xoa_hzip_mgr(Gfo_usr_dlg usr_dlg, Xow_wiki wiki) { + public Xow_hzip_mgr(Gfo_usr_dlg usr_dlg, Xoa_ttl_parser ttl_parser) { this.usr_dlg = usr_dlg; - itm__lnki = new Xoa_hzip_itm__lnki(this, wiki); + itm__anchor = new Xow_hzip_itm__anchor(this, ttl_parser); + itm__header = new Xow_hzip_itm__header(this); } - public Xoa_hzip_itm__lnki Itm__lnki() {return itm__lnki;} private Xoa_hzip_itm__lnki itm__lnki; - public void Save(Bry_bfr bfr, byte[] page_url, byte[] src) { - this.page_url = page_url; this.src = src; - this.src_len = src.length; + public Xow_hzip_itm__anchor Itm__anchor() {return itm__anchor;} private Xow_hzip_itm__anchor itm__anchor; + public Xow_hzip_itm__header Itm__header() {return itm__header;} private Xow_hzip_itm__header itm__header; + public void Save(Bry_bfr bfr, Xow_hzip_stats stats, byte[] page_url, byte[] src) { + this.page_url = page_url; this.src = src; this.src_len = src.length; + bfr.Clear(); stats.Clear(); int pos = 0, add_bgn = -1; - bfr.Clear(); while (pos < src_len) { byte b = src[pos]; Object o = save_trie.Match_bgn_w_byte(b, src, pos, src_len); @@ -43,8 +44,10 @@ public class Xoa_hzip_mgr { int match_bgn = pos; int match_end = save_trie.Match_pos(); switch (tid) { - case Tid_a: pos = itm__lnki.Save(bfr, src, src_len, match_bgn, match_end); break; - default: Warn_by_pos("save.tid.unknown", match_bgn, match_end); pos = match_end; continue; + case Tid_a_lhs: pos = itm__anchor.Save(bfr, stats, src, src_len, match_bgn, match_end); break; + case Tid_a_rhs: pos = itm__anchor.Save_a_rhs(bfr, stats, src, src_len, match_bgn, match_end); break; +// case Tid_h_lhs: pos = itm__header.Save(bfr, stats, src, src_len, match_bgn, match_end); break; + default: Warn_by_pos("save.tid.unknown", match_bgn, match_end); pos = match_end; continue; } if (pos == Unhandled) { bfr.Add_mid(src, match_bgn, match_end); @@ -61,14 +64,18 @@ public class Xoa_hzip_mgr { bfr.Clear(); while (pos < src_len) { byte b = src[pos]; - if (b == Xoa_hzip_dict.Escape) { + if (b == Xow_hzip_dict.Escape) { if (add_bgn != -1) {bfr.Add_mid(src, add_bgn, pos); add_bgn = -1;} - int itm_pos = pos + 2; if (itm_pos >= src_len) {Warn_by_pos("load.eos", pos, itm_pos); break;} - int tid_pos = pos + 1; + int itm_pos = pos + 2; + int tid_pos = pos + 1; if (tid_pos >= src_len) {Warn_by_pos("load.eos", pos, itm_pos); break;} byte tid = src[tid_pos]; switch (tid) { - case Xoa_hzip_dict.Tid_lnki_ttl : - case Xoa_hzip_dict.Tid_lnki_capt: pos = itm__lnki.Load_ttl(bfr, src, src_len, itm_pos, tid); break; + case Xow_hzip_dict.Tid_lnki_text_n: + case Xow_hzip_dict.Tid_lnki_text_y: pos = itm__anchor.Load_lnki(bfr, src, src_len, itm_pos, tid); break; + 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: pos = itm__anchor.Load_lnke(bfr, src, src_len, itm_pos, tid); break; + case Xow_hzip_dict.Tid_a_rhs: pos = itm_pos; bfr.Add_str(""); break; } } else { @@ -83,11 +90,17 @@ public class Xoa_hzip_mgr { private int Warn_by_pos(String err, int bgn, int end, int end_adj) { end += end_adj; if (end > src_len) end = src_len; usr_dlg.Warn_many("", "", "hzip failed: page=~{0} err=~{1} mid=~{2}", String_.new_utf8_(page_url), err, String_.new_utf8_(src, bgn, end)); - return bgn; + return Unhandled; } public static final int Unhandled = -1; - private static final byte Tid_a = 0; + private static final byte + Tid_a_lhs = 0 + , Tid_a_rhs = 1 + , Tid_h_lhs = 2 + ; private Btrie_slim_mgr save_trie = Btrie_slim_mgr.cs_() - .Add_str_byte("" , Tid_a_rhs) + .Add_str_byte(". +*/ +package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +public class Xow_hzip_stats { + public void Clear() { + a_rhs = lnki_text_n = lnki_text_y = lnke_txt = lnke_brk_text_n = lnke_brk_text_y = hdr = 0; + } + public int A_rhs() {return a_rhs;} public void A_rhs_add() {++a_rhs;} private int a_rhs; + public int Lnki_text_n() {return lnki_text_n;} public void Lnki_text_n_add() {++lnki_text_n;} private int lnki_text_n; + public int Lnki_text_y() {return lnki_text_y;} public void Lnki_text_y_add() {++lnki_text_y;} private int lnki_text_y; + public int Lnke_txt() {return lnke_txt;} public void Lnke_txt_add() {++lnke_txt;} private int lnke_txt; + public int Lnke_brk_text_n() {return lnke_brk_text_n;} public void Lnke_brk_text_n_add() {++lnke_brk_text_n;} private int lnke_brk_text_n; + public int Lnke_brk_text_y() {return lnke_brk_text_y;} public void Lnke_brk_text_y_add() {++lnke_brk_text_y;} private int lnke_brk_text_y; + public int Hdr() {return hdr;} public void Hdr_add() {++hdr;} private int hdr; +} diff --git a/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_xtid.java b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_xtid.java new file mode 100644 index 000000000..5ac3ca229 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/hzips/Xow_hzip_xtid.java @@ -0,0 +1,49 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +class Xow_hzip_xtid { + public static int Find_xtid(Xow_hzip_mgr hzip_mgr, byte[] src, int src_len, int bgn, int pos, Byte_obj_ref xtid_ref) { + int xtid_bgn = pos + Len_xtid; if (!Bry_.Match(src, pos, xtid_bgn, Bry_xtid)) return Xow_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("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); + xtid_ref.Val_(xtid_obj == null ? Byte_.MinValue : ((Byte_obj_val)xtid_obj).Val()); + return xtid_end; + } + private static final byte[] + Bry_xtid = Bry_.new_ascii_("xtid='") + ; + private static final int + Len_xtid = Bry_xtid.length + ; + public static final byte[] + Bry_lnki_text_n = Bry_.new_ascii_("a_lnki_text_n") + , Bry_lnki_text_y = Bry_.new_ascii_("a_lnki_text_y") + , Bry_lnke_txt = Bry_.new_ascii_("a_lnke_txt") + , Bry_lnke_brk_n = Bry_.new_ascii_("a_lnke_brk_n") + , Bry_lnke_brk_y = Bry_.new_ascii_("a_lnke_brk_y") + , Bry_hdr = Bry_.new_ascii_("hdr") + ; + private static final Hash_adp_bry Xtids = Hash_adp_bry.cs_() + .Add_bry_byte(Bry_lnki_text_n , Xow_hzip_dict.Tid_lnki_text_n) + .Add_bry_byte(Bry_lnki_text_y , Xow_hzip_dict.Tid_lnki_text_y) + .Add_bry_byte(Bry_lnke_txt , Xow_hzip_dict.Tid_lnke_txt) + .Add_bry_byte(Bry_lnke_brk_n , Xow_hzip_dict.Tid_lnke_brk_text_n) + .Add_bry_byte(Bry_lnke_brk_y , Xow_hzip_dict.Tid_lnke_brk_text_y) + .Add_bry_byte(Bry_hdr , Xow_hzip_dict.Tid_hdr_lhs) + ; +} diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java index f502b44c6..4bd825ea0 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr_basic_tst.java @@ -147,6 +147,11 @@ public class Xoh_file_wtr_basic_tst { Tst_img_title("[[File:A.png|thumb|a b]]", "Enlarge"); // caption should not replace text fxt.Wtr_cfg().Lnki_title_(false); } + @Test public void Title_escape() { // PURPOSE: escape quotes in title; PAGE:none; DATE:2014-10-27 + fxt.Wtr_cfg().Lnki_title_(true); + fxt.Test_parse_page_wiki_str("[[A\"B]]", "A\"B"); + fxt.Wtr_cfg().Lnki_title_(false); + } @Test public void Img_title__caption_has_lnki() { // PURPOSE: caption with lnki should show in title; PAGE:en.w:Earth; DATE:2014-08-06 fxt.Wtr_cfg().Lnki_title_(true); Tst_img_title("[[File:A.png|frameless|[[A]]]]" , "A"); // ttl only diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_title_fmtr.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_title_fmtr.java index 9324bb6db..c31ae67d7 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_title_fmtr.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_title_fmtr.java @@ -23,10 +23,10 @@ public class Xoh_lnki_title_fmtr implements Bry_fmtr_arg { } public void Bld_recurse(Bry_bfr bfr, Xop_tkn_itm tkn) { switch (tkn.Tkn_tid()) { - case Xop_tkn_itm_.Tid_newLine: case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_txt: // NOTE: atomic tkns which will have no subs + case Xop_tkn_itm_.Tid_newLine: case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_txt: // leaf tkns which will have no subs Write_atr_text(bfr, src, tkn.Src_bgn(), tkn.Src_end()); break; - case Xop_tkn_itm_.Tid_arg_nde: // caption tkns have no subs; just a key and a val; write val + case Xop_tkn_itm_.Tid_arg_nde: // caption tkns have no subs; just a key and a val; recurse val Arg_nde_tkn arg_nde = (Arg_nde_tkn)tkn; Bld_recurse(bfr, arg_nde.Val_tkn()); break; diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_wtr.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_wtr.java index d35ca9107..25e71078f 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_wtr.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_lnki_wtr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.html.*; import gplx.xowa.files.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.users.history.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.relatedSites.*; -import gplx.xowa.wikis.xwikis.*; import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.hdumps.hzips.*; +import gplx.xowa.wikis.xwikis.*; import gplx.xowa.xtns.wdatas.core.*; import gplx.xowa.html.hzips.*; public class Xoh_lnki_wtr { private Xoa_app app; private Xow_wiki wiki; private Xoa_page page; private Xop_ctx ctx; private Xoh_html_wtr_cfg cfg; @@ -25,7 +25,6 @@ public class Xoh_lnki_wtr { private Xop_lnki_caption_wtr_tkn caption_tkn_wtr; private Xop_lnki_caption_wtr_bry caption_bry_wtr; private Xop_lnki_logger_redlinks_mgr redlinks_mgr; - private Xoa_hzip_mgr hzip_mgr; public Xoh_lnki_wtr(Xoh_html_wtr html_wtr, Xow_wiki wiki, Xow_html_mgr html_mgr, Xoh_html_wtr_cfg cfg) { caption_tkn_wtr = new Xop_lnki_caption_wtr_tkn(html_wtr); caption_bry_wtr = new Xop_lnki_caption_wtr_bry(); @@ -97,10 +96,8 @@ public class Xoh_lnki_wtr { if (hctx.Mode_is_alt()) Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); else { - if (hctx.Mode_is_hdump()) { - if (hzip_mgr == null) hzip_mgr = new Xoa_hzip_mgr(wiki.App().Usr_dlg(), wiki); - hzip_mgr.Itm__lnki().Html(bfr, lnki.Caption_exists()); - } + if (hctx.Mode_is_hdump()) + wiki.Html_mgr().Hzip_mgr().Itm__anchor().Html_plain(bfr, lnki); else bfr.Add(Xoh_consts.A_bgn); // ' Roman empire + if (cfg.Lnki_title()) { + bfr .Add(Xoh_consts.A_bgn_lnki_0); // '" title=\"' + byte[] lnki_title_bry = lnki_ttl.Page_txt(); // 'Abcd' NOTE: use Page_txt to (a) replace underscores with spaces; (b) get title casing; EX:[[roman_empire]] -> Roman empire + Html_utl.Escape_html_to_bfr(bfr, lnki_title_bry, 0, lnki_title_bry.length, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); // escape title; DATE:2014-10-27 + } if (hctx.Mode_is_hdump()) { bfr.Add(gplx.xowa.hdumps.htmls.Hdump_html_consts.Html_redlink_bgn); bfr.Add_int_variable(lnki.Html_id()); diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java index 5e4c07f22..26def1b10 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__popups.java @@ -21,7 +21,7 @@ import gplx.xowa.apis.xowa.html.modules.*; public class Xoh_module_itm__popups implements Xoh_module_itm { public boolean Enabled() {return enabled;} public void Enabled_y_() {enabled = true;} public void Enabled_(boolean v) {enabled = v;} private boolean enabled; public boolean Bind_hover_area() {return bind_hover_area;} public void Bind_hover_area_(boolean v) {bind_hover_area = v;} private boolean bind_hover_area; - public void Clear() {enabled = false;} + public void Clear() {enabled = false; bind_hover_area = false;} public byte[] Key() {return Key_const;} private static final byte[] Key_const = Bry_.new_ascii_("popups"); public void Write_css_script(Xoa_app app, Xow_wiki wiki, Xoa_page page, Xoh_module_wtr wtr) {} public void Write_js_include(Xoa_app app, Xow_wiki wiki, Xoa_page page, Xoh_module_wtr wtr) {} diff --git a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java index 38e643a9c..94b26d6b0 100644 --- a/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java +++ b/400_xowa/src/gplx/xowa/parsers/amps/Xop_amp_trie_itm.java @@ -36,7 +36,7 @@ public class Xop_amp_trie_itm { bfr.Add(xml_name_bry); // NOTE: never write actual char; EX: "<" should be written as "<", not "<" break; default: - bfr.Add(Xoh_lnki_title_fmtr.Escape_bgn); // &# + bfr.Add(Xoh_lnki_title_fmtr.Escape_bgn); // &# bfr.Add_int_variable(char_int); // 160 bfr.Add_byte(Byte_ascii.Semic); // ; break; diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java index c37b33cfa..0e87e63f8 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xoh_lnke_wtr.java @@ -23,7 +23,18 @@ public class Xoh_lnke_wtr { public void Write_all(Bry_bfr bfr, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke) { int lnke_bgn = lnke.Lnke_bgn(), lnke_end = lnke.Lnke_end(); boolean proto_is_xowa = lnke.Proto_tid() == Xoo_protocol_itm.Tid_xowa; if (!hctx.Mode_is_alt()) { // write href, unless mode is alt - bfr.Add(Xoh_consts.A_bgn); + if (hctx.Mode_is_hdump()) { + if (lnke.Lnke_typ() == Xop_lnke_tkn.Lnke_typ_text) + bfr.Add_str(" rect 1 2 3 4; PAGE:en.w:Kilauea DATE:2014-07-28; EX:1 2 3 4 de.w:Wilhelm_Angele DATE:2014-10-30 + last = true; } break; } if (last) break; ++pos; } - int pts_len = pts.Count(); if (reqd_pts == Reqd_poly) { if (pts_len == 0) return Add_err(Bool_.Y, itm_bgn, itm_end, "imagemap_missing_coord"); else if (pts_len % 2 != 0) return Add_err(Bool_.Y, itm_bgn, itm_end, "imagemap_poly_odd"); } else { if (pts_len < reqd_pts) return Add_err(Bool_.Y, itm_bgn, itm_end, "imagemap_missing_coord"); - else if (pts_len > reqd_pts) pts.Del_range(reqd_pts, pts_len - 1); // NOTE: MW allows more points, but doesn't show them; EX: rect 1 2 3 4 5 -> rect 1 2 3 4; PAGE:en.w:Kilauea DATE:2014-07-28 } pos = Bry_finder.Trim_fwd_space_tab(src, pos, itm_end); Imap_itm_shape shape_itm = new Imap_itm_shape(shape_tid, (Double_obj_val[])pts.Xto_ary_and_clear(Double_obj_val.class)); diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java index c64eb0740..bcad3111a 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java @@ -21,6 +21,7 @@ public class Imap_parser_tst { @Before public void init() {fxt.Reset();} private Imap_parser_fxt fxt = new Imap_parser_fxt(); @Test public void Rect_pass() {fxt.Test_shape("rect 1 2 3 4 [[A]]" , fxt.itm_rect_("[[A]]", 1, 2, 3, 4));} @Test public void Rect_pass_many() {fxt.Test_shape("rect 1 2 3 4 5 6[[A]]" , fxt.itm_rect_("[[A]]", 1, 2, 3, 4));} // PURPOSE: MW allows extra points to be passed; PAGE:en.w:Kilauea DATE:2014-07-28 + @Test public void Rect_pass_invalid() {fxt.Test_shape("rect 1 2 3 4 a b [[A]]" , fxt.itm_rect_("[[A]]", 1, 2, 3, 4));} // PURPOSE: MW only scans first 4 tokens for numbers; PAGE:de.w:Wilhelm_Angele DATE:2014-10-30 @Test public void Circle_pass() {fxt.Test_shape("circle 1 2 3 [[A]]" , fxt.itm_circle_("[[A]]", 1, 2, 3));} @Test public void Poly_pass() {fxt.Test_shape("poly 1 2 3 4 5 6 [[A]]" , fxt.itm_poly_("[[A]]", 1, 2, 3, 4, 5, 6));} @Test public void Poly_pass_chars() {fxt.Test_shape("poly a b [[A]]" , fxt.itm_poly_("[[A]]", 0, 0));} // PURPOSE: non-numeric should be converted to 0; PAGE:uk.w:Стратосфера; DATE:2014-07-26 diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java index 8e60ac00c..bf3e9896d 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/lib/Scrib_lib_title.java @@ -114,7 +114,9 @@ public class Scrib_lib_title implements Scrib_lib { String xwiki_str = args.Cast_str_or_null(3); Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(); if (xwiki_str != null) tmp_bfr.Add_str(xwiki_str).Add_byte(Byte_ascii.Colon); - tmp_bfr.Add(ns_bry).Add_byte(Byte_ascii.Colon).Add_str(ttl_str); + if (Bry_.Len_gt_0(ns_bry)) // only prefix ns if available; EX:"Template:Title"; else will get ":Title"; DATE:2014-10-30 + tmp_bfr.Add(ns_bry).Add_byte(Byte_ascii.Colon); + tmp_bfr.Add_str(ttl_str); if (anchor_str != null) tmp_bfr.Add_byte(Byte_ascii.Hash).Add_str(anchor_str); Xoa_ttl ttl = Xoa_ttl.parse_(wiki, tmp_bfr.Mkr_rls().Xto_bry_and_clear()); if (ttl == null) return rslt.Init_obj(null); // invalid title; exit; diff --git a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java index 1f5c2254a..6bb6a6c51 100644 --- a/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src_120_wiki/gplx/xowa/Xow_wiki.java @@ -17,11 +17,11 @@ along with this program. If not, see . */ package gplx.xowa; import gplx.*; import gplx.xowa.apps.*; -import gplx.xowa.wikis.*; import gplx.xowa.users.*; import gplx.xowa.html.*; import gplx.xowa.users.history.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; +import gplx.xowa.wikis.*; import gplx.xowa.users.*; import gplx.xowa.html.*; import gplx.xowa.users.history.*; import gplx.xowa.specials.*; import gplx.xowa.xtns.*; import gplx.xowa.dbs.*; import gplx.xowa.files.*; import gplx.xowa.apps.ttls.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.gui.views.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.setup.maints.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.bldrs.imports.*; import gplx.xowa.xtns.pfuncs.*; -public class Xow_wiki implements GfoInvkAble { +public class Xow_wiki implements GfoInvkAble, Xoa_ttl_parser { private Xow_html_util util; private boolean hdump_enabled; public Xow_wiki(Xoa_app app, Io_url wiki_dir, Xow_ns_mgr ns_mgr, Xol_lang lang) { this.app = app; this.ns_mgr = ns_mgr; this.lang = lang; @@ -104,6 +104,8 @@ public class Xow_wiki implements GfoInvkAble { Xow_wiki_alias.Build_alias_by_lang_tid(bfr, wdata_wiki_lang, Byte_obj_ref.new_(wdata_wiki_tid)); wdata_wiki_abrv = bfr.Mkr_rls().Xto_bry_and_clear(); } + public Xoa_ttl Ttl_parse(byte[] ttl) {return Xoa_ttl.parse_(this, ttl);} + public Xoa_ttl Ttl_parse(int ns_id, byte[] ttl) {return Xoa_ttl.parse_(this, ns_id, ttl);} public boolean Init_needed() {return init_needed;} public Xow_wiki Init_needed_(boolean v) {init_needed = v; return this;} private boolean init_needed = true; diff --git a/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3 b/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3 index 1b5fbeb31..ef8dca83e 100644 Binary files a/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3 and b/tst/400_xowa/root/file/en.wikipedia.org/fsdb.user/fsdb.atr.00.sqlite3 differ diff --git a/tst/400_xowa/root/file/en.wikipedia.org/wiki.mnt.sqlite3 b/tst/400_xowa/root/file/en.wikipedia.org/wiki.mnt.sqlite3 new file mode 100644 index 000000000..676765059 Binary files /dev/null and b/tst/400_xowa/root/file/en.wikipedia.org/wiki.mnt.sqlite3 differ diff --git a/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3 b/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3 index cc7c821ab..4f402f966 100644 Binary files a/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3 and b/tst/400_xowa/root/file/en.wikipedia.org/wiki.orig#00.sqlite3 differ diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3 new file mode 100644 index 000000000..320a2bea6 Binary files /dev/null and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.000.sqlite3 differ diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.001.sqlite3 b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.001.sqlite3 new file mode 100644 index 000000000..f3c5ffbcb Binary files /dev/null and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org.001.sqlite3 differ