1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2025-05-31 22:44:34 +00:00

v1.11.1.1

This commit is contained in:
gnosygnu 2014-11-02 23:10:03 -05:00
parent eddb6bebc7
commit 8e372c8cd3
46 changed files with 1025 additions and 537 deletions

View File

@ -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))

View File

@ -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 = "";

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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();
}

View File

@ -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_();

View File

@ -18,18 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
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);
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};
}

View File

@ -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;
}

View File

@ -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) {

View File

@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.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);

View File

@ -17,9 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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();

View File

@ -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;
// }

View File

@ -18,12 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
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
};
}

View File

@ -16,7 +16,9 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.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();}
}

View File

@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.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) {

View File

@ -16,8 +16,9 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.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);
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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("<a href='/wiki/").Add(ttl.Full_db()).Add_str("' title='");
int rv = ttl_end + 1;
if (tid == Xoa_hzip_dict.Tid_lnki_ttl) {
if (ns.Id() != 0) ttl_bry = ttl.Full_db();
bfr.Add(Html_utl.Escape_html_as_bry(ttl_bry)).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("</a>");
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_("<a xtid='a_ttl' href=\""), Html_capt = Bry_.new_ascii_("<a xtid='a_capt' href=\"");
private static final byte[]
Find_xtid_bry = Bry_.new_ascii_("xtid='")
, Find_href_bry = Bry_.new_ascii_("href=\"/wiki/")
, Find_a_rhs_bgn_bry = Bry_.new_ascii_("</a>")
;
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)
;
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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 xtid='a_ttl' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A</a>");
fxt.Test_load(brys, "<a href='/wiki/A' title='A'>A</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 xtid='a_ttl' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>a</a>");
fxt.Test_load(brys, "<a href='/wiki/A' title='a'>a</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, "<a xtid='a_ttl' href=\"/wiki/Template:A\" id='xowa_lnki_0' title='Template:A'>Template:A</a>");
fxt.Test_load(brys, "<a href='/wiki/Template:A' title='Template:A'>Template:A</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_1<a xtid='a_ttl' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A</a>a_2");
fxt.Test_load(brys, "a_1<a href='/wiki/A' title='A'>A</a>a_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, "<a xtid='a_capt' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A1</a>");
fxt.Test_load(brys, "<a href='/wiki/A' title='A1'>A1</a>");
}
@Test public void Srl_noop() {
fxt.Test_save("<a href='/wiki/A'>A</a>", Bry_.new_utf8_("<a href='/wiki/A'>A</a>"));
}
@Test public void Html_ttl() {
fxt.Test_html("[[A]]", "<a xtid='a_ttl' href=\"/wiki/A\" xowa_redlink='1'>A</a>");
}
@Test public void Html_capt() {
fxt.Test_html("[[A|a]]", "<a xtid='a_capt' href=\"/wiki/A\" xowa_redlink='1'>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 {
// <a href="/wiki/File:The_Earth_seen_from_Apollo_17.jpg" class="image" xowa_title="The Earth seen from Apollo 17.jpg">
// <a href="/site/simple.wikipedia.org/wiki/Template:Solar_System?action=edit"><span title="Edit this template" style="">e</span></a> // xwiki [[simple:xx
// <a href="http://planetarynames.wr.usgs.gov/jsp/append5.jsp" class="external text" rel="nofollow">"Descriptor Terms (Feature Types)"</a>
// 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
;
}

View File

@ -16,31 +16,31 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.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"
, ");"
);
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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"
, ");"
);
}

View File

@ -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
;
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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
;
}

View File

