1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-10-27 20:34:16 +00:00

'v3.8.2.1'

This commit is contained in:
gnosygnu 2016-08-07 21:36:50 -04:00
parent b0fdf78a41
commit e4a2af026b
165 changed files with 2534 additions and 1247 deletions

View File

@ -18,6 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx;
import gplx.core.brys.*; import gplx.core.brys.fmts.*;
public class Bry_fmt {
private final Object thread_lock = new Object();
private byte[] src;
private Bry_fmt_itm[] itms; private int itms_len;
private Bfr_fmt_arg[] args = Bfr_fmt_arg.Ary_empty;
@ -43,6 +44,10 @@ public class Bry_fmt {
Bld_many(bfr, vals_ary);
return bfr.To_str_and_clear();
}
public byte[] Bld_many_to_bry(Bry_bfr bfr, Object... vals_ary) {
Bld_many(bfr, vals_ary);
return bfr.To_bry_and_clear();
}
public void Bld_many(Bry_bfr bfr, Object... vals_ary) {
if (dirty) Compile();
int vals_len = vals_ary.length;
@ -64,15 +69,18 @@ public class Bry_fmt {
}
public String To_str() {return Bld_many_to_str_auto_bfr(vals);}
private void Compile() {
dirty = false;
this.itms = Bry_fmt_parser_.Parse(Byte_ascii.Tilde, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end, args, keys, src);
this.itms_len = itms.length;
synchronized (thread_lock) {
dirty = false;
this.itms = Bry_fmt_parser_.Parse(Byte_ascii.Tilde, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end, args, keys, src);
this.itms_len = itms.length;
}
}
public static Bry_fmt New(String fmt, String... keys) {return new Bry_fmt(Bry_.new_u8(fmt), Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);}
public static Bry_fmt New(byte[] fmt, String... keys) {return new Bry_fmt(fmt , Bry_.Ary(keys), Bfr_fmt_arg.Ary_empty);}
public static String Make_str(String fmt_str, Object... vals) {return Auto(fmt_str).Vals_(vals).To_str();}
public static Bry_fmt Auto(String fmt_str) {
byte[] fmt_bry = Bry_.new_u8(fmt_str);
public static Bry_fmt Auto_nl_apos(String... lines) {return Auto(Bry_.New_u8_nl_apos(lines));}
public static Bry_fmt Auto(String fmt_str) {return Auto(Bry_.new_u8(fmt_str));}
public static Bry_fmt Auto(byte[] fmt_bry) {
byte[][] keys_bry = Bry_fmt_parser_.Parse_keys(fmt_bry);
return new Bry_fmt(fmt_bry, keys_bry, Bfr_fmt_arg.Ary_empty);
}

View File

@ -16,53 +16,73 @@ 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;
import org.junit.*; import gplx.core.times.*;
public class DateAdp__tst {
import org.junit.*; import gplx.core.tests.*;
public class DateAdp__tst {
private final DateAdp__fxt fxt = new DateAdp__fxt();
@Test public void Parse_gplx() {
tst_Parse_gplx("99991231_235959.999", "99991231_235959.999");
tst_Parse_gplx("20090430_213200.123", "20090430_213200.123");
tst_Parse_gplx("20090430_213200" , "20090430_213200.000");
tst_Parse_gplx("20090430" , "20090430_000000.000");
fxt.Test__parse_gplx("99991231_235959.999" , "99991231_235959.999");
fxt.Test__parse_gplx("20090430_213200.123" , "20090430_213200.123");
fxt.Test__parse_gplx("20090430_213200" , "20090430_213200.000");
fxt.Test__parse_gplx("20090430" , "20090430_000000.000");
}
@Test public void Parse_separators() {
tst_Parse_gplx("2009-04-30 21:32:00.123", "20090430_213200.123");
tst_Parse_gplx("2009-04-30 21:32:00" , "20090430_213200.000");
tst_Parse_gplx("2009-04-30" , "20090430_000000.000");
fxt.Test__parse_gplx("2009-04-30 21:32:00.123" , "20090430_213200.123");
fxt.Test__parse_gplx("2009-04-30 21:32:00" , "20090430_213200.000");
fxt.Test__parse_gplx("2009-04-30" , "20090430_000000.000");
}
@Test public void Parse_utc() {
fxt.Test__parse_gplx("2015-12-26T10:03:53Z" , "20151226_100353.000");
}
@Test public void DayOfWeek() {
tst_DayOfWeek("2012-01-18", 3); //3=Wed
} void tst_DayOfWeek(String raw, int expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).DayOfWeek());}
@Test public void WeekOfYear() {
tst_WeekOfYear("2006-02-01", 5); // 1-1:Sun;2-1:Wed
tst_WeekOfYear("2007-02-01", 5); // 1-1:Mon;2-1:Thu
tst_WeekOfYear("2008-02-01", 5); // 1-1:Tue;2-1:Fri
tst_WeekOfYear("2009-02-01", 6); // 1-1:Thu;2-1:Sun
tst_WeekOfYear("2010-02-01", 6); // 1-1:Fri;2-1:Mon
tst_WeekOfYear("2011-02-01", 6); // 1-1:Sat;2-1:Tue
} void tst_WeekOfYear(String raw, int expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).WeekOfYear());}
@Test public void DayOfYear() {
tst_DayOfYear("2012-01-01", 1);
tst_DayOfYear("2012-02-29", 60);
tst_DayOfYear("2012-12-31", 366);
} void tst_DayOfYear(String raw, int expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).DayOfYear());}
@Test public void Timestamp_unix() {
tst_Timestamp_unix("1970-01-01 00:00:00", 0);
tst_Timestamp_unix("2012-01-01 00:00:00", 1325376000);
} void tst_Timestamp_unix(String raw, long expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).Timestamp_unix());}
@Test public void DaysInMonth() {
tst_DaysInMonth("2012-01-01", 31);
tst_DaysInMonth("2012-02-01", 29);
tst_DaysInMonth("2012-04-01", 30);
tst_DaysInMonth("2011-02-01", 28);
} void tst_DaysInMonth(String raw, int expd) {Tfds.Eq(expd, DateAdp_.DaysInMonth(DateAdp_.parse_gplx(raw)));}
@Test public void XtoUtc() {
tst_XtoUtc("2012-01-01 00:00", "2012-01-01 05:00"); //4=Wed
} void tst_XtoUtc(String raw, String expd) {Tfds.Eq(expd, DateAdp_.parse_gplx(raw).XtoUtc().XtoStr_fmt_yyyy_MM_dd_HH_mm());}
void tst_Parse_gplx(String raw, String expd) {
DateAdp date = DateAdp_.parse_gplx(raw);
String actl = date.XtoStr_gplx();
Tfds.Eq(expd, actl);
fxt.Test__day_of_week("2012-01-18", 3); //3=Wed
}
@Test public void WeekOfYear() {
fxt.Test__week_of_year("2006-02-01", 5); // 1-1:Sun;2-1:Wed
fxt.Test__week_of_year("2007-02-01", 5); // 1-1:Mon;2-1:Thu
fxt.Test__week_of_year("2008-02-01", 5); // 1-1:Tue;2-1:Fri
fxt.Test__week_of_year("2009-02-01", 6); // 1-1:Thu;2-1:Sun
fxt.Test__week_of_year("2010-02-01", 6); // 1-1:Fri;2-1:Mon
fxt.Test__week_of_year("2011-02-01", 6); // 1-1:Sat;2-1:Tue
}
@Test public void DayOfYear() {
fxt.Test__day_of_year("2012-01-01", 1);
fxt.Test__day_of_year("2012-02-29", 60);
fxt.Test__day_of_year("2012-12-31", 366);
}
@Test public void Timestamp_unix() {
fxt.Test__timestamp_unix("1970-01-01 00:00:00", 0);
fxt.Test__timestamp_unix("2012-01-01 00:00:00", 1325376000);
}
@Test public void DaysInMonth() {
fxt.Test__days_in_month("2012-01-01", 31);
fxt.Test__days_in_month("2012-02-01", 29);
fxt.Test__days_in_month("2012-04-01", 30);
fxt.Test__days_in_month("2011-02-01", 28);
}
@Test public void XtoUtc() {
fxt.Test__to_utc("2012-01-01 00:00", "2012-01-01 05:00"); //4=Wed
}
}
class DateAdp__fxt {
public void Test__parse_gplx(String raw, String expd) {
Gftest.Eq__str(expd, DateAdp_.parse_gplx(raw).XtoStr_gplx());
}
public void Test__day_of_week(String raw, int expd) {
Gftest.Eq__int(expd, DateAdp_.parse_gplx(raw).DayOfWeek());
}
public void Test__week_of_year(String raw, int expd) {
Gftest.Eq__int(expd, DateAdp_.parse_gplx(raw).WeekOfYear());
}
public void Test__day_of_year(String raw, int expd) {
Gftest.Eq__int(expd, DateAdp_.parse_gplx(raw).DayOfYear());
}
public void Test__days_in_month(String raw, int expd) {
Gftest.Eq__int(expd, DateAdp_.DaysInMonth(DateAdp_.parse_gplx(raw)));
}
public void Test__timestamp_unix(String raw, long expd) {
Gftest.Eq__long(expd, DateAdp_.parse_gplx(raw).Timestamp_unix());
}
public void Test__to_utc(String raw, String expd) {
Tfds.Eq(expd, DateAdp_.parse_gplx(raw).XtoUtc().XtoStr_fmt_yyyy_MM_dd_HH_mm());
}
DateAdp_parser bldr = DateAdp_parser.new_();
}

View File