@ -104,7 +104,6 @@ public class Xoh_html_wtr {
private static final byte[] Bry_hdr_bgn = Bry_.new_ascii_("<span class='mw-headline' id='"), Bry_hdr_end = Bry_.new_ascii_("</span>");
@gplx.Virtual public void Hr(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_hr_tkn tkn) {bfr.Add(Tag_hr);}
@gplx.Virtual public void Hdr(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_hdr_tkn hdr) {
// page.Hdrs_id_bld(hdr, src);
if (hdr.Hdr_html_first() && cfg.Toc_show() && !page.Hdr_mgr().Toc_manual()) { // __TOC__ not specified; place at top; NOTE: if __TOC__ was specified, then it would be placed wherever __TOC__ appears
wiki.Html_mgr().Toc_mgr().Html(ctx.Cur_page(), hctx, src, bfr);
}

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.html; import gplx.*; import gplx.xowa.*;
import gplx.xowa.ctgs.*; import gplx.xowa.xtns.gallery.*;
import gplx.xowa.html.portal.*; import gplx.xowa.html.tocs.*; import gplx.xowa.wikis.modules.*;
import gplx.xowa.html.portal.*; import gplx.xowa.html.tocs.*; import gplx.xowa.wikis.modules.*; import gplx.xowa.html.hzips.*;
public class Xow_html_mgr implements GfoInvkAble {
public Xow_html_mgr(Xow_wiki wiki) {
this.wiki = wiki;
@ -32,6 +32,7 @@ public class Xow_html_mgr implements GfoInvkAble {
portal_mgr = new Xow_portal_mgr(wiki);
imgs_mgr = new Xoh_imgs_mgr(this);
module_mgr = new Xow_module_mgr(wiki);
hzip_mgr = new Xow_hzip_mgr(app.Usr_dlg(), wiki);
}
public void Init_by_wiki(Xow_wiki wiki) {
html_wtr.Init_by_wiki(wiki);
@ -46,6 +47,7 @@ public class Xow_html_mgr implements GfoInvkAble {
public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr;
public Xow_toc_mgr Toc_mgr() {return toc_mgr;} private Xow_toc_mgr toc_mgr = new Xow_toc_mgr();
public Xow_module_mgr Module_mgr() {return module_mgr;} private Xow_module_mgr module_mgr;
public Xow_hzip_mgr Hzip_mgr() {return hzip_mgr;} private Xow_hzip_mgr hzip_mgr;
public boolean Importing_ctgs() {return importing_ctgs;} public void Importing_ctgs_(boolean v) {importing_ctgs = v;} private boolean importing_ctgs;
public int Img_thumb_width() {return img_thumb_width;} private int img_thumb_width = 220;
public byte[] Img_media_play_btn() {return img_media_play_btn;} private byte[] img_media_play_btn;

View File

@ -0,0 +1,54 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.html.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*;
class Hzip_bfr_mgr {
private Gfo_usr_dlg usr_dlg; private Bry_bfr_mkr bfr_mkr;
private ListAdp stack = ListAdp_.new_();
public Hzip_bfr_mgr(Gfo_usr_dlg usr_dlg, Bry_bfr_mkr bfr_mkr) {this.usr_dlg = usr_dlg; this.bfr_mkr = bfr_mkr;}
public Bry_bfr Add(Hzip_bfr_itm__base itm) {
stack.Add(itm);
return bfr_mkr.Get_k004();
}
public Bry_bfr Pop(int expd_tid, Bry_bfr cur, byte[] src, int src_len, int pos) {
Hzip_bfr_itm__base itm = (Hzip_bfr_itm__base)ListAdp_.Pop(stack);
if (expd_tid != itm.Tid()) {usr_dlg.Warn_many("", "", "bfr_mgr tid does not match; expd=~{0} actl=~{1}", expd_tid, itm.Tid());}
itm.Pop_exec(cur, src, src_len, pos);
cur.Mkr_rls();
return itm.Bfr();
}
}
abstract class Hzip_bfr_itm__base {
public Hzip_bfr_itm__base Init(Bry_bfr bfr) {this.bfr = bfr; return this;}
public Bry_bfr Bfr() {return bfr;} protected Bry_bfr bfr;
public abstract int Tid();
public abstract void Pop_exec(Bry_bfr cur, byte[] src, int src_len, int pos);
}
class Hzip_bfr_itm__anchor extends Hzip_bfr_itm__base { // <a href="/wiki/File:Earth_Eastern_Hemisphere.jpg" class="image" title="Photograph of Earth, taken by NASA" xowa_title="Earth Eastern Hemisphere.jpg">
@Override public int Tid() {return Tid_file;} public static final int Tid_file = 1;
@Override public void Pop_exec(Bry_bfr cur, byte[] src, int src_len, int pos) {
byte[] caption_bry = cur.Xto_bry(); // Calc_title(cur.Xto_bry())
bfr.Add(caption_bry).Add_str("'>");
bfr.Add_bfr_and_clear(cur);
bfr.Add_str("</a>");
}
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;
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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 // <a href="http://xowa.sourceforge.net/blog.html" class="external text" rel="nofollow">blog</a> -> 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) // <a href="http://xowa.sourceforge.net/blog.html" class="external text" rel="nofollow">blog</a> -> 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)
;
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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);
}
}
// // <a href="/wiki/File:The_Earth_seen_from_Apollo_17.jpg" class="image" xowa_title="The Earth seen from Apollo 17.jpg">
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) {// <a rel="nofollow" class="external free" href="http://a.org">http://a.org</a>
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("<a rel=\"nofollow\" class=\"external free\" href=\"").Add_mid(src, href_bgn, href_end).Add_str("\">").Add_mid(src, href_bgn, href_end).Add_str("</a>");
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("<a rel=\"nofollow\" class=\"external autonumber\" href=\"").Add_mid(src, href_bgn, href_end).Add_str("\">[").Add_int_variable(num).Add_str("]</a>");
return href_end + 1 + count_ref.Val(); // +1 to skip escape
case Xow_hzip_dict.Tid_lnke_brk_text_y:
bfr.Add_str("<a rel=\"nofollow\" class=\"external text\" href=\"").Add_mid(src, href_bgn, href_end).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("<a href='/wiki/").Add(ttl.Full_db()).Add_str("' title='");
int rv = ttl_end + 1;
if (tid == Xow_hzip_dict.Tid_lnki_text_n) {
if (ns.Id() != 0) ttl_bry = ttl.Full_db();
bfr.Add(Html_utl.Escape_html_as_bry(ttl_bry)).Add_str("'>").Add(ttl_bry);
bfr.Add_str("</a>");
}
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() ? "<a xtid='a_lnki_text_y' href=\"" : "<a xtid='a_lnki_text_n' href=\"");
}
public void Html_file(Bry_bfr bfr, Xop_lnki_tkn lnki) {
// bfr.Add_str("<a xtid='a_lnki_file'");
}
private static final byte[]
Find_href_wiki_bry = Bry_.new_ascii_("href=\"/wiki/")
, Find_href_bry = Bry_.new_ascii_("href=\"")
, Find_a_rhs_bgn_bry = Bry_.new_ascii_("</a>")
;
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
;
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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 xtid='a_lnki_text_n' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A</a>");
fxt.Test_load(brys, "<a href='/wiki/A' title='A'>A</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 xtid='a_lnki_text_n' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>a</a>");
fxt.Test_load(brys, "<a href='/wiki/A' title='a'>a</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, "<a xtid='a_lnki_text_n' href=\"/wiki/Template:A\" id='xowa_lnki_0' title='Template:A'>Template:A</a>");
fxt.Test_load(brys, "<a href='/wiki/Template:A' title='Template:A'>Template:A</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_1<a xtid='a_lnki_text_n' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A</a>a_2");
fxt.Test_load(brys, "a_1<a href='/wiki/A' title='A'>A</a>a_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, "<a xtid='a_lnki_text_y' href=\"/wiki/A\" id='xowa_lnki_0' title='A'>A1</a>");
fxt.Test_load(brys, "<a href='/wiki/A' title='A'>A1</a>");
}
@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, "<a xtid='a_lnki_text_y' href=\"/wiki/A\">B<a xtid='a_lnki_text_y' href=\"/wiki/C\">C1</a>D</a>");
fxt.Test_load(brys, "<a href='/wiki/A' title='A'>B<a href='/wiki/C' title='C'>C1</a>D</a>");
}
@Test public void Srl_noop() {
byte[][] brys = Bry_.Ary(Bry_.new_utf8_("<a href='/wiki/A'>A"), Xow_hzip_dict.Bry_a_rhs);
fxt.Test_save(brys, "<a href='/wiki/A'>A</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, "<a xtid='a_lnke_txt' rel=\"nofollow\" class=\"external free\" href=\"http://a.org\">http://a.org</a>");
fxt.Test_load(brys, "<a rel=\"nofollow\" class=\"external free\" href=\"http://a.org\">http://a.org</a>");
}
@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, "<a xtid='a_lnke_brk_y' class=\"external text\" rel=\"nofollow\" href=\"http://a.org\">A1</a>");
fxt.Test_load(brys, "<a rel=\"nofollow\" class=\"external text\" href=\"http://a.org\">A1</a>");
}
@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, "<a xtid='a_lnke_brk_n' class=\"external autonumber\" rel=\"nofollow\" href=\"http://a.org\">[123]</a>");
fxt.Test_load(brys, "<a rel=\"nofollow\" class=\"external autonumber\" href=\"http://a.org\">[123]</a>");
}
// @Test public void Srl_hdr() {
// byte[][] brys = Bry_.Ary(Xow_hzip_dict.Bry_hdr_lhs, Bry_.new_ascii_("A</h2>"));
// fxt.Test_save(brys, "<h2><span class='mw-headline' id='A'>A</span></h2>");
// }
@Test public void Html_ttl() {
fxt.Test_html("[[A]]", "<a xtid='a_lnki_text_n' href=\"/wiki/A\" xowa_redlink='1'>A</a>");
}
@Test public void Html_capt() {
fxt.Test_html("[[A|a]]", "<a xtid='a_lnki_text_y' href=\"/wiki/A\" xowa_redlink='1'>a</a>");
}
@Test public void Html_lnke_txt() {
fxt.Test_html("http://a.org", "<a xtid='a_lnke_txt' href=\"http://a.org\" class=\"external text\" rel=\"nofollow\">http://a.org</a>");
}
@Test public void Html_lnke_brk_n() {
fxt.Test_html("[http://a.org]", "<a xtid='a_lnke_brk_n' href=\"http://a.org\" class=\"external text\" rel=\"nofollow\">[1]</a>");
}
@Test public void Html_lnke_brk_y() {
fxt.Test_html("[http://a.org A]", "<a xtid='a_lnke_brk_y' href=\"http://a.org\" class=\"external text\" rel=\"nofollow\">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());
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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: "<h2>"
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) {}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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)
// ;
// <a href="/site/simple.wikipedia.org/wiki/Template:Solar_System?action=edit"><span title="Edit this template" style="">e</span></a> // xwiki [[simple:xx
// <a href="http://planetarynames.wr.usgs.gov/jsp/append5.jsp" class="external text" rel="nofollow">"Descriptor Terms (Feature Types)"</a>
/*
0: proto,tld,ext
1-n: domain
n: 0: domain_end
n: url remainder
n: 0: url_end
*/
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
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("</a>"); 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("<a ", Tid_a)
.Add_str_byte("<a " , Tid_a_lhs)
.Add_str_byte("</a>" , Tid_a_rhs)
.Add_str_byte("<h" , Tid_h_lhs)
;
}

View File

@ -0,0 +1,30 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.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;
}

View File

@ -0,0 +1,49 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.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)
;
}

View File

@ -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 href=\"/wiki/A%22B\" title=\"A&quot;B\">A\"B</a>");
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

View File

@ -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;

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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); // '<a href="'
app.Href_parser().Build_to_bfr(bfr, wiki, lnki_ttl, hctx.Mode_is_popup()); // '/wiki/A'
@ -110,9 +107,11 @@ public class Xoh_lnki_wtr {
bfr .Add(Xoh_consts.A_mid_id) // '" id=\"xowa_lnki_'
.Add_int_variable(lnki_html_id); // '1234'
}
if (cfg.Lnki_title())
bfr .Add(Xoh_consts.A_bgn_lnki_0) // '" title=\"'
.Add(lnki_ttl.Page_txt()); // 'Abcd' NOTE: use Page_txt to (a) replace underscores with spaces; (b) get title casing; EX:[[roman_empire]] -> 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());

View File

@ -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) {}

View File

@ -36,7 +36,7 @@ public class Xop_amp_trie_itm {
bfr.Add(xml_name_bry); // NOTE: never write actual char; EX: "&lt;" should be written as "&lt;", 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;

View File

@ -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("<a xtid='a_lnke_txt' href=\"");
else {
if (lnke.Subs_len() == 0)
bfr.Add_str("<a xtid='a_lnke_brk_n' href=\"");
else
bfr.Add_str("<a xtid='a_lnke_brk_y' href=\"");
}
}
else
bfr.Add(Xoh_consts.A_bgn);
if (Write_href(bfr, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa))
bfr.Add(A_lhs_end_external);
else

View File

@ -109,7 +109,7 @@ class Imap_parser {
int pos = Bry_finder.Trim_fwd_space_tab(src, tid_end_pos, itm_end); // gobble any leading spaces
int grp_end = Bry_finder.Find_fwd(src, Byte_ascii.Brack_bgn, pos, itm_end); // find first "["; note that this is a lazy way of detecting start of lnki / lnke; MW has complicated regex, but hopefully this will be enough; DATE:2014-10-22
if (grp_end == -1) {return Add_err(Bool_.Y, itm_bgn, itm_end, "No valid link was found");}
int num_bgn = -1, comma_pos = -1;
int num_bgn = -1, comma_pos = -1, pts_len = 0;
while (true) {
boolean last = pos == grp_end;
byte b = last ? Byte_ascii.Space : src[pos];
@ -128,20 +128,21 @@ class Imap_parser {
}
num_bgn = -1; comma_pos = -1;
pts.Add(Double_obj_val.new_(num));
++pts_len;
if (pts_len == reqd_pts) // 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; 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));

View File

@ -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

View File

@ -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;

View File

@ -17,11 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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;