@ -0,0 +1,38 @@
/*
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.core.brys.args; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
import gplx.core.brys.*;
public class Bfr_arg__bry_fmt implements Bfr_arg {
private final Bry_fmt fmt;
private Object[] arg_ary;
public Bfr_arg__bry_fmt(Bry_fmt fmt, Object... arg_ary) {
this.fmt = fmt;
Args_(arg_ary);
}
public void Bfr_arg__clear() {arg_ary = null;}
public boolean Bfr_arg__missing() {return arg_ary == null;}
public Bfr_arg__bry_fmt Args_(Object... arg_ary) {
this.arg_ary = arg_ary;
return this;
}
public void Bfr_arg__add(Bry_bfr bfr) {
if (Bfr_arg__missing()) return;
fmt.Bld_many(bfr, arg_ary);
}
}

View File

@ -86,7 +86,7 @@ public class Bry_fmt_parser_ {
if (rhs_pos - lhs_pos == 0) throw Err_.new_("bry_fmt", "{} will result in empty key", "src", src);
byte[] key = Bry_.Mid(src, lhs_pos, rhs_pos);
if (!list.Has(key)) list.Add(key, key);
pos = rhs_pos + 1;
pos = rhs_pos; // NOTE: auto-increment done at top of loop
}
return (byte[][])list.To_ary(byte[].class);
} private static final byte[] Bry_arg_lhs = Bry_.new_a7("~{");

View File

@ -18,11 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.core.brys.fmts; import gplx.*; import gplx.core.*; import gplx.core.brys.*;
import org.junit.*;
public class Bry_keys_parser_tst {
private final Bry_keys_parser_fxt fxt = new Bry_keys_parser_fxt();
private final Bry_keys_parser_fxt fxt = new Bry_keys_parser_fxt();
@Test public void None() {fxt.Test("a");}
@Test public void One() {fxt.Test("~{a}" , "a");}
@Test public void Many() {fxt.Test("~{a}b~{c}d~{e}" , "a", "c", "e");}
@Test public void Dupe() {fxt.Test("~{a}b~{a}" , "a");}
@Test public void Bug__space() {fxt.Test("~{a}~{b} ~{c}" , "a", "b", "c");} // DATE:2016-08-02
}
class Bry_keys_parser_fxt {
public void Test(String fmt, String... expd) {

View File

@ -15,12 +15,12 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.htmls; import gplx.*; import gplx.langs.*;
package gplx.langs.htmls.entitys; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*;
public class Gfh_entity_ {
public static final String
Nl_str = "&#10;"
;
public static final byte[]
public static final byte[]
Lt_bry = Bry_.new_a7("&lt;"), Gt_bry = Bry_.new_a7("&gt;")
, Amp_bry = Bry_.new_a7("&amp;"), Quote_bry = Bry_.new_a7("&quot;")
, Apos_num_bry = Bry_.new_a7("&#39;")

View File

@ -15,10 +15,9 @@ 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.parsers.amps; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*;
public class Xop_amp_trie_itm { // TS
public Xop_amp_trie_itm(byte tid, int char_int, byte[] xml_name_bry) {
package gplx.langs.htmls.entitys; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*;
public class Gfh_entity_itm { // TS:immutable
public Gfh_entity_itm(byte tid, int char_int, byte[] xml_name_bry) {
this.tid = tid;
this.char_int = char_int;
this.u8_bry = gplx.core.intls.Utf16_.Encode_int_to_bry(char_int);
@ -37,9 +36,9 @@ public class Xop_amp_trie_itm { // TS
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_int_variable(char_int); // 160
bfr.Add_byte(Byte_ascii.Semic); // ;
bfr.Add(Escape_bgn); // &#
bfr.Add_int_variable(char_int); // 160
bfr.Add_byte(Byte_ascii.Semic); // ;
break;
}
}
@ -52,6 +51,7 @@ public class Xop_amp_trie_itm { // TS
default: bfr.Add(u8_bry); break; // write literal; EX: "[" not "&#91;"
}
}
private static final byte[] Escape_bgn = Bry_.new_a7("&#");
public static final byte Tid_name_std = 1, Tid_name_xowa = 2, Tid_num_hex = 3, Tid_num_dec = 4;
public static final int Char_int_null = -1;
}

View File

@ -15,9 +15,9 @@ 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.parsers.amps; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
package gplx.langs.htmls.entitys; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*;
import gplx.core.btries.*;
public class Xop_amp_trie { // TS
public class Gfh_entity_trie { // TS
public static final String // NOTE: top_define; entities needed for <nowiki> escaping
Str__xowa_lt = "&xowa_lt;"
, Str__xowa_brack_bgn = "&xowa_brack_bgn;"
@ -31,7 +31,7 @@ public class Xop_amp_trie { // TS
, Str__xowa_nl = "&xowa_nl;"
, Str__xowa_dash = "&xowa_dash;"
;
public static final Btrie_slim_mgr Instance = New(); Xop_amp_trie() {}
public static final Btrie_slim_mgr Instance = New(); Gfh_entity_trie() {}
private static Btrie_slim_mgr New() {// REF.MW: Sanitizer|$wgHtmlEntities; NOTE:added apos
Btrie_slim_mgr rv = Btrie_slim_mgr.cs();
Add_name(rv, Bool_.Y, 60, Str__xowa_lt);
@ -298,20 +298,20 @@ public class Xop_amp_trie { // TS
Add_name(rv, Bool_.N, 950, "&zeta;");
Add_name(rv, Bool_.N, 8205, "&zwj;");
Add_name(rv, Bool_.N, 8204, "&zwnj;");
Add_prefix(rv, Xop_amp_trie_itm.Tid_num_hex, "#x");
Add_prefix(rv, Xop_amp_trie_itm.Tid_num_hex, "#X");
Add_prefix(rv, Xop_amp_trie_itm.Tid_num_dec, "#");
Add_prefix(rv, Gfh_entity_itm.Tid_num_hex, "#x");
Add_prefix(rv, Gfh_entity_itm.Tid_num_hex, "#X");
Add_prefix(rv, Gfh_entity_itm.Tid_num_dec, "#");
return rv;
}
private static void Add_name(Btrie_slim_mgr trie, boolean tid_is_xowa, int char_int, String xml_name_str) {
byte itm_tid = tid_is_xowa ? Xop_amp_trie_itm.Tid_name_xowa : Xop_amp_trie_itm.Tid_name_std;
byte itm_tid = tid_is_xowa ? Gfh_entity_itm.Tid_name_xowa : Gfh_entity_itm.Tid_name_std;
byte[] xml_name_bry = Bry_.new_a7(xml_name_str);
byte[] key = Bry_.Mid(xml_name_bry, 1, xml_name_bry.length); // ignore & for purpose of trie; EX: "amp;"; NOTE: must keep trailing ";" else "&amp " will be valid;
trie.Add_obj(key, new Xop_amp_trie_itm(itm_tid, char_int, xml_name_bry));
trie.Add_obj(key, new Gfh_entity_itm(itm_tid, char_int, xml_name_bry));
}
private static void Add_prefix(Btrie_slim_mgr trie, byte prefix_type, String prefix) {
byte[] prefix_ary = Bry_.new_u8(prefix);
Xop_amp_trie_itm itm = new Xop_amp_trie_itm(prefix_type, Xop_amp_trie_itm.Char_int_null, prefix_ary);
Gfh_entity_itm itm = new Gfh_entity_itm(prefix_type, Gfh_entity_itm.Char_int_null, prefix_ary);
trie.Add_obj(prefix_ary, itm);
}
}

View File

@ -24,7 +24,7 @@ import java.net.URLEncoder;
class Gfo_email_mgr__jre implements Gfo_email_mgr {
public void Send(String to, String subject, String body) {
try {
Gfo_url_encoder url_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_wnt;
Gfo_url_encoder url_encoder = Gfo_url_encoder_.New__fsys_wnt().Make();
subject = url_encoder.Encode_str(subject);
body = url_encoder.Encode_str(body);
body = String_.Replace(body, "`", "%60");

View File

@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.htmls; import gplx.*; import gplx.langs.*;
import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.langs.htmls.encoders.*;
import gplx.langs.htmls.entitys.*;
public class Gfh_utl {
private static final Gfo_url_encoder encoder_id = Gfo_url_encoder_.Id;
public static String Encode_id_as_str(byte[] key) {return String_.new_u8(Encode_id_as_bry(key));}

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.langs.htmls.encoders; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*;
import gplx.core.btries.*; import gplx.xowa.parsers.amps.*;
import gplx.core.btries.*;
import gplx.langs.htmls.*;
public class Gfo_url_encoder implements Url_encoder_interface {
private final Gfo_url_encoder_itm[] encode_ary, decode_ary; private final Gfo_url_encoder anchor_encoder;

View File

@ -17,28 +17,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.htmls.encoders; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*;
import gplx.core.btries.*;
import gplx.xowa.parsers.amps.*;
import gplx.langs.htmls.entitys.*;
public class Gfo_url_encoder_ {
public static Gfo_url_encoder New__id() {return Gfo_url_encoder_.New__html_id().Make();}
public static final Gfo_url_encoder
Id = Gfo_url_encoder_.New__html_id().Make()
, Href = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Make()
, Href_wo_anchor = Gfo_url_encoder_.New__html_href_mw(Bool_.N).Make()
, Href_quotes = Gfo_url_encoder_.New__html_href_quotes().Make()
, Href_quotes_v2 = Gfo_url_encoder_.New__html_href_quotes_v2().Make()
, Href_qarg = Gfo_url_encoder_.New__html_href_qarg().Make()
, Xourl = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Init__same__many(Byte_ascii.Underline).Make()
, Http_url = Gfo_url_encoder_.New__http_url().Make()
, Http_url_ttl = Gfo_url_encoder_.New__http_url_ttl().Make()
, Fsys_lnx = Gfo_url_encoder_.New__fsys_lnx().Make()
, Fsys_wnt = Gfo_url_encoder_.New__fsys_wnt().Make()
, Gfs = Gfo_url_encoder_.New__gfs().Make()
;
private static Gfo_url_encoder_mkr New__html_id() { // EX: "<a id='a<>b'>" -> "<a id='a.C3.A9b'>"
public static Gfo_url_encoder_mkr New__html_id() { // EX: "<a id='a<>b'>" -> "<a id='a.C3.A9b'>"
return new Gfo_url_encoder_mkr().Init(Byte_ascii.Dot).Init_common(Bool_.Y)
.Init__decode_mark(Byte_ascii.Dot)
.Init__diff__one(Byte_ascii.Space, Byte_ascii.Underline)
.Init__html_ent(Byte_ascii.Amp, Xop_amp_trie.Instance);
.Init__html_ent(Byte_ascii.Amp, Gfh_entity_trie.Instance);
}
public static Gfo_url_encoder_mkr New__html_href_mw(boolean use_anchor_encoder) { // EX: "<a href='^#^'>" -> "<a href='%5E#.5E'>"; REF.MW: ";:@$!*(),/"
return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y)
@ -79,12 +65,12 @@ public class Gfo_url_encoder_ {
private static Gfo_url_encoder_mkr New__http_url_ttl() {
return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y);
}
private static Gfo_url_encoder_mkr New__fsys_lnx() {
public static Gfo_url_encoder_mkr New__fsys_lnx() {
return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y)
.Init__same__many(Byte_ascii.Slash)
.Init__diff__one(Byte_ascii.Backslash, Byte_ascii.Slash);
}
private static Gfo_url_encoder_mkr New__fsys_wnt() {
public static Gfo_url_encoder_mkr New__fsys_wnt() {
return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent)
.Init__same__rng(Byte_ascii.Num_0, Byte_ascii.Num_9)
.Init__same__rng(Byte_ascii.Ltr_A, Byte_ascii.Ltr_Z)
@ -95,8 +81,19 @@ public class Gfo_url_encoder_ {
, Byte_ascii.Dot, Byte_ascii.Comma
, Byte_ascii.Tick, Byte_ascii.Tilde, Byte_ascii.Brack_bgn, Byte_ascii.Brack_end, Byte_ascii.Curly_bgn, Byte_ascii.Curly_end);
}
private static Gfo_url_encoder_mkr New__gfs() {
public static Gfo_url_encoder_mkr New__gfs() {
return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y)
.Init__same__many(Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Apos, Byte_ascii.Semic);
}
public static final Gfo_url_encoder
Id = Gfo_url_encoder_.New__html_id().Make()
, Href = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Make()
, Href_wo_anchor = Gfo_url_encoder_.New__html_href_mw(Bool_.N).Make()
, Href_quotes = Gfo_url_encoder_.New__html_href_quotes().Make()
, Href_quotes_v2 = Gfo_url_encoder_.New__html_href_quotes_v2().Make()
, Href_qarg = Gfo_url_encoder_.New__html_href_qarg().Make()
, Xourl = Gfo_url_encoder_.New__html_href_mw(Bool_.Y).Init__same__many(Byte_ascii.Underline).Make()
, Http_url = Gfo_url_encoder_.New__http_url().Make()
, Http_url_ttl = Gfo_url_encoder_.New__http_url_ttl().Make()
;
}

View File

@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.langs.htmls.encoders; import gplx.*; import gplx.langs.*; import gplx.langs.htmls.*;
import gplx.core.btries.*; import gplx.xowa.parsers.amps.*;
import gplx.core.btries.*;
import gplx.langs.htmls.entitys.*;
public interface Gfo_url_encoder_itm {
int Encode(Bry_bfr bfr, byte[] src, int end, int idx, byte b);
int Decode(Bry_bfr bfr, byte[] src, int end, int idx, byte b, boolean fail_when_invalid);
@ -91,7 +92,7 @@ class Gfo_url_encoder_itm_html_ent implements Gfo_url_encoder_itm {
return 0;
}
else {
Xop_amp_trie_itm itm = (Xop_amp_trie_itm)o;
Gfh_entity_itm itm = (Gfh_entity_itm)o;
byte[] bry_u8 = itm.U8_bry(); // NOTE: must utf8 encode val; EX: &nbsp; is 160 but must become 192,160
for (int i = 0; i < bry_u8.length; i++)
Gfo_url_encoder_itm_hex.Encode_byte(bry_u8[i], bfr, Byte_ascii.Dot);

View File

@ -54,7 +54,7 @@ class Gfo_url_encoder_fxt {
public Gfo_url_encoder_fxt Encoder_id() {encoder = Gfo_url_encoder_.Id; return this;}
public Gfo_url_encoder_fxt Encoder_href() {encoder = Gfo_url_encoder_.Href; return this;}
public Gfo_url_encoder_fxt Encoder_url() {encoder = Gfo_url_encoder_.Http_url; return this;}
public Gfo_url_encoder_fxt Encoder_fsys_safe() {encoder = Gfo_url_encoder_.Fsys_wnt; return this;}
public Gfo_url_encoder_fxt Encoder_fsys_safe() {encoder = Gfo_url_encoder_.New__fsys_wnt().Make(); return this;}
public void Test__bicode(String raw, String encoded) {
Test__encode(raw, encoded);
Test__decode(encoded, raw);

View File

@ -36,6 +36,10 @@ public class Json_nde extends Json_itm_base implements Json_grp {
Json_itm rv = Get_as_itm_or_null(key); if (rv == null) throw Err_.new_("json", "key missing", "key", key);
return Json_ary.cast(rv);
}
public byte[] Get_as_bry(String key) {
byte[] rv = Get_as_bry_or(Bry_.new_u8(key), null); if (rv == null) throw Err_.new_("json", "key missing", "key", key);
return rv;
}
public byte[] Get_as_bry_or(byte[] key, byte[] or) {
Json_itm rv = Get_as_itm_or_null(key);
return rv == null ? or : rv.Data_bry();
@ -72,6 +76,10 @@ public class Json_nde extends Json_itm_base implements Json_grp {
byte[] rv = Get_as_bry_or(key, null);
return rv == null ? or : Bry_.Eq(rv, Bool_.True_bry);
}
public DateAdp Get_as_date_by_utc(String key) {
byte[] rv = Get_as_bry_or(Bry_.new_u8(key), null); if (rv == null) throw Err_.new_("json", "key missing", "key", key);
return DateAdp_.parse_gplx(String_.new_u8(rv));
}
// to convert
public boolean Has(byte[] key) {return Get_bry(key, null) != null;}

View File

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

View File

@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa; import gplx.*;
import gplx.core.primitives.*; import gplx.core.btries.*;
import gplx.langs.htmls.entitys.*;
import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.miscs.*;
import gplx.xowa.apps.urls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.langs.cases.*;
@ -68,7 +69,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF.
public byte[] Subj_txt() {return ns.Id_is_subj() ? Full_txt_w_ttl_case() : Bry_.Add(tors_txt, Page_txt());}
public byte[] Full_url() {
synchronized (href_encoder) { // LOCK:static-obj
return Gfo_url_encoder_.Href.Encode(full_txt);
return href_encoder.Encode(full_txt);
}
}
public String Full_db_as_str() {return String_.new_u8(Full_db());}
@ -259,9 +260,9 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF.
if (trv == null) trv = new Btrie_rv();
Object html_ent_obj = amp_trie.Match_at(trv, src, cur2, end);
if (html_ent_obj != null) {
Xop_amp_trie_itm amp_itm = (Xop_amp_trie_itm)html_ent_obj;
Gfh_entity_itm amp_itm = (Gfh_entity_itm)html_ent_obj;
match_pos = trv.Pos();
if (amp_itm.Tid() == Xop_amp_trie_itm.Tid_name_std) {
if (amp_itm.Tid() == Gfh_entity_itm.Tid_name_std) {
switch (amp_itm.Char_int()) {
case 160: // NOTE: &nbsp must convert to space; EX:w:United States [[Image:Dust Bowl&nbsp;- Dallas, South Dakota 1936.jpg|220px|alt=]]
if (ltr_bgn != -1) add_ws = true; // apply same ws rules as Space, NewLine; needed for converting multiple ws into one; EX:" &nbsp; " -> " " x> " "; PAGEen.w:Greek_government-debt_crisis; DATE:2014-09-25
@ -275,7 +276,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF.
case Byte_ascii.Gt:
b_ary = amp_itm.Xml_name_bry();
break;
case Xop_amp_trie_itm.Char_int_null: // &#xx;
case Gfh_entity_itm.Char_int_null: // &#xx;
int end_pos = Bry_find_.Find_fwd(src, Byte_ascii.Semic, match_pos, end);
if (end_pos == Bry_find_.Not_found) {} // &# but no terminating ";" noop: defaults to current_byte which will be added below;
else {
@ -290,7 +291,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF.
}
else {
Xop_amp_mgr_rslt amp_rv = new Xop_amp_mgr_rslt();
amp_mgr.Parse_ncr(amp_rv, amp_itm.Tid() == Xop_amp_trie_itm.Tid_num_hex, src, end, cur2, match_pos);
amp_mgr.Parse_ncr(amp_rv, amp_itm.Tid() == Gfh_entity_itm.Tid_num_hex, src, end, cur2, match_pos);
if (amp_rv.Pass()) {
b_ary = gplx.core.intls.Utf16_.Encode_int_to_bry(amp_rv.Val());
if (b_ary.length == 1 && b_ary[0] == Byte_ascii.Hash) // NOTE: A&#x23;B should be interpreted as A#b; PAGE:en.s:The_English_Constitution_(1894) DATE:2014-09-07

View File

@ -35,7 +35,7 @@ public class Xoae_app implements Xoa_app, Gfo_invk {
public Xoae_app(Gfo_usr_dlg usr_dlg, Xoa_app_mode mode, Io_url root_dir, Io_url wiki_dir, Io_url file_dir, Io_url user_dir, Io_url css_dir, String bin_dir_name) {
Xoa_app_.Usr_dlg_(usr_dlg);
this.mode = mode;
Io_url.Http_file_str_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx;
Io_url.Http_file_str_encoder = Gfo_url_encoder_.New__fsys_lnx().Make();
fsys_mgr = new Xoa_fsys_mgr(bin_dir_name, root_dir, wiki_dir, file_dir, css_dir, root_dir);
log_wtr = usr_dlg.Log_wkr();
cfg_mgr = new Xoa_cfg_mgr(this);
@ -52,7 +52,6 @@ public class Xoae_app implements Xoa_app, Gfo_invk {
this.gui__tab_mgr = new Xog_tab_mgr__swt(gui_mgr);
bldr = new Xob_bldr(this);
file_mgr.Ctor_by_app(this);
sanitizer = new Xop_sanitizer(parser_amp_mgr, msg_log);
user_mgr = new Xou_user_mgr(this, user);
sys_cfg = new Xoa_sys_cfg(this);
cur_redirect = new Xoa_cur(this);
@ -119,7 +118,6 @@ public class Xoae_app implements Xoa_app, Gfo_invk {
public Xoa_shell Shell() {return shell;} private Xoa_shell shell;
public Xoa_thread_mgr Thread_mgr_old() {return thread_mgr_old;} private Xoa_thread_mgr thread_mgr_old = new Xoa_thread_mgr();
public Xoa_hive_mgr Hive_mgr() {return hive_mgr;} private Xoa_hive_mgr hive_mgr;
public Xop_sanitizer Sanitizer() {return sanitizer;} private Xop_sanitizer sanitizer;
public Xof_math_subst_regy Math_subst_regy() {return math_subst_regy;} private Xof_math_subst_regy math_subst_regy = new Xof_math_subst_regy();
public Xoa_prog_mgr Prog_mgr() {return prog_mgr;} private final Xoa_prog_mgr prog_mgr = new Xoa_prog_mgr();
public Gfo_async_mgr Async_mgr() {return async_mgr;} private Gfo_async_mgr async_mgr = new Gfo_async_mgr();

View File

@ -306,7 +306,8 @@ public class Xop_fxt {
}
public Xop_fxt Test_parse_page_wiki_str__esc(String raw, String expd) {return Test_parse_page_wiki_str(raw, Xoh_consts.Escape_apos(expd));}
public Xop_fxt Test_parse_page_wiki_str(String raw, String expd) {
Tfds.Eq_str_lines(expd, Exec_parse_page_wiki_as_str(raw), raw);
String actl = Exec_parse_page_wiki_as_str(raw);
Tfds.Eq_str_lines(expd, actl, raw);
return this;
}
public void Log_clear() {ctx.App().Msg_log().Clear();}

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa; import gplx.*;
public class Xowa_main {
public static void main(String[] args) {
public static void main(String[] args) {
gplx.xowa.Xoa_app_.Run(args);
}
}

View File

@ -42,6 +42,7 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm {
this.html__hdump_mgr = new Xow_hdump_mgr(this);
this.html_mgr = new Xow_html_mgr(this);
this.page_mgr = new Xowe_page_mgr(this);
this.sanitizer = new Xop_sanitizer(app.Parser_amp_mgr(), app.Msg_log());
tdb_fsys_mgr = new Xotdb_fsys_mgr(wiki_dir, ns_mgr);
redirect_mgr = new Xop_redirect_mgr(this);
@ -112,6 +113,8 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm {
public Xoax_addon_mgr Addon_mgr() {return addon_mgr;} private final Xoax_addon_mgr addon_mgr = new Xoax_addon_mgr();
public Xog_cbk_mgr Gui__cbk_mgr() {return gui__cbk_mgr;} private final Xog_cbk_mgr gui__cbk_mgr = new Xog_cbk_mgr();
public Xowe_page_mgr Page_mgr() {return page_mgr;} private final Xowe_page_mgr page_mgr;
public Xop_sanitizer Sanitizer() {return sanitizer;} private final Xop_sanitizer sanitizer;
public Xow_hdump_mgr Html__hdump_mgr() {return html__hdump_mgr;} private final Xow_hdump_mgr html__hdump_mgr;
public Xoae_app Appe() {return app;} private Xoae_app app;

View File

@ -37,7 +37,8 @@ public class Xoax_addon_mgr {
app.Addon_mgr().Itms__add_many
// bldrs
( new gplx.xowa.addons.bldrs.files .Xoax_builds_files_addon()
, new gplx.xowa.addons.bldrs.pagelinks .Xoax_builds_pagelinks_addon()
, new gplx.xowa.addons.bldrs.wmdumps.pagelinks .Xoax_builds_pagelinks_addon()
, new gplx.xowa.addons.bldrs.wmdumps.imglinks .Imglnk_addon()
, new gplx.xowa.addons.bldrs.utils_rankings .Xoax_builds_utils_rankings_addon()
, new gplx.xowa.addons.wikis.searchs .Xoax_builds_search_addon()
, new gplx.xowa.addons.bldrs.updates.files .Xoax_updates_files_addon()

View File

@ -37,7 +37,7 @@ public class Xobldr__fsdb_db__create_data extends Xob_cmd__base implements Xob_c
public Xobldr__fsdb_db__create_data(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);
if (bldr != null) {
this.poll_mgr = new Xobu_poll_mgr(bldr.App());
wiki.File__fsdb_mode().Tid_v2_bld_y_();
wiki.File__fsdb_mode().Tid__v2__bld__y_();
this.src_bin_mgr = new Xof_bin_mgr(new Fsm_mnt_mgr(), wiki.File__repo_mgr(), app.File__img_mgr().Wkr_resize_img(), app.Wmf_mgr().Download_wkr().Download_xrg().Download_fmt());
}
}

View File

@ -24,7 +24,7 @@ public class Xobldr__fsdb_db__create_orig extends Xob_cmd__base {
public Xobldr__fsdb_db__create_orig(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);}
@Override public void Cmd_bgn(Xob_bldr bldr) {
Xof_fsdb_mode fsdb_mode = wiki.File__fsdb_mode();
fsdb_mode.Tid_v2_bld_y_();
fsdb_mode.Tid__v2__bld__y_();
wiki.Init_assert();
Fsdb_db_mgr db_core_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir());
this.schema_1 = db_core_mgr.File__schema_is_1();

View File

@ -81,13 +81,13 @@ public class Xobldr__lnki_temp__create extends Xob_dump_mgr_base implements gplx
// init fsdb
Xof_fsdb_mgr__sql trg_fsdb_mgr = new Xof_fsdb_mgr__sql();
wiki.File__fsdb_mode().Tid_v2_bld_y_();
wiki.File__fsdb_mode().Tid__v2__bld__y_();
Fsdb_db_mgr__v2 fsdb_core = Fsdb_db_mgr__v2_bldr.Get_or_make(wiki, Bool_.Y);
trg_fsdb_mgr.Init_by_wiki(wiki);
Fsm_mnt_mgr trg_mnt_mgr = trg_fsdb_mgr.Mnt_mgr();
wiki.File_mgr().Init_file_mgr_by_load(wiki); // must happen after fsdb.make
wiki.File__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // must happen after init_file_mgr_by_load; remove wmf wkr, else will try to download images during parsing
wiki.File__orig_mgr().Wkrs_del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api);
wiki.File__orig_mgr().Wkrs__del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api);
trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(fsdb_core);
trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main);

View File

@ -45,7 +45,9 @@ class Dumpdiff_log_tbl implements Db_tbl {
conn.Txn_end();
stmt__insert.Rls();
}
public void Rls() {}
public void Rls() {
stmt__insert = Db_stmt_.Rls(stmt__insert);
}
public static Dumpdiff_log_tbl New(Xowe_wiki wiki) {
Db_conn conn = Db_conn_bldr.Instance.Get_or_autocreate(true, wiki.Fsys_mgr().Root_dir().GenSubFil("xowa.diff.sqlite3"));

View File

@ -35,7 +35,9 @@ class Xomp_html_db_rdr {
src_tbl.Select_as_row(rv, page_id);
}
public void Rls() {
for (Xowd_html_tbl src_tbl : src_tbls)
for (Xowd_html_tbl src_tbl : src_tbls) {
if (src_tbl == null) continue; // can be null if fsys has dirs, but db does not have any wkr_ids
src_tbl.Conn().Rls_conn();
}
}
}

View File

@ -20,6 +20,7 @@ import gplx.core.threads.*; import gplx.core.threads.utils.*; import gplx.core.c
import gplx.xowa.langs.*; import gplx.xowa.langs.cases.*;
import gplx.xowa.addons.bldrs.mass_parses.dbs.*;
import gplx.xowa.wikis.caches.*;
import gplx.xowa.addons.bldrs.wmdumps.imglinks.*;
class Xomp_parse_mgr {
private Gfo_countdown_latch latch;
public Xomp_parse_mgr_cfg Cfg() {return cfg;} private final Xomp_parse_mgr_cfg cfg = new Xomp_parse_mgr_cfg();
@ -37,6 +38,7 @@ class Xomp_parse_mgr {
Xow_page_cache page_cache = Xomp_tmpl_cache_bldr.New(wiki, cfg.Load_all_templates());
Gfo_cache_mgr commons_cache = new Gfo_cache_mgr().Max_size_(Int_.Max_value).Reduce_by_(Int_.Max_value);
Gfo_cache_mgr ifexist_cache = new Gfo_cache_mgr().Max_size_(Int_.Max_value).Reduce_by_(Int_.Max_value);
Xof_orig_wkr__img_links orig_wkr = Xof_orig_wkr__img_links_.Load_all(wiki);
// load_wkr: init and start
// Xomp_load_wkr load_wkr = new Xomp_load_wkr(wiki, db_core.Mgr_db().Conn(), cfg.Num_pages_in_pool(), cfg.Num_wkrs());
@ -48,7 +50,7 @@ class Xomp_parse_mgr {
Xomp_parse_wkr[] wkrs = new Xomp_parse_wkr[wkr_len];
for (int i = 0; i < wkr_len; ++i) {
Xowe_wiki wkr_wiki = Xow_wiki_utl_.Clone_wiki(wiki, wiki.Fsys_mgr().Root_dir());
Xomp_parse_wkr wkr = new Xomp_parse_wkr(this, wkr_wiki, page_pool, i, cfg, cfg.Cleanup_interval(), cfg.Progress_interval(), cfg.Log_file_lnkis());
Xomp_parse_wkr wkr = new Xomp_parse_wkr(this, wkr_wiki, orig_wkr, page_pool, i, cfg, cfg.Cleanup_interval(), cfg.Progress_interval(), cfg.Log_file_lnkis());
wkr_wiki.Cache_mgr().Page_cache_(page_cache).Commons_cache_(commons_cache).Ifexist_cache_(ifexist_cache);
// remove wmf wkr, else will try to download images during parsing
if (wkr_wiki.File__bin_mgr() != null)

View File

@ -17,19 +17,21 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.mass_parses.parses; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.mass_parses.*;
import gplx.dbs.*; import gplx.xowa.addons.bldrs.mass_parses.dbs.*;
import gplx.xowa.files.origs.*;
import gplx.xowa.htmls.core.bldrs.*;
import gplx.xowa.parsers.*;
class Xomp_parse_wkr implements Gfo_invk {
private final Xomp_parse_mgr mgr;
private final Xomp_page_pool page_pool;
private final Xof_orig_wkr orig_wkr;
private final int idx;
private final List_adp list = List_adp_.New(); private int list_idx = 0, list_len = 0;
private final Xomp_parse_mgr_cfg cfg;
private int done_count; private long done_time;
private Xomp_wkr_db wkr_db; private int cleanup_interval, commit_interval;
private boolean log_file_lnkis;
public Xomp_parse_wkr(Xomp_parse_mgr mgr, Xowe_wiki wiki, Xomp_page_pool page_pool, int idx, Xomp_parse_mgr_cfg cfg, int cleanup_interval, int commit_interval, boolean log_file_lnkis) {
this.mgr = mgr; this.wiki = wiki;
public Xomp_parse_wkr(Xomp_parse_mgr mgr, Xowe_wiki wiki, Xof_orig_wkr orig_wkr, Xomp_page_pool page_pool, int idx, Xomp_parse_mgr_cfg cfg, int cleanup_interval, int commit_interval, boolean log_file_lnkis) {
this.mgr = mgr; this.wiki = wiki; this.orig_wkr = orig_wkr;
this.page_pool = page_pool;
this.idx = idx;
this.wkr_db = mgr.Db_core().Wkr_db(Bool_.Y, idx); // NOTE: must go in ctor, or else thread issues
@ -39,7 +41,7 @@ class Xomp_parse_wkr implements Gfo_invk {
this.log_file_lnkis = log_file_lnkis;
}
public Xowe_wiki Wiki() {return wiki;} private final Xowe_wiki wiki;
public Xob_hdump_bldr Hdump_bldr() {return hdump_bldr;} private final Xob_hdump_bldr hdump_bldr = new Xob_hdump_bldr();
public Xob_hdump_bldr Hdump_bldr() {return hdump_bldr;} private final Xob_hdump_bldr hdump_bldr = new Xob_hdump_bldr();
public void Exec() {
// init
Xow_parser_mgr parser_mgr = wiki.Parser_mgr();
@ -47,7 +49,7 @@ class Xomp_parse_wkr implements Gfo_invk {
// disable file download
wiki.File_mgr().Init_file_mgr_by_load(wiki); // must happen after fsdb.make
wiki.File__bin_mgr().Wkrs__del(gplx.xowa.files.bins.Xof_bin_wkr_.Key_http_wmf); // must happen after init_file_mgr_by_load; remove wmf wkr, else will try to download images during parsing
wiki.File__orig_mgr().Wkrs_del(gplx.xowa.files.origs.Xof_orig_wkr_.Tid_wmf_api);
wiki.File__orig_mgr().Wkrs__set(orig_wkr);
// disable categories else progress messages written (also for PERF)
wiki.Html_mgr().Page_wtr_mgr().Wkr(gplx.xowa.wikis.pages.Xopg_page_.Tid_read).Ctgs_enabled_(false);

View File

@ -23,6 +23,8 @@ public class Xow_wiki_utl_ {
Xol_lang_itm_.Lang_init(lang);
Xowe_wiki rv = new Xowe_wiki(wiki.Appe(), lang, gplx.xowa.wikis.nss.Xow_ns_mgr_.default_(lang.Case_mgr()), wiki.Domain_itm(), wiki_dir);
rv.Init_by_wiki();
rv.File_mgr().Repo_mgr().Clone(wiki.File_mgr().Repo_mgr());
rv.File__fsdb_mode().Tid__v2__bld__y_();
return rv;
}
}

View File

@ -0,0 +1,77 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.dbs.*;
public abstract class Db_bulk_cmd_base {
public void Exec() {
int uid_max = Get_uid_max();
int uid_rng = Get_uid_rng();
int uid_bgn = -1, uid_end = uid_rng;
this.Bulk_bgn();
while (uid_bgn <= uid_max) {
Bulk_run(uid_bgn, uid_end);
uid_bgn += uid_rng;
uid_end += uid_rng;
}
this.Bulk_end();
}
protected abstract int Get_uid_max();
protected abstract int Get_uid_rng();
protected abstract void Bulk_bgn();
protected abstract void Bulk_end();
protected abstract void Bulk_run(int uid_bgn, int uid_end);
}
class Imglnk_bulk_cmd__img_id extends Db_bulk_cmd_base {
private final Db_conn conn;
private final Db_attach_mgr attach_mgr;
private final int img_wiki;
private String sql;
public Imglnk_bulk_cmd__img_id(Db_conn conn, boolean wiki_is_local, Xowe_wiki wiki) {
this.conn = conn;
this.attach_mgr = new Db_attach_mgr(conn, new Db_attach_itm("page_db", wiki.Data__core_mgr().Db__core().Tbl__page().Conn()));
this.img_wiki = wiki_is_local ? 0 : 1;
// xowa.wiki.image.sqlite3
// INSERT INTO img_link (img_name, img_wiki) SELECT img_name, Count(img_name) FROM img_link_tmp GROUP BY img_name
}
@Override protected int Get_uid_max() {
return conn.Exec_select_as_int("SELECT Max(img_uid) FROM img_link_tmp", -1);
}
@Override protected int Get_uid_rng() {return 10000;}
@Override protected void Bulk_bgn() {
sql = String_.Concat_lines_nl_skip_last // ANSI.Y
( "UPDATE img_link_tmp"
, "SET img_wiki = {0}"
, ", img_id = (SELECT p.page_id FROM <page_db>page p WHERE p.page_namespace = 6 AND p.page_title = img_link_tmp.img_name)"
, "WHERE img_uid > {1} AND img_uid <= {2}"
, "AND img_name IN (SELECT p.page_title FROM <page_db>page p WHERE p.page_namespace = 6 AND p.page_title = img_link_tmp.img_name)"
);
sql = attach_mgr.Resolve_sql(sql);
attach_mgr.Attach();
conn.Txn_bgn("imglnk.bulk");
}
@Override protected void Bulk_end() {
conn.Txn_end();
attach_mgr.Detach();
}
@Override protected void Bulk_run(int uid_bgn, int uid_end) {
conn.Exec_sql(String_.Format("updating img_link_tmp; wiki={0} uid={1}", img_wiki, uid_bgn), String_.Format(sql, img_wiki, uid_bgn, uid_end));
}
public static void Bulk_exec(Db_conn conn, boolean wiki_is_local, Xowe_wiki wiki) {
new Imglnk_bulk_cmd__img_id(conn, wiki_is_local, wiki).Exec();
}
}

View File

@ -0,0 +1,29 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.*;
public class Imglnk_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr {
public Xob_cmd[] Bldr_cmds() {
return new Xob_cmd[]
{ Imglnk_bldr_cmd.Prototype
};
}
public String Addon__key() {return "xowa.builds.imglinks";}
}

View File

@ -0,0 +1,51 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.dbs.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*;
public class Imglnk_bldr_cmd extends Xob_sql_dump_base implements Sql_file_parser_cmd {
private Imglnk_bldr_mgr mgr;
private int tmp_page_id;
private int rows = 0;
public Imglnk_bldr_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki); this.make_fil_len = Io_mgr.Len_mb;}
@Override public String Sql_file_name() {return "imagelinks";}
@Override public void Cmd_bgn_hook(Xob_bldr bldr, Sql_file_parser parser) {
parser.Fld_cmd_(this).Flds_req_idx_(3, 0, 1);
mgr = new Imglnk_bldr_mgr(wiki);
}
public void Exec(byte[] src, byte[] fld_key, int fld_idx, int fld_bgn, int fld_end, Bry_bfr file_bfr, Sql_file_parser_data data) {
switch (fld_idx) {
case Fld__il_from: this.tmp_page_id = Bry_.To_int_or(src, fld_bgn, fld_end, -1); break;
case Fld__il_to:
mgr.Tmp_tbl().Insert_by_batch(tmp_page_id, Bry_.Mid(src, fld_bgn, fld_end));
if (++rows % 100000 == 0) usr_dlg.Prog_many("", "", "reading row ~{0}", Int_.To_str_fmt(rows, "#,##0"));
break;
}
} private static final byte Fld__il_from = 0, Fld__il_to = 1;
@Override public void Cmd_end() {
if (fail) return;
mgr.On_cmd_end();
}
public static final String BLDR_CMD_KEY = "wiki.imagelinks";
@Override public String Cmd_key() {return BLDR_CMD_KEY;}
public static final Xob_cmd Prototype = new Imglnk_bldr_cmd(null, null);
@Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Imglnk_bldr_cmd(bldr, wiki);}
}

View File

@ -0,0 +1,51 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.dbs.*;
import gplx.xowa.bldrs.*;
import gplx.xowa.files.repos.*;
class Imglnk_bldr_mgr {
private final Db_conn conn;
private final Xowe_wiki wiki;
public Imglnk_tmp_tbl Tmp_tbl() {return tmp_tbl;} private Imglnk_tmp_tbl tmp_tbl;
public Imglnk_bldr_mgr(Xowe_wiki wiki) {
wiki.Init_assert();
this.wiki = wiki;
this.conn = Xob_db_file.New__img_link(wiki).Conn();
this.tmp_tbl = new Imglnk_tmp_tbl(conn);
conn.Meta_tbl_remake(tmp_tbl);
tmp_tbl.Create_tbl();
tmp_tbl.Insert_bgn();
}
public void On_cmd_end() {
// finalize txn; create idx
tmp_tbl.Insert_end();
tmp_tbl.Create_idx__img_ttl();
// create reg_tbl
Imglnk_reg_tbl reg_tbl = new Imglnk_reg_tbl(conn);
conn.Meta_tbl_remake(reg_tbl);
reg_tbl.Create_idx__src_ttl();
reg_tbl.Insert(conn, Xof_repo_itm_.Repo_local , wiki);
reg_tbl.Insert(conn, Xof_repo_itm_.Repo_remote, wiki.Appe().Wiki_mgr().Wiki_commons());
reg_tbl.Create_idx__trg_ttl();
// Imglnk_bulk_cmd__img_id.Bulk_exec(conn, Bool_.Y, wiki);
// Imglnk_bulk_cmd__img_id.Bulk_exec(conn, Bool_.N, wiki.Appe().Wiki_mgr().Wiki_commons());
}
}

View File

@ -0,0 +1,69 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.dbs.*;
import gplx.xowa.bldrs.*;
public class Imglnk_reg_tbl implements Db_tbl {
private final String tbl_name = "imglnk_reg"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__img_src, fld__img_trg, fld__img_repo;
private final Db_conn conn;
public Imglnk_reg_tbl(Db_conn conn) {
this.conn = conn;
fld__img_src = flds.Add_str("img_src", 255);
fld__img_trg = flds.Add_str("img_trg", 255);
fld__img_repo = flds.Add_byte("img_repo");
flds.Add_int("img_count");
conn.Rls_reg(this);
}
public Db_conn Conn() {return conn;}
public String Tbl_name() {return tbl_name;}
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));}
public void Create_idx__src_ttl() {conn.Meta_idx_create(tbl_name, fld__img_src, fld__img_src, fld__img_repo);}
public void Create_idx__trg_ttl() {conn.Meta_idx_create(tbl_name, fld__img_trg, fld__img_trg, fld__img_repo);}
public void Insert(Db_conn conn, byte repo_id, Xowe_wiki wiki) {
String repo_id_str = Byte_.To_str(repo_id);
Db_attach_mgr attach_mgr = new Db_attach_mgr(conn);
String sql = "";
Xob_db_file redirect_db = Xob_db_file.New__wiki_redirect(wiki.Fsys_mgr().Root_dir());
attach_mgr.Conn_links_(new Db_attach_itm("redirect_db", redirect_db.Conn()));
sql = String_.Concat_lines_nl_skip_last // ANSI.Y
( "INSERT INTO imglnk_reg (img_src, img_trg, img_repo, img_count)"
, "SELECT ilt.img_name, r.trg_ttl, " + repo_id_str + ", Count(ilt.img_name)"
, "FROM imglnk_tmp ilt"
, " JOIN <redirect_db>redirect r ON ilt.img_name = r.src_ttl"
, " LEFT JOIN imglnk_reg il ON il.img_src = ilt.img_name"
, "WHERE il.img_src IS NULL"
, "GROUP BY ilt.img_name"
);
attach_mgr.Exec_sql_w_msg("imglnk_reg.insert.redirect: repo=" + repo_id_str, sql);
attach_mgr.Conn_links_(new Db_attach_itm("page_db", wiki.Data__core_mgr().Db__core().Tbl__page().Conn()));
sql = String_.Concat_lines_nl_skip_last // ANSI.Y
( "INSERT INTO imglnk_reg (img_src, img_trg, img_repo, img_count)"
, "SELECT ilt.img_name, ilt.img_name, " + repo_id_str + ", Count(ilt.img_name)"
, "FROM imglnk_tmp ilt"
, " JOIN <page_db>page p ON p.page_namespace = 6 AND p.page_title = ilt.img_name"
, " LEFT JOIN imglnk_reg il ON il.img_src = ilt.img_name"
, "WHERE il.img_src IS NULL"
, "GROUP BY ilt.img_name"
);
attach_mgr.Exec_sql_w_msg("imglnk_reg.insert.direct: repo=" + repo_id_str, sql);
}
public void Rls() {}
}

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.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.dbs.*;
public class Imglnk_tmp_tbl implements Db_tbl {
private final String tbl_name = "imglnk_tmp"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list();
private final String fld__page_id, fld__img_name;
private final Db_conn conn;
private Db_stmt stmt__insert;
public Imglnk_tmp_tbl(Db_conn conn) {
this.conn = conn;
flds.Add_int_pkey_autonum("img_uid");
this.fld__page_id = flds.Add_int("page_id");
this.fld__img_name = flds.Add_str("img_name", 255);
flds.Add_int_dflt("img_wiki", -1);
flds.Add_int_dflt("img_id", -1);
conn.Rls_reg(this);
}
public Db_conn Conn() {return conn;}
public String Tbl_name() {return tbl_name;}
public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));}
public void Insert_bgn() {
stmt__insert = conn.Stmt_insert(tbl_name, fld__page_id, fld__img_name);
conn.Txn_bgn(tbl_name);
}
public void Insert_by_batch(int page_id, byte[] img_name) {
stmt__insert.Clear().Val_int(fld__page_id, page_id).Val_bry_as_str(fld__img_name, img_name).Exec_insert();
}
public void Insert_end() {
conn.Txn_end();
stmt__insert.Rls();
}
public void Create_idx__img_ttl() {
conn.Meta_idx_create(tbl_name, fld__img_name, fld__img_name);
}
public void Rls() {
stmt__insert = Db_stmt_.Rls(stmt__insert);
}
}

View File

@ -0,0 +1,32 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.xowa.files.origs.*;
public class Xof_orig_wkr__img_links implements Xof_orig_wkr {
private final Ordered_hash hash = Ordered_hash_.New_bry();
public byte Tid() {return Xof_orig_wkr_.Tid_xowa_img_links;}
public Xof_orig_itm Find_as_itm(byte[] ttl, int list_idx, int list_len) {return (Xof_orig_itm)hash.Get_by(ttl);}
public void Find_by_list(Ordered_hash rv, List_adp itms) {throw Err_.new_unimplemented();}
public boolean Add_orig(byte repo, byte[] page, int ext_id, int w, int h, byte[] redirect) {return false;}
public void Db_txn_save() {}
public void Db_rls() {}
public void Add_by_db(Xof_orig_itm itm) {
hash.Add(itm.Ttl(), itm);
}
}

View File

@ -0,0 +1,63 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.wmdumps.imglinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.dbs.*;
import gplx.xowa.bldrs.*;
import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*;
public class Xof_orig_wkr__img_links_ {
public static Xof_orig_wkr__img_links Load_all(Xowe_wiki wiki) {
Xof_orig_wkr__img_links rv = new Xof_orig_wkr__img_links();
Db_conn conn = Xob_db_file.New__img_link(wiki).Conn();
Load_by_wiki(rv, conn, Xof_repo_itm_.Repo_local , wiki);
Load_by_wiki(rv, conn, Xof_repo_itm_.Repo_remote, wiki.Appe().Wiki_mgr().Wiki_commons());
return rv;
}
private static void Load_by_wiki(Xof_orig_wkr__img_links rv, Db_conn conn, byte repo_id, Xowe_wiki wiki) {
String sql = String_.Concat_lines_nl_skip_last // ANSI.Y
( "SELECT ilr.img_repo, ilr.img_src, i.img_media_type, i.img_minor_mime, i.img_size, i.img_width, i.img_height, i.img_bits, i.img_ext_id, i.img_timestamp, ilr.img_trg AS img_redirect"
, "FROM imglnk_reg ilr"
, " JOIN <img_db>image i ON ilr.img_trg = i.img_name"
, "WHERE ilr.img_repo = " + repo_id
);
Xob_db_file img_db = Xob_db_file.New__wiki_image(wiki.Fsys_mgr().Root_dir());
Db_attach_mgr attach_mgr = new Db_attach_mgr(conn, new Db_attach_itm("img_db", img_db.Conn()));
sql = attach_mgr.Resolve_sql(sql);
attach_mgr.Attach();
int count = 0;
Db_rdr rdr = conn.Stmt_sql(sql).Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
rv.Add_by_db(new Xof_orig_itm
( rdr.Read_byte("img_repo")
, rdr.Read_bry_by_str("img_src")
, rdr.Read_int("img_ext_id")
, rdr.Read_int("img_width")
, rdr.Read_int("img_height")
, rdr.Read_bry_by_str("img_redirect")
));
if ((++count % 10000) == 0)
Gfo_usr_dlg_.Instance.Prog_many("", "", "loading img_links.orig: rows=~{0}", count);
}
} finally {rdr.Rls();}
attach_mgr.Detach();
}
}

View File

@ -15,9 +15,9 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.pagelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*;
package gplx.xowa.addons.bldrs.wmdumps.pagelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*;
import gplx.xowa.bldrs.wkrs.*;
import gplx.xowa.addons.bldrs.pagelinks.bldrs.*;
import gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.*;
public class Xoax_builds_pagelinks_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr {
public Xob_cmd[] Bldr_cmds() {
return new Xob_cmd[]

View File

@ -15,9 +15,9 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.pagelinks.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.pagelinks.*;
package gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*;
import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.data.*; import gplx.xowa.addons.bldrs.pagelinks.dbs.*;
import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.data.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs.*;
public class Pglnk_bldr_cmd extends Xob_sql_dump_base implements Sql_file_parser_cmd {
private Db_conn conn;
private Pglnk_page_link_temp_tbl temp_tbl;

View File

@ -15,7 +15,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.pagelinks.*;
package gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.*;
import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*;
public class Pglnk_page_link_tbl implements Rls_able {
private final String tbl_name = "page_link"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list();

View File

@ -15,7 +15,7 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.bldrs.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.pagelinks.*;
package gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.wmdumps.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.*;
import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*;
public class Pglnk_page_link_temp_tbl implements Rls_able {
private final String tbl_name = "page_link_temp"; private final Dbmeta_fld_list flds = new Dbmeta_fld_list();

View File

@ -27,8 +27,8 @@ public class Srch_bldr_mgr_ {
int page_rank_iterations = app.Api_root().Bldr().Wiki().Import().Page_rank().Iteration_max();
boolean page_rank_enabled = page_rank_iterations > 0;
if (page_rank_enabled) {
bldr.Cmd_mgr().Add(new gplx.xowa.bldrs.cmds.utils.Xob_download_cmd(bldr, wiki).Dump_type_(gplx.xowa.addons.bldrs.pagelinks.bldrs.Pglnk_bldr_cmd.Dump_type_key));
bldr.Cmd_mgr().Add_many(wiki, gplx.xowa.addons.bldrs.pagelinks.bldrs.Pglnk_bldr_cmd.BLDR_CMD_KEY);
bldr.Cmd_mgr().Add(new gplx.xowa.bldrs.cmds.utils.Xob_download_cmd(bldr, wiki).Dump_type_(gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.Pglnk_bldr_cmd.Dump_type_key));
bldr.Cmd_mgr().Add_many(wiki, gplx.xowa.addons.bldrs.wmdumps.pagelinks.bldrs.Pglnk_bldr_cmd.BLDR_CMD_KEY);
}
bldr.Cmd_mgr().Add(new Xobldr__page__page_score(bldr, wiki).Iteration_max_(page_rank_iterations));
bldr.Cmd_mgr().Add(new Xobldr__link__link_score(bldr, wiki).Page_rank_enabled_(page_rank_enabled).Delete_plink_db_(Bool_.Y));

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.wikis.searchs.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.bldrs.*;
import gplx.dbs.*; import gplx.dbs.qrys.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.bldrs.pagelinks.dbs.*;
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.bldrs.wmdumps.pagelinks.dbs.*;
import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*;
public class Xobldr__page__page_score extends Xob_cmd__base implements Xob_cmd { // create page_rank in page_db; drop and vaccuum later; avoid cross db for now
private double damping_factor = .85;

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.wikis.searchs.specials.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.specials.*;
import gplx.core.brys.fmtrs.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.langs.numbers.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.langs.numbers.*; import gplx.langs.htmls.entitys.*;
import gplx.xowa.addons.wikis.searchs.specials.*; import gplx.xowa.addons.wikis.searchs.searchers.*; import gplx.xowa.addons.wikis.searchs.searchers.rslts.*;
public class Srch_html_page_bldr {
private final Bry_bfr tmp_bfr = Bry_bfr_.New_w_size(255);

View File

@ -21,9 +21,9 @@ import gplx.xowa.wikis.data.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.pag
public class Xoapi_import implements Gfo_invk {
public Xoapi_page_rank Page_rank() {return page_rank;} private final Xoapi_page_rank page_rank = new Xoapi_page_rank();
public long Layout_all_max() {return layout_all_max;} private long layout_all_max = 0; // disable by default; may set to 200 MB in future
public long Layout_text_max() {return layout_text_max;} private long layout_text_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB
public long Layout_html_max() {return layout_html_max;} private long layout_html_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB
public long Layout_file_max() {return layout_file_max;} private long layout_file_max = Io_size_.To_long_by_int_mb(1500); // 1.5 GB
public long Layout_text_max() {return layout_text_max;} private long layout_text_max = Io_size_.To_long_by_int_mb(1500); // 1.0 GB
public long Layout_html_max() {return layout_html_max;} private long layout_html_max = Io_size_.To_long_by_int_mb(1500); // 1.0 GB
public long Layout_file_max() {return layout_file_max;} private long layout_file_max = Io_size_.To_long_by_int_mb(1500); // 1.0 GB
public long Cat_link_db_max() {return cat_link_db_max;} private long cat_link_db_max = Io_size_.To_long_by_int_mb(1500); // 3.6 GB; v1
public long Text_db_max() {return text_db_max;} private long text_db_max = Io_size_.To_long_by_int_mb(1500); // 3.0 GB; v1
public long Html_db_max() {return html_db_max;} private long html_db_max = Io_size_.To_long_by_int_mb(1500); // 3.0 GB; v2; use same as text

View File

@ -17,8 +17,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.apps.apis.xowa.gui.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.apis.*; import gplx.xowa.apps.apis.xowa.*; import gplx.xowa.apps.apis.xowa.gui.*;
import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*; import gplx.xowa.wikis.pages.*;
import gplx.langs.htmls.encoders.*;
public class Xoapi_view implements Gfo_invk {
private Xoae_app app; private Xog_win_itm win;
private final Gfo_url_encoder fsys_encoder = Gfo_url_encoder_.New__fsys_wnt().Make();
public void Init_by_kit(Xoae_app app) {
this.app = app; this.win = app.Gui_mgr().Browser_win();
}
@ -36,7 +38,7 @@ public class Xoapi_view implements Gfo_invk {
public void Save_as() {
if (this.Active_tab_is_null()) return;
Xog_tab_itm tab = win.Tab_mgr().Active_tab();
String file_name = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_wnt.Encode_str(String_.new_u8(tab.Page().Ttl().Full_url())) + ".html";
String file_name = fsys_encoder.Encode_str(String_.new_u8(tab.Page().Ttl().Full_url())) + ".html";
String file_url = app.Gui_mgr().Kit().New_dlg_file(Gfui_kit_.File_dlg_type_save, "Select file to save to:").Init_file_(file_name).Ask();
if (String_.Len_eq_0(file_url)) return;
Io_mgr.Instance.SaveFilStr(file_url, tab.Html_box().Text());

View File

@ -26,6 +26,7 @@ public class Xow_url_parser {
private final Gfo_url_encoder encoder;
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url gfo_url = new Gfo_url();
private final Gfo_url_encoder gfs_encoder = Gfo_url_encoder_.New__gfs().Make();
private final Xoa_app app; private final Xow_wiki wiki; private final byte[] domain_bry;
private byte tmp_protocol_tid;
private int tmp_tid;
@ -146,7 +147,7 @@ public class Xow_url_parser {
private void Bld_xowa() {
tmp_tid = Xoa_url_.Tid_xcmd;
tmp_page = Bry_.Mid(tmp_raw, Gfo_protocol_itm.Len_xcmd); // NOTE: just get String after protocol; anchor (#) or query params (?) must not be parsed
tmp_page = gplx.langs.htmls.encoders.Gfo_url_encoder_.Gfs.Decode(tmp_page); // NOTE: should be decoded; EX: %20 -> " "
tmp_page = gfs_encoder.Decode(tmp_page); // NOTE: should be decoded; EX: %20 -> " "
}
private void Bld_page_by_file_ns() {
tmp_tid = Xoa_url_.Tid_page;

View File

@ -15,7 +15,8 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*;
package gplx.xowa.apps.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*;
import gplx.xowa.apps.wms.apis.origs.*;
public class Xowmf_api_mgr {
public Xoapi_orig_base Api_orig() {return api_orig;} public void Api_orig_(Xoapi_orig_base v) {api_orig = v;} private Xoapi_orig_base api_orig = new Xoapi_orig_wmf();
}

View File

@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*;
package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*;
import gplx.core.ios.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.downloads.*;
public abstract class Xoapi_orig_base {
public boolean Api_query_size(Xoapi_orig_rslts rv, Xof_download_wkr download_wkr, Xow_repo_mgr repo_mgr, byte[] ttl, int width, int height) {

View File

@ -15,8 +15,9 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*;
package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*;
import org.junit.*;
// https://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Main Page&rvprop=timestamp|content
public class Xoapi_orig_base_tst {
Xoapi_orig_base_fxt fxt = new Xoapi_orig_base_fxt();
@Before public void init() {fxt.Clear();}

View File

@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*;
package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*;
import gplx.xowa.files.downloads.*;
public class Xoapi_orig_mok extends Xoapi_orig_base {
private String wiki_str = "", ttl_str = "", redirect_str = ""; private int orig_w, orig_h; private boolean fail = false;
@ -32,5 +32,5 @@ public class Xoapi_orig_mok extends Xoapi_orig_base {
rv.Init_all(repo_wiki_key, orig_page, orig_w, orig_h);
return true;
}
public static final Xoapi_orig_mok Instance = new Xoapi_orig_mok(); Xoapi_orig_mok() {}
public static final Xoapi_orig_mok Instance = new Xoapi_orig_mok(); Xoapi_orig_mok() {}
}

View File

@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*;
package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*;
public class Xoapi_orig_rslts {
public byte[] Orig_wiki() {return orig_wiki;} private byte[] orig_wiki;
public byte[] Orig_page() {return orig_page;} private byte[] orig_page;

View File

@ -15,7 +15,7 @@ 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.bldrs.wms.apis; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*;
package gplx.xowa.apps.wms.apis.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*;
import gplx.core.primitives.*; import gplx.core.net.*; import gplx.core.envs.*;
import gplx.langs.htmls.encoders.*;
import gplx.xowa.files.downloads.*;

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.apps.wms.apis.revisions; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*;
import gplx.langs.jsons.*;
import gplx.xowa.files.downloads.*;
public abstract class Xowm_revision_base {
}
class Xowm_revision_wmf extends Xowm_revision_base {
private final Bry_bfr bfr = Bry_bfr_.New();
private final Json_parser json_parser = new Json_parser();
public Xowm_revn_data Get_revn_or_null(Xof_download_wkr download_wkr, Xow_wiki wiki, Xoa_ttl page_ttl) {
if (!gplx.core.ios.IoEngine_system.Web_access_enabled) return null;
// create a ctx Object
return Get_revn_by_page(download_wkr, wiki.Domain_bry(), page_ttl.Full_db());
}
private Xowm_revn_data Get_revn_by_page(Xof_download_wkr download_wkr, byte[] wiki_domain, byte[] ttl_full_db) {
byte[] json = Download(bfr, download_wkr, wiki_domain, ttl_full_db);
Xowm_revn_data rv = Parse_json(wiki_domain, json);
// Parse_wtxt(rv, download_wkr, wiki_domain);
return rv;
}
public void Parse_wtxt(Xowe_wiki wiki, byte[] ttl_full_db, byte[] wtxt) {
// Xoae_page page = Xoae_page.New(wiki, wiki.Ttl_parse(ttl_full_db));
// page.Db().Text().Text_bry_(wtxt);
// page.Page_fetcher_(this);
// wiki.Parser_mgr().Parse(page, true);
}
private byte[] Download(Bry_bfr bfr, Xof_download_wkr download_wkr, byte[] wiki_domain, byte[] ttl_full_db) {
// build api; EX: "https://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=ids|timestamp|content&titles=Main%20Page
Xowm_api_bldr.Bld_bgn(bfr, wiki_domain);
bfr.Add_str_a7("action=query&prop=revisions&rvprop=ids|timestamp|content&titles=");
bfr.Add(ttl_full_db);
// download bry
return download_wkr.Download_xrg().Exec_as_bry(bfr.To_str_and_clear());
}
private Xowm_revn_data Parse_json(byte[] wiki_domain, byte[] json) {
Json_doc jdoc = json_parser.Parse(json);
// get page_data; note that nde has key of page_id; EX: query:{pages:{1234:{}}}
Json_nde page_nde = (Json_nde)jdoc.Get_grp_many(Path__query, Path__pages); // /query/pages/
page_nde = page_nde.Get_as_nde(0); // {page_id}/
int page_id = page_nde.Get_as_int("pageid");
int page_ns = page_nde.Get_as_int("ns");
byte[] page_ttl = page_nde.Get_as_bry("title");
// get revn_data
Json_nde revn_nde = page_nde.Get_as_nde("revisions");
int revn_id = revn_nde.Get_as_int("revid");
DateAdp revn_time = revn_nde.Get_as_date_by_utc("timestamp");
byte[] revn_text = revn_nde.Get_as_bry("*");
return new Xowm_revn_data(wiki_domain, page_id, page_ns, page_ttl, revn_id, revn_time, revn_text);
}
private final byte[] Path__query = Bry_.new_a7("query"), Path__pages = Bry_.new_a7("pages");
}
/*
{
"batchcomplete": "",
"query": {
"pages": {
"15580374": {
"pageid": 15580374,
"ns": 0,
"title": "Main Page",
"revisions": [
{
"timestamp": "2015-12-26T10:03:53Z",
"contentformat": "text/x-wiki",
"contentmodel": "wikitext",
"*": "[[A]]"
}
]
}
}
}
*/
class Xowm_api_bldr {
public static void Bld_bgn(Bry_bfr bfr, byte[] wiki) {
bfr.Add_str_a7("https://");
bfr.Add(wiki);
bfr.Add_str_a7("/w/api.php?");
}
}

View File

@ -0,0 +1,40 @@
/*
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.wms.apis.revisions; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.wms.*; import gplx.xowa.apps.wms.apis.*;
public class Xowm_revn_data {
public Xowm_revn_data(byte[] wiki_domain
, int page_id, int page_ns, byte[] page_ttl
, int revn_id, DateAdp revn_time, byte[] revn_text) {
this.wiki_domain = wiki_domain;
this.page_id = page_id;
this.page_ns = page_ns;
this.page_ttl = page_ttl;
this.revn_id = revn_id;
this.revn_time = revn_time;
this.revn_text = revn_text;
}
public byte[] Wiki_domain() {return wiki_domain;} private final byte[] wiki_domain;
public int Page_id() {return page_id;} private final int page_id;
public int Page_ns() {return page_ns;} private final int page_ns;
public byte[] Page_ttl() {return page_ttl;} private final byte[] page_ttl;
public int Revn_id() {return revn_id;} private final int revn_id;
public DateAdp Revn_time() {return revn_time;} private final DateAdp revn_time;
public byte[] Revn_text() {return revn_text;} private final byte[] revn_text;
}

View File

@ -32,6 +32,7 @@ public class Xob_db_file {
public static Xob_db_file New__temp_log(Io_url dir) {return New(dir, Name__temp_log);}
public static Xob_db_file New__redlink(Io_url dir) {return New(dir, Name__redlink);}
public static Xob_db_file New__page_link(Xow_wiki wiki) {return New(wiki.Fsys_mgr().Root_dir(), Name__page_link);}
public static Xob_db_file New__img_link(Xow_wiki wiki) {return New(wiki.Fsys_mgr().Root_dir(), "xowa.wiki.imglinks.sqlite3");}
public static Xob_db_file New__page_file_map(Xow_wiki wiki) {return New(wiki.Fsys_mgr().Root_dir(), wiki.Domain_str() + "-file-page_map.xowa");}
public static Xob_db_file New__deletion_db(Xow_wiki wiki) {
String name = String_.Format("{0}-file-core-deletion_db-{1}.xowa", wiki.Domain_str(), Datetime_now.Get().XtoStr_fmt("yyyy.MM"));

View File

@ -46,7 +46,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
root = ctx.Tkn_mkr().Root(Bry_.Empty);
wiki.Init_assert(); // NOTE: must init wiki for db_mgr_as_sql
wiki.Db_mgr_as_sql().Core_data_mgr().Init_by_load(gplx.xowa.wikis.data.Xow_db_file__core_.Find_core_fil(wiki)); // NOTE: must reinit providers as previous steps may have rls'd (and left member variable conn which is closed)
wiki.File__orig_mgr().Wkrs_del(Xof_orig_wkr_.Tid_wmf_api);
wiki.File__orig_mgr().Wkrs__del(Xof_orig_wkr_.Tid_wmf_api);
db_fsys_mgr = wiki.Db_mgr_as_sql().Core_data_mgr();
db_ary = Xob_dump_mgr_base_.Init_text_files_ary(db_fsys_mgr);
poll_interval = poll_mgr.Poll_interval();

View File

@ -19,7 +19,7 @@ package gplx.xowa.bldrs.installs; import gplx.*; import gplx.xowa.*; import gplx
import gplx.core.ios.*; import gplx.core.ios.streams.*;
import gplx.xowa.bldrs.wms.dumps.*;
public class Xoi_dump_mgr implements Gfo_invk {
public String[] Server_urls() {return server_urls;} private String[] server_urls = String_.Ary(Xowm_dump_file_.Server_wmf_https, Xowm_dump_file_.Server_your_org, Xowm_dump_file_.Server_c3sl, Xowm_dump_file_.Server_masaryk);
public String[] Server_urls() {return server_urls;} private String[] server_urls = String_.Ary(Xowm_dump_file_.Server_your_org, Xowm_dump_file_.Server_wmf_https, Xowm_dump_file_.Server_c3sl, Xowm_dump_file_.Server_masaryk); // promote your.org to primary url; DATE:2016-08-07
public String[] Custom_cmds() {return custom_cmds;} private String[] custom_cmds = String_.Ary(Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_import.KEY);
public byte Data_storage_format() {return data_storage_format;} public Xoi_dump_mgr Data_storage_format_(byte v) {data_storage_format = v; return this;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_.Tid_gzip;
public long Db_text_max() {return db_text_max;} private long db_text_max = (long)3000 * Io_mgr.Len_mb;

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.bldrs.wms; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.wikis.*;
import gplx.xowa.apps.wms.apis.*; import gplx.xowa.wikis.*;
public class Xoa_wmf_mgr implements Gfo_invk {
private final Xoae_wiki_mgr wiki_mgr;
public Xoa_wmf_mgr(Gfo_usr_dlg usr_dlg, Xoae_wiki_mgr wiki_mgr) {

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.bldrs.wms; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
import gplx.core.net.*;
import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.downloads.*;
import gplx.xowa.apps.wms.apis.*; import gplx.xowa.files.downloads.*;
public class Xowmf_mgr {
public Xowmf_mgr() {
download_wkr.Download_xrg().User_agent_(Xoa_app_.User_agent);
@ -26,5 +26,5 @@ public class Xowmf_mgr {
download_wkr.Download_xrg().Prog_dlg_(Xoa_app_.Usr_dlg());
}
public Xowmf_api_mgr Api_mgr() {return api_mgr;} private Xowmf_api_mgr api_mgr = new Xowmf_api_mgr();
public Xof_download_wkr Download_wkr() {return download_wkr;} private final Xof_download_wkr download_wkr = new Xof_download_wkr_io();
public Xof_download_wkr Download_wkr() {return download_wkr;} private final Xof_download_wkr download_wkr = new Xof_download_wkr_io();
}

View File

@ -19,7 +19,7 @@ package gplx.xowa.files; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*;
import gplx.xowa.files.origs.*; import gplx.xowa.files.repos.*;
public class Xof_file_fxt {
private final Xowe_wiki wiki;
private final Xowe_wiki wiki;
Xof_file_fxt(Xowe_wiki wiki) {
this.wiki = wiki;
Io_mgr.Instance.InitEngine_mem();
@ -40,7 +40,7 @@ public class Xof_file_fxt {
Db_conn conn = Db_conn_bldr.Instance.Get_or_new(Io_url_.mem_fil_("mem/xowa/wiki/" + wiki.Domain_str() + "/orig.xowa")).Conn();
Xof_orig_tbl orig_tbl = new Xof_orig_tbl(conn, Bool_.Y);
orig_tbl.Create_tbl();
wiki.File_mgr().Orig_mgr().Init_by_wiki(wiki, Xof_fsdb_mode.new_v2_gui(), new Xof_orig_tbl[] {orig_tbl}, Xof_url_bldr.new_v2());
wiki.File_mgr().Orig_mgr().Init_by_wiki(wiki, Xof_fsdb_mode.New__v2__gui(), new Xof_orig_tbl[] {orig_tbl}, Xof_url_bldr.new_v2());
return this;
}
public void Exec_orig_add(boolean repo_is_commons, String orig_ttl, int orig_ext_id, int orig_w, int orig_h, String orig_redirect) {

View File

@ -19,15 +19,17 @@ package gplx.xowa.files; import gplx.*; import gplx.xowa.*;
public class Xof_fsdb_mode {
private int tid;
Xof_fsdb_mode(int tid) {this.tid = tid;}
// public boolean Tid_v0() {return tid == Tid_int_v0;}
public boolean Tid_v2_gui() {return tid == Tid_int_v2_gui;}
public boolean Tid_v2_bld() {return tid == Tid_int_v2_bld;}
public void Tid_v2_bld_y_() {tid = Tid_int_v2_bld;}
public boolean Tid__v2__bld() {return tid == TID__v2__bld;}
public void Tid__v2__bld__y_() {tid = TID__v2__bld;}
public boolean Tid__v2__mp() {return tid == TID__v2__mp;}
public void Tid__v2__mp__y_() {tid = TID__v2__mp;}
public boolean Tid__bld() {return tid > TID__v2__gui;}
private static final int
Tid_int_v0 = 1
, Tid_int_v2_gui = 2
, Tid_int_v2_bld = 3
TID__v0 = 1
, TID__v2__gui = 2
, TID__v2__bld = 3
, TID__v2__mp = 4
;
public static Xof_fsdb_mode new_v0() {return new Xof_fsdb_mode(Tid_int_v0);}
public static Xof_fsdb_mode new_v2_gui() {return new Xof_fsdb_mode(Tid_int_v2_gui);}
public static Xof_fsdb_mode New__v0() {return new Xof_fsdb_mode(TID__v0);}
public static Xof_fsdb_mode New__v2__gui() {return new Xof_fsdb_mode(TID__v2__gui);}
}

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.files; import gplx.*; import gplx.xowa.*;
public class Xof_html_elem {
public static final byte Tid_none = 0, Tid_img = 1, Tid_vid = 2, Tid_gallery = 3, Tid_gallery_v2 = 4, Tid_imap = 5;
public static final byte Tid_none = 0, Tid_img = 1, Tid_vid = 2, Tid_gallery = 3, Tid_gallery_v2 = 4, Tid_imap = 5, Tid_aud = 6;
public static boolean Tid_is_file(byte tid) {
switch (tid) {
case Tid_img: case Tid_vid: return true;

View File

@ -42,11 +42,11 @@ public class Xow_file_mgr implements Gfo_invk {
Io_url file_dir = wiki.Fsys_mgr().File_dir();
if (!Io_mgr.Instance.ExistsFil(file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name))) {
version = Version_1;
fsdb_mode = Xof_fsdb_mode.new_v0();
fsdb_mode = Xof_fsdb_mode.New__v0();
}
else {
version = Version_2;
fsdb_mode = Xof_fsdb_mode.new_v2_gui();
fsdb_mode = Xof_fsdb_mode.New__v2__gui();
}
}
return version;
@ -54,7 +54,7 @@ public class Xow_file_mgr implements Gfo_invk {
public boolean Version_1_y() {return this.Version() == Version_1;}
public boolean Version_2_y() {return this.Version() == Version_2;}
public void Version_1_y_() {version = Version_1;} // TEST:
public void Version_2_y_() {version = Version_2;} // TEST:
public void Version_2_y_() {version = Version_2; fsdb_mode = Xof_fsdb_mode.New__v2__gui();} // TEST:
public void Fsdb_mgr_(Xof_fsdb_mgr fsdb_mgr) {
this.fsdb_mgr = fsdb_mgr;
version = Version_2;
@ -127,7 +127,7 @@ public class Xow_file_mgr implements Gfo_invk {
)
db_core = Fsdb_db_mgr__v2_bldr.Get_or_make(wiki, false); // make it
this.version = Version_2;
this.fsdb_mode = Xof_fsdb_mode.new_v2_gui();
this.fsdb_mode = Xof_fsdb_mode.New__v2__gui();
orig_mgr.Init_by_wiki(wiki, fsdb_mode, db_core.File__orig_tbl_ary(), Xof_url_bldr.new_v2());
fsdb_mgr.Init_by_wiki(wiki);
}

View File

@ -25,7 +25,7 @@ public class Xou_file_itm_finder {
byte[] lnki_ttl = xfer.Lnki_ttl();
Xof_url_bldr url_bldr = wiki.Parser_mgr().Url_bldr();
try {
if (wiki.File__fsdb_mode().Tid_v2_bld()) return false; // disable during build
if (wiki.File__fsdb_mode().Tid__bld()) return false; // disable during build
Xou_cache_itm cache_itm = cache_mgr.Get_or_null(wiki.Domain_itm().Abrv_xo(), lnki_ttl, xfer.Lnki_type(), xfer.Lnki_upright(), xfer.Lnki_w(), xfer.Lnki_h(), xfer.Lnki_time(), xfer.Lnki_page(), Xof_img_size.Thumb_width_img);
Xof_repo_itm repo = null;
if (cache_itm == null) {// itm not in cache;

View File

@ -32,7 +32,7 @@ class Xof_file_fxt {
Xoa_test_.Db_init(root_url);
app = Xoa_app_fxt.Make__app__edit(Op_sys.Cur().Os_name(), root_url);
wiki = Xoa_app_fxt.Make__wiki__edit(app);
wiki.File__fsdb_mode().Tid_v2_bld_y_();
wiki.File__fsdb_mode().Tid__v2__bld__y_();
this.fsdb_mgr = (Xof_fsdb_mgr__sql)wiki.File_mgr().Fsdb_mgr();
this.orig_mgr = wiki.File__orig_mgr();
Xof_repo_fxt.Repos_init(app.File_mgr(), true, wiki);

View File

@ -18,26 +18,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*;
import gplx.xowa.wikis.*; import gplx.xowa.files.*;
public class Xof_orig_itm {
public byte Repo() {return repo;} private byte repo;
public byte[] Ttl() {return ttl;} private byte[] ttl; // without file ns; EX: "A.png" not "File:A.png"
public int Ext_id() {return ext_id;} private int ext_id;
public Xof_ext Ext() {if (ext == null) ext = Xof_ext_.new_by_id_(ext_id); return ext;} private Xof_ext ext;
public int W() {return w;} private int w;
public int H() {return h;} private int h;
public byte[] Redirect() {return redirect;} private byte[] redirect; // redirect trg; EX: A.png is redirected to B.jpg; record will have A.png|jpg|220|200|B.jpg where jpg|220|200 are the attributes of B.jpg
public boolean Insert_new() {return insert_new;} public void Insert_new_y_() {insert_new = Bool_.Y;} private boolean insert_new;
public void Clear() {
this.repo = Repo_null;
this.ttl = this.redirect = null;
this.ext_id = Xof_ext_.Id_unknown;
this.w = this.h = Xof_img_size.Null;
this.ext = null;
}
public Xof_orig_itm Init(byte repo, byte[] ttl, int ext_id, int w, int h, byte[] redirect) {
public Xof_orig_itm(byte repo, byte[] ttl, int ext_id, int w, int h, byte[] redirect) {
this.repo = repo; this.ttl = ttl; this.ext_id = ext_id;
this.w = w; this.h = h; this.redirect = redirect;
return this;
}
public byte Repo() {return repo;} private final byte repo;
public byte[] Ttl() {return ttl;} private final byte[] ttl; // without file ns; EX: "A.png" not "File:A.png"
public int Ext_id() {return ext_id;} private final int ext_id;
public Xof_ext Ext() {if (ext == null) ext = Xof_ext_.new_by_id_(ext_id); return ext;} private Xof_ext ext;
public int W() {return w;} private final int w;
public int H() {return h;} private final int h;
public byte[] Redirect() {return redirect;} private final byte[] redirect; // redirect trg; EX: A.png is redirected to B.jpg; record will have A.png|jpg|220|200|B.jpg where jpg|220|200 are the attributes of B.jpg
public boolean Insert_new() {return insert_new;} public void Insert_new_y_() {insert_new = Bool_.Y;} private boolean insert_new;
public int Db_row_size() {return Db_row_size_fixed + redirect.length + ttl.length;}
private static final int Db_row_size_fixed = (5 * 4); // 3 ints; 2 bytes

View File

@ -17,7 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*;
import gplx.core.primitives.*; import gplx.dbs.*;
import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.downloads.*;
import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.downloads.*;
import gplx.xowa.apps.wms.apis.*; import gplx.xowa.apps.wms.apis.origs.*;
public class Xof_orig_mgr {
private Xof_orig_wkr[] wkrs; private int wkrs_len;
private Xof_url_bldr url_bldr; private Xow_repo_mgr repo_mgr; private final Xof_img_size img_size = new Xof_img_size();
@ -28,16 +29,16 @@ public class Xof_orig_mgr {
int orig_tbls_len = orig_tbls.length;
for (int i = 0; i < orig_tbls_len; ++i) {
Xof_orig_tbl orig_tbl = orig_tbls[i];
this.Wkrs__add_many(new Xof_orig_wkr__orig_db(orig_tbl, i == orig_tbls_len - 1));
this.Wkrs__add(new Xof_orig_wkr__orig_db(orig_tbl, i == orig_tbls_len - 1));
}
// }
if (!fsdb_mode.Tid_v2_bld()) { // add if gui, but not if bld
if (!fsdb_mode.Tid__v2__bld()) { // add if gui, but not if bld
Io_url wiki_meta_dir = wiki.App().Fsys_mgr().File_dir().GenSubDir_nest("#meta", wiki.Domain_str());
if (Io_mgr.Instance.ExistsDir(wiki_meta_dir)) {
Xof_orig_wkr__xo_meta xo_meta = new Xof_orig_wkr__xo_meta(wiki_meta_dir);
this.Wkrs__add_many(xo_meta);
this.Wkrs__add(xo_meta);
}
this.Wkrs__add_many(new Xof_orig_wkr__wmf_api(new Xoapi_orig_wmf(), wiki.App().Wmf_mgr().Download_wkr(), repo_mgr, wiki.Domain_bry()));
this.Wkrs__add(new Xof_orig_wkr__wmf_api(new Xoapi_orig_wmf(), wiki.App().Wmf_mgr().Download_wkr(), repo_mgr, wiki.Domain_bry()));
}
}
public Xof_orig_itm Find_by_ttl_or_null(byte[] ttl) {return Find_by_ttl_or_null(ttl, 0, 1);}
@ -77,11 +78,15 @@ public class Xof_orig_mgr {
}
}
private void Wkrs__clear() {wkrs = Xof_orig_wkr_.Ary_empty; wkrs_len = 0;}
private void Wkrs__add_many(Xof_orig_wkr... v) {
public void Wkrs__add(Xof_orig_wkr... v) {
wkrs = (Xof_orig_wkr[])Array_.Resize_add(wkrs, v);
wkrs_len += v.length;
}
public void Wkrs_del(byte tid) {
public void Wkrs__set(Xof_orig_wkr... v) {
wkrs = v;
wkrs_len = v.length;
}
public void Wkrs__del(byte tid) {
List_adp list = List_adp_.New();
for (int i = 0; i < wkrs_len; ++i) {
Xof_orig_wkr wkr = wkrs[i];

View File

@ -77,7 +77,7 @@ public class Xof_orig_tbl implements Rls_able {
}
public Xof_orig_itm Load_by_rdr(Db_rdr rdr) {
byte repo = rdr.Read_byte(fld_repo);
Xof_orig_itm rv = new Xof_orig_itm().Init
Xof_orig_itm rv = new Xof_orig_itm
( repo
, rdr.Read_bry_by_str(fld_ttl)
, rdr.Read_int(fld_ext)

View File

@ -40,7 +40,7 @@ class Xof_orig_tbl_fxt {
}
public Xof_orig_itm Exec_insert(String ttl, int w, int h) {
byte[] ttl_bry = Bry_.new_u8(ttl);
Xof_orig_itm rv = new Xof_orig_itm().Init(Xof_orig_itm.Repo_comm, ttl_bry, Xof_ext_.new_by_ttl_(ttl_bry).Id(), w, h, Bry_.Empty);
Xof_orig_itm rv = new Xof_orig_itm(Xof_orig_itm.Repo_comm, ttl_bry, Xof_ext_.new_by_ttl_(ttl_bry).Id(), w, h, Bry_.Empty);
tbl.Insert(rv.Repo(), rv.Ttl(), rv.Ext_id(), rv.W(), rv.H(), rv.Redirect());
return rv;
}

View File

@ -16,9 +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.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*;
import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.fsdb.*;
import gplx.xowa.apps.wms.apis.*; import gplx.xowa.files.fsdb.*;
public class Xof_orig_wkr_ {
public static final Xof_orig_wkr[] Ary_empty = new Xof_orig_wkr[0];
public static final Xof_orig_wkr[] Ary_empty = new Xof_orig_wkr[0];
public static void Find_by_list(Xof_orig_wkr wkr, Ordered_hash rv, List_adp itms) {
int len = itms.Count();
for (int i = 0; i < len; ++i) {
@ -34,5 +34,6 @@ public class Xof_orig_wkr_ {
Tid_xowa_db = 1
, Tid_wmf_api = 2
, Tid_xowa_meta = 3
, Tid_xowa_img_links = 4
;
}

View File

@ -16,10 +16,11 @@ 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.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*;
import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.downloads.*;
import gplx.xowa.files.repos.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.apps.wms.apis.*; import gplx.xowa.files.downloads.*;
import gplx.xowa.apps.wms.apis.origs.*;
public class Xof_orig_wkr__wmf_api implements Xof_orig_wkr {
private final Xoapi_orig_base orig_api; private final Xof_download_wkr download_wkr; private final Xow_repo_mgr repo_mgr; private final byte[] wiki_domain;
private final Xoapi_orig_rslts api_rv = new Xoapi_orig_rslts();
private final Xoapi_orig_base orig_api; private final Xof_download_wkr download_wkr; private final Xow_repo_mgr repo_mgr; private final byte[] wiki_domain;
private final Xoapi_orig_rslts api_rv = new Xoapi_orig_rslts();
public Xof_orig_wkr__wmf_api(Xoapi_orig_base orig_api, Xof_download_wkr download_wkr, Xow_repo_mgr repo_mgr, byte[] wiki_domain) {
this.orig_api = orig_api; this.download_wkr = download_wkr; this.repo_mgr = repo_mgr; this.wiki_domain = wiki_domain;
}
@ -35,8 +36,7 @@ public class Xof_orig_wkr__wmf_api implements Xof_orig_wkr {
int api_w = api_rv.Orig_w(), api_h = api_rv.Orig_h();
Xof_ext api_ext = Xof_ext_.new_by_ttl_(api_page); api_ext = Ext__handle_ogg(api_ext, api_w, api_h);
byte[] api_redirect = Bry_.Eq(api_page, ttl) ? Bry_.Empty : api_page; // ttl is different; must be redirect
Xof_orig_itm rv = new Xof_orig_itm();
rv.Init(api_repo, api_page, api_ext.Id(), api_w, api_h, api_redirect);
Xof_orig_itm rv = new Xof_orig_itm(api_repo, api_page, api_ext.Id(), api_w, api_h, api_redirect);
rv.Insert_new_y_();
return rv;
}

View File

@ -38,8 +38,7 @@ public class Xof_orig_wkr__xo_meta implements Xof_orig_wkr {
Xof_meta_fil meta_fil = new Xof_meta_fil(null, md5); // NOTE: need to register file before loading it; defect wherein 2 files with same hash prefix would skip one b/c Loaded file was not registered; EX.WS: en.wikiquote.org/The Hitchhiker's Guide to the Galaxy; NMMP_dolphin_with_locator.jpeg, da6f95736ed249f371f30bf5f1205fbd; Hoags_object.jpg, daed4a54e48e4266bd2f2763b7c4018c
meta_fil.Load(meta_rdr, parser);
Xof_meta_itm meta_itm = meta_fil.Get_or_null(ttl); if (meta_itm == null) return Xof_orig_itm.Null;
Xof_orig_itm rv = new Xof_orig_itm();
rv.Init((byte)meta_itm.Vrtl_repo(), ttl, Xof_ext_.new_by_ttl_(ttl).Id(), meta_itm.Orig_w(), meta_itm.Orig_h(), meta_itm.Ptr_ttl());
Xof_orig_itm rv = new Xof_orig_itm((byte)meta_itm.Vrtl_repo(), ttl, Xof_ext_.new_by_ttl_(ttl).Id(), meta_itm.Orig_w(), meta_itm.Orig_h(), meta_itm.Ptr_ttl());
rv.Insert_new_y_();
return rv;
}

View File

@ -41,6 +41,13 @@ public class Xowe_repo_mgr implements Xow_repo_mgr, Gfo_invk {
}
return null;
}
public void Clone(Xowe_repo_mgr src) {
int len = src.Repos_len();
for (int i = 0; i < len; ++i) {
Xof_repo_pair repo_pair = src.Repos_get_at(i);
this.Add_repo(repo_pair.Src().Key(), repo_pair.Trg().Key());
}
}
public Xof_repo_pair Repos_get_at(int i) {return (Xof_repo_pair)repos.Get_at(i);}
private Xof_repo_pair Repos_get_by_id(int id) {
int len = repos.Count();

View File

@ -18,10 +18,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.files.xfers; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*;
import gplx.core.primitives.*; import gplx.gfui.*;
import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.downloads.*;
import gplx.xowa.bldrs.wms.*; import gplx.xowa.bldrs.wms.apis.*;
import gplx.xowa.bldrs.wms.*; import gplx.xowa.apps.wms.apis.*; import gplx.xowa.apps.wms.apis.origs.*;
import gplx.xowa.wikis.tdbs.metas.*;
public class Xof_xfer_mgr {
public Xof_xfer_mgr(Xof_file_mgr file_mgr, Xowmf_mgr wmf_mgr) {this.file_mgr = file_mgr; this.wmf_mgr = wmf_mgr;} private final Xof_file_mgr file_mgr; private final Xowmf_mgr wmf_mgr;
public Xof_xfer_mgr(Xof_file_mgr file_mgr, Xowmf_mgr wmf_mgr) {this.file_mgr = file_mgr; this.wmf_mgr = wmf_mgr;} private final Xof_file_mgr file_mgr; private final Xowmf_mgr wmf_mgr;
public Xof_xfer_rslt Rslt() {return rslt;} private Xof_xfer_rslt rslt = new Xof_xfer_rslt();
public boolean Force_orig() {return force_orig;} public Xof_xfer_mgr Force_orig_(boolean v) {force_orig = v; return this;} private boolean force_orig;
public Xof_xfer_mgr Force_orig_y_() {return Force_orig_(Bool_.Y);} public Xof_xfer_mgr Force_orig_n_() {return Force_orig_(Bool_.N);}

View File

@ -17,8 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.files.xfers; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*;
import gplx.core.ios.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.files.cnvs.*; import gplx.xowa.files.repos.*;
import gplx.xowa.bldrs.wms.apis.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.imgs.*;
import gplx.xowa.wikis.domains.*;
import gplx.xowa.files.cnvs.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.exts.*; import gplx.xowa.files.imgs.*;
import gplx.xowa.apps.wms.apis.*; import gplx.xowa.apps.wms.apis.origs.*;
public class Xof_xfer_queue_base_fxt {
public Xoapi_orig_mok Api_size() {return api_size;} private Xoapi_orig_mok api_size = Xoapi_orig_mok.Instance;
public Xof_repo_itm Src_commons_repo() {return src_commons_repo;} private Xof_repo_itm src_commons_repo;

View File

@ -25,6 +25,7 @@ public class Xog_url_wkr {
private final Xoa_url tmp_url = Xoa_url.blank();
private Xoae_app app; private Xog_win_itm win; private Xowe_wiki wiki; private Xoae_page page;
private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2();
private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make();
public Xog_url_wkr Parse(Xog_win_itm win, String href_str) {
if (href_str == null) return this; // text is not link; return;
byte[] href_bry = Bry_.new_u8(href_str);
@ -63,7 +64,7 @@ public class Xog_url_wkr {
Xowe_wiki wiki = (Xowe_wiki)page.Commons_mgr().Source_wiki_or(cur_wiki);
Io_url href_url = Io_url_.http_any_(String_.new_u8(Gfo_url_encoder_.Http_url.Decode(href_bry)), Op_sys.Cur().Tid_is_wnt());
Gfui_html html_box = win.Active_html_box();
byte[] href_bry_encoded = Gfo_url_encoder_.Fsys_lnx.Encode(href_bry); // encode to href_bry; note must encode to same href_bry as Xof_url_bldr, which uses Gfo_url_encoder_.Fsys_lnx; PAGE:en.w:File:Volc<EFBFBD>n_Chimborazo,_"El_Taita_Chimborazo".jpg DATE:2015-12-06
byte[] href_bry_encoded = fsys_lnx_encoder.Encode(href_bry); // encode to href_bry; note must encode to same href_bry as Xof_url_bldr, which uses Gfo_url_encoder_.Fsys_lnx; PAGE:en.w:File:Volc<EFBFBD>n_Chimborazo,_"El_Taita_Chimborazo".jpg DATE:2015-12-06
String xowa_ttl = wiki.Gui_mgr().Cfg_browser().Content_editable()
? html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, gplx.xowa.htmls.Xoh_consts.Atr_xowa_title_str, null)
: Xoh_dom_.Title_by_href(href_bry_encoded, Bry_.new_u8(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__root_html_get)));

View File

@ -109,7 +109,8 @@ public class Xog_tab_itm implements Gfo_invk {
Xoae_app app = win.App(); Gfo_usr_dlg usr_dlg = app.Usr_dlg();
// get new_tab_name
if (url.Page_is_main()) url.Page_bry_(wiki.Props().Main_page()); // NOTE: must go before ttl.Make; DATE:2016-07-31
this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry()); // NOTE: must go before wiki.Props().Main_page(); DATE:2016-08-02; NOTE: must load wiki; DATE:2015-07-22
if (url.Page_is_main()) url.Page_bry_(wiki.Props().Main_page()); // NOTE: must go before ttl.Make; DATE:2016-07-31
Xoa_ttl ttl = wiki.Ttl_parse(url.Page_bry());
if (ttl == null) {usr_dlg.Prog_one("", "", "title is invalid: ~{0}", String_.new_u8(url.Raw())); return;}
String new_tab_name = String_.new_u8(ttl.Full_txt_w_ttl_case());
@ -127,7 +128,6 @@ public class Xog_tab_itm implements Gfo_invk {
if (page != null) page.Tab_data().Close_mgr().When_close(this, url); // cancel any current search cmds
app.Log_wtr().Queue_enabled_(true);
usr_dlg.Gui_wkr().Clear();
this.wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_or_make_init_y(url.Wiki_bry()); // NOTE: must update wiki variable; DATE:????-??-??; NOTE: must load wiki; DATE:2015-07-22
if (url.Vnt_bry() != null) Cur_vnt_(wiki, url.Vnt_bry());
Tab_name_(new_tab_name);
usr_dlg.Prog_one("", "", "loading: ~{0}", String_.new_u8(ttl.Raw()));

View File

@ -77,7 +77,7 @@ public class Xog_error_win extends JFrame implements Gfo_invk {
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_send_mail)) {
try {
Gfo_url_encoder url_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_wnt;
Gfo_url_encoder url_encoder = Gfo_url_encoder_.New__fsys_wnt().Make();
String subject = url_encoder.Encode_str("XOWA boot error: " + error_data.Err_msg());
String body = url_encoder.Encode_str(error_data.Err_details());
Desktop.getDesktop().mail(new URI("mailto:gnosygnu+xowa_error_boot@gmail.com?subject=" + subject + "&body=" + body));

View File

@ -26,6 +26,12 @@ public class Xoh_img_mgr {
}
public int Len() {return list.Count();}
public Xof_fsdb_itm Get_at(int i) {return (Xof_fsdb_itm)list.Get_at(i);}
public Xof_fsdb_itm Make_aud() {
Xof_fsdb_itm itm = new Xof_fsdb_itm();
itm.Init_at_hdoc(++uid_nxt, Xof_html_elem.Tid_aud);
list.Add(itm);
return itm;
}
public Xof_fsdb_itm Make_img(boolean img_is_gallery) {
Xof_fsdb_itm itm = new Xof_fsdb_itm();
itm.Init_at_hdoc(++uid_nxt, img_is_gallery ? Xof_html_elem.Tid_gallery : Xof_html_elem.Tid_img);

View File

@ -21,17 +21,15 @@ import gplx.xowa.langs.*;
import gplx.xowa.wikis.ctgs.*; import gplx.xowa.xtns.gallery.*;
import gplx.xowa.parsers.xndes.*;
import gplx.xowa.htmls.portal.*; import gplx.xowa.addons.htmls.tocs.*; import gplx.xowa.wikis.modules.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.htmls.tidy.*; import gplx.xowa.htmls.js.*;
import gplx.langs.htmls.encoders.*;
public class Xow_html_mgr implements Gfo_invk {
private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make();
public Xow_html_mgr(Xowe_wiki wiki) {
this.wiki = wiki;
html_wtr = new Xoh_html_wtr(wiki, this);
Xoae_app app = wiki.Appe();
page_wtr_mgr = new Xoh_page_wtr_mgr(app.Gui_mgr().Kit().Tid() != Gfui_kit_.Swing_tid); // reverse logic to handle swt,drd but not mem
Io_url file_dir = app.Fsys_mgr().Bin_xowa_file_dir().GenSubDir_nest("mediawiki.file");
img_media_play_btn = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(file_dir.GenSubFil("play.png"));
img_media_info_btn = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(file_dir.GenSubFil("info.png"));
img_thumb_magnify = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(file_dir.GenSubFil("magnify-clip.png"));
img_xowa_protocol = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(app.Fsys_mgr().Bin_xowa_file_dir().GenSubFil_nest("app.general", "xowa_exec.png"));
img_xowa_protocol = fsys_lnx_encoder.Encode_to_file_protocol(app.Fsys_mgr().Bin_xowa_file_dir().GenSubFil_nest("app.general", "xowa_exec.png"));
portal_mgr = new Xow_portal_mgr(wiki);
imgs_mgr = new Xoh_imgs_mgr(this);
module_mgr = new Xow_module_mgr(wiki);
@ -55,9 +53,6 @@ public class Xow_html_mgr implements Gfo_invk {
public Xow_module_mgr Head_mgr() {return module_mgr;} private Xow_module_mgr module_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;
public byte[] Img_media_info_btn() {return img_media_info_btn;} private byte[] img_media_info_btn;
public byte[] Img_thumb_magnify() {return img_thumb_magnify;} private byte[] img_thumb_magnify;
public byte[] Img_xowa_protocol() {return img_xowa_protocol;} private byte[] img_xowa_protocol;
public boolean Img_suppress_missing_src() {return img_suppress_missing_src;} public Xow_html_mgr Img_suppress_missing_src_(boolean v) {img_suppress_missing_src = v; return this;} private boolean img_suppress_missing_src = true;
public Xohp_ctg_grp_mgr Ctg_mgr() {return ctg_mgr;} private Xohp_ctg_grp_mgr ctg_mgr = new Xohp_ctg_grp_mgr();

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.htmls.core.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*;
import gplx.core.btries.*;
import gplx.langs.htmls.*; import gplx.xowa.langs.kwds.*;
import gplx.langs.htmls.*; import gplx.xowa.langs.kwds.*; import gplx.langs.htmls.entitys.*;
import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.lnkes.*;
import gplx.xowa.wikis.domains.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.miscs.*; import gplx.xowa.parsers.htmls.*;

View File

@ -16,7 +16,8 @@ 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.htmls.core.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*;
import gplx.core.btries.*; import gplx.langs.htmls.*;
import gplx.core.btries.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.entitys.*;
import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.xndes.*;
public class Xoh_html_wtr_escaper {
public static byte[] Escape(Xop_amp_mgr amp_mgr, Bry_bfr tmp_bfr, byte[] src) {
@ -53,19 +54,19 @@ public class Xoh_html_wtr_escaper {
if (o == null) // invalid; EX: "a&b"; "&bad;"; "&#letters;";
bfr.Add(Gfh_entity_.Amp_bry); // escape & and continue
else { // is either (1) a name or (2) an ncr (hex/dec)
Xop_amp_trie_itm itm = (Xop_amp_trie_itm)o;
Gfh_entity_itm itm = (Gfh_entity_itm)o;
int match_pos = trv.Pos();
int itm_tid = itm.Tid();
switch (itm_tid) {
case Xop_amp_trie_itm.Tid_name_std:
case Xop_amp_trie_itm.Tid_name_xowa: // name
case Gfh_entity_itm.Tid_name_std:
case Gfh_entity_itm.Tid_name_xowa: // name
bfr.Add_mid(src, i, match_pos); // embed entire name
i = match_pos - 1;
break;
case Xop_amp_trie_itm.Tid_num_dec:
case Xop_amp_trie_itm.Tid_num_hex: // ncr: dec/hex; escape if invalid
case Gfh_entity_itm.Tid_num_dec:
case Gfh_entity_itm.Tid_num_hex: // ncr: dec/hex; escape if invalid
Xop_amp_mgr_rslt rslt = new Xop_amp_mgr_rslt();
boolean pass = amp_mgr.Parse_ncr(rslt, itm_tid == Xop_amp_trie_itm.Tid_num_hex, src, end, i, match_pos);
boolean pass = amp_mgr.Parse_ncr(rslt, itm_tid == Gfh_entity_itm.Tid_num_hex, src, end, i, match_pos);
if (pass) { // parse worked; embed entire ncr; EX: "&#123;"
int end_pos = rslt.Pos();
bfr.Add_mid(src, i, end_pos);

View File

@ -35,6 +35,7 @@ public class Xoh_hzip_dict_ {
, Tid__img_bare = 9
, Tid__toc = 10
, Tid__pgbnr = 11
, Tid__media = 12
;
public static final String
Key__timeline = "timeline"
@ -50,6 +51,7 @@ public class Xoh_hzip_dict_ {
, Key__img_bare = "img_bare"
, Key__toc = "toc"
, Key__pgbnr = "pgbnr"
, Key__media = "media"
;
public static final int Hzip__none = 0, Hzip__v1 = 1;
}

View File

@ -20,9 +20,9 @@ import gplx.core.btries.*; import gplx.core.threads.poolables.*;
import gplx.xowa.htmls.core.wkrs.escapes.*;
import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.lnkes.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import gplx.xowa.htmls.core.wkrs.xndes.*;
import gplx.xowa.htmls.core.wkrs.imgs.*; import gplx.xowa.htmls.core.wkrs.thms.*; import gplx.xowa.htmls.core.wkrs.tocs.*;
import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*;
import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*; import gplx.xowa.htmls.core.wkrs.addons.medias.*;
public class Xoh_pool_mgr__data {
private final Gfo_poolable_mgr pool__hdr, pool__lnke, pool__img, pool__img_bare, pool__toc, pool__timeline, pool__gallery;
private final Gfo_poolable_mgr pool__hdr, pool__lnke, pool__img, pool__img_bare, pool__toc, pool__timeline, pool__gallery, pool__media;
public Xoh_pool_mgr__data() {
pool__hdr = New_pool(new Xoh_hdr_data());
pool__lnke = New_pool(new Xoh_lnke_data());
@ -31,6 +31,7 @@ public class Xoh_pool_mgr__data {
pool__toc = New_pool(new Xoh_toc_data());
pool__timeline = New_pool(new Xoh_timeline_data());
pool__gallery = New_pool(new Xoh_gallery_data());
pool__media = New_pool(new Xoh_media_data());
}
public Xoh_data_itm Get_by_tid(int tid) {
Gfo_poolable_mgr pool = null;
@ -42,6 +43,7 @@ public class Xoh_pool_mgr__data {
case Xoh_hzip_dict_.Tid__toc: pool = pool__toc; break;
case Xoh_hzip_dict_.Tid__timeline: pool = pool__timeline; break;
case Xoh_hzip_dict_.Tid__gallery: pool = pool__gallery; break;
case Xoh_hzip_dict_.Tid__media: pool = pool__media; break;
default: return null;
}
return (Xoh_data_itm)pool.Get_fast();

View File

@ -20,10 +20,10 @@ import gplx.core.btries.*; import gplx.core.threads.poolables.*;
import gplx.xowa.htmls.core.wkrs.escapes.*;
import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.lnkes.*; import gplx.xowa.htmls.core.wkrs.lnkis.*; import gplx.xowa.htmls.core.wkrs.xndes.*;
import gplx.xowa.htmls.core.wkrs.imgs.*; import gplx.xowa.htmls.core.wkrs.thms.*; import gplx.xowa.htmls.core.wkrs.glys.*; import gplx.xowa.htmls.core.wkrs.tocs.*;
import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*;
import gplx.xowa.htmls.core.wkrs.addons.timelines.*; import gplx.xowa.htmls.core.wkrs.addons.gallerys.*; import gplx.xowa.htmls.core.wkrs.addons.medias.*;
public class Xoh_pool_mgr__hzip {
private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs();
private Gfo_poolable_mgr mkr__escape, mkr__xnde, mkr__lnke, mkr__lnki, mkr__hdr, mkr__img, mkr__thm, mkr__gly, mkr__img_bare, mkr__gallery, mkr__timeline, mkr__toc;
private Gfo_poolable_mgr mkr__escape, mkr__xnde, mkr__lnke, mkr__lnki, mkr__hdr, mkr__img, mkr__thm, mkr__gly, mkr__img_bare, mkr__gallery, mkr__timeline, mkr__toc, mkr__media;
public Xoh_escape_hzip Mw__escape() {return (Xoh_escape_hzip) mkr__escape.Get_fast();}
public Xoh_xnde_hzip Mw__xnde() {return (Xoh_xnde_hzip) mkr__xnde.Get_fast();}
public Xoh_hdr_hzip Mw__hdr() {return (Xoh_hdr_hzip) mkr__hdr.Get_fast();}
@ -36,6 +36,7 @@ public class Xoh_pool_mgr__hzip {
public Xoh_toc_hzip Mw__toc() {return (Xoh_toc_hzip) mkr__toc.Get_fast();}
public Xoh_gallery_hzip Mw__gallery() {return (Xoh_gallery_hzip) mkr__gallery.Get_fast();}
public Xoh_timeline_hzip Mw__timeline() {return (Xoh_timeline_hzip) mkr__timeline.Get_fast();}
public Xoh_media_hzip Mw__media() {return (Xoh_media_hzip) mkr__media.Get_fast();}
public void Init() {
this.Reg_all(false, Hook__core, Hook__html, Hook__mw);
}
@ -44,7 +45,7 @@ public class Xoh_pool_mgr__hzip {
Gfo_poolable_mgr mgr = (Gfo_poolable_mgr)mgr_obj;
return (Xoh_hzip_wkr)mgr.Get_fast();
}
private void Reg_all(boolean mode_is_b256, int hook__core, int hook__html, int hook__mw) {
private void Reg_all(boolean mode_is_b256, int hook__core, int hook__html, int hook__mw) { // SERIALIZED
mkr__escape = Reg(New_hook_len2(mode_is_b256, hook__core, 0) , new Xoh_escape_hzip());
mkr__xnde = Reg(New_hook_len1(mode_is_b256, hook__html) , new Xoh_xnde_hzip());
mkr__hdr = Reg(New_hook_len2(mode_is_b256, hook__mw , 1) , new Xoh_hdr_hzip());
@ -55,6 +56,7 @@ public class Xoh_pool_mgr__hzip {
mkr__gly = Reg(New_hook_len2(mode_is_b256, hook__mw , 6) , new Xoh_gly_hzip());
mkr__img_bare = Reg(New_hook_len2(mode_is_b256, hook__mw , 7) , new Xoh_img_bare_hzip());
mkr__toc = Reg(New_hook_len2(mode_is_b256, hook__mw , 8) , new Xoh_toc_hzip());
mkr__media = Reg(New_hook_len2(mode_is_b256, hook__mw , 9) , new Xoh_media_hzip());
mkr__gallery = Reg(Xoh_gallery_data.Hook_bry , new Xoh_gallery_hzip());
mkr__timeline = Reg(Xoh_timeline_data.Hook_bry , new Xoh_timeline_hzip());
}

View File

@ -40,6 +40,7 @@ public class Xoh_hdoc_wkr__hzip implements Xoh_hdoc_wkr {
case Xoh_hzip_dict_.Tid__img: wkr = hctx.Pool_mgr__hzip().Mw__img(); break;
case Xoh_hzip_dict_.Tid__img_bare: wkr = hctx.Pool_mgr__hzip().Mw__img_bare(); break;
case Xoh_hzip_dict_.Tid__toc: wkr = hctx.Pool_mgr__hzip().Mw__toc(); break;
case Xoh_hzip_dict_.Tid__media: wkr = hctx.Pool_mgr__hzip().Mw__media(); break;
default: throw Err_.new_unhandled(data.Tid());
}
wkr.Encode1(bfr, this, hctx, hpg, Bool_.Y, src, data).Pool__rls();

View File

@ -0,0 +1,126 @@
/*
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.htmls.core.wkrs.addons.medias; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.addons.*;
import gplx.core.threads.poolables.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.styles.*;
import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; import gplx.xowa.htmls.core.wkrs.imgs.*;
public class Xoh_media_data implements Xoh_data_itm, Gfh_style_wkr {
public int Tid() {return Xoh_hzip_dict_.Tid__media;}
public int Src_bgn() {return src_bgn;} private int src_bgn;
public int Src_end() {return src_end;} private int src_end;
public boolean Rng_valid() {return rng_valid;} private boolean rng_valid;
public boolean Is_audio() {return is_audio;} private boolean is_audio;
public boolean Aud_noicon() {return aud_noicon;} private boolean aud_noicon;
public int Aud_width() {return aud_width;} private int aud_width;
public int Lnki_ttl_bgn() {return lnki_ttl_bgn;} private int lnki_ttl_bgn;
public int Lnki_ttl_end() {return lnki_ttl_end;} private int lnki_ttl_end;
public Xoh_img_data Img_data() {return img_data;} private final Xoh_img_data img_data = new Xoh_img_data();
public void Clear() {
this.src_bgn = this.src_end = this.lnki_ttl_bgn = this.lnki_ttl_end = aud_width = -1;
this.rng_valid = true;
this.is_audio = this.aud_noicon = false;
img_data.Clear();
}
public boolean Init_by_parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag media_div_head, Gfh_tag unused) {
this.Clear();
this.src_bgn = media_div_head.Src_bgn();
// peek media_div_tail; needed b/c audio div may have 1 or 2 divs
Gfh_tag media_div_tail = tag_rdr.Tag__peek_fwd_tail(Gfh_tag_.Id__div);
this.src_end = media_div_tail.Src_end();
// move div_0_head and get anch_0_head; EX: <div class='xowa_media_div'> ... <div><a>
Gfh_tag div_0_head = tag_rdr.Tag__move_fwd_head(); if (div_0_head.Name_id() != Gfh_tag_.Id__div) return Log_failure(tag_rdr, "hzip.media:missing.div_0");
Gfh_tag anch_0_head = tag_rdr.Tag__move_fwd_head(); if (anch_0_head.Name_id() != Gfh_tag_.Id__a) return Log_failure(tag_rdr, "hzip.media:missing.anch_0");
// check cls; if "xowa_media_play", then audio; else video
if (anch_0_head.Atrs__cls_eq(Xoh_anch_cls_.Bry__media_play)) {
if (!Parse_aud(tag_rdr, src, anch_0_head)) return false;
}
else {
if (!Parse_vid(hdoc_wkr, hctx, tag_rdr, src, anch_0_head)) return false;
}
return true;
}
private boolean Parse_aud(Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag anch_0_head) {
this.is_audio = true;
// get lnki_ttl from xowa_title; EX: xowa_title="A.png"
Gfh_atr xowa_title_atr = anch_0_head.Atrs__get_by_or_fail(Xoh_img_data.Bry__atr__xowa_title);
this.lnki_ttl_bgn = xowa_title_atr.Val_bgn();
this.lnki_ttl_end = xowa_title_atr.Val_end();
// get width from style='max-width:'
Gfh_atr style_atr = anch_0_head.Atrs__get_by_or_empty(Gfh_atr_.Bry__style);
Gfh_style_parser_.Parse(src, style_atr.Val_bgn(), style_atr.Val_end(), this); // parse for width; note width only appears if items_per_row is specified
// move to div_0_tail
tag_rdr.Tag__move_fwd_tail(Gfh_tag_.Id__div);
// check if div_1 exists (info icon)
Gfh_tag div_1_head = tag_rdr.Tag__peek_fwd_head(Gfh_tag_.Id__div);
if ( div_1_head.Name_id() == Gfh_tag_.Id__eos // <div> not found
|| div_1_head.Src_bgn() > src_end // <div> is after </div.xowa_media_div>
) {
aud_noicon = true;
}
// move rdr to media_div_tail.end
tag_rdr.Pos_(src_end);
return true;
}
private boolean Parse_vid(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Gfh_tag_rdr tag_rdr, byte[] src, Gfh_tag anch_0_head) {
this.is_audio = false;
// get lnki_ttl from xowa_title; EX: xowa_title="A.png"
img_data.Init_by_parse(hdoc_wkr, hctx, tag_rdr, src, anch_0_head, null);
// move to div_0_tail
tag_rdr.Tag__move_fwd_tail(Gfh_tag_.Id__div);
// check if div_1 exists (info icon)
tag_rdr.Tag__move_fwd_head(Gfh_tag_.Id__div);
// move rdr to media_div_tail.end
tag_rdr.Pos_(src_end);
return true;
}
public void Init_by_decode(boolean is_audio, int aud_width, boolean aud_noicon, int lnki_ttl_bgn, int lnki_ttl_end) {
this.is_audio = is_audio; this.aud_width = aud_width; this.aud_noicon = aud_noicon;
this.lnki_ttl_bgn = lnki_ttl_bgn; this.lnki_ttl_end = lnki_ttl_end;
}
public boolean On_atr(byte[] src, int atr_idx, int atr_val_bgn, int atr_val_end, int itm_bgn, int itm_end, int key_bgn, int key_end, int val_bgn, int val_end) {
if (Bry_.Match(src, key_bgn, key_end, Style__max_width)) { // 'max-width'
if (aud_width == -1) {
aud_width = Bry_.To_int_or__lax(src, val_bgn, val_end, -1);
return true;
} // else if already set, fall-thru to below
}
return true;
}
private boolean Log_failure(Gfh_tag_rdr tag_rdr, String msg, Object... args) {
tag_rdr.Err_wkr().Warn(msg, args);
return false;
}
public static final byte[] Hook_bry = Bry_.new_a7(" class=\"media mw-media");
private static final byte[] Style__max_width = Bry_.new_a7("max-width");
public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx;
public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_media_data rv = new Xoh_media_data(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;}
}

View File

@ -0,0 +1,84 @@
/*
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.htmls.core.wkrs.addons.medias; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.addons.*;
import gplx.core.brys.*; import gplx.core.encoders.*; import gplx.core.threads.poolables.*;
import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.imgs.*;
public class Xoh_media_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
private final Xoh_img_hzip img_hzip = new Xoh_img_hzip();
private final Xoh_media_wtr wtr = new Xoh_media_wtr();
public int Tid() {return Xoh_hzip_dict_.Tid__media;}
public String Key() {return Xoh_hzip_dict_.Key__media;}
public byte[] Hook() {return hook;} private byte[] hook;
public Gfo_poolable_itm Encode1(Xoh_hzip_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, byte[] src, Object data_obj) {
Xoh_media_data data = (Xoh_media_data)data_obj;
if (!data.Rng_valid()) {
bfr.Add_mid(src, data.Src_bgn(), data.Src_end());
return this;
}
// flags
boolean is_audio = flag_bldr.Set_as_bool(Flag__is_audio, data.Is_audio());
flag_bldr.Set(Flag__noicon, data.Aud_noicon());
// hzip
bfr.Add(hook);
Gfo_hzip_int_.Encode(1, bfr, flag_bldr.Encode());
if (is_audio) {
bfr.Add_hzip_int(2, data.Aud_width());
bfr.Add_hzip_mid(src, data.Lnki_ttl_bgn(), data.Lnki_ttl_end());
}
else {
img_hzip.Encode1(bfr, hdoc_wkr, hctx, hpg, Bool_.N, src, data.Img_data());
}
return this;
}
public void Decode1(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int src_bgn, int src_end, Xoh_data_itm data_itm) {
// flags
int flag = rdr.Read_hzip_int(1); flag_bldr.Decode(flag);
boolean is_audio = flag_bldr.Get_as_bool(Flag__is_audio);
boolean aud_noicon = flag_bldr.Get_as_bool(Flag__noicon);
// lnki_ttl
int aud_width = -1;
int lnki_ttl_bgn = -1, lnki_ttl_end = -1;
if (is_audio) {
aud_width = rdr.Read_hzip_int(2);
lnki_ttl_bgn = rdr.Pos(); lnki_ttl_end = rdr.Find_fwd_lr();
}
// write
Xoh_media_data data = (Xoh_media_data)data_itm;
data.Init_by_decode(is_audio, aud_width, aud_noicon, lnki_ttl_bgn, lnki_ttl_end);
if (!is_audio) {
img_hzip.Decode1(bfr, hdoc_wkr, hctx, hpg, rdr, src, rdr.Pos(), src_end, data.Img_data());
img_hzip.Wtr().Init_by_decode(hpg, hctx, src, data.Img_data());
}
wtr.Write(bfr, hpg, hctx, src, data, img_hzip.Wtr());
}
public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx;
public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_media_hzip rv = new Xoh_media_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;}
private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_(1, 1);
private static final int // SERIALIZED
Flag__is_audio = 0
, Flag__noicon = 1
;
}

View File

@ -0,0 +1,95 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//namespace gplx.xowa.htmls.core.wkrs.addons.medias {
// import org.junit.*; using gplx.core.tests;
// using gplx.langs.htmls; using gplx.xowa.htmls.core.makes.tests;
// public class Xoh_media_hzip_tst {
// private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
// @Test public void Video__full__ogv__width_y() { // EX: [[File:A.ogv|320px|bcd|alt=efg]]; DATE:2016-08-05
// fxt.Test__bicode // NOTE: caption not rendered; may need to reconsider;
// ( "*!!aA.ogv~)$bA.ogv~efg~", String_.Concat_lines_nl_skip_last
// ( "<div class='xowa_media_div'>"
// , "<div>"
// + "<a href='/wiki/File:A.ogv' class='image' title='A.ogv' xowa_title='A.ogv'>"
// + "<img data-xowa-title='A.ogv' data-xoimg='0|320|-1|-1|-1|-1' src='' width='0' height='0' alt='efg'>"
// + "</a>"
// + "</div>"
// , "<div>"
// + "<a href='' xowa_title='A.ogv' class='xowa_media_play' style='width:318px;max-width:320px;' alt='Play sound'>"
// + "</a>"
// + "</div>"
// , "</div>"
// ));
// }
// @Test public void Video__full__ogv__width_n() { // EX: [[File:A.ogv]]; DATE:2016-08-05
// fxt.Test__bicode
// ( "*!!aA.ogv~!A.ogv~efg~", String_.Concat_lines_nl_skip_last
// ( "<div class='xowa_media_div'>"
// , "<div>"
// + "<a href='/wiki/File:A.ogv' class='image' title='A.ogv' xowa_title='A.ogv'>"
// + "<img data-xowa-title='A.ogv' data-xoimg='0|-1|-1|-1|-1|-1' src='' width='0' height='0' alt='efg'>"
// + "</a>"
// + "</div>"
// , "<div>"
// + "<a href='' xowa_title='A.ogv' class='xowa_media_play' style='width:218px;max-width:220px;' alt='Play sound'>" // NOTE: default to 220px if no w specified
// + "</a>"
// + "</div>"
// , "</div>"
// ));
// }
// @Test public void Audio__thumb() {
// String html = Gfh_utl.Replace_apos(String_.Concat_lines_nl
// ( "<div class='thumb tright'>"
// , " <div class='thumbinner' style='width:11px;'>"
// , " <div class='xowa_media_div'>"
// , "<div><a href='' xowa_title='A.oga' class='xowa_media_play' style='width:318px;max-width:320px;' alt='Play sound'></a></div>"
// , "<div><a href='/wiki/File:A.oga' class='xowa_media_info' title='About this file'></a></div>"
// , "</div>"
// , " <div class='thumbcaption'>"
// , "<div class='magnify'><a href='/wiki/File:A.oga' class='internal' title='Enlarge'></a></div>b"
// , " </div>"
// , " </div>"
// , "</div>"
// ));
//
// String hzip = String_.Concat_lines_nl
// ( "<div class=\"thumb tright\">"
// , " <div class=\"thumbinner\" style=\"width:11px;\">"
// , " ~*#$bA.oga"
// , " <div class=\"thumbcaption\">"
// , "<div class=\"magnify\">$|%%,)A.ogaEnlarge</div>b"
// , " </div>"
// , " </div>"
// , "</div>"
// );
// fxt.Test__bicode(hzip, html);
// }
// @Test public void Audio__noicon() {
// String html = Gfh_utl.Replace_apos(String_.Concat_lines_nl
// ( " <div class='xowa_media_div'>"
// , "<div><a href='' xowa_title='A.oga' class='xowa_media_play' style='width:318px;max-width:320px;' alt='Play sound'></a></div>"
// , "</div>"
// ));
//
// String hzip = String_.Concat_lines_nl
// ( " ~*$$bA.oga"
// );
// fxt.Test__bicode(hzip, html);
// }
// }
//}

View File

@ -0,0 +1,66 @@
/*
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.htmls.core.wkrs.addons.medias; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.addons.*;
import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*; import gplx.core.brys.args.*;
import gplx.xowa.files.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.imgs.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*;
import gplx.xowa.htmls.sections.*; import gplx.xowa.htmls.core.hzips.*;
public class Xoh_media_wtr {
private final Bfr_arg__bry lnki_ttl = Bfr_arg__bry.New_empty();
public void Write(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_data_itm data_itm, Xoh_img_wtr img_wtr) {
// make fsdb_itm
hpg.Img_mgr().Make_aud();
// set props and write
Xoh_media_data data = (Xoh_media_data)data_itm;
if (data.Is_audio()) {
lnki_ttl.Set_by_mid(src, data.Lnki_ttl_bgn(), data.Lnki_ttl_end());
if (data.Aud_noicon())
fmt__noicon.Bfr_arg__clear();
else
fmt__noicon.Args_(lnki_ttl);
int aud_width = data.Aud_width();
fmt__audio.Bld_many(bfr, lnki_ttl, aud_width - 2, aud_width, fmt__noicon);
}
else {
Xoh_img_data img_data = data.Img_data();
lnki_ttl.Set_by_val(img_data.Img_src().File_ttl_bry());
// lnki_w
int lnki_w = img_data.Img_xoimg().Lnki_w();
if (lnki_w == -1) lnki_w = Xof_img_size.Thumb_width_ogv; // no width; default to 220; EX: [[File:A.ogv]]
fmt__video.Bld_many(bfr, img_wtr, lnki_ttl, lnki_w - 2, lnki_w);
}
}
private final Bfr_arg__bry_fmt fmt__noicon = new Bfr_arg__bry_fmt(Bry_fmt.Auto_nl_apos("\n<div><a href='/wiki/File:~{lnki_ttl}' class='xowa_media_info' title='About this file'></a></div>"));
private final Bry_fmt
fmt__audio = Bry_fmt.Auto_nl_apos
( "<div class='xowa_media_div'>"
, "<div><a href='' xowa_title='~{lnki_ttl}' class='xowa_media_play' style='width:~{a_width}px;max-width:~{a_max_width}px;' alt='Play sound'></a></div>~{noicon}"
, "</div>"
)
, fmt__video = Bry_fmt.Auto_nl_apos
( "<div class='xowa_media_div'>"
, "<div>~{div1_img}</div>"
, "<div><a href='' xowa_title='~{lnki_ttl}' class='xowa_media_play' style='width:~{a_width}px;max-width:~{a_max_width}px;' alt='Play sound'></a></div>"
, "</div>"
);
}

View File

@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.htmls.core.wkrs.bfr_args; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import gplx.core.brys.*;
public class Bfr_arg__hatr_arg implements Bfr_arg_clearable {
private final byte[] atr_bgn;
private final byte[] atr_bgn;
private Bfr_arg_clearable val_as_arg;
public Bfr_arg__hatr_arg(byte[] key) {this.atr_bgn = Bfr_arg__hatr_.Bld_atr_bgn(key);}
public Bfr_arg__hatr_arg Set_by_arg(Bfr_arg_clearable v) {val_as_arg = v; return this;}
@ -36,5 +36,5 @@ class Bfr_arg__html_atr__empty implements Bfr_arg_clearable {
public void Bfr_arg__clear() {}
public boolean Bfr_arg__missing() {return false;}
public void Bfr_arg__add(Bry_bfr bfr) {}
public static final Bfr_arg__html_atr__empty Instance = new Bfr_arg__html_atr__empty(); Bfr_arg__html_atr__empty() {}
public static final Bfr_arg__html_atr__empty Instance = new Bfr_arg__html_atr__empty(); Bfr_arg__html_atr__empty() {}
}

View File

@ -34,4 +34,5 @@ public class Bfr_arg__hatr_id implements Bfr_arg_clearable {
}
public static Bfr_arg__hatr_id New_id(String v) {return new Bfr_arg__hatr_id(gplx.langs.htmls.Gfh_atr_.Bry__id, Bry_.new_u8(v));}
public static Bfr_arg__hatr_id New_id(byte[] v) {return new Bfr_arg__hatr_id(gplx.langs.htmls.Gfh_atr_.Bry__id, v);}
public static final int Id__ignore = -1;
}

View File

@ -95,15 +95,6 @@ public class Xoh_img_hzip__dump__basic__tst {
, "<a href='/wiki/File:A.png' class='image' title='abc' xowa_title='A.png'><img data-xowa-title='A.png' data-xoimg='0|220|-1|-1|-1|-1' src='' width='0' height='0' class='cls1' alt='abc'></a>"
);
}
@Test public void Video() { // [[File:A.ogv]]
fxt.Test__bicode
( "%|E9eA.ogv~!A.ogv~~", String_.Concat_lines_nl_skip_last
( "<div class='xowa_media_div'>"
, "<div><a href='/wiki/File:A.ogv' class='image' title='A.ogv' xowa_title='A.ogv'><img data-xowa-title='A.ogv' data-xoimg='0|-1|-1|-1|-1|-1' src='' width='0' height='0' alt=''></a></div>"
, "<div><a href='' xowa_title='A.ogv' class='xowa_media_play' style='width:218px;max-width:220px;' alt='Play sound'></a></div>"
, "</div>"
));
}
@Test public void Imap() {
fxt.Test__bicode
( "~%}#Pa$A.png~#:#S#+\""

View File

@ -16,10 +16,10 @@ 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.htmls.core.wkrs.imgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.brys.args.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.docs.*; import gplx.langs.htmls.encoders.*;
import gplx.core.brys.*; import gplx.core.brys.fmtrs.*; import gplx.core.threads.poolables.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*;
import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*;
import gplx.xowa.files.*; import gplx.xowa.xtns.imaps.*; import gplx.xowa.xtns.pagebanners.*; import gplx.xowa.parsers.lnkis.*;
import gplx.xowa.files.*; import gplx.xowa.xtns.imaps.*; import gplx.xowa.parsers.lnkis.*;
public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
private final Bfr_arg_clearable[] arg_ary;
private final Bfr_arg__hatr_arg img_xowa_image = new Bfr_arg__hatr_arg(Xoh_img_xoimg_data.Bry__data_xowa_image);
@ -38,7 +38,7 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
;
private final Bfr_arg__pgbnr img_pgbnr_atrs = new Bfr_arg__pgbnr();
private boolean img_is_vid; private boolean img_wo_anch;
private byte[] xowa_root_dir;
private int div_w;
public Xoh_img_wtr() {
arg_ary = new Bfr_arg_clearable[]
{ anch_href, anch_rel, anch_cls, anch_title, anch_xowa_title
@ -47,33 +47,35 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
};
}
public Xof_fsdb_itm Fsdb_itm() {return fsdb_itm;} private Xof_fsdb_itm fsdb_itm;
public Xoh_img_wtr Anch_cls_(byte[] v) {anch_cls.Set_by_bry(v); return this;}
public Xoh_img_wtr Img_id_(int uid) {img_id.Set(uid); return this;}
public Xoh_img_wtr Clear() {
for (Bfr_arg_clearable arg : arg_ary)
arg.Bfr_arg__clear();
vid_play_id.Bfr_arg__clear();
img_imap_usemap.Bfr_arg__clear();
img_is_vid = false; img_wo_anch = false;
div_w = -1;
return this;
}
public Xoh_img_wtr Anch_cls_(byte[] v) {anch_cls.Set_by_bry(v); return this;}
public Xoh_img_wtr Img_id_(int uid) {img_id.Set(uid); return this;}
public void Init_by_parse(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_img_data data) {
Init_by_decode(hpg, hctx, src, data);
this.Bfr_arg__add(bfr);
}
private static final byte[] Bry__qarg__esc = Bry_.new_a7("%3F");
public void Init_html(int html_w, int html_h, byte[] src_bry) {
img_w.Set_by_int(html_w);
img_h.Set_by_int(html_h);
if (gplx.core.envs.Op_sys.Cur().Tid_is_drd())
src_bry = Bry_.Replace(src_bry, Byte_ascii.Question_bry, Bry__qarg__esc); // NOTE: if drd, always escape "?" as "%3F" PAGE:en.w:Cleopatra en.w:Cave_painting; DATE:2016-01-31
img_src.Set_by_bry(src_bry);
this.div_w = html_w;
}
private void Init_xoimg(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] lnki_ttl, Xoh_img_xoimg_data img_xowa_image) {
fsdb_itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, hpg.Wiki().Domain_itm().Abrv_xo(), lnki_ttl, Xop_lnki_type.To_flag(img_xowa_image.Lnki_type()), img_xowa_image.Lnki_upright(), img_xowa_image.Lnki_w(), img_xowa_image.Lnki_h(), img_xowa_image.Lnki_time(), img_xowa_image.Lnki_page(), Xof_patch_upright_tid_.Tid_all);
hctx.File__mgr().Find(hpg.Wiki(), hpg.Url_bry_safe(), fsdb_itm);
this.img_xowa_image.Set_by_arg(img_xowa_image.Clone()); // NOTE: must clone b/c img_xowa_image is member of Xoh_img_data which is poolable (and cleared); PAGE:en.w:Almagest; DATE:2016-01-05
this.Init_html(fsdb_itm.Html_w(), fsdb_itm.Html_h(), fsdb_itm.Html_view_url().To_http_file_bry());
this.div_w = fsdb_itm.Lnki_w();
}
public boolean Init_by_decode(Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_data_itm data_itm) {
Xoh_img_data data = (Xoh_img_data)data_itm;
@ -109,7 +111,6 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
|| Bry_.Len_gt_0(file_ttl_bry)) // regular anch with image
anch_xowa_title.Set_by_bry(file_ttl_bry);
img_xowa_title.Set_by_bry(file_ttl_bry);
xowa_root_dir = hctx.Fsys__root();
img_alt.Set_by_mid_or_empty(src, data.Img_alt_bgn(), data.Img_alt_end());
img_cls.Set_by_arg(data.Img_cls());
if (data.Img_imap_idx() != -1) img_imap_usemap.Set(data.Img_imap_idx());
@ -124,10 +125,14 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
if (img_wo_anch)
img_wo_anch_fmtr.Bld_bfr_many(bfr, img_id, img_xowa_title, img_xowa_image, img_src, img_w, img_h, img_cls, img_alt, img_imap_usemap);
else {
if (img_is_vid) bfr.Add(Vid__bry__bgn);
if (img_is_vid) {
bfr.Add(Vid__bry__bgn);
}
img_fmtr.Bld_bfr_many(bfr, (Object[])arg_ary);
if (img_is_vid)
vid_fmtr.Bld_bfr_many(bfr, vid_play_id, anch_xowa_title, xowa_root_dir, 218, 220); // TODO_OLD: hardcode widths; need to update via js from fsdb
if (img_is_vid) {
if (div_w <= 0) div_w = Xof_img_size.Thumb_width_img; // if no div_w, default to 220;
vid_fmt.Bld_many(bfr, vid_play_id, anch_xowa_title, div_w - 2, div_w);
}
}
}
public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx;
@ -140,8 +145,12 @@ public class Xoh_img_wtr implements Bfr_arg, Xoh_wtr_itm {
, img_wo_anch_fmtr = Bry_fmtr.new_
( "<img~{img_id}~{img_xowa_title}~{img_xowa_image}~{img_src}~{img_w}~{img_h}~{img_cls}~{img_alt}~{img_imap_usemap}>"
, "img_id", "img_xowa_title", "img_xowa_image", "img_src", "img_w", "img_h", "img_cls", "img_alt", "img_imap_usemap")
, vid_fmtr = Bry_fmtr.new_
( "</div>\n<div><a~{vid_play_id} href=\"\"~{xowa_title} class=\"xowa_media_play\" style=\"width:218px;max-width:220px;\" alt=\"Play sound\"></a></div>\n</div>"
, "vid_play_id", "xowa_title", "xowa_root_dir", "width_neg_2", "width") // NOTE: default to href='file:///'; will be filled in dynamically
;
private final Bry_fmt
vid_fmt = Bry_fmt.Auto_nl_apos
( "</div>"
, "<div><a~{vid_play_id} href=''~{xowa_title} class='xowa_media_play' style='width:~{a_width}px;max-width:~{a_max_width}px;' alt='Play sound'></a></div>"
, "</div>"
);
private static final byte[] Bry__qarg__esc = Bry_.new_a7("%3F");
}

View File

@ -22,31 +22,38 @@ public class Xoh_anch_cls_ {
public static final byte // SERIALIZED
Tid__image = 0 // EX: [[File:A.png]] -> "<a class='image'>"
, Tid__none = 1 // EX: [[File:A.png|link=A]] -> "<a class=''>"
// , Tid__xowa_media_play = 2 // EX: [[File:A.ogg]] -> "<a class='xowa_media_play'>"
;
public static final String
Str__image = "image"
// , Str__xowa_media_play = "xowa_media_play"
;
public static final byte[]
public static final byte[]
Bry__image = Bry_.new_a7(Str__image)
// , Bry__xowa_media_play = Bry_.new_a7(Str__xowa_media_play)
;
private static final byte[]
private static final byte[]
Html__image = Bry_.Add(Gfh_bldr_.Bry__cls__nth, Bry__image)
// , Html__xowa_media_play = Bry_.Add(Gfh_bldr_.Bry__cls__nth, Bry__xowa_media_play)
;
public static final Btrie_slim_mgr Trie = Btrie_slim_mgr.cs()
.Add_bry_byte(Bry__image , Tid__image)
public static final Btrie_slim_mgr Trie = Btrie_slim_mgr.cs()
.Add_bry_byte(Bry__image , Tid__image)
// .Add_bry_byte(Bry__xowa_media_play , Tid__xowa_media_play)
;
public static byte[] To_html(int tid) {
switch (tid) {
case Xoh_anch_cls_.Tid__none: return Bry_.Empty;
case Xoh_anch_cls_.Tid__image: return Html__image;
default: throw Err_.new_unhandled(tid);
case Xoh_anch_cls_.Tid__none: return Bry_.Empty;
case Xoh_anch_cls_.Tid__image: return Html__image;
// case Xoh_anch_cls_.Tid__xowa_media_play: return Html__xowa_media_play;
default: throw Err_.new_unhandled(tid);
}
}
public static byte[] To_val(int tid) {
switch (tid) {
case Xoh_anch_cls_.Tid__none: return Bry_.Empty;
case Xoh_anch_cls_.Tid__image: return Bry__image;
default: throw Err_.new_unhandled(tid);
case Xoh_anch_cls_.Tid__none: return Bry_.Empty;
case Xoh_anch_cls_.Tid__image: return Bry__image;
// case Xoh_anch_cls_.Tid__xowa_media_play: return Bry__xowa_media_play;
default: throw Err_.new_unhandled(tid);
}
}
}

View File

@ -17,12 +17,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.htmls.core.wkrs.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import gplx.core.btries.*; import gplx.core.net.*; import gplx.core.net.qargs.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.apps.urls.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.hrefs.*;
import gplx.langs.htmls.*; import gplx.langs.htmls.entitys.*; import gplx.xowa.htmls.hrefs.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkes.*;
import gplx.xowa.htmls.core.htmls.*;
public class Xoh_lnke_html {
private static final byte[] Disabled_button = Bry_.new_a7("&#x2297;");
private final Gfo_url_encoder href_encoder = Gfo_url_encoder_.New__html_href_quotes().Make();
private final Gfo_url_encoder gfs_encoder = Gfo_url_encoder_.New__gfs().Make();
public void Write_html(Bry_bfr bfr, Xow_html_mgr html_mgr, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke) {
int href_bgn = lnke.Lnke_href_bgn(), href_end = lnke.Lnke_href_end(); boolean proto_is_xowa = lnke.Proto_tid() == Gfo_protocol_itm.Tid_xowa;
byte lnke_type = Calc_type(lnke);
@ -59,7 +60,7 @@ public class Xoh_lnke_html {
else { // xowa or regular; EX: http://a.org
if (proto_is_xowa) {
bfr.Add(Xop_lnke_wkr.Bry_xowa_protocol);
gplx.langs.htmls.encoders.Gfo_url_encoder_.Gfs.Encode(bfr, src, href_bgn, href_end);
gfs_encoder.Encode(bfr, src, href_bgn, href_end);
return false;
}
else { // regular; add href

View File

@ -17,8 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*;
import gplx.xowa.files.*; import gplx.xowa.htmls.core.htmls.*;
public interface Xoh_file_img_wkr {
void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid
public interface Xoh_file_fmtr {
void Add_full_img(Bry_bfr bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid
, byte[] a_href, boolean a_href_is_file, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title
, int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other
);

View File

@ -0,0 +1,141 @@
/*
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.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*;
import gplx.core.brys.*; import gplx.core.brys.fmtrs.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.files.*;
import gplx.xowa.parsers.lnkis.*;
public class Xoh_file_fmtr__basic implements Xoh_file_fmtr {
private final Xoh_arg_img_core img_atrs = new Xoh_arg_img_core__basic();
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(128);
private final Bfr_arg__hatr_id div2_id_atr = Bfr_arg__hatr_id.New_id("xowa_file_div_"), play_id_atr = Bfr_arg__hatr_id.New_id("xowa_file_play_");
public void Add_media(Bry_bfr bfr, boolean mode_is_hdump, byte[] a_href, byte[] a_title, byte[] a_html) {
if (mode_is_hdump) a_href = Bry_.Empty;
fmtr_full_media.Bld_many(bfr, a_href, a_title, a_html);
}
private final Bry_fmt fmtr_full_media = Bry_fmt.Auto("<a href=\"~{a_href}\" xowa_title=\"~{a_xowa_title}\">~{html}\n</a>");
@gplx.Virtual public void Add_full_img(Bry_bfr bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid
, byte[] a_href, boolean a_href_is_file, byte a_cls, byte a_rel, byte[] a_title, byte[] a_xowa_title
, int img_w, int img_h, byte[] img_src, byte[] img_alt, byte img_cls, byte[] img_cls_other
) {
// init atrs
img_atrs.Init(uid, img_src, img_w, img_h);
byte[] img_cls_atr = Xoh_img_cls_.To_html(img_cls, img_cls_other);
// fmt
if (Bry_.Len_eq_0(a_href)) // empty link should not create anchor; EX:[[File:A.png|link=|abc]]; PAGE:en.w:List_of_counties_in_New_York; DATE:2016-01-10
fmtr_full_img__anch_n.Bld_many(bfr
, uid, img_alt, img_atrs, img_cls_atr);
else
fmtr_full_img__anch_y.Bld_many(bfr
, a_href, Xoh_lnki_consts.A_cls_to_bry(a_cls), Xoh_lnki_consts.A_rel_to_bry(a_rel), a_title, a_xowa_title
, uid, img_alt, img_atrs, img_cls_atr);
}
private final Bry_fmt fmtr_full_img__anch_y = Bry_fmt.Auto
( "<a href=\"~{a_href}\"~{a_class}~{a_rel}~{a_title} xowa_title=\"~{a_xowa_title}\">"
+ "<img id=\"xoimg_~{uid}\" alt=\"~{img_alt}\"~{img_core}~{img_class} /></a>"
);
private final Bry_fmt fmtr_full_img__anch_n = Bry_fmt.Auto
( "<img id=\"xoimg_~{uid}\" alt=\"~{img_alt}\"~{img_core}~{img_class} />");
public byte[] Bld_thumb_part_img(Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid, byte[] lnki_ttl, byte[] a_href, byte[] img_src, byte[] img_alt) {
byte[] a_title_atr = Gfh_atr_.Make(tmp_bfr, Gfh_atr_.Bry__title, xfer_itm.Lnki_ttl());
Add_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, a_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image
, Xoh_lnki_consts.Tid_a_rel_none, a_title_atr
, Xoh_file_fmtr__basic.Escape_xowa_title(lnki_ttl) // NOTE: must use lnki_ttl, not xfer_itm.Lnki_ttl(); 1st observes case-sensitivity; EX:"a.ogv"; PAGE:de.d:fappieren DATE:2016-06-23
, xfer_itm.Html_w(), xfer_itm.Html_h(), img_src, img_alt, Xoh_img_cls_.Tid__none, null);
return tmp_bfr.To_bry_and_clear();
}
public void Add_thumb_core(Bry_bfr bfr, boolean mode_is_hdump, byte[] div1_halign, int div2_id, int div2_width, byte[] div2_content) {
div2_id_atr.Set(mode_is_hdump ? Bfr_arg__hatr_id.Id__ignore : div2_id);
fmtr_thumb_core.Bld_many(bfr, div1_halign, div2_id_atr, div2_width, div2_content);
}
private final Bry_fmt fmtr_thumb_core = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last // REF.MW: Linker.php|makeImageLink2
( "<div class=\"thumb t~{div1_halign}\">"
, " <div~{div2_id} class=\"thumbinner\" style=\"width:~{div2_width}px;\">"
, "~{div3_content}"
, " </div>"
, "</div>"
, ""
));
public byte[] Bld_thumb_part_caption(byte[] magnify_btn, byte[] caption) {return fmtr_thumb_part_caption.Bld_many_to_bry(tmp_bfr, magnify_btn, caption);}
private final Bry_fmt fmtr_thumb_part_caption = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last
( ""
, " <div class=\"thumbcaption\">~{magnify_btn}~{caption}"
, " </div>"
));
public byte[] Bld_thumb_file_image(byte[] thumb_image, byte[] caption, byte[] alt) {return fmtr_thumb_file_image.Bld_many_to_bry(tmp_bfr, thumb_image, caption, alt);}
private final Bry_fmt fmtr_thumb_file_image = Bry_fmt.Auto(" ~{thumb_image}~{caption}~{alt}");
@gplx.Virtual public byte[] Bld_thumb_file_audio(byte[] caption, byte[] alt, byte[] play_btn, byte[] info_btn) {return fmtr_thumb_file_audio.Bld_many_to_bry(tmp_bfr, play_btn, info_btn, caption, alt);}
private Bry_fmt fmtr_thumb_file_audio = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last
( " <div class=\"xowa_media_div\">~{play_btn}~{info_btn}"
, " </div>~{caption}~{alt}"
));
@gplx.Virtual public byte[] Bld_thumb_file_video(byte[] caption, byte[] alt, byte[] play_btn, byte[] vid_img) {return fmtr_thumb_file_video.Bld_many_to_bry(tmp_bfr, vid_img, play_btn, caption, alt);}
private final Bry_fmt fmtr_thumb_file_video = Bry_fmt.Auto(String_.Concat_lines_nl_skip_last
( " <div class=\"xowa_media_div\">"
, " <div>~{vid_img}"
, " </div>~{play_btn}"
, " </div>~{caption}~{alt}"
));
public Bry_fmt Fmt_thumb_part_alt() {return fmt__thumb_part_alt;} private final Bry_fmt fmt__thumb_part_alt = Bry_fmt.Auto
(String_.Concat_lines_nl_skip_last
( ""
, " <hr/>"
, " <div class=\"thumbcaption\">~{html}"
, " </div>"
));
public byte[] Bld_thumb_part_magnify(byte[] a_href, byte[] a_title) {
return fmtr_thumb_part_magnify.Bld_many_to_bry(tmp_bfr, a_href, a_title);
}
private final Bry_fmt fmtr_thumb_part_magnify = Bry_fmt.Auto("\n<div class=\"magnify\"><a href=\"~{a_href}\" class=\"internal\" title=\"~{a_title}\"></a></div>");
public byte[] Bld_thumb_part_info(byte[] a_href) {
return fmtr_thumb_part_info.Bld_many_to_bry(tmp_bfr, a_href);
}
private final Bry_fmt fmtr_thumb_part_info = Bry_fmt.Auto("\n<div><a href=\"~{a_href}\" class=\"xowa_media_info\" title=\"About this file\"></a></div>");
public byte[] Bld_thumb_part_play(boolean mode_is_hdump, int uid, byte[] a_href, byte[] a_xowa_title, int a_width, int a_max_width) {
if (mode_is_hdump) {
play_id_atr.Set(Bfr_arg__hatr_id.Id__ignore);
a_href = Bry_.Empty;
if (a_max_width == -1) {
a_width = 218; a_max_width = 220; // NOTE: hardcode widths; hdump will get actual file with from fsdb
}
}
else
play_id_atr.Set(uid);
return fmtr_thumb_part_play.Bld_many_to_bry(tmp_bfr, play_id_atr, a_href, a_xowa_title, a_width, a_max_width);
}
private final Bry_fmt fmtr_thumb_part_play = Bry_fmt.Auto
("\n<div><a~{id} href=\"~{a_href}\" xowa_title=\"~{a_xowa_title}\" class=\"xowa_media_play\" style=\"width:~{a_width}px;max-width:~{a_max_width}px;\" alt=\"Play sound\"></a></div>");
public static byte[] Escape_xowa_title(byte[] lnki_ttl) {
return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27
}
public static byte[] Escape_xowa_title_v2(byte[] lnki_ttl) {
return Xoa_ttl.Replace_spaces(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes_v2.Encode(lnki_ttl)); // must encode xowa_title, particularly quotes; EX: xowa_title="A"b.png"; PAGE:en.w:Earth DATE:2015-11-27
}
}

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