diff --git a/100_core/.classpath b/100_core/.classpath index 638416bed..7fbf632d5 100644 --- a/100_core/.classpath +++ b/100_core/.classpath @@ -1,7 +1,6 @@ - diff --git a/100_core/src/gplx/Bry_.java b/100_core/src/gplx/Bry_.java index e2a8c25d6..b3e0e976e 100644 --- a/100_core/src/gplx/Bry_.java +++ b/100_core/src/gplx/Bry_.java @@ -447,6 +447,7 @@ public class Bry_ { public static boolean Match(byte[] src, int src_bgn, byte[] find) {return Match(src, src_bgn, src.length, find, 0, find.length);} public static boolean Match(byte[] src, int src_bgn, int src_end, byte[] find) {return Match(src, src_bgn, src_end, find, 0, find.length);} public static boolean Match(byte[] src, int src_bgn, int src_end, byte[] find, int find_bgn, int find_end) { + if (src_bgn == -1) return false; int src_len = src.length; if (src_end > src_len) src_end = src_len; // must limit src_end to src_len, else ArrayIndexOutOfBounds below; DATE:2015-01-31 int find_len = find_end - find_bgn; @@ -968,4 +969,9 @@ public class Bry_ { } return dirty ? bfr.To_bry_and_clear() : src; } + public static void Clear(byte[] bry) { + int len = bry.length; + for (int i = 0; i < len; ++i) + bry[i] = Byte_.Zero; + } } diff --git a/100_core/src/gplx/Bry_bfr.java b/100_core/src/gplx/Bry_bfr.java index 4b2b57b5a..3aa9a4665 100644 --- a/100_core/src/gplx/Bry_bfr.java +++ b/100_core/src/gplx/Bry_bfr.java @@ -163,6 +163,7 @@ public class Bry_bfr { src.Clear(); return this; } + public Bry_bfr Add_byte_as_a7(byte v) {return Add_byte((byte)(v + Byte_ascii.Num_0));} public Bry_bfr Add_byte_eq() {return Add_byte(Byte_ascii.Eq);} public Bry_bfr Add_byte_pipe() {return Add_byte(Byte_ascii.Pipe);} public Bry_bfr Add_byte_comma() {return Add_byte(Byte_ascii.Comma);} @@ -577,7 +578,11 @@ public class Bry_bfr { public static Bry_bfr new_() {return new Bry_bfr(16);} public static Bry_bfr new_(int v) {return new Bry_bfr(v);} public static Bry_bfr reset_(int v) {return new Bry_bfr(16).Reset_(v);} // PERF: set initial size to 16, not reset val; allows for faster "startup"; DATE:2014-06-14 + protected Bry_bfr() {} Bry_bfr(int bfr_max) { + Init(bfr_max); + } + protected void Init(int bfr_max) { this.bfr_max = bfr_max; this.bfr = new byte[bfr_max]; } diff --git a/100_core/src/gplx/Byte_ascii.java b/100_core/src/gplx/Byte_ascii.java index 2b2538a83..7989e323d 100644 --- a/100_core/src/gplx/Byte_ascii.java +++ b/100_core/src/gplx/Byte_ascii.java @@ -120,5 +120,6 @@ public class Byte_ascii { , Slash_bry = new byte[] {Byte_ascii.Slash} , Asterisk_bry = new byte[] {Byte_ascii.Star} , Dash_bry = new byte[] {Byte_ascii.Dash} + , Cr_lf_bry = new byte[] {Byte_ascii.Cr, Byte_ascii.Nl} ; } diff --git a/100_core/src_100_interface/gplx/Cancelable.java b/100_core/src/gplx/Cancelable.java similarity index 100% rename from 100_core/src_100_interface/gplx/Cancelable.java rename to 100_core/src/gplx/Cancelable.java diff --git a/100_core/src_100_interface/gplx/Cancelable_.java b/100_core/src/gplx/Cancelable_.java similarity index 100% rename from 100_core/src_100_interface/gplx/Cancelable_.java rename to 100_core/src/gplx/Cancelable_.java diff --git a/100_core/src_100_interface/gplx/CompareAble.java b/100_core/src/gplx/CompareAble.java similarity index 100% rename from 100_core/src_100_interface/gplx/CompareAble.java rename to 100_core/src/gplx/CompareAble.java diff --git a/100_core/src_100_interface/gplx/CompareAble_.java b/100_core/src/gplx/CompareAble_.java similarity index 100% rename from 100_core/src_100_interface/gplx/CompareAble_.java rename to 100_core/src/gplx/CompareAble_.java diff --git a/100_core/src_100_interface/gplx/CompareAble_tst.java b/100_core/src/gplx/CompareAble_tst.java similarity index 100% rename from 100_core/src_100_interface/gplx/CompareAble_tst.java rename to 100_core/src/gplx/CompareAble_tst.java diff --git a/100_core/src/gplx/DateAdp_.java b/100_core/src/gplx/DateAdp_.java index 1681132af..d8da51109 100644 --- a/100_core/src/gplx/DateAdp_.java +++ b/100_core/src/gplx/DateAdp_.java @@ -24,6 +24,7 @@ import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; +import gplx.core.times.*; public class DateAdp_ implements GfoInvkAble { public static final String Cls_ref_name = "Date"; public static final Class Cls_ref_type = DateAdp.class; diff --git a/100_core/src/gplx/DateAdp__tst.java b/100_core/src/gplx/DateAdp__tst.java index 450292045..036fcb366 100644 --- a/100_core/src/gplx/DateAdp__tst.java +++ b/100_core/src/gplx/DateAdp__tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -import org.junit.*; +import org.junit.*; import gplx.core.times.*; public class DateAdp__tst { @Test public void Parse_gplx() { tst_Parse_gplx("99991231_235959.999", "99991231_235959.999"); diff --git a/100_core/src/gplx/Io_url.java b/100_core/src/gplx/Io_url.java index 7f610815d..595db7c0a 100644 --- a/100_core/src/gplx/Io_url.java +++ b/100_core/src/gplx/Io_url.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -import gplx.core.strings.*; import gplx.core.ios.*; /*IoUrlInfo*/ import gplx.core.envs.*; +import gplx.core.strings.*; import gplx.core.ios.*; /*IoUrlInfo*/ import gplx.core.envs.*; import gplx.langs.htmls.*; import gplx.core.interfaces.*; public class Io_url implements CompareAble, ParseAble, GfoInvkAble { //_20101005 URL:doc/Io_url.txt public IoUrlInfo Info() {return info;} IoUrlInfo info; public String Raw() {return raw;} final String raw; diff --git a/100_core/src/gplx/List_adp_.java b/100_core/src/gplx/List_adp_.java index e5737425d..f224eb4f4 100644 --- a/100_core/src/gplx/List_adp_.java +++ b/100_core/src/gplx/List_adp_.java @@ -59,7 +59,7 @@ public class List_adp_ { } public static void DisposeAll(List_adp list) { for (int i = 0; i < list.Count(); i++) - ((RlsAble)list.Get_at(i)).Rls(); + ((Rls_able)list.Get_at(i)).Rls(); } public static List_adp new_ary_(Object ary) { int ary_len = Array_.Len(ary); diff --git a/100_core/src_100_interface/gplx/RlsAble.java b/100_core/src/gplx/Rls_able.java similarity index 95% rename from 100_core/src_100_interface/gplx/RlsAble.java rename to 100_core/src/gplx/Rls_able.java index e876c2476..34ccb5c3b 100644 --- a/100_core/src_100_interface/gplx/RlsAble.java +++ b/100_core/src/gplx/Rls_able.java @@ -16,6 +16,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public interface RlsAble { +public interface Rls_able { void Rls(); } diff --git a/100_core/src_100_interface/gplx/RlsAble_.java b/100_core/src/gplx/Rls_able_.java similarity index 66% rename from 100_core/src_100_interface/gplx/RlsAble_.java rename to 100_core/src/gplx/Rls_able_.java index d36bdb853..19cde2e5f 100644 --- a/100_core/src_100_interface/gplx/RlsAble_.java +++ b/100_core/src/gplx/Rls_able_.java @@ -16,11 +16,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -public class RlsAble_ { - public static RlsAble as_(Object obj) {return obj instanceof RlsAble ? (RlsAble)obj : null;} - public static RlsAble cast(Object obj) {try {return (RlsAble)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, RlsAble.class, obj);}} - public static final RlsAble Null = new RlsAble__noop(); +public class Rls_able_ { + public static Rls_able as_(Object obj) {return obj instanceof Rls_able ? (Rls_able)obj : null;} + public static Rls_able cast(Object obj) {try {return (Rls_able)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, Rls_able.class, obj);}} + public static final Rls_able Null = new Rls_able__noop(); } -class RlsAble__noop implements RlsAble { +class Rls_able__noop implements Rls_able { public void Rls() {} } diff --git a/100_core/src/gplx/TimeSpanAdp_.java b/100_core/src/gplx/TimeSpanAdp_.java index 6305808f6..08917090c 100644 --- a/100_core/src/gplx/TimeSpanAdp_.java +++ b/100_core/src/gplx/TimeSpanAdp_.java @@ -151,10 +151,11 @@ public class TimeSpanAdp_ { 3600000, //3,600,000 fracs in an hour (60 minutes * 60,000) }; public static final String MajorDelimiter = ":"; - @gplx.Internal protected static final int Idx_Frac = 0; - @gplx.Internal protected static final int Idx_Sec = 1; - @gplx.Internal protected static final int Idx_Min = 2; - @gplx.Internal protected static final int Idx_Hour = 3; + public static final int + Idx_Frac = 0 + , Idx_Sec = 1 + , Idx_Min = 2 + , Idx_Hour = 3; static int[] ZeroPadding = {3, 2, 2, 2,}; static String[] Sprs = {".", MajorDelimiter, MajorDelimiter, "",}; public static TimeSpanAdp cast(Object arg) {try {return (TimeSpanAdp)arg;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, TimeSpanAdp.class, arg);}} diff --git a/100_core/src_100_interface/gplx/To_str_able.java b/100_core/src/gplx/To_str_able.java similarity index 100% rename from 100_core/src_100_interface/gplx/To_str_able.java rename to 100_core/src/gplx/To_str_able.java diff --git a/100_core/src_100_interface/gplx/To_str_able_.java b/100_core/src/gplx/To_str_able_.java similarity index 100% rename from 100_core/src_100_interface/gplx/To_str_able_.java rename to 100_core/src/gplx/To_str_able_.java diff --git a/100_core/src/gplx/Bitmask_.java b/100_core/src/gplx/core/bits/Bitmask_.java similarity index 94% rename from 100_core/src/gplx/Bitmask_.java rename to 100_core/src/gplx/core/bits/Bitmask_.java index ccd2a2135..cf377b359 100644 --- a/100_core/src/gplx/Bitmask_.java +++ b/100_core/src/gplx/core/bits/Bitmask_.java @@ -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 . */ -package gplx; +package gplx.core.bits; import gplx.*; import gplx.core.*; public class Bitmask_ { public static boolean Has_int(int val, int find) {return find == (val & find);} public static int Flip_int(boolean enable, int val, int find) { diff --git a/100_core/src/gplx/core/btries/Btrie_slim_mgr.java b/100_core/src/gplx/core/btries/Btrie_slim_mgr.java index 632a00d45..bf42917b3 100644 --- a/100_core/src/gplx/core/btries/Btrie_slim_mgr.java +++ b/100_core/src/gplx/core/btries/Btrie_slim_mgr.java @@ -27,7 +27,7 @@ public class Btrie_slim_mgr implements Btrie_mgr { return rv == null ? null : match_pos - bgn_pos == end_pos - bgn_pos ? rv : null; } public Object Match_bgn(byte[] src, int bgn_pos, int end_pos) {return bgn_pos < end_pos ? Match_bgn_w_byte(src[bgn_pos], src, bgn_pos, end_pos) : null;} // handle out of bounds gracefully; EX: Match_bgn("abc", 3, 3) should return null not fail - public Object Match_bgn_w_byte(byte b, byte[] src, int bgn_pos, int src_len) { + public Object Match_bgn_w_byte(byte b, byte[] src, int bgn_pos, int src_end) { Object rv = null; int cur_pos = match_pos = bgn_pos; Btrie_slim_itm cur = root; while (true) { @@ -36,7 +36,7 @@ public class Btrie_slim_mgr implements Btrie_mgr { if (nxt.Ary_is_empty()) {match_pos = cur_pos; return nxt.Val();} // nxt is leaf; return nxt.Val() (which should be non-null) Object nxt_val = nxt.Val(); if (nxt_val != null) {match_pos = cur_pos; rv = nxt_val;} // nxt is node; cache rv (in case of false match) - if (cur_pos == src_len) return rv; // increment cur_pos and exit if src_len + if (cur_pos == src_end) return rv; // increment cur_pos and exit if src_end b = src[cur_pos]; cur = nxt; } @@ -67,6 +67,13 @@ public class Btrie_slim_mgr implements Btrie_mgr { Add_obj(ary[i], obj); return this; } + public Btrie_slim_mgr Add_replace_many(String trg_str, String... src_ary) {return Add_replace_many(Bry_.new_u8(trg_str), src_ary);} + public Btrie_slim_mgr Add_replace_many(byte[] trg_bry, String... src_ary) { + int len = src_ary.length; + for (int i = 0; i < len; i++) + Add_obj(Bry_.new_u8(src_ary[i]), trg_bry); + return this; + } public Btrie_slim_mgr Add_stub(String key, byte val) {byte[] bry = Bry_.new_u8(key); return (Btrie_slim_mgr)Add_obj(bry, new Btrie_itm_stub(val, bry));} public Btrie_slim_mgr Add_stubs(byte[][] ary) {return Add_stubs(ary, ary.length);} public Btrie_slim_mgr Add_stubs(byte[][] ary, int ary_len) { diff --git a/100_core/src/gplx/core/encoders/B85_fp_.java b/100_core/src/gplx/core/encoders/B85_fp_.java new file mode 100644 index 000000000..fc0d9cd17 --- /dev/null +++ b/100_core/src/gplx/core/encoders/B85_fp_.java @@ -0,0 +1,56 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.encoders; import gplx.*; import gplx.core.*; +public class B85_fp_ { + public static byte[] To_bry(double v) { + String str = Double_.To_str(v); + byte[] bry = Bry_.new_a7(str); int len = bry.length; + int num_len = len; boolean neg = false; + int bgn = 0; int dot = -1; + if (bry[0] == Byte_ascii.Dash) {neg = true; bgn = 1; --num_len;} + boolean skip_zeros = true; + for (int i = bgn; i < len; ++i) { + byte b = bry[i]; + switch (b) { + case Byte_ascii.Num_0: + if (skip_zeros) + --num_len; + break; + case Byte_ascii.Dot: + skip_zeros = false; + dot = i; + --num_len; + break; + default: + skip_zeros = false; + break; + } + } + int pow = 0; + if (dot != -1) { + pow = len - (dot + 1); + for (int i = 0; i < pow; ++i) + v *= 10; + } + int num = (int)v; + byte[] rv = new byte[num_len + 1]; + rv[0] = (byte)(Byte_ascii.Dot + pow + (neg ? 45 : 0)); + Base85_.Set_bry(num, rv, 1, 1); + return rv; + } +} diff --git a/100_core/src/gplx/core/encoders/B85_fp__tst.java b/100_core/src/gplx/core/encoders/B85_fp__tst.java new file mode 100644 index 000000000..8ed7e0ef4 --- /dev/null +++ b/100_core/src/gplx/core/encoders/B85_fp__tst.java @@ -0,0 +1,31 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.encoders; import gplx.*; import gplx.core.*; +import org.junit.*; +public class B85_fp__tst { + private final B85_fp__fxt fxt = new B85_fp__fxt(); + @Test public void Double_to_str() { + fxt.Test__to_str(.1d, "/\""); + } +} +class B85_fp__fxt { + public void Test__to_str(double val, String expd) { + byte[] actl = B85_fp_.To_bry(val); + Tfds.Eq_str(expd, String_.new_a7(actl)); + } +} diff --git a/100_core/src/gplx/core/envs/Process_adp.java b/100_core/src/gplx/core/envs/Process_adp.java index 556e1047c..337276242 100644 --- a/100_core/src/gplx/core/envs/Process_adp.java +++ b/100_core/src/gplx/core/envs/Process_adp.java @@ -31,7 +31,7 @@ import gplx.Io_url; import gplx.Io_url_; import gplx.List_adp; import gplx.List_adp_; -import gplx.RlsAble; +import gplx.Rls_able; import gplx.String_; import gplx.Tfds; import gplx.Virtual; @@ -45,7 +45,7 @@ import java.io.InputStreamReader; import javax.management.RuntimeErrorException; import gplx.core.brys.fmtrs.*; import gplx.core.strings.*; import gplx.langs.gfs.*; -public class Process_adp implements GfoInvkAble, RlsAble { +public class Process_adp implements GfoInvkAble, Rls_able { public boolean Enabled() {return enabled;} public Process_adp Enabled_(boolean v) {enabled = v; return this;} private boolean enabled = true; public byte Exe_exists() {return exe_exists;} public Process_adp Exe_exists_(byte v) {exe_exists = v; return this;} private byte exe_exists = Bool_.__byte; public Io_url Exe_url() {return exe_url;} public Process_adp Exe_url_(Io_url val) {exe_url = val; exe_exists = Bool_.__byte; return this;} Io_url exe_url; diff --git a/100_core/src/gplx/core/gfo_regys/GfoRegy.java b/100_core/src/gplx/core/gfo_regys/GfoRegy.java index 0f2228403..0892a743d 100644 --- a/100_core/src/gplx/core/gfo_regys/GfoRegy.java +++ b/100_core/src/gplx/core/gfo_regys/GfoRegy.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.gfo_regys; import gplx.*; import gplx.core.*; -import gplx.langs.gfs.*; import gplx.core.type_xtns.*; +import gplx.langs.gfs.*; import gplx.core.type_xtns.*; import gplx.core.interfaces.*; public class GfoRegy implements GfoInvkAble { public int Count() {return hash.Count();} public Hash_adp Parsers() {return parsers;} Hash_adp parsers = Hash_adp_.new_(); diff --git a/100_core/src_100_interface/gplx/InjectAble.java b/100_core/src/gplx/core/interfaces/InjectAble.java similarity index 91% rename from 100_core/src_100_interface/gplx/InjectAble.java rename to 100_core/src/gplx/core/interfaces/InjectAble.java index 309fca2f9..492648d9c 100644 --- a/100_core/src_100_interface/gplx/InjectAble.java +++ b/100_core/src/gplx/core/interfaces/InjectAble.java @@ -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 . */ -package gplx; +package gplx.core.interfaces; import gplx.*; import gplx.core.*; public interface InjectAble { void Inject(Object owner); } diff --git a/100_core/src_100_interface/gplx/ParseAble.java b/100_core/src/gplx/core/interfaces/ParseAble.java similarity index 91% rename from 100_core/src_100_interface/gplx/ParseAble.java rename to 100_core/src/gplx/core/interfaces/ParseAble.java index 8ab6433da..ea4fe23c5 100644 --- a/100_core/src_100_interface/gplx/ParseAble.java +++ b/100_core/src/gplx/core/interfaces/ParseAble.java @@ -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 . */ -package gplx; +package gplx.core.interfaces; import gplx.*; import gplx.core.*; public interface ParseAble { Object ParseAsObj(String raw); } diff --git a/100_core/src_100_interface/gplx/SrlAble.java b/100_core/src/gplx/core/interfaces/SrlAble.java similarity index 91% rename from 100_core/src_100_interface/gplx/SrlAble.java rename to 100_core/src/gplx/core/interfaces/SrlAble.java index 52709f302..2f9077fcb 100644 --- a/100_core/src_100_interface/gplx/SrlAble.java +++ b/100_core/src/gplx/core/interfaces/SrlAble.java @@ -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 . */ -package gplx; +package gplx.core.interfaces; import gplx.*; import gplx.core.*; public interface SrlAble { Object Srl(GfoMsg owner); } diff --git a/100_core/src_100_interface/gplx/SrlAble_.java b/100_core/src/gplx/core/interfaces/SrlAble_.java similarity index 94% rename from 100_core/src_100_interface/gplx/SrlAble_.java rename to 100_core/src/gplx/core/interfaces/SrlAble_.java index 9196a5e87..4b6357444 100644 --- a/100_core/src_100_interface/gplx/SrlAble_.java +++ b/100_core/src/gplx/core/interfaces/SrlAble_.java @@ -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 . */ -package gplx; +package gplx.core.interfaces; import gplx.*; import gplx.core.*; import gplx.core.strings.*; public class SrlAble_ { public static SrlAble as_(Object obj) {return obj instanceof SrlAble ? (SrlAble)obj : null;} diff --git a/100_core/src_100_interface/gplx/SrlAble__tst.java b/100_core/src/gplx/core/interfaces/SrlAble__tst.java similarity index 94% rename from 100_core/src_100_interface/gplx/SrlAble__tst.java rename to 100_core/src/gplx/core/interfaces/SrlAble__tst.java index 2ff075fe4..ebd5546de 100644 --- a/100_core/src_100_interface/gplx/SrlAble__tst.java +++ b/100_core/src/gplx/core/interfaces/SrlAble__tst.java @@ -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 . */ -package gplx; +package gplx.core.interfaces; import gplx.*; import gplx.core.*; import org.junit.*; public class SrlAble__tst { @Test public void Basic() { diff --git a/100_core/tst/gplx/core/ios/IoEngineFxt.java b/100_core/src/gplx/core/ios/IoEngineFxt.java similarity index 100% rename from 100_core/tst/gplx/core/ios/IoEngineFxt.java rename to 100_core/src/gplx/core/ios/IoEngineFxt.java diff --git a/100_core/src/gplx/core/ios/IoEngine_system.java b/100_core/src/gplx/core/ios/IoEngine_system.java index 69a6b0f61..74c8c4886 100644 --- a/100_core/src/gplx/core/ios/IoEngine_system.java +++ b/100_core/src/gplx/core/ios/IoEngine_system.java @@ -27,7 +27,7 @@ import java.util.Date; import javax.print.FlavorException; import javax.tools.JavaCompiler; -import gplx.core.criterias.*; import gplx.core.envs.*; +import gplx.core.criterias.*; import gplx.core.bits.*; import gplx.core.envs.*; public class IoEngine_system extends IoEngine_base { @Override public String Key() {return IoEngine_.SysKey;} @Override public void DeleteDirDeep(IoEngine_xrg_deleteDir args) {utl.DeleteDirDeep(this, args.Url(), args);} diff --git a/100_core/src/gplx/core/ios/IoStream.java b/100_core/src/gplx/core/ios/IoStream.java index 7b0e8c88d..440c7322f 100644 --- a/100_core/src/gplx/core/ios/IoStream.java +++ b/100_core/src/gplx/core/ios/IoStream.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.ios; import gplx.*; import gplx.core.*; -public interface IoStream extends RlsAble { +public interface IoStream extends Rls_able { Object UnderRdr(); Io_url Url(); long Pos(); diff --git a/100_core/src/gplx/core/ios/Io_stream_rdr.java b/100_core/src/gplx/core/ios/Io_stream_rdr.java index da30a91fc..2052e0b35 100644 --- a/100_core/src/gplx/core/ios/Io_stream_rdr.java +++ b/100_core/src/gplx/core/ios/Io_stream_rdr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.ios; import gplx.*; import gplx.core.*; -public interface Io_stream_rdr extends RlsAble { +public interface Io_stream_rdr extends Rls_able { byte Tid(); boolean Exists(); Io_url Url(); Io_stream_rdr Url_(Io_url v); diff --git a/100_core/src/gplx/core/ios/Io_stream_wtr.java b/100_core/src/gplx/core/ios/Io_stream_wtr.java index 77d4286fc..181ce682e 100644 --- a/100_core/src/gplx/core/ios/Io_stream_wtr.java +++ b/100_core/src/gplx/core/ios/Io_stream_wtr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.ios; import gplx.*; import gplx.core.*; -public interface Io_stream_wtr extends RlsAble { +public interface Io_stream_wtr extends Rls_able { byte Tid(); Io_url Url(); Io_stream_wtr Url_(Io_url v); void Trg_bfr_(Bry_bfr v); diff --git a/100_core/src/gplx/EnmMgr.java b/100_core/src/gplx/core/primitives/EnmMgr.java similarity index 96% rename from 100_core/src/gplx/EnmMgr.java rename to 100_core/src/gplx/core/primitives/EnmMgr.java index 8a1b37e08..83bcea339 100644 --- a/100_core/src/gplx/EnmMgr.java +++ b/100_core/src/gplx/core/primitives/EnmMgr.java @@ -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 . */ -package gplx; +package gplx.core.primitives; import gplx.*; import gplx.core.*; import gplx.core.strings.*; public class EnmMgr { public String BitRngSpr() {return bitRngSpr;} public EnmMgr BitRngSpr_(String val) {bitRngSpr = val; return this;} private String bitRngSpr = "+"; diff --git a/100_core/tst/gplx/EnmParser_tst.java b/100_core/src/gplx/core/primitives/EnmParser_tst.java similarity index 94% rename from 100_core/tst/gplx/EnmParser_tst.java rename to 100_core/src/gplx/core/primitives/EnmParser_tst.java index bdb7e3ec6..b210402a2 100644 --- a/100_core/tst/gplx/EnmParser_tst.java +++ b/100_core/src/gplx/core/primitives/EnmParser_tst.java @@ -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 . */ -package gplx; +package gplx.core.primitives; import gplx.*; import gplx.core.*; import org.junit.*; public class EnmParser_tst { @Before public void setup() { diff --git a/100_core/src/gplx/core/stores/DataRdr.java b/100_core/src/gplx/core/stores/DataRdr.java index a428b4373..cd1beb2bf 100644 --- a/100_core/src/gplx/core/stores/DataRdr.java +++ b/100_core/src/gplx/core/stores/DataRdr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.core.stores; import gplx.*; import gplx.core.*; import gplx.core.strings.*; -public interface DataRdr extends SrlMgr, RlsAble { +public interface DataRdr extends SrlMgr, Rls_able { String NameOfNode(); String To_str(); Io_url Uri(); void Uri_set(Io_url s); Hash_adp EnvVars(); diff --git a/100_core/src/gplx/DateAdp_parser.java b/100_core/src/gplx/core/times/DateAdp_parser.java similarity index 96% rename from 100_core/src/gplx/DateAdp_parser.java rename to 100_core/src/gplx/core/times/DateAdp_parser.java index 95137bd10..e43900941 100644 --- a/100_core/src/gplx/DateAdp_parser.java +++ b/100_core/src/gplx/core/times/DateAdp_parser.java @@ -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 . */ -package gplx; +package gplx.core.times; import gplx.*; import gplx.core.*; public class DateAdp_parser { public int[] Parse_iso8651_like(String raw_str) {Parse_iso8651_like(tmp_rv, raw_str); return tmp_rv;} int[] tmp_rv = new int[7]; public void Parse_iso8651_like(int[] rv, String raw_str) { diff --git a/100_core/src/gplx/DateAdp_parser_tst.java b/100_core/src/gplx/core/times/DateAdp_parser_tst.java similarity index 94% rename from 100_core/src/gplx/DateAdp_parser_tst.java rename to 100_core/src/gplx/core/times/DateAdp_parser_tst.java index c36d347c2..55fe9599b 100644 --- a/100_core/src/gplx/DateAdp_parser_tst.java +++ b/100_core/src/gplx/core/times/DateAdp_parser_tst.java @@ -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 . */ -package gplx; +package gplx.core.times; import gplx.*; import gplx.core.*; import org.junit.*; public class DateAdp_parser_tst { @Before public void init() {} DateAdp_parser_fxt fxt = new DateAdp_parser_fxt(); diff --git a/100_core/src/gplx/TimeSpanAdp_basic_tst.java b/100_core/src/gplx/core/times/TimeSpanAdp__basic_tst.java similarity index 95% rename from 100_core/src/gplx/TimeSpanAdp_basic_tst.java rename to 100_core/src/gplx/core/times/TimeSpanAdp__basic_tst.java index 03c4d1dce..e6e99f360 100644 --- a/100_core/src/gplx/TimeSpanAdp_basic_tst.java +++ b/100_core/src/gplx/core/times/TimeSpanAdp__basic_tst.java @@ -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 . */ -package gplx; +package gplx.core.times; import gplx.*; import gplx.core.*; import org.junit.*; -public class TimeSpanAdp_basic_tst { +public class TimeSpanAdp__basic_tst { @Test public void seconds_() { TimeSpanAdp expd = TimeSpanAdp_.fracs_(123987); TimeSpanAdp actl = TimeSpanAdp_.seconds_(123.987); diff --git a/100_core/src/gplx/TimeSpanAdp__parse_tst.java b/100_core/src/gplx/core/times/TimeSpanAdp__parse_tst.java similarity index 94% rename from 100_core/src/gplx/TimeSpanAdp__parse_tst.java rename to 100_core/src/gplx/core/times/TimeSpanAdp__parse_tst.java index 6baef9442..6d3c9aaa9 100644 --- a/100_core/src/gplx/TimeSpanAdp__parse_tst.java +++ b/100_core/src/gplx/core/times/TimeSpanAdp__parse_tst.java @@ -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 . */ -package gplx; +package gplx.core.times; import gplx.*; import gplx.core.*; import org.junit.*; public class TimeSpanAdp__parse_tst { @Test public void Zero() { diff --git a/100_core/src/gplx/TimeSpanAdp_xtoStr_tst.java b/100_core/src/gplx/core/times/TimeSpanAdp__to_str_tst.java similarity index 93% rename from 100_core/src/gplx/TimeSpanAdp_xtoStr_tst.java rename to 100_core/src/gplx/core/times/TimeSpanAdp__to_str_tst.java index 9d33d2ef9..a9f41dd11 100644 --- a/100_core/src/gplx/TimeSpanAdp_xtoStr_tst.java +++ b/100_core/src/gplx/core/times/TimeSpanAdp__to_str_tst.java @@ -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 . */ -package gplx; +package gplx.core.times; import gplx.*; import gplx.core.*; import org.junit.*; -public class TimeSpanAdp_xtoStr_tst { +public class TimeSpanAdp__to_str_tst { @Test public void Zero() { tst_Default(0, "0"); } diff --git a/100_core/src/gplx/langs/htmls/Url_encoder_interface.java b/100_core/src/gplx/langs/htmls/Url_encoder_interface.java new file mode 100644 index 000000000..61b282eda --- /dev/null +++ b/100_core/src/gplx/langs/htmls/Url_encoder_interface.java @@ -0,0 +1,22 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.langs.htmls; import gplx.*; import gplx.langs.*; +public interface Url_encoder_interface { + String Encode_str(String v); + byte[] Encode_bry(String v); +} diff --git a/100_core/src/gplx/Url_encoder_interface.java b/100_core/src/gplx/langs/htmls/Url_encoder_interface_same.java similarity index 83% rename from 100_core/src/gplx/Url_encoder_interface.java rename to 100_core/src/gplx/langs/htmls/Url_encoder_interface_same.java index 43e17535a..6bc30b1b7 100644 --- a/100_core/src/gplx/Url_encoder_interface.java +++ b/100_core/src/gplx/langs/htmls/Url_encoder_interface_same.java @@ -15,12 +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 . */ -package gplx; -public interface Url_encoder_interface { - String Encode_str(String v); - byte[] Encode_bry(String v); -} -class Url_encoder_interface_same implements Url_encoder_interface { +package gplx.langs.htmls; import gplx.*; import gplx.langs.*; +public class Url_encoder_interface_same implements Url_encoder_interface { public String Encode_str(String v) {return v;} public byte[] Encode_bry(String v) {return Bry_.new_u8(v);} public static final Url_encoder_interface_same Instance = new Url_encoder_interface_same(); Url_encoder_interface_same() {} diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg.java b/100_core/src_311_gfoObj/gplx/GfoMsg.java index e694a8538..164f20f6e 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; +import gplx.core.interfaces.*; public interface GfoMsg { String Key(); GfoMsg CloneNew(); diff --git a/100_core/src_311_gfoObj/gplx/GfoMsg_.java b/100_core/src_311_gfoObj/gplx/GfoMsg_.java index 154b2f7de..1ce5a9bc3 100644 --- a/100_core/src_311_gfoObj/gplx/GfoMsg_.java +++ b/100_core/src_311_gfoObj/gplx/GfoMsg_.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx; -import gplx.core.primitives.*; import gplx.core.strings.*; import gplx.core.brys.*; +import gplx.core.primitives.*; import gplx.core.strings.*; import gplx.core.brys.*; import gplx.core.interfaces.*; public class GfoMsg_ { public static GfoMsg as_(Object obj) {return obj instanceof GfoMsg ? (GfoMsg)obj : null;} public static final GfoMsg Null = new GfoMsg_base().ctor_("<>", false); diff --git a/140_dbs/src/gplx/dbs/Db_conn.java b/140_dbs/src/gplx/dbs/Db_conn.java index dcc71514b..ba5bdd64a 100644 --- a/140_dbs/src/gplx/dbs/Db_conn.java +++ b/140_dbs/src/gplx/dbs/Db_conn.java @@ -51,11 +51,11 @@ public class Db_conn { public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);} public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);} public boolean Meta_fld_exists(String tbl, String fld) {return engine.Meta_fld_exists(tbl, fld);} - public void Rls_reg(RlsAble rls) {rls_list.Add(rls);} + public void Rls_reg(Rls_able rls) {rls_list.Add(rls);} public void Rls_conn() { int len = rls_list.Count(); for (int i = 0; i < len; ++i) { - RlsAble itm = (RlsAble)rls_list.Get_at(i); + Rls_able itm = (Rls_able)rls_list.Get_at(i); itm.Rls(); } engine.Conn_term(); diff --git a/140_dbs/src/gplx/dbs/Db_stmt.java b/140_dbs/src/gplx/dbs/Db_stmt.java index 16a38fdd0..496c12dfc 100644 --- a/140_dbs/src/gplx/dbs/Db_stmt.java +++ b/140_dbs/src/gplx/dbs/Db_stmt.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.dbs; import gplx.*; import gplx.dbs.engines.*; import gplx.core.stores.*; -public interface Db_stmt extends RlsAble { +public interface Db_stmt extends Rls_able { Db_stmt Crt_bool_as_byte(String k, boolean v); Db_stmt Val_bool_as_byte(String k, boolean v); Db_stmt Val_bool_as_byte(boolean v); diff --git a/140_dbs/src/gplx/dbs/Db_tbl.java b/140_dbs/src/gplx/dbs/Db_tbl.java index 1570f10aa..881e5066c 100644 --- a/140_dbs/src/gplx/dbs/Db_tbl.java +++ b/140_dbs/src/gplx/dbs/Db_tbl.java @@ -16,6 +16,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.dbs; import gplx.*; -public interface Db_tbl extends RlsAble { +public interface Db_tbl extends Rls_able { void Create_tbl(); } diff --git a/140_dbs/tst/gplx/dbs/Db_conn_fxt.java b/140_dbs/tst/gplx/dbs/Db_conn_fxt.java index 6419f459e..96227b489 100644 --- a/140_dbs/tst/gplx/dbs/Db_conn_fxt.java +++ b/140_dbs/tst/gplx/dbs/Db_conn_fxt.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.dbs; import gplx.*; import gplx.core.stores.*; import gplx.dbs.engines.sqlite.*; import gplx.dbs.engines.mysql.*; import gplx.dbs.engines.postgres.*; import gplx.core.gfo_ndes.*; -public class Db_conn_fxt implements RlsAble { +public class Db_conn_fxt implements Rls_able { public Db_conn Conn() {return conn;} public Db_conn_fxt Conn_(Db_conn v) {conn = v; return this;} Db_conn conn; public void DmlAffectedAvailable_(boolean v) {dmlAffectedAvailable = v;} private boolean dmlAffectedAvailable = true; public void ini_DeleteAll(String tbl) {conn.Exec_qry(Db_qry_.delete_tbl_(tbl));} diff --git a/150_gfui/src_100_basic/gplx/gfui/GfuiAlign_.java b/150_gfui/src_100_basic/gplx/gfui/GfuiAlign_.java index 40c507364..4427824c8 100644 --- a/150_gfui/src_100_basic/gplx/gfui/GfuiAlign_.java +++ b/150_gfui/src_100_basic/gplx/gfui/GfuiAlign_.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class GfuiAlign_ implements ParseAble { public static GfuiAlign as_(Object obj) {return obj instanceof GfuiAlign ? (GfuiAlign)obj : null;} public static GfuiAlign cast(Object obj) {try {return (GfuiAlign)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, GfuiAlign.class, obj);}} diff --git a/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java b/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java index dc79b8f82..1dd01b76d 100644 --- a/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java +++ b/150_gfui/src_100_basic/gplx/gfui/GfuiBorderEdge.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.bits.*; public class GfuiBorderEdge { public int Val() {return val;} int val; public boolean Has(GfuiBorderEdge comp) {return Bitmask_.Has_int(val, comp.val);} diff --git a/150_gfui/src_100_basic/gplx/gfui/SizeAdpF.java b/150_gfui/src_100_basic/gplx/gfui/SizeAdpF.java index 767a980a3..6b9360773 100644 --- a/150_gfui/src_100_basic/gplx/gfui/SizeAdpF.java +++ b/150_gfui/src_100_basic/gplx/gfui/SizeAdpF.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class SizeAdpF implements ParseAble { public float Width() {return width;} float width; public float Height() {return height;} float height; diff --git a/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp_.java b/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp_.java index 29e2895e1..e8bd58f0d 100644 --- a/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp_.java +++ b/150_gfui/src_110_draw_core/gplx/gfui/ColorAdp_.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -import gplx.core.texts.*; +import gplx.core.texts.*; import gplx.core.interfaces.*; public class ColorAdp_ implements ParseAble { public static ColorAdp as_(Object obj) {return obj instanceof ColorAdp ? (ColorAdp)obj : null;} public static ColorAdp cast(Object obj) {try {return (ColorAdp)obj;} catch(Exception exc) {throw Err_.new_type_mismatch_w_exc(exc, ColorAdp.class, obj);}} diff --git a/150_gfui/src_110_draw_core/gplx/gfui/FontStyleAdp_.java b/150_gfui/src_110_draw_core/gplx/gfui/FontStyleAdp_.java index 8442596b0..bf31b58b7 100644 --- a/150_gfui/src_110_draw_core/gplx/gfui/FontStyleAdp_.java +++ b/150_gfui/src_110_draw_core/gplx/gfui/FontStyleAdp_.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -import gplx.core.primitives.*; +import gplx.core.primitives.*; import gplx.core.interfaces.*; public class FontStyleAdp_ implements ParseAble { public static final FontStyleAdp Plain = new FontStyleAdp(0) diff --git a/150_gfui/src_120_draw_objs/gplx/gfui/GfxAdp.java b/150_gfui/src_120_draw_objs/gplx/gfui/GfxAdp.java index 98c19b225..e0159389b 100644 --- a/150_gfui/src_120_draw_objs/gplx/gfui/GfxAdp.java +++ b/150_gfui/src_120_draw_objs/gplx/gfui/GfxAdp.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -public interface GfxAdp extends RlsAble { +public interface GfxAdp extends Rls_able { void DrawLine(PenAdp pen, PointAdp src, PointAdp trg); void DrawRect(PenAdp pen, int x, int y, int width, int height); void DrawRect(PenAdp pen, PointAdp location, SizeAdp size); diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBnd.java b/150_gfui/src_200_ipt/gplx/gfui/IptBnd.java index 640325eed..5336be905 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBnd.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBnd.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public interface IptBnd extends SrlAble { String Key(); List_adp Ipts(); diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java index 357374065..07ce2ec4c 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBndMgr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class IptBndMgr implements SrlAble { @gplx.Internal protected IptEventType EventsToFwd() {return eventsToFwd;} public void EventsToFwd_set(IptEventType v) {eventsToFwd = v;} IptEventType eventsToFwd = IptEventType_.KeyDown; diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_chkBox.java b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_chkBox.java index dba832f12..eb8a67e31 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_chkBox.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_chkBox.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class IptBnd_chkBox implements InjectAble, GfoEvObj { public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} GfoEvMgr evMgr; public void Inject(Object owner) { diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_cmd.java b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_cmd.java index 814b4ecef..135896e6c 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_cmd.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_cmd.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -import gplx.core.type_xtns.*; +import gplx.core.type_xtns.*; import gplx.core.interfaces.*; public class IptBnd_txt_cmd implements InjectAble, GfoInvkAble, GfoEvObj { public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} GfoEvMgr evMgr; public void Inject(Object owner) { diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java index a36a329c2..ff9ddec7b 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_txt_range.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class IptBnd_txt_range implements InjectAble, GfoInvkAble, GfoEvObj { public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} GfoEvMgr evMgr; public IptBnd_txt_range InitSrc_(GfoEvObj initSrc) {this.initSrc = initSrc; return this;} diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_upDownRange.java b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_upDownRange.java index feed9a7f5..e663e83c7 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptBnd_upDownRange.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptBnd_upDownRange.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -import gplx.core.type_xtns.*; +import gplx.core.type_xtns.*; import gplx.core.interfaces.*; public class IptBnd_upDownRange implements InjectAble, GfoInvkAble, GfoEvObj { public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} GfoEvMgr evMgr; public void Inject(Object owner) { diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptEventType_.java b/150_gfui/src_200_ipt/gplx/gfui/IptEventType_.java index ad9f38d33..4f1e0f700 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptEventType_.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptEventType_.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.bits.*; import gplx.core.primitives.*; public class IptEventType_ { static EnmMgr enmMgr = EnmMgr.new_().BitRngEnd_(128); public static final IptEventType diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKey.java b/150_gfui/src_200_ipt/gplx/gfui/IptKey.java index 76e7cc45e..5ab080fdf 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKey.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKey.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.bits.*; public class IptKey implements IptArg { @gplx.Internal protected IptKey(int val, String key) {this.val = val; this.key = key;} public String Key() {return key;} private final String key; diff --git a/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java b/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java index 6bbbbce1f..a126437a9 100644 --- a/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java +++ b/150_gfui/src_200_ipt/gplx/gfui/IptKey_.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; import java.awt.event.KeyEvent; -import gplx.core.primitives.*; import gplx.core.stores.*; +import gplx.core.primitives.*; import gplx.core.stores.*; import gplx.core.bits.*; public class IptKey_ { private static EnmMgr enm_mgr = EnmMgr.new_().BitRngBgn_(65536).BitRngEnd_(262144).Prefix_("key."); public static IptKey[] Ary(IptKey... ary) {return ary;} diff --git a/150_gfui/src_400_win/gplx/gfui/GfuiCmdForm.java b/150_gfui/src_400_win/gplx/gfui/GfuiCmdForm.java index fa5618a77..adcf47593 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfuiCmdForm.java +++ b/150_gfui/src_400_win/gplx/gfui/GfuiCmdForm.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class GfuiCmdForm implements GfoInvkAble, InjectAble { public void Inject(Object ownerObj) { GfuiElem owner = (GfuiElem)ownerObj; diff --git a/150_gfui/src_400_win/gplx/gfui/GfuiFocusXferBnd.java b/150_gfui/src_400_win/gplx/gfui/GfuiFocusXferBnd.java index 3ba1940b8..0ca636cb8 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfuiFocusXferBnd.java +++ b/150_gfui/src_400_win/gplx/gfui/GfuiFocusXferBnd.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; class GfuiFocusXferBnd implements InjectAble, GfoInvkAble { public void Inject(Object owner) { GfuiElem elem = GfuiElem_.cast(owner); diff --git a/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java b/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java index b4030caf2..297d0698d 100644 --- a/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java +++ b/150_gfui/src_400_win/gplx/gfui/GfuiWinKeyCmdMgr.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -import gplx.core.lists.*; /*Hash_adp_list*/ +import gplx.core.lists.*; import gplx.core.bits.*; class GfuiWinKeyCmdMgr implements GfuiWinOpenAble, GfoInvkAble, GfoEvObj { private Hash_adp_list listHash = Hash_adp_list.new_(); public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} private GfoEvMgr evMgr; diff --git a/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java b/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java index ddd1deba3..1a458a293 100644 --- a/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java +++ b/150_gfui/src_410_box_core/gplx/gfui/GfuiElem.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public interface GfuiElem extends GfoInvkAble, GxwCbkHost, IptBndsOwner, GftItem, GfoEvObj { //% Layout int X(); GfuiElem X_(int val); diff --git a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java index 93099282f..a375e9b9d 100644 --- a/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java +++ b/150_gfui/src_410_box_core/gplx/gfui/GfuiElemBase.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -import gplx.core.strings.*; +import gplx.core.strings.*; import gplx.core.interfaces.*; public class GfuiElemBase implements GfuiElem { //% Layout public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} GfoEvMgr evMgr; diff --git a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtnClickBnd.java b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtnClickBnd.java index ede5843f5..969611883 100644 --- a/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtnClickBnd.java +++ b/150_gfui/src_420_box_basic/gplx/gfui/GfuiBtnClickBnd.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; class GfuiBtnClickBnd implements InjectAble, GfoInvkAble { public void Inject(Object owner) { GfuiElem elem = GfuiElem_.cast(owner); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java b/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java index de1b38215..a7a9d86bf 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/DataBndr_whenEvt_execCmd.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class DataBndr_whenEvt_execCmd implements InjectAble, GfoInvkAble, GfoEvObj { public GfoEvMgr EvMgr() {if (evMgr == null) evMgr = GfoEvMgr.new_(this); return evMgr;} GfoEvMgr evMgr; public DataBndr_whenEvt_execCmd WhenArg_(String v) {whenArg = v; return this;} private String whenArg = "v"; diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBnd.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBnd.java index 82eb5b98b..8569a7002 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBnd.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiMoveElemBnd.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class GfuiMoveElemBnd implements IptBnd, GfoInvkAble, InjectAble { public String Key() {return "gplx.gfui.moveWidget";} public List_adp Ipts() {return args;} List_adp args = List_adp_.new_(); diff --git a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBarBnd.java b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBarBnd.java index d05ab38ec..d26fc8c2b 100644 --- a/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBarBnd.java +++ b/150_gfui/src_430_box_custom/gplx/gfui/GfuiStatusBarBnd.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; public class GfuiStatusBarBnd implements InjectAble { public GfuiStatusBar Bar() {return statusBar;} GfuiStatusBar statusBar = GfuiStatusBar.new_(); public void Inject(Object owner) { diff --git a/150_gfui/src_500_tab/gplx/gfui/TabBnd.java b/150_gfui/src_500_tab/gplx/gfui/TabBnd.java index f29dcdfc8..3f5ea869c 100644 --- a/150_gfui/src_500_tab/gplx/gfui/TabBnd.java +++ b/150_gfui/src_500_tab/gplx/gfui/TabBnd.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.interfaces.*; class TabBoxEvt_nameChange { public static String Key = "TabBoxEvt_nameChange"; public static void Send(TabBoxMgr mgr, TabPnlItm itm) { diff --git a/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java b/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java index 2df152c70..a6748974f 100644 --- a/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java +++ b/150_gfui/src_600_adp/gplx/gfui/ImageAdp.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.gfui; import gplx.*; import java.awt.Image; -public interface ImageAdp extends RlsAble { +public interface ImageAdp extends Rls_able { Gfui_kit Kit(); SizeAdp Size(); int Width(); diff --git a/150_gfui/src_600_adp/gplx/gfui/ImageAdp_base.java b/150_gfui/src_600_adp/gplx/gfui/ImageAdp_base.java index d9987fc57..3c2e6d215 100644 --- a/150_gfui/src_600_adp/gplx/gfui/ImageAdp_base.java +++ b/150_gfui/src_600_adp/gplx/gfui/ImageAdp_base.java @@ -24,7 +24,7 @@ import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; -public class ImageAdp_base implements ImageAdp, RlsAble { +public class ImageAdp_base implements ImageAdp, Rls_able { @gplx.Internal protected ImageAdp_base(Image img) {this.under = img;} public Gfui_kit Kit() {return kit;} public void Kit_(Gfui_kit v) {this.kit = v;} Gfui_kit kit; public SizeAdp Size() { diff --git a/150_gfui/src_600_adp/gplx/gfui/TimerAdp.java b/150_gfui/src_600_adp/gplx/gfui/TimerAdp.java index 6c2556b3b..2b5b51a09 100644 --- a/150_gfui/src_600_adp/gplx/gfui/TimerAdp.java +++ b/150_gfui/src_600_adp/gplx/gfui/TimerAdp.java @@ -19,7 +19,7 @@ package gplx.gfui; import gplx.*; import javax.swing.Timer; import java.awt.event.ActionListener; import gplx.core.envs.*; -public class TimerAdp implements RlsAble { +public class TimerAdp implements Rls_able { public TimerAdp Interval_(int interval) { underTimer.setInitialDelay(interval); underTimer.setDelay(interval); diff --git a/150_gfui/src_700_env/gplx/gfui/GfuiInvkCmd.java b/150_gfui/src_700_env/gplx/gfui/GfuiInvkCmd.java index e83dbf103..8ec52ead7 100644 --- a/150_gfui/src_700_env/gplx/gfui/GfuiInvkCmd.java +++ b/150_gfui/src_700_env/gplx/gfui/GfuiInvkCmd.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -public interface GfuiInvkCmd extends GfoInvkAble, RlsAble { +public interface GfuiInvkCmd extends GfoInvkAble, Rls_able { } class GfuiInvkCmd_ { public static final String Invk_sync = "Sync"; diff --git a/150_gfui/src_700_env/gplx/gfui/Gfui_clipboard.java b/150_gfui/src_700_env/gplx/gfui/Gfui_clipboard.java index d3582d2e9..3facc9a64 100644 --- a/150_gfui/src_700_env/gplx/gfui/Gfui_clipboard.java +++ b/150_gfui/src_700_env/gplx/gfui/Gfui_clipboard.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; -public interface Gfui_clipboard extends GfoInvkAble, RlsAble { +public interface Gfui_clipboard extends GfoInvkAble, Rls_able { void Copy(String s); } class Gfui_clipboard_null implements Gfui_clipboard { diff --git a/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java b/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java index 69d238472..33312063e 100644 --- a/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java +++ b/150_gfui/xtn/gplx/gfui/Swt_core_lnrs.java @@ -16,7 +16,6 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; -import gplx.Bitmask_; import gplx.Byte_ascii; import gplx.Enm_; import gplx.GfoEvMgr_; @@ -25,6 +24,7 @@ import gplx.GfoMsg_; import gplx.GfsCtx; import gplx.String_; import gplx.Tfds; +import gplx.core.bits.Bitmask_; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; diff --git a/400_xowa/src/gplx/core/brys/Bry_diff_.java b/400_xowa/src/gplx/core/brys/Bry_diff_.java new file mode 100644 index 000000000..922d55850 --- /dev/null +++ b/400_xowa/src/gplx/core/brys/Bry_diff_.java @@ -0,0 +1,52 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.brys; import gplx.*; import gplx.core.*; +public class Bry_diff_ { + public static byte[][] Diff_1st_line(byte[] lhs, byte[] rhs) {return Diff_1st(lhs, 0, lhs.length, rhs, 0, rhs.length, Byte_ascii.Nl_bry, Byte_ascii.Angle_bgn_bry, 255);} + public static byte[][] Diff_1st(byte[] lhs, int lhs_bgn, int lhs_end, byte[] rhs, int rhs_bgn, int rhs_end, byte[] stop, byte[] show, int diff_max) { + int lhs_len = lhs_end - lhs_bgn; + int rhs_len = rhs_end - rhs_bgn; + int len = lhs_len < rhs_len ? lhs_len : rhs_len; + int lhs_idx = -1, rhs_idx = -1; + for (int i = 0; i < len; ++i) { + byte lhs_byte = lhs[i + lhs_bgn]; + byte rhs_byte = rhs[i + rhs_bgn]; + if (lhs_byte != rhs_byte) {lhs_idx = rhs_idx = i; break;} // diff; stop iterating + } + if (lhs_idx == -1 && rhs_idx == -1) { + switch (Int_.Compare(lhs_len, rhs_len)) { + case CompareAble_.Same: return null; + case CompareAble_.Less: lhs_idx = rhs_idx = lhs_len; break; + case CompareAble_.More: lhs_idx = rhs_idx = rhs_len; break; + } + } + byte[] lhs_diff = Get_1st(stop, show, lhs, lhs_idx, lhs_len, diff_max); + byte[] rhs_diff = Get_1st(stop, show, rhs, rhs_idx, rhs_len, diff_max); + return new byte[][] {lhs_diff, rhs_diff}; + } + private static byte[] Get_1st(byte[] stop, byte[] show, byte[] src, int bgn, int end, int diff_max) { + if (bgn == end) return Bry__eos; + int prv_show = Bry_find_.Find_bwd(src, show, bgn , 0); if (prv_show == Bry_find_.Not_found) prv_show = 0; + int prv_stop = Bry_find_.Find_bwd(src, stop, bgn , 0); prv_stop = (prv_stop == Bry_find_.Not_found) ? 0 : prv_stop + 1; + int prv = prv_show > prv_stop ? prv_show : prv_stop; + int nxt = Bry_find_.Find_fwd(src, stop, bgn , end); if (nxt == Bry_find_.Not_found) nxt = end; + if (nxt - prv > 255) nxt = prv + diff_max; + return Bry_.Mid(src, prv, nxt); + } + private static final byte[] Bry__eos = Bry_.new_a7("<>"); +} diff --git a/400_xowa/src/gplx/core/brys/Bry_diff_tst.java b/400_xowa/src/gplx/core/brys/Bry_diff_tst.java new file mode 100644 index 000000000..8449aef04 --- /dev/null +++ b/400_xowa/src/gplx/core/brys/Bry_diff_tst.java @@ -0,0 +1,44 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.brys; import gplx.*; import gplx.core.*; +import org.junit.*; +public class Bry_diff_tst { + @Before public void init() {} private final Bry_diff_fxt fxt = new Bry_diff_fxt(); + @Test public void Diff_1st() { + fxt.Test__diff_1st("a|b|c" , "a|b|c" , null , null); + fxt.Test__diff_1st("a|b|c" , "a|b1|c" , "b" , "b1"); + fxt.Test__diff_1st("a|b|" , "a|b|c" , "<>" , "c"); + fxt.Test__diff_1st("a|b|c" , "a|b|" , "c" , "<>"); + } + @Test public void Diff_1st_show() { + fxt.Test__diff_1st("a|bd|e" , "a|be|e" , "d", "e"); + } +} +class Bry_diff_fxt { + public void Test__diff_1st(String lhs, String rhs, String expd_lhs, String expd_rhs) { + byte[] lhs_src = Bry_.new_u8(lhs); + byte[] rhs_src = Bry_.new_u8(rhs); + byte[][] actl = Bry_diff_.Diff_1st(lhs_src, 0, lhs_src.length, rhs_src, 0, rhs_src.length, Byte_ascii.Pipe_bry, Byte_ascii.Angle_bgn_bry, 255); + if (expd_lhs == null && expd_rhs == null) + Tfds.Eq_true(actl == null, "actl not null"); + else { + Tfds.Eq_bry(Bry_.new_u8(expd_lhs), actl[0]); + Tfds.Eq_bry(Bry_.new_u8(expd_rhs), actl[1]); + } + } +} diff --git a/400_xowa/src/gplx/core/brys/Bry_err_wkr.java b/400_xowa/src/gplx/core/brys/Bry_err_wkr.java new file mode 100644 index 000000000..19dc85ade --- /dev/null +++ b/400_xowa/src/gplx/core/brys/Bry_err_wkr.java @@ -0,0 +1,47 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.brys; import gplx.*; import gplx.core.*; +import gplx.core.errs.*; +public class Bry_err_wkr { + private String sect; private int sect_bgn; + public byte[] Src() {return src;} private byte[] src; + public String Page() {return page;} private String page; + public void Fail_throws_err_(boolean v) {this.fail_throws_err = v;} private boolean fail_throws_err = true; + public void Init_by_page(String page, byte[] src) {this.page = page; this.src = src;} + public void Init_by_sect(String sect, int sect_bgn) {this.sect = sect; this.sect_bgn = sect_bgn;} + public int Fail(String msg, Object... args) {return Fail(msg, sect_bgn, sect_bgn + 255, args);} + private int Fail(String msg, int excerpt_bgn, int excerpt_end, Object[] args) { + String err_msg = Make_msg(msg, excerpt_bgn, excerpt_end, args); + Gfo_usr_dlg_.Instance.Warn_many("", "", err_msg); + if (fail_throws_err) throw Err_.new_("Bry_err_wkr", err_msg).Logged_y_(); + return Bry_find_.Not_found; + } + private String Make_msg(String msg, int excerpt_bgn, int excerpt_end, Object[] args) { + int args_len = args.length; + args_len += 6; + args = (Object[])Array_.Resize(args, args_len); + args[args_len - 6] = "page"; args[args_len - 5] = Quote(page); + args[args_len - 4] = "sect"; args[args_len - 3] = Quote(sect); + args[args_len - 2] = "text"; args[args_len - 1] = Bry_.Escape_ws(Bry_.Mid_safe(src, excerpt_bgn, excerpt_end)); + for (int i = 0; i < args_len - 6; i += 2) { + args[i + 1] = Quote(Object_.Xto_str_strict_or_null_mark(args[i + 1])); + } + return Err_msg.To_str(msg, args); + } + private static String Quote(String v) {return "'" + v + "'";} +} diff --git a/400_xowa/src/gplx/core/brys/Bry_rdr.java b/400_xowa/src/gplx/core/brys/Bry_rdr.java index 3272e0033..ddf9537ca 100644 --- a/400_xowa/src/gplx/core/brys/Bry_rdr.java +++ b/400_xowa/src/gplx/core/brys/Bry_rdr.java @@ -19,18 +19,20 @@ package gplx.core.brys; import gplx.*; import gplx.core.*; import gplx.core.errs.*; public class Bry_rdr { private final gplx.core.primitives.Int_obj_ref pos_ref = gplx.core.primitives.Int_obj_ref.neg1_(); - private String ctx; private String wkr; private int err_bgn; public byte[] Src() {return src;} private byte[] src; public int Pos() {return pos;} private int pos; public int Src_end() {return src_end;} private int src_end; public Bry_rdr Dflt_dlm_(byte b) {this.dflt_dlm = b; return this;} private byte dflt_dlm; - public Bry_rdr Fail_throws_err_(boolean v) {this.fail_throws_err = v; return this;} private boolean fail_throws_err = true; - public Bry_rdr Init_by_page(byte[] ctx, byte[] src, int src_len) {this.ctx = Quote(String_.new_u8(ctx)); this.src = src; this.src_end = src_len; this.pos = 0; return this;} - public Bry_rdr Init_by_hook(String wkr, int err_bgn, int pos) {this.wkr = Quote(wkr); this.err_bgn = err_bgn; this.pos = pos; return this;} - public Bry_rdr Init_by_sub(Bry_rdr rdr, String wkr, int pos, int src_end) { - this.src = rdr.src; this.ctx = rdr.ctx; this.wkr = Quote(wkr); this.err_bgn = pos; this.pos = pos; this.src_end = src_end; + public Bry_rdr Fail_throws_err_(boolean v) {err_wkr.Fail_throws_err_(v); return this;} + public Bry_rdr Init_by_page(byte[] page, byte[] src, int src_len) {err_wkr.Init_by_page(String_.new_u8(page), src); this.pos = 0; this.src = src; this.src_end = src_len; return this;} + public Bry_rdr Init_by_sect(String sect, int sect_bgn, int pos) {err_wkr.Init_by_sect(sect, sect_bgn); this.pos = pos; return this;} + public Bry_rdr Init_by_wkr (Bry_err_wkr wkr, String sect, int pos, int src_end) { + this.pos = pos; this.src = wkr.Src(); this.src_end = src_end; + err_wkr.Init_by_page(wkr.Page(), src); + err_wkr.Init_by_sect(sect, pos); return this; } + public Bry_err_wkr Err_wkr() {return err_wkr;} private Bry_err_wkr err_wkr = new Bry_err_wkr(); public int Move_to(int v) {this.pos = v; return pos;} public int Move_by_one() {return Move_by(1);} public int Move_by(int v) {this.pos += v; return pos;} @@ -41,12 +43,12 @@ public class Bry_rdr { public int Find_fwd_rr(byte find) {return Find_fwd(find , Bool_.N, Bool_.N);} public int Find_fwd_rr(byte[] find) {return Find_fwd(find , Bool_.N, Bool_.N);} private int Find_fwd(byte find, boolean ret_lhs, boolean pos_lhs) { - int find_pos = Bry_find_.Find_fwd(src, find, pos, src_end); if (find_pos == Bry_find_.Not_found) {Fail("find failed", "find", Byte_ascii.To_str(find)); return Bry_find_.Not_found;} + int find_pos = Bry_find_.Find_fwd(src, find, pos, src_end); if (find_pos == Bry_find_.Not_found) {err_wkr.Fail("find failed", "find", Byte_ascii.To_str(find)); return Bry_find_.Not_found;} pos = find_pos + (pos_lhs ? 0 : 1); return ret_lhs ? find_pos : pos; } private int Find_fwd(byte[] find, boolean ret_lhs, boolean pos_lhs) { - int find_pos = Bry_find_.Find_fwd(src, find, pos, src_end); if (find_pos == Bry_find_.Not_found) {Fail("find failed", "find", String_.new_u8(find)); return Bry_find_.Not_found;} + int find_pos = Bry_find_.Find_fwd(src, find, pos, src_end); if (find_pos == Bry_find_.Not_found) {err_wkr.Fail("find failed", "find", String_.new_u8(find)); return Bry_find_.Not_found;} pos = find_pos + (pos_lhs ? 0 : find.length); return ret_lhs ? find_pos : pos; } @@ -60,7 +62,7 @@ public class Bry_rdr { byte rv = src[pos]; ++pos; if (pos < src_end) { - if (src[pos] != to_char) {Fail("read byte to failed", "to", Byte_ascii.To_str(to_char)); return Byte_.Max_value_127;} + if (src[pos] != to_char) {err_wkr.Fail("read byte to failed", "to", Byte_ascii.To_str(to_char)); return Byte_.Max_value_127;} ++pos; } return rv; @@ -84,7 +86,7 @@ public class Bry_rdr { break; case Byte_ascii.Dash: if (negative == -1) { // 2nd negative - Fail("invalid int", "mid", String_.new_u8(src, bgn, pos)); + err_wkr.Fail("invalid int", "mid", String_.new_u8(src, bgn, pos)); return Int_.Min_value; } else // 1st negative @@ -97,14 +99,14 @@ public class Bry_rdr { match = true; } if (!match) { - Fail("invalid int", "mid", String_.new_u8(src, bgn, pos)); + err_wkr.Fail("invalid int", "mid", String_.new_u8(src, bgn, pos)); return Int_.Min_value; } return rv * negative; } } } - if (bgn == pos) {Fail("int is empty", String_.Empty, String_.Empty); return Int_.Min_value;} + if (bgn == pos) {err_wkr.Fail("int is empty"); return Int_.Min_value;} return rv * negative; } public byte Read_byte_as_a7_int() { @@ -135,13 +137,13 @@ public class Bry_rdr { return rv; } public int Chk(byte find) { - if (src[pos] != find) {Fail("failed check", "chk", Byte_.To_str(find)); return Bry_find_.Not_found;} + if (src[pos] != find) {err_wkr.Fail("failed check", "chk", Byte_.To_str(find)); return Bry_find_.Not_found;} ++pos; return pos; } public int Chk(byte[] find) { int find_end = pos + find.length; - if (!Bry_.Match(src, pos, find_end, find)) {Fail("failed check", "chk", String_.new_u8(find)); return Bry_find_.Not_found;} + if (!Bry_.Match(src, pos, find_end, find)) {err_wkr.Fail("failed check", "chk", String_.new_u8(find)); return Bry_find_.Not_found;} pos = find_end; return pos; } @@ -149,7 +151,7 @@ public class Bry_rdr { public byte Chk_or(gplx.core.btries.Btrie_slim_mgr trie, byte or) {return Chk_or(trie, pos, src_end, or);} public byte Chk(gplx.core.btries.Btrie_slim_mgr trie, int itm_bgn, int itm_end) { byte rv = Chk_or(trie, itm_bgn, itm_end, Byte_.Max_value_127); - if (rv == Byte_.Max_value_127) {Fail("failed trie check", "mid", String_.new_u8(Bry_.Mid_by_len_safe(src, pos, 16))); return Byte_.Max_value_127;} + if (rv == Byte_.Max_value_127) {err_wkr.Fail("failed trie check", "mid", String_.new_u8(Bry_.Mid_by_len_safe(src, pos, 16))); return Byte_.Max_value_127;} return rv; } public byte Chk_or(gplx.core.btries.Btrie_slim_mgr trie, int itm_bgn, int itm_end, byte or) { @@ -158,20 +160,4 @@ public class Bry_rdr { pos = trie.Match_pos(); return ((gplx.core.primitives.Byte_obj_val)rv_obj).Val(); } - public int Fail(String msg, String arg_key, Object arg_val) {return Fail(msg, arg_key, arg_val, err_bgn, err_bgn + 255);} - public int Fail(String msg, String arg_key, Object arg_val, int excerpt_bgn, int excerpt_end) { - arg_val = Quote(Object_.Xto_str_strict_or_null_mark(arg_val)); - String err_msg = Msg_make(msg, arg_key, arg_val, excerpt_bgn, excerpt_end); - Gfo_usr_dlg_.Instance.Warn_many("", "", err_msg); - if (fail_throws_err) throw Err_.new_("Bry_rdr", err_msg).Logged_y_(); - return Bry_find_.Not_found; - } - public Err Err_make(String msg, String arg_key, Object arg_val, int excerpt_bgn, int excerpt_end) {return Err_.new_("Bry_rdr", Msg_make(msg, arg_key, arg_val, excerpt_bgn, excerpt_end));} - private String Msg_make(String msg, String arg_key, Object arg_val, int excerpt_bgn, int excerpt_end) { - if (String_.EqEmpty(arg_key)) - return Err_msg.To_str(msg, "ctx", ctx, "wkr", wkr, "excerpt", Bry_.Escape_ws(Bry_.Mid_safe(src, excerpt_bgn, excerpt_end))); - else - return Err_msg.To_str(msg, arg_key, arg_val, "ctx", ctx, "wkr", wkr, "excerpt", Bry_.Escape_ws(Bry_.Mid_safe(src, excerpt_bgn, excerpt_end))); - } - private static String Quote(String v) {return "'" + v + "'";} } diff --git a/400_xowa/src/gplx/core/brys/Int_flag_bldr.java b/400_xowa/src/gplx/core/brys/Int_flag_bldr.java index eed01fb5b..4bddb05bb 100644 --- a/400_xowa/src/gplx/core/brys/Int_flag_bldr.java +++ b/400_xowa/src/gplx/core/brys/Int_flag_bldr.java @@ -24,9 +24,12 @@ public class Int_flag_bldr { this.val_ary = new int[pow_ary.length]; return this; } - public Int_flag_bldr Set(int idx, int val) {val_ary[idx] = val; return this;} - public Int_flag_bldr Set(int idx, byte val) {val_ary[idx] = val; return this;} - public Int_flag_bldr Set(int idx, boolean val) {val_ary[idx] = val ? 1 : 0; return this;} + public boolean Set_as_bool(int idx, boolean val) {val_ary[idx] = val ? 1 : 0; return val;} + public byte Set_as_byte(int idx, byte val) {val_ary[idx] = val; return val;} + public int Set_as_int(int idx, int val) {val_ary[idx] = val; return val;} + public Int_flag_bldr Set(int idx, boolean val) {Set_as_bool(idx, val); return this;} + public Int_flag_bldr Set(int idx, byte val) {Set_as_byte(idx, val); return this;} + public Int_flag_bldr Set(int idx, int val) {Set_as_int(idx, val); return this;} public int Get_as_int(int idx) {return val_ary[idx];} public byte Get_as_byte(int idx) {return (byte)val_ary[idx];} public boolean Get_as_bool(int idx) {return val_ary[idx] == 1;} diff --git a/400_xowa/src/gplx/core/caches/GfoCacheMgr_tst.java b/400_xowa/src/gplx/core/caches/GfoCacheMgr_tst.java index 54e2371f8..10a4e70a1 100644 --- a/400_xowa/src/gplx/core/caches/GfoCacheMgr_tst.java +++ b/400_xowa/src/gplx/core/caches/GfoCacheMgr_tst.java @@ -59,7 +59,7 @@ class GfoCacheMgr_fxt { return this; } } -class GfoCacheItm_mock implements RlsAble { +class GfoCacheItm_mock implements Rls_able { public void Rls() {} public String S() {return s;} private String s; public GfoCacheItm_mock(String s) {this.s = s;} diff --git a/400_xowa/src/gplx/core/caches/Gfo_cache_mgr.java b/400_xowa/src/gplx/core/caches/Gfo_cache_mgr.java index cd20cfae1..0e3978412 100644 --- a/400_xowa/src/gplx/core/caches/Gfo_cache_mgr.java +++ b/400_xowa/src/gplx/core/caches/Gfo_cache_mgr.java @@ -44,7 +44,7 @@ public class Gfo_cache_mgr { hash.Del(itm.Key()); itm.Rls(); } - public void Add_replace(byte[] key, RlsAble val, int size) { + public void Add_replace(byte[] key, Rls_able val, int size) { // Del(key); // Add(key, val, size); Object o = hash.Get_by(key); @@ -57,7 +57,7 @@ public class Gfo_cache_mgr { itm.Replace(val, size); } } - public void Add(byte[] key, RlsAble val, int size) { + public void Add(byte[] key, Rls_able val, int size) { // if (cur_size + size > 600000000) ReduceCache(); cur_size += size; // ++cur_size; @@ -104,12 +104,12 @@ public class Gfo_cache_mgr { } } } -class Gfo_cache_data implements gplx.CompareAble, RlsAble { - public Gfo_cache_data(byte[] key, RlsAble val, int size) {this.key = key; this.val = val; this.size = size; this.timestamp = Env_.TickCount();} +class Gfo_cache_data implements gplx.CompareAble, Rls_able { + public Gfo_cache_data(byte[] key, Rls_able val, int size) {this.key = key; this.val = val; this.size = size; this.timestamp = Env_.TickCount();} public byte[] Key() {return key;} private byte[] key; - public RlsAble Val() {return val;} private RlsAble val; + public Rls_able Val() {return val;} private Rls_able val; public int Size() {return size;} private int size; - public void Replace(RlsAble val, int size) {this.val = val; this.size = size;} + public void Replace(Rls_able val, int size) {this.val = val; this.size = size;} public long Timestamp() {return timestamp;} public void Timestamp_update() {timestamp = Env_.TickCount();} private long timestamp; public int compareTo(Object obj) { Gfo_cache_data comp = (Gfo_cache_data)obj; diff --git a/400_xowa/src/gplx/core/ios/Io_buffer_rdr.java b/400_xowa/src/gplx/core/ios/Io_buffer_rdr.java index a633865dd..87980287b 100644 --- a/400_xowa/src/gplx/core/ios/Io_buffer_rdr.java +++ b/400_xowa/src/gplx/core/ios/Io_buffer_rdr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.core.ios; import gplx.*; import gplx.core.*; import gplx.core.ios.*;/*IoStream*/ -public class Io_buffer_rdr implements RlsAble { +public class Io_buffer_rdr implements Rls_able { private Io_stream_rdr rdr; Io_buffer_rdr(Io_stream_rdr rdr, Io_url url, int bfr_len) { this.rdr = rdr; this.url = url; diff --git a/400_xowa/src/gplx/core/net/Gfo_url_parser.java b/400_xowa/src/gplx/core/net/Gfo_url_parser.java index a34079f41..79bb1cc7a 100644 --- a/400_xowa/src/gplx/core/net/Gfo_url_parser.java +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser.java @@ -45,12 +45,12 @@ public class Gfo_url_parser { rel = true; } if (!rel) { // search for ":"; NOTE: only search if not rel; i.e.: "//" - int colon_pos = Bry_find_.Find_fwd(src, Byte_ascii.Colon, pos, src_end); // no colon found; EX: "//a.org/b"; "a.org/b" + int colon_pos = Bry_find_.Find_fwd(src, Byte_ascii.Colon, pos, src_end); // no colon found; EX: "//a.org/b"; "a.org/b" if (colon_pos != Bry_find_.Not_found) // colon found; EX: "http://" or "https://" pos = colon_pos + Int_.Const_dlm_len; - if (pos < src_end && src[pos] == Byte_ascii.Slash) { // skip slash after colon + if (pos < src_end && src[pos] == Byte_ascii.Slash) { // skip slash after colon pos += 1; - if (pos < src_end && src[pos] == Byte_ascii.Slash) // skip 2nd slash after colon + if (pos < src_end && src[pos] == Byte_ascii.Slash) // skip 2nd slash after colon pos += 1; } } diff --git a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_itm.java b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_itm.java index a8d9ff5ef..586242ae1 100644 --- a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_itm.java +++ b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_itm.java @@ -17,8 +17,6 @@ along with this program. If not, see . */ package gplx.core.threads.poolables; import gplx.*; import gplx.core.*; import gplx.core.threads.*; public interface Gfo_poolable_itm { - int Pool__idx(); - void Pool__clear (Object[] args); Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args); void Pool__rls(); } diff --git a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr.java b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr.java index d9fb0d11e..669fa8a3f 100644 --- a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr.java +++ b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr.java @@ -18,10 +18,10 @@ along with this program. If not, see . package gplx.core.threads.poolables; import gplx.*; import gplx.core.*; import gplx.core.threads.*; public class Gfo_poolable_mgr { private final Object thread_lock = new Object(); - private final Gfo_poolable_itm prototype; private final Object[] make_args, clear_args; + private final Gfo_poolable_itm prototype; private final Object[] make_args; private Gfo_poolable_itm[] pool; private int pool_nxt, pool_len; - public Gfo_poolable_mgr(Gfo_poolable_itm prototype, Object[] make_args, Object[] clear_args, int init_pool_len, int pool_max) {// NOTE: random IndexOutOfBounds errors in Get around free_ary[--free_len] with free_len being -1; put member variable initialization within thread_lock to try to avoid; DATE:2014-09-21 - this.prototype = prototype; this.make_args = make_args; this.clear_args = clear_args; + public Gfo_poolable_mgr(Gfo_poolable_itm prototype, Object[] make_args, int init_pool_len, int pool_max) {// NOTE: random IndexOutOfBounds errors in Get around free_ary[--free_len] with free_len being -1; put member variable initialization within thread_lock to try to avoid; DATE:2014-09-21 + this.prototype = prototype; this.make_args = make_args; this.pool_len = init_pool_len; this.Clear_fast(); } @@ -51,7 +51,6 @@ public class Gfo_poolable_mgr { pool[pool_idx] = rv; } } - rv.Pool__clear(clear_args); // NOTE: ALWAYS call Clear when doing Get. caller may forget to call Clear, and reused bfr may have leftover bytes. unit tests will not catch, and difficult to spot in app return rv; } public void Rls_safe(int idx) {synchronized (thread_lock) {Rls_safe(idx);}} diff --git a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_.java b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_.java index 897a3903d..c86ff4bac 100644 --- a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_.java +++ b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_.java @@ -17,5 +17,6 @@ along with this program. If not, see . */ package gplx.core.threads.poolables; import gplx.*; import gplx.core.*; import gplx.core.threads.*; public class Gfo_poolable_mgr_ { - public static Gfo_poolable_mgr New(int len, int max, Gfo_poolable_itm prototype) {return new Gfo_poolable_mgr(prototype, Object_.Ary_empty, Object_.Ary_empty, len, max);} + public static Gfo_poolable_mgr New(int len, int max, Gfo_poolable_itm prototype) {return new Gfo_poolable_mgr(prototype, Object_.Ary_empty, len, max);} + public static Gfo_poolable_mgr New(int len, int max, Gfo_poolable_itm prototype, Object[] make_args) {return new Gfo_poolable_mgr(prototype, make_args, len, max);} } diff --git a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_tst.java b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_tst.java index 9fd5a52da..7e2a32c43 100644 --- a/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_tst.java +++ b/400_xowa/src/gplx/core/threads/poolables/Gfo_poolable_mgr_tst.java @@ -61,7 +61,7 @@ public class Gfo_poolable_mgr_tst { } } class Gfo_poolable_mgr_tstr { - private final Gfo_poolable_mgr mgr = new Gfo_poolable_mgr(new Sample_poolable_itm(null, -1, Object_.Ary_empty), Object_.Ary("make"), Object_.Ary("clear"), 2, 8); + private final Gfo_poolable_mgr mgr = new Gfo_poolable_mgr(new Sample_poolable_itm(null, -1, Object_.Ary_empty), Object_.Ary("make"), 2, 8); public void Clear() {mgr.Clear_fast();} public void Test__get(int expd_idx) { Sample_poolable_itm actl_itm = (Sample_poolable_itm)mgr.Get_fast(); @@ -78,8 +78,6 @@ class Sample_poolable_itm implements Gfo_poolable_itm { public Sample_poolable_itm(Gfo_poolable_mgr pool_mgr, int pool_idx, Object[] make_args) {this.pool_mgr = pool_mgr; this.pool_idx = pool_idx; this.pool__make_args = make_args;} public int Pool__idx() {return pool_idx;} private final int pool_idx; public Object[] Pool__make_args() {return pool__make_args;} private final Object[] pool__make_args; - public Object[] Pool__clear_args() {return pool__clear_args;} private Object[] pool__clear_args; - public void Pool__clear (Object[] args) {this.pool__clear_args = args;} public void Pool__rls() {pool_mgr.Rls_safe(pool_idx);} public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {return new Sample_poolable_itm(pool_mgr, idx, args);} } diff --git a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java index a78e35ccf..96f8d2a5d 100644 --- a/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java +++ b/400_xowa/src/gplx/dbs/cfgs/Db_cfg_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.dbs.cfgs; import gplx.*; import gplx.dbs.*; import gplx.core.primitives.*; -public class Db_cfg_tbl implements RlsAble { +public class Db_cfg_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_grp, fld_key, fld_val; private Db_stmt stmt_insert, stmt_update, stmt_select; diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java index 1e0ea2653..407852290 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java @@ -19,7 +19,7 @@ package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*; import gplx.core.primitives.*; import gplx.core.envs.*; import gplx.dbs.*; import gplx.core.ios.*; import gplx.dbs.engines.sqlite.*; -public class Fsd_bin_tbl implements RlsAble { +public class Fsd_bin_tbl implements Rls_able { private final String tbl_name = "fsdb_bin"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_owner_id, fld_owner_tid, fld_part_id, fld_data_url, fld_data; private Db_conn conn; private Db_stmt stmt_insert, stmt_select; private Bry_bfr tmp_bfr; diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java index 61eda2657..fa093eaa0 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_dir_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; -public class Fsd_dir_tbl implements RlsAble { +public class Fsd_dir_tbl implements Rls_able { private final String tbl_name = "fsdb_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_owner_id, fld_name; private final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select_by_name; diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java index abf77c1d7..bd2f3b8f1 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_fil_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.engines.sqlite.*; -public class Fsd_fil_tbl implements RlsAble { +public class Fsd_fil_tbl implements Rls_able { private final String tbl_name = "fsdb_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_owner_id, fld_name, fld_xtn_id, fld_ext_id, fld_size, fld_modified, fld_hash, fld_bin_db_id; private final String idx_owner; diff --git a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java index 912238533..bf07463f7 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_thm_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; import gplx.fsdb.meta.*; import gplx.xowa.files.*; -public class Fsd_thm_tbl implements RlsAble { +public class Fsd_thm_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_owner_id, fld_w, fld_h, fld_time, fld_page, fld_bin_db_id, fld_size, fld_modified, fld_hash; private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by_fil_exact, stmt_select_by_fil_near; private int mnt_id; private boolean schema_thm_page; diff --git a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java index 85a49afa8..5627815fd 100644 --- a/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java +++ b/400_xowa/src/gplx/fsdb/meta/Fsm_mnt_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.fsdb.meta; import gplx.*; import gplx.fsdb.*; import gplx.dbs.*; -public class Fsm_mnt_tbl implements RlsAble { +public class Fsm_mnt_tbl implements Rls_able { private final String tbl_name = "fsdb_mnt"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_name, fld_url; private final Db_conn conn; diff --git a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java index 7968bbf5a..90f62d6f4 100644 --- a/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java +++ b/400_xowa/src/gplx/gfui/Gfui_bnd_parser.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.gfui; import gplx.*; +import gplx.core.bits.*; public class Gfui_bnd_parser { private Bry_bfr tmp_bfr = Bry_bfr.reset_(32); private Hash_adp_bry diff --git a/400_xowa/src/gplx/langs/dsvs/Dsv_tbl_parser.java b/400_xowa/src/gplx/langs/dsvs/Dsv_tbl_parser.java index bf8374270..4119cc0b1 100644 --- a/400_xowa/src/gplx/langs/dsvs/Dsv_tbl_parser.java +++ b/400_xowa/src/gplx/langs/dsvs/Dsv_tbl_parser.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.langs.dsvs; import gplx.*; import gplx.langs.*; -public class Dsv_tbl_parser implements GfoInvkAble, RlsAble { +public class Dsv_tbl_parser implements GfoInvkAble, Rls_able { private Dsv_wkr_base mgr; private Dsv_fld_parser[] fld_parsers = new Dsv_fld_parser[2]; private int fld_parsers_len = 2; public byte[] Src() {return src;} private byte[] src; diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java index cf58b26ec..fadacf36b 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder.java @@ -17,6 +17,7 @@ along with this program. If not, see . */ 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.*; public class Gfo_url_encoder implements Url_encoder_interface { private Gfo_url_encoder_itm[] encode_ary, decode_ary; private Gfo_url_encoder anchor_encoder = null; public Gfo_url_encoder(Gfo_url_encoder_itm[] encode_ary, Gfo_url_encoder_itm[] decode_ary, Gfo_url_encoder anchor_encoder) { diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java index f5c4eb4f9..bcc681ed1 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_.java @@ -21,14 +21,15 @@ import gplx.xowa.parsers.amps.*; public class Gfo_url_encoder_ { public static final Gfo_url_encoder Id = Gfo_url_encoder_.New__html_id().Make() - , Href = Gfo_url_encoder_.New__html_href_mw().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_qarg = Gfo_url_encoder_.New__html_href_qarg().Make() - , Xourl = Gfo_url_encoder_.New__html_href_mw().Init__same__many(Byte_ascii.Underline).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 = Gfo_url_encoder_.New__fsys_lnx().Make() - , Fsys_safe = Gfo_url_encoder_.New__fsys_wnt().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: "" -> "" @@ -37,25 +38,28 @@ public class Gfo_url_encoder_ { .Init__diff__one(Byte_ascii.Space, Byte_ascii.Underline) .Init__html_ent(Byte_ascii.Amp, Xop_amp_trie.Instance); } - private static Gfo_url_encoder_mkr New__html_href_mw() { // EX: "" -> "" + private static Gfo_url_encoder_mkr New__html_href_mw(boolean use_anchor_encoder) { // EX: "" -> ""; REF.MW: ";:@$!*(),/" return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y) .Init__diff__one(Byte_ascii.Space, Byte_ascii.Underline) .Init__same__many - ( Byte_ascii.Semic, Byte_ascii.At, Byte_ascii.Dollar, Byte_ascii.Bang, Byte_ascii.Star - , Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Comma, Byte_ascii.Slash, Byte_ascii.Colon + ( Byte_ascii.Semic, Byte_ascii.Colon, Byte_ascii.At, Byte_ascii.Dollar, Byte_ascii.Bang, Byte_ascii.Star + , Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Comma, Byte_ascii.Slash , Byte_ascii.Hash// NOTE: not part of wfUrlEncode; not sure where this is specified; needed for A#b ) - .Init__anchor_encoder(New__html_id().Make()); + .Init__anchor_encoder(use_anchor_encoder ? New__html_id().Make() : null); } private static Gfo_url_encoder_mkr New__html_href_qarg() { // same as regular href encoder, but also do not encode qarg characters "?" and "=" - return New__html_href_mw().Init__same__many(Byte_ascii.Question, Byte_ascii.Eq); + return New__html_href_mw(Bool_.Y).Init__same__many(Byte_ascii.Question, Byte_ascii.Eq); } - private static Gfo_url_encoder_mkr New__html_href_quotes() { - return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent) - .Init__diff__one(Byte_ascii.Space, Byte_ascii.Underline) // convert " " to "_" - .Init__same__rng(0, 255) // default everything to same; - .Init__diff__many(Byte_ascii.Percent, Byte_ascii.Apos - , Byte_ascii.Quote, Byte_ascii.Lt, Byte_ascii.Gt); // encode ', ", <, > + private static Gfo_url_encoder_mkr New__html_href_quotes() {// same as href encoder, but do not encode ?, =, #, +; also, don't encode "%" vals + return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.Y) + .Init__diff__one(Byte_ascii.Space, Byte_ascii.Underline) + .Init__same__many + ( Byte_ascii.Semic, Byte_ascii.Colon, Byte_ascii.At, Byte_ascii.Dollar, Byte_ascii.Bang, Byte_ascii.Star + , Byte_ascii.Paren_bgn, Byte_ascii.Paren_end, Byte_ascii.Comma, Byte_ascii.Slash + , Byte_ascii.Question, Byte_ascii.Eq, Byte_ascii.Hash, Byte_ascii.Plus// NOTE: not part of wfUrlEncode; not sure where this is specified; needed for A#b + ) + ; } public static Gfo_url_encoder_mkr New__http_url() { return new Gfo_url_encoder_mkr().Init(Byte_ascii.Percent).Init_common(Bool_.N) diff --git a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java index 974e4505c..9a2df1bfb 100644 --- a/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java +++ b/400_xowa/src/gplx/langs/htmls/encoders/Gfo_url_encoder_tst.java @@ -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_safe; return this;} + public Gfo_url_encoder_fxt Encoder_fsys_safe() {encoder = Gfo_url_encoder_.Fsys_wnt; return this;} public void Test__bicode(String raw, String encoded) { Test__encode(raw, encoded); Test__decode(encoded, raw); diff --git a/400_xowa/src/gplx/langs/htmls/parsers/Html_atr.java b/400_xowa/src/gplx/langs/htmls/parsers/Html_atr.java index 2e0308c1d..e86a6edfa 100644 --- a/400_xowa/src/gplx/langs/htmls/parsers/Html_atr.java +++ b/400_xowa/src/gplx/langs/htmls/parsers/Html_atr.java @@ -26,7 +26,7 @@ public class Html_atr extends gplx.core.brys.Bfr_arg_base { public byte[] Key() {return key;} private final byte[] key; public int Val_bgn() {return val_bgn;} private final int val_bgn; public int Val_end() {return val_end;} private final int val_end; - public boolean Val_dat_exists() {return val_end > val_bgn;} + public boolean Val_dat_exists() {return val_end != -1;} public boolean Val_dat_missing() {return val_end == -1;} public byte[] Val() { if (val == null) diff --git a/400_xowa/src/gplx/langs/htmls/parsers/Html_tag.java b/400_xowa/src/gplx/langs/htmls/parsers/Html_tag.java index 3dac6b8c8..f9c16f81d 100644 --- a/400_xowa/src/gplx/langs/htmls/parsers/Html_tag.java +++ b/400_xowa/src/gplx/langs/htmls/parsers/Html_tag.java @@ -39,7 +39,7 @@ public class Html_tag implements Mwh_atr_wkr { || (name_id != Html_tag_.Id__eos && Int_.In(chk, Html_tag_.Id__any, Html_tag_.Id__comment))) { } else - tag_rdr.Rdr().Fail("name_id chk failed", "expecting", Html_tag_.To_str(chk)); + tag_rdr.Err_wkr().Fail("name_id chk failed", "expecting", Html_tag_.To_str(chk)); return this; } public byte[] Src() {return src;} private byte[] src; @@ -48,6 +48,7 @@ public class Html_tag implements Mwh_atr_wkr { public boolean Src_exists() {return src_end > src_bgn;} // NOTE: only true if EOS where src_end == src_bgn == src_len public boolean Tag_is_tail() {return tag_is_tail;} private boolean tag_is_tail; public boolean Tag_is_inline() {return tag_is_inline;} private boolean tag_is_inline; + public int Atrs__len() {if (atrs_null) Atrs__make(); return atrs_hash.Count();} public boolean Atrs__match_pair(byte[] key, byte[] val) { if (atrs_null) Atrs__make(); Html_atr rv = (Html_atr)atrs_hash.Get_by(key); @@ -61,8 +62,8 @@ public class Html_tag implements Mwh_atr_wkr { } public byte Atrs__cls_find_or_fail(Hash_adp_bry hash) { if (atrs_null) Atrs__make(); - Html_atr cls_atr = (Html_atr)atrs_hash.Get_by(Html_atr_.Bry__class); if (cls_atr == null) tag_rdr.Rdr().Fail("cls missing", String_.Empty, String_.Empty); - byte rv = Html_atr_class_.Find_1st(src, cls_atr.Val_bgn(), cls_atr.Val_end(), hash); if (rv == Byte_.Max_value_127) tag_rdr.Rdr().Fail("cls val missing", String_.Empty, String_.Empty); + Html_atr cls_atr = (Html_atr)atrs_hash.Get_by(Html_atr_.Bry__class); if (cls_atr == null) tag_rdr.Err_wkr().Fail("cls missing"); + byte rv = Html_atr_class_.Find_1st(src, cls_atr.Val_bgn(), cls_atr.Val_end(), hash); if (rv == Byte_.Max_value_127) tag_rdr.Err_wkr().Fail("cls val missing"); return rv; } private static final Html_atr_style_wkr__get_val_as_int style_wkr = new Html_atr_style_wkr__get_val_as_int(); @@ -78,7 +79,7 @@ public class Html_tag implements Mwh_atr_wkr { return rv == null ? Bry_.Empty : rv.Val(); } public int Atrs__get_as_int(byte[] key) { - int rv = Atrs__get_as_int_or(key, Int_.Min_value); if (rv == Int_.Min_value) tag_rdr.Rdr().Fail("atr missing", "key", key); + int rv = Atrs__get_as_int_or(key, Int_.Min_value); if (rv == Int_.Min_value) tag_rdr.Err_wkr().Fail("atr missing", "key", key); return rv; } public int Atrs__get_as_int_or(byte[] key, int or) { @@ -86,13 +87,14 @@ public class Html_tag implements Mwh_atr_wkr { Html_atr rv = (Html_atr)atrs_hash.Get_by(key); if (rv == null) return or; return Bry_.To_int_or(src, rv.Val_bgn(), rv.Val_end(), or); } - public Html_atr Atrs__get_by_or_fail(byte[] key) {return Atrs__get_by_or_fail(key, Bool_.Y);} + public Html_atr Atrs__get_at(int i) {return (Html_atr)atrs_hash.Get_at(i);} + public Html_atr Atrs__get_by_or_fail(byte[] key) {return Atrs__get_by_or_fail(key, Bool_.Y);} public Html_atr Atrs__get_by_or_empty(byte[] key) {return Atrs__get_by_or_fail(key, Bool_.N);} public Html_atr Atrs__get_by_or_fail(byte[] key, boolean fail_if_null) { if (atrs_null) Atrs__make(); Html_atr rv = (Html_atr)atrs_hash.Get_by(key); if (rv == null) { - if (fail_if_null) tag_rdr.Rdr().Fail("atr missing", "key", key); + if (fail_if_null) tag_rdr.Err_wkr().Fail("atr missing", "key", key); else return Html_atr.Noop; } return rv; diff --git a/400_xowa/src/gplx/langs/htmls/parsers/Html_tag_rdr.java b/400_xowa/src/gplx/langs/htmls/parsers/Html_tag_rdr.java index 214a52d12..0a9fe18eb 100644 --- a/400_xowa/src/gplx/langs/htmls/parsers/Html_tag_rdr.java +++ b/400_xowa/src/gplx/langs/htmls/parsers/Html_tag_rdr.java @@ -25,19 +25,17 @@ public class Html_tag_rdr { private final Int_obj_ref tmp_depth = Int_obj_ref.zero_(); public byte[] Src() {return src;} private byte[] src; public int Src_end() {return src_end;} private int src_end; - public Bry_rdr Rdr() {return rdr;} private final Bry_rdr rdr = new Bry_rdr(); + public Bry_err_wkr Err_wkr() {return err_wkr;} private final Bry_err_wkr err_wkr = new Bry_err_wkr(); public void Init(byte[] ctx, byte[] src, int src_bgn, int src_end) { this.src = src; this.pos = src_bgn; this.src_end = src_end; tag__eos.Init(this, src, Bool_.N, Bool_.N, src_end, src_end, src_end, src_end, Html_tag_.Id__eos); - rdr.Init_by_page(ctx, src, src_end); + err_wkr.Init_by_page(String_.new_u8(ctx), src); } public int Pos() {return pos;} private int pos; public void Pos_(int v) {this.pos = v;} public void Atrs__make(Mwh_atr_wkr atr_wkr, int head_bgn, int head_end) {atr_parser.Parse(atr_wkr, -1, -1, src, head_bgn, head_end);} - public void Fail(String msg, Html_tag tag) {rdr.Fail(msg, String_.Empty, String_.Empty, tag.Src_bgn(), tag.Src_end());} public Html_tag Tag__move_fwd_head() {return Tag__find(Bool_.Y, Bool_.N, Bool_.N, pos, src_end, Html_tag_.Id__any);} public Html_tag Tag__move_fwd_head(int match_name_id) {return Tag__find(Bool_.Y, Bool_.N, Bool_.N, pos, src_end, match_name_id);} -// public Html_tag Tag__move_fwd_tail() {return Tag__find(Bool_.Y, Bool_.N, Bool_.Y, pos, src_end, Html_tag_.Id__any);} public Html_tag Tag__move_fwd_tail(int match_name_id) {return Tag__find(Bool_.Y, Bool_.N, Bool_.Y, pos, src_end, match_name_id);} public Html_tag Tag__peek_fwd_head() {return Tag__find(Bool_.N, Bool_.N, Bool_.N, pos, src_end, Html_tag_.Id__any);} public Html_tag Tag__peek_fwd_head(int match_name_id) {return Tag__find(Bool_.N, Bool_.N, Bool_.N, pos, src_end, match_name_id);} @@ -70,7 +68,7 @@ public class Html_tag_rdr { } if (rv == null) { if (move && tail && !bwd) - rdr.Fail("move failed", "tag_name", Html_tag_.To_str(match_name_id)); + err_wkr.Fail("move failed", "tag_name", Html_tag_.To_str(match_name_id)); else return Tag__eos(rng_bgn); } @@ -181,7 +179,7 @@ public class Html_tag_rdr { return false; } public int Read_int_to(byte to_char) { - int rv = Read_int_to(to_char, Int_.Max_value); if (rv == Int_.Max_value) rdr.Fail("invalid int", "pos", pos); + int rv = Read_int_to(to_char, Int_.Max_value); if (rv == Int_.Max_value) err_wkr.Fail("invalid int", "pos", pos); return rv; } public int Read_int_to(byte to_char, int or_int) { diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index a9f72b5bb..4f2634781 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -34,7 +34,7 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "2.11.4.1"; + public static final String Version = "2.12.1.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys_str; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/Xoa_page.java b/400_xowa/src/gplx/xowa/Xoa_page.java index baddcc143..28867c8b9 100644 --- a/400_xowa/src/gplx/xowa/Xoa_page.java +++ b/400_xowa/src/gplx/xowa/Xoa_page.java @@ -22,7 +22,8 @@ public interface Xoa_page { Xoa_url Url(); byte[] Url_bry_safe(); Xoa_ttl Ttl(); - void Xtn_gallery_packed_exists_y_(); boolean Exists(); + Xoa_page__commons_mgr Commons_mgr(); + void Xtn_gallery_packed_exists_y_(); } diff --git a/400_xowa/src/gplx/xowa/Xoa_ttl.java b/400_xowa/src/gplx/xowa/Xoa_ttl.java index 56aff166d..b5d143013 100644 --- a/400_xowa/src/gplx/xowa/Xoa_ttl.java +++ b/400_xowa/src/gplx/xowa/Xoa_ttl.java @@ -43,7 +43,8 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. Bry_.Replace_reuse(rv, Byte_ascii.Space, Byte_ascii.Underline); return rv; } - public String Page_db_as_str() {return String_.new_u8(Page_db());} + public String Page_db_as_str() {return String_.new_u8(Page_db());} + public byte[] Page_url_w_anch() {return Gfo_url_encoder_.Href.Encode(Bry_.Mid(full_txt, page_bgn, qarg_bgn == -1 ? full_txt.length : qarg_bgn - 1));} public int Leaf_bgn() {return leaf_bgn;} public byte[] Base_txt() {return leaf_bgn == -1 ? Page_txt() : Bry_.Mid(full_txt, page_bgn, leaf_bgn - 1);} public byte[] Leaf_txt() {return leaf_bgn == -1 ? Page_txt() : Bry_.Mid(full_txt, leaf_bgn, anch_bgn == -1 ? full_txt.length : anch_bgn - 1);} @@ -52,7 +53,7 @@ public class Xoa_ttl { // PAGE:en.w:http://en.wikipedia.org/wiki/Help:Link; REF. public byte[] Anch_txt() {return anch_bgn == -1 ? Bry_.Empty : Bry_.Mid(full_txt, anch_bgn, full_txt.length);} public byte[] Talk_txt() {return ns.Id_is_talk() ? Full_txt() : Bry_.Add(tors_txt, Page_txt());} public byte[] Subj_txt() {return ns.Id_is_subj() ? Full_txt() : Bry_.Add(tors_txt, Page_txt());} - public byte[] Full_url() {return Xoa_url_encoder.Instance.Encode(full_txt);} + public byte[] Full_url() {return Gfo_url_encoder_.Href.Encode(full_txt);} public String Full_db_as_str() {return String_.new_u8(Full_db());} public byte[] Full_db() {return ns.Gen_ttl(this.Page_db());} public byte[] Full_db_w_anch() {return Replace_spaces(full_txt);} diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java index af61db015..8fcdabfe4 100644 --- a/400_xowa/src/gplx/xowa/Xoae_app.java +++ b/400_xowa/src/gplx/xowa/Xoae_app.java @@ -32,7 +32,7 @@ public class Xoae_app implements Xoa_app, GfoInvkAble { public Xoae_app(Gfo_usr_dlg usr_dlg, Xoa_app_mode mode, Io_url root_dir, Io_url wiki_dir, Io_url file_dir, Io_url user_dir, Io_url css_dir, String bin_dir_name) { Xoa_app_.Usr_dlg_(usr_dlg); this.mode = mode; - Io_url.Http_file_str_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys; + Io_url.Http_file_str_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx; fsys_mgr = new Xoa_fsys_mgr(bin_dir_name, root_dir, wiki_dir, file_dir, css_dir); log_wtr = usr_dlg.Log_wkr(); cfg_mgr = new Xoa_cfg_mgr(this); diff --git a/400_xowa/src/gplx/xowa/Xoae_page.java b/400_xowa/src/gplx/xowa/Xoae_page.java index 52bea55df..b8afbc812 100644 --- a/400_xowa/src/gplx/xowa/Xoae_page.java +++ b/400_xowa/src/gplx/xowa/Xoae_page.java @@ -16,11 +16,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa; import gplx.*; -import gplx.xowa.langs.*; -import gplx.xowa.guis.*; import gplx.xowa.guis.views.*; import gplx.xowa.htmls.*; import gplx.xowa.wikis.pages.*; -import gplx.xowa.files.*; import gplx.xowa.files.xfers.*; import gplx.xowa.xtns.cite.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.htmls.tocs.*; -import gplx.xowa.htmls.modules.popups.*; import gplx.xowa.xtns.wdatas.pfuncs.*; -import gplx.xowa.parsers.*; +import gplx.xowa.langs.*; import gplx.xowa.wikis.pages.*; +import gplx.xowa.guis.*; import gplx.xowa.guis.views.*; +import gplx.xowa.files.*; import gplx.xowa.files.xfers.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.xtns.cite.*; import gplx.xowa.xtns.wdatas.*; import gplx.xowa.xtns.wdatas.pfuncs.*; +import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.tocs.*; import gplx.xowa.htmls.modules.popups.*; public class Xoae_page implements Xoa_page { Xoae_page(Xowe_wiki wiki, Xoa_ttl ttl) { this.wiki = wiki; this.ttl = ttl; @@ -28,13 +28,13 @@ public class Xoae_page implements Xoa_page { hdr_mgr = new Xow_hdr_mgr(this); redlink_lnki_list = new Xopg_redlink_lnki_list(ttl.Ns().Id_is_module()); Ttl_(ttl); - } Xoae_page() {} // called by Null + } Xoae_page() {} // called by Empty public Xow_wiki Wiki() {return wiki;} public Xoa_ttl Ttl() {return ttl;} public Xoae_page Ttl_(Xoa_ttl v) {ttl = v; url.Wiki_bry_(wiki.Domain_bry()).Page_bry_(v.Full_url()); return this;} private Xoa_ttl ttl; public Xoa_url Url() {return url;} public Xoae_page Url_(Xoa_url v) {url = v; return this;} private Xoa_url url = Xoa_url.blank(); public byte[] Url_bry_safe() {return url == null ? Bry_.Empty : url.Raw();} - public void Xtn_gallery_packed_exists_y_() {html_data.Xtn_gallery_packed_exists_y_();} public boolean Exists() {return !Missing();} + public void Xtn_gallery_packed_exists_y_() {html_data.Xtn_gallery_packed_exists_y_();} public Xoa_page__commons_mgr Commons_mgr() {return commons_mgr;} private final Xoa_page__commons_mgr commons_mgr = new Xoa_page__commons_mgr(); public Xopg_revision_data Revision_data() {return revision_data;} private Xopg_revision_data revision_data = new Xopg_revision_data(); @@ -58,7 +58,7 @@ public class Xoae_page implements Xoa_page { public List_adp Lnki_list() {return lnki_list;} public void Lnki_list_(List_adp v) {this.lnki_list = v;} private List_adp lnki_list = List_adp_.new_(); public Xof_xfer_queue File_queue() {return file_queue;} private Xof_xfer_queue file_queue = new Xof_xfer_queue(); public List_adp File_math() {return file_math;} private List_adp file_math = List_adp_.new_(); - public Ref_itm_mgr Ref_mgr() {return ref_mgr;} private Ref_itm_mgr ref_mgr = new Ref_itm_mgr(); + public Ref_itm_mgr Ref_mgr() {return ref_mgr;} private Ref_itm_mgr ref_mgr = new Ref_itm_mgr(); public void Ref_mgr_(Ref_itm_mgr v) {this.ref_mgr = v;} public Xopg_popup_mgr Popup_mgr() {return popup_mgr;} private Xopg_popup_mgr popup_mgr = new Xopg_popup_mgr(); public List_adp Slink_list() {return slink_list;} private List_adp slink_list = List_adp_.new_(); public Wdata_external_lang_links_data Wdata_external_lang_links() {return wdata_external_lang_links;} private Wdata_external_lang_links_data wdata_external_lang_links = new Wdata_external_lang_links_data(); @@ -79,7 +79,8 @@ public class Xoae_page implements Xoa_page { tmpl_stack_ary_len = new_len; return true; } private byte[][] tmpl_stack_ary = Bry_.Ary_empty; private int tmpl_stack_ary_len = 0, tmpl_stack_ary_max = 0; - public void Clear() { // NOTE: this is called post-fetch but pre-parse; do not clear items set by post-fetch, such as id, ttl, redirected_ttls, data_raw + public void Clear_all() {Clear(true);} + public void Clear(boolean clear_scrib) { // NOTE: this is called post-fetch but pre-parse; do not clear items set by post-fetch, such as id, ttl, redirected_ttls, data_raw hdr_mgr.Clear(); lnki_list.Clear(); file_math.Clear(); @@ -88,7 +89,7 @@ public class Xoae_page implements Xoa_page { html_cmd_mgr.Clear(); hdump_data.Clear(); wdata_external_lang_links.Reset(); - gplx.xowa.xtns.scribunto.Scrib_core.Core_page_changed(this); + if (clear_scrib) gplx.xowa.xtns.scribunto.Scrib_core.Core_page_changed(this); slink_list.Clear(); html_data.Clear(); tab_data.Clear(); @@ -100,13 +101,9 @@ public class Xoae_page implements Xoa_page { tmpl_prepend_mgr.Clear(); commons_mgr.Clear(); } - public static final Xoae_page Null = null; + private Xoae_page Edit_mode_create_() {edit_mode = Xoa_page_.Edit_mode_create; return this;} public static final Xoae_page Empty = new Xoae_page().Missing_(); - public static Xoae_page test_(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl);} - public static Xoae_page new_(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl);} - public static Xoae_page create_(Xowe_wiki wiki, Xoa_ttl ttl) { - Xoae_page rv = new Xoae_page(wiki, ttl); - rv.edit_mode = Xoa_page_.Edit_mode_create; - return rv; - } + public static Xoae_page New(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl);} + public static Xoae_page New_test(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl);} + public static Xoae_page New_edit(Xowe_wiki wiki, Xoa_ttl ttl) {return new Xoae_page(wiki, ttl).Edit_mode_create_();} } diff --git a/400_xowa/src/gplx/xowa/Xop_fxt.java b/400_xowa/src/gplx/xowa/Xop_fxt.java index 4db5d8755..af7e1fe7a 100644 --- a/400_xowa/src/gplx/xowa/Xop_fxt.java +++ b/400_xowa/src/gplx/xowa/Xop_fxt.java @@ -61,9 +61,9 @@ public class Xop_fxt { public void Lang_by_id_(int id) {ctx.Cur_page().Lang_(wiki.Appe().Lang_mgr().Get_by_or_new(Xol_lang_stub_.Get_by_id(id).Key()));} public Xoh_html_wtr_cfg Wtr_cfg() {return hdom_wtr.Cfg();} private Xoh_html_wtr hdom_wtr; public Xop_fxt Reset() { - ctx.Clear(); + ctx.Clear_all(); ctx.App().Free_mem(false); - ctx.Cur_page().Clear(); + ctx.Cur_page().Clear_all(); wiki.Db_mgr().Load_mgr().Clear(); app.Wiki_mgr().Clear(); Io_mgr.Instance.InitEngine_mem(); // clear created pages @@ -286,12 +286,13 @@ public class Xop_fxt { hdom_wtr.Write_all(actl_bfr, ctx, root.Root_src(), root); return actl_bfr.To_str_and_clear(); } + public void Hctx_(Xoh_wtr_ctx v) {hctx = v;} private Xoh_wtr_ctx hctx = Xoh_wtr_ctx.Basic; public String Exec_parse_page_wiki_as_str(String raw) { byte[] raw_bry = Bry_.new_u8(raw); Xop_root_tkn root = tkn_mkr.Root(raw_bry); parser.Parse_wtxt_to_wdom(root, ctx, tkn_mkr, raw_bry, Xop_parser_.Doc_bgn_bos); Bry_bfr actl_bfr = Bry_bfr.new_(); - hdom_wtr.Write_all(actl_bfr, ctx, raw_bry, root); + hdom_wtr.Write_all(actl_bfr, ctx, hctx, raw_bry, root); return actl_bfr.To_str_and_clear(); } private void Parse_chk(byte[] raw_bry, Xop_root_tkn root, Tst_chkr[] expd_ary) { diff --git a/400_xowa/src/gplx/xowa/Xowe_wiki.java b/400_xowa/src/gplx/xowa/Xowe_wiki.java index 885721a7e..40b2e0308 100644 --- a/400_xowa/src/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src/gplx/xowa/Xowe_wiki.java @@ -218,7 +218,7 @@ public class Xowe_wiki implements Xow_wiki, GfoInvkAble, GfoEvObj { if (rls_list == null) return; int len = rls_list.Count(); for (int i = 0; i < len; i++) { - RlsAble rls = (RlsAble)rls_list.Get_at(i); + Rls_able rls = (Rls_able)rls_list.Get_at(i); rls.Rls(); } } diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java index d355a814f..30909b346 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/bldrs/imports/Xoapi_import.java @@ -30,6 +30,7 @@ public class Xoapi_import implements GfoInvkAble { public byte Zip_tid_text() {return zip_tid_text;} private byte zip_tid_text = Io_stream_.Tid_gzip; public byte Zip_tid_html() {return zip_tid_html;} private byte zip_tid_html = Io_stream_.Tid_gzip; public boolean Hzip_enabled() {return hzip_enabled;} private boolean hzip_enabled = Bool_.Y; + public boolean Hzip_mode_is_b256() {return hzip_mode_is_b256;} private boolean hzip_mode_is_b256 = Bool_.Y; public String User_name() {return user_name;} private String user_name = "anonymous"; public Xowd_core_db_props New_props(String domain_str, long dump_file_size) { Xowd_db_layout layout_text, layout_html, layout_file; @@ -40,7 +41,7 @@ public class Xoapi_import implements GfoInvkAble { layout_html = dump_file_size < layout_html_max ? Xowd_db_layout.Itm_few : Xowd_db_layout.Itm_lot; layout_file = dump_file_size < layout_file_max ? Xowd_db_layout.Itm_few : Xowd_db_layout.Itm_lot; } - return new Xowd_core_db_props(2, layout_text, layout_html, layout_file, zip_tid_text, zip_tid_html, hzip_enabled); + return new Xowd_core_db_props(2, layout_text, layout_html, layout_file, zip_tid_text, zip_tid_html, hzip_enabled, hzip_mode_is_b256); } public byte[] New_ns_file_map(long dump_file_size) { return dump_file_size < layout_text_max ? Bry_.Empty : Ns_file_map__each; @@ -72,6 +73,8 @@ public class Xoapi_import implements GfoInvkAble { else if (ctx.Match(k, Invk_zip_tid_html_)) zip_tid_html = Io_stream_.To_tid(m.ReadStr("v")); else if (ctx.Match(k, Invk_hzip_enabled)) return Yn.To_str(hzip_enabled); else if (ctx.Match(k, Invk_hzip_enabled_)) hzip_enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk_hzip_mode_is_b256)) return Yn.To_str(hzip_mode_is_b256); + else if (ctx.Match(k, Invk_hzip_mode_is_b256_)) hzip_mode_is_b256 = m.ReadYn("v"); else if (ctx.Match(k, Invk_user_name)) return user_name; else if (ctx.Match(k, Invk_user_name_)) user_name = m.ReadStr("v"); else return GfoInvkAble_.Rv_unhandled; @@ -91,7 +94,8 @@ public class Xoapi_import implements GfoInvkAble { , Invk_zip_tid_text = "zip_tid_text" , Invk_zip_tid_text_ = "zip_tid_text_", Invk_zip_tid_list = "zip_tid_list" , Invk_zip_tid_html = "zip_tid_html" , Invk_zip_tid_html_ = "zip_tid_html_" , Invk_user_name = "user_name" , Invk_user_name_ = "user_name_" - , Invk_hzip_enabled = "hzip_enabled" , Invk_hzip_enabled_ = "hzip_enabled_" + , Invk_hzip_enabled = "hzip_enabled" , Invk_hzip_enabled_ = "hzip_enabled_" + , Invk_hzip_mode_is_b256 = "hzip_mode_is_b256" , Invk_hzip_mode_is_b256_ = "hzip_mode_is_b256_" ; public static final byte[] Ns_file_map__each = Bry_.new_a7(""); } diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java index d7d8be51d..54baeb0f6 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/gui/pages/Xoapi_view.java @@ -36,7 +36,7 @@ public class Xoapi_view implements GfoInvkAble { 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_safe.Encode_str(String_.new_u8(tab.Page().Ttl().Full_url())) + ".html"; + 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_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()); diff --git a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java index 007329b6b..08e31a588 100644 --- a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java @@ -32,7 +32,7 @@ public class Xoa_fsys_mgr implements GfoInvkAble { this.cfg_app_fil = bin_xowa_dir.GenSubFil_nest("cfg", "app", "xowa.gfs"); this.cfg_lang_core_dir = bin_xowa_dir.GenSubDir_nest("cfg", "lang", "core"); this.cfg_wiki_core_dir = bin_xowa_dir.GenSubDir_nest("cfg", "wiki", "core"); - this.cfg_site_meta_fil = bin_xowa_dir.GenSubDir_nest("cfg", "wiki", "site_meta.sqlite3"); + this.cfg_site_meta_fil = bin_xowa_dir.GenSubFil_nest("cfg", "wiki", "site_meta.sqlite3"); this.home_wiki_dir = bin_xowa_dir.GenSubDir_nest("wiki", Xow_domain_itm_.Str__home); } public Io_url Root_dir() {return root_dir;} private final Io_url root_dir; diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java b/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java index 030238a49..c121543a8 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_fxt.java @@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*; -import gplx.core.tests.*; -import gplx.core.ios.*; import gplx.dbs.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.cmds.texts.tdbs.*; +import gplx.core.tests.*; import gplx.core.ios.*; import gplx.core.times.*; +import gplx.dbs.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.bldrs.cmds.texts.tdbs.*; public class Xob_fxt { public Xob_fxt Ctor_mem() { Io_mgr.Instance.InitEngine_mem(); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java index 4eae17ca4..fc6debf64 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/Xob_dump_mgr_base.java @@ -140,8 +140,10 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo usr_dlg.Prog_many("", "", "parsing: ns=~{0} db=~{1} pg=~{2} count=~{3} time=~{4} rate=~{5} ttl=~{6}" , ns.Id(), db_id, page.Id(), exec_count , Env_.TickCount_elapsed_in_sec(time_bgn), rate_mgr.Rate_as_str(), String_.new_u8(page.Ttl_page_db())); - ctx.Clear(); - Exec_pg_itm_hook(ns_ord, ns, page, page.Text()); + ctx.Clear_all(); + byte[] page_src = page.Text(); + if (page_src != null) // some pages have no text; ignore them else null ref; PAGE: it.d:miercuri DATE:2015-12-05 + Exec_pg_itm_hook(ns_ord, ns, page, page_src); ctx.App().Utl__bfr_mkr().Clear_fail_check(); // make sure all bfrs are released if (ctx.Wiki().Cache_mgr().Tmpl_result_cache().Count() > 50000) ctx.Wiki().Cache_mgr().Tmpl_result_cache().Clear(); @@ -155,7 +157,7 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo Free(); } catch (Exception exc) { - bldr.Usr_dlg().Warn_many(GRP_KEY, "parse", "failed to parse ~{0} error ~{1}", String_.new_u8(page.Ttl_page_db()), Err_.Message_lang(exc)); + bldr.Usr_dlg().Warn_many("", "", "parse failed: wiki=~{0} ttl=~{1} err=~{2}", wiki.Domain_str(), page.Ttl_full_db(), Err_.Message_gplx_log(exc)); ctx.App().Utl__bfr_mkr().Clear(); this.Free(); } @@ -216,7 +218,6 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo , Invk_poll_mgr = "poll_mgr", Invk_reset_db_ = "reset_db_" , Invk_exec_count_max_ = "exec_count_max_", Invk_exit_now_ = "exit_now_", Invk_exit_after_commit_ = "exit_after_commit_" ; - private static final String GRP_KEY = "xowa.bldr.parse"; } class Xob_dump_mgr_base_ { public static void Load_all_tmpls(Gfo_usr_dlg usr_dlg, Xowe_wiki wiki, Xob_dump_src_id page_src) { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java index 96057e19a..2c174ffbb 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/ctgs/Xob_categorylinks_base.java @@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.cmds.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; -import gplx.core.brys.*; import gplx.core.ios.*; import gplx.xowa.wikis.ctgs.*; -import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*; +import gplx.core.brys.*; import gplx.core.ios.*; import gplx.core.times.*; +import gplx.xowa.wikis.ctgs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.bldrs.sqls.*; public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implements Sql_file_parser_cmd { private DateAdp_parser date_parser = DateAdp_parser.new_(); private Sql_file_parser sql_parser; Uca_trie trie; private Bry_bfr uca_bfr = Bry_bfr.reset_(255); public abstract Io_sort_cmd Make_sort_cmd(Sql_file_parser sql_parser); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java index c915bdd3b..dee56eb25 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_fsdb_make_cmd.java @@ -25,7 +25,7 @@ import gplx.fsdb.data.*; import gplx.fsdb.meta.*; public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { private Db_conn bldr_conn; private Db_cfg_tbl bldr_cfg_tbl; private Xof_bin_mgr src_bin_mgr; private Xof_bin_wkr__fsdb_sql src_fsdb_wkr; private boolean src_bin_mgr__cache_enabled = Bool_.N; private String src_bin_mgr__fsdb_version; private String[] src_bin_mgr__fsdb_skip_wkrs; private boolean src_bin_mgr__wmf_enabled; - private Fsm_mnt_itm trg_mnt_itm; private Fsm_cfg_mgr trg_cfg_mgr; private Fsm_atr_fil trg_atr_fil; private Fsm_bin_fil trg_bin_fil; private long trg_bin_db_max; + private Fsm_mnt_itm trg_mnt_itm; private Fsm_cfg_mgr trg_cfg_mgr; private Fsm_atr_fil trg_atr_fil; private Fsm_bin_fil trg_bin_fil; private long trg_bin_db_max; private String trg_bin_mgr__fsdb_version; private final Xof_bin_updater trg_bin_updater = new Xof_bin_updater(); private Xob_bin_db_mgr bin_db_mgr; private int[] ns_ids; private int prv_lnki_tier_id = -1; private long download_size_max = Io_mgr.Len_mb_long * 5; private int[] download_keep_tier_ids = Int_.Ary(0); private Xobu_poll_mgr poll_mgr; private int poll_interval; private long time_bgn; @@ -66,7 +66,8 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { } // trg_mnt_itm this.trg_bin_db_max = app.Api_root().Bldr().Wiki().Import().File_db_max(); - Fsdb_db_mgr trg_db_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), wiki.Fsys_mgr().File_dir()); + Io_url trg_file_dir_v1 = String_.Eq(trg_bin_mgr__fsdb_version, "v1") ? wiki.Fsys_mgr().File_dir().GenNewNameOnly(wiki.Domain_str() + "-prv") : wiki.Fsys_mgr().File_dir(); // NOTE: convoluted way of setting trg to -prv if trg_bin_mgr__fsdb_version_v1 is set; otherwise set to "en.wikipedia.org" which will noop; DATE:2015-12-02 + Fsdb_db_mgr trg_db_mgr = Fsdb_db_mgr_.new_detect(wiki, wiki.Fsys_mgr().Root_dir(), trg_file_dir_v1); if (trg_db_mgr == null) trg_db_mgr = Fsdb_db_mgr__v2_bldr.Instance.Get_or_make(wiki, Bool_.Y); Fsm_mnt_mgr trg_mnt_mgr = new Fsm_mnt_mgr(); trg_mnt_mgr.Ctor_by_load(trg_db_mgr); trg_mnt_mgr.Mnts__get_insert_idx_(Fsm_mnt_mgr.Mnt_idx_main); // NOTE: do not delete; mnt_mgr default to Mnt_idx_user; DATE:2014-04-25 @@ -317,6 +318,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { else if (ctx.Match(k, Invk_src_bin_mgr__fsdb_skip_wkrs_)) src_bin_mgr__fsdb_skip_wkrs = m.ReadStrAry("v", "|"); else if (ctx.Match(k, Invk_src_bin_mgr__wmf_enabled_)) src_bin_mgr__wmf_enabled = m.ReadYn("v"); else if (ctx.Match(k, Invk_src_bin_mgr__cache_enabled_)) src_bin_mgr__cache_enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk_trg_bin_mgr__fsdb_version_)) trg_bin_mgr__fsdb_version = m.ReadStr("v"); else if (ctx.Match(k, Invk_poll_mgr)) return poll_mgr; else if (ctx.Match(k, Invk_download_keep_tier_ids)) download_keep_tier_ids = Int_.Ary_parse(m.ReadStr("v"), "|"); else if (ctx.Match(k, Invk_download_size_max)) download_size_max = Io_size_.To_long_by_msg_mb(m, download_size_max); @@ -331,6 +333,7 @@ public class Xob_fsdb_make_cmd extends Xob_itm_basic_base implements Xob_cmd { , Invk_src_bin_mgr__fsdb_version_ = "src_bin_mgr__fsdb_version_", Invk_src_bin_mgr__fsdb_skip_wkrs_ = "src_bin_mgr__fsdb_skip_wkrs_" , Invk_src_bin_mgr__wmf_enabled_ = "src_bin_mgr__wmf_enabled_" , Invk_src_bin_mgr__cache_enabled_ = "src_bin_mgr__cache_enabled_", Invk_ns_ids_ = "ns_ids_" + , Invk_trg_bin_mgr__fsdb_version_ = "trg_bin_mgr__fsdb_version_" , Invk_download_size_max = "download_size_max", Invk_download_keep_tier_ids = "download_keep_tier_ids" ; public static Fsdb_db_mgr new_src_bin_db_mgr(Xow_wiki wiki, String version) { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java index 7d967616c..3b21f3ce4 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_temp_wkr.java @@ -92,7 +92,7 @@ public class Xob_lnki_temp_wkr extends Xob_dump_mgr_base implements Xopg_redlink byte page_tid = Xow_page_tid.Identify(wiki.Domain_tid(), ns.Id(), ttl_bry); if (page_tid != Xow_page_tid.Tid_wikitext) return; // ignore js, css, lua, json Xoae_page page = ctx.Cur_page(); - page.Clear(); + page.Clear_all(); page.Bldr__ns_ord_(ns_ord); page.Ttl_(ttl).Revision_data().Id_(db_page.Id()); page.Redlink_lnki_list().Clear(); diff --git a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java index 790338f1c..b3f3a35f1 100644 --- a/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/filters/dansguardians/Dg_log_mgr.java @@ -68,7 +68,7 @@ class Dg_file_tbl { .Exec_insert(); } } -class Dg_rule_tbl implements RlsAble { +class Dg_rule_tbl implements Rls_able { private String tbl_name = "dg_rule"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_file_id, fld_rule_id, fld_rule_idx, fld_rule_score, fld_rule_text; private Db_conn conn; private Db_stmt stmt_insert; @@ -101,7 +101,7 @@ class Dg_rule_tbl implements RlsAble { .Exec_insert(); } } -class Dg_page_score_tbl implements RlsAble { +class Dg_page_score_tbl implements Rls_able { private String tbl_name = "dg_page_score"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_log_tid, fld_page_id, fld_page_ns, fld_page_ttl, fld_page_len, fld_page_score, fld_page_rule_count, fld_clude_type; private Db_conn conn; private Db_stmt stmt_insert; @@ -141,7 +141,7 @@ class Dg_page_score_tbl implements RlsAble { .Exec_insert(); } } -class Dg_page_rule_tbl implements RlsAble { +class Dg_page_rule_tbl implements Rls_able { private String tbl_name = "dg_page_rule"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_log_tid, fld_page_id, fld_rule_id, fld_rule_score_total; private Db_conn conn; private Db_stmt stmt_insert; diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java index 15271f121..116d435bd 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser.java @@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import gplx.core.btries.*; import gplx.core.ios.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.wikis.nss.*; +import gplx.core.btries.*; import gplx.core.ios.*; import gplx.core.times.*; +import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.wikis.nss.*; public class Xob_xml_parser { Btrie_fast_mgr trie = Xob_xml_parser_.trie_(); Bry_bfr data_bfr = Bry_bfr.new_(); DateAdp_parser date_parser = DateAdp_parser.new_(); public Xob_xml_parser Tag_len_max_(int v) {tag_len_max = v; return this;} private int tag_len_max = 255; // max size of any (a) xml tag, (b) int or (c) date; everything else goes into a data_bfr diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java index f97bb9d89..7c7f9ed9f 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_parser_tst.java @@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.bldrs.xmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; -import org.junit.*; import gplx.core.ios.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.tbls.*; +import org.junit.*; import gplx.core.ios.*; import gplx.core.times.*; +import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.tbls.*; public class Xob_xml_parser_tst { @Before public void init() { Io_mgr.Instance.InitEngine_mem(); diff --git a/400_xowa/src/gplx/xowa/drds/Xod_app.java b/400_xowa/src/gplx/xowa/drds/Xod_app.java index 838ffc515..b4baee742 100644 --- a/400_xowa/src/gplx/xowa/drds/Xod_app.java +++ b/400_xowa/src/gplx/xowa/drds/Xod_app.java @@ -16,16 +16,23 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.drds; import gplx.*; import gplx.xowa.*; -import gplx.xowa.drds.pages.*; +import gplx.xowa.drds.pages.*; import gplx.xowa.drds.files.*; import gplx.xowa.apps.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.files.gui.*; public class Xod_app { private final Xoav_app app; private final Xod_page_mgr page_mgr = new Xod_page_mgr(); + private final Xod_file_mgr file_mgr = new Xod_file_mgr(); public Xod_app(Xoav_app app) { this.app = app; } - public Xod_page_itm Get_page(String wiki_domain, String page_ttl) { - Xow_wiki wiki = app.Wiki_mgri().Get_by_key_or_make_init_y(Bry_.new_u8(wiki_domain)); + public Xow_wiki Get_wiki(String wiki_domain) { + return app.Wiki_mgri().Get_by_key_or_make_init_y(Bry_.new_u8(wiki_domain)); + } + public Xod_page_itm Get_page(Xow_wiki wiki, String page_ttl) { return page_mgr.Get_page(wiki, page_ttl); } + public void Load_files(Xow_wiki wiki, Xod_page_itm pg, Xog_js_wkr js_wkr) { + file_mgr.Load_files(wiki, pg, js_wkr); + } } diff --git a/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java b/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java index 13cc39430..9646c3883 100644 --- a/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java +++ b/400_xowa/src/gplx/xowa/drds/Xod_app_tst.java @@ -21,9 +21,9 @@ public class Xod_app_tst { private final Xod_app_tstr tstr = new Xod_app_tstr(); @Before public void init() {tstr.Init_mem();} @Test public void Get() { -// tstr.Data_mgr().Page__insert(1, "A", "2015-10-19 00:01:02"); -// tstr.Data_mgr().Html__insert(1, "abc"); -// tstr.Test__get("A", tstr.Make_page(1, "A", "2015-10-19 00:01:02", tstr.Make_section(0, 2, "", "", "abc"))); + tstr.Data_mgr().Page__insert(1, "A", "2015-10-19 00:01:02"); + tstr.Data_mgr().Html__insert(1, "abc"); + tstr.Test__get("A", tstr.Make_page(1, "A", "2015-10-19 00:01:02", tstr.Make_section(0, 2, "", "", "abc"))); } } class Xod_app_tstr { @@ -41,7 +41,8 @@ class Xod_app_tstr { Io_mgr.Instance.InitEngine_mem(); } public void Test__get(String ttl, Xod_page_itm expd) { - Xod_page_itm itm = drd_provider.Get_page("en.wikipedia.org", ttl); + Xow_wiki wiki = drd_provider.Get_wiki("en.wikipedia.org"); + Xod_page_itm itm = drd_provider.Get_page(wiki, ttl); Tfds.Eq(expd.To_str(), itm.To_str()); } public Xod_page_itm Make_page(int page_id, String ttl, String modified_on, Xoh_section_itm... section_ary) { diff --git a/400_xowa/src/gplx/xowa/drds/files/Xod_file_mgr.java b/400_xowa/src/gplx/xowa/drds/files/Xod_file_mgr.java new file mode 100644 index 000000000..f9cf57e0c --- /dev/null +++ b/400_xowa/src/gplx/xowa/drds/files/Xod_file_mgr.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.drds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.drds.*; +import gplx.core.threads.*; +import gplx.xowa.drds.pages.*; +import gplx.xowa.files.*; import gplx.xowa.files.gui.*; +import gplx.xowa.htmls.*; +public class Xod_file_mgr { + private final Gfo_thread_pool thread_pool = new Gfo_thread_pool(); + public void Load_files(Xow_wiki wiki, Xod_page_itm pg, Xog_js_wkr js_wkr) { + Xoh_page hpg = pg.Hpg(); + List_adp img_list = To_img_list(hpg.Img_mgr()); + Xof_file_wkr img_wkr = new Xof_file_wkr(wiki.File__orig_mgr(), wiki.File__bin_mgr(), wiki.File__mnt_mgr(), wiki.App().User().User_db_mgr().Cache_mgr(), wiki.File__repo_mgr(), js_wkr, hpg, img_list); + thread_pool.Add_at_end(img_wkr); + thread_pool.Run(); + } + private static List_adp To_img_list(Xoh_img_mgr img_mgr) { + List_adp rv = List_adp_.new_(); + int len = img_mgr.Len(); + for (int i = 0; i < len; ++i) + rv.Add(img_mgr.Get_at(i)); + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/drds/pages/Xod_page_itm.java b/400_xowa/src/gplx/xowa/drds/pages/Xod_page_itm.java index ef386b3c7..f42cbf50c 100644 --- a/400_xowa/src/gplx/xowa/drds/pages/Xod_page_itm.java +++ b/400_xowa/src/gplx/xowa/drds/pages/Xod_page_itm.java @@ -16,10 +16,9 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.drds.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.drds.*; -import gplx.xowa.htmls.sections.*; +import gplx.xowa.htmls.*; import gplx.xowa.htmls.sections.*; import gplx.xowa.wikis.data.tbls.*; public class Xod_page_itm { - public Xod_page_itm() {} public int Page_id() {return page_id;} private int page_id; public long Rev_id() {return rev_id;} private long rev_id; public String Ttl_text() {return ttl_text;} private String ttl_text; @@ -35,6 +34,7 @@ public class Xod_page_itm { public String Head_name() {return head_ttl;} private String head_ttl; public String First_allowed_editor_role() {return first_allowed_editor_role;} private String first_allowed_editor_role; public List_adp Section_list() {return section_list;} private List_adp section_list = List_adp_.new_(); + public Xoh_page Hpg() {return hpg;} private Xoh_page hpg; public void Init(int page_id, int rev_id , String ttl_text, String ttl_db, String redirected, String description, String modified_on , boolean is_editable, boolean is_main_page, boolean is_disambiguation, int lang_count @@ -46,8 +46,7 @@ public class Xod_page_itm { this.is_editable = is_editable; this.is_main_page = is_main_page; this.is_disambiguation = is_disambiguation; this.lang_count = lang_count; this.head_url = head_url; this.head_ttl= head_ttl; this.first_allowed_editor_role = first_allowed_editor_role; } - public void Init() {} - public void Init(Xoa_ttl ttl, Xowd_page_itm db_page) { + public void Init_by_dbpg(Xoa_ttl ttl, Xowd_page_itm db_page) { this.page_id = db_page.Id(); this.rev_id = page_id; this.ttl_text = String_.new_u8(ttl.Page_txt()); @@ -63,6 +62,9 @@ public class Xod_page_itm { this.head_ttl = null; this.first_allowed_editor_role = null; } + public void Init_by_hpg(Xoh_page hpg) { + this.hpg = hpg; + } public String To_str() { Bry_bfr bfr = Bry_bfr.new_(); bfr .Add_int_variable(page_id).Add_byte_pipe() diff --git a/400_xowa/src/gplx/xowa/drds/pages/Xod_page_mgr.java b/400_xowa/src/gplx/xowa/drds/pages/Xod_page_mgr.java index aba29dd01..243ef951b 100644 --- a/400_xowa/src/gplx/xowa/drds/pages/Xod_page_mgr.java +++ b/400_xowa/src/gplx/xowa/drds/pages/Xod_page_mgr.java @@ -21,15 +21,17 @@ import gplx.xowa.htmls.*; import gplx.xowa.htmls.sections.*; public class Xod_page_mgr { public Xod_page_itm Get_page(Xow_wiki wiki, String page_ttl) { Xod_page_itm rv = new Xod_page_itm(); + // load meta info like page_id, modified, etc Xoa_ttl ttl = wiki.Ttl_parse(Bry_.new_u8(page_ttl)); Xowd_page_itm dbpg = new Xowd_page_itm(); wiki.Data__core_mgr().Tbl__page().Select_by_ttl(dbpg, ttl.Ns(), ttl.Page_db()); - rv.Init(ttl, dbpg); + rv.Init_by_dbpg(ttl, dbpg); // load page data Xoh_page hpg = new Xoh_page(); hpg.Init(wiki, Xoa_url.new_(wiki.Domain_bry(), ttl.Page_db()), ttl, 1); + rv.Init_by_hpg(hpg); wiki.Html__hdump_mgr().Load_mgr().Load(hpg, ttl); Load_sections(rv, hpg); return rv; diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size.java b/400_xowa/src/gplx/xowa/files/Xof_img_size.java index 269146e82..4ce825147 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; +import gplx.core.bits.*; import gplx.xowa.parsers.lnkis.*; public class Xof_img_size { public int Html_w() {return html_w;} private int html_w; diff --git a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java index 0cfe84ec0..f9ed4f0ab 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java +++ b/400_xowa/src/gplx/xowa/files/Xof_img_size_tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; -import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.parsers.lnkis.*; +import org.junit.*; import gplx.core.bits.*; import gplx.xowa.files.*; import gplx.xowa.parsers.lnkis.*; public class Xof_img_size_tst { private final Xof_img_size_fxt fxt = new Xof_img_size_fxt(); @Before public void init() { diff --git a/400_xowa/src/gplx/xowa/files/Xof_patch_upright_tid_.java b/400_xowa/src/gplx/xowa/files/Xof_patch_upright_tid_.java index 14954d849..ef4f3477e 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_patch_upright_tid_.java +++ b/400_xowa/src/gplx/xowa/files/Xof_patch_upright_tid_.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.files; import gplx.*; import gplx.xowa.*; +import gplx.core.bits.*; public class Xof_patch_upright_tid_ { public static final int Tid_unpatched = 0, Tid_use_thumb_w = 1, Tid_fix_default = 2; public static final int Tid_all = Tid_use_thumb_w | Tid_fix_default; diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java index 121c2c972..095fcfbec 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_dir_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; -class Xofc_dir_tbl implements RlsAble { +class Xofc_dir_tbl implements Rls_able { private String tbl_name = "file_cache_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_id, fld_name; private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_stmt; diff --git a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java index fb4dd0418..93bff718a 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xofc_fil_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; -class Xofc_fil_tbl implements RlsAble { +class Xofc_fil_tbl implements Rls_able { private String tbl_name = "file_cache_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_uid, fld_dir_id, fld_name, fld_is_orig, fld_w, fld_h, fld_time, fld_page, fld_ext, fld_size, fld_cache_time; private Db_conn conn; private final Db_stmt_bldr stmt_bldr = new Db_stmt_bldr(); private Db_stmt select_itm_stmt, select_itm_v2_stmt; diff --git a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java index d274fc427..70fd13561 100644 --- a/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java +++ b/400_xowa/src/gplx/xowa/files/caches/Xou_cache_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.caches; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; -public class Xou_cache_tbl implements RlsAble { +public class Xou_cache_tbl implements Rls_able { private String tbl_name = "file_cache"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_lnki_wiki_abrv, fld_lnki_ttl, fld_lnki_type, fld_lnki_upright, fld_lnki_w, fld_lnki_h, fld_lnki_time, fld_lnki_page, fld_user_thumb_w diff --git a/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java b/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java index 7b210cd5e..89bb60b77 100644 --- a/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java +++ b/400_xowa/src/gplx/xowa/files/commons/Xof_commons_image_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.commons; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.dbs.*; -public class Xof_commons_image_tbl implements RlsAble { +public class Xof_commons_image_tbl implements Rls_able { private Db_stmt stmt_insert; public Db_conn Conn() {return conn;} public void Conn_(Db_conn v) { diff --git a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java index 4febd79c5..afac508c9 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/fs_roots/Orig_fil_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.files.fsdb.fs_roots; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.files.fsdb.*; import gplx.dbs.*; -public class Orig_fil_tbl implements RlsAble { +public class Orig_fil_tbl implements Rls_able { private String tbl_name = "orig_fil"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private String fld_uid, fld_name, fld_ext_id, fld_w, fld_h, fld_dir_url; private Db_conn conn; private Db_stmt stmt_insert, stmt_select; diff --git a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java index b22d693b6..9369f28a1 100644 --- a/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java +++ b/400_xowa/src/gplx/xowa/files/fsdb/tsts/Xof_file_fxt.java @@ -70,7 +70,7 @@ class Xof_file_fxt { List_adp itms_list = List_adp_.new_(); itms_list.Add(itm); orig_mgr.Find_by_list(Ordered_hash_.New_bry(), itms_list, Xof_exec_tid.Tid_wiki_page); Xoa_ttl ttl = Xoa_ttl.parse(wiki, Xow_ns_.Tid__main, ttl_bry); - Xoae_page page = Xoae_page.new_(wiki, ttl); + Xoae_page page = Xoae_page.New(wiki, ttl); fsdb_mgr.Fsdb_search_by_list(itms_list, wiki, page, Xog_js_wkr_.Noop); if (arg.Rslt_orig_exists() != Bool_.__byte) Tfds.Eq(arg.Rslt_orig_exists() == Bool_.Y_byte, itm.Orig_exists(), "orig_exists"); if (arg.Rslt_file_exists() != Bool_.__byte) Tfds.Eq(arg.Rslt_file_exists() == Bool_.Y_byte, itm.File_exists(), "file_exists"); diff --git a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java index faa45233a..44756c463 100644 --- a/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java +++ b/400_xowa/src/gplx/xowa/files/origs/Xof_orig_tbl.java @@ -19,7 +19,7 @@ package gplx.xowa.files.origs; import gplx.*; import gplx.xowa.*; import gplx.xo import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.utls.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.files.repos.*; -public class Xof_orig_tbl implements RlsAble { +public class Xof_orig_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_repo, fld_ttl, fld_status, fld_ext, fld_w, fld_h, fld_redirect; private final Db_conn conn; private final Xof_orig_tbl__in_wkr select_in_wkr = new Xof_orig_tbl__in_wkr(); diff --git a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java index 9b35e00b3..5a386b7ce 100644 --- a/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java +++ b/400_xowa/src/gplx/xowa/files/xfers/Xof_xfer_queue_html_fxt.java @@ -52,7 +52,7 @@ public class Xof_xfer_queue_html_fxt extends Xof_xfer_queue_base_fxt { ini_src_fils(); wiki.Appe().File_mgr().Wmf_mgr().Enabled_(true); wiki.File_mgr().Cfg_download().Enabled_(true); - queue.Exec(wiki, Xoae_page.new_(wiki, wiki.Ttl_parse(Bry_.new_a7("A")))); + queue.Exec(wiki, Xoae_page.New(wiki, wiki.Ttl_parse(Bry_.new_a7("A")))); tst_trg_fils(); if (this.html_orig_src != null) Tfds.Eq(this.html_orig_src , xfer_itm.Html_orig_url().To_http_file_str()); if (this.Html_view_src() != null) Tfds.Eq(this.Html_view_src(), xfer_itm.Html_view_url().To_http_file_str()); diff --git a/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java b/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java index 035ecb034..3f3d5ac71 100644 --- a/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/Xoa_gui_mgr.java @@ -81,7 +81,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_kit)) return kit; else if (ctx.Match(k, Invk_kit_)) this.kit = Gfui_kit_.Get_by_key(m.ReadStrOr("v", Gfui_kit_.Swt().Key())); - else if (ctx.Match(k, Invk_run)) Run(RlsAble_.Null); + else if (ctx.Match(k, Invk_run)) Run(Rls_able_.Null); else if (ctx.Match(k, Invk_browser_type)) kit.Cfg_set("HtmlBox", "BrowserType", gplx.gfui.Swt_kit.Cfg_Html_BrowserType_parse(m.ReadStr("v"))); else if (ctx.Match(k, Invk_xul_runner_path_)) kit.Cfg_set("HtmlBox", "XulRunnerPath", Bry_fmtr_eval_mgr_.Eval_url(app.Url_cmd_eval(), m.ReadBry("v")).Xto_api()); else if (ctx.Match(k, Invk_bnds)) return bnd_mgr; @@ -94,7 +94,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { else if (ctx.Match(k, Invk_menus)) return menu_mgr; else if (ctx.Match(k, Invk_cmds)) return cmd_mgr; else if (ctx.Match(k, Invk_url_macros)) return url_macro_mgr; - else if (ctx.Match(k, Xoue_user.Evt_lang_changed)) Lang_changed((Xol_lang_itm)m.ReadObj("v", ParseAble_.Null)); + else if (ctx.Match(k, Xoue_user.Evt_lang_changed)) Lang_changed((Xol_lang_itm)m.ReadObj("v", null)); else throw Err_.new_unhandled(k); return this; } @@ -103,7 +103,7 @@ public class Xoa_gui_mgr implements GfoEvObj, GfoInvkAble { , Invk_main_win = "main_win", Invk_browser_win = "browser_win", Invk_bnds = "bnds" , Invk_bindings = "bindings", Invk_win_opts = "win_opts", Invk_layout = "layout", Invk_html = "html" , Invk_search_suggest = "search_suggest", Invk_menus = "menus", Invk_cmds = "cmds", Invk_url_macros = "url_macros"; - public void Run(RlsAble splash_win) { + public void Run(Rls_able splash_win) { Gfo_log_bfr log_bfr = app.Log_bfr(); try { Xoa_gui_mgr ui_mgr = app.Gui_mgr(); diff --git a/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java b/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java index 24f37dd1f..4ac035435 100644 --- a/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java +++ b/400_xowa/src/gplx/xowa/guis/history/Xog_history_stack_tst.java @@ -72,7 +72,7 @@ class Xog_history_stack_fxt { public Xog_history_stack_fxt Exec_add_one(String ttl_str, String arg_str) { byte[] ttl_bry = Bry_.new_u8(ttl_str); Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); - Xoae_page page = Xoae_page.test_(wiki, ttl); + Xoae_page page = Xoae_page.New_test(wiki, ttl); byte[] url_bry = ttl_bry; if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_u8(arg_str)); Xoa_url url = app.User().Wikii().Utl__url_parser().Parse(url_bry); diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java index 143a21942..194d1f02f 100644 --- a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java +++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.guis.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.core.net.*; import gplx.core.envs.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; -import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.doms.*; +import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.doms.*; import gplx.xowa.guis.views.*; public class Xog_url_wkr { private final Xoa_url tmp_url = Xoa_url.blank(); @@ -60,12 +60,16 @@ public class Xog_url_wkr { } private Xoa_url Exec_url_file(Xoae_app app, Xowe_wiki cur_wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: file:///xowa/A.png Xowe_wiki wiki = (Xowe_wiki)page.Commons_mgr().Source_wiki_or(cur_wiki); - Io_url href_url = Io_url_.http_any_(String_.new_u8(gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(href_bry)), Op_sys.Cur().Tid_is_wnt()); + 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()); gplx.gfui.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�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, Bry_.new_u8(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__root_html_get))); - if (xowa_ttl == null) {app.Gui_mgr().Kit().Ask_ok("", "", "could not find find anchor with href in html: href=~{0}", href_bry); return Rslt_handled;} + : 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))); + if (xowa_ttl == null) { + app.Gui_mgr().Kit().Ask_ok("", "", "could not find anchor with href in html: href=~{0}", href_bry); + return Rslt_handled; + } byte[] lnki_ttl = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Decode(Xoa_ttl.Replace_spaces(Bry_.new_u8(xowa_ttl))); Xof_fsdb_itm fsdb = Xof_orig_file_downloader.Make_fsdb(wiki, lnki_ttl, img_size, url_bldr); if (!Io_mgr.Instance.ExistsFil(href_url)) { diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java b/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java index 095933480..b48e77677 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java @@ -63,7 +63,7 @@ class Xog_launcher_tabs { Xoa_url launch_url = home_wiki.Utl__url_parser().Parse_by_urlbar_or_null(launch_str); if (launch_url == null) return; Xowe_wiki launch_wiki = (Xowe_wiki)app.Wiki_mgr().Get_by_key_or_make_init_y(launch_url.Wiki_bry()); Xoa_ttl launch_ttl = Xoa_ttl.parse(launch_wiki, launch_url.Page_bry()); - Xog_tab_itm tab = win.Tab_mgr().Tabs_new_init(launch_wiki, Xoae_page.new_(launch_wiki, launch_ttl)); // WORKAROUND: set the tab to an empty page, else null ref later; DATE:2014-07-23 + Xog_tab_itm tab = win.Tab_mgr().Tabs_new_init(launch_wiki, Xoae_page.New(launch_wiki, launch_ttl)); // WORKAROUND: set the tab to an empty page, else null ref later; DATE:2014-07-23 tab.Show_url_bgn(launch_url); } public static final Xog_launcher_tabs Instance = new Xog_launcher_tabs(); Xog_launcher_tabs() {} diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java index 94d065bea..0a450ae22 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm.java @@ -141,7 +141,7 @@ public class Xog_tab_itm implements GfoInvkAble { wiki.Parser_mgr().Ctx().Cur_page_(page); if (page.Missing()) { if (wiki.Db_mgr().Save_mgr().Create_enabled()) { - page = Xoae_page.create_(wiki, ttl); + page = Xoae_page.New_edit(wiki, ttl); view_mode = Xopg_page_.Tid_edit; history_mgr.Add(page); // NOTE: must put new_page on stack so that pressing back will pop new_page, not previous page Xog_tab_itm_read_mgr.Show_page(this, page, false); diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java index c826d86e8..3ab49d539 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_itm_edit_mgr.java @@ -52,7 +52,7 @@ public class Xog_tab_itm_edit_mgr { Xog_html_itm html_itm = tab.Html_itm(); byte[] new_text = Get_new_text(tab); - Xoae_page new_page = Xoae_page.new_(wiki, page.Ttl()); + Xoae_page new_page = Xoae_page.New(wiki, page.Ttl()); new_page.Revision_data().Id_(page.Revision_data().Id()); // NOTE: page_id needed for sqlite (was not needed for xdat) new_page.Data_raw_(new_text); wiki.Parser_mgr().Parse(new_page, true); // refresh html @@ -102,7 +102,7 @@ public class Xog_tab_itm_edit_mgr { ctx.Defn_trace().Clear(); // TODO: move_me ctx.Defn_trace_(Xot_defn_trace_dbg.Instance); Xoa_ttl ttl = page.Ttl(); - Xoae_page new_page = Xoae_page.new_(wiki, ttl); + Xoae_page new_page = Xoae_page.New(wiki, ttl); byte[] data = tab.Html_itm().Get_elem_value_for_edit_box_as_bry(); new_page.Data_raw_(data); wiki.Parser_mgr().Parse(new_page, true); diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java index 8313df86a..be5e7c7ea 100644 --- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java +++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java @@ -79,7 +79,7 @@ public class Xog_tab_mgr implements GfoEvObj { Xowe_wiki cur_wiki = active_tab_is_null ? win.App().Usere().Wiki() : active_tab.Wiki(); Xoa_ttl ttl = Xoa_ttl.parse(cur_wiki, Xows_special_meta_.Itm__default_tab.Ttl_bry()); Xoa_url url = cur_wiki.Utl__url_parser().Parse_by_urlbar_or_null(ttl.Full_db_as_str()); if (url == null) throw Err_.new_("url", "invalid url", "url", url); - Xog_tab_itm rv = Tabs_new(focus, active_tab_is_null, cur_wiki, Xoae_page.new_(cur_wiki, ttl)); + Xog_tab_itm rv = Tabs_new(focus, active_tab_is_null, cur_wiki, Xoae_page.New(cur_wiki, ttl)); rv.Page_update_ui(); rv.Show_url_bgn(url); return rv; @@ -218,7 +218,7 @@ public class Xog_tab_mgr implements GfoEvObj { } public void Tabs_new_link(String link, boolean focus) { Xowe_wiki wiki = active_tab.Wiki(); - Xog_tab_itm new_tab = Tabs_new(focus, false, wiki, Xoae_page.new_(wiki, active_tab.Page().Ttl())); // NOTE: do not use ttl from link, else middle-clicking pages with anchors won't work; DATE:2015-05-03 + Xog_tab_itm new_tab = Tabs_new(focus, false, wiki, Xoae_page.New(wiki, active_tab.Page().Ttl())); // NOTE: do not use ttl from link, else middle-clicking pages with anchors won't work; DATE:2015-05-03 Xoa_url url = wiki.Utl__url_parser().Parse_by_urlbar_or_null(link); if (url == null) return; // NOTE: link must be of form domain/wiki/page; DATE:2014-05-27 new_tab.Show_url_bgn(url); if (focus) diff --git a/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java b/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java index 0fb2a13b2..3cdbb5924 100644 --- a/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java +++ b/400_xowa/src/gplx/xowa/guis/views/boots/Xog_error_win.java @@ -77,7 +77,7 @@ public class Xog_error_win extends JFrame implements GfoInvkAble { 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_safe; + Gfo_url_encoder url_encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_wnt; 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)); diff --git a/400_xowa/src/gplx/xowa/guis/views/boots/Xog_splash_win.java b/400_xowa/src/gplx/xowa/guis/views/boots/Xog_splash_win.java index 4d6f56919..03a604fb7 100644 --- a/400_xowa/src/gplx/xowa/guis/views/boots/Xog_splash_win.java +++ b/400_xowa/src/gplx/xowa/guis/views/boots/Xog_splash_win.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.guis.views.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; import gplx.xowa.guis.views.*; import java.awt.*; import java.awt.event.*; -public class Xog_splash_win implements RlsAble { +public class Xog_splash_win implements Rls_able { private SplashScreen splash; private Graphics2D graphics; private boolean graphics_init = true; public Xog_splash_win(boolean app_mode_is_gui) { diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page.java index 4f91564ee..b15c1a3ba 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page.java @@ -55,6 +55,7 @@ public class Xoh_page implements Xoa_page { } public Xoh_page Ctor_by_page(Bry_bfr tmp_bfr, Xoae_page page) { this.page_id = page.Revision_data().Id(); + this.wiki = page.Wiki(); this.body = page.Hdump_data().Body(); this.page_url = page.Url(); Xopg_html_data html_data = page.Html_data(); diff --git a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java index 5d2fac80f..891602d20 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xoh_page_wtr_wkr.java @@ -153,11 +153,11 @@ public class Xoh_page_wtr_wkr { wiki.Html_mgr().Html_wtr().Write_all(tidy_bfr, page.Wikie().Parser_mgr().Ctx(), hctx, page.Root().Data_mid(), page.Root()); // if [[Category]], render rest of html (Subcategories; Pages; Files); note that a category may have other html which requires wikitext processing - if (ns_id == Xow_ns_.Tid__category) wiki.Html_mgr().Ns_ctg().Bld_html(wiki, page, tidy_bfr); + if (ns_id == Xow_ns_.Tid__category) wiki.Html_mgr().Ns_ctg().Bld_html(wiki, page, hctx, tidy_bfr); // tidy html gplx.xowa.htmls.core.htmls.tidy.Xoh_tidy_mgr tidy_mgr = app.Html_mgr().Tidy_mgr(); - if (tidy_mgr.Enabled()) tidy_mgr.Run_tidy_html(page, tidy_bfr); + if (tidy_mgr.Enabled()) tidy_mgr.Run_tidy_html(page, tidy_bfr, !hctx.Mode_is_hdump()); // add back to main bfr bfr.Add_bfr_and_clear(tidy_bfr); diff --git a/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr.java b/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr.java index 14423b0bf..9b55ca3c2 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr.java @@ -20,20 +20,20 @@ import gplx.core.brys.fmtrs.*; import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; public class Xohp_ctg_grp_mgr { final Bry_fmtr grp_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "
" - , "
" - , " ~{grp_lbl}" - , "
    ~{grp_itms}" - , "
" - , "
" - , "
" + ( "
" + , "
" + , "~{grp_lbl}" + , "
    ~{grp_itms}" + , "
" + , "
" + , "
" ), "grp_lbl", "grp_itms") ; final Bry_fmtr itm_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , "
  • " - , " ~{itm_text}" - , "
  • " + ( "" + , "
  • " + , "~{itm_text}" + , "
  • " ), "itm_href", "itm_title", "itm_text" ); Xoh_ctg_itm_fmtr itm_mgr = new Xoh_ctg_itm_fmtr(); diff --git a/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java index 22b4bf137..4b0105210 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/Xohp_ctg_grp_mgr_tst.java @@ -23,17 +23,17 @@ public class Xohp_ctg_grp_mgr_tst { @Test public void Basic() { fxt.Init_ctgs("A", "B").Test_html(String_.Concat_lines_nl ( "
    " - , "
    " - , " Categories" - , "
      " - , "
    • " - , " A" - , "
    • " - , "
    • " - , " B" - , "
    • " - , "
    " - , "
    " + , "
    " + , "Categories" + , "
      " + , "
    • " + , "A" + , "
    • " + , "
    • " + , "B" + , "
    • " + , "
    " + , "
    " , "
    " )); } diff --git a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java index e6f3a35bc..50c87a165 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java @@ -26,10 +26,10 @@ public class Xow_html_mgr implements GfoInvkAble { Xoae_app app = wiki.Appe(); page_wtr_mgr = new Xoh_page_wtr_mgr(app.Gui_mgr().Kit().Tid() != gplx.gfui.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.Encode_to_file_protocol(file_dir.GenSubFil("play.png")); - img_media_info_btn = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys.Encode_to_file_protocol(file_dir.GenSubFil("info.png")); - img_thumb_magnify = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys.Encode_to_file_protocol(file_dir.GenSubFil("magnify-clip.png")); - img_xowa_protocol = gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys.Encode_to_file_protocol(app.Fsys_mgr().Bin_xowa_file_dir().GenSubFil_nest("app.general", "xowa_exec.png")); + 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")); portal_mgr = new Xow_portal_mgr(wiki); imgs_mgr = new Xoh_imgs_mgr(this); module_mgr = new Xow_module_mgr(wiki); diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java index 7e54b98c3..bb38eb175 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr.java @@ -23,24 +23,27 @@ public class Xow_hdump_mgr { private final Xoh_page tmp_hpg = new Xoh_page(); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private final Io_stream_zip_mgr zip_mgr = new Io_stream_zip_mgr(); public Xow_hdump_mgr(Xow_wiki wiki) { - this.save_mgr = new Xow_hdump_mgr__save(wiki, hzip_mgr, zip_mgr, tmp_hpg, tmp_bfr); + this.save_mgr = new Xow_hdump_mgr__save(wiki, hzip_mgr, zip_mgr, tmp_hpg); this.load_mgr = new Xow_hdump_mgr__load(wiki, hzip_mgr, zip_mgr, tmp_hpg, tmp_bfr); } public Xow_hdump_mgr__save Save_mgr() {return save_mgr;} private Xow_hdump_mgr__save save_mgr; public Xow_hdump_mgr__load Load_mgr() {return load_mgr;} private Xow_hdump_mgr__load load_mgr; public Xoh_hzip_mgr Hzip_mgr() {return hzip_mgr;} private final Xoh_hzip_mgr hzip_mgr = new Xoh_hzip_mgr(); public void Init_by_db(Xow_wiki wiki) { - byte default_zip_tid = gplx.core.ios.Io_stream_.Tid_raw; - boolean default_hzip_enable = false; + byte dflt_zip_tid = gplx.core.ios.Io_stream_.Tid_raw; + boolean dflt_hzip_enable = false; + boolean mode_is_b256 = false; if (wiki.Data__core_mgr() != null) { // TEST: handle null data mgr Xowd_core_db_props props = wiki.Data__core_mgr().Props(); - default_zip_tid = props.Zip_tid_html(); - default_hzip_enable = props.Hzip_enabled(); + dflt_zip_tid = props.Zip_tid_html(); + dflt_hzip_enable = props.Hzip_enabled(); +// dflt_hzip_enable = props.Hzip_enabled(); +// mode_is_b256 = true; } - Init_by_db(default_zip_tid, default_hzip_enable); + Init_by_db(dflt_zip_tid, dflt_hzip_enable, mode_is_b256); } - public void Init_by_db(byte default_zip_tid, boolean default_hzip_enable) { - int dflt_hzip_tid = default_hzip_enable ? Xoh_hzip_dict_.Hzip__v1 : Xoh_hzip_dict_.Hzip__none; - save_mgr.Init_by_db(default_zip_tid, dflt_hzip_tid); + public void Init_by_db(byte dflt_zip_tid, boolean dflt_hzip_enable, boolean mode_is_b256) { + int dflt_hzip_tid = dflt_hzip_enable ? Xoh_hzip_dict_.Hzip__v1 : Xoh_hzip_dict_.Hzip__none; + save_mgr.Init_by_db(dflt_zip_tid, dflt_hzip_tid, Bool_.N); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java index 53e7c296c..1fc4981f4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java +++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load.java @@ -25,7 +25,7 @@ public class Xow_hdump_mgr__load { private final Xoh_page tmp_hpg; private final Bry_bfr tmp_bfr; private final Xowd_page_itm tmp_dbpg = new Xowd_page_itm(); public Xow_hdump_mgr__load(Xow_wiki wiki, Xoh_hzip_mgr hzip_mgr, Io_stream_zip_mgr zip_mgr, Xoh_page tmp_hpg, Bry_bfr tmp_bfr) { this.wiki = wiki; this.hzip_mgr = hzip_mgr; this.zip_mgr = zip_mgr; this.tmp_hpg = tmp_hpg; this.tmp_bfr = tmp_bfr; - this.make_mgr = new Xoh_make_mgr(wiki.App().Usr_dlg(), wiki.App().Fsys_mgr(), gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys, wiki.Domain_bry()); + this.make_mgr = new Xoh_make_mgr(wiki.App().Usr_dlg(), wiki.App().Fsys_mgr(), gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx, wiki.Domain_bry()); } public Xoh_make_mgr Make_mgr() {return make_mgr;} private final Xoh_make_mgr make_mgr; public void Load(Xoae_page wpg) { @@ -45,13 +45,12 @@ public class Xow_hdump_mgr__load { return true; } } + public byte[] Decode_as_bry(Bry_bfr bfr, Xoh_page hpg, byte[] src, boolean mode_is_diff) {hzip_mgr.Hctx().Mode_is_diff_(mode_is_diff); hzip_mgr.Decode(bfr, wiki, hpg, src); return bfr.To_bry_and_clear();} private byte[] Parse(Xoh_page hpg, int zip_tid, int hzip_tid, byte[] src) { if (zip_tid > gplx.core.ios.Io_stream_.Tid_raw) src = zip_mgr.Unzip((byte)zip_tid, src); - if (hzip_tid == Xoh_hzip_dict_.Hzip__v1) { - hzip_mgr.Decode(tmp_bfr.Clear(), wiki, hpg, src); - src = tmp_bfr.To_bry_and_clear(); - } + if (hzip_tid == Xoh_hzip_dict_.Hzip__v1) + src = Decode_as_bry(tmp_bfr.Clear(), hpg, src, Bool_.N); return src; } private void Fill_page(Xoae_page wpg, Xoh_page hpg) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load_tst.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load_tst.java index aafca04eb..90153da64 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__load_tst.java @@ -117,7 +117,7 @@ class Xodb_hdump_mgr__base_fxt { wiki = fxt.Wiki(); page = wiki.Parser_mgr().Ctx().Cur_page(); hdump_mgr = wiki.Html__hdump_mgr(); - hdump_mgr.Init_by_db(gplx.core.ios.Io_stream_.Tid_raw, false); + hdump_mgr.Init_by_db(gplx.core.ios.Io_stream_.Tid_raw, false, false); } fxt.Reset(); page.Revision_data().Id_(0); diff --git a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java index 1a93f5d3f..555329166 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java +++ b/400_xowa/src/gplx/xowa/htmls/core/Xow_hdump_mgr__save.java @@ -16,16 +16,19 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; -import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.heads.*; +import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.heads.*; import gplx.core.ios.*; import gplx.core.primitives.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.pages.*; public class Xow_hdump_mgr__save { private final Xow_wiki wiki; private final Xoh_hzip_mgr hzip_mgr; private final Io_stream_zip_mgr zip_mgr; - private final Xoh_page tmp_hpg; private final Bry_bfr tmp_bfr; private Bool_obj_ref html_db_is_new = Bool_obj_ref.n_(); + private final Xoh_page tmp_hpg; private final Xoh_hzip_bfr tmp_bfr = Xoh_hzip_bfr.New_txt(32); private Bool_obj_ref html_db_is_new = Bool_obj_ref.n_(); private int dflt_zip_tid, dflt_hzip_tid; - public Xow_hdump_mgr__save(Xow_wiki wiki, Xoh_hzip_mgr hzip_mgr, Io_stream_zip_mgr zip_mgr, Xoh_page tmp_hpg, Bry_bfr tmp_bfr) { - this.wiki = wiki; this.hzip_mgr = hzip_mgr; this.zip_mgr = zip_mgr; this.tmp_hpg = tmp_hpg; this.tmp_bfr = tmp_bfr; + public Xow_hdump_mgr__save(Xow_wiki wiki, Xoh_hzip_mgr hzip_mgr, Io_stream_zip_mgr zip_mgr, Xoh_page tmp_hpg) { + this.wiki = wiki; this.hzip_mgr = hzip_mgr; this.zip_mgr = zip_mgr; this.tmp_hpg = tmp_hpg; } - public void Init_by_db(int dflt_zip_tid, int dflt_hzip_tid) {this.dflt_zip_tid = dflt_zip_tid; this.dflt_hzip_tid = dflt_hzip_tid;} + public void Init_by_db(int dflt_zip_tid, int dflt_hzip_tid, boolean mode_is_b256) { + this.dflt_zip_tid = dflt_zip_tid; this.dflt_hzip_tid = dflt_hzip_tid; tmp_bfr.Mode_is_b256_(mode_is_b256); + } + public byte[] Src_as_hzip() {return src_as_hzip;} private byte[] src_as_hzip; public int Save(Xoae_page page) { synchronized (tmp_hpg) { Bld_hdump(page); @@ -45,11 +48,9 @@ public class Xow_hdump_mgr__save { wiki.Html__wtr_mgr().Wkr(Xopg_page_.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); // save as hdump_fmt page.Hdump_data().Body_(tmp_bfr.To_bry_and_clear()); } - private static byte[] Write(Bry_bfr bfr, Xow_wiki wiki, Xoh_page hpg, Xoh_hzip_mgr hzip_mgr, Io_stream_zip_mgr zip_mgr, int zip_tid, int hzip_tid, byte[] src) { - if (hzip_tid == Xoh_hzip_dict_.Hzip__v1) { - hzip_mgr.Encode(bfr.Clear(), wiki, hpg, src); - src = bfr.To_bry_and_clear(); - } + private byte[] Write(Xoh_hzip_bfr bfr, Xow_wiki wiki, Xoh_page hpg, Xoh_hzip_mgr hzip_mgr, Io_stream_zip_mgr zip_mgr, int zip_tid, int hzip_tid, byte[] src) { + if (hzip_tid != Xoh_hzip_dict_.Hzip__none) src = hzip_mgr.Encode_as_bry((Xoh_hzip_bfr)bfr.Clear(), wiki, hpg, src); + src_as_hzip = src; if (zip_tid > gplx.core.ios.Io_stream_.Tid_raw) src = zip_mgr.Zip((byte)zip_tid, src); return src; diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java index ed39ac87f..cef40905b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_hdump_bldr.java @@ -16,22 +16,26 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; +import gplx.core.brys.*; import gplx.dbs.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.dbs.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.apps.apis.xowa.bldrs.imports.*; public class Xob_hdump_bldr implements GfoInvkAble { - private boolean enabled, hzip_enabled, hzip_compare; + private boolean enabled, hzip_enabled, hzip_diff, hzip_b256; private byte zip_tid = Byte_.Max_value_127; private Xowe_wiki wiki; private Xow_hdump_mgr hdump_mgr; private Xob_ns_to_db_mgr ns_to_db_mgr; int prv_row_len = 0; - private Hzip_stat_tbl stats_tbl; private Hzip_stat_itm tmp_stat_itm; - private final Xoh_page tmp_hpg = new Xoh_page(); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_mb); + private Xoh_stat_tbl stats_tbl; private Xoh_stat_itm tmp_stat_itm; + private final Xoh_page tmp_hpg = new Xoh_page(); private final Bry_bfr tmp_bfr = Bry_bfr.new_(); + private boolean op_sys_is_wnt; public boolean Init(Xowe_wiki wiki, Db_conn make_conn) { if (!enabled) return false; - this.wiki = wiki; this.hdump_mgr = wiki.Html__hdump_mgr(); this.tmp_stat_itm = hdump_mgr.Hzip_mgr().Hctx().Bicode__stat(); - this.stats_tbl = new Hzip_stat_tbl(make_conn); + this.op_sys_is_wnt = gplx.core.envs.Op_sys.Cur().Tid_is_wnt(); + this.wiki = wiki; this.hdump_mgr = wiki.Html__hdump_mgr(); this.tmp_stat_itm = hdump_mgr.Hzip_mgr().Hctx().Hzip__stat(); + this.stats_tbl = new Xoh_stat_tbl(make_conn); Xoapi_import import_cfg = wiki.Appe().Api_root().Bldr().Wiki().Import(); - hdump_mgr.Init_by_db(import_cfg.Zip_tid_html(), hzip_enabled); + if (zip_tid == Byte_.Max_value_127) zip_tid = import_cfg.Zip_tid_html(); + hdump_mgr.Init_by_db(zip_tid, hzip_enabled, hzip_b256); Xowd_db_mgr core_data_mgr = wiki.Db_mgr_as_sql().Core_data_mgr(); this.ns_to_db_mgr = new Xob_ns_to_db_mgr(new Xob_ns_to_db_wkr__html(core_data_mgr.Db__core()), core_data_mgr, import_cfg.Html_db_max()); Xob_ns_file_itm.Init_ns_bldr_data(Xowd_db_file_.Tid_html_data, wiki.Ns_mgr(), gplx.xowa.apps.apis.xowa.bldrs.imports.Xoapi_import.Ns_file_map__each); @@ -40,13 +44,11 @@ public class Xob_hdump_bldr implements GfoInvkAble { public void Insert(Xoae_page page) { page.File_queue().Clear(); // need to reset uid to 0, else xowa_file_# will resume from last wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_page_.Tid_read).Write_body(tmp_bfr, Xoh_wtr_ctx.Hdump, page); // write to html in hdump mode - byte[] html_orig_bry = tmp_bfr.To_bry_and_clear(); - page.Hdump_data().Body_(html_orig_bry); // write to body bry + byte[] orig_bry = tmp_bfr.To_bry_and_clear(); + page.Hdump_data().Body_(orig_bry); // write to body bry Xowd_db_file html_db = ns_to_db_mgr.Get_by_ns(page.Ttl().Ns().Bldr_data(), prv_row_len); // get html_db this.prv_row_len = hdump_mgr.Save_mgr().Save(tmp_hpg.Ctor_by_page(tmp_bfr, page), html_db, true); // save to db - if (hzip_compare) { - // Compare(html_orig_bry, hdump_mgr.Save_mgr()); - } + if (hzip_diff) Hzip_exec(orig_bry); stats_tbl.Insert(tmp_hpg, tmp_stat_itm, page.Root().Root_src().length, tmp_hpg.Body().length, prv_row_len); // save stats } public void Bld_term() {this.Commit(); ns_to_db_mgr.Rls_all();} @@ -54,12 +56,21 @@ public class Xob_hdump_bldr implements GfoInvkAble { ns_to_db_mgr.Commit(); // wiki_db_mgr.Tbl__cfg().Update_long(Cfg_grp_hdump_make, Cfg_itm_hdump_size, hdump_db_size); // update cfg; should happen after commit entries } + private void Hzip_exec(byte[] orig_bry) { + byte[] expd_bry = op_sys_is_wnt ? Bry_.Replace(tmp_bfr, orig_bry, Byte_ascii.Cr_lf_bry, Byte_ascii.Nl_bry) : orig_bry; + byte[] actl_bry = hdump_mgr.Load_mgr().Decode_as_bry(tmp_bfr, tmp_hpg, hdump_mgr.Save_mgr().Src_as_hzip(), Bool_.Y); + byte[][] diff = Bry_diff_.Diff_1st_line(expd_bry, actl_bry); + if (diff != null) + Gfo_usr_dlg_.Instance.Warn_many("", "", String_.Format("hzip diff: page={0} lhs='{1}' rhs='{2}'", tmp_hpg.Url_bry_safe(), diff[0], diff[1])); + } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v"); + else if (ctx.Match(k, Invk_zip_tid_)) zip_tid = m.ReadByte("v"); else if (ctx.Match(k, Invk_hzip_enabled_)) hzip_enabled = m.ReadYn("v"); - else if (ctx.Match(k, Invk_hzip_compare_)) hzip_compare = m.ReadYn("v"); + else if (ctx.Match(k, Invk_hzip_diff_)) hzip_diff = m.ReadYn("v"); + else if (ctx.Match(k, Invk_hzip_b256_)) hzip_b256 = m.ReadYn("v"); else return GfoInvkAble_.Rv_unhandled; return this; } - private static final String Invk_enabled_ = "enabled_", Invk_hzip_enabled_ = "hzip_enabled_", Invk_hzip_compare_ = "hzip_compare_"; + private static final String Invk_enabled_ = "enabled_", Invk_zip_tid_ = "zip_tid_", Invk_hzip_enabled_ = "hzip_enabled_", Invk_hzip_diff_ = "hzip_diff_", Invk_hzip_b256_ = "hzip_b256_"; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java index 271aeb96e..d14b2f2f1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/bldrs/Xob_link_dump_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.dbs.*; -class Xob_link_dump_tbl implements RlsAble { +class Xob_link_dump_tbl implements Rls_able { public static final String Tbl_name = "link_dump"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); public static final String Fld_uid = flds.Add_int_pkey_autonum("uid") diff --git a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java index 3f2d6312d..074412dd7 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_page_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.dbs.*; import gplx.core.brys.*; -public class Xoh_page_tbl implements RlsAble { +public class Xoh_page_tbl implements Rls_able { private final String tbl_name = "html"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_page_id, fld_head_flag, fld_body_flag, fld_display_ttl, fld_content_sub, fld_sidebar_div, fld_body; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update; diff --git a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java index f16b4c29c..be1eeede6 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/dbs/Xoh_redlink_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.dbs.*; -public class Xoh_redlink_tbl implements RlsAble { +public class Xoh_redlink_tbl implements Rls_able { private final String tbl_name = "html_redlink"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_page_id, fld_redlink_uids; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert, stmt_delete, stmt_update; diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_wtr_ctx.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_wtr_ctx.java index 2ff2580d0..d4f5e49bf 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_wtr_ctx.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_wtr_ctx.java @@ -17,12 +17,13 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; public class Xoh_wtr_ctx { - Xoh_wtr_ctx(byte mode) {this.mode = mode;} private byte mode; + Xoh_wtr_ctx(int mode) {this.mode = mode;} + public int Mode() {return mode;} private final int mode; public boolean Mode_is_alt() {return mode == Mode_alt;} public boolean Mode_is_display_title() {return mode == Mode_display_title;} public boolean Mode_is_popup() {return mode == Mode_popup;} public boolean Mode_is_hdump() {return mode == Mode_hdump;} - public static final byte Mode_basic = 0, Mode_alt = 1, Mode_display_title = 2, Mode_popup = 3, Mode_hdump = 4; + public static final int Mode_basic = 0, Mode_alt = 1, Mode_display_title = 2, Mode_popup = 3, Mode_hdump = 4; public static final Xoh_wtr_ctx Basic = new Xoh_wtr_ctx(Mode_basic) , Alt = new Xoh_wtr_ctx(Mode_alt) diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_mgr.java index d4ab02466..cd74316ef 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_mgr.java @@ -37,9 +37,10 @@ public class Xoh_tidy_mgr implements GfoInvkAble { : (Xoh_tidy_wkr)wkr_tidy ; } - public void Run_tidy_html(Xoae_page page, Bry_bfr bfr) { + public void Run_tidy_html(Xoae_page page, Bry_bfr bfr, boolean indent) { if (bfr.Len_eq_0()) return; // document is empty; do not exec b/c tidy will never generate files for 0 len files, and previous file will remain; DATE:2014-06-04 Tidy_wrap(bfr); + wkr.Indent_(indent); wkr.Exec_tidy(page, bfr); Tidy_unwrap(bfr); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr.java index f21d2955b..c83634556 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr.java @@ -18,5 +18,6 @@ along with this program. If not, see . package gplx.xowa.htmls.core.htmls.tidy; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.htmls.*; public interface Xoh_tidy_wkr { byte Tid(); + void Indent_(boolean v); void Exec_tidy(Xoae_page page, Bry_bfr bfr); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_.java index fbbf5283f..ccd92d4fe 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_.java @@ -38,5 +38,6 @@ public class Xoh_tidy_wkr_ { } class Xoh_tidy_wkr_null implements Xoh_tidy_wkr { public byte Tid() {return Xoh_tidy_wkr_.Tid_null;} + public void Indent_(boolean v) {} public void Exec_tidy(Xoae_page page, Bry_bfr bfr) {} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_jtidy.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_jtidy.java index 0b1456c09..a481faee9 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_jtidy.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_jtidy.java @@ -29,6 +29,7 @@ class Xoh_tidy_wkr_jtidy implements Xoh_tidy_wkr { public void tidy_init() { long bgn = Env_.TickCount(); wtr = new ByteArrayOutputStream(); + System.setProperty("line.separator", "\n"); tidy = new Tidy(); // obtain a new Tidy instance tidy.setInputEncoding("UTF-8"); // -utf8 tidy.setOutputEncoding("UTF-8"); // -utf8 @@ -55,6 +56,10 @@ class Xoh_tidy_wkr_jtidy implements Xoh_tidy_wkr { public void Init_by_app(Xoae_app app) { this.app = app; } + public void Indent_(boolean v) { + if (tidy == null) tidy_init(); // lazy create to skip tests + tidy.setIndentContent(v); + } public void Exec_tidy(Xoae_page page, Bry_bfr bfr) { if (tidy == null) tidy_init(); // lazy create to skip tests // int bfr_len = bfr.Len(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_tidy.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_tidy.java index 2fc91d967..e0fbd10a5 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_tidy.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/tidy/Xoh_tidy_wkr_tidy.java @@ -27,24 +27,26 @@ public class Xoh_tidy_wkr_tidy extends Process_adp implements Xoh_tidy_wkr { pr tidy_target = v.GenSubFil("tidy_target.html"); return super.Tmp_dir_(v); } + public void Indent_(boolean v) {Indent_val = v ? "y" : "n";} public void Exec_tidy(Xoae_page page, Bry_bfr bfr) { int bfr_len = bfr.Len(); long bgn = Env_.TickCount(); Io_mgr.Instance.SaveFilBfr(tidy_source, bfr); // saves bfr to source; clears bfr - this.Run(tidy_source.Raw(), tidy_target.Raw()); // converts source to target + this.Run(tidy_source.Raw(), tidy_target.Raw()); // converts source to target Io_mgr.Instance.LoadFilBryByBfr(tidy_target, bfr); // loads bfr by target - if (bfr.Len_eq_0()) // something went wrong; load from source + if (bfr.Len_eq_0()) // something went wrong; load from source Io_mgr.Instance.LoadFilBryByBfr(tidy_source, bfr); // loads bfr by target app.Usr_dlg().Log_many("", "", "tidy exec; elapsed=~{0} len=~{1}", Env_.TickCount_elapsed_in_frac(bgn), bfr_len); } - public static final String Args_fmt = String_.Concat // see https://meta.wikimedia.org/wiki/Data_dumps; missing numeric-entities:yes; enclose-text: yes + private static String Indent_val = "y"; + public static String Args_fmt = String_.Concat // see https://meta.wikimedia.org/wiki/Data_dumps; missing numeric-entities:yes; enclose-text: yes ( "-utf8" // default is ascii , " --force-output y" // always generate output; do not fail on error , " --quiet y" // suppress command-line header , " --tidy-mark n" // do not add tidy watermark , " --doctype ''''" // set to empty else some wikis will show paragraph text with little vertical gap; PAGE:tr.b: , " --wrap 0" // default is 80; do not limit lines to 80 chars - , " --indent y" // indent block levels + , " --indent ", Indent_val // indent block levels , " --quote-nbsp y" // preserve nbsp as entities; do not convert to Unicode character 160 , " --literal-attributes y" // do not alter whitespace chars in attributes , " --wrap-attributes n" // do not line-wrap attribute values (assume tidy will try to take a="b\nc" and change to a="b c" which may cause some fidelity issues?) diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_bldr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_bldr.java index 3758085ba..76bf00bbc 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_bldr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_bldr.java @@ -35,7 +35,7 @@ public class Xoh_lnki_bldr { public Xoh_lnki_bldr Id_(byte[] v) {this.id = Html_utl.Escape_for_atr_val_as_bry(tmp_bfr, Byte_ascii.Apos, v); return this;} public Xoh_lnki_bldr Href_(Xow_wiki wiki, byte[] bry) {return Href_(wiki.Domain_bry(), wiki.Ttl_parse(bry));} public Xoh_lnki_bldr Href_(byte[] domain_bry, Xoa_ttl ttl) { - href_wtr.Build_to_bfr(tmp_bfr, app, domain_bry, ttl, Bool_.Y); + href_wtr.Build_to_bfr(tmp_bfr, app, Xoh_wtr_ctx.Mode_popup, domain_bry, ttl); this.href = tmp_bfr.To_bry_and_clear(); return this; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_wtr_utl.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_wtr_utl.java index 3d0faf3cb..3f8ed36db 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_wtr_utl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/utls/Xoh_lnki_wtr_utl.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.htmls.utls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.htmls.*; -import gplx.langs.htmls.*; import gplx.xowa.htmls.hrefs.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.core.htmls.*; public class Xoh_lnki_wtr_utl { private final Xoa_app app; private final Xow_wiki wiki; private final Xoh_href_wtr href_wtr; private final Bry_bfr tmp_bfr = Bry_bfr.new_(255); public Xoh_lnki_wtr_utl(Xow_wiki wiki, Xoh_href_wtr href_wtr) { @@ -25,7 +25,7 @@ public class Xoh_lnki_wtr_utl { } public byte[] Bld_href(byte[] page) {return Bld_href(wiki.Domain_bry(), wiki.Ttl_parse(page));} public byte[] Bld_href(byte[] domain_bry, Xoa_ttl ttl) { - href_wtr.Build_to_bfr(tmp_bfr, app, domain_bry, ttl, Bool_.Y); + href_wtr.Build_to_bfr(tmp_bfr, app, Xoh_wtr_ctx.Mode_popup, domain_bry, ttl); return tmp_bfr.To_bry_and_clear(); } public byte[] Bld_title(byte[] text) { diff --git a/100_core/src_100_interface/gplx/ParseAble_.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict.java similarity index 81% rename from 100_core/src_100_interface/gplx/ParseAble_.java rename to 400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict.java index d997313e4..469d91269 100644 --- a/100_core/src_100_interface/gplx/ParseAble_.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict.java @@ -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 . */ -package gplx; -public class ParseAble_ { - public static final ParseAble Null = null; +package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; +public class Xoh_hzip_dict { + } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java index 721d5e055..b3f3e55a1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_dict_.java @@ -20,36 +20,15 @@ import gplx.core.primitives.*; import gplx.core.btries.*; public class Xoh_hzip_dict_ { public static final byte Escape = Byte_.By_int(27); // SERIALIZED: 27=escape byte public static final byte[] Escape_bry = Bry_.new_ints(27); // SERIALIZED - private static final byte Base85_ascii = 33; - public static final byte // SERIALIZED - Tid__space = 0 + Base85_ascii - , Tid__hdr = 1 + Base85_ascii - , Tid__lnke = 2 + Base85_ascii - , Tid__lnki = 3 + Base85_ascii - , Tid__img = 4 + Base85_ascii - , Tid__thm = 5 + Base85_ascii - , Tid__gly = 6 + Base85_ascii - , Tid__escape = 84 + Base85_ascii - ; - public static final byte[] - Bry__escape = Bry_.new_ints(Escape, Tid__escape) - , Bry__space = Bry_.new_ints(Escape, Tid__space) - , Bry__hdr = Bry_.new_ints(Escape, Tid__hdr) - , Bry__lnke = Bry_.new_ints(Escape, Tid__lnke) - , Bry__lnki = Bry_.new_ints(Escape, Tid__lnki) - , Bry__img = Bry_.new_ints(Escape, Tid__img) - , Bry__thm = Bry_.new_ints(Escape, Tid__thm) - , Bry__gly = Bry_.new_ints(Escape, Tid__gly) - ; public static final String Key__escape = "escape" - , Key__space = "space" , Key__hdr = "hdr" , Key__lnke = "lnke" , Key__lnki = "lnki" , Key__img = "img" , Key__thm = "thm" , Key__gly = "gly" + , Key__xnde = "xnde" ; public static final int Hzip__none = 0, Hzip__v1 = 1; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int.java new file mode 100644 index 000000000..5dca7d819 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int.java @@ -0,0 +1,148 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; +import gplx.core.primitives.*; import gplx.core.encoders.*; +public class Xoh_hzip_int { + private boolean mode_is_b256; private byte pad_byte; private byte[] prefix_ary; + public Xoh_hzip_int Mode_is_b256_(boolean v) { + mode_is_b256 = v; + if (mode_is_b256) { + pad_byte = Byte_.Zero; + prefix_ary = prefix_ary__b256; + } + else { + pad_byte = Byte_ascii.Bang; + prefix_ary = prefix_ary__b085; + } + return this; + } + public void Encode(int reqd_len, Bry_bfr bfr, int val) { + int calc_len = Calc_len(mode_is_b256, val); + int full_len = Full_len(mode_is_b256, val, calc_len, reqd_len, B256__pow__ary); + int hdr_adj = full_len == calc_len || full_len == reqd_len ? 0 : 1; + int bfr_len = bfr.Len(); + bfr.Add_byte_repeat(pad_byte, full_len); // fill with 0s; asserts that underlying array will be large enough for following write + byte[] bfr_bry = bfr.Bfr(); // NOTE: set bry reference here b/c Add_byte_repeat may create a new one + if (mode_is_b256) + Set_bry(val, bfr_bry, bfr_len + hdr_adj, reqd_len, calc_len, pad_byte, B256__pow__ary); + else + Base85_.Set_bry(val, bfr_bry, bfr_len + hdr_adj, reqd_len); // calc base85 val for val; EX: 7224 -> "uu" + if (hdr_adj == 1) + bfr_bry[bfr_len] = prefix_ary[full_len]; // write the hdr_byte; EX: 256 -> 253, 1, 0 where 253 is the hdr_byte + } + public int Decode(int reqd_len, byte[] src, int src_len, int src_bgn, Int_obj_ref pos_ref) { + int radix = 256; byte offset = Byte_.Zero; + boolean hdr_byte_exists = false; + int full_len = 1; // default to 1 + byte b0 = src[src_bgn]; + if (mode_is_b256) { + switch (b0) { + case prefix__b256__2: full_len = 2; hdr_byte_exists = true; break; + case prefix__b256__3: full_len = 3; hdr_byte_exists = true; break; + case prefix__b256__4: full_len = 4; hdr_byte_exists = true; break; + case prefix__b256__5: full_len = 5; hdr_byte_exists = true; break; + } + } + else { + radix = 85; offset = Byte_ascii.Bang; + switch (b0) { + case Byte_ascii.Curly_bgn : full_len = 3; hdr_byte_exists = true; break; + case Byte_ascii.Pipe : full_len = 4; hdr_byte_exists = true; break; + case Byte_ascii.Curly_end : full_len = 5; hdr_byte_exists = true; break; + case Byte_ascii.Tilde : full_len = 6; hdr_byte_exists = true; break; + } + } + if (full_len < reqd_len) full_len = reqd_len; // len should be padded + int src_end = src_bgn + full_len; + pos_ref.Val_(src_end); + if (hdr_byte_exists) ++src_bgn; + return To_int_by_bry(src, src_bgn, src_end, offset, radix); + } + private static int Calc_len(boolean mode_is_b256, int v) { + if (mode_is_b256) { + if (v < B256__max__expd__1) return 1; + else if (v < B256__max__expd__2) return 2; + else if (v < B256__max__expd__3) return 3; + else return 4; + } + else + return Base85_.Bry_len(v); + } + private static int Full_len(boolean mode_is_b256, int v, int calc_len, int reqd_len, int[] pow_ary) { + int reqd_max = v; + if (mode_is_b256) { + reqd_max = B256__pow__ary[reqd_len]; // EX: if reqd_len = 2, then reqd_max = 65536 + int hdr_byte_adj = 1; // default to hdr_byte + if ( calc_len == reqd_len // only do this check if calc_len == reqd_len; i.e.: reqd_len = 2; only want to check values that would be represented with two digits where 1st digit might be 252-255; EX: 64512 is "252, 0" but 252 is reserverd; instead "253, 252, 0" + && v < (reqd_max - (4 * B256__pow__ary[calc_len - 1])) // calculates if current value will produce a 252-255 range in the 1st byte; note that 4 is for 255-252 + ) { + hdr_byte_adj = 0; + } + return calc_len + hdr_byte_adj; + } + else { + reqd_max = Base85_.Pow85[reqd_len]; + if (v < reqd_max) return reqd_len; + if (v < Base85_.Pow85[2]) return 3; + else if (v < Base85_.Pow85[3]) return 4; + else if (v < Base85_.Pow85[4]) return 5; + else return 6; + } + } + private static void Set_bry(int val, byte[] src, int src_bgn, int reqd_len, int calc_len, byte pad_byte, int[] pow_ary) { + int val_len = -1, pad_len = -1; + boolean pad = calc_len < reqd_len; + if (pad) { + val_len = reqd_len; + pad_len = reqd_len - calc_len; + } + else { + val_len = calc_len; + pad_len = 0; + } + if (pad) { + for (int i = 0; i < pad_len; i++) // fill src with pad_len + src[i + src_bgn] = pad_byte; + } + for (int i = val_len - pad_len; i > 0; --i) { + int div = pow_ary[i - 1]; + byte tmp = (byte)(val / div); + src[src_bgn + val_len - i] = (byte)(tmp + pad_byte); + val -= tmp * div; + } + } + private static int To_int_by_bry(byte[] src, int bgn, int end, byte offset, int radix) { + int rv = 0, factor = 1; + for (int i = end - 1; i >= bgn; --i) { + rv += ((src[i] & 0xFF) - offset) * factor; // PATCH.JAVA:need to convert to unsigned byte + factor *= radix; + } + return rv; + } + private static final int + B256__max__expd__1 = 256 // 256 + , B256__max__expd__2 = 65536 // 65,536 + , B256__max__expd__3 = 16777216 // 16,777,216 + ; + private static final int[] B256__pow__ary = new int[] {1, B256__max__expd__1, B256__max__expd__2, B256__max__expd__3, Int_.Max_value}; + private static final byte prefix__b256__2 = (byte)(252 & 0xFF), prefix__b256__3 = (byte)(253 & 0xFF), prefix__b256__4 = (byte)(254 & 0xFF), prefix__b256__5 = (byte)(255 & 0xFF); + private static final byte[] + prefix_ary__b256 = new byte[] {0, 0, prefix__b256__2, prefix__b256__3, prefix__b256__4, prefix__b256__5} + , prefix_ary__b085 = new byte[] {0, 0, 0, Byte_ascii.Curly_bgn, Byte_ascii.Pipe, Byte_ascii.Curly_end, Byte_ascii.Tilde} + ; +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int_tst.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int_tst.java new file mode 100644 index 000000000..c1e7f0bb8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_int_tst.java @@ -0,0 +1,86 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; +import org.junit.*; +public class Xoh_hzip_int_tst { + private final Xoh_hzip_int_fxt fxt = new Xoh_hzip_int_fxt(); + @Test public void B256__reqd__1() { + fxt.Init__b256(); + fxt.Test__b256(1, 0 , 0); + fxt.Test__b256(1, 252 , 252, 252); + fxt.Test__b256(1, 253 , 252, 253); + fxt.Test__b256(1, 254 , 252, 254); + fxt.Test__b256(1, 255 , 252, 255); + fxt.Test__b256(1, 256 , 253, 1, 0); + fxt.Test__b256(1, 65535 , 253, 255, 255); + fxt.Test__b256(1, 65536 , 254, 1, 0, 0); + fxt.Test__b256(1, 16777216 , 255, 1, 0, 0, 0); + } + @Test public void B256__reqd__2() { + fxt.Init__b256(); + fxt.Test__b256(2, 0 , 0, 0); + fxt.Test__b256(2, 252 , 0, 252); + fxt.Test__b256(2, 253 , 0, 253); + fxt.Test__b256(2, 254 , 0, 254); + fxt.Test__b256(2, 255 , 0, 255); + fxt.Test__b256(2, 256 , 1, 0); + fxt.Test__b256(2, 64511 , 251, 255); + fxt.Test__b256(2, 64512 , 253, 252, 0); + fxt.Test__b256(2, 65535 , 253, 255, 255); + fxt.Test__b256(2, 65536 , 254, 1, 0, 0); + fxt.Test__b256(2, 16777216 , 255, 1, 0, 0, 0); + } + @Test public void B085__reqd__1() { + fxt.Init__b085(); + fxt.Test__b085(1, 0, "!"); + fxt.Test__b085(1, 84, "u"); + fxt.Test__b085(1, 85, "{\"!"); + fxt.Test__b085(1, 7225, "|\"!!"); + fxt.Test__b085(1, 614125, "}\"!!!"); + fxt.Test__b085(1, 52200625, "~\"!!!!"); + } + @Test public void B085__reqd__2() { + fxt.Init__b085(); + fxt.Test__b085(2, 0, "!!"); + fxt.Test__b085(2, 84, "!u"); + fxt.Test__b085(2, 85, "\"!"); + fxt.Test__b085(2, 7225, "|\"!!"); + fxt.Test__b085(2, 614125, "}\"!!!"); + fxt.Test__b085(2, 52200625, "~\"!!!!"); + } +} +class Xoh_hzip_int_fxt { + private final Bry_bfr bfr = Bry_bfr.new_(); + private final gplx.core.primitives.Int_obj_ref count_ref = gplx.core.primitives.Int_obj_ref.neg1_(); + private final Xoh_hzip_int hzint = new Xoh_hzip_int(); + public void Init__b256() {hzint.Mode_is_b256_(Bool_.Y);} + public void Init__b085() {hzint.Mode_is_b256_(Bool_.N);} + public void Test__b256(int reqd, int val, int... expd_ints) { + hzint.Encode(reqd, bfr, val); + byte[] actl = bfr.To_bry_and_clear(); + byte[] expd = Byte_.Ary_by_ints(expd_ints); + Tfds.Eq_ary(expd, actl, Int_.To_str(val)); + Tfds.Eq(val, hzint.Decode(reqd, actl, actl.length, 0, count_ref)); + } + public void Test__b085(int reqd, int val, String expd) { + hzint.Encode(reqd, bfr, val); + byte[] actl = bfr.To_bry_and_clear(); + Tfds.Eq(expd, String_.new_u8(actl)); + Tfds.Eq(val, hzint.Decode(reqd, actl, actl.length, 0, count_ref)); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_mgr.java index 6d8b9962b..41619002c 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_mgr.java @@ -16,43 +16,57 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.btries.*; import gplx.xowa.wikis.ttls.*; -import gplx.langs.htmls.parsers.*; -import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.*; -public class Xoh_hzip_mgr { - private final Xoh_hdoc_parser hdoc_parser = new Xoh_hdoc_parser(new Xoh_hdoc_wkr__hzip()); +import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.btries.*; import gplx.core.threads.poolables.*; +import gplx.langs.htmls.parsers.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.*; +import gplx.xowa.wikis.ttls.*; +public class Xoh_hzip_mgr implements Xoh_hzip_wkr { + private final Xoh_hdoc_wkr hdoc_wkr = new Xoh_hdoc_wkr__hzip(); + private final Xoh_hdoc_parser hdoc_parser; private final Bry_rdr rdr = new Bry_rdr().Dflt_dlm_(Xoh_hzip_dict_.Escape); + public Xoh_hzip_mgr() {this.hdoc_parser = new Xoh_hdoc_parser(hdoc_wkr);} + public String Key() {return "root";} + public byte[] Hook() {return hook;} private byte[] hook; public Xoh_hdoc_ctx Hctx() {return hctx;} private final Xoh_hdoc_ctx hctx = new Xoh_hdoc_ctx(); public void Init_by_app(Xoa_app app) {hctx.Init_by_app(app);} - public void Encode(Bry_bfr bfr, Xow_wiki wiki, Xoh_page hpg, byte[] src) { + public byte[] Encode_as_bry(Xoh_hzip_bfr bfr, Xow_wiki wiki, Xoh_page hpg, byte[] src) {Encode(bfr, wiki, hpg, src); return bfr.To_bry_and_clear();} + public Gfo_poolable_itm Encode(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) {throw Err_.new_unimplemented();} + public void Encode(Xoh_hzip_bfr bfr, Xow_wiki wiki, Xoh_page hpg, byte[] src) { hctx.Init_by_page(wiki, hpg.Url_bry_safe()); hdoc_parser.Parse(bfr, hpg, hctx, src); } public void Decode(Bry_bfr bfr, Xow_wiki wiki, Xoh_page hpg, byte[] src) { - byte[] page_url = hpg.Url_bry_safe(); + byte[] page_url = hpg.Url_bry_safe(); int src_len = src.length; hctx.Init_by_page(wiki, page_url); - int pos = 0, txt_bgn = -1, src_len = src.length; rdr.Init_by_page(page_url, src, src_len); - while (pos < src_len) { - if (src[pos] == Xoh_hzip_dict_.Escape) { - if (txt_bgn != -1) {bfr.Add_mid(src, txt_bgn, pos); txt_bgn = -1;} // handle pending txt - int nxt_pos = pos + 1; if (nxt_pos == src_len) break; // handle escape at end of document - Xoh_hzip_wkr wkr = hctx.Mkr().Hzip__wkr(src[nxt_pos]); - try { - rdr.Init_by_hook(wkr.Key(), pos, pos + 2); - wkr.Decode(bfr, Bool_.Y, hctx, hpg, rdr, src, pos); - pos = rdr.Pos(); - } catch (Exception e) { - wkr.Pool__rls(); - gplx.langs.htmls.Html_utl.Log(e, "hzip decode failed", hpg.Url_bry_safe(), src, pos); - pos += 2; // 2: skip escape and hook - } - } - else { + Decode(bfr, hdoc_wkr, hctx, hpg, Bool_.Y, rdr, src, 0, src_len); + } + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { + int pos = src_bgn, txt_bgn = -1; + while (true) { + if (pos == src_end) break; + byte b = src[pos]; + Object o = hctx.Wkr_mkr().Get(b, src, pos, src_end); + if (o == null) { if (txt_bgn == -1) txt_bgn = pos; ++pos; } + else { + if (txt_bgn != -1) {bfr.Add_mid(src, txt_bgn, pos); txt_bgn = -1;} // handle pending txt + Xoh_hzip_wkr wkr = (Xoh_hzip_wkr)o; + try { + rdr.Init_by_sect(wkr.Key(), pos, pos + 2); + wkr.Decode(bfr, hdoc_wkr, hctx, hpg, Bool_.Y, rdr, src, pos, src_end); + pos = rdr.Pos(); + } catch (Exception e) { + gplx.langs.htmls.Html_utl.Log(e, "hzip decode failed", hpg.Url_bry_safe(), src, pos); + pos += 2; // 2: skip escape and hook + } + finally {wkr.Pool__rls();} + } } - if (txt_bgn != -1) bfr.Add_mid(src, txt_bgn, src_len); - } + if (txt_bgn != -1) bfr.Add_mid(src, txt_bgn, src_end); + return src_end; + } + 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_hzip_mgr rv = new Xoh_hzip_mgr(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_wkr.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_wkr.java index d8859121f..1b3158ec3 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_wkr.java @@ -16,9 +16,11 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -import gplx.core.brys.*; +import gplx.core.brys.*; import gplx.core.threads.poolables.*; import gplx.xowa.htmls.core.wkrs.*; public interface Xoh_hzip_wkr extends gplx.core.threads.poolables.Gfo_poolable_itm { String Key(); - int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx ctx, Xoh_page hpg, Bry_rdr parser, byte[] src, int hook_bgn); + byte[] Hook(); + Gfo_poolable_itm Encode(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); + int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_wkr_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_wkr_mgr.java new file mode 100644 index 000000000..c880731fa --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_wkr_mgr.java @@ -0,0 +1,58 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; +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.imgs.*; import gplx.xowa.htmls.core.wkrs.thms.*; import gplx.xowa.htmls.core.wkrs.glys.*; +public class Xoh_hzip_wkr_mgr { + private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); + private Gfo_poolable_mgr mkr__escape, mkr__lnke, mkr__lnki, mkr__hdr, mkr__img, mkr__thm, mkr__gly; + public Xoh_escape_hzip Mw__escape() {return (Xoh_escape_hzip) mkr__escape.Get_fast();} + public Xoh_hdr_hzip Mw__hdr() {return (Xoh_hdr_hzip) mkr__hdr.Get_fast();} + public Xoh_lnke_hzip Mw__lnke() {return (Xoh_lnke_hzip) mkr__lnke.Get_fast();} + public Xoh_lnki_hzip Mw__lnki() {return (Xoh_lnki_hzip) mkr__lnki.Get_fast();} + public Xoh_img_hzip Mw__img() {return (Xoh_img_hzip) mkr__img.Get_fast();} + public Xoh_thm_hzip Mw__thm() {return (Xoh_thm_hzip) mkr__thm.Get_fast();} + public Xoh_gly_hzip Mw__gly() {return (Xoh_gly_hzip) mkr__gly.Get_fast();} + public void Init() { + this.Reg_all(false, Byte_ascii.Escape); + } + public Xoh_hzip_wkr Get(byte b, byte[] src, int src_bgn, int src_end) { + Object mgr_obj = trie.Match_bgn_w_byte(b, src, src_bgn, src_end); if (mgr_obj == null) return null; + 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 escape__mw) { + mkr__escape = Reg(New_hook_len2(mode_is_b256, escape__mw, 84), new Xoh_escape_hzip()); + mkr__hdr = Reg(New_hook_len2(mode_is_b256, escape__mw, 1), new Xoh_hdr_hzip()); + mkr__lnke = Reg(New_hook_len2(mode_is_b256, escape__mw, 2), new Xoh_lnke_hzip()); + mkr__lnki = Reg(New_hook_len2(mode_is_b256, escape__mw, 3), new Xoh_lnki_hzip()); + mkr__img = Reg(New_hook_len2(mode_is_b256, escape__mw, 4), new Xoh_img_hzip()); + mkr__thm = Reg(New_hook_len2(mode_is_b256, escape__mw, 5), new Xoh_thm_hzip()); + mkr__gly = Reg(New_hook_len2(mode_is_b256, escape__mw, 6), new Xoh_gly_hzip()); + } + private Gfo_poolable_mgr Reg(byte[] hook, Gfo_poolable_itm proto) { + Gfo_poolable_mgr rv = Gfo_poolable_mgr_.New(1, 32, proto, Object_.Ary(hook)); + trie.Add_obj(hook, rv); + return rv; + } + private static byte[] New_hook_len2(boolean mode_is_b256, int b0, int b1) { + return Bry_.new_ints(b0, mode_is_b256 ? b1 : b1 + Byte_ascii.Bang); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Hzip_stat_itm.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_itm.java similarity index 80% rename from 400_xowa/src/gplx/xowa/htmls/core/hzips/Hzip_stat_itm.java rename to 400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_itm.java index 0ad5f31d2..554c4cea1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Hzip_stat_itm.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_itm.java @@ -16,13 +16,14 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -public class Hzip_stat_itm { +import gplx.xowa.htmls.core.wkrs.lnkes.*; +public class Xoh_stat_itm { public void Clear() { a_rhs = lnki_text_n = lnki_text_y = lnke__free = lnke__auto = lnke__text = 0; hdr_1 = hdr_2 = hdr_3 = hdr_4 = hdr_5 = hdr_6 = 0; img_full = 0; space = 0; - escape = 0; + Bry_.Clear(escape_bry); } public int A_rhs() {return a_rhs;} public void A_rhs_add() {++a_rhs;} private int a_rhs; public int Lnki_text_n() {return lnki_text_n;} public void Lnki_text_n_add() {++lnki_text_n;} private int lnki_text_n; @@ -38,7 +39,7 @@ public class Hzip_stat_itm { public int Hdr_5() {return hdr_5;} private int hdr_5; public int Hdr_6() {return hdr_6;} private int hdr_6; public int Space() {return space;} public void Space_add(int v) {space += v;} private int space; - public int Escape() {return escape;} public void Escape_add_one() {++escape;} private int escape; + public byte[] Escape_bry() {return escape_bry;} public void Escape_add(byte v) {escape_bry[v] += 1;} private final byte[] escape_bry = new byte[256]; public void Hdr_add(int hdr_num) { switch (hdr_num) { case 1: ++hdr_1; break; @@ -50,4 +51,13 @@ public class Hzip_stat_itm { default: throw Err_.new_unhandled(hdr_num); } } + public void Lnki_add(int orig_len, int hzip_len, int flag) { + } + public void Lnke_add(byte lnke_type) { + switch (lnke_type) { + case Xoh_lnke_dict_.Type__free: ++lnke__free; break; + case Xoh_lnke_dict_.Type__auto: ++lnke__auto; break; + case Xoh_lnke_dict_.Type__text: ++lnke__text; break; + } + } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Hzip_stat_tbl.java b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java similarity index 94% rename from 400_xowa/src/gplx/xowa/htmls/core/hzips/Hzip_stat_tbl.java rename to 400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java index b53cf24f1..ccaa6721c 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Hzip_stat_tbl.java +++ b/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_stat_tbl.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.xowa.htmls.core.makes.imgs.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.wikis.pages.*; -public class Hzip_stat_tbl implements RlsAble { +public class Xoh_stat_tbl implements Rls_able { private static final String tbl_name = "hdump_stats"; private static final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private static final String fld_page_id = flds.Add_int_pkey("page_id"), fld_wtxt_len = flds.Add_int("wtxt_len"), fld_row_orig_len = flds.Add_int("row_orig_len"), fld_row_zip_len = flds.Add_int("row_zip_len") @@ -30,7 +30,7 @@ public class Hzip_stat_tbl implements RlsAble { , fld_img_full = flds.Add_int("img_full") ; private final Db_conn conn; private Db_stmt stmt_insert; - public Hzip_stat_tbl(Db_conn conn) { + public Xoh_stat_tbl(Db_conn conn) { this.conn = conn; this.Create_tbl(); conn.Stmt_delete(tbl_name).Exec_delete(); // always zap table @@ -40,7 +40,7 @@ public class Hzip_stat_tbl implements RlsAble { public void Rls() { stmt_insert = Db_stmt_.Rls(stmt_insert); } - public void Insert(Xoh_page hpg, Hzip_stat_itm hzip, int wtxt_len, int row_orig_len, int row_zip_len) { + public void Insert(Xoh_page hpg, Xoh_stat_itm hzip, int wtxt_len, int row_orig_len, int row_zip_len) { Xopg_module_mgr js_mgr = hpg.Head_mgr(); if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds); stmt_insert.Clear() diff --git a/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr.java index ee2ded9ae..524390fd8 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/makes/Xoh_make_mgr.java @@ -23,7 +23,7 @@ import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.ttls.*; import gplx.xow import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.hzips.*; public class Xoh_make_mgr { - private final Bry_bfr bfr = Bry_bfr.reset_(255), tmp_bfr = Bry_bfr.reset_(255); private final Bry_rdr_old bry_rdr = new Bry_rdr_old(); private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance; + private final Xoh_hzip_bfr bfr = Xoh_hzip_bfr.New_txt(255); private final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); private final Bry_rdr_old bry_rdr = new Bry_rdr_old(); private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance; private Xoh_cfg_file cfg_file; private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); private Xoh_file_html_fmtr__base html_fmtr; private final byte[] root_dir, file_dir; private byte[] file_dir_comm, file_dir_wiki, hiero_img_dir; private final byte[] wiki_domain; private final Bry_rdr parser = new Bry_rdr(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java index d9df0b4db..689f1cfbb 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_ctx.java @@ -16,7 +16,8 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; -import gplx.xowa.htmls.core.wkrs.mkrs.*; import gplx.xowa.htmls.core.hzips.*; +import gplx.xowa.apps.urls.*; +import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.files.*; import gplx.xowa.apps.fsys.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.apps.metas.*; public class Xoh_hdoc_ctx { @@ -27,29 +28,34 @@ public class Xoh_hdoc_ctx { public Xoa_app App() {return app;} private Xoa_app app; public byte[] Wiki__domain_bry() {return wiki__domain_bry;} private byte[] wiki__domain_bry; public Xow_ttl_parser Wiki__ttl_parser() {return wiki__ttl_parser;} private Xow_ttl_parser wiki__ttl_parser; + public Xoa_url_parser Wiki__url_parser() {return wiki__url_parser;} private Xoa_url_parser wiki__url_parser; + public boolean Xwiki_mgr__missing(byte[] domain){return app.Xwiki_mgr__missing(domain);} public Xoa_file_mgr File__mgr() {return file__mgr;} private final Xoa_file_mgr file__mgr = new Xoa_file_mgr(); - public Xof_url_bldr File__url_bldr() {return file__url_bldr;} private Xof_url_bldr file__url_bldr = new Xof_url_bldr(); - public Xoh_hdoc_mkr Mkr() {return mkr;} private Xoh_hdoc_mkr mkr = new Xoh_hdoc_mkr(); - public byte[] Page__url() {return page__url;} private byte[] page__url; - public Hzip_stat_itm Bicode__stat() {return bicode__stat;} private final Hzip_stat_itm bicode__stat = new Hzip_stat_itm(); + public Xof_url_bldr File__url_bldr() {return file__url_bldr;} private final Xof_url_bldr file__url_bldr = new Xof_url_bldr(); + public Xoh_hzip_wkr_mgr Wkr_mkr() {return wkr_mgr;} private final Xoh_hzip_wkr_mgr wkr_mgr = new Xoh_hzip_wkr_mgr(); + public byte[] Page__url() {return page__url;} private byte[] page__url; + public Xoh_stat_itm Hzip__stat() {return hzip__stat;} private final Xoh_stat_itm hzip__stat = new Xoh_stat_itm(); public int Lnki__uid__nxt() {return ++lnki__uid;} private int lnki__uid; // NOTE: should be 0, but for historical reasons, 1st lnki starts at 2; EX: id='xowa_lnki_2' + public boolean Mode_is_diff() {return mode_is_diff;} private boolean mode_is_diff; public void Mode_is_diff_(boolean v) {mode_is_diff = v;} public void Init_by_app(Xoa_app app) { Xoa_fsys_mgr fsys_mgr = app.Fsys_mgr(); this.app = app; this.fsys__root = fsys_mgr.Root_dir().To_http_file_bry(); this.fsys__file = fsys_mgr.File_dir().To_http_file_bry(); this.fsys__file__comm = Bry_.Add(fsys__file, Xow_domain_itm_.Bry__commons, Byte_ascii.Slash_bry); + wkr_mgr.Init(); } public void Init_by_page(Xow_wiki wiki, byte[] page_url) { if (fsys__root == null) Init_by_app(wiki.App()); // LAZY INIT + this.wiki__url_parser = wiki.Utl__url_parser(); this.wiki__ttl_parser = wiki; this.wiki__domain_bry = wiki.Domain_bry(); this.fsys__file__wiki = Bry_.Add(fsys__file, wiki__domain_bry, Byte_ascii.Slash_bry); this.page__url = page_url; this.Clear(); - } + } private void Clear() { - bicode__stat.Clear(); + hzip__stat.Clear(); this.lnki__uid = 1; // NOTE: should be 0, but for historical reasons, 1st lnki starts at 2; EX: id='xowa_lnki_2' } public static final int Invalid = -1; diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_parser.java index 4821f75d3..9027cf439 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_parser.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.langs.htmls.parsers.*; import gplx.xowa.wikis.ttls.*; -import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.tags.*; import gplx.xowa.htmls.core.wkrs.txts.*; import gplx.xowa.htmls.core.wkrs.escapes.*; import gplx.xowa.htmls.core.wkrs.spaces.*; +import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.tags.*; import gplx.xowa.htmls.core.wkrs.txts.*; import gplx.xowa.htmls.core.wkrs.escapes.*; public class Xoh_hdoc_parser { private final Xoh_hdoc_wkr hdoc_wkr; private final Html_doc_parser hdoc_parser; @@ -27,11 +27,10 @@ public class Xoh_hdoc_parser { this.tag_parser = new Xoh_tag_parser(hdoc_wkr); this.hdoc_parser = new Html_doc_parser(new Xoh_txt_parser(hdoc_wkr) , tag_parser - , new Xoh_escape_parser(hdoc_wkr) - , new Xoh_space_parser(hdoc_wkr) + , new Xoh_escape_data(hdoc_wkr) ); } - public void Parse(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src) { + public void Parse(Xoh_hzip_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src) { int src_len = src.length; tag_parser.Init(hctx, src, 0, src_len); hdoc_wkr.On_new_page(bfr, hpg, hctx, src, 0, src_len); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr.java index d1c57116f..d28e494a5 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr.java @@ -19,14 +19,13 @@ package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gpl import gplx.langs.htmls.parsers.*; import gplx.xowa.wikis.ttls.*; public interface Xoh_hdoc_wkr { - void On_new_page(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, int src_bgn, int src_end); + void On_new_page(Xoh_hzip_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, int src_bgn, int src_end); void On_escape (int rng_bgn, int rng_end); void On_txt (int rng_bgn, int rng_end); - void On_space (int rng_bgn, int rng_end); - void On_hdr (gplx.xowa.htmls.core.wkrs.hdrs.Xoh_hdr_parser arg); - void On_lnke (gplx.xowa.htmls.core.wkrs.lnkes.Xoh_lnke_parser arg); - void On_lnki (gplx.xowa.htmls.core.wkrs.lnkis.Xoh_lnki_parser arg); - void On_img (gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_parser arg); - void On_thm (gplx.xowa.htmls.core.wkrs.thms.Xoh_thm_parser arg); - void On_gly (gplx.xowa.htmls.core.wkrs.glys.Xoh_gly_grp_parser arg); + void On_hdr (gplx.xowa.htmls.core.wkrs.hdrs.Xoh_hdr_parser parser); + void On_lnke (gplx.xowa.htmls.core.wkrs.lnkes.Xoh_lnke_parser parser); + void On_lnki (gplx.xowa.htmls.core.wkrs.lnkis.Xoh_lnki_parser parser); + void On_img (gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_parser parser); + void On_thm (gplx.xowa.htmls.core.wkrs.thms.Xoh_thm_parser parser); + void On_gly (gplx.xowa.htmls.core.wkrs.glys.Xoh_gly_grp_parser parser); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java index cf0dc8aaa..6aa43bae3 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__hzip.java @@ -19,19 +19,19 @@ package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gpl import gplx.langs.htmls.parsers.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.wikis.ttls.*; public class Xoh_hdoc_wkr__hzip implements Xoh_hdoc_wkr { - private final Hzip_stat_itm stat_itm = new Hzip_stat_itm(); - private Bry_bfr bfr; private Xoh_hdoc_ctx hctx; private byte[] src; private int src_end; - public void On_new_page(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, int src_bgn, int src_end) { - this.bfr = bfr; this.hctx = hctx; this.src = src; this.src_end = src_end; + private final Xoh_stat_itm stat_itm = new Xoh_stat_itm(); + private Xoh_hzip_bfr bfr; private Xoh_hdoc_ctx hctx; private byte[] src; + private Xoh_page hpg; + public void On_new_page(Xoh_hzip_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, int src_bgn, int src_end) { + this.bfr = bfr; this.hpg = hpg; this.hctx = hctx; this.src = src; stat_itm.Clear(); } - public void On_txt (int rng_bgn, int rng_end) {bfr.Add_mid(src, rng_bgn, rng_end);} - public void On_escape (int rng_bgn, int rng_end) {hctx.Mkr().Escape__hzip().Encode(bfr, stat_itm).Pool__rls();} - public void On_space (int rng_bgn, int rng_end) {hctx.Mkr().Space__hzip().Encode(bfr, stat_itm, src, src_end, rng_bgn, rng_end).Pool__rls();} - public void On_hdr (gplx.xowa.htmls.core.wkrs.hdrs.Xoh_hdr_parser arg) {hctx.Mkr().Hdr__hzip().Encode(bfr, stat_itm, src, arg).Pool__rls();} - public void On_lnke (gplx.xowa.htmls.core.wkrs.lnkes.Xoh_lnke_parser arg) {hctx.Mkr().Lnke__hzip().Encode(bfr, stat_itm, src, arg).Pool__rls();} - public void On_lnki (gplx.xowa.htmls.core.wkrs.lnkis.Xoh_lnki_parser arg) {hctx.Mkr().Lnki__hzip().Encode(bfr, hctx, stat_itm, src, arg).Pool__rls();} - public void On_thm (gplx.xowa.htmls.core.wkrs.thms.Xoh_thm_parser arg) {hctx.Mkr().Thm__hzip().Encode(bfr, this, stat_itm, src, arg).Pool__rls();} - public void On_img (gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_parser arg) {hctx.Mkr().Img__hzip().Encode(bfr, stat_itm, src, arg, Bool_.Y).Pool__rls();} - public void On_gly (gplx.xowa.htmls.core.wkrs.glys.Xoh_gly_grp_parser arg) {hctx.Mkr().Gly__hzip().Encode(bfr, stat_itm, src, arg).Pool__rls();} + public void On_txt (int rng_bgn, int rng_end) {bfr.Add_mid(src, rng_bgn, rng_end);} + public void On_escape (int rng_bgn, int rng_end) {hctx.Wkr_mkr().Mw__escape().Encode(bfr, this, hctx, hpg, Bool_.Y, src, null).Pool__rls();} + public void On_hdr (gplx.xowa.htmls.core.wkrs.hdrs.Xoh_hdr_parser parser) {hctx.Wkr_mkr().Mw__hdr().Encode(bfr, this, hctx, hpg, Bool_.Y, src, parser).Pool__rls();} + public void On_lnke (gplx.xowa.htmls.core.wkrs.lnkes.Xoh_lnke_parser parser) {hctx.Wkr_mkr().Mw__lnke().Encode(bfr, this, hctx, hpg, Bool_.Y, src, parser).Pool__rls();} + public void On_lnki (gplx.xowa.htmls.core.wkrs.lnkis.Xoh_lnki_parser parser) {hctx.Wkr_mkr().Mw__lnki().Encode(bfr, this, hctx, hpg, Bool_.Y, src, parser).Pool__rls();} + public void On_img (gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_parser parser) {hctx.Wkr_mkr().Mw__img().Encode(bfr, this, hctx, hpg, Bool_.Y, src, parser).Pool__rls();} + public void On_thm (gplx.xowa.htmls.core.wkrs.thms.Xoh_thm_parser parser) {hctx.Wkr_mkr().Mw__thm().Encode(bfr, this, hctx, hpg, Bool_.Y, src, parser).Pool__rls();} + public void On_gly (gplx.xowa.htmls.core.wkrs.glys.Xoh_gly_grp_parser parser) {hctx.Wkr_mkr().Mw__gly().Encode(bfr, this, hctx, hpg, Bool_.Y, src, parser).Pool__rls();} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__make.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__make.java index 80e620bf2..c4ca4a983 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__make.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hdoc_wkr__make.java @@ -21,19 +21,18 @@ import gplx.xowa.wikis.ttls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.hdrs.*; import gplx.xowa.htmls.core.wkrs.imgs.*; public class Xoh_hdoc_wkr__make implements Xoh_hdoc_wkr { - private Bry_bfr bfr; private Xoh_page hpg; private Xoh_hdoc_ctx hctx; private byte[] src; + private Xoh_hzip_bfr bfr; private Xoh_page hpg; private Xoh_hdoc_ctx hctx; private byte[] src; private final Xoh_hdr_make wkr__hdr = new Xoh_hdr_make(); private final Xoh_img_bldr wkr__img = new Xoh_img_bldr(); - public void On_new_page(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, int src_bgn, int src_end) { + public void On_new_page(Xoh_hzip_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, int src_bgn, int src_end) { this.bfr = bfr; this.hpg = hpg; this.hctx = hctx; this.src = src; } - public void On_escape (int rng_bgn, int rng_end) {bfr.Add_mid(src, rng_bgn, rng_end);} - public void On_txt (int rng_bgn, int rng_end) {bfr.Add_mid(src, rng_bgn, rng_end);} - public void On_space (int rng_bgn, int rng_end) {bfr.Add_mid(src, rng_bgn, rng_end);} - public void On_lnke (gplx.xowa.htmls.core.wkrs.lnkes.Xoh_lnke_parser arg) {bfr.Add_mid(src, arg.Rng_bgn(), arg.Rng_end());} - public void On_lnki (gplx.xowa.htmls.core.wkrs.lnkis.Xoh_lnki_parser arg) {bfr.Add_mid(src, arg.Rng_bgn(), arg.Rng_end());} - public void On_hdr (gplx.xowa.htmls.core.wkrs.hdrs.Xoh_hdr_parser arg) {wkr__hdr.Make(bfr, hpg, src, arg);} - public void On_img (gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_parser arg) {wkr__img.Make_by_parse(bfr, hpg, hctx, src, arg);} - public void On_thm (gplx.xowa.htmls.core.wkrs.thms.Xoh_thm_parser arg) {bfr.Add_mid(src, arg.Rng_bgn(), arg.Rng_end());} - public void On_gly (gplx.xowa.htmls.core.wkrs.glys.Xoh_gly_grp_parser arg) {} + public void On_escape (int rng_bgn, int rng_end) {bfr.Add_mid(src, rng_bgn, rng_end);} + public void On_txt (int rng_bgn, int rng_end) {bfr.Add_mid(src, rng_bgn, rng_end);} + public void On_lnke (gplx.xowa.htmls.core.wkrs.lnkes.Xoh_lnke_parser parser) {bfr.Add_mid(src, parser.Src_bgn(), parser.Src_end());} + public void On_lnki (gplx.xowa.htmls.core.wkrs.lnkis.Xoh_lnki_parser parser) {bfr.Add_mid(src, parser.Src_bgn(), parser.Src_end());} + public void On_hdr (gplx.xowa.htmls.core.wkrs.hdrs.Xoh_hdr_parser parser) {wkr__hdr.Make(bfr, hpg, src, parser);} + public void On_img (gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_parser parser) {wkr__img.Make_by_parse(bfr, hpg, hctx, src, parser);} + public void On_thm (gplx.xowa.htmls.core.wkrs.thms.Xoh_thm_parser parser) {bfr.Add_mid(src, parser.Src_bgn(), parser.Src_end());} + public void On_gly (gplx.xowa.htmls.core.wkrs.glys.Xoh_gly_grp_parser parser) {} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_bfr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_bfr.java new file mode 100644 index 000000000..802cfed81 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_bfr.java @@ -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 . +*/ +package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; +import gplx.xowa.htmls.core.hzips.*; +public class Xoh_hzip_bfr extends Bry_bfr { private final Xoh_hzip_int hzint = new Xoh_hzip_int(); + private final byte stop_byte; + public Xoh_hzip_bfr(int bfr_max, boolean mode_is_b256, byte stop_byte) { + this.Init(bfr_max); + this.stop_byte = stop_byte; + Mode_is_b256_(mode_is_b256); + } + public Xoh_hzip_bfr Mode_is_b256_(boolean mode_is_b256) { + hzint.Mode_is_b256_(mode_is_b256); + return this; + } + public Xoh_hzip_bfr Add_hzip_bry(byte[] bry) {Add(bry); Add_byte(stop_byte); return this;} + public Xoh_hzip_bfr Add_hzip_mid(byte[] src, int bgn, int end) {Add_mid(src, bgn, end); Add_byte(stop_byte); return this;} + public Xoh_hzip_bfr Add_hzip_int(int reqd, int val) { + hzint.Encode(reqd, this, val); + return this; + } + public static Xoh_hzip_bfr New_txt(int bfr_max) {return new Xoh_hzip_bfr(bfr_max, Bool_.N, gplx.xowa.htmls.core.hzips.Xoh_hzip_dict_.Escape);} +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_fxt.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java similarity index 80% rename from 400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_fxt.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java index 1b7b8823e..7cbd16568 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/hzips/Xoh_hzip_fxt.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_hzip_fxt.java @@ -15,24 +15,29 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.htmls.core.hzips; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; +package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; public class Xoh_hzip_fxt { + private final Xowe_wiki wiki; private final Xop_fxt parser_fxt = new Xop_fxt(); - private final Bry_bfr bfr = Bry_bfr.new_(); + private final Xoh_hzip_bfr bfr = Xoh_hzip_bfr.New_txt(32); private final Xoh_hzip_mgr hzip_mgr; private final Xoh_page hpg = new Xoh_page(); + private boolean mode_is_b256; public Xoh_hzip_fxt() { - Xowe_wiki wiki = parser_fxt.Wiki(); + this.wiki = parser_fxt.Wiki(); Xoa_app_fxt.repo2_(parser_fxt.App(), wiki); // needed else will be old "mem/wiki/repo/trg/thumb/" instead of standard "mem/file/en.wikipedia.org/thumb/" wiki.Html__hdump_mgr().Init_by_db(parser_fxt.Wiki()); this.hzip_mgr = parser_fxt.Wiki().Html__hdump_mgr().Hzip_mgr(); hpg.Init(wiki, Xoa_url.blank(), parser_fxt.Wiki().Ttl_parse(Xoa_page_.Main_page_bry), 1); } - public Xow_wiki Wiki() {return parser_fxt.Wiki();} + public Xow_wiki Wiki() {return wiki;} + public Xoh_hzip_fxt Init_mode_is_b256_(boolean v) {bfr.Mode_is_b256_(v); mode_is_b256 = v; return this;} + public Xoh_hzip_fxt Init_mode_diff_y_() {hzip_mgr.Hctx().Mode_is_diff_(Bool_.Y); return this;} public void Clear() {hpg.Clear();} - public Xowe_wiki Prep_create_wiki(String alias, String domain) { + public void Init_wiki_installed(String domain) {parser_fxt.Init_xwiki_add_user_(domain);} + public Xowe_wiki Init_wiki_alias(String alias, String domain) { Xowe_wiki rv = Xoa_app_fxt.wiki_(parser_fxt.App(), domain); parser_fxt.Wiki().Xwiki_mgr().Add_by_atrs(Bry_.new_u8(alias), Bry_.new_u8(domain), null); return rv; @@ -74,7 +79,7 @@ public class Xoh_hzip_fxt { } public void Exec_write_to_fsys(Io_url dir, String fil) { try { - Bry_bfr bfr = Bry_bfr.new_(); + Xoh_hzip_bfr bfr = Xoh_hzip_bfr.New_txt(32).Mode_is_b256_(mode_is_b256); Gfo_usr_dlg_.Test__show__init(); hzip_mgr.Encode(bfr, parser_fxt.Wiki(), hpg, Io_mgr.Instance.LoadFilBry(dir.GenSubFil(fil))); Gfo_usr_dlg_.Test__show__term(); @@ -82,7 +87,9 @@ public class Xoh_hzip_fxt { Io_mgr.Instance.SaveFilBry(dir.GenSubFil(fil).GenNewExt(".hzip.html"), actl); Gfo_usr_dlg_.Test__show__init(); gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_hzip.Md5_depth = 4; + hzip_mgr.Hctx().Mode_is_diff_(Bool_.Y); hzip_mgr.Decode(bfr, parser_fxt.Wiki(), hpg, actl); + hzip_mgr.Hctx().Mode_is_diff_(Bool_.N); gplx.xowa.htmls.core.wkrs.imgs.Xoh_img_hzip.Md5_depth = 2; Gfo_usr_dlg_.Test__show__term(); Io_mgr.Instance.SaveFilBry(dir.GenSubFil(fil).GenNewExt(".hzip.decode.html"), bfr.To_bry_and_clear()); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt_base.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt.java similarity index 69% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt_base.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt.java index f7991a9bc..a5d97eefa 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt_base.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/Xoh_itm_parser_fxt.java @@ -18,9 +18,17 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.core.brys.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; -public abstract class Xoh_itm_parser_fxt_base { - private final Bry_rdr rdr = new Bry_rdr(); +public abstract class Xoh_itm_parser_fxt { + private final Xoae_app app; + private final Xowe_wiki wiki; + private final Bry_err_wkr err_wkr = new Bry_err_wkr(); protected byte[] src; protected int src_len; + protected final Xoh_hdoc_ctx hctx = new Xoh_hdoc_ctx(); + public Xoh_itm_parser_fxt() { + this.app = Xoa_app_fxt.app_(); + this.wiki = Xoa_app_fxt.wiki_tst_(app); + hctx.Init_by_app(app); + } private Xoh_itm_parser Parser() {return Parser_get();} public abstract Xoh_itm_parser Parser_get(); public void Test__parse__fail(String src_str, String expd) { @@ -32,8 +40,9 @@ public abstract class Xoh_itm_parser_fxt_base { } public void Exec_parse(String src_str) { this.src = Bry_.new_u8(src_str); this.src_len = src.length; - rdr.Init_by_page(Xoa_page_.Main_page_bry, src, src_len); - Exec_parse_hook(rdr, 0, src_len); + hctx.Init_by_page(wiki, Xoa_page_.Main_page_bry); + err_wkr.Init_by_page(Xoa_page_.Main_page_str, src); + Exec_parse_hook(err_wkr, hctx, 0, src_len); } - public abstract void Exec_parse_hook(Bry_rdr owner_rdr, int src_bgn, int src_end); + public abstract void Exec_parse_hook(Bry_err_wkr err_wkr, Xoh_hdoc_ctx hctx, int src_bgn, int src_end); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_data.java similarity index 90% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_parser.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_data.java index 6a2ab01bd..ad70d123b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_data.java @@ -18,9 +18,9 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.escapes; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.xowa.htmls.core.hzips.*; -public class Xoh_escape_parser implements Html_doc_wkr { +public class Xoh_escape_data implements Html_doc_wkr { private final Xoh_hdoc_wkr wkr; - public Xoh_escape_parser(Xoh_hdoc_wkr wkr) {this.wkr = wkr;} + public Xoh_escape_data(Xoh_hdoc_wkr wkr) {this.wkr = wkr;} public byte[] Hook() {return Xoh_hzip_dict_.Escape_bry;} public int Parse(byte[] src, int src_bgn, int src_end, int pos) { int rv = pos + 1; diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_hzip.java index bb261f497..eba1596fd 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/escapes/Xoh_escape_hzip.java @@ -19,18 +19,24 @@ package gplx.xowa.htmls.core.wkrs.escapes; import gplx.*; import gplx.xowa.*; im import gplx.core.brys.*; import gplx.core.threads.poolables.*; import gplx.xowa.htmls.core.hzips.*; public class Xoh_escape_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { + private byte escape_byte; + public byte[] Hook() {return hook;} private byte[] hook; public String Key() {return Xoh_hzip_dict_.Key__escape;} - public Xoh_escape_hzip Encode(Bry_bfr bfr, Hzip_stat_itm stat_itm) { - stat_itm.Escape_add_one(); - bfr.Add(Xoh_hzip_dict_.Bry__escape); + public Gfo_poolable_itm Encode(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) { + bfr.Add(hook); + hctx.Hzip__stat().Escape_add(escape_byte); return this; } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx ctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { bfr.Add_byte(Xoh_hzip_dict_.Escape); return rdr.Pos(); } - public int Pool__idx() {return pool_idx;} private int pool_idx; - public void Pool__clear (Object[] args) {} - public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; - public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_escape_hzip rv = new Xoh_escape_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} + 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_escape_hzip rv = new Xoh_escape_hzip(); + rv.pool_mgr = mgr; rv.pool_idx = idx; + rv.hook = (byte[])args[0]; + rv.escape_byte = rv.hook[0]; + return rv; + } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java index c285a0a60..6f597ecc9 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/glys/Xoh_gly_hzip.java @@ -23,33 +23,15 @@ import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; public class Xoh_gly_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { public String Key() {return Xoh_hzip_dict_.Key__gly;} - public Xoh_gly_hzip Encode(Bry_bfr bfr, Hzip_stat_itm stat_itm, byte[] src, Xoh_gly_grp_parser arg) { - bfr.Add_mid(src, arg.Rng_bgn(), arg.Rng_end()); + public byte[] Hook() {return hook;} private byte[] hook; + public Gfo_poolable_itm Encode(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_gly_grp_parser data = (Xoh_gly_grp_parser)data_obj; + bfr.Add_mid(src, data.Rng_bgn(), data.Rng_end()); return this; } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { - return hook_bgn; + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { + return src_bgn + 2; } - public int Pool__idx() {return pool_idx;} private int pool_idx; - public void Pool__clear (Object[] args) {} - public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; - public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_gly_hzip rv = new Xoh_gly_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} -// private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_( 1, 1, 1, 1 , 1, 1, 1, 1 , 2, 1, 1, 1 , 1, 2, 2); -// private static final int // SERIALIZED -// Flag__file__w_diff_from_html = 0 -// , Flag__file__time_exists = 1 -// , Flag__file__page_exists = 2 -// , Flag__file__is_orig = 3 -// , Flag__file__repo_is_local = 4 -// , Flag__file__src_exists = 5 -// , Flag__img__cls_other_exists = 6 -// , Flag__anch__ns_is_image = 7 -// , Flag__anch__cls_tid = 8 // none, image -// , Flag__anch__ns_id_needs_saving = 9 -// , Flag__img__alt_diff_from_anch_title = 10 -// , Flag__anch__href_diff_file = 11 -// , Flag__anch__title_missing = 12 -// , Flag__img__cls_tid = 13 // none, thumbimage, thumbborder -// , Flag__anch__href_tid = 14 // wiki, site, anch, inet -// ; + 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_gly_hzip rv = new Xoh_gly_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_hzip.java index ad88fcc01..398a76e0c 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_hzip.java @@ -20,43 +20,63 @@ import gplx.core.brys.*; import gplx.core.threads.poolables.*; import gplx.xowa. import gplx.xowa.htmls.core.hzips.*; public class Xoh_hdr_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { public String Key() {return Xoh_hzip_dict_.Key__hdr;} - public Xoh_hdr_hzip Encode(Bry_bfr bfr, Hzip_stat_itm stat_itm, byte[] src, Xoh_hdr_parser arg) { - int level = arg.Hdr_level(); - stat_itm.Hdr_add(level); - bfr.Add(Xoh_hzip_dict_.Bry__hdr); // add hook - bfr.Add_int_digits(1, level); // add level; EX: 2 in

    - bfr.Add_mid(src, arg.Capt_bgn(), arg.Capt_end()).Add_byte(Xoh_hzip_dict_.Escape); // add caption - bfr.Add_safe(arg.Anch_bry()); // add anchor - bfr.Add_byte(Xoh_hzip_dict_.Escape); // add escape + public byte[] Hook() {return hook;} private byte[] hook; + public Gfo_poolable_itm Encode(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_hdr_parser data = (Xoh_hdr_parser)data_obj; + boolean capt_rhs_exists = flag_bldr.Set_as_bool (Flag__capt_rhs_exists , data.Capt_rhs_exists()); + boolean anch_is_diff = flag_bldr.Set_as_bool (Flag__anch_is_diff , data.Anch_is_diff()); + int hdr_level = flag_bldr.Set_as_int (Flag__hdr_level , data.Hdr_level()); + + bfr.Add(hook); + bfr.Add_hzip_int(1, flag_bldr.Encode()); + bfr.Add_hzip_mid(src, data.Capt_bgn(), data.Capt_end()); // add caption + if (anch_is_diff) bfr.Add_hzip_mid(src, data.Anch_bgn(), data.Anch_end()); // add anchor + if (capt_rhs_exists) bfr.Add_hzip_mid(src, data.Capt_rhs_bgn(), data.Capt_rhs_end());// add capt_rhs + + hctx.Hzip__stat().Hdr_add(hdr_level); return this; } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx ctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { - byte level = rdr.Read_byte(); - int capt_bgn = rdr.Pos(); - int capt_end = rdr.Find_fwd_lr(Xoh_hzip_dict_.Escape); - int anch_bgn = rdr.Pos(); - int anch_end = rdr.Find_fwd_lr(Xoh_hzip_dict_.Escape); + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { + int flag = rdr.Read_int_by_base85(1); flag_bldr.Decode(flag); + boolean capt_rhs_exists = flag_bldr.Get_as_bool(Flag__capt_rhs_exists); + boolean anch_is_diff = flag_bldr.Get_as_bool(Flag__anch_is_diff); + byte hdr_level = flag_bldr.Get_as_byte(Flag__hdr_level); - bfr.Add(Bry__hdr__0).Add_byte(level); + int capt_bgn = rdr.Pos(); int capt_end = rdr.Find_fwd_lr(); + int anch_bgn = -1, anch_end = -1; + if (anch_is_diff) { + anch_bgn = rdr.Pos(); anch_end = rdr.Find_fwd_lr(); + } + byte[] capt_manual_end = capt_rhs_exists ? rdr.Read_bry_to() : null; + + bfr.Add(Bry__hdr__0).Add_byte_as_a7(hdr_level); bfr.Add(Bry__hdr__1); - if (anch_end > anch_bgn) + if (anch_is_diff) bfr.Add_mid (src, anch_bgn, anch_end); else bfr.Add_mid_w_swap (src, capt_bgn, capt_end, Byte_ascii.Space, Byte_ascii.Underline); bfr.Add(Bry__hdr__2); bfr.Add_mid(src, capt_bgn, capt_end); - bfr.Add(Bry__hdr__3).Add_byte(level); + bfr.Add(Bry__hdr__3); + if (capt_rhs_exists) + bfr.Add(capt_manual_end); + bfr.Add(Bry__hdr__4).Add_byte_as_a7(hdr_level); bfr.Add_byte(Byte_ascii.Angle_end); return rdr.Pos(); } + private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_ (1, 1, 3); + private static final int // SERIALIZED + Flag__capt_rhs_exists = 0 + , Flag__anch_is_diff = 1 + , Flag__hdr_level = 2 + ; private static final byte[] Bry__hdr__0 = Bry_.new_a7("\n ") - , Bry__hdr__3 = Bry_.new_a7("\n") + , Bry__hdr__4 = Bry_.new_a7("" - , " A" - , "

    " + ( "
    A
    " , "a" )); } @Test public void Diff() { fxt.Test__bicode(String_.Concat_lines_nl_skip_last - ( "~\"2A~A~" + ( "~\"+A~A~" , "a" ), String_.Concat_lines_nl_skip_last - ( "

    " - , " A" - , "

    " + ( "

    A

    " , "a" )); } @Test public void Diff_by_underscore() { fxt.Test__bicode(String_.Concat_lines_nl_skip_last - ( "~\"2A 1~~" + ( "~\"#A 1~" , "a" ), String_.Concat_lines_nl_skip_last - ( "

    " - , " A 1" - , "

    " + ( "

    A 1

    " + , "a" + )); + } + @Test public void Diff_by_lnki() { + fxt.Test__bicode(String_.Concat_lines_nl_skip_last + ( "~\"+Category:A~Category:A~" + , "a" + ), String_.Concat_lines_nl_skip_last + ( "

    Category:A

    " , "a" )); } @Test public void Same_w_underscore() { fxt.Test__bicode(String_.Concat_lines_nl_skip_last - ( "~\"2A_1~~" + ( "~\"#A_1~" , "a" ), String_.Concat_lines_nl_skip_last - ( "

    " - , " A_1" - , "

    " + ( "

    A_1

    " , "a" )); } + @Test public void Tidy__bad_end() { + fxt.Test__bicode( + "~\"?A~AB~B~" + , "
    AB
    " + ); + } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_make.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_make.java index 4a13d4442..51f6b2ae4 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_make.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_make.java @@ -22,14 +22,14 @@ public class Xoh_hdr_make { public void Make(Bry_bfr bfr, Xoh_page hpg, byte[] src, Xoh_hdr_parser arg) { // , int rng_bgn, int rng_end, int level, int capt_bgn, int capt_end, byte[] anch // register section - int rng_bgn = arg.Rng_bgn(), rng_end = arg.Rng_end(); + int rng_bgn = arg.Src_bgn(), rng_end = arg.Src_end(); int level = arg.Hdr_level(); Xoh_section_mgr section_mgr = hpg.Section_mgr(); int section_len = section_mgr.Len(); if (section_len != 0) // guard against -1 index; should not happen section_mgr.Set_content(section_len - 1, src, rng_bgn - 2); // -2 to skip "\n\n" byte[] capt = Bry_.Mid(src, arg.Capt_bgn(), arg.Capt_end()); - byte[] anch = arg.Anch_bry(); + byte[] anch = Bry_.Mid(src, arg.Anch_bgn(), arg.Anch_end()); if (anch == null) anch = Bry_.Replace(capt, Byte_ascii.Space, Byte_ascii.Underline); hpg.Section_mgr().Add(section_len, level, anch, capt).Content_bgn_(rng_end + 1); // +1 to skip "\n" bfr.Add_mid(src, rng_bgn, rng_end); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_parser.java index 352d2e896..d67b283c5 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/hdrs/Xoh_hdr_parser.java @@ -18,26 +18,38 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.hdrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; public class Xoh_hdr_parser { - // gplx.xowa.htmls.core.wkrs.hdrs.Xoh_hdr_parser - public int Rng_bgn() {return rng_bgn;} private int rng_bgn; - public int Rng_end() {return rng_end;} private int rng_end; + public int Src_bgn() {return src_bgn;} private int src_bgn; + public int Src_end() {return src_end;} private int src_end; public int Hdr_level() {return hdr_level;} private int hdr_level; + public int Anch_bgn() {return anch_bgn;} private int anch_bgn; + public int Anch_end() {return anch_end;} private int anch_end; + public boolean Anch_is_diff() {return anch_is_diff;} private boolean anch_is_diff; public int Capt_bgn() {return capt_bgn;} private int capt_bgn; public int Capt_end() {return capt_end;} private int capt_end; - public byte[] Anch_bry() {return anch_bry;} private byte[] anch_bry; - public int Parse(Xoh_hdoc_wkr wkr, byte[] src, Html_tag_rdr rdr, int hdr_level, int rng_bgn, Html_tag span) {//

    A 1

    - this.rng_bgn = rng_bgn; this.hdr_level = hdr_level; - Html_atr anch_atr = span.Atrs__get_by_or_fail(Html_atr_.Bry__id); - int anch_bgn = anch_atr.Val_bgn(), anch_end = anch_atr.Val_end(); - this.capt_bgn = span.Src_end(); - rdr.Tag__move_fwd_tail(hdr_level); // find not since can be nested, but

    cannot - this.capt_end = rdr.Tag__peek_bwd_tail(Html_tag_.Id__span).Src_bgn(); // get before

    - this.anch_bry = null; - if (!Bry_.Match_w_swap(src, capt_bgn, capt_end, src, anch_bgn, anch_end, Byte_ascii.Space, Byte_ascii.Underline)) - this.anch_bry = Bry_.Mid(src, anch_bgn, anch_end); // anch is different than capt; occurs with html and dupe-anchors; EX: "==A==" -> id='A' - this.rng_end = rdr.Pos(); - wkr.On_hdr(this); - return rng_end; + public int Capt_rhs_bgn() {return capt_rhs_bgn;} private int capt_rhs_bgn; + public int Capt_rhs_end() {return capt_rhs_end;} private int capt_rhs_end; + public boolean Capt_rhs_exists() {return capt_rhs_exists;} private boolean capt_rhs_exists; + public void Clear() { + this.anch_bgn = anch_end = capt_bgn = capt_end = capt_rhs_bgn = capt_rhs_end -1; + this.anch_is_diff = capt_rhs_exists = false; + } + public boolean Parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Html_tag_rdr tag_rdr, byte[] src, Html_tag hdr_head, Html_tag span_head) { + this.Clear(); + this.src_bgn = hdr_head.Src_bgn(); this.hdr_level = hdr_head.Name_id(); + Html_atr anch_atr = span_head.Atrs__get_by_or_fail(Html_atr_.Bry__id); + this.anch_bgn = anch_atr.Val_bgn(); this.anch_end = anch_atr.Val_end(); + this.capt_bgn = span_head.Src_end(); + Html_tag hdr_tail = tag_rdr.Tag__move_fwd_tail(hdr_level); // find not since can be nested, but

    cannot + Html_tag span_tail = tag_rdr.Tag__peek_bwd_tail(Html_tag_.Id__span); // get before

    + this.capt_end = span_tail.Src_bgn(); + if (span_tail.Src_end() != hdr_tail.Src_bgn()) { + capt_rhs_exists = true; + capt_rhs_bgn = span_tail.Src_end(); capt_rhs_end = hdr_tail.Src_bgn(); + } + this.anch_is_diff = !Bry_.Match_w_swap(src, capt_bgn, capt_end, src, anch_bgn, anch_end, Byte_ascii.Space, Byte_ascii.Underline); // anch is different than capt; occurs with html and dupe-anchors; EX: "==A==" -> id='A' + this.src_end = tag_rdr.Pos(); + hdoc_wkr.On_hdr(this); + return true; } public static final byte[] Bry__class__mw_headline = Bry_.new_a7("mw-headline"); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bldr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bldr.java index c04d7b698..b81304ecd 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bldr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_bldr.java @@ -24,20 +24,20 @@ public class Xoh_img_bldr { public Xoh_img_wtr Wtr() {return wtr;} private final Xoh_img_wtr wtr = new Xoh_img_wtr(); public Xof_fsdb_itm Fsdb_itm() {return fsdb_itm;} private Xof_fsdb_itm fsdb_itm; public void Make_by_parse(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, Xoh_img_parser arg) { - Make( bfr, hpg, hctx, src, arg.Img_src().File_ttl_bry(), arg.Img_xoimg() - , arg.Anch_href().Rel_nofollow_exists(), arg.Anch_href().Atr(), arg.Anch_cls().Atr(), arg.Anch_title() + Make( bfr, hpg, hctx, src, arg.Img_src().File_ttl_bry(), arg.Img_xoimg(), arg.Img_xoimg().Val_dat_exists() + , arg.Rel_nofollow_exists(), arg.Anch_href().Atr(), arg.Anch_cls().Atr(), arg.Anch_title() , arg.Img_w(), arg.Img_h(), arg.Img_src().Atr(), arg.Img_cls().Atr(), arg.Img_alt()); wtr.Bfr_arg__add(bfr); } - public void Make(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, byte[] lnki_ttl, Xoh_img_xoimg_parser img_xoimg + public void Make(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, byte[] lnki_ttl, Xoh_img_xoimg_parser img_xoimg, boolean img_xoimg_exists , boolean anch_rel_is_nofollow, Bfr_arg anch_href, Bfr_arg anch_cls, Bfr_arg anch_ttl , int img_w, int img_h, Bfr_arg img_src, Bfr_arg img_cls, Bfr_arg img_alt) { wtr.Clear(); this.fsdb_itm = hpg.Img_mgr().Make_img(); - if (img_xoimg.Val_dat_exists()) { + if (img_xoimg_exists) { fsdb_itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, hpg.Wiki().Domain_itm().Abrv_xo(), lnki_ttl, img_xoimg.Lnki_type(), img_xoimg.Lnki_upright(), img_xoimg.Lnki_w(), img_xoimg.Lnki_h(), img_xoimg.Lnki_time(), img_xoimg.Lnki_page(), Xof_patch_upright_tid_.Tid_all); hctx.File__mgr().Check_cache(fsdb_itm); - wtr.Img_xoimg_(src, img_xoimg.Val_bgn(), img_xoimg.Val_end()); + wtr.Img_xoimg_(img_xoimg); wtr.Img_src_empty_().Img_w_(0).Img_h_(0); } else if (img_w != -1) { @@ -45,6 +45,8 @@ public class Xoh_img_bldr { } if (anch_rel_is_nofollow) wtr.Anch_rel_nofollow_(); wtr.Anch_href_(anch_href).Anch_cls_(anch_cls).Anch_title_(anch_ttl).Anch_xowa_title_(lnki_ttl); - wtr.Img_id_(Xoh_img_mgr.Bry__html_uid, fsdb_itm.Html_uid()).Img_alt_(img_alt).Img_cls_(img_cls); + if (!hctx.Mode_is_diff()) + wtr.Img_id_(Xoh_img_mgr.Bry__html_uid, fsdb_itm.Html_uid()); + wtr.Img_alt_(img_alt).Img_cls_(img_cls); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java index 3c9f6a67c..796e04e51 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip.java @@ -17,15 +17,19 @@ along with this program. If not, see . */ 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.primitives.*; import gplx.core.brys.*; import gplx.core.threads.poolables.*; -import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.core.hzips.*; +import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.langs.htmls.encoders.*; +import gplx.xowa.htmls.hrefs.*; 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.htmls.core.wkrs.lnkis.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { public String Key() {return Xoh_hzip_dict_.Key__img;} - private final Xoh_img_xoimg_parser xoimg_parser = new Xoh_img_xoimg_parser(); + public byte[] Hook() {return hook;} private byte[] hook; + private final Xoh_img_xoimg_parser xoimg_parser = new Xoh_img_xoimg_parser(); + private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); public Xoh_img_bldr Bldr() {return bldr;} private Xoh_img_bldr bldr = new Xoh_img_bldr(); public Bfr_arg__href Anch_href_arg() {return anch_href_arg;} private final Bfr_arg__href anch_href_arg = new Bfr_arg__href(); + public Xoh_img_xoimg_hzip Xoimg() {return xoimg;} private final Xoh_img_xoimg_hzip xoimg = new Xoh_img_xoimg_hzip(); private final Bry_obj_ref anch_cls_mid = Bry_obj_ref.New_empty() , anch_title_mid = Bry_obj_ref.New_empty() @@ -34,30 +38,30 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { , img_src_mid = Bry_obj_ref.New_empty() , img_cls_mid = Bry_obj_ref.New_empty() ; - public Xoh_img_hzip Encode(Bry_bfr bfr, Hzip_stat_itm stat_itm, byte[] src, Xoh_img_parser arg, boolean write_hdr) { - // img_map: - Xoh_anch_href_parser anch_href = arg.Anch_href(); - Bry_obj_ref anch_page = arg.Anch_page(); + public Gfo_poolable_itm Encode(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_img_parser data = (Xoh_img_parser)data_obj; + Xoh_anch_href_itm anch_href = data.Anch_href(); + Bry_obj_ref anch_page = data.Anch_page(); byte anch_href_tid = anch_href.Tid(); - boolean anch__ns_id_needs_saving = anch_href.Tid_has_ns() && anch_href.Page_ns_id() != Xow_ns_.Tid__file; - Html_atr anch_title = arg.Anch_title(); - Xoa_ttl anch_href_ttl = anch_href.Page_ttl(); - Xoh_img_xoimg_parser img_xoimg = arg.Img_xoimg(); - Xoh_img_cls_parser img_cls = arg.Img_cls(); - Xoh_img_src_parser img_src = arg.Img_src(); - boolean img__alt_diff_from_anch_title = arg.Img_alt__diff__anch_title(); + boolean anch__ns_is_custom = anch_href.Ttl_ns_custom() != null; + boolean anch__ns_id_needs_saving = Xoh_anch_href_itm.Ns_exists(anch_href.Tid()) && anch_href.Ttl_ns_id() != Xow_ns_.Tid__file; + Html_atr anch_title = data.Anch_title(); + Xoh_img_xoimg_parser img_xoimg = data.Img_xoimg(); + Xoh_img_cls_parser img_cls = data.Img_cls(); + Xoh_img_src_parser img_src = data.Img_src(); + boolean img__alt_diff_from_anch_title = data.Img_alt__diff__anch_title(); boolean file__src_exists = !img_xoimg.Val_dat_exists(); - boolean anch_href_diff_file = !Bry_.Match(anch_page.Val(), anch_page.Val_bgn(), anch_page.Val_end(), anch_href.Page_ttl().Page_db()); + boolean anch_href_diff_file = !Bry_.Match(anch_page.Val(), anch_page.Val_bgn(), anch_page.Val_end(), anch_href.Ttl_page_db()); - flag_bldr.Set(Flag__file__w_diff_from_html , file__src_exists && arg.Img_w__diff__file_w()); + flag_bldr.Set(Flag__file__w_diff_from_html , file__src_exists && data.Img_w__diff__file_w()); flag_bldr.Set(Flag__file__time_exists , file__src_exists && img_src.File_time_exists()); flag_bldr.Set(Flag__file__page_exists , file__src_exists && img_src.File_page_exists()); flag_bldr.Set(Flag__file__is_orig , file__src_exists && img_src.File_is_orig()); flag_bldr.Set(Flag__file__repo_is_local , file__src_exists && !img_src.Repo_is_commons()); flag_bldr.Set(Flag__file__src_exists , file__src_exists); flag_bldr.Set(Flag__img__cls_other_exists , img_cls.Other_exists()); - flag_bldr.Set(Flag__anch__ns_is_image , anch_href.Page_ns_id_is_image()); - flag_bldr.Set(Flag__anch__cls_tid , arg.Anch_cls().Tid()); + flag_bldr.Set(Flag__anch__ns_is_custom , anch__ns_is_custom); + flag_bldr.Set(Flag__anch__cls_tid , data.Anch_cls().Tid()); flag_bldr.Set(Flag__anch__ns_id_needs_saving , anch__ns_id_needs_saving); flag_bldr.Set(Flag__img__alt_diff_from_anch_title , img__alt_diff_from_anch_title); flag_bldr.Set(Flag__anch__href_diff_file , anch_href_diff_file); @@ -66,43 +70,52 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { flag_bldr.Set(Flag__anch__href_tid , anch_href.Tid()); // Tfds.Dbg(flag_bldr.Encode(), Array_.To_str(flag_bldr.Val_ary())); - if (write_hdr) bfr.Add(Xoh_hzip_dict_.Bry__img); + if (wkr_is_root) bfr.Add(hook); Xoh_hzip_int_.Encode(2, bfr, flag_bldr.Encode()); - if (anch_href_tid == Xoh_anch_href_parser.Tid__inet) - anch_href_mid.Mid_(src, anch_href.Val_bgn(), anch_href.Val_end()); - else - anch_href_mid.Val_(anch_href_ttl.Page_db()); + switch (anch_href_tid) { + case Xoh_anch_href_itm.Tid__inet: + anch_href_mid.Mid_(src, anch_href.Rng_bgn(), anch_href.Rng_end()); + break; + case Xoh_anch_href_itm.Tid__site: + anch_href_mid.Val_(tmp_bfr.Add_mid(src, anch_href.Site_bgn(), anch_href.Site_end()).Add_byte(Byte_ascii.Pipe).Add(anch_href.Ttl_page_db()).To_bry_and_clear()); + break; + case Xoh_anch_href_itm.Tid__wiki: + case Xoh_anch_href_itm.Tid__anch: + anch_href_mid.Val_(anch_href.Ttl_page_db()); + break; + } bfr.Add_bry_ref_obj(anch_href_mid); bfr.Add_byte(Xoh_hzip_dict_.Escape); if (anch_href_diff_file) { - arg.Anch_page().Bfr_arg__add(bfr); + data.Anch_page().Bfr_arg__add(bfr); bfr.Add_byte(Xoh_hzip_dict_.Escape); } switch (anch_href_tid) { - case Xoh_anch_href_parser.Tid__anch: - case Xoh_anch_href_parser.Tid__inet: + case Xoh_anch_href_itm.Tid__anch: + case Xoh_anch_href_itm.Tid__inet: break; - case Xoh_anch_href_parser.Tid__wiki: - case Xoh_anch_href_parser.Tid__site: + case Xoh_anch_href_itm.Tid__wiki: + case Xoh_anch_href_itm.Tid__site: if (anch__ns_id_needs_saving) - Xoh_lnki_dict_.Ns_encode(bfr, anch_href_ttl.Ns().Id()); + Xoh_lnki_dict_.Ns_encode(bfr, anch_href.Ttl_ns_id()); break; } + if (anch__ns_is_custom) bfr.Add(data.Anch_href().Ttl_ns_custom()).Add_byte(Xoh_hzip_dict_.Escape); if (file__src_exists) { - Xoh_hzip_int_.Encode(2, bfr, Xoh_hzip_int_.Neg_1_adj + arg.Img_w()); - Xoh_hzip_int_.Encode(2, bfr, Xoh_hzip_int_.Neg_1_adj + arg.Img_h()); - if (arg.Img_w__diff__file_w()) Xoh_hzip_int_.Encode(2, bfr, Xoh_hzip_int_.Neg_1_adj + img_src.File_w()); + Xoh_hzip_int_.Encode(2, bfr, Xoh_hzip_int_.Neg_1_adj + data.Img_w()); + Xoh_hzip_int_.Encode(2, bfr, Xoh_hzip_int_.Neg_1_adj + data.Img_h()); + if (data.Img_w__diff__file_w()) Xoh_hzip_int_.Encode(2, bfr, Xoh_hzip_int_.Neg_1_adj + img_src.File_w()); if (img_src.File_time_exists()) Xoh_hzip_int_.Encode(1, bfr, Xoh_hzip_int_.Neg_1_adj + img_src.File_time()); if (img_src.File_page_exists()) Xoh_hzip_int_.Encode(1, bfr, Xoh_hzip_int_.Neg_1_adj + img_src.File_page()); } else - bfr.Add_mid(src, img_xoimg.Val_bgn(), img_xoimg.Val_end()).Add_byte(Xoh_hzip_dict_.Escape); + xoimg.Encode(bfr, hctx.Hzip__stat(), src, img_xoimg); if (anch_title.Val_dat_exists()) bfr.Add_mid(src, anch_title.Val_bgn(), anch_title.Val_end()).Add_byte(Xoh_hzip_dict_.Escape); - if (img__alt_diff_from_anch_title) bfr.Add_mid(src, arg.Img_alt().Val_bgn(), arg.Img_alt().Val_end()).Add_byte(Xoh_hzip_dict_.Escape); - if (img_cls.Other_exists()) bfr.Add_mid(src, img_cls.Other_bgn(), img_cls.Other_end()).Add_byte(Xoh_hzip_dict_.Escape); + if (img__alt_diff_from_anch_title) bfr.Add_mid(src, data.Img_alt().Val_bgn(), data.Img_alt().Val_end()).Add_byte(Xoh_hzip_dict_.Escape); + if (img_cls.Other_exists()) bfr.Add_mid(src, img_cls.Other_bgn(), img_cls.Other_end()).Add_byte(Xoh_hzip_dict_.Escape); return this; } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { // decode rdr int flag = rdr.Read_int_by_base85(2); flag_bldr.Decode(flag); @@ -110,7 +123,7 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { boolean file__repo_is_local = flag_bldr.Get_as_bool(Flag__file__repo_is_local); boolean file__src_exists = flag_bldr.Get_as_bool(Flag__file__src_exists); boolean img__cls_other_exists = flag_bldr.Get_as_bool(Flag__img__cls_other_exists); - boolean anch__ns_is_image = flag_bldr.Get_as_bool(Flag__anch__ns_is_image); + boolean anch__ns_is_custom = flag_bldr.Get_as_bool(Flag__anch__ns_is_custom); boolean anch__ns_id_needs_saving = flag_bldr.Get_as_bool(Flag__anch__ns_id_needs_saving); int anch__cls_tid = flag_bldr.Get_as_int(Flag__anch__cls_tid); boolean img__alt_diff_from_anch_title = flag_bldr.Get_as_bool(Flag__img__alt_diff_from_anch_title); @@ -119,21 +132,36 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { int img_cls = flag_bldr.Get_as_int(Flag__img__cls_tid); int anch__href_tid = flag_bldr.Get_as_int(Flag__anch__href_tid); byte[] page_db = rdr.Read_bry_to(); + byte[] site_bry = null; + switch (anch__href_tid) { + case Xoh_anch_href_itm.Tid__anch: + case Xoh_anch_href_itm.Tid__inet: + case Xoh_anch_href_itm.Tid__wiki: + break; + case Xoh_anch_href_itm.Tid__site: + int pipe_pos = Bry_find_.Find_fwd(page_db, Byte_ascii.Pipe); + site_bry = Bry_.Mid(page_db, 0, pipe_pos); + page_db = Bry_.Mid(page_db, pipe_pos + 1); + break; + } byte[] file_db = page_db; if (anch_href_diff_file) file_db = rdr.Read_bry_to(); int anch_href_ns = -1; if (anch__ns_id_needs_saving) anch_href_ns = Xoh_lnki_dict_.Ns_decode(rdr); - int img_xoimg_bgn = -1, img_xoimg_end = -1, img_w = -1, img_h = -1, file_time = -1, file_page = -1; + int ns_custom_bgn = -1, ns_custom_end = -1; + if (anch__ns_is_custom) { + ns_custom_bgn = rdr.Pos(); + ns_custom_end = rdr.Find_fwd_lr(); + } + int img_w = -1, img_h = -1, file_time = -1, file_page = -1; xoimg_parser.Clear(); if (file__src_exists) { img_w = rdr.Read_int_by_base85(2) - Xoh_hzip_int_.Neg_1_adj; img_h = rdr.Read_int_by_base85(2) - Xoh_hzip_int_.Neg_1_adj; } else { - img_xoimg_bgn = rdr.Pos(); - img_xoimg_end = rdr.Find_fwd_lr(); - xoimg_parser.Parse(rdr, src, img_xoimg_bgn, img_xoimg_end); + xoimg.Decode(bfr, hctx, hpg, rdr, src, xoimg_parser); } int anch_title_bgn = -1, anch_title_end = -1; if (!anch__title_missing) { @@ -156,22 +184,24 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { // transform values boolean anch_rel_is_nofollow = false; - if (anch__ns_id_needs_saving) { - Xoa_ttl anch_href_ttl = hctx.Wiki__ttl_parser().Ttl_parse(anch_href_ns, page_db); - anch_href_arg.Set_by_page(anch_href_ttl.Full_db()); + if (anch__href_tid == Xoh_anch_href_itm.Tid__inet) { + Gfo_url_encoder_.Href.Encode(tmp_bfr, page_db); + anch_rel_is_nofollow = true; } else { - if (anch__href_tid == Xoh_anch_href_parser.Tid__inet) { - anch_href_arg.Set_by_raw(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode(page_db)); - anch_rel_is_nofollow = true; + if (anch__href_tid == Xoh_anch_href_itm.Tid__site) + tmp_bfr.Add(Xoh_href_.Bry__site).Add(site_bry); + if (anch__ns_id_needs_saving) { + Xoa_ttl anch_href_ttl = hctx.Wiki__ttl_parser().Ttl_parse(anch_href_ns, page_db); + tmp_bfr.Add(Xoh_href_.Bry__wiki).Add(anch_href_ttl.Full_url()); } else { - if (anch__ns_is_image) - anch_href_arg.Set_by_raw(Bry_.Add(gplx.xowa.htmls.hrefs.Xoh_href_.Bry__wiki, gplx.xowa.wikis.nss.Xow_ns_.Alias__image__bry, Byte_ascii.Colon_bry, gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode(page_db))); - else - anch_href_arg.Set_by_file(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode(page_db)); + byte[] ns_bry = anch__ns_is_custom ? Bry_.Mid(src, ns_custom_bgn, ns_custom_end) : Xow_ns_.Bry__file; + tmp_bfr.Add(Xoh_href_.Bry__wiki).Add(ns_bry).Add_byte_colon(); + Gfo_url_encoder_.Href.Encode(tmp_bfr, page_db); } } + anch_href_arg.Set_by_raw(tmp_bfr.To_bry_and_clear()); // NOTE: src must go underneath ttl Xof_url_bldr url_bldr = hctx.File__url_bldr(); url_bldr.Init_by_root(file__repo_is_local ? hctx.Fsys__file__wiki() : hctx.Fsys__file__comm(), Byte_ascii.Slash, false, false, Md5_depth); @@ -179,20 +209,18 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { byte[] img_src = url_bldr.Xto_bry(); anch_cls_mid.Val_(Xoh_anch_cls_.To_val(anch__cls_tid)); - anch_title_mid.Mid_(src, anch_title_bgn, anch_title_end); if (anch_title_bgn == anch_title_end) anch_title_mid.Val_(null); + if (!anch__title_missing) anch_title_mid.Mid_(src, anch_title_bgn, anch_title_end); else {anch_title_mid.Val_(null);} // if (anch_title_bgn == anch_title_end) anch_title_mid.Val_(null); img_alt_mid.Mid_(src, img_alt_bgn, img_alt_end); if (img_alt_mid.Val_is_empty()) img_alt_mid.Val_(Bry_.Empty); img_src_mid.Val_(img_src); img_cls_mid.Val_(Xoh_img_cls_.To_val_or_null(img_cls, img_cls_other)); - bldr.Make(bfr, hpg, hctx, src, file_db, xoimg_parser, anch_rel_is_nofollow, anch_href_arg, anch_cls_mid, anch_title_mid, img_w, img_h, img_src_mid, img_cls_mid, img_alt_mid); - if (write_to_bfr) bldr.Wtr().Bfr_arg__add(bfr); + bldr.Make(bfr, hpg, hctx, src, file_db, xoimg_parser, !file__src_exists, anch_rel_is_nofollow, anch_href_arg, anch_cls_mid, anch_title_mid, img_w, img_h, img_src_mid, img_cls_mid, img_alt_mid); + if (wkr_is_root) bldr.Wtr().Bfr_arg__add(bfr); return rv; } - public int Pool__idx() {return pool_idx;} private int pool_idx; - public void Pool__clear (Object[] args) {} - public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; - public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_img_hzip rv = new Xoh_img_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} + 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_img_hzip rv = new Xoh_img_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;} public static int Md5_depth = 2; private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_( 1, 1, 1, 1 , 1, 1, 1, 1 , 2, 1, 1, 1 , 1, 2, 2); private static final int // SERIALIZED @@ -203,7 +231,7 @@ public class Xoh_img_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { , Flag__file__repo_is_local = 4 , Flag__file__src_exists = 5 , Flag__img__cls_other_exists = 6 - , Flag__anch__ns_is_image = 7 + , Flag__anch__ns_is_custom = 7 , Flag__anch__cls_tid = 8 // none, image , Flag__anch__ns_id_needs_saving = 9 , Flag__img__alt_diff_from_anch_title = 10 diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__tst.java index 36e3123e6..86489781c 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_hzip__dump__tst.java @@ -22,32 +22,55 @@ public class Xoh_img_hzip__dump__tst { @Before public void Clear() {fxt.Clear();} @Test public void Basic() { // [[File:A.png|border|class=other|220px|abc]] fxt.Test__bicode - ( "~%!!A.png~0|220|110|0.5|-1|-1~abc~" - , "abc" + ( "~%!!A.png~)#Sabc~" + , "abc" + ); + } + @Test public void Anch() { // [[File:A.png#b|abc]] + fxt.Test__bicode + ( "~%\"abc" + ); + } + @Test public void Link__cs() { // [[File:A.png|link=File:a.ogg|abc]] + fxt.Test__bicode + ( "~%!Aa.ogg~A.png~)#Sabc~" + , "abc" ); } @Test public void Href__encoding() { // [[File:Aéb.png|abc]] fxt.Test__bicode - ( "~%!!Aéb.png~0|220|110|0.5|-1|-1~abc~" - , "abc" + ( "~%!qAéb.png~)#Sabc~" + , "abc" ); } + @Test public void Href__encoding__link() { // [[File:Aéb.png|abc|link=Aéb]] + fxt.Test__bicode + ( "~%#gAéb~Aéb.png~#)#Sabc~" + , "abc" + ); + } + @Test public void Href__apos() { // [[File:A'b.png|border|link=A'b_link|A'b_capt]] + String html = "\"A'b_capt\""; + fxt.Test__bicode_raw("~%#oA'b_link~A'b.png~#)#SA'b_capt~", html, html); + } @Test public void Link__wm__n() { // [[File:A.png|link=http://a.org|abc]] fxt.Test__bicode - ( "~%!Dhttp://a.org~A.png~0|220|110|0.5|-1|-1~abc~" - , "abc" + ( "~%!Dhttp://a.org~A.png~)#Sabc~" + , "abc" ); } -// @Test public void Link__wm__y() { // [[File:A.png|link=//en.wiktionary.org/wiki/A|abc]] -// fxt.Test__bicode -// ( "~%!i=!!!!A~abc~" -// , "abc" -// ); -// } + @Test public void Link__wm__y() { // [[File:A.png|link=http://en.wikitionary.org/wiki/Special:Search/A|abc]] + fxt.Test__bicode + ( "~%\"men.wiktionary.org|Search/A~A.png~\")#Sabc~" + , "abc" + ); + } + // lhs='B @Test public void Href__image() { // [[Image:A.png|abc]] fxt.Test__bicode - ( "~%-%A.png~0|220|110|0.5|-1|-1~abc~" - , "abc" + ( "~%-%A.png~Image~)#Sabc~" + , "abc" ); } @Test public void Missing() { // PURPOSE: bad dump shouldn't write corrupt data diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_parser.java index c3ed93cee..16b8e3fa0 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_parser.java @@ -18,12 +18,13 @@ along with this program. If not, see . 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.primitives.*; import gplx.core.brys.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; +import gplx.xowa.wikis.domains.*; import gplx.xowa.files.*; -public class Xoh_img_parser { +public class Xoh_img_parser { private byte[] src; - public int Rng_bgn() {return rng_bgn;} private int rng_bgn; - public int Rng_end() {return rng_end;} private int rng_end; - public Xoh_anch_href_parser Anch_href() {return anch_href;} private Xoh_anch_href_parser anch_href = new Xoh_anch_href_parser(); + public int Src_bgn() {return src_bgn;} private int src_bgn; + public int Src_end() {return src_end;} private int src_end; + public Xoh_anch_href_itm Anch_href() {return anch_href;} private Xoh_anch_href_itm anch_href = new Xoh_anch_href_itm(); public Xoh_anch_cls_parser Anch_cls() {return anch_cls;} private Xoh_anch_cls_parser anch_cls = new Xoh_anch_cls_parser(); public Html_atr Anch_title() {return anch_title;} private Html_atr anch_title; public Bry_obj_ref Anch_page() {return anch_page;} private Bry_obj_ref anch_page = Bry_obj_ref.New_empty(); @@ -35,29 +36,46 @@ public class Xoh_img_parser { public int Img_w() {return img_w;} private int img_w; public int Img_h() {return img_h;} private int img_h; public boolean Img_w__diff__file_w() {return img_w != img_src.File_w();} - public int Parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, byte[] src, Html_tag_rdr tag_rdr, Html_tag anch_head) { - this.src = src; Bry_rdr rdr = tag_rdr.Rdr(); - this.rng_bgn = anch_head.Src_bgn(); // - this.rng_end = anch_tail.Src_end(); - return rng_end; + Html_tag anch_tail = tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__a); // + this.src_end = anch_tail.Src_end(); + return true; } public static final byte[] Bry__cls__anch__image = Bry_.new_a7("image") diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java index dabf5c0df..d0bbc4f85 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/Xoh_img_wtr.java @@ -53,7 +53,7 @@ public class Xoh_img_wtr extends gplx.core.brys.Bfr_arg_base { public Xoh_img_wtr Img_id_(byte[] prefix, int uid) {img_id.Set_by_arg(img_id_val.Set(prefix, uid)); return this;} public Xoh_img_wtr Img_w_(int v) {img_w.Set_by_int(v); return this;} public Xoh_img_wtr Img_h_(int v) {img_h.Set_by_int(v); return this;} - public Xoh_img_wtr Img_xoimg_(byte[] src, int bgn, int end) {img_xoimg.Set_by_mid(src, bgn, end); return this;} + public Xoh_img_wtr Img_xoimg_(Bfr_arg v) {img_xoimg.Set_by_arg(v); return this;} public Xoh_img_wtr Img_cls_(Bfr_arg v) {img_cls.Set_by_arg(v); return this;} public Xoh_img_wtr Img_src_(Bfr_arg v) {img_src.Set_by_arg(v); return this;} public Xoh_img_wtr Img_src_empty_() {img_src.Set_by_bry(Bry_.Empty); return this;} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_parser.java index 817792520..fb3d06e02 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_anch_cls_parser.java @@ -22,7 +22,7 @@ public class Xoh_anch_cls_parser { private final Bry_rdr rdr = new Bry_rdr(); public byte Tid() {return tid;} private byte tid; public Html_atr Atr() {return atr;} private Html_atr atr; - public boolean Parse(Bry_rdr owner_rdr, byte[] src, Html_tag tag) { + public boolean Parse(Bry_err_wkr err_wkr, byte[] src, Html_tag tag) { this.atr = tag.Atrs__get_by_or_empty(Html_atr_.Bry__class); // EX: class='image' int src_bgn = atr.Val_bgn(); int src_end = atr.Val_end(); if (src_bgn == -1) { @@ -30,7 +30,7 @@ public class Xoh_anch_cls_parser { return false; } else { - rdr.Init_by_sub(owner_rdr, "anch.cls", src_bgn, src_end); + rdr.Init_by_wkr(err_wkr, "anch.cls", src_bgn, src_end); this.tid = rdr.Chk_or(Xoh_anch_cls_.Trie, Byte_ascii.Max_7_bit); return tid != Byte_ascii.Max_7_bit; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_cls_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_cls_parser.java index 63f7fef09..894eb62a3 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_cls_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_cls_parser.java @@ -25,17 +25,17 @@ public class Xoh_img_cls_parser { public int Other_end() {return other_end;} private int other_end; public boolean Other_exists() {return other_end > other_bgn;} public Html_atr Atr() {return atr;} private Html_atr atr; - public void Parse(Bry_rdr owner_rdr, byte[] src, Html_tag tag) { + public void Parse(Bry_err_wkr err_wkr, byte[] src, Html_tag tag) { this.atr = tag.Atrs__get_by_or_empty(Html_atr_.Bry__class); // EX: class='thumbborder' - Parse(owner_rdr, src, atr.Val_bgn(), atr.Val_end()); + Parse(err_wkr, src, atr.Val_bgn(), atr.Val_end()); } - private void Parse(Bry_rdr owner_rdr, byte[] src, int src_bgn, int src_end) { + private void Parse(Bry_err_wkr err_wkr, byte[] src, int src_bgn, int src_end) { if (src_bgn == -1) { this.cls_tid = Xoh_img_cls_.Tid__none; this.other_bgn = this.other_end = -1; return; } - rdr.Init_by_sub(owner_rdr, "img.cls", src_bgn, src_end); + rdr.Init_by_wkr(err_wkr, "img.cls", src_bgn, src_end); this.cls_tid = rdr.Chk(Xoh_img_cls_.Trie); if (rdr.Is(Byte_ascii.Space)) { this.other_bgn = rdr.Pos(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser.java index f59e5542e..45fea1092 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser.java @@ -20,7 +20,7 @@ import gplx.core.brys.*; import gplx.core.btries.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.xowa.wikis.domains.*; public class Xoh_img_src_parser implements Xoh_itm_parser { - private final Bry_rdr rdr = new Bry_rdr(); private byte[] src; + private final Bry_rdr rdr = new Bry_rdr().Dflt_dlm_(Byte_ascii.Slash); private byte[] src; public void Fail_throws_err_(boolean v) {rdr.Fail_throws_err_(v);}// TEST public int Val_bgn() {return val_bgn;} private int val_bgn; public int Val_end() {return val_end;} private int val_end; @@ -45,18 +45,18 @@ public class Xoh_img_src_parser implements Xoh_itm_parser { file_ttl_bry = null; atr = null; } - public boolean Parse(Bry_rdr owner_rdr, byte[] domain_bry, Html_tag tag) { + public boolean Parse(Bry_err_wkr err_wkr, byte[] domain_bry, Html_tag tag) { this.Clear(); this.atr = tag.Atrs__get_by_or_empty(Html_atr_.Bry__src); - if (!atr.Val_dat_exists()) return true; // empty src; just return true; - return Parse(owner_rdr, domain_bry, atr.Val_bgn(), atr.Val_end()); + return Parse(err_wkr, domain_bry, atr.Val_bgn(), atr.Val_end()); } - public boolean Parse(Bry_rdr owner_rdr, byte[] domain_bry, int val_bgn, int val_end) { // EX: src="file:///C:/xowa/file/commons.wikimedia.org/thumb/7/0/1/2/A.png/220px.png" + public boolean Parse(Bry_err_wkr err_wkr, byte[] domain_bry, int val_bgn, int val_end) { // EX: src="file:///C:/xowa/file/commons.wikimedia.org/thumb/7/0/1/2/A.png/220px.png" this.Clear(); - this.src = owner_rdr.Src(); + this.src = err_wkr.Src(); this.val_bgn = val_bgn; this.val_end = val_end; + if (val_end == val_bgn) return true; // empty src; just return true; file_w = file_time = file_page = -1; - rdr.Init_by_sub(owner_rdr, "img.src.xowa", val_bgn, val_end).Dflt_dlm_(Byte_ascii.Slash); + rdr.Init_by_wkr(err_wkr, "img.src.xowa", val_bgn, val_end); rdr.Fail_throws_err_(Bool_.N); repo_bgn = rdr.Find_fwd_rr(Bry__file); // skip past /file/; EX: "file:///J:/xowa/file/commons.wikimedia.org/" if (repo_bgn == -1) return false; diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser_tst.java index af50f8a25..413268048 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_src_parser_tst.java @@ -36,8 +36,7 @@ public class Xoh_img_src_parser_tst { // fxt.Test__parse__fail("file:///C:/xowa/file/en.wiktionary.org/orig/7/0/A.png", "repo must be commons or self: repo='en.wiktionary.org' ctx='Main_Page' wkr='img.src.xowa' excerpt='file:///C:/xowa/file/en.wiktionary.org/orig/7/0/A.png'"); // } } -class Xoh_img_src_parser_fxt extends Xoh_itm_parser_fxt_base { - private final Xoh_img_src_parser parser = new Xoh_img_src_parser(); +class Xoh_img_src_parser_fxt extends Xoh_itm_parser_fxt { private final Xoh_img_src_parser parser = new Xoh_img_src_parser(); @Override public Xoh_itm_parser Parser_get() {return parser;} public void Test__parse(String src_str, String expd_repo, boolean expd_file_is_orig, String expd_file, int expd_w, int expd_time, int expd_page) { Exec_parse(src_str); @@ -48,7 +47,7 @@ class Xoh_img_src_parser_fxt extends Xoh_itm_parser_fxt_base { Tfds.Eq_int(expd_time, parser.File_time()); Tfds.Eq_int(expd_page, parser.File_page()); } - @Override public void Exec_parse_hook(Bry_rdr owner_rdr, int src_bgn, int src_end) { - parser.Parse(owner_rdr, Xow_domain_itm_.Bry__enwiki, src_bgn, src_end); + @Override public void Exec_parse_hook(Bry_err_wkr err_wkr, Xoh_hdoc_ctx hctx, int src_bgn, int src_end) { + parser.Parse(err_wkr, Xow_domain_itm_.Bry__enwiki, src_bgn, src_end); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_xoimg_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_xoimg_hzip.java new file mode 100644 index 000000000..930d7778f --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_xoimg_hzip.java @@ -0,0 +1,67 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.wkrs.imgs.atrs; 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.imgs.*; +import gplx.core.brys.*; +import gplx.xowa.htmls.core.hzips.*; +import gplx.xowa.parsers.lnkis.*; import gplx.xowa.files.*; +public class Xoh_img_xoimg_hzip { + public void Encode(Bry_bfr bfr, Xoh_stat_itm stat_itm, byte[] src, Xoh_img_xoimg_parser arg) { + boolean page_exists = arg.Lnki_page() != Xof_lnki_page.Null; + boolean time_exists = arg.Lnki_time() != Xof_lnki_time.Null; + boolean upright_exists = arg.Lnki_upright() != Xof_img_size.Upright_null; + boolean height_exists = arg.Lnki_h() != Xof_img_size.Size__neg1; + boolean width_exists = arg.Lnki_w() != Xof_img_size.Size__neg1; + flag_bldr.Set(Flag__page_exists , page_exists); + flag_bldr.Set(Flag__time_exists , time_exists); + flag_bldr.Set(Flag__upright_exists , upright_exists); + flag_bldr.Set(Flag__height_exists , height_exists); + flag_bldr.Set(Flag__width_exists , width_exists); + flag_bldr.Set(Flag__lnki_type , arg.Lnki_type()); + Xoh_hzip_int_.Encode(1, bfr, flag_bldr.Encode()); + if (width_exists) Xoh_hzip_int_.Encode(2, bfr, arg.Lnki_w()); + if (height_exists) Xoh_hzip_int_.Encode(2, bfr, arg.Lnki_h()); + if (upright_exists) bfr.Add_double(arg.Lnki_upright()).Add_byte(Xoh_hzip_dict_.Escape); + if (time_exists) bfr.Add_double(arg.Lnki_time()).Add_byte(Xoh_hzip_dict_.Escape); + if (page_exists) Xoh_hzip_int_.Encode(2, bfr, arg.Lnki_page()); + } + public void Decode(Bry_bfr bfr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, Xoh_img_xoimg_parser arg) { + int flag = rdr.Read_int_by_base85(1); + flag_bldr.Decode(flag); + boolean page_exists = flag_bldr.Get_as_bool(Flag__page_exists); + boolean time_exists = flag_bldr.Get_as_bool(Flag__time_exists); + boolean upright_exists = flag_bldr.Get_as_bool(Flag__upright_exists); + boolean height_exists = flag_bldr.Get_as_bool(Flag__height_exists); + boolean width_exists = flag_bldr.Get_as_bool(Flag__width_exists); + byte tid = flag_bldr.Get_as_byte(Flag__lnki_type); + int w = width_exists ? rdr.Read_int_by_base85(2) : Xof_img_size.Size__neg1; + int h = height_exists ? rdr.Read_int_by_base85(2) : Xof_img_size.Size__neg1; + double upright = upright_exists ? rdr.Read_double_to(Xoh_hzip_dict_.Escape) : Xof_img_size.Upright_null; + double time = time_exists ? rdr.Read_double_to(Xoh_hzip_dict_.Escape) : Xof_lnki_time.Null; + int page = page_exists ? rdr.Read_int_by_base85(2) : Xof_lnki_page.Null; + arg.Set(tid, w, h, upright, time, page); + } + private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_( 1, 1 , 1, 1, 1, 3); + private static final int // SERIALIZED + Flag__page_exists = 0 + , Flag__time_exists = 1 + , Flag__upright_exists = 2 + , Flag__height_exists = 3 + , Flag__width_exists = 4 // none, thumbimage, thumbborder + , Flag__lnki_type = 5 // null, none, frameless, frame, thumb; gplx.xowa.parsers.lnkis.Xop_lnki_type + ; +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_xoimg_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_xoimg_parser.java index a3e9b3989..d1023bcc2 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_xoimg_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/imgs/atrs/Xoh_img_xoimg_parser.java @@ -18,8 +18,8 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.imgs.atrs; 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.imgs.*; import gplx.core.brys.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; -public class Xoh_img_xoimg_parser { - private final Bry_rdr rdr = new Bry_rdr(); +public class Xoh_img_xoimg_parser implements Bfr_arg { + private final Bry_rdr rdr = new Bry_rdr().Dflt_dlm_(Byte_ascii.Pipe); public int Val_bgn() {return val_bgn;} private int val_bgn; public int Val_end() {return val_end;} private int val_end; public boolean Val_dat_exists() {return val_end > val_bgn;} @@ -32,15 +32,23 @@ public class Xoh_img_xoimg_parser { public void Clear() { val_bgn = val_end = -1; } - public void Parse(Bry_rdr owner_rdr, byte[] src, Html_tag tag) { - Html_atr atr = tag.Atrs__get_by_or_empty(Bry__name); - Parse(owner_rdr, src, atr.Val_bgn(), atr.Val_end()); + public void Set(byte tid, int w, int h, double upright, double time, int page) { + this.lnki_type = tid; + this.lnki_w = w; + this.lnki_h = h; + this.lnki_upright = upright; + this.lnki_time = time; + this.lnki_page = page; } - public void Parse(Bry_rdr owner_rdr, byte[] src, int src_bgn, int src_end) { + public void Parse(Bry_err_wkr err_wkr, byte[] src, Html_tag tag) { + Html_atr atr = tag.Atrs__get_by_or_empty(Bry__name); + Parse(err_wkr, src, atr.Val_bgn(), atr.Val_end()); + } + public void Parse(Bry_err_wkr err_wkr, byte[] src, int src_bgn, int src_end) { if (src_bgn == -1) this.Clear(); else { - rdr.Init_by_sub(owner_rdr, "img.xoimg", src_bgn, src_end).Dflt_dlm_(Byte_ascii.Pipe); + rdr.Init_by_wkr(err_wkr, "img.xoimg", src_bgn, src_end); this.val_bgn = src_bgn; this.val_end = src_end; this.lnki_type = (byte)(rdr.Read_byte_to() - Byte_ascii.Num_0); @@ -51,6 +59,16 @@ public class Xoh_img_xoimg_parser { this.lnki_page = rdr.Read_int_to(); } } + public void Bfr_arg__clear() {} + public boolean Bfr_arg__exists() {return true;} + public void Bfr_arg__add(Bry_bfr bfr) { + bfr.Add_int_variable(lnki_type).Add_byte_pipe(); + bfr.Add_int_variable(lnki_w).Add_byte_pipe(); + bfr.Add_int_variable(lnki_h).Add_byte_pipe(); + bfr.Add_double(lnki_upright).Add_byte_pipe(); + bfr.Add_double(lnki_time).Add_byte_pipe(); + bfr.Add_int_variable(lnki_page); + } public static final byte[] Bry__name = Bry_.new_a7("data-xoimg") , Bry__html = Bry_.new_a7("\" data-xoimg=\"") diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_dict_.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_dict_.java index 115445b11..9e8704094 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_dict_.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_dict_.java @@ -30,8 +30,8 @@ public class Xoh_lnke_dict_ { , Html__rhs_end = Bry_.new_a7("\">") ; public static byte[] - Html__rel__nofollow = Bry_.new_a7("nofollow") - , Html__cls__external = Bry_.new_a7("external") + Html__rel__nofollow = Bry_.new_a7("nofollow") + , Html__cls__external = Bry_.new_a7("external") ; public static final Hash_adp_bry Hash = Hash_adp_bry.ci_a7() .Add_bry_byte(Html__class__free, Type__free) diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java index 9183677b5..8cde1dd57 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html.java @@ -26,7 +26,7 @@ public class Xoh_lnke_html { byte lnke_type = Calc_type(lnke); if (!hctx.Mode_is_alt()) { // do not write "" if mode is alt bfr.Add(Xoh_consts.A_bgn); - if (Write_href(bfr, ctx, src, lnke, href_bgn, href_end, proto_is_xowa)) + if (Write_href(bfr, hctx, ctx, src, lnke, href_bgn, href_end, proto_is_xowa)) bfr.Add(Xoh_lnke_dict_.Html__atr__0).Add(Xoh_lnke_dict_.To_html_class(lnke_type)); bfr.Add(Xoh_lnke_dict_.Html__rhs_end); } @@ -37,9 +37,9 @@ public class Xoh_lnke_html { bfr.Add(Xoh_consts.A_end); } } - public boolean Write_href(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke, int href_bgn, int href_end, boolean proto_is_xowa) { + public boolean Write_href(Bry_bfr bfr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke, int href_bgn, int href_end, boolean proto_is_xowa) { byte[] lnke_xwiki_wiki = lnke.Lnke_xwiki_wiki(); - if (lnke_xwiki_wiki == null) { + if (lnke_xwiki_wiki == null || hctx.Mode_is_hdump()) { // if hdump, never write xwiki format (/site/); always write in url format (https:); note that xwiki is set when wiki is installed locally if (lnke.Lnke_relative()) { // relative; EX: //a.org bfr.Add(ctx.Wiki().Utl__url_parser().Url_parser().Relative_url_protocol_bry()).Add_mid(src, href_bgn, href_end); return true; @@ -62,7 +62,7 @@ public class Xoh_lnke_html { .Add(href_encoder.Encode(lnke.Lnke_xwiki_page())); // NOTE: must encode page; EX:%22%3D -> '">' which will end attribute; PAGE:en.w:List_of_Category_A_listed_buildings_in_West_Lothian DATE:2014-07-15 if (lnke.Lnke_xwiki_qargs() != null) Gfo_qarg_mgr.Concat_bfr(bfr, href_encoder, lnke.Lnke_xwiki_qargs()); // NOTE: must encode args - return ctx.Wiki().App().Xwiki_mgr__missing(lnke_xwiki_wiki); + return ctx.Wiki().App().Xwiki_mgr__missing(lnke_xwiki_wiki); // write "external" if hdump or xwiki is missing } } public void Write_caption(Bry_bfr bfr, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_ctx ctx, byte[] src, Xop_lnke_tkn lnke, int href_bgn, int href_end, boolean proto_is_xowa) { diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html__basic__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html__basic__tst.java index 1c4a0eac8..2ed4fb4cf 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html__basic__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_html__basic__tst.java @@ -32,4 +32,15 @@ public class Xoh_lnke_html__basic__tst { fxt.Wiki().Sys_cfg().Xowa_proto_enabled_(false); fxt.Test_parse_page_wiki_str("[xowa-cmd:\"a\" b]" , "[xowa-cmd:"a" b]"); // protocol is disabled: literalize String (i.e.: don't make it an anchor) } + @Test public void Xwiki() { + String wtxt = "[//en.wiktionary.org/wiki/A B]"; + String html_https = "B"; + String html_xwiki = "B"; + fxt.Test__parse__wtxt_to_html(wtxt, html_https); // https b/c wiki not installed + fxt.Init_xwiki_add_user_("en.wiktionary.org"); + fxt.Test__parse__wtxt_to_html(wtxt, html_xwiki); // xwiki b/c wiki installed + fxt.Hctx_(gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Hdump); + fxt.Test__parse__wtxt_to_html(wtxt, html_https); // https b/c hdump, even though wiki installed + fxt.Hctx_(gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Basic); + } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java index cf7235266..f83267850 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip.java @@ -20,71 +20,50 @@ import gplx.core.brys.*; import gplx.core.threads.poolables.*; import gplx.xowa. import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; public class Xoh_lnke_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { public String Key() {return Xoh_hzip_dict_.Key__lnke;} - public Xoh_lnke_hzip Encode(Bry_bfr bfr, Hzip_stat_itm stat_itm, byte[] src, Xoh_lnke_parser arg) { - byte anch_cls_type = arg.Anch_cls_type(); - boolean auto_exists = arg.Auto_id() != -1; - boolean text_exists = arg.Capt_end() != -1; - flag_bldr.Set(Flag__auto_exists , auto_exists); - flag_bldr.Set(Flag__text_exists , text_exists); - flag_bldr.Set(Flag__anch_cls , anch_cls_type); + public byte[] Hook() {return hook;} private byte[] hook; + public Gfo_poolable_itm Encode(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_lnke_parser data = (Xoh_lnke_parser)data_obj; + boolean auto_exists = flag_bldr.Set_as_bool(Flag__auto_exists , data.Auto_id() != -1); + boolean capt_exists = flag_bldr.Set_as_bool(Flag__capt_exists , data.Capt_exists()); + byte lnke_tid = flag_bldr.Set_as_byte(Flag__lnke_tid , data.Lnke_tid()); - switch (anch_cls_type) { - case Xoh_lnke_dict_.Type__free: stat_itm.Lnke__free__add();break; - case Xoh_lnke_dict_.Type__auto: stat_itm.Lnke__auto__add(); break; - case Xoh_lnke_dict_.Type__text: stat_itm.Lnke__text__add(); break; - } + bfr.Add(hook); + bfr.Add_hzip_int(1, flag_bldr.Encode()); // add flag + bfr.Add_hzip_mid(src, data.Href_bgn(), data.Href_end()); // add href + if (auto_exists) bfr.Add_hzip_int(1, data.Auto_id()); // add autonumber + if (capt_exists) bfr.Add_hzip_mid(src, data.Capt_bgn(), data.Capt_end()); // add caption - bfr.Add(Xoh_hzip_dict_.Bry__lnke); // add hook - Xoh_hzip_int_.Encode(1, bfr, flag_bldr.Encode()); // add flag - bfr.Add_mid(src, arg.Href_bgn(), arg.Href_end()); // add href - bfr.Add_byte(Xoh_hzip_dict_.Escape); - if (auto_exists) - Xoh_hzip_int_.Encode(1, bfr, arg.Auto_id()); - else if (text_exists) { - bfr.Add_mid(src, arg.Capt_bgn(), arg.Capt_end()); // add capt - bfr.Add_byte(Xoh_hzip_dict_.Escape); - } + hctx.Hzip__stat().Lnke_add(lnke_tid); return this; } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx ctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { - int flag = rdr.Read_int_by_base85(1); - flag_bldr.Decode(flag); - boolean auto_exists = flag_bldr.Get_as_bool(Flag__auto_exists); - boolean text_exists = flag_bldr.Get_as_bool(Flag__text_exists); - byte anch_cls_type = flag_bldr.Get_as_byte(Flag__anch_cls); + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { + int flag = rdr.Read_int_by_base85(1); flag_bldr.Decode(flag); + boolean auto_exists = flag_bldr.Get_as_bool(Flag__auto_exists); + boolean capt_exists = flag_bldr.Get_as_bool(Flag__capt_exists); + byte lnke_tid = flag_bldr.Get_as_byte(Flag__lnke_tid); - int href_bgn = rdr.Pos(); - int href_end = rdr.Find_fwd_lr(); + int href_bgn = rdr.Pos(); int href_end = rdr.Find_fwd_lr(); int auto_id = -1, capt_bgn = -1, capt_end = -1; - if (auto_exists) - auto_id = rdr.Read_int_by_base85(1); - else if (text_exists) { - capt_bgn = rdr.Pos(); - capt_end = rdr.Find_fwd_lr(); - } + if (auto_exists) auto_id = rdr.Read_int_by_base85(1); + if (capt_exists) {capt_bgn = rdr.Pos(); capt_end = rdr.Find_fwd_lr();} int rv = rdr.Pos(); bfr.Add(Html_bldr_.Bry__a_lhs_w_href); bfr.Add_mid(src, href_bgn, href_end); - bfr.Add(Xoh_lnke_dict_.Html__atr__0).Add(Xoh_lnke_dict_.To_html_class(anch_cls_type)).Add(Xoh_lnke_dict_.Html__rhs_end); - if (auto_exists) - bfr.Add_byte(Byte_ascii.Brack_bgn).Add_int_variable(auto_id).Add_byte(Byte_ascii.Brack_end); - else if (text_exists) - bfr.Add_mid(src, capt_bgn, capt_end); - else - bfr.Add_mid(src, href_bgn, href_end); + bfr.Add(Xoh_lnke_dict_.Html__atr__0).Add(Xoh_lnke_dict_.To_html_class(lnke_tid)).Add(Xoh_lnke_dict_.Html__rhs_end); + if (auto_exists) bfr.Add_byte(Byte_ascii.Brack_bgn).Add_int_variable(auto_id).Add_byte(Byte_ascii.Brack_end); + else if (capt_exists) bfr.Add_mid(src, capt_bgn, capt_end); + else bfr.Add_mid(src, href_bgn, href_end); bfr.Add(Html_bldr_.Bry__a_rhs); return rv; } - public int Pool__idx() {return pool_idx;} private int pool_idx; - public void Pool__clear (Object[] args) {} - public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; - public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_lnke_hzip rv = new Xoh_lnke_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} + 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_lnke_hzip rv = new Xoh_lnke_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, 2); private static final int // SERIALIZED Flag__auto_exists = 0 - , Flag__text_exists = 1 - , Flag__anch_cls = 2 // "free", "autonumber", "text" + , Flag__capt_exists = 1 + , Flag__lnke_tid = 2 // "free", "autonumber", "text" ; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip_tst.java index 7eae2b738..6d04a3b31 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_hzip_tst.java @@ -22,18 +22,33 @@ public class Xoh_lnke_hzip_tst { @Test public void Free() { fxt.Test__bicode("~#!http://a.org~", Xoh_lnke_html__hdump__tst.Html__free); } + @Test public void Free__ws_at_end() { + fxt.Test__bicode("~#%https://a.org/. ~https://a.org/.~", "https://a.org/."); + } @Test public void Auto() { fxt.Test__bicode("~#*http://a.org~\"", Xoh_lnke_html__hdump__tst.Html__auto); } - @Test public void Text() { - fxt.Test__bicode("~#'http://a.org~a~", Xoh_lnke_html__hdump__tst.Html__text); - } - @Test public void Text__tidy() { // PURPOSE:handle reparenting of html elements by HTML tidy EX:[http://a.org]; DATE:2015-08-25 + @Test public void Auto__tidy() { // PURPOSE:handle reparenting of html elements by HTML tidy EX:[http://a.org]; DATE:2015-08-25 fxt.Test__bicode ( "~#&http://a.org~[123]~" , "[123]" ); } + @Test public void Auto__invalid_number() { + String html = "[abc]"; + fxt.Test__bicode("~#&http://a.org~[abc]~", html); + } + @Test public void Text() { + fxt.Test__bicode("~#'http://a.org~a~", Xoh_lnke_html__hdump__tst.Html__text); + } +// @Test public void Xwiki__exists() { +// String hzip = "~#'https://en.wiktionary.org/wiki/A~A~"; +// String html_https = "A"; +// String html_xwiki = "A"; +// fxt.Test__bicode(hzip, html_https); +// fxt.Init_wiki_installed("en.wiktionary.org"); +// fxt.Test__decode(hzip, html_xwiki); +// } @Test public void Fail__href() { String html = "a"; fxt.Test__encode__fail(html, html); @@ -42,8 +57,4 @@ public class Xoh_lnke_hzip_tst { String html = "a"; fxt.Test__encode__fail(html, html); } - @Test public void Fail__auto() { - String html = "[abc]"; - fxt.Test__encode__fail(html, html); - } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_parser.java index b1cd0e860..f4f91bb94 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_parser.java @@ -20,40 +20,53 @@ import gplx.core.brys.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.xowa.htmls.hrefs.*; public class Xoh_lnke_parser { private final Bry_rdr rdr = new Bry_rdr(); - public int Rng_bgn() {return rng_bgn;} private int rng_bgn; - public int Rng_end() {return rng_end;} private int rng_end; - public byte Anch_cls_type() {return anch_cls_type;} private byte anch_cls_type; + public int Src_bgn() {return src_bgn;} private int src_bgn; + public int Src_end() {return src_end;} private int src_end; + public byte Lnke_tid() {return lnke_tid;} private byte lnke_tid; public int Auto_id() {return auto_id;} private int auto_id; public int Href_bgn() {return href_bgn;} private int href_bgn; public int Href_end() {return href_end;} private int href_end; public int Capt_bgn() {return capt_bgn;} private int capt_bgn; public int Capt_end() {return capt_end;} private int capt_end; + public boolean Capt_exists() {return capt_exists;} private boolean capt_exists; private void Clear() { - anch_cls_type = Byte_ascii.Max_7_bit; - auto_id = rng_bgn = rng_end = href_bgn = href_end = capt_bgn = capt_end = -1; + lnke_tid = Byte_ascii.Max_7_bit; + capt_exists = false; + src_bgn = src_end = href_bgn = href_end = capt_bgn = capt_end = auto_id = -1; } - public int Parse(Xoh_hdoc_wkr hdoc_wkr, Html_tag_rdr tag_rdr, Html_tag anch_head) { + public boolean Parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Html_tag_rdr tag_rdr, byte[] src, Html_tag anch_head) { this.Clear(); - this.rng_bgn = anch_head.Src_bgn(); - rdr.Init_by_hook("lnke", rng_bgn, rng_bgn); + this.src_bgn = anch_head.Src_bgn(); + rdr.Init_by_sect("lnke", src_bgn, src_bgn); Html_atr href_atr = anch_head.Atrs__get_by_or_fail(Html_atr_.Bry__href); // get href; "EX: href='http://a.org'" this.href_bgn = href_atr.Val_bgn(); this.href_end = href_atr.Val_end(); - this.anch_cls_type = anch_head.Atrs__cls_find_or_fail(Xoh_lnke_dict_.Hash); // get type by class; EX: "class='external free'" - boolean capt_exists = false; - switch (anch_cls_type) { - case Xoh_lnke_dict_.Type__text: capt_exists = true; break; + this.lnke_tid = anch_head.Atrs__cls_find_or_fail(Xoh_lnke_dict_.Hash); // get type by class; EX: "class='external free'" + this.capt_bgn = anch_head.Src_end(); + Html_tag anch_tail = tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__a); // find '' + this.capt_end = anch_tail.Src_bgn(); + switch (lnke_tid) { + case Xoh_lnke_dict_.Type__free: + if (!Bry_.Match(src, href_bgn, href_end, src, capt_bgn, capt_end)) // EX: https://a.org/. + capt_exists = true; + break; + case Xoh_lnke_dict_.Type__text: + capt_exists = true; + break; case Xoh_lnke_dict_.Type__auto: - if (tag_rdr.Read_and_move(Byte_ascii.Brack_bgn)) // HTML tidy can reparent lnkes in strange ways; DATE:2015-08-25 - this.auto_id = tag_rdr.Read_int_to(Byte_ascii.Brack_end); // extract int; EX: "[123]" + if ( src[capt_bgn] == Byte_ascii.Brack_bgn // is capt surround by bracks; EX: "[123]" + && src[capt_end - 1] == Byte_ascii.Brack_end) { + int tmp_id = Bry_.To_int_or(src, capt_bgn + 1, capt_end - 1, -1); // extract int; EX: "[123]" + if (tmp_id == -1) // HTML tidy can reparent lnkes in strange ways; EX: "[123]" DATE:2015-08-25 + capt_exists = true; + else + auto_id = tmp_id; + } else capt_exists = true; break; } - if (capt_exists) this.capt_bgn = anch_head.Src_end(); - Html_tag anch_tail = tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__a); // find '' - if (capt_exists) this.capt_end = anch_tail.Src_bgn(); - this.rng_end = anch_tail.Src_end(); + this.src_end = anch_tail.Src_end(); hdoc_wkr.On_lnke(this); - return rng_end; + return true; } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_wtr.java index 02ee1d729..3ca6933af 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_lnke_wtr.java @@ -21,7 +21,6 @@ import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; public class Xoh_lnke_wtr extends gplx.core.brys.Bfr_arg_base { private final Bfr_arg[] arg_ary; - private final Bfr_arg__indent indent = new Bfr_arg__indent(); private final Bfr_arg__html_atr anch_href = new Bfr_arg__html_atr(Html_atr_.Bry__href) , anch_rel = new Bfr_arg__html_atr(Html_atr_.Bry__rel) @@ -29,9 +28,8 @@ public class Xoh_lnke_wtr extends gplx.core.brys.Bfr_arg_base { ; private final Bfr_arg__wrapper anch_capt = new Bfr_arg__wrapper(); public Xoh_lnke_wtr() { - arg_ary = new Bfr_arg[] {indent, anch_href, anch_rel, anch_cls, anch_capt}; + arg_ary = new Bfr_arg[] {anch_href, anch_rel, anch_cls, anch_capt}; } - public Xoh_lnke_wtr Indent_(int v) {indent.Set(v); return this;} public Xoh_lnke_wtr Anch_href_(byte[] src, int bgn, int end) {anch_href.Set_by_mid(src, bgn, end); return this;} public Xoh_lnke_wtr Anch_rel_y_() {anch_rel.Set_by_bry(Xoh_lnke_dict_.Html__rel__nofollow); return this;} public Xoh_lnke_wtr Anch_cls_(byte[]... ary) {anch_cls.Set_by_ary(ary); return this;} @@ -45,6 +43,6 @@ public class Xoh_lnke_wtr extends gplx.core.brys.Bfr_arg_base { fmtr.Bld_bfr_many(bfr, (Object[])arg_ary); } private static final Bry_fmtr fmtr = Bry_fmtr.new_ - ( "~{indent}~{anch_capt}" - , "indent", "anch_href", "anch_rel", "anch_cls", "anch_capt"); + ( "~{anch_capt}" + , "anch_href", "anch_rel", "anch_cls", "anch_capt"); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_href_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/atrs/Xoh_href_hzip.java similarity index 97% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_href_hzip.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/atrs/Xoh_href_hzip.java index 708962fb0..fab8adfec 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/Xoh_href_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkes/atrs/Xoh_href_hzip.java @@ -19,7 +19,7 @@ along with this program. If not, see . // using gplx.core.btries; // using gplx.xowa.htmls.core.hzips; // public class Xoh_hzip_href { -// public void Save(Bry_bfr bfr, Hzip_stat_itm stats, byte[] src, int src_len, int bgn, int pos, byte bgn_quote) { +// public void Save(Bry_bfr bfr, Xoh_stat_itm stats, byte[] src, int src_len, int bgn, int pos, byte bgn_quote) { //// // ignore anchors; EX: "#a" //// int proto_bgn = pos; //// int proto_end = Bry_find_.Find_fwd(src, Byte_ascii.Colon, proto_bgn, src_len); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_dict_.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_dict_.java index 37c7aa4b6..704ec1121 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_dict_.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_dict_.java @@ -19,6 +19,7 @@ package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; impo import gplx.core.brys.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; public class Xoh_lnki_dict_ { + public static void Ns_encode(Xoh_hzip_bfr bfr, int ns_id) {bfr.Add_hzip_int(1, ns_id + 2);} public static void Ns_encode(Bry_bfr bfr, int ns_id) { gplx.xowa.htmls.core.hzips.Xoh_hzip_int_.Encode(1, bfr, ns_id + 2); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_html__hdump__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_html__hdump__tst.java index 773caf9e2..31faf085d 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_html__hdump__tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_html__hdump__tst.java @@ -19,18 +19,13 @@ package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; impo import org.junit.*; import gplx.xowa.htmls.core.makes.tests.*; public class Xoh_lnki_html__hdump__tst { private final Xoh_make_fxt fxt = new Xoh_make_fxt(); - public static final String - Html__same = "A" - , Html__diff = "b" - , Html__trail = "Ab" - , Html__xwiki = "wikt:a" - ; @Before public void init() {fxt.Clear();} - @Test public void Same() {fxt.Test__html("[[A]]" , Html__same);} - @Test public void Diff() {fxt.Test__html("[[A|b]]" , Html__diff);} - @Test public void Trail() {fxt.Test__html("[[A]]b" , Html__trail);} + @Test public void Same() {fxt.Test__html("[[A]]" , "A");} + @Test public void Diff() {fxt.Test__html("[[A|b]]" , "b");} + @Test public void Trail() {fxt.Test__html("[[A]]b" , "Ab");} @Test public void Xwiki() { fxt.Parser_fxt().Init_xwiki_add_wiki_and_user_("wikt", "en.wiktionary.org"); - fxt.Test__html("[[wikt:a]]", Html__xwiki); + fxt.Test__html("[[wikt:a]]", "wikt:a"); } + @Test public void Anch() {fxt.Test__html("[[#a]]" , "#a");} } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java index e5a6aec94..4bb4a36b7 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip.java @@ -17,153 +17,186 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.btries.*; import gplx.core.encoders.*; import gplx.core.threads.poolables.*; -import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; +import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; import gplx.langs.htmls.encoders.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.parsers.lnkis.*; public class Xoh_lnki_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { + private final Bry_bfr tmp_bfr = Bry_bfr.new_(32); public String Key() {return Xoh_hzip_dict_.Key__lnki;} - public Xoh_lnki_hzip Encode(Bry_bfr bfr, Xoh_hdoc_ctx hctx, Hzip_stat_itm stat_itm, byte[] src, Xoh_lnki_parser arg) { - byte text_type = arg.Text_type(); - Xoh_anch_href_parser anch_href_parser = arg.Href_parser(); - int page_ns_id = anch_href_parser.Page_ns_id(); - boolean page_ns_id_is_not_main = page_ns_id != Xow_ns_.Tid__main; - int href_type = anch_href_parser.Tid(); - flag_bldr.Set(Flag__ns_is_not_main , page_ns_id_is_not_main); - flag_bldr.Set(Flag__href_type , href_type); - flag_bldr.Set(Flag__text_type , text_type); + public byte[] Hook() {return hook;} private byte[] hook; + public Gfo_poolable_itm Encode(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_lnki_parser data = (Xoh_lnki_parser)data_obj; + Xoh_anch_href_itm href = data.Href_itm(); + int ns_id = href.Ttl_ns_id(); ; + flag_bldr.Set_as_bool(Flag__title_missing_ns , data.Title_missing_ns()); + flag_bldr.Set_as_bool(Flag__ttl_is_main_page , href.Ttl_is_main_page()); + boolean ns_custom_exists= flag_bldr.Set_as_bool(Flag__ns_custom_exists , href.Ttl_ns_custom() != null); + int title_tid = flag_bldr.Set_as_int(Flag__title_tid , href.Tid() == Xoh_anch_href_itm.Tid__anch ? Xoh_lnki_parser.Title__href : data.Title_tid()); // anchs never have title, so don't bother setting flag; + flag_bldr.Set_as_bool(Flag__capt_has_ns , data.Capt_has_ns()); + boolean ns_is_not_main = flag_bldr.Set_as_bool(Flag__ns_is_not_main , ns_id != Xow_ns_.Tid__main); + int href_type = flag_bldr.Set_as_int(Flag__href_type , href.Tid()); + flag_bldr.Set_as_int(Flag__capt_cs0_tid , data.Capt_itm().Cs0_tid()); + byte text_type = flag_bldr.Set_as_byte(Flag__text_type , data.Text_tid()); + // Tfds.Dbg(flag_bldr.Encode(), Array_.To_str(flag_bldr.Val_ary()), text_type); - bfr.Add(Xoh_hzip_dict_.Bry__lnki); - Xoh_hzip_int_.Encode(1, bfr, flag_bldr.Encode()); - if (page_ns_id_is_not_main) - Xoh_lnki_dict_.Ns_encode(bfr, page_ns_id); - if (href_type == Xoh_anch_href_parser.Tid__site) - bfr.Add_mid(src, anch_href_parser.Site_bgn(), anch_href_parser.Site_end()).Add_byte(Xoh_hzip_dict_.Escape); + int bfr_bgn = bfr.Len(); + int flag = flag_bldr.Encode(); + bfr.Add(hook); + bfr.Add_hzip_int(1, flag); + if (href_type == Xoh_anch_href_itm.Tid__site) bfr.Add_hzip_mid(src, href.Site_bgn(), href.Site_end()); + if (ns_is_not_main) Xoh_lnki_dict_.Ns_encode(bfr, ns_id); + if (ns_custom_exists) bfr.Add_hzip_bry(href.Ttl_ns_custom()); switch (text_type) { - case Xoh_anch_capt_parser.Tid__href: - case Xoh_anch_capt_parser.Tid__href_pipe: - stat_itm.Lnki_text_n_add(); - bfr.Add_mid(arg.Href_bry(), arg.Href_bgn(), arg.Href_end()); - bfr.Add_byte(Xoh_hzip_dict_.Escape); + case Xoh_anch_capt_itm.Tid__same: + bfr.Add_hzip_mid(data.Href_src(), data.Href_bgn(), data.Href_end()); break; - case Xoh_anch_capt_parser.Tid__capt: - case Xoh_anch_capt_parser.Tid__href_trail: - case Xoh_anch_capt_parser.Tid__capt_short: - stat_itm.Lnki_text_y_add(); - bfr.Add_mid(arg.Href_bry(), arg.Href_bgn(), arg.Href_end()); - bfr.Add_byte(Xoh_hzip_dict_.Escape); - bfr.Add_mid(arg.Capt_bry(), arg.Capt_bgn(), arg.Capt_end()); - bfr.Add_byte(Xoh_hzip_dict_.Escape); + case Xoh_anch_capt_itm.Tid__diff: + case Xoh_anch_capt_itm.Tid__more: + case Xoh_anch_capt_itm.Tid__less: + bfr.Add_hzip_mid(data.Text_0_src(), data.Text_0_bgn(), data.Text_0_end()); + bfr.Add_hzip_mid(data.Text_1_src(), data.Text_1_bgn(), data.Text_1_end()); break; } + if (title_tid == Xoh_lnki_parser.Title__diff) bfr.Add_hzip_mid(src, data.Title_bgn(), data.Title_end()); + + hctx.Hzip__stat().Lnki_add(data.Src_end() - data.Src_bgn(), bfr.Len() - bfr_bgn, flag); return this; } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { - int flag = rdr.Read_int_by_base85(1); - flag_bldr.Decode(flag); - boolean page_ns_id_is_not_main = flag_bldr.Get_as_bool(Flag__ns_is_not_main); + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { + int flag = rdr.Read_int_by_base85(1); flag_bldr.Decode(flag); + boolean title_missing_ns = flag_bldr.Get_as_bool(Flag__title_missing_ns); + boolean ttl_is_main_page = flag_bldr.Get_as_bool(Flag__ttl_is_main_page); + boolean ns_custom_exists = flag_bldr.Get_as_bool(Flag__ns_custom_exists); + byte title_tid = flag_bldr.Get_as_byte(Flag__title_tid); + boolean capt_has_ns = flag_bldr.Get_as_bool(Flag__capt_has_ns); + boolean ns_is_not_main = flag_bldr.Get_as_bool(Flag__ns_is_not_main); byte href_type = flag_bldr.Get_as_byte(Flag__href_type); + int capt_cs0_tid = flag_bldr.Get_as_int(Flag__capt_cs0_tid); byte text_type = flag_bldr.Get_as_byte(Flag__text_type); - int ns_id = page_ns_id_is_not_main ? Xoh_lnki_dict_.Ns_decode(rdr) : Xow_ns_.Tid__main; - int site_bgn = -1, site_end = -1; - if (href_type == Xoh_anch_href_parser.Tid__site) { - site_bgn = rdr.Pos(); - site_end = rdr.Find_fwd_lr(); - } - int href_bgn = rdr.Pos(); - int href_end = rdr.Find_fwd_lr(); - int capt_bgn = -1, capt_end = -1; + int site_bgn = -1, site_end = -1; if (href_type == Xoh_anch_href_itm.Tid__site) {site_bgn = rdr.Pos(); site_end = rdr.Find_fwd_lr();} + int ns_id = ns_is_not_main ? Xoh_lnki_dict_.Ns_decode(rdr) : Xow_ns_.Tid__main; + byte[] ns_custom_bry = ns_custom_exists ? rdr.Read_bry_to() : null; + int text_0_bgn = rdr.Pos(); int text_0_end = rdr.Find_fwd_lr(); + int text_1_bgn = -1, text_1_end = -1; switch (text_type) { - case Xoh_anch_capt_parser.Tid__capt: - case Xoh_anch_capt_parser.Tid__capt_short: - case Xoh_anch_capt_parser.Tid__href_trail: - capt_bgn = rdr.Pos(); - capt_end = rdr.Find_fwd_lr(); + case Xoh_anch_capt_itm.Tid__diff: case Xoh_anch_capt_itm.Tid__less: case Xoh_anch_capt_itm.Tid__more: + text_1_bgn = rdr.Pos(); text_1_end = rdr.Find_fwd_lr(); break; } - byte[] href_bry = null; - if (text_type == Xoh_anch_capt_parser.Tid__capt_short) - href_bry = Bry_.Add(Bry_.Mid(src, href_bgn, href_end), Bry_.Mid(src, capt_bgn, capt_end)); - else - href_bry = Bry_.Mid(src, href_bgn, href_end); - byte[] title_bry = null; - Xoa_ttl ttl = null; - if (href_type != Xoh_anch_href_parser.Tid__anch) { - switch (href_type) { - case Xoh_anch_href_parser.Tid__site: - Xow_ttl_parser ttl_parser = hctx.App().Wiki_mgri().Get_by_key_or_make_init_n(Bry_.Mid(src, site_bgn, site_end)); - ttl = ttl_parser.Ttl_parse(ns_id, href_bry); - href_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_qarg.Encode(ttl.Full_db()); - title_bry = ttl.Full_txt(); - break; - case Xoh_anch_href_parser.Tid__wiki: - ttl = hctx.Wiki__ttl_parser().Ttl_parse(ns_id, href_bry); if (ttl == null) rdr.Fail("invalid ttl", String_.Empty, String_.new_u8(href_bry)); - href_bry = ttl.Full_db_w_anch(); - href_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Encode(href_bry); // encode for href; EX: "/wiki/A's" -> "/wiki/A&27s" - title_bry = ttl.Full_txt(); - break; - case Xoh_anch_href_parser.Tid__inet: - title_bry = href_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_qarg.Encode(href_bry); - break; + byte[] title_bry = title_tid == Xoh_lnki_parser.Title__diff ? rdr.Read_bry_to() : null; + byte[] href_bry = text_type == Xoh_anch_capt_itm.Tid__less + ? tmp_bfr.Add_mid(src, text_0_bgn, text_0_end).Add_mid(src, text_1_bgn, text_1_end).To_bry_and_clear() + : Bry_.Mid(src, text_0_bgn, text_0_end); + byte[] ns_bry = null; + switch (href_type) { + case Xoh_anch_href_itm.Tid__anch: break; + case Xoh_anch_href_itm.Tid__inet: break; //href_bry = Gfo_url_encoder_.Href_qarg.Encode(href_bry); break; + case Xoh_anch_href_itm.Tid__wiki: + case Xoh_anch_href_itm.Tid__site: + if (ns_custom_exists) { + ns_bry = ns_custom_bry; + tmp_bfr.Add(Xoa_ttl.Replace_spaces(ns_bry)).Add_byte_colon(); // NOTE: Replace_space to handle ns_custom_bry like "Image talk" + } + else { + if (ns_id == Xow_ns_.Tid__main) { + if (ttl_is_main_page) + href_bry = Bry_.Empty; + } + else { + Xow_ns ns = hctx.Wiki__ttl_parser().Ns_mgr().Ids_get_or_null(ns_id); if (ns == null) rdr.Err_wkr().Fail("invalid ns_id", "ns_id", ns_id); + ns_bry = ns.Name_ui(); + tmp_bfr.Add(ns.Name_db()).Add_byte_colon(); + } + } + Gfo_url_encoder encoder = href_type == Xoh_anch_href_itm.Tid__wiki ? Gfo_url_encoder_.Href : Gfo_url_encoder_.Href_qarg; + encoder.Encode(tmp_bfr, href_bry); // encode for href; EX: "/wiki/A's" -> "/wiki/A&27s" + href_bry = tmp_bfr.To_bry_and_clear(); + break; + } + byte[] capt_bry = Xoh_lnki_hzip_.Bld_capt(tmp_bfr, href_type, text_type, capt_has_ns, capt_cs0_tid, ns_bry, src, text_0_bgn, text_0_end, src, text_1_bgn, text_1_end); + if (href_type != Xoh_anch_href_itm.Tid__anch) { + switch (title_tid) { + case Xoh_lnki_parser.Title__missing: title_bry = null; break; + case Xoh_lnki_parser.Title__diff: break; + case Xoh_lnki_parser.Title__href: title_bry = Gfo_url_encoder_.Href.Decode(href_bry); break; + case Xoh_lnki_parser.Title__capt: title_bry = !capt_has_ns && !title_missing_ns && ns_bry != null ? Bry_.Add(ns_bry, Byte_ascii.Colon_bry, capt_bry) : capt_bry; break; } } // gen html bfr.Add(Html_bldr_.Bry__a_lhs_w_href); switch (href_type) { - case Xoh_anch_href_parser.Tid__anch: + case Xoh_anch_href_itm.Tid__anch: bfr.Add_byte(Byte_ascii.Hash); // "#" break; - case Xoh_anch_href_parser.Tid__site: + case Xoh_anch_href_itm.Tid__site: bfr.Add(Xoh_href_.Bry__site).Add_mid(src, site_bgn, site_end); bfr.Add(Xoh_href_.Bry__wiki); break; - case Xoh_anch_href_parser.Tid__wiki: + case Xoh_anch_href_itm.Tid__wiki: bfr.Add(Xoh_href_.Bry__wiki); break; } bfr.Add(href_bry); - bfr.Add(Html_bldr_.Bry__id__nth).Add_str_a7(gplx.xowa.parsers.lnkis.redlinks.Xopg_redlink_lnki_list.Lnki_id_prefix).Add_int_variable(hctx.Lnki__uid__nxt()); - if (href_type != Xoh_anch_href_parser.Tid__anch) { - bfr.Add(Html_bldr_.Bry__title__nth); - Html_utl.Escape_html_to_bfr(bfr, title_bry, 0, title_bry.length, Bool_.Y, Bool_.Y, Bool_.Y, Bool_.Y, Bool_.N); + if (!hctx.Mode_is_diff()) + bfr.Add(Html_bldr_.Bry__id__nth).Add_str_a7(gplx.xowa.parsers.lnkis.redlinks.Xopg_redlink_lnki_list.Lnki_id_prefix).Add_int_variable(hctx.Lnki__uid__nxt()); + if ( href_type != Xoh_anch_href_itm.Tid__anch) { // anchs never have title; + if (title_bry != null) { + bfr.Add(Html_bldr_.Bry__title__nth); + Html_utl.Escape_html_to_bfr(bfr, title_bry, 0, title_bry.length, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); + } } bfr.Add(Html_bldr_.Bry__lhs_end_head_w_quote); - if ( href_type == Xoh_anch_href_parser.Tid__anch - && text_type != Xoh_anch_capt_parser.Tid__capt ) - bfr.Add_byte(Byte_ascii.Hash); - switch (text_type) { - case Xoh_anch_capt_parser.Tid__href: - if (ns_id == Xow_ns_.Tid__main) - bfr.Add_mid(src, href_bgn, href_end); - else - bfr.Add(ttl.Full_txt()); - break; - case Xoh_anch_capt_parser.Tid__href_pipe: - bfr.Add_mid(src, href_bgn, href_end); - break; - case Xoh_anch_capt_parser.Tid__capt: - bfr.Add_mid(src, capt_bgn, capt_end); - break; - case Xoh_anch_capt_parser.Tid__href_trail: - bfr.Add_mid(src, href_bgn, href_end); - bfr.Add_mid(src, capt_bgn, capt_end); - break; - case Xoh_anch_capt_parser.Tid__capt_short: - bfr.Add_mid(src, href_bgn, href_end); - break; - } + bfr.Add(capt_bry); bfr.Add(Html_bldr_.Bry__a_rhs); return rdr.Pos(); } - public int Pool__idx() {return pool_idx;} private int pool_idx; - public void Pool__clear (Object[] args) {} - public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; - public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_lnki_hzip rv = new Xoh_lnki_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} - private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_ (1, 2, 3); + 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_lnki_hzip rv = new Xoh_lnki_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, 1, 2, 1 , 1, 2, 2, 2); private static final int // SERIALIZED - Flag__ns_is_not_main = 0 - , Flag__href_type = 1 // "wiki", "site", "anch", "inet" - , Flag__text_type = 2 // "href", "capt", "href_trail", "capt_short", "href_pipe" + Flag__title_missing_ns = 0 // [[c:]] -> "/site/commons.wikimedia.org/wiki/" + , Flag__ttl_is_main_page = 1 // [[c:]] -> "/site/commons.wikimedia.org/wiki/" + , Flag__ns_custom_exists = 2 // [[c:category:a]] -> "/site/commons.wikimedia.org/wiki/category:a" + , Flag__title_tid = 3 // href, capt, diff, empty; [//en.wikipedia.org] where en.w is local + , Flag__capt_has_ns = 4 // "A" vs "Help:A" + , Flag__ns_is_not_main = 5 + , Flag__href_type = 6 // "wiki", "site", "anch", "inet" + , Flag__capt_cs0_tid = 7 // exact, lower, upper + , Flag__text_type = 8 // "same", "diff", "more", "less" ; } +class Xoh_lnki_hzip_ { + public static byte[] Bld_capt(Bry_bfr tmp_bfr, byte href_type, byte text_type, boolean capt_has_ns, int capt_cs0, byte[] ns_bry, byte[] text_0_src, int text_0_bgn, int text_0_end, byte[] capt_src, int text_1_bgn, int text_1_end) { + if ( href_type == Xoh_anch_href_itm.Tid__anch + && text_type != Xoh_anch_capt_itm.Tid__diff ) + tmp_bfr.Add_byte(Byte_ascii.Hash); + if (capt_has_ns && ns_bry != null) + tmp_bfr.Add(ns_bry).Add_byte_colon(); + switch (text_type) { + case Xoh_anch_capt_itm.Tid__diff: break; + default: + switch (capt_cs0) { + case Xoh_anch_capt_itm.Cs0__exact: break; + case Xoh_anch_capt_itm.Cs0__lower: tmp_bfr.Add_byte(Byte_ascii.Case_lower(text_0_src[text_0_bgn++]));break; + case Xoh_anch_capt_itm.Cs0__upper: tmp_bfr.Add_byte(Byte_ascii.Case_upper(text_0_src[text_0_bgn++]));break; + } + break; + } + switch (text_type) { + case Xoh_anch_capt_itm.Tid__same: + case Xoh_anch_capt_itm.Tid__less: + tmp_bfr.Add_mid(text_0_src, text_0_bgn, text_0_end); + break; + case Xoh_anch_capt_itm.Tid__diff: + tmp_bfr.Add_mid(capt_src, text_1_bgn, text_1_end); + break; + case Xoh_anch_capt_itm.Tid__more: + tmp_bfr.Add_mid(text_0_src, text_0_bgn, text_0_end); + tmp_bfr.Add_mid(capt_src, text_1_bgn, text_1_end); + break; + } + return tmp_bfr.To_bry_and_clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__anch__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__anch__tst.java new file mode 100644 index 000000000..c73c7deaf --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__anch__tst.java @@ -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 . +*/ +package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; +public class Xoh_lnki_hzip__anch__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Test public void Basic() { // EX: [[#a]] + fxt.Test__bicode("~$Ba~#a~", "#a"); + } + @Test public void Capt() { // EX: [[#a|b]] + fxt.Test__bicode("~$Ba~b~", "b"); + } + @Test public void Capt_similar() { // EX: [[#a|a]] + fxt.Test__bicode("~$Ba~a~", "a"); + } + @Test public void Error() { // EX: [[#a|b]]; make sure bad title character does not cause error + fxt.Test__bicode("~$Ba|b~#a|b~", "#a|b"); // NOTE: the "|" should be url-encoded + } + @Test public void Inet__file() { + fxt.Test__bicode("~$Rfile:///C://A.png~b~", "b"); + } + @Test public void Inet__enc() { + fxt.Test__bicode("~${'Thttps://simple.wikisource.org/wiki/A%C3%A6e~b~Aæe~", "b"); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__diff__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__diff__tst.java new file mode 100644 index 000000000..be8f48987 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__diff__tst.java @@ -0,0 +1,37 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; +public class Xoh_lnki_hzip__diff__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Test public void Diff__basic() { // EX: [[A|b]] + fxt.Test__bicode("~$\"A~b~" , "b"); + } + @Test public void Diff__cs__lo() { // EX: [[A|a]] + fxt.Test__bicode("~$%A~" , "a"); + } + @Test public void Diff__page_w_anch() { // EX: [[A#b|c]] + fxt.Test__bicode("~${'$A#b~b~A~", "b"); + } + @Test public void Capt__nest() { // EX: [[A|B[[C|C1]]D]] + fxt.Test__bicode + ( "~$\"A~BC1D~" + , "BC1D" + ); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__ns__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__ns__tst.java new file mode 100644 index 000000000..f01bcb0c4 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__ns__tst.java @@ -0,0 +1,70 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; +public class Xoh_lnki_hzip__ns__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Test public void Ns__same() { // EX: [[Help:A]] + fxt.Test__bicode("~${#7/A~", "Help:A"); + } + @Test public void Ns__diff() { // EX: [[Help:A_b|c]] + fxt.Test__bicode("~$b/A b~c~", "c"); + } + @Test public void Ns__more() { // EX: [[Help:A|a b]] + fxt.Test__bicode("~$g/A~ b~", "a b"); + } + @Test public void Ns__less() { // EX: [[Help:A_b|a]] + fxt.Test__bicode("~$h/A~ b~", "a"); + } + @Test public void Ns__talk() { // EX: [[Help talk:A b]] + fxt.Test__bicode("~${#70A b~", "Help talk:A b"); + } + @Test public void Ns__talk__diff() { // EX: [[Help talk:A b|cde]] + fxt.Test__bicode("~$b0A b~cde~", "cde"); + } + @Test public void Ns__under() { // EX: [[Help_talk:A_b]]; rare; just make sure codec can handle it; + fxt.Test__bicode("~$b0A b~Help_talk:A_b~", "Help_talk:A_b"); + } + @Test public void Ns__pipe() { // EX: [[Help:A|]] + fxt.Test__bicode("~$a/A~", "A"); + } + @Test public void Ns__pipe_w_words() { // EX: [[Help:A b|]] + fxt.Test__bicode("~$a/A b~", "A b"); + } + @Test public void Ns__anch() { // EX: [[Help:A_b#c|a]] + fxt.Test__bicode("~${'j/A~ b#c~Help:A b~", "a"); + } + @Test public void Ns__anch__alias() { // EX: [[Help:A_b#c|a]] + fxt.Test__bicode("~${3h)Image~A.png#b~c~Image:A.png~", "c"); + } + @Test public void Fake__ns() { // EX: [[Fake:A]] + fxt.Test__bicode("~$!Fake:A~", "Fake:A"); + } + @Test public void Alias__basic() { // EX: [[Image:A]] + fxt.Test__bicode("~${-f)Image~A~B~", "B"); + } + @Test public void Alias__talk() { // EX: [[Image talk:A]] + fxt.Test__bicode("~${/;*Image talk~Human-woman.png~", "Image talk:Human-woman.png"); + } + @Test public void Alias__words() { // EX: [[Image:A b]] + fxt.Test__bicode("~${/;)Image~A b~", "Image:A b"); + } + @Test public void Alias__url_encoding() { // EX: [[Image:Aü.png|b]] + fxt.Test__bicode("~${-f)Image~Aü.png~b~", "b"); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__same__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__same__tst.java new file mode 100644 index 000000000..437645c30 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__same__tst.java @@ -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 . +*/ +package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; +public class Xoh_lnki_hzip__same__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Test public void Same__basic() { // EX: [[A]] + fxt.Test__decode("~$!A~", "A"); + } + @Test public void Same__encoded() { // EX: [[A's]] + String html = "A's"; + fxt.Test__bicode_raw("~$!A's~", html, html); + } + @Test public void Same__encoded__anch() { // EX: [[A#90.51]] + fxt.Test__bicode("~${$%A~#90.51~", "A"); + } + @Test public void Same__encoded__anch__nbsp() { // EX: [[A# B|abc]] + fxt.Test__bicode("~${$#A#.C2.A0B~abc~", "abc"); + } + @Test public void Same__amp() { // EX: [[A&b]] + fxt.Test__bicode("~${$#A&b~A&b~", "A&b"); + } + @Test public void More__basic() { // EX: [[A]]b + fxt.Test__bicode("~$#A~b~", "Ab"); + } + @Test public void Less__cs__eq() { // EX: [[Ab|A]] + fxt.Test__bicode("~$$A~b~", "A"); + } + @Test public void Less__cs__lo() { // EX: [[Ab|a]] + fxt.Test__bicode("~$(A~b~", "a"); + } + @Test public void Less__ns__cs() { // EX: [[Help:A_b|a]]; make sure ns is added correctly, not "aHelp:b" + fxt.Test__bicode("~$h/Ab~ c~", "ab"); + } + @Test public void Ignore__audio() { + String html = "a"; + fxt.Test__bicode(html, html); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__site__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__site__tst.java new file mode 100644 index 000000000..a5046b5f1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip__site__tst.java @@ -0,0 +1,79 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import org.junit.*; +public class Xoh_lnki_hzip__site__tst { + private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_(); + @Test public void Basic() { // EX: [[wikt:A]] + fxt.Test__bicode("~${$3en.wiktionary.org~A~wikt:A~" , "wikt:A"); + } + @Test public void Capt__lower() { // EX: [[wikt:A|a]] + fxt.Test__bicode("~$5en.wiktionary.org~A~" , "a"); + } + @Test public void Capt__upper() { // EX: [[wikt:a|A]] + fxt.Test__bicode("~$9en.wiktionary.org~a~" , "A"); + } + @Test public void Ns__href() { // EX: [[wikt:help:a]] + fxt.Test__bicode("~${a2en.wiktionary.org~/help~a~wikt:help:a~" , "wikt:help:a"); + } + @Test public void Ns__capt() { // EX: [[wikt:help:a|b]] + fxt.Test__bicode("~${d3en.wiktionary.org~/help~a~b~wikt:help:a~" , "b"); // MW: also adds class="extiw" + } + @Test public void Ns__anch() { // EX: [[wikt:Help:A#b]] + fxt.Test__bicode("~${'sen.wiktionary.org~/A#b~Help:A~" , "A#b"); + } + @Test public void Ns__more() { // EX: [[wikt:Help:A]]b + fxt.Test__bicode("~${#Ien.wiktionary.org~/A~b~" , "Help:Ab"); + } + @Test public void Ns__more__name() { // EX: [[wikt:Help:A|Ab|]] + fxt.Test__bicode("~$sen.wiktionary.org~/A~b~" , "Ab"); + } + @Test public void Ns__url_encoding() { // EX: [[wikt:Category:A & B|]] + fxt.Test__bicode("~${$sen.wiktionary.org~1A & B~A & B~" , "A & B"); + } + @Test public void Less__eq() { // EX: [[wikt:Ab|A]] + fxt.Test__bicode("~${*7en.wiktionary.org~A~b~" , "A"); + } + @Test public void Less__lo() { // EX: [[wikt:Ab|a]] + fxt.Test__bicode("~$8en.wiktionary.org~A~b~" , "a"); + } + @Test public void Less__hi() { // EX: [[wikt:ab|A]] + fxt.Test__bicode("~$A"); + } + @Test public void More__hi() { // EX: [[wikt:a|Ab]] + fxt.Test__bicode("~$;en.wiktionary.org~a~b~" , "Ab"); + } + @Test public void Encode__lnki() { // EX: [[wikt:eorðe|eorðe]] + fxt.Test__bicode("~$1en.wiktionary.org~eorðe~" , "eorðe"); + } +// @Test public void Encode__lnke() { // EX: [//en.wiktionary.org/wiki/eorðe eorðe]; NOTE:MW inconsistently does not URL-encode external links (but does URL-encode @gplx.Internal protected ones) +// fxt.Test__bicode("~$)en.wiktionary.org~eorðe~" , "eorðe"); +// } + @Test public void Lnke__ns() { + fxt.Test__bicode("~$qen.wiktionary.org~/a~" , "a"); + } + @Test public void Qarg_lnke() { // EX: [//en.wiktionary.org/wiki/A?b=c d] + fxt.Test__bicode("~${*5en.wiktionary.org~A?b=c~d~" , "d"); + } + @Test public void Qarg_lnki() { // EX: [[wikt:A?b=c|d]] + fxt.Test__bicode("~$2en.wiktionary.org~A?b=c~d~" , "d"); // NOTE: mw encodes as A%3Fb%3Dc + } + @Test public void Main_page() { // EX: [[wikt:]] + fxt.Test__bicode("~${<wikt:"); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip_tst.java deleted file mode 100644 index cc00dc758..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_hzip_tst.java +++ /dev/null @@ -1,113 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.htmls.core.wkrs.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; -import org.junit.*; import gplx.xowa.htmls.core.hzips.*; -public class Xoh_lnki_hzip_tst { - private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt(); - @Test public void Href__basic() { - fxt.Test__bicode("~$!A~", Xoh_lnki_html__hdump__tst.Html__same); - } - @Test public void Href__case_diff() { - fxt.Test__bicode("~$!a~", "a"); - } - @Test public void Href__url_encoded() { - String html = "A's"; - fxt.Test__bicode_raw("~$!A's~", html, html); - } - @Test public void Ns__same() { // EX: [[Help:A]] - fxt.Test__bicode("~$A/A~", "Help:A"); - } - @Test public void Ns__diff() { // EX: [[Help:A_b|c]] - fxt.Test__bicode("~$B/A_b~c~", "c"); - } - @Test public void Ns__space() { // EX: [[Help talk:A b]] - fxt.Test__bicode("~$A0A b~", "Help talk:A b"); - } - @Test public void Ns__under() { // EX: [[Help_talk:A_b]]; rare; just make sure codec can handle it; - fxt.Test__bicode("~$B0A_b~Help_talk:A_b~", "Help_talk:A_b"); - } - @Test public void Ns__pipe() { // EX: [[Help:A|]] - fxt.Test__bicode("~$E/A~", "A"); - } - @Test public void Ns__pipe_w_words() { // EX: [[Help:A b|]] - fxt.Test__bicode("~$E/A b~", "A b"); - } - @Test public void Anch__same() { - fxt.Test__bicode("~$2a~#a~", "#a"); - } - @Test public void Anch__diff() { - fxt.Test__bicode("~$2a~b~", "b"); - } - @Test public void Anch__diff__starts_w_same() { - fxt.Test__bicode("~$2a~a~", "a"); - } - @Test public void Capt__basic() { // EX: [[A|b]] - fxt.Test__bicode("~$\"A~b~", Xoh_lnki_html__hdump__tst.Html__diff); - } - @Test public void Capt__page_w_anch() { // Ex: [[A#b|c]] - fxt.Test__bicode("~$\"A#b~b~", "b"); - } - @Test public void Capt__nest() { - fxt.Test__bicode - ( "~$\"A~C1D~" - , "C1D" - ); - } - @Test public void Capt__reparent() { // PURPOSE: PAGE:en.w:Abyssal_plain; DATE:2015-06-02; DELETE: not needed in new dump format; - fxt.Test__bicode - ( "$\"AA1" - , "A1" - ); - } - @Test public void Capt__xwiki() { - Xow_wiki wiki = fxt.Prep_create_wiki("wikt", "en.wiktionary.org"); - wiki.Ns_mgr().Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); - fxt.Test__bicode("$*en.wiktionary.orgawikt:a", Xoh_lnki_html__hdump__tst.Html__xwiki); - } - @Test public void Capt__xwiki__qarg() { - Xow_wiki wiki = fxt.Prep_create_wiki("wikt", "en.wiktionary.org"); - wiki.Ns_mgr().Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); - fxt.Test__bicode("$*en.wiktionary.orga?action=editwikt:a?action=edit", "wikt:a?action=edit"); - } - @Test public void Capt__xwiki__encode() { - Xow_wiki wiki = fxt.Prep_create_wiki("wikt", "en.wiktionary.org"); - wiki.Ns_mgr().Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); - fxt.Test__bicode("$)en.wiktionary.orgeorðe", "eorðe"); - } - @Test public void Trail__basic() { - fxt.Test__bicode("~$#A~b~", Xoh_lnki_html__hdump__tst.Html__trail); - } - @Test public void Short__basic() { - fxt.Test__bicode("~$$A~b~", "A"); - } - @Test public void Short__case() { - fxt.Test__bicode("~$$a~b~", "a"); - } - @Test public void Site__main_page() { - fxt.Test__bicode("~$)en.wikipedia.org~Main Page~" - , "Main Page" - , "Main Page" - ); - } - @Test public void Site__qarg() { - fxt.Test__bicode("~$*en.wikipedia.org~A?b=c~d~", "d"); - } - @Test public void Inet__file() { - fxt.Test__bicode("~$:file:///C://A.png~b~", "b"); - } -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_parser.java index 783423650..92c19b9eb 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/Xoh_lnki_parser.java @@ -20,90 +20,128 @@ import gplx.core.brys.*; import gplx.langs.htmls.*; import gplx.langs.htmls.pars import gplx.xowa.htmls.core.wkrs.lnkis.anchs.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.nss.*; public class Xoh_lnki_parser { - private final Xoh_anch_capt_parser capt_parser = new Xoh_anch_capt_parser(); + private byte[] src; + private int href_ns_id; private byte[] href_ns_name; private int href_ns_name_len; + private byte[] capt_src; private int capt_bgn, capt_end; private final Bry_rdr rdr = new Bry_rdr(); - public int Rng_bgn() {return rng_bgn;} private int rng_bgn; - public int Rng_end() {return rng_end;} private int rng_end; - public byte Text_type() {return text_type;} private byte text_type; - public byte[] Href_bry() {return href_bry;} private byte[] href_bry; - public int Href_bgn() {return href_bgn;} private int href_bgn; - public int Href_end() {return href_end;} private int href_end; - public byte[] Capt_bry() {return capt_bry;} private byte[] capt_bry; - public int Capt_bgn() {return capt_bgn;} private int capt_bgn; - public int Capt_end() {return capt_end;} private int capt_end; - public Xoh_anch_href_parser Href_parser() {return href_parser;} private final Xoh_anch_href_parser href_parser = new Xoh_anch_href_parser(); - public int Parse(Xoh_hdoc_wkr wkr, Xoh_hdoc_ctx hctx, byte[] src, Html_tag_rdr tag_rdr, Html_tag anch_head, Xow_ttl_parser ttl_parser) {// b - this.rng_bgn = anch_head.Src_bgn(); - rdr.Init_by_sub(tag_rdr.Rdr(), "lnki", rng_bgn, src.length); - href_parser.Parse(rdr, hctx.App(), hctx.Wiki__ttl_parser(), anch_head); // href='/wiki/A' - // get href - this.href_bry = src; - this.href_bgn = href_parser.Page_bgn(); this.href_end = href_parser.Page_end(); - Xoa_ttl href_ttl = null; Xow_ns href_ns = null; - int href_ns_id = Xow_ns_.Tid__main; boolean href_cs_tid_1st = true; - switch (href_parser.Tid()) { - case Xoh_anch_href_parser.Tid__anch: - case Xoh_anch_href_parser.Tid__inet: - break; - default: - href_ttl = href_parser.Page_ttl(); - href_ns = href_ttl.Ns(); - href_ns_id = href_ns.Id(); - href_cs_tid_1st = href_ttl.Ns().Case_match() == Xow_ns_case_.Tid__1st; - this.href_bry = href_parser.Page_bry(); + public int Src_bgn() {return src_bgn;} private int src_bgn; + public int Src_end() {return src_end;} private int src_end; + public boolean Capt_has_ns() {return capt_has_ns;} private boolean capt_has_ns; + public byte Text_tid() {return text_tid;} private byte text_tid; + public byte[] Text_0_src() {return text_0_src;} private byte[] text_0_src; + public int Text_0_bgn() {return text_0_bgn;} private int text_0_bgn; + public int Text_0_end() {return text_0_end;} private int text_0_end; + public byte[] Text_1_src() {return text_1_src;} private byte[] text_1_src; + public int Text_1_bgn() {return text_1_bgn;} private int text_1_bgn; + public int Text_1_end() {return text_1_end;} private int text_1_end; + public byte[] Href_src() {return href_src;} private byte[] href_src; + public int Href_bgn() {return href_bgn;} private int href_bgn; + public int Href_end() {return href_end;} private int href_end; + public boolean Title_missing_ns() {return title_missing_ns;} private boolean title_missing_ns; + public int Title_tid() {return title_tid;} private int title_tid; + public int Title_bgn() {return title_bgn;} private int title_bgn; + public int Title_end() {return title_end;} private int title_end; + public Xoh_anch_href_itm Href_itm() {return href_itm;} private final Xoh_anch_href_itm href_itm = new Xoh_anch_href_itm(); + public Xoh_anch_capt_itm Capt_itm() {return capt_itm;} private final Xoh_anch_capt_itm capt_itm = new Xoh_anch_capt_itm(); + private void Init(byte[] src) { + this.src = href_src = capt_src = src; + capt_has_ns = title_missing_ns = false; + href_ns_id = Xow_ns_.Tid__main; href_ns_name = null; href_ns_name_len = 0; + href_bgn = href_end = capt_bgn = capt_end = title_bgn = title_end = -1; + title_tid = Title__href; + } + public boolean Parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Html_tag_rdr tag_rdr, byte[] src, Html_tag anch_head) { + Init(src); + this.src_bgn = anch_head.Src_bgn(); + rdr.Init_by_wkr(tag_rdr.Err_wkr(), "lnki", src_bgn, src.length); + Html_atr title_atr = anch_head.Atrs__get_by_or_empty(Html_atr_.Bry__title); + Parse_href(hctx, anch_head); + Parse_capt(tag_rdr, anch_head); + Parse_title(title_atr); + hdoc_wkr.On_lnki(this); + return true; + } + private void Parse_href(Xoh_hdoc_ctx hctx, Html_tag anch_head) { + href_itm.Parse(rdr.Err_wkr(), hctx, anch_head); + this.href_bgn = href_itm.Ttl_bgn(); this.href_end = href_itm.Ttl_end(); + switch (href_itm.Tid()) { + case Xoh_anch_href_itm.Tid__wiki: case Xoh_anch_href_itm.Tid__site: + this.href_ns_id = href_itm.Ttl_ns_id(); + this.href_src = href_itm.Ttl_full_txt(); this.href_bgn = 0; - this.href_end = href_bry.length; + this.href_end = href_src.length; + if (href_ns_id != Xow_ns_.Tid__main) { // not main; try to remove template name; + int colon_pos = Bry_find_.Find_fwd(href_src, Byte_ascii.Colon, href_bgn, href_end); + this.href_ns_name = Xoa_ttl.Replace_unders(Bry_.Mid(href_src, href_bgn, colon_pos + 1)); // EX: 11="Template talk:" + this.href_ns_name_len = href_ns_name.length; + } break; } - // get capt - this.capt_bry = src; + } + private void Parse_capt(Html_tag_rdr tag_rdr, Html_tag anch_head) { this.capt_bgn = anch_head.Src_end(); // capt starts after Html_tag anch_tail = tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__a); // this.capt_end = anch_tail.Src_bgn(); // get capt between "" and " - this.rng_end = anch_tail.Src_end(); - boolean capt_bgn_has_ns = true; + this.src_end = anch_tail.Src_end(); + // skip ns in href / capt if (href_ns_id != Xow_ns_.Tid__main) { // not main; try to remove template name; - int colon_pos = Bry_find_.Find_fwd(href_bry, Byte_ascii.Colon, href_bgn, href_end); - byte[] ns_name = Xoa_ttl.Replace_unders(Bry_.Mid(href_bry, href_bgn, colon_pos + 1)); // EX: 11="Template talk:" - int ns_name_len = ns_name.length; - int ns_name_end = capt_bgn + ns_name_len; - href_bgn += ns_name_len; // skip ns_name for href; EX: "Help:A" -> "A"; "Help" will be saved as encoded num - if (Bry_.Match(src, capt_bgn, ns_name_end, ns_name, 0, ns_name_len)) // href matches capt; EX: [[Help:A]] -> Help:A - capt_bgn = ns_name_end; - else - capt_bgn_has_ns = false; + int capt_bgn_wo_ns = capt_bgn + href_ns_name_len; + href_bgn += href_ns_name_len; // skip ns_name for href; EX: "Help:A" -> "A"; "Help" will be saved as encoded number + if (Bry_.Match(capt_src, capt_bgn, capt_bgn_wo_ns, href_ns_name)) { // capt matches ns_name; EX: Help:A -> "Help:A" matches "Help:" + capt_bgn = capt_bgn_wo_ns; // skip ns; "Help:" + capt_has_ns = true; + } } - if (href_parser.Tid() == Xoh_anch_href_parser.Tid__anch) - this.text_type = Xoh_anch_capt_parser.Tid__capt; - else - this.text_type = capt_parser.Parse(rdr, capt_bgn_has_ns, href_cs_tid_1st, href_bry, href_bgn, href_end, src, capt_bgn, capt_end); - int split_pos = capt_parser.Split_pos(); - switch (text_type) { - case Xoh_anch_capt_parser.Tid__capt: // nothing to do; href / capt already set above + // get text splits + this.text_tid = href_itm.Tid() == Xoh_anch_href_itm.Tid__anch + ? Xoh_anch_capt_itm.Tid__diff + : capt_itm.Parse(rdr, capt_has_ns, href_src, href_bgn, href_end, src, capt_bgn, capt_end); + int split_pos = capt_itm.Split_pos(); + this.text_0_src = href_src; this.text_0_bgn = href_bgn; this.text_0_end = href_end; + this.text_1_src = capt_src; this.text_1_bgn = capt_bgn; this.text_1_end = capt_end; + switch (text_tid) { + case Xoh_anch_capt_itm.Tid__same: + // case Xoh_anch_capt_itm.Tid__href_pipe: + case Xoh_anch_capt_itm.Tid__diff: // nothing to do; href / capt already set above break; - case Xoh_anch_capt_parser.Tid__href: // redefine href to capt since both href and capt are same except for case-sensitivity / underscores; EX: [[a]], [[A b]] - case Xoh_anch_capt_parser.Tid__href_pipe: - this.href_bry = src; - this.href_bgn = capt_bgn; - this.href_end = capt_end; + case Xoh_anch_capt_itm.Tid__more: + this.text_1_bgn = split_pos; break; - case Xoh_anch_capt_parser.Tid__href_trail: - this.href_bry = src; - this.href_bgn = capt_bgn; - this.href_end = split_pos; - this.capt_bgn = split_pos; - break; - case Xoh_anch_capt_parser.Tid__capt_short: - int tmp_capt_bgn = capt_bgn, tmp_capt_end = capt_end; - this.capt_bry = href_bry; - this.capt_bgn = split_pos; - this.capt_end = href_end; - this.href_bry = src; - this.href_bgn = tmp_capt_bgn; - this.href_end = tmp_capt_end; + case Xoh_anch_capt_itm.Tid__less: + this.text_0_end = split_pos; + this.text_1_src = href_src; + this.text_1_bgn = split_pos; + this.text_1_end = href_end; break; } - wkr.On_lnki(this); - return rng_end; } + private void Parse_title(Html_atr title_atr) { + // Tfds.Dbg(Bry_.Mid(href_src, href_bgn, href_end), Bry_.Mid(src, capt_bgn, capt_end), Bry_.Mid(src, title_bgn, title_end)); + title_bgn = title_atr.Val_bgn(); title_end = title_atr.Val_end(); + if (href_ns_name != null) { // ns_name exists + int title_bgn_wo_ns = title_bgn + href_ns_name_len; + if (Bry_.Match(src, title_bgn, title_bgn_wo_ns, href_ns_name)) // title matches ns_name; + title_bgn = title_bgn_wo_ns; // skip ns; "Help:" + else + title_missing_ns = true; + } + if (title_end == -1) + title_tid = Title__missing; + else { + if (Bry_.Match(src, title_bgn, title_end, href_src, href_bgn, href_end)) + title_tid = Title__href; + else if (Bry_.Match(src, title_bgn, title_end, src, capt_bgn, capt_end)) + title_tid = Title__capt; + else { + title_tid = Title__diff; + if (href_ns_name != null) title_bgn = title_atr.Val_bgn(); // since title is different, add back ns_name; EX: "a"; title should be "Help:A b", not "A b" + } + } + } + public static final int // SERIALIAZED + Title__href = 0 + , Title__capt = 1 + , Title__diff = 2 + , Title__missing = 3 + ; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm.java similarity index 51% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_parser.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm.java index 229a0a8d5..abd0b9e52 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm.java @@ -18,44 +18,65 @@ along with this program. If not, see . package gplx.xowa.htmls.core.wkrs.lnkis.anchs; 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.xowa.wikis.nss.*; import gplx.xowa.wikis.ttls.*; -public class Xoh_anch_capt_parser { - public int Split_pos() {return split_pos;} private int split_pos; - public byte Parse(Bry_rdr owner_rdr, boolean capt_bgn_has_ns, boolean cs_tid_1st, byte[] href_bry, int href_bgn, int href_end, byte[] capt_bry, int capt_bgn, int capt_end) { - this.split_pos = -1; +public class Xoh_anch_capt_itm { + public int Cs0_tid() {return cs0_tid;} private int cs0_tid; + public int Split_pos() {return split_pos;} private int split_pos; + public byte Parse(Bry_rdr owner_rdr, boolean ns_name_exists, byte[] href_bry, int href_bgn, int href_end, byte[] capt_bry, int capt_bgn, int capt_end) { + this.cs0_tid = Cs0__exact; this.split_pos = -1; + // do compare int href_len = href_end - href_bgn; int capt_len = capt_end - capt_bgn; for (int i = 0; i < capt_len; ++i) { if (i == href_len) { // ran out of href; mark as trail; EX: [[A]]s -> href="A"; capt="As" split_pos = i + capt_bgn; - return Tid__href_trail; + return Tid__more; } byte href_byte = href_bry[i + href_bgn]; byte capt_byte = capt_bry[i + capt_bgn]; - if (href_byte == capt_byte) continue; - if ( i == 0 // ignore case if 1st letter and ns is Tid__1st; EX: [[earth]] -> href="Earth"; capt="earth" - && cs_tid_1st - && capt_byte >= Byte_ascii.Ltr_a && capt_byte <= Byte_ascii.Ltr_z - && (capt_byte - href_byte) == 32 - ) - continue; + if (i == 0) { // ignore case if 1st letter and ns is Tid__1st; EX: [[earth]] -> href="Earth"; capt="earth" + if ( capt_byte == href_byte) { + cs0_tid = Cs0__exact; + continue; + } + else if(href_byte >= Byte_ascii.Ltr_A && href_byte <= Byte_ascii.Ltr_Z + && capt_byte - href_byte == 32 + ) { + cs0_tid = Cs0__lower; + continue; + } + else if(href_byte >= Byte_ascii.Ltr_a && href_byte <= Byte_ascii.Ltr_z + && href_byte - capt_byte == 32 + ) { + cs0_tid = Cs0__upper; + continue; + } + } + else + if (href_byte == capt_byte) continue; if ( capt_byte == Byte_ascii.Space // ignore " " vs "_" && href_byte == Byte_ascii.Underline ) continue; - return Tid__capt; // bytes still diff; return diff + this.cs0_tid = Cs0__exact; + return Tid__diff; // bytes still diff; return diff } if (capt_len == href_len) // all bytes same and capt_len == href_len; must be same - return capt_bgn_has_ns ? Tid__href : Tid__href_pipe; + return Tid__same;// : Tid__href_pipe; else { // capt < href; EX: [[A_(b)|A]] -> href="A_(b)"; capt = "A" split_pos = capt_len + href_bgn; - return Tid__capt_short; + return Tid__less; } } public static final byte // SERIALIAZED - Tid__href = 0 // [[A]] -> "A|A" -> "A|" - , Tid__capt = 1 // [[A|b]] -> "A|b" -> "A|b" - , Tid__href_trail = 2 // [[A]]s -> "A|As" -> "A|s" - , Tid__capt_short = 3 // [[A_(b)|A]] -> "A_(b)|A" -> "A|_(b)" - , Tid__href_pipe = 4 // [[Help:A|]] -> "Help:A|A" -> "A|" + Tid__same = 0 // [[A]] -> "A|A" -> "A|" + , Tid__diff = 1 // [[A|b]] -> "A|b" -> "A|b" + , Tid__more = 2 // [[A]]s -> "A|As" -> "A|s" + , Tid__less = 3 // [[A_(b)|A]] -> "A_(b)|A" -> "A|_(b)" +// , Tid__href_pipe = 4 // [[Help:A|]] -> "Help:A|A" -> "A|" + ; + public static final int // SERIALIAZED + Cs0__exact = 0 + , Cs0__lower = 1 // [[A|a]] -> "A|a" -> "A" + , Cs0__upper = 2 // [[a|A]] -> "a|A" -> "a" ; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm_tst.java similarity index 65% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_parser_tst.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm_tst.java index 2de9be9ce..fca1ba219 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_parser_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_capt_itm_tst.java @@ -17,25 +17,25 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkis.anchs; 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 org.junit.*; import gplx.core.brys.*; import gplx.langs.htmls.parsers.*; -public class Xoh_anch_capt_parser_tst { - private final Xoh_anch_capt_parser_fxt fxt = new Xoh_anch_capt_parser_fxt(); - @Test public void Basic__same() {fxt.Test__match("Abc" , "Abc", Xoh_anch_capt_parser.Tid__href);} - @Test public void Basic__diff() {fxt.Test__match("Abc" , "ABC", Xoh_anch_capt_parser.Tid__capt);} - @Test public void Space__same() {fxt.Test__match("A_b" , "A b", Xoh_anch_capt_parser.Tid__href);} - @Test public void Case__same() {fxt.Test__match("Abc" , "abc", Xoh_anch_capt_parser.Tid__href);} - @Test public void Case__reverse() {fxt.Test__match("abc" , "Abc", Xoh_anch_capt_parser.Tid__capt);} - @Test public void Case__disabled() { - fxt.Wiki().Ns_mgr().Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); - fxt.Test__match("Abcde", "abcde", Xoh_anch_capt_parser.Tid__capt); - } - @Test public void Ns__href() {fxt.Test__match("Help_talk:Ab" , "Help talk:Ab" , Xoh_anch_capt_parser.Tid__href);} - @Test public void Capt_trail() {fxt.Test__match("A" , "Abc" , Xoh_anch_capt_parser.Tid__href_trail, 1);} - @Test public void Href_trail() {fxt.Test__match("Ab" , "A" , Xoh_anch_capt_parser.Tid__capt_short, 1);} +public class Xoh_anch_capt_itm_tst { + private final Xoh_anch_capt_itm_fxt fxt = new Xoh_anch_capt_itm_fxt(); + @Test public void Basic__same() {fxt.Test__match("Abc" , "Abc", Xoh_anch_capt_itm.Tid__same);} + @Test public void Basic__diff() {fxt.Test__match("Abc" , "ABC", Xoh_anch_capt_itm.Tid__diff);} + @Test public void Space__same() {fxt.Test__match("A_b" , "A b", Xoh_anch_capt_itm.Tid__same);} + @Test public void Case__same() {fxt.Test__match("Abc" , "abc", Xoh_anch_capt_itm.Tid__same);} +// @Test public void Case__reverse() {fxt.Test__match("abc" , "Abc", Xoh_anch_capt_itm.Tid__diff);} +// @Test public void Case__disabled() { +// fxt.Wiki().Ns_mgr().Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); +// fxt.Test__match("Abcde", "abcde", Xoh_anch_capt_itm.Tid__diff); +// } + @Test public void Ns__href() {fxt.Test__match("Help_talk:Ab" , "Help talk:Ab" , Xoh_anch_capt_itm.Tid__same);} + @Test public void Capt_trail() {fxt.Test__match("A" , "Abc" , Xoh_anch_capt_itm.Tid__more, 1);} + @Test public void Href_trail() {fxt.Test__match("Ab" , "A" , Xoh_anch_capt_itm.Tid__less, 1);} } -class Xoh_anch_capt_parser_fxt { - private final Xoh_anch_capt_parser matcher = new Xoh_anch_capt_parser(); +class Xoh_anch_capt_itm_fxt { + private final Xoh_anch_capt_itm matcher = new Xoh_anch_capt_itm(); private final Bry_rdr rdr = new Bry_rdr(); - public Xoh_anch_capt_parser_fxt() { + public Xoh_anch_capt_itm_fxt() { Xoae_app app = Xoa_app_fxt.app_(); this.wiki = Xoa_app_fxt.wiki_tst_(app); } @@ -45,8 +45,8 @@ class Xoh_anch_capt_parser_fxt { byte[] page_bry = Bry_.new_u8(page_str); byte[] capt_bry = Bry_.new_u8(capt_str); Xoa_ttl href_ttl = wiki.Ttl_parse(page_bry); - boolean cs_tid_1st = href_ttl.Ns().Case_match() == gplx.xowa.wikis.nss.Xow_ns_case_.Tid__1st; - Tfds.Eq_int(expd_tid , matcher.Parse(rdr.Init_by_page(Bry_.Empty, page_bry, page_bry.length), Bool_.Y, cs_tid_1st, page_bry, 0, page_bry.length, capt_bry, 0, capt_bry.length)); + boolean ns_is_cs = href_ttl.Ns().Case_match() == gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all; + Tfds.Eq_int(expd_tid , matcher.Parse(rdr.Init_by_page(Bry_.Empty, page_bry, page_bry.length), ns_is_cs, page_bry, 0, page_bry.length, capt_bry, 0, capt_bry.length)); Tfds.Eq_int(expd_trail_bgn , matcher.Split_pos()); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_itm.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_itm.java new file mode 100644 index 000000000..2a1de755f --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_itm.java @@ -0,0 +1,154 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.wkrs.lnkis.anchs; 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.btries.*; +import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.langs.htmls.encoders.*; +import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.nss.*; +public class Xoh_anch_href_itm implements Xoh_itm_parser { + private final Bry_rdr rdr = new Bry_rdr().Dflt_dlm_(Byte_ascii.Slash); + // private final Xoa_url tmp_url = Xoa_url.blank(); + public void Fail_throws_err_(boolean v) {rdr.Fail_throws_err_(v);}// TEST + public Html_atr Atr() {return atr;} private Html_atr atr; + public byte Tid() {return tid;} private byte tid; + public int Rng_bgn() {return rng_bgn;} private int rng_bgn; + public int Rng_end() {return rng_end;} private int rng_end; + public int Site_bgn() {return site_bgn;} private int site_bgn; + public int Site_end() {return site_end;} private int site_end; + public boolean Site_exists() {return site_end > site_bgn;} + public byte[] Ttl_full_txt() {return ttl_full_txt;} private byte[] ttl_full_txt; + public byte[] Ttl_page_db() {return ttl_page_db;} private byte[] ttl_page_db; + public boolean Ttl_is_main_page() {return ttl_page_db.length == 0;} + public int Ttl_ns_id() {return ttl_ns_id;} private int ttl_ns_id; + public byte[] Ttl_ns_custom() {return ttl_ns_custom;} private byte[] ttl_ns_custom; + public int Ttl_bgn() {return ttl_bgn;} private int ttl_bgn; + public int Ttl_end() {return ttl_end;} private int ttl_end; + private void Clear() { + tid = Tid__wiki; + rng_bgn = rng_end = site_bgn = site_end = ttl_bgn = ttl_end = -1; + ttl_full_txt = ttl_page_db = ttl_ns_custom = null; + ttl_ns_id = Xow_ns_.Tid__main; + } + public boolean Parse(Bry_err_wkr err_wkr, Xoh_hdoc_ctx hctx, Html_tag tag) { + this.atr = tag.Atrs__get_by_or_empty(Html_atr_.Bry__href); + return Parse(err_wkr, hctx, atr.Val_bgn(), atr.Val_end()); + } + public boolean Parse(Bry_err_wkr err_wkr, Xoh_hdoc_ctx hctx, int rng_bgn, int rng_end) { + this.Clear(); + if (rng_bgn == -1) return false; // no href; return; EX: vs + rdr.Init_by_wkr(err_wkr, "href", rng_bgn, rng_end); + this.rng_bgn = rng_bgn; this.rng_end = rng_end; + byte[] src = err_wkr.Src(); + if (rng_end == rng_bgn) { // handle empty String separately; EX: href="" + tid = Tid__inet; + ttl_bgn = ttl_end = 0; + } + else { + ttl_end = rng_end; + switch (src[rng_bgn]) { + case Byte_ascii.Hash: + tid = Tid__anch; + ttl_bgn = rng_bgn + 1; // position ttl_bgn after # + break; + default: + Parse_inet(hctx, src); + break; + case Byte_ascii.Slash: + rdr.Move_by_one(); // skip "/" + if (rdr.Chk(trie) == Tid__site) { // EX: "/site/wiki/A" + tid = Tid__site; + site_bgn = rdr.Pos(); + site_end = rdr.Find_fwd_lr(); + rdr.Chk(Bry__wiki); + } + else + tid = Tid__wiki; + ttl_bgn = rdr.Pos(); + break; + } + } + Parse_ttl(hctx.Wiki__ttl_parser(), src); + return true; + } + private void Parse_inet(Xoh_hdoc_ctx hctx, byte[] src) { +// hctx.Wiki__url_parser().Parse(tmp_url, src); +// Tfds.Write(tmp_url.Tid()); +// if (tmp_url.Tid() == Xoa_url_.Tid_page) { +// Tfds.Write(tmp_url.Wiki_bry()); +// Tfds.Write(tmp_url.Page_bry()); +// } +// else { + tid = Tid__inet; + ttl_bgn = rng_bgn; +// } + } + private void Parse_ttl(Xow_ttl_parser ttl_parser, byte[] src) { + boolean ttl_is_empty = ttl_end - ttl_bgn == 0; // NOTE: ttl can be empty; EX: "href='/site/en.wikipedia.org/wiki/'" "href='/wiki/'" + if (ttl_is_empty) { + ttl_full_txt = ttl_page_db = Bry_.Empty; + } + else { + ttl_full_txt = Gfo_url_encoder_.Href_wo_anchor.Decode(src, ttl_bgn, ttl_end); + switch (tid) { + case Xoh_anch_href_itm.Tid__anch: + case Xoh_anch_href_itm.Tid__inet: + ttl_ns_id = Xow_ns_.Tid__main; + ttl_page_db = ttl_full_txt; + break; + case Xoh_anch_href_itm.Tid__wiki: + case Xoh_anch_href_itm.Tid__site: + int ttl_full_len = ttl_full_txt.length; + int colon_pos = Bry_find_.Find_fwd(ttl_full_txt, Byte_ascii.Colon, 0, ttl_full_len); + ttl_page_db = ttl_full_txt; + if (colon_pos != Bry_find_.Not_found) { + Xow_ns_mgr ns_mgr = ttl_parser.Ns_mgr(); + Object ns_obj = ns_mgr.Names_get_or_null(ttl_full_txt, 0, colon_pos); + if (ns_obj != null) { + Xow_ns ns = (Xow_ns)ns_obj; + if (ns.Id() != Xow_ns_.Tid__main) { + ttl_ns_id = ns.Id(); + ttl_page_db = Bry_.Mid(ttl_full_txt, colon_pos + 1, ttl_full_len); + if (!Bry_.Match(ttl_full_txt, 0, colon_pos, ns.Name_ui())) + ttl_ns_custom = Bry_.Mid(ttl_full_txt, 0, colon_pos); + } + } + } + ttl_page_db = Xoa_ttl.Replace_spaces(ttl_page_db); + break; + default: throw Err_.new_unhandled(tid); + } + } + } + public static final byte + Tid__wiki = 0 // EX: href="/wiki/A" + , Tid__site = 1 // EX: href="/site/en.wikipedia.org/wiki/A" + , Tid__anch = 2 // EX: href="#A" + , Tid__inet = 3 // EX: href="https://a.org/A" + ; + private static final byte[] Bry__site = Bry_.new_a7("site/"), Bry__wiki = Bry_.new_a7("wiki/"); + private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7() + .Add_bry_byte(Bry__wiki, Tid__wiki) + .Add_bry_byte(Bry__site, Tid__site) + ; + public static boolean Ns_exists(byte tid) { + switch (tid) { + case Tid__wiki: case Tid__site: return true; + case Tid__anch: case Tid__inet: return false; + default: throw Err_.new_unhandled(tid); + } + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_itm_tst.java similarity index 69% rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_parser_tst.java rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_itm_tst.java index 9820dbb41..e7e430be5 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_parser_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_itm_tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.xowa.htmls.core.wkrs.lnkis.anchs; 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 org.junit.*; import gplx.core.brys.*; import gplx.xowa.wikis.ttls.*; -public class Xoh_anch_href_parser_tst { - private final Xoh_anch_href_parser_fxt fxt = new Xoh_anch_href_parser_fxt(); +public class Xoh_anch_href_itm_tst { + private final Xoh_anch_href_itm_fxt fxt = new Xoh_anch_href_itm_fxt(); @Test public void Site() { fxt.Test__parse("/site/A/wiki/B", "A", "B"); } @@ -34,28 +34,24 @@ public class Xoh_anch_href_parser_tst { @Test public void Inet() { fxt.Test__parse("http://a.org", "", "http://a.org"); } +// @Test public void Inet__mw() { +// fxt.Test__parse("https://en.wikipedia.org/wiki/A", "en.wikipedia.org", "A"); +// } @Test public void Fail__1st_seg_must_be_site_or_wiki() { - fxt.Test__parse__fail("/fail/A", "failed trie check: mid='fail/A' ctx='Main_Page' wkr='anch.href' excerpt=/fail/A"); + fxt.Test__parse__fail("/fail/A", "failed trie check: mid='fail/A' page='Main_Page' sect='href' text=/fail/A"); } @Test public void Fail__2nd_seg_must_be_wiki() { - fxt.Test__parse__fail("/site/A/B/C", "failed check: chk='wiki/' ctx='Main_Page' wkr='anch.href' excerpt=/site/A/B/C"); + fxt.Test__parse__fail("/site/A/B/C", "failed check: chk='wiki/' page='Main_Page' sect='href' text=/site/A/B/C"); } } -class Xoh_anch_href_parser_fxt extends Xoh_itm_parser_fxt_base { - private final Xoae_app app; - private final Xoh_anch_href_parser parser = new Xoh_anch_href_parser(); - private final Xow_ttl_parser ttl_parser; - public Xoh_anch_href_parser_fxt() { - this.app = Xoa_app_fxt.app_(); - ttl_parser = Xoa_app_fxt.wiki_tst_(app); - } +class Xoh_anch_href_itm_fxt extends Xoh_itm_parser_fxt { private final Xoh_anch_href_itm parser = new Xoh_anch_href_itm(); @Override public Xoh_itm_parser Parser_get() {return parser;} public void Test__parse(String src_str, String expd_site, String expd_page) { Exec_parse(src_str); Tfds.Eq_str(expd_site, parser.Site_bgn() == -1 ? "" : String_.new_u8(src, parser.Site_bgn(), parser.Site_end())); - Tfds.Eq_str(expd_page, String_.new_u8(src, parser.Page_bgn(), parser.Page_end())); + Tfds.Eq_str(expd_page, String_.new_u8(src, parser.Ttl_bgn(), parser.Ttl_end())); } - @Override public void Exec_parse_hook(Bry_rdr owner_rdr, int src_bgn, int src_end) { - parser.Parse(owner_rdr, app, ttl_parser, src_bgn, src_end); + @Override public void Exec_parse_hook(Bry_err_wkr err_wkr, Xoh_hdoc_ctx hctx, int src_bgn, int src_end) { + parser.Parse(err_wkr, hctx, src_bgn, src_end); } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_parser.java deleted file mode 100644 index c7c631332..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/anchs/Xoh_anch_href_parser.java +++ /dev/null @@ -1,135 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.htmls.core.wkrs.lnkis.anchs; 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.btries.*; -import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; -import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.apps.metas.*; -public class Xoh_anch_href_parser implements Xoh_itm_parser { - private byte[] page_bry; private Xoa_ttl page_ttl; private Xoa_app app; private Xow_ttl_parser ttl_parser; - private final Bry_rdr rdr = new Bry_rdr().Dflt_dlm_(Byte_ascii.Slash); - public void Fail_throws_err_(boolean v) {rdr.Fail_throws_err_(v);}// TEST - public Html_atr Atr() {return atr;} private Html_atr atr; - public byte Tid() {return tid;} private byte tid; - public boolean Tid_has_ns() {return tid_has_ns;} private boolean tid_has_ns; - public byte[] Src() {return src;} private byte[] src; - public int Val_bgn() {return val_bgn;} private int val_bgn; - public int Val_end() {return val_end;} private int val_end; - public int Site_bgn() {return site_bgn;} private int site_bgn; - public int Site_end() {return site_end;} private int site_end; - public boolean Site_exists() {return site_end > site_bgn;} - public boolean Rel_nofollow_exists() { - if (Site_exists()) { - if (rel_nofollow_exists == Bool_.__byte) { - Xow_domain_itm itm = Xow_domain_itm_.parse(Bry_.Mid(src, site_bgn, site_end)); - rel_nofollow_exists = itm.Domain_type_id() == Xow_domain_tid_.Int__other ? Bool_.Y_byte : Bool_.N_byte; - } - return rel_nofollow_exists == Bool_.Y_byte; - } - else - return false; - } private byte rel_nofollow_exists; - public int Page_bgn() {return page_bgn;} private int page_bgn; - public int Page_end() {return page_end;} private int page_end; - public byte[] Page_bry() { - if (page_bry == null) { - if (page_end - page_bgn == 0) // NOTE: href="/site/en.wikipedia.org/wiki/" can be null - page_bry = Xoa_page_.Main_page_bry; - else - page_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href.Decode(src, page_bgn, page_end); - } - return page_bry; - } - public Xoa_ttl Page_ttl() { - if (page_ttl == null) { - page_bry = this.Page_bry(); - if (site_bgn != -1) - ttl_parser = app.Wiki_mgri().Get_by_key_or_make_init_n(Bry_.Mid(src, site_bgn, site_end)); - page_ttl = ttl_parser.Ttl_parse(page_bry); - page_bry = page_ttl.Full_db_w_anch(); - } - return page_ttl; - } - public int Page_ns_id() { - switch (tid) { - case Xoh_anch_href_parser.Tid__anch: - case Xoh_anch_href_parser.Tid__inet: return Xow_ns_.Tid__main; // for purposes of hzip/make, assume main_ns - case Xoh_anch_href_parser.Tid__wiki: - case Xoh_anch_href_parser.Tid__site: return this.Page_ttl().Ns().Id(); - default: throw Err_.new_unhandled(tid); - } - } - public boolean Page_ns_id_is_image() {return this.Page_ns_id() == Xow_ns_.Tid__file && Bry_.Has_at_bgn(page_bry, Xow_ns_.Alias__image__bry);} - public boolean Parse(Bry_rdr owner_rdr, Xoa_app app, Xow_ttl_parser ttl_parser, Html_tag tag) { - this.atr = tag.Atrs__get_by_or_empty(Html_atr_.Bry__href); - return Parse(owner_rdr, app, ttl_parser, atr.Val_bgn(), atr.Val_end()); - } - public boolean Parse(Bry_rdr owner_rdr, Xoa_app app, Xow_ttl_parser ttl_parser, int href_bgn, int href_end) { - if (href_bgn == -1) return false; - rdr.Init_by_sub(owner_rdr, "anch.href", href_bgn, href_end); - rel_nofollow_exists = Bool_.__byte; - site_bgn = site_end = page_bgn = page_end = -1; this.src = owner_rdr.Src(); - tid = Tid__wiki; - page_bry = null; page_ttl = null; - this.val_bgn = href_bgn; this.val_end = href_end; - this.src = owner_rdr.Src(); this.ttl_parser = ttl_parser; this.app = app; - if (val_end == val_bgn) { - tid = Tid__inet; - page_bgn = page_end = 0; - return true; // handle empty String separately; EX: href="" - } - int pos = href_bgn; - switch (src[pos]) { - case Byte_ascii.Hash: - tid = Tid__anch; tid_has_ns = Bool_.N; - page_bgn = pos + 1; // position page_bgn after # - page_end = val_end; // anch ends at EOS - break; - default: - tid = Tid__inet; tid_has_ns = Bool_.N; - page_bgn = pos; // position page_bgn after # - page_end = val_end; // anch ends at EOS - break; - case Byte_ascii.Slash: - rdr.Move_by_one(); // skip "/" - if (rdr.Chk(trie) == Tid__site) { // EX: "/site/wiki/A" - tid = Tid__site; tid_has_ns = Bool_.Y; - site_bgn = rdr.Pos(); - site_end = rdr.Find_fwd_lr(); - rdr.Chk(Bry__wiki); - } - else { - tid = Tid__wiki; tid_has_ns = Bool_.Y; - } - page_bgn = rdr.Pos(); - page_end = rdr.Src_end(); - break; - } - return true; - } - public static final byte - Tid__wiki = 0 // EX: href="/wiki/A" - , Tid__site = 1 // EX: href="/site/en.wikipedia.org/wiki/A" - , Tid__anch = 2 // EX: href="#A" - , Tid__inet = 3 // EX: href="https://a.org/A" - ; - private static final byte[] Bry__site = Bry_.new_a7("site/"), Bry__wiki = Bry_.new_a7("wiki/"); - private static final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7() - .Add_bry_byte(Bry__wiki, Tid__wiki) - .Add_bry_byte(Bry__site, Tid__site) - ; -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java index bb28ae285..0e746ec9d 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__base.java @@ -17,7 +17,8 @@ along with this program. If not, see . */ 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.xowa.files.*; import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.wkrs.bfr_args.*; +import gplx.xowa.files.*; import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.parsers.lnkis.*; public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { @@ -33,7 +34,7 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { , "" ), "a_href", "a_xowa_title", "html" ); - @gplx.Virtual public void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, Xof_file_itm xfer_itm, int uid + @gplx.Virtual public void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid , byte[] a_href, 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 ) { @@ -46,21 +47,27 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { + "\"~{img_alt}\"~{img_core}~{img_class}" , "uid", "a_href", "a_class", "a_rel", "a_title", "a_xowa_title", "img_core", "img_alt", "img_class" ); - - @gplx.Virtual public void Html_thumb_core(Bry_bfr tmp_bfr, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) { + @gplx.Virtual public void Html_thumb_core(Bry_bfr tmp_bfr, boolean mode_is_hdump, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) { scratch_bfr.Add(Bry_style_bgn); scratch_bfr.Add_int_variable(div2_width); scratch_bfr.Add(Bry_style_end); - fmtr_thumb_core.Bld_bfr_many(tmp_bfr, uid, div1_halign, scratch_bfr.To_bry_and_clear(), div2_content); - } private static final byte[] Bry_style_bgn = Bry_.new_a7("style=\"width:"), Bry_style_end = Bry_.new_a7("px;\""); + thumb_div_id_atr.Bfr_arg__clear(); + if (!mode_is_hdump) + thumb_div_id_atr.Set_by_arg(thum_div_id_val.Set(Bry__id, uid)); + fmtr_thumb_core.Bld_bfr_many(tmp_bfr, thumb_div_id_atr, div1_halign, scratch_bfr.To_bry_and_clear(), div2_content); + } + private static final byte[] Bry_style_bgn = Bry_.new_a7("style=\"width:"), Bry_style_end = Bry_.new_a7("px;\""); + private final Bfr_arg__html_atr thumb_div_id_atr = new Bfr_arg__html_atr(Html_atr_.Bry__id); + private final Bfr_arg__id thum_div_id_val = new Bfr_arg__id(); + private final byte[] Bry__id = Bry_.new_a7("xowa_file_div_"); protected Bry_fmtr fmtr_thumb_core = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last // REF.MW: Linker.php|makeImageLink2 ( "
    " - , "
    " - , "~{div2_content}" + , " " + , "~{div2_content}" , "
    " , "
    " , "" - ), "uid", "div1_halign", "style", "div2_content" + ), "div_id", "div1_halign", "style", "div2_content" ); public byte[] Html_thumb_part_img(Bry_bfr tmp_bfr, Xoae_page page, Xof_file_itm xfer_itm, Xop_lnki_tkn lnki, int uid, byte[] a_href, byte[] img_src, byte[] img_alt) { Html_thumb_part_img(tmp_bfr, page, xfer_itm, uid, a_href, lnki.Ttl().Page_txt(), xfer_itm.Html_w(), xfer_itm.Html_h(), img_src, img_alt); @@ -71,10 +78,7 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { } private Bry_fmtr fmtr_thumb_part_img = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
    " - , " " - , " \"~{img_alt}\"" - , " " + , "
    \"~{img_alt}\"" , "
    " ), "uid", "a_href", "a_title", "img_core", "img_alt"); @@ -146,4 +150,7 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { ), "uid", "a_width", "a_max_width", "a_href", "a_xowa_title", "img_src"); public static final Xoh_file_html_fmtr__base Base = new Xoh_file_html_fmtr__base(); + public static byte[] Escape_xowa_title(byte[] lnki_ttl) { + return 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 + } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java index 2fb5f774b..a107a197e 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_html_fmtr__hdump.java @@ -20,11 +20,12 @@ import gplx.core.brys.fmtrs.*; import gplx.langs.htmls.*; import gplx.xowa.files.*; import gplx.xowa.htmls.core.makes.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; +import gplx.xowa.parsers.lnkis.*; public class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base { private final Bry_bfr tmp_bfr = Bry_bfr.reset_(128); - @Override public void Html_full_img(Bry_bfr bfr, gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx hctx, Xoae_page page, Xof_file_itm xfer_itm, int uid, byte[] a_href, 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) { + @Override public void Html_full_img(Bry_bfr bfr, gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid, byte[] a_href, 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) { tmp_bfr.Add_str_a7(" data-xoimg=\""); - tmp_bfr.Add_int_digits(1, xfer_itm.Lnki_type()).Add_byte_pipe(); + tmp_bfr.Add_int_digits(1, Xop_lnki_type.To_tid(xfer_itm.Lnki_type())).Add_byte_pipe(); tmp_bfr.Add_int_variable(xfer_itm.Lnki_w()).Add_byte_pipe(); tmp_bfr.Add_int_variable(xfer_itm.Lnki_h()).Add_byte_pipe(); tmp_bfr.Add_double(xfer_itm.Lnki_upright()).Add_byte_pipe(); @@ -34,7 +35,7 @@ public class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base { // , a_href, Xoh_lnki_consts.A_cls_to_bry(a_cls), Xoh_lnki_consts.A_rel_to_bry(a_rel), a_title // , img_alt, tmp_bfr.To_bry_and_clear(), arg_img_core.Init(uid, img_src, img_w, img_h), Xoh_img_cls_.To_html(img_cls, img_cls_other)); fmtr__img__full.Bld_bfr_many(bfr - , a_href, Xoh_lnki_consts.A_cls_to_bry(a_cls), Xoh_lnki_consts.A_rel_to_bry(a_rel), a_title, Xoa_ttl.Replace_spaces(a_xowa_title) + , 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 , img_alt, tmp_bfr.To_bry_and_clear(), arg_img_core.Init(uid, Bry_.Empty, 0, 0), Xoh_img_cls_.To_html(img_cls, img_cls_other)); } private Bry_fmtr fmtr__img__full = Bry_fmtr.new_ diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_img_wkr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_img_wkr.java index 2731df181..e63f40f1e 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_img_wkr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_img_wkr.java @@ -18,7 +18,7 @@ along with this program. If not, see . 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, Xof_file_itm xfer_itm, int uid + void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid , byte[] a_href, 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 ); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java index 5c2873ae7..1e0cc11f1 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java @@ -16,12 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ 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.langs.htmls.*; +import gplx.core.brys.*; import gplx.core.bits.*; +import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.makes.imgs.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; -import gplx.xowa.wikis.nss.*; -import gplx.xowa.files.*; -import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.makes.imgs.*; import gplx.xowa.htmls.core.wkrs.imgs.atrs.*; +import gplx.xowa.wikis.nss.*; import gplx.xowa.files.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*; public class Xoh_file_wtr__basic { private final Xowe_wiki wiki; private final Xow_html_mgr html_mgr; private final Xoh_html_wtr html_wtr; private final Bry_bfr_mkr bfr_mkr; private final Bry_bfr scratch_bfr = Bry_bfr.reset_(Io_mgr.Len_kb); @@ -95,7 +93,7 @@ public class Xoh_file_wtr__basic { private void Write_file_audio(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] img_orig_src, byte[] alt) { byte[] content = Arg_content_audio(lnki, ctx, hctx, src, uid, lnki_href, img_orig_src, alt); if (lnki.Media_icon()) - html_fmtr.Html_thumb_core(bfr, uid, lnki_halign_bry, div_width, content); + html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content); else bfr.Add(content); } @@ -104,7 +102,7 @@ public class Xoh_file_wtr__basic { boolean video_is_thumb = Xop_lnki_type.Id_defaults_to_thumb(lnki.Lnki_type()); byte[] content = Arg_content_video(ctx, hctx, src, lnki, xfer_itm, uid, video_is_thumb, lnki_href, img_view_src, img_orig_src, alt); if (video_is_thumb) - html_fmtr.Html_thumb_core(bfr, uid, lnki_halign_bry, div_width, content); + html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content); else bfr.Add(content); } @@ -119,7 +117,7 @@ public class Xoh_file_wtr__basic { if (lnki_is_thumbable) { // is "thumb" if (bfr.Len() > 0) bfr.Add_byte_nl(); byte[] content = Arg_content_thumb(lnki_file_wkr, ctx, hctx, src, lnki, xfer_itm, uid, lnki_href, img_view_src, img_orig_src, alt, lnki_ttl, anchor_title); - html_fmtr.Html_thumb_core(bfr, uid, lnki_halign_bry, div_width, content); + html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content); } else { if ( cfg_alt_defaults_to_caption @@ -139,15 +137,15 @@ public class Xoh_file_wtr__basic { byte img_cls_tid = lnki.Border() == Bool_.Y_byte ? Xoh_img_cls_.Tid__thumbborder : Xoh_img_cls_.Tid__none; byte[] img_cls_other = lnki.Lnki_cls(); // PAGE:en.s:Page:Notes_on_Osteology_of_Baptanodon._With_a_Description_of_a_New_Species.pdf/3; DATE:2014-09-06 if (lnki_link_tkn == Arg_nde_tkn.Null) // full - lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, lnki_href, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); + lnki_file_wkr.Html_full_img(bfr, hctx, page, src, xfer_itm, uid, lnki_href, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); else { // thumb Arg_itm_tkn link_tkn = lnki_link_tkn.Val_tkn(); - byte[] link_ref = link_tkn.Dat_to_bry(src); - byte[] link_ref_new = tmp_link_parser.Parse(tmp_bfr, tmp_url, wiki, link_ref, lnki_href); - link_ref = link_ref_new == null ? lnki_href: link_ref_new; // if parse fails, then assign to lnki_href; EX:link={{{1}}} - link_ref = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href_quotes.Encode(link_ref); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16 - if (Bry_.Len_gt_0(tmp_link_parser.Html_xowa_ttl())) lnki_ttl = tmp_link_parser.Html_xowa_ttl(); - lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, link_ref, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); + byte[] link_arg = Xoa_ttl.Replace_spaces(link_tkn.Dat_to_bry(src)); // replace spaces with unders, else "/wiki/File:A b.ogg" instead of "A_b.ogg"; DATE:2015-11-27 + byte[] link_arg_html = tmp_link_parser.Parse(tmp_bfr, tmp_url, wiki, link_arg, lnki_href); + link_arg = link_arg_html == null ? lnki_href: link_arg_html; // if parse fails, then assign to lnki_href; EX:link={{{1}}} + link_arg = Gfo_url_encoder_.Href_qarg.Encode(link_arg); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16 + // if (Bry_.Len_gt_0(tmp_link_parser.Html_xowa_ttl())) lnki_ttl = tmp_link_parser.Html_xowa_ttl(); // DELETE: not sure why this is here; breaks test; DATE:2015-11-28 + lnki_file_wkr.Html_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); } if (div_align_exists) bfr.Add(Html_tag_.Div_rhs); // close div from above } @@ -158,7 +156,7 @@ public class Xoh_file_wtr__basic { byte[] lnki_alt_html = wiki.Html_mgr().Imgs_mgr().Alt_in_caption().Val() ? Arg_alt_html(ctx, hctx, src, lnki) : Bry_.Empty; byte img_cls_tid = xfer_itm.File_exists() ? Xoh_img_cls_.Tid__thumbimage : Xoh_img_cls_.Tid__none; Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - lnki_file_wkr.Html_full_img(tmp_bfr, hctx, page, xfer_itm, uid, lnki_href, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), view_src, lnki_alt_text, img_cls_tid, Xoh_img_cls_.Bry__none); + lnki_file_wkr.Html_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, lnki_href, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), view_src, lnki_alt_text, img_cls_tid, Xoh_img_cls_.Bry__none); byte[] thumb = tmp_bfr.To_bry_and_clear(); html_fmtr.Html_thumb_file_image(tmp_bfr, thumb, Arg_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href), lnki_alt_html); return tmp_bfr.To_bry_and_rls(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_audio_video_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_audio_video_tst.java index 576f428d0..16fb68538 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_audio_video_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_audio_video_tst.java @@ -40,9 +40,9 @@ public class Xoh_file_wtr_audio_video_tst { ( "[[File:A.ogg]]", String_.Concat_lines_nl_skip_last ( "
    " , " " , "
    " , " " @@ -117,9 +117,9 @@ public class Xoh_file_wtr_audio_video_tst { ( "[[File:A.ogv|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last ( "
    " , " " , "
    " , " " @@ -171,9 +171,9 @@ public class Xoh_file_wtr_audio_video_tst { , "
    " // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24 , "
    " , " " , "
    " , " " @@ -205,9 +205,9 @@ public class Xoh_file_wtr_audio_video_tst { , "
    " // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24 , "
    " , " " , "
    " , " " diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_basic_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_basic_tst.java index 5a923a60d..4274b9c57 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_basic_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr_basic_tst.java @@ -29,6 +29,13 @@ public class Xoh_file_wtr_basic_tst { )); fxt.Wtr_cfg().Lnki__title_(false); } + @Test public void Xowa_title__quotes() { // PURPOSE: xowa_title should encode quotes DATE:2015-11-27 + fxt.Test_parse_page_wiki_str + ( "[[File:A%22b.png]]" + , String_.Concat_lines_nl_skip_last + ( "\"\"" + )); + } @Test public void Img_embed() { fxt.Test_parse_page_wiki_str("[[File:A.png|9x8px|alt=abc]]", Xop_fxt.html_img_none("File:A.png", "abc", "file:///mem/wiki/repo/trg/thumb/7/0/A.png/9px.png", "A.png")); } @@ -238,7 +245,7 @@ public class Xoh_file_wtr_basic_tst { fxt.Wtr_cfg().Lnki__title_(true); fxt.Test_parse_page_all_str ( "[[File:A.png|\n{|\n|-\n|b\n|}\n]]" - , "\"" + , "\"" ); fxt.Wtr_cfg().Lnki__title_(false); } @@ -248,7 +255,7 @@ public class Xoh_file_wtr_basic_tst { fxt.Test_parse_page_all_str ( "[[File:A.png|b\nc]]" , String_.Concat_lines_nl - ( "

    \"b" + ( "

    \"b" , "

    " )); fxt.Init_para_n_(); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java index e35e5a5ae..b9a333e1d 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.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.langs.htmls.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*; public class Xoh_lnki_title_fmtr extends gplx.core.brys.Bfr_arg_base { public Xoh_lnki_title_fmtr Set(byte[] src, Xop_tkn_itm tkn) {this.src = src; this.tkn = tkn; return this;} @@ -36,8 +37,10 @@ public class Xoh_lnki_title_fmtr extends gplx.core.brys.Bfr_arg_base { if (tkn_as_lnki.Caption_exists()) Bld_recurse(bfr, tkn_as_lnki.Caption_tkn()); else { - if (tkn_as_lnki.Ttl() != null) // guard against invalid ttls - bfr.Add(tkn_as_lnki.Ttl().Page_txt()); + if (tkn_as_lnki.Ttl() != null) { // guard against invalid ttls + byte[] ttl_bry = tkn_as_lnki.Ttl().Page_txt(); + Write_atr_text(bfr, ttl_bry, 0, ttl_bry.length); // handle titles with quotes; PAGE:s.w:Styx_(band) DATE:2015-11-29 + } } if (tkn_as_lnki.Tail_bgn() != -1) bfr.Add_mid(src, tkn_as_lnki.Tail_bgn(), tkn_as_lnki.Tail_end()); @@ -63,12 +66,13 @@ public class Xoh_lnki_title_fmtr extends gplx.core.brys.Bfr_arg_base { byte b = src[i]; switch (b) { case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Tab: // NOTE: escape ws so that it renders correctly in tool tips - case Byte_ascii.Quote: case Byte_ascii.Lt: case Byte_ascii.Gt: case Byte_ascii.Amp: // NOTE: escape possible javascript injection characters - bfr.Add(Escape_bgn); - bfr.Add_int_variable(b); - bfr.Add_byte(Byte_ascii.Semic); + bfr.Add_byte_space(); break; - default: bfr.Add_byte(b); break; + case Byte_ascii.Quote: bfr.Add(Html_entity_.Quote_bry); break; + case Byte_ascii.Lt: bfr.Add(Html_entity_.Lt_bry); break; + case Byte_ascii.Gt: bfr.Add(Html_entity_.Gt_bry); break; + case Byte_ascii.Amp: bfr.Add(Html_entity_.Amp_bry); break; + default: bfr.Add_byte(b); break; } } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java index 26a7ea733..e5dc32533 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java @@ -23,8 +23,11 @@ public class Xoh_lnki_title_fmtr_tst { fxt.Test_parse("a b c", "a b c"); fxt.Test_parse("a ''b'' c", "a b c"); fxt.Test_parse("a b c", "a b c"); - fxt.Test_parse("a\nb", "a b"); - fxt.Test_parse("a\"b", "a"b"); + fxt.Test_parse("a\nb", "a b"); + fxt.Test_parse("a\"b", "a"b"); + } + @Test public void Lnki__quotes() { // PURPOSE: handle titles with quotes; PAGE:s.w:Styx_(band) DATE:2015-11-29 + fxt.Test_parse("[[A\"B]]", "A"B"); } } class Xoh_lnki_title_fmtr_fxt { diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java index bcc1f739a..2b9909f6b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_wtr.java @@ -41,6 +41,7 @@ public class Xoh_lnki_wtr { redlinks_mgr = page.Redlink_lnki_list(); // NOTE: need to set redlinks_mgr, else toc parse may fail; EX:pl.d:head_sth_off;DATE:2014-05-07 file_wtr.Init_by_page(hctx, page); this.history_mgr = app.Usere().History_mgr(); + if (hctx.Mode_is_hdump()) cfg.Lnki__id_(false); } public void Write(Bry_bfr bfr, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) { Xoa_ttl lnki_ttl = lnki.Ttl(); @@ -63,7 +64,7 @@ public class Xoh_lnki_wtr { redlinks_mgr.Lnki_add(lnki); boolean stage_is_alt = hctx.Mode_is_alt(); switch (lnki.Ns_id()) { - case Xow_ns_.Tid__media: if (!stage_is_alt) file_wtr.Write_or_queue(bfr, page, ctx, hctx, src, lnki); return; // NOTE: literal ":" has no effect; PAGE:en.w:Beethoven and [[:Media:De-Ludwig_van_Beethoven.ogg|listen]] + case Xow_ns_.Tid__media: if (!stage_is_alt) file_wtr.Write_or_queue(bfr, page, ctx, hctx, src, lnki); return; // NOTE: literal ":" has no effect; PAGE:en.w:Beethoven and [[:Media:De-Ludwig_van_Beethoven.ogg|listen]] case Xow_ns_.Tid__file: if (!literal_link && !stage_is_alt) {file_wtr.Write_or_queue(bfr, page, ctx, hctx, src, lnki); return;} break; case Xow_ns_.Tid__category: if (!literal_link) {page.Html_data().Ctgs_add(lnki.Ttl()); return;} break; } @@ -100,7 +101,7 @@ public class Xoh_lnki_wtr { Write_caption(bfr, ctx, hctx, src, lnki, ttl_bry, true, caption_wkr); else { bfr.Add(Xoh_consts.A_bgn); // ' Roman empire; (c) include ns_name; EX: Help:A -> "title='Help:A'" not "title='A'"; DATE:2015-11-16 - Html_utl.Escape_html_to_bfr(bfr, lnki_title_bry, 0, lnki_title_bry.length, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); // escape title; DATE:2014-10-27 + byte[] title_bry = lnki_ttl.Full_txt(); // NOTE: use Full_txt to (a) replace underscores with spaces; (b) get title casing; EX:[[roman_empire]] -> Roman empire; (c) include ns_name; EX: Help:A -> "title='Help:A'" not "title='A'"; DATE:2015-11-16 + int title_len = title_bry.length; + if (title_len > 0) { + bfr .Add(Xoh_consts.A_bgn_lnki_0); // '" title=\"' + Html_utl.Escape_html_to_bfr(bfr, title_bry, 0, title_len, Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N); // escape title; DATE:2014-10-27 + } } if (!hctx.Mode_is_hdump()) { // don't write visited for hdump if (cfg.Lnki__visited() diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/mkrs/Xoh_hdoc_mkr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/mkrs/Xoh_hdoc_mkr.java deleted file mode 100644 index d80e0f424..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/mkrs/Xoh_hdoc_mkr.java +++ /dev/null @@ -1,56 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.htmls.core.wkrs.mkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; -import gplx.core.threads.poolables.*; -import gplx.xowa.htmls.core.hzips.*; -import gplx.xowa.htmls.core.wkrs.escapes.*; import gplx.xowa.htmls.core.wkrs.spaces.*; -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.imgs.*; import gplx.xowa.htmls.core.wkrs.thms.*; import gplx.xowa.htmls.core.wkrs.glys.*; -public class Xoh_hdoc_mkr { - private Gfo_poolable_mgr - pool__escape__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_escape_hzip()) - , pool__space__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_space_hzip()) - , pool__hdr__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_hdr_hzip()) - , pool__lnke__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_lnke_hzip()) - , pool__lnki__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_lnki_hzip()) - , pool__img__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_img_hzip()) - , pool__thm__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_thm_hzip()) - , pool__gly__hzip = Gfo_poolable_mgr_.New(1, 32, new Xoh_gly_hzip()) - ; - public Xoh_hzip_wkr Hzip__wkr(byte tid) { - switch (tid) { - case Xoh_hzip_dict_.Tid__escape: return Escape__hzip(); - case Xoh_hzip_dict_.Tid__space: return Space__hzip(); - case Xoh_hzip_dict_.Tid__hdr: return Hdr__hzip(); - case Xoh_hzip_dict_.Tid__lnke: return Lnke__hzip(); - case Xoh_hzip_dict_.Tid__lnki: return Lnki__hzip(); - case Xoh_hzip_dict_.Tid__img: return Img__hzip(); - case Xoh_hzip_dict_.Tid__thm: return Thm__hzip(); - case Xoh_hzip_dict_.Tid__gly: return Gly__hzip(); - default: throw Err_.new_unhandled(tid); - } - } - public Xoh_escape_hzip Escape__hzip() {return (Xoh_escape_hzip) pool__escape__hzip.Get_fast();} - public Xoh_space_hzip Space__hzip() {return (Xoh_space_hzip) pool__space__hzip.Get_fast();} - public Xoh_hdr_hzip Hdr__hzip() {return (Xoh_hdr_hzip) pool__hdr__hzip.Get_fast();} - public Xoh_lnke_hzip Lnke__hzip() {return (Xoh_lnke_hzip) pool__lnke__hzip.Get_fast();} - public Xoh_lnki_hzip Lnki__hzip() {return (Xoh_lnki_hzip) pool__lnki__hzip.Get_fast();} - public Xoh_img_hzip Img__hzip() {return (Xoh_img_hzip) pool__img__hzip.Get_fast();} - public Xoh_thm_hzip Thm__hzip() {return (Xoh_thm_hzip) pool__thm__hzip.Get_fast();} - public Xoh_gly_hzip Gly__hzip() {return (Xoh_gly_hzip) pool__gly__hzip.Get_fast();} -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_hzip.java deleted file mode 100644 index f2d297926..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_hzip.java +++ /dev/null @@ -1,39 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.htmls.core.wkrs.spaces; 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.threads.poolables.*; import gplx.xowa.wikis.ttls.*; -import gplx.xowa.htmls.core.hzips.*; -public class Xoh_space_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { - public String Key() {return Xoh_hzip_dict_.Key__space;} - public Xoh_space_hzip Encode(Bry_bfr bfr, Hzip_stat_itm stat_itm, byte[] src, int src_end, int rng_bgn, int rng_end) { - int space_len = Bry_find_.Find_fwd_while(src, rng_end, src_end, Byte_ascii.Space) - rng_bgn; - stat_itm.Space_add(space_len); - bfr.Add(Xoh_hzip_dict_.Bry__space); - Xoh_hzip_int_.Encode(1, bfr, space_len); - return this; - } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx ctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { - int space_len = rdr.Read_int_by_base85(1); - bfr.Add_byte_repeat(Byte_ascii.Space, space_len); - return rdr.Pos(); - } - public int Pool__idx() {return pool_idx;} private int pool_idx; - public void Pool__clear (Object[] args) {} - public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; - public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_space_hzip rv = new Xoh_space_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_hzip_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_hzip_tst.java deleted file mode 100644 index 817b3e089..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_hzip_tst.java +++ /dev/null @@ -1,41 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.htmls.core.wkrs.spaces; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; -import org.junit.*; import gplx.xowa.htmls.core.hzips.*; -public class Xoh_space_hzip_tst { - private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt(); - @Test public void Len__8() { - fxt.Test__bicode("~!)", " "); - } - @Test public void Len__85() { - fxt.Test__bicode("~!{\"!", String_.Repeat(" ", 85)); - } - @Test public void Many() { - fxt.Test__bicode(gplx.langs.htmls.Html_utl.Replace_apos(String_.Concat_lines_nl_skip_last - ( "
    " - , "~!%
    a
    " - , "~!%
    " - , "
    " - )), String_.Concat_lines_nl_skip_last - ( "
    " - , "
    a
    " - , "
    " - , "
    " - )); - } -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_parser.java deleted file mode 100644 index 1c7662916..000000000 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/spaces/Xoh_space_parser.java +++ /dev/null @@ -1,32 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.htmls.core.wkrs.spaces; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; -import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; -import gplx.xowa.htmls.core.hzips.*; -public class Xoh_space_parser implements Html_doc_wkr { - private final Xoh_hdoc_wkr wkr; - public Xoh_space_parser(Xoh_hdoc_wkr wkr) {this.wkr = wkr;} - public byte[] Hook() {return Hook_bry;} - public int Parse(byte[] src, int src_bgn, int src_end, int pos) { - int rng_end = Bry_find_.Find_fwd_while(src, pos + Hook_len, src_end, Byte_ascii.Space); - wkr.On_space(pos, rng_end); - return rng_end; - } - private static final byte[] Hook_bry = Bry_.new_a7(" "); - private static final int Hook_len = Hook_bry.length; -} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java index 7e6878aad..b06950e2b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java @@ -23,15 +23,16 @@ import gplx.xowa.wikis.ttls.*; public class Xoh_tag_parser implements Html_doc_wkr { private final Xoh_hdoc_wkr hdoc_wkr; private final Html_tag_rdr tag_rdr = new Html_tag_rdr(); - private final Xoh_hdr_parser wkr__hdr = new Xoh_hdr_parser(); - private final Xoh_lnki_parser wkr__lnki = new Xoh_lnki_parser(); private final Xoh_lnke_parser wkr__lnke = new Xoh_lnke_parser(); - private final Xoh_img_parser wkr__img = new Xoh_img_parser(); private final Xoh_thm_parser wkr__thm = new Xoh_thm_parser(); - private final Xoh_gly_grp_parser wkr__gly = new Xoh_gly_grp_parser(); private Xoh_hdoc_ctx hctx; + private final Xoh_hdr_parser wkr__hdr = new Xoh_hdr_parser(); + private final Xoh_lnki_parser wkr__lnki = new Xoh_lnki_parser(); private final Xoh_lnke_parser wkr__lnke = new Xoh_lnke_parser(); + private final Xoh_img_parser wkr__img = new Xoh_img_parser(); private final Xoh_thm_parser wkr__thm = new Xoh_thm_parser(); + private final Xoh_gly_grp_parser wkr__gly = new Xoh_gly_grp_parser(); public byte[] Hook() {return Byte_ascii.Angle_bgn_bry;} public Xoh_tag_parser(Xoh_hdoc_wkr hdoc_wkr) {this.hdoc_wkr = hdoc_wkr;} public void Init(Xoh_hdoc_ctx hctx, byte[] src, int src_bgn, int src_end) { - this.hctx = hctx; tag_rdr.Init(hctx.Page__url(), src, src_bgn, src_end); + this.hctx = hctx; + tag_rdr.Init(hctx.Page__url(), src, src_bgn, src_end); } public int Parse(byte[] src, int src_bgn, int src_end, int pos) { tag_rdr.Pos_(pos); @@ -44,31 +45,34 @@ public class Xoh_tag_parser implements Html_doc_wkr { int cur_name_id = cur.Name_id(); switch (cur_name_id) { case Html_tag_.Id__h2: case Html_tag_.Id__h3: case Html_tag_.Id__h4: case Html_tag_.Id__h5: case Html_tag_.Id__h6: - int hdr_tag_bgn = cur.Src_bgn(); nxt = tag_rdr.Tag__peek_fwd_head(); if ( nxt.Name_id() == Html_tag_.Id__span && nxt.Atrs__match_pair(Html_atr_.Bry__class , Xoh_hdr_parser.Bry__class__mw_headline)) { - return wkr__hdr.Parse(hdoc_wkr, src, tag_rdr, cur_name_id, hdr_tag_bgn, nxt); + if (wkr__hdr.Parse(hdoc_wkr, hctx, tag_rdr, src, cur, nxt)) return wkr__hdr.Src_end(); } break; case Html_tag_.Id__a: nxt = tag_rdr.Tag__peek_fwd_head(); if (nxt.Name_id() == Html_tag_.Id__img) { - int rv = wkr__img.Parse(hdoc_wkr, hctx, src, tag_rdr, cur); - if (rv != Xoh_hdoc_ctx.Invalid) { + if (wkr__img.Parse(hdoc_wkr, hctx, src, tag_rdr, cur)) { hdoc_wkr.On_img(wkr__img); - return rv; + return wkr__img.Src_end(); } } - else if (cur.Atrs__match_pair(Html_atr_.Bry__rel , Xoh_lnke_dict_.Html__rel__nofollow)) - return wkr__lnke.Parse(hdoc_wkr, tag_rdr, cur); - else - return wkr__lnki.Parse(hdoc_wkr, hctx, src, tag_rdr, cur, hctx.Wiki__ttl_parser()); + else if (cur.Atrs__match_pair(Html_atr_.Bry__rel , Xoh_lnke_dict_.Html__rel__nofollow)) { + if (wkr__lnke.Parse(hdoc_wkr, hctx, tag_rdr, src, cur)) return wkr__lnke.Src_end(); + } + else if (cur.Atrs__get_by_or_empty(Xoh_img_parser.Bry__atr__xowa_title).Val_dat_exists()) {} + else { + if (wkr__lnki.Parse(hdoc_wkr, hctx, tag_rdr, src, cur)) return wkr__lnki.Src_end(); + } break; case Html_tag_.Id__div: if (cur.Atrs__cls_has(Xoh_thm_parser.Atr__class__thumb)) { - int rv = wkr__thm.Parse(hdoc_wkr, hctx, src, tag_rdr, cur); - if (rv != Xoh_hdoc_ctx.Invalid) return rv; + if (wkr__thm.Parse(hdoc_wkr, hctx, src, tag_rdr, cur)) return wkr__thm.Src_end(); + } + else if (cur.Atrs__match_pair(Html_atr_.Bry__id, Xoh_thm_parser.Atr__id__xowa_media_div)) { + tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__div); } break; case Html_tag_.Id__ul: diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_bldr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_bldr.java index ff720c2f9..78f20b5e8 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_bldr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_bldr.java @@ -25,7 +25,8 @@ public class Xoh_thm_bldr { public void Make(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, int div_0_align, int div_1_width, boolean div_2_alt_exists, byte[] img_alt, Xoh_img_bldr img_bldr, Bfr_arg div_2_href, Bfr_arg div_2_capt) { wtr.Clear(); wtr.Div_0_align_(div_0_align); - wtr.Div_1_id_(img_bldr.Fsdb_itm().Html_uid()); + if (!hctx.Mode_is_diff()) + wtr.Div_1_id_(img_bldr.Fsdb_itm().Html_uid()); wtr.Div_1_width_(div_1_width); wtr.Div_1_img_(img_bldr.Wtr()); wtr.Div_2_href_(div_2_href); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java index 9553ef3d9..7b601fdae 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java @@ -23,8 +23,8 @@ public class Xoh_thm_html_tst { // fxt.Expd_itms_xfers(fxt.Make_xfer("A.png", 0, 0, 0, Bool_.Y, Xof_ext_.Id_png)); fxt.Test__html("[[File:A.png|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
    " - , "
    " - , " " + , "
    " + , " " , "
    " , "
    " , " " diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java index 5535d000b..7629fb4ab 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip.java @@ -23,29 +23,30 @@ public class Xoh_thm_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { private final Xoh_thm_bldr bldr = new Xoh_thm_bldr(); private final Bry_obj_ref div_2_capt = Bry_obj_ref.New_empty(); public String Key() {return Xoh_hzip_dict_.Key__thm;} - public Xoh_thm_hzip Encode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Hzip_stat_itm stat_itm, byte[] src, Xoh_thm_parser arg) { - if (!arg.Rng_valid()) { - bfr.Add_mid(src, arg.Rng_bgn(), arg.Rng_end()); + public byte[] Hook() {return hook;} private byte[] hook; + public Gfo_poolable_itm Encode(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_thm_parser data = (Xoh_thm_parser)data_obj; + if (!data.Rng_valid()) { + bfr.Add_mid(src, data.Src_bgn(), data.Src_end()); return this; } - Xoh_thm_caption_parser div_2_capt_parser = arg.Capt_parser(); - int div_1_width = arg.Div_1_width(); boolean div_1_width_exists = div_1_width != 220; - boolean div_2_alt_exists = arg.Capt_parser().Alt_div_exists(); - flag_bldr.Set(Flag__div_2_alt_exists , div_2_alt_exists); - flag_bldr.Set(Flag__div_1_width_exists , div_1_width_exists); - flag_bldr.Set(Flag__div_0_align , arg.Div_0_align()); - bfr.Add(Xoh_hzip_dict_.Bry__thm); + Xoh_thm_caption_parser div_2_capt_parser = data.Capt_parser(); + int div_1_width = data.Div_1_width(); ; + boolean div_2_alt_exists = flag_bldr.Set_as_bool(Flag__div_2_alt_exists , data.Capt_parser().Alt_div_exists()); + boolean div_1_width_exists = flag_bldr.Set_as_bool(Flag__div_1_width_exists , div_1_width != 220); + flag_bldr.Set_as_byte(Flag__div_0_align , data.Div_0_align()); + + bfr.Add(hook); Xoh_hzip_int_.Encode(1, bfr, flag_bldr.Encode()); if (div_1_width_exists) Xoh_hzip_int_.Encode(2, bfr, div_1_width); - bfr.Add_mid(src, div_2_capt_parser.Capt_bgn(), div_2_capt_parser.Capt_end()).Add_byte(Xoh_hzip_dict_.Escape); + if (div_2_capt_parser.Capt_exists()) bfr.Add_mid(src, div_2_capt_parser.Capt_bgn(), div_2_capt_parser.Capt_end()); + bfr.Add_byte(Xoh_hzip_dict_.Escape); if (div_2_alt_exists) bfr.Add_mid(src, div_2_capt_parser.Alt_div_bgn(), div_2_capt_parser.Alt_div_end()).Add_byte(Xoh_hzip_dict_.Escape); - img_hzip.Encode(bfr, stat_itm, src, arg.Img_parser(), Bool_.N); + img_hzip.Encode(bfr, hdoc_wkr, hctx, hpg, Bool_.N, src, data.Img_parser()); return this; } - public int Decode(Bry_bfr bfr, boolean write_to_bfr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int hook_bgn) { + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { int flag = rdr.Read_int_by_base85(1); - int capt_bgn = rdr.Pos(); - int capt_end = rdr.Find_fwd_lr(); int rv = rdr.Pos(); flag_bldr.Decode(flag); @@ -54,16 +55,16 @@ public class Xoh_thm_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { int div_0_align = flag_bldr.Get_as_int(Flag__div_0_align); int div_1_width = 220; if (div_1_width_exists) div_1_width = rdr.Read_int_by_base85(2); + int capt_bgn = rdr.Pos(); + int capt_end = rdr.Find_fwd_lr(); div_2_capt.Mid_(src, capt_bgn, capt_end); byte[] div_2_alt_bry = div_2_alt_exists ? rdr.Read_bry_to() : Bry_.Empty; - img_hzip.Decode(bfr, Bool_.N, hctx, hpg, rdr, src, rv); + img_hzip.Decode(bfr, hdoc_wkr, hctx, hpg, Bool_.N, rdr, src, rdr.Pos(), src_end); bldr.Make(bfr, hpg, hctx, src, div_0_align, div_1_width, div_2_alt_exists, div_2_alt_bry, img_hzip.Bldr(), img_hzip.Anch_href_arg(), div_2_capt); return rv; } - public int Pool__idx() {return pool_idx;} private int pool_idx; - public void Pool__clear (Object[] args) {} - public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; - public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_thm_hzip rv = new Xoh_thm_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; return rv;} + 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_thm_hzip rv = new Xoh_thm_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, 3); private static final int // SERIALIZED Flag__div_2_alt_exists = 0 diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java index 41c03fcbf..51d9c5359 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip_tst.java @@ -19,56 +19,64 @@ package gplx.xowa.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; impor import org.junit.*; import gplx.xowa.htmls.core.hzips.*; public class Xoh_thm_hzip_tst { private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt(); - private String Html__image = String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , " abc" - , "
    " - , "
    " - , " " - , "
    abc" - , "
    " - , "
    " - , "
    " - , " abc" - , "
    " - , "
    " - , "
    " - ) - , Html__video = String_.Replace(String_.Concat_lines_nl_skip_last - ( "
    " - , "
    " - , "
    " - , "
    " - , " " - , "
    " - , "
    " - , " Play sound" - , "
    " - , "
    " - , "
    " - , "
    " - , " " - , "
    Moscow (Russian Empire) in 1908" - , "
    " - , "
    " - , "
    " - ), "'", "\"") - ; + @Before public void setup() {fxt.Clear();} @Test public void Image() { - fxt.Test__bicode("~&3abc~abc~!uA.png~0|220|110|0.5|-1|-1~abc~", Html__image); + fxt.Test__bicode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last + ( "
    " + , "
    abc " + , "
    " + , "
    " + , "abc
    " + , "
    " + , "
    abc
    " + , "
    " + , "
    " + )); + } + @Test public void No_capt() { + fxt.Test__bicode("~&#~!%A.png~)#S~", String_.Concat_lines_nl_skip_last + ( "
    " + , "
    " + , "
    " + , "
    " + , "
    " + , "
    " + , "
    " + )); } @Test public void Video() { - fxt.Test__bicode(Html__video, Html__video); + String html = String_.Replace(String_.Concat_lines_nl_skip_last + ( "
    " + , "
    " + , "
    " + , "
    " + , "" + , "
    " + , "
    " + , "Play sound" + , "
    " + , "
    " + , "
    " + , "
    " + , "" + , "
    Moscow (Russian Empire) in 1908" + , "
    " + , "
    " + , "
    " + ), "'", "\"") + ; + fxt.Test__bicode(html, html); + } + @Test public void Dump() { + Xowe_wiki en_d = fxt.Init_wiki_alias("wikt", "en.wiktionary.org"); + gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); + ns_mgr.Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); + + fxt.Wiki().Ns_mgr().Aliases_add(gplx.xowa.wikis.nss.Xow_ns_.Tid__portal, "WP"); + fxt.Wiki().Ns_mgr().Init(); + + fxt.Init_mode_is_b256_(Bool_.N); + fxt.Exec_write_to_fsys(Io_url_.new_dir_("J:\\xowa\\dev_rls\\html\\"), "temp_earth_xo.html"); + fxt.Init_mode_is_b256_(Bool_.N); } -// @Test public void Dump() { -// Xowe_wiki en_d = fxt.Prep_create_wiki("wikt", "en.wiktionary.org"); -// gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); -// ns_mgr.Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all); -// -// fxt.Wiki().Ns_mgr().Aliases_add(gplx.xowa.wikis.nss.Xow_ns_.Tid__portal, "WP"); -// fxt.Wiki().Ns_mgr().Init(); -// -// fxt.Exec_write_to_fsys(Io_url_.new_dir_("D:\\xowa\\dev_rls\\html\\"), "temp_earth_xo.html"); -// } } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_parser.java index 5533ac6a8..0f30c09c8 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_parser.java @@ -20,30 +20,34 @@ import gplx.core.brys.*; import gplx.langs.htmls.*; import gplx.langs.htmls.parsers.*; import gplx.langs.htmls.parsers.styles.*; import gplx.xowa.htmls.core.wkrs.thms.divs.*; import gplx.xowa.htmls.core.wkrs.imgs.*; public class Xoh_thm_parser implements Html_atr_style_wkr { - public int Rng_bgn() {return rng_bgn;} private int rng_bgn; - public int Rng_end() {return rng_end;} private int rng_end; + 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 byte Div_0_align() {return div_0_align;} private byte div_0_align; public int Div_1_width() {return div_1_width;} private int div_1_width; public Xoh_img_parser Img_parser() {return img_parser;} private final Xoh_img_parser img_parser = new Xoh_img_parser(); public Xoh_thm_caption_parser Capt_parser() {return capt_parser;} private final Xoh_thm_caption_parser capt_parser = new Xoh_thm_caption_parser(); - public int Parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, byte[] src, Html_tag_rdr tag_rdr, Html_tag div_0) { - tag_rdr.Rdr().Init_by_hook("thm", div_0.Src_bgn(), div_0.Src_bgn()); - this.rng_bgn = div_0.Src_bgn(); - this.div_0_align = div_0.Atrs__cls_find_or_fail(gplx.xowa.parsers.lnkis.Xop_lnki_align_h_.Hash); - Html_tag div_1 = tag_rdr.Tag__move_fwd_head(); //
    + public boolean Parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, byte[] src, Html_tag_rdr tag_rdr, Html_tag div_0_head) { + tag_rdr.Err_wkr().Init_by_sect("thm", div_0_head.Src_bgn()); + this.src_bgn = div_0_head.Src_bgn(); + this.div_0_align = div_0_head.Atrs__cls_find_or_fail(gplx.xowa.parsers.lnkis.Xop_lnki_align_h_.Hash); + Html_tag div_0_tail = tag_rdr.Tag__peek_fwd_tail(Html_tag_.Id__div); //
    + Html_tag div_1_head = tag_rdr.Tag__find_fwd_head(div_0_head.Src_end(), div_0_tail.Src_bgn(), Html_tag_.Id__div); //
    + if (div_1_head.Name_id() != Html_tag_.Id__div) return false; + // tag_rdr.Pos_(div_1_head.Src_end()); + tag_rdr.Tag__move_fwd_head().Chk_id(Html_tag_.Id__div); this.div_1_width = -1; - Html_atr_style_parser_.Parse(div_1, this); // " style='120px'" + Html_atr_style_parser_.Parse(div_1_head, this); // " style='120px'" rng_valid = false; - if (img_parser.Parse(hdoc_wkr, hctx, src, tag_rdr, tag_rdr.Tag__move_fwd_head()) != Xoh_hdoc_ctx.Invalid) { // - capt_parser.Parse(hdoc_wkr, tag_rdr, src, tag_rdr.Tag__move_fwd_head()); // for div_0 - this.rng_end = div_0_tail.Src_end(); + tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__div); + tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__div); + this.src_end = tag_rdr.Pos(); hdoc_wkr.On_thm(this); - return rng_end; + return true; } public boolean On_atr(byte[] src, int atr_idx, int atr_bgn, int atr_end, int key_bgn, int key_end, int val_bgn, int val_end) { if (Bry_.Match(src, key_bgn, key_end, Html_atr_style_.Bry__width)) @@ -51,7 +55,8 @@ public class Xoh_thm_parser implements Html_atr_style_wkr { return true; } public static final byte[] - Atr__class__thumb = Bry_.new_a7("thumb") - , Atr__class__thumbinner = Bry_.new_a7("thumbinner") + Atr__class__thumb = Bry_.new_a7("thumb") + , Atr__class__thumbinner = Bry_.new_a7("thumbinner") + , Atr__id__xowa_media_div = Bry_.new_a7("xowa_media_div") ; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_wtr.java index e77a6b8f1..021322ea7 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_wtr.java @@ -45,10 +45,13 @@ public class Xoh_thm_wtr extends gplx.core.brys.Bfr_arg_base { alt_fmtr.Bld_bfr_many(tmp_bfr, img_alt_bry); div_2_alt.Set(tmp_bfr.To_bry_and_clear()); } + else + div_2_alt.Set(Bry_.Empty); return this; } public Xoh_thm_wtr Clear() { - Bfr_arg_.Clear(div_0_align, div_1_id, div_1_width, div_1_img, div_2_href, div_2_magnify, div_2_capt, div_2_alt); + Bfr_arg_.Clear(div_0_align, div_1_id, div_1_width, div_2_href, div_2_magnify, div_2_alt); + div_1_img = div_2_capt = Bfr_arg_.Noop; return this; } @Override public void Bfr_arg__add(Bry_bfr bfr) { @@ -57,21 +60,16 @@ public class Xoh_thm_wtr extends gplx.core.brys.Bfr_arg_base { public static final byte[] Prefix__div_id = Bry_.new_a7("xothm_"); private static final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "
    " - , " " - , " ~{div_1_img}" - , "
    " - , "
    " - , " \"\"" - , "
    ~{div_2_capt}" - , "
    ~{div_2_alt}" - , "
    " + , "~{div_1_img} " // NOTE: trailing space is intentional; matches jtidy behavior + , "
    " + , "
    \"\"
    " + , "~{div_2_capt}
    ~{div_2_alt}" + , "
    " , "
    " ), "div_0_align", "div_1_id", "div_1_width", "div_1_img", "div_2_href", "div_2_magnify", "div_2_capt", "div_2_alt"); private static final Bry_fmtr alt_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
    " - , "
    " - , " ~{alt}" - , "
    " + , "
    " + , "
    ~{alt}
    " ), "alt"); } diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_parser.java index ad0bcd5b1..2d106b9d7 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_caption_parser.java @@ -22,24 +22,28 @@ public class Xoh_thm_caption_parser { public int Rng_end() {return rng_end;} private int rng_end; public int Capt_bgn() {return capt_bgn;} private int capt_bgn; public int Capt_end() {return capt_end;} private int capt_end; + public boolean Capt_exists() {return capt_end > capt_bgn;} public int Alt_div_bgn() {return alt_div_bgn;} private int alt_div_bgn; public int Alt_div_end() {return alt_div_end;} private int alt_div_end; public boolean Alt_div_exists() {return alt_div_end > alt_div_bgn;} public Xoh_thm_magnify_parser Magnify_parser() {return magnify_parser;} private final Xoh_thm_magnify_parser magnify_parser = new Xoh_thm_magnify_parser(); - public int Parse(Xoh_hdoc_wkr hdoc_wkr, Html_tag_rdr tag_rdr, byte[] src, Html_tag capt_head) { + public boolean Parse(Xoh_hdoc_wkr hdoc_wkr, Html_tag_rdr tag_rdr, byte[] src, Html_tag capt_head) { this.rng_bgn = capt_head.Src_bgn(); - magnify_parser.Parse(hdoc_wkr, tag_rdr, src, capt_head); + if (!magnify_parser.Parse(hdoc_wkr, tag_rdr, src, capt_head)) return false; this.capt_bgn = magnify_parser.Magnify_tail_div().Src_end(); + ++capt_bgn; // skip \n + tag_rdr.Pos_(magnify_parser.Magnify_tail_div().Src_end() + 1); // also move tag_rdr forward one Html_tag capt_tail = tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__div); this.capt_end = capt_tail.Src_bgn(); - capt_end = Bry_find_.Find_bwd_non_ws_or_end(src, capt_end - 1, -1) + 1; + // capt_end = Bry_find_.Find_bwd_non_ws_or_end(src, capt_end - 1, -1) + 1; Alt_div_exists(tag_rdr, src); this.rng_end = tag_rdr.Pos(); - return rng_end; + return true; } private void Alt_div_exists(Html_tag_rdr tag_rdr, byte[] src) { this.alt_div_bgn = alt_div_end = -1; - Html_tag nxt_tag = tag_rdr.Tag__peek_fwd_head(); + Html_tag nxt_div_tail = tag_rdr.Tag__peek_fwd_tail(Html_tag_.Id__div); + Html_tag nxt_tag = tag_rdr.Tag__find_fwd_head(tag_rdr.Pos(), nxt_div_tail.Src_bgn(), Html_tag_.Id__hr); if (nxt_tag.Name_id() != Html_tag_.Id__hr) return; tag_rdr.Tag__move_fwd_head(); //
    nxt_tag = tag_rdr.Tag__move_fwd_head().Chk_id(Html_tag_.Id__div); //
    diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_parser.java index 785b7daf0..d6c97fa7b 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/divs/Xoh_thm_magnify_parser.java @@ -23,16 +23,19 @@ public class Xoh_thm_magnify_parser { public int Rng_end() {return rng_end;} private int rng_end; public boolean Exists() {return exists;} private boolean exists; public Html_tag Magnify_tail_div() {return magnify_tail_div;} private Html_tag magnify_tail_div; - public int Parse(Xoh_hdoc_wkr hdoc_wkr, Html_tag_rdr tag_rdr, byte[] src, Html_tag div_caption) { + public boolean Parse(Xoh_hdoc_wkr hdoc_wkr, Html_tag_rdr tag_rdr, byte[] src, Html_tag div_caption) { // rdr.Init_by_sub(tag_rdr.Rdr(), "thm.magnify", div_caption.Src_bgn(), div_caption.Src_end()); this.rng_bgn = div_caption.Src_bgn(); this.rng_end = div_caption.Src_end(); - Html_tag div_magnify = tag_rdr.Tag__move_fwd_head().Chk_id(Html_tag_.Id__div); //
    + Html_tag div_magnify = tag_rdr.Tag__move_fwd_head(); + if (div_magnify.Name_id() != Html_tag_.Id__div) return false; // NOTE: some thumbs can be artificially constructed and not have magnify div; PAGE:s.w:Asthma; DATE:2015-11-29 + if (!div_magnify.Atrs__cls_has(Cls__magnify)) return false; this.exists = div_magnify.Src_exists(); if (exists) { magnify_tail_div = tag_rdr.Tag__move_fwd_tail(Html_tag_.Id__div); this.rng_end = magnify_tail_div.Src_end(); tag_rdr.Pos_(rng_end); } - return rng_end; + return true; } + private static final byte[] Cls__magnify = Bry_.new_a7("magnify"); } \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/Xoh_xnde_hzip.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/Xoh_xnde_hzip.java new file mode 100644 index 000000000..c78be1b4c --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/Xoh_xnde_hzip.java @@ -0,0 +1,70 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.wkrs.xndes; 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.threads.poolables.*; import gplx.xowa.wikis.ttls.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*; +public class Xoh_xnde_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm { + public String Key() {return Xoh_hzip_dict_.Key__xnde;} + public byte[] Hook() {return hook;} private byte[] hook; + public Gfo_poolable_itm Encode(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_xnde_parser data = (Xoh_xnde_parser)data_obj; + +// int flag = data.Name_id(); +// boolean auto_exists = flag_bldr.Set_as_bool(Flag__auto_exists , data.Auto_id() != -1); +// boolean capt_exists = flag_bldr.Set_as_bool(Flag__capt_exists , data.Capt_exists()); +// byte lnke_tid = flag_bldr.Set_as_byte(Flag__lnke_tid , data.Lnke_tid()); +// +// bfr.Add(hook); +// bfr.Add_hzip_int(1, flag_bldr.Encode()); // add flag +// bfr.Add_hzip_mid(src, data.Href_bgn(), data.Href_end()); // add href +// if (auto_exists) bfr.Add_hzip_int(1, data.Auto_id()); // add autonumber +// if (capt_exists) bfr.Add_hzip_mid(src, data.Capt_bgn(), data.Capt_end()); // add caption + + return this; + } + public int Decode(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, boolean wkr_is_root, Bry_rdr rdr, byte[] src, int src_bgn, int src_end) { +// int flag = rdr.Read_int_by_base85(1); flag_bldr.Decode(flag); +// boolean auto_exists = flag_bldr.Get_as_bool(Flag__auto_exists); +// boolean capt_exists = flag_bldr.Get_as_bool(Flag__capt_exists); +// byte lnke_tid = flag_bldr.Get_as_byte(Flag__lnke_tid); +// +// int href_bgn = rdr.Pos(); int href_end = rdr.Find_fwd_lr(); +// int auto_id = -1, capt_bgn = -1, capt_end = -1; +// if (auto_exists) auto_id = rdr.Read_int_by_base85(1); +// if (capt_exists) {capt_bgn = rdr.Pos(); capt_end = rdr.Find_fwd_lr();} +// int rv = rdr.Pos(); +// +// bfr.Add(Html_bldr_.Bry__a_lhs_w_href); +// bfr.Add_mid(src, href_bgn, href_end); +// bfr.Add(Xoh_lnke_dict_.Html__atr__0).Add(Xoh_lnke_dict_.To_html_class(lnke_tid)).Add(Xoh_lnke_dict_.Html__rhs_end); +// if (auto_exists) bfr.Add_byte(Byte_ascii.Brack_bgn).Add_int_variable(auto_id).Add_byte(Byte_ascii.Brack_end); +// else if (capt_exists) bfr.Add_mid(src, capt_bgn, capt_end); +// else bfr.Add_mid(src, href_bgn, href_end); +// bfr.Add(Html_bldr_.Bry__a_rhs); +// return rv; + return src_end; + } + 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_xnde_hzip rv = new Xoh_xnde_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, 2); +// private static final int // SERIALIZED +// Flag__auto_exists = 0 +// , Flag__capt_exists = 1 +// , Flag__lnke_tid = 2 // "free", "autonumber", "text" +// ; +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/Xoh_xnde_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/Xoh_xnde_parser.java new file mode 100644 index 000000000..274ddbc60 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/Xoh_xnde_parser.java @@ -0,0 +1,41 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.htmls.core.wkrs.xndes; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; +import gplx.langs.htmls.parsers.*; +import gplx.xowa.htmls.core.hzips.*; +public class Xoh_xnde_parser { + public int Src_bgn() {return src_bgn;} private int src_bgn; + public int Src_end() {return src_end;} private int src_end; + public int Name_id() {return name_id;} private int name_id; + public Html_atr[] Atrs() {return atrs;} private Html_atr[] atrs; + public boolean Parse(Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Html_tag_rdr tag_rdr, byte[] src, Html_tag head) { + this.src_bgn = head.Src_bgn(); + this.name_id = head.Name_id(); + int len = head.Atrs__len(); + this.atrs = new Html_atr[len]; + for (int i = 0; i < len; ++i) + atrs[i] = head.Atrs__get_at(i); + this.src_end = head.Src_end(); + /* + Html_tag tail = tag_rdr.Tag__move_fwd_tail(head.Name_id()); + this.src_end = tail.Src_end(); + // Recurse_content + */ + return true; + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/styles/Hz_atr_itm.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/styles/Hz_atr_itm.java new file mode 100644 index 000000000..306501a1f --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/xndes/styles/Hz_atr_itm.java @@ -0,0 +1,189 @@ +/* +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 . +*/ +//namespace gplx.xowa.htmls.core.wkrs.xndes.styles { +// using gplx.langs.htmls.parsers; +// using gplx.xowa.htmls.core.hzips; +// class Hz_regy_load { +// public void Load(byte[] src, int bgn, int end) { +// int pos = bgn; +// pos = Load_doc_tags(src, pos, end); +// pos = Load_doc_atrs(src, pos, end); +// } +// private int Load_doc_tags(byte[] src, int bgn, int end) { // EX: "table\ntr\ntd\n\n" +// int pos = bgn; +// int tag_bgn = pos; +// while (pos < end) { +// if (src[pos] == Byte_ascii.Nl) { +// if (pos - tag_bgn == 0) break; // \n\n denotes end of doc tags +// Tags__add(Bry_.Mid(src, tag_bgn, pos)); +// tag_bgn = pos + 1; +// } +// } +// return pos; +// } +// private int Load_doc_atrs(byte[] src, int bgn, int end) { // EX: "0colspan style\n1colspan style" +// int pos = bgn; +// // read tag_id +// int atr_bgn = pos; +// while (pos < end) { +// byte b = src[pos]; +// switch (b) { +// case Byte_ascii.Space: +//// Tags__add(Bry_.Mid(src, tag_bgn, pos)); +// atr_bgn = pos + 1; +// break; +// } +// } +// return pos; +// } +// private int Load_atr_vals(byte[] src, int bgn, int end) { // EX: "01left;right;\n2left;right;\n\n11" +// return -1; +// } +// private int Load_tag(byte[] src, int bgn, int end) { +//// byte[] tag_name +//// this.Tags__add(); +//// int pos = bgn; +//// while (pos < end) { +//// byte b = src[pos]; +//// +//// } +// return -1; +// } +// } +// class Hz_regy { +// private final Ordered_hash tag_hash = Ordered_hash_.New(); +// public Hz_tag_itm Tags__get_or_new(int name_id) { +// return null; +// } +// public Hz_atr_itm Atrs__get_or_new(byte[] key) { +// return null; +// } +// public void Tags__add(byte[] key) { +// } +// public void Save(Bry_bfr bfr) { +// int len = tag_hash.Count(); +// for (int i = 0; i < len; ++i) { +// Hz_tag_itm ztag = (Hz_tag_itm)tag_hash.Get_at(i); +// if (!ztag.Scope_is_doc()) +// Save_tag(bfr, ztag); +// } +// for (int i = 0; i < len; ++i) { +// Hz_tag_itm ztag = (Hz_tag_itm)tag_hash.Get_at(i); +// if (ztag.Scope_is_doc()) +// Save_tag(bfr, ztag); +// } +// /* +// table +// td +// +// 01a +// atrs +// ---- +// +// +//
    +// ~d9ABC~F! +//
    +// td|scope|new_val +// 00new_val +// td|new_atr|new_val|new_val2 +// */ +// } +// private void Save_tag(Bry_bfr bfr, Hz_tag_itm ztag) { +// Hz_atr_itm[] atrs = ztag.Atrs(); +// int len = atrs.length; +// Xoh_hzip_int_.Encode(1, bfr, ztag.Id()); +// for (int i = 0; i < len; ++i) { +// Hz_atr_itm atr = atrs[i]; +// Save_atr(bfr, atr, Byte_ascii.Escape); +// } +// bfr.Add_byte_nl(); +// } +// private void Save_atr(Bry_bfr bfr, Hz_atr_itm atr, byte dlm) { +// // Xoh_hzip_int_.Encode(1, bfr, atr.Id()); +// Hz_val_itm[] vals = atr.Itms(); +// int len = vals.length; +// for (int i = 0; i < len; ++i) { +// Hz_val_itm val = vals[i]; +// bfr.Add(atr.Text()).Add_byte(dlm); +// } +// } +// } +// class Hz_tag_hzip { +// private static final byte[] Hook_tag = Bry_.new_a7("~z"); +// public void Encode(Bry_bfr bfr, Hz_regy regy, Html_tag htag) { +// Hz_tag_itm ztag = regy.Tags__get_or_new(htag.Name_id()); +// +// bfr.Add(Hook_tag); +// Xoh_hzip_int_.Encode(1, bfr, ztag.Id()); +// int len = htag.Atrs__len(); +// for (int i = 0; i < len; ++i) { +// Html_atr hatr = htag.Atrs__get_at(i); +// Hz_atr_itm zatr = regy.Atrs__get_or_new(hatr.Key()); +// Xoh_hzip_int_.Encode(1, bfr, zatr.Id()); +// byte[] hval = hatr.Val(); +// if (zatr.Indexable()) +// zatr.Write(bfr, hval); +// else +// bfr.Add(hval); +// } +// } +// } +// class Hz_tag_itm { +// private List_adp atr_list; +// public Hz_tag_itm(int id, byte[] text, boolean scope_is_doc, boolean indexable) { +// this.id = id; this.text = text; this.scope_is_doc = scope_is_doc; this.indexable = indexable; +// } +// public int Id() {return id;} private int id; +// public byte[] Text() {return text;} private byte[] text; +// public boolean Scope_is_doc() {return scope_is_doc;} private boolean scope_is_doc; +// public boolean Indexable() {return indexable;} private boolean indexable; +// public Hz_atr_itm[] Atrs() {if (atr_ary_is_dirty) atr_ary = (Hz_atr_itm[])atr_list.To_ary(typeof(Hz_atr_itm)); return atr_ary;} private Hz_atr_itm[] atr_ary; private boolean atr_ary_is_dirty = false; +// private void Add(byte[] text) { +// if (atr_list == null) atr_list = List_adp_.new_(); +// atr_list.Add(new Hz_atr_itm(atr_list.Count(), text, Bool_.Y, Bool_.Y)); +// } +// } +// class Hz_atr_itm { +// private List_adp list; +// public Hz_atr_itm(int id, byte[] text, boolean scope_is_doc, boolean indexable) { +// this.id = id; this.text = text; this.scope_is_doc = scope_is_doc; this.indexable = indexable; +// } +// public int Id() {return id;} private int id; +// public byte[] Text() {return text;} private byte[] text; +// public boolean Scope_is_doc() {return scope_is_doc;} private boolean scope_is_doc; +// public boolean Indexable() {return indexable;} private boolean indexable; +// public Hz_val_itm[] Itms() {if (ary_is_dirty) ary = (Hz_val_itm[])list.To_ary(typeof(Hz_val_itm)); return ary;} private Hz_val_itm[] ary; private boolean ary_is_dirty = false; +// private void Itms__add(byte[] text) { +// if (list == null) list = List_adp_.new_(); +// ary_is_dirty = true; +// list.Add(new Hz_val_itm(list.Count(), text, Bool_.Y)); +// } +// public void Write(Bry_bfr bfr, byte[] text) { +// Xoh_hzip_int_.Encode(1, bfr, 1); +// } +// } +// class Hz_val_itm { +// public Hz_val_itm(int id, byte[] text, boolean scope_is_doc) { +// this.id = id; this.text = text; this.scope_is_doc = scope_is_doc; +// } +// public int Id() {return id;} private int id; +// public byte[] Text() {return text;} private byte[] text; +// public boolean Scope_is_doc() {return scope_is_doc;} private boolean scope_is_doc; +// } +//} diff --git a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java index b6da02ada..10ccfba94 100644 --- a/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/heads/Xoh_head_mgr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.htmls.heads; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +import gplx.core.bits.*; public class Xoh_head_mgr extends gplx.core.brys.Bfr_arg_base { private Xoae_app app; private Xowe_wiki wiki; private Xoae_page page; private Xoh_head_itm__base[] itms; private int itms_len; diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr.java index 66f0ea13e..a03a68ee8 100644 --- a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_wtr.java @@ -17,19 +17,19 @@ along with this program. If not, see . */ package gplx.xowa.htmls.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.core.brys.fmtrs.*; -import gplx.langs.htmls.encoders.*; +import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.wikis.xwikis.*; public class Xoh_href_wtr { private final Bry_bfr encoder_bfr = Bry_bfr.reset_(255), tmp_bfr = Bry_bfr.reset_(255); - private final Gfo_url_encoder encoder = gplx.langs.htmls.encoders.Gfo_url_encoder_.Href; + private final Gfo_url_encoder encoder = Gfo_url_encoder_.Href; public byte[] Build_to_bry(Xow_wiki wiki, Xoa_ttl ttl) { synchronized (tmp_bfr) { - Build_to_bfr(tmp_bfr, wiki.App(), wiki.Domain_bry(), ttl, Bool_.N); + Build_to_bfr(tmp_bfr, wiki.App(), Xoh_wtr_ctx.Mode_basic, wiki.Domain_bry(), ttl); return tmp_bfr.To_bry_and_clear(); } } - public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, byte[] domain_bry, Xoa_ttl ttl) {Build_to_bfr(bfr, app, domain_bry, ttl, Bool_.N);} - public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, byte[] domain_bry, Xoa_ttl ttl, boolean force_site) { + public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, byte[] domain_bry, Xoa_ttl ttl) {Build_to_bfr(bfr, app, Xoh_wtr_ctx.Mode_basic, domain_bry, ttl);} + public void Build_to_bfr(Bry_bfr bfr, Xoa_app app, int hctx_mode, byte[] domain_bry, Xoa_ttl ttl) { byte[] page = ttl.Full_txt_raw(); Xow_xwiki_itm xwiki = ttl.Wik_itm(); if (xwiki == null) // not an xwiki; EX: [[wikt:Word]] @@ -40,7 +40,7 @@ public class Xoh_href_wtr { } if (xwiki == null) { // not an xwiki if (ttl.Anch_bgn() != 1) { // not an anchor-only; EX: "#A" - if (force_site) { // popup parser always writes as "/site/" + if (hctx_mode == Xoh_wtr_ctx.Mode_popup) { // popup parser always writes as "/site/" bfr.Add(Xoh_href_.Bry__site); // add "/site/"; EX: /site/ bfr.Add(domain_bry); // add xwiki; EX: en_dict bfr.Add(Xoh_href_.Bry__wiki); // add "/wiki/"; EX: /wiki/ @@ -51,7 +51,9 @@ public class Xoh_href_wtr { else {} // anchor: noop } else { // xwiki - if (app.Xwiki_mgr__missing(xwiki.Domain_bry())) { // xwiki is not offline; use http: + if ( app.Xwiki_mgr__missing(xwiki.Domain_bry()) // xwiki is not offline; use http: + || hctx_mode == Xoh_wtr_ctx.Mode_hdump // hdump should never dump as "/site/" + ) { Bry_fmtr url_fmtr = xwiki.Url_fmtr(); if (url_fmtr == null) { bfr.Add(Xoh_href_.Bry__https); // add "https://"; EX: https:// @@ -77,7 +79,7 @@ public class Xoh_href_wtr { encoder.Encode(encoder_bfr, ttl_full, page_bgn, ttl_full.length); else { // anchor exists; check if anchor is preceded by ws; EX: [[A #b]] -> "/wiki/A#b" int page_end = Bry_find_.Find_bwd_last_ws(ttl_full, anch_bgn); // first 1st ws before #; handles multiple ws - page_end = page_end == Bry_find_.Not_found ? anch_bgn : page_end; // if ws not found, use # pos; else use 1st ws pos + page_end = page_end == Bry_find_.Not_found ? anch_bgn : page_end; // if ws not found, use # pos; else use 1st ws pos encoder.Encode(encoder_bfr, ttl_full, page_bgn, page_end); // add page encoder.Encode(encoder_bfr, ttl_full, anch_bgn, ttl_full.length); // add anchor } diff --git a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_tst.java b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_tst.java index 833b45afd..9d8019044 100644 --- a/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/js/Xoh_js_cbk_tst.java @@ -35,7 +35,7 @@ class Xoh_js_cbk_fxt { public void Test_get_title(String ttl, Object... expd) { Xoae_app app = fxt.App(); Xowe_wiki wiki = fxt.Wiki(); - Xoae_page page = Xoae_page.test_(wiki, Xoa_ttl.parse(wiki, Bry_.new_a7("mock_page"))); + Xoae_page page = Xoae_page.New_test(wiki, Xoa_ttl.parse(wiki, Bry_.new_a7("mock_page"))); Xog_tab_itm tab = app.Gui_mgr().Browser_win().Active_tab(); tab.Page_(page); Xoh_js_cbk exec = tab.Html_itm().Js_cbk(); diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java index 66fc8a63b..eac75611e 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_html_mkr.java @@ -32,7 +32,7 @@ public class Xow_popup_html_mkr { } public byte[] Bld(Xowe_wiki cur_wiki, Xoae_page page, Xow_popup_itm popup_itm, Bry_bfr wrdx_bfr) { if (output_js_clean) app.Html_mgr().Js_cleaner().Clean_bfr(wiki, page.Ttl(), wrdx_bfr, 0); - if (output_tidy) app.Html_mgr().Tidy_mgr().Run_tidy_html(page, wrdx_bfr); + if (output_tidy) app.Html_mgr().Tidy_mgr().Run_tidy_html(page, wrdx_bfr, Bool_.Y); byte[] hdom_bry = wrdx_bfr.To_bry_and_clear(); String page_url = wrdx_bfr.Add(page.Wiki().Domain_bry()).Add(gplx.xowa.htmls.hrefs.Xoh_href_.Bry__wiki).Add(gplx.langs.htmls.encoders.Gfo_url_encoder_.Href .Encode(page.Ttl().Full_db())) // NOTE: was page.Url().Raw(), but that doesn't work for Special:Search; PAGE:en.w:Earth and "Quotations"; DATE:2014-06-29 diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java index df9d7dbea..847539082 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser.java @@ -40,7 +40,7 @@ public class Xow_popup_parser { } public void Init_by_wiki(Xowe_wiki wiki) { this.wiki = wiki; this.app = wiki.Appe(); this.parser = wiki.Parser_mgr().Main(); this.tkn_mkr = app.Parser_mgr().Tkn_mkr(); - this.tmpl_ctx = Xop_ctx.new_(wiki); this.wtxt_ctx = Xop_ctx.new_(wiki); + this.tmpl_ctx = Xop_ctx.new_main_page(wiki); this.wtxt_ctx = Xop_ctx.new_main_page(wiki); Xop_lxr_mgr tmpl_lxr_mgr = Xop_lxr_mgr.Popup_lxr_mgr; tmpl_lxr_mgr.Init_by_wiki(wiki); this.tmpl_trie = tmpl_lxr_mgr.Trie(); this.wtxt_trie = parser.Wtxt_lxr_mgr().Trie(); @@ -62,7 +62,7 @@ public class Xow_popup_parser { } private boolean Canceled(Xow_popup_itm popup_itm, Xog_tab_itm cur_tab) {return popup_itm.Canceled() || cur_tab != null && cur_tab.Tab_is_loading();} private void Init_ctxs(byte[] tmpl_src, Xoa_ttl ttl) { - tmpl_ctx.Clear(); + tmpl_ctx.Clear_all(); tmpl_ctx.Cur_page().Ttl_(ttl); // NOTE: must set cur_page, else page-dependent templates won't work; EX: {{FULLPAGENAME}}; PAGE:en.w:June_20; DATE:2014-06-20 tmpl_ctx.Cur_page().Html_data().Html_restricted_(data.Html_restricted()); // NOTE: must set data.Html_restricted() if Special:XowaPopupHistory tmpl_ctx.Page_bgn(tmpl_root, tmpl_src); @@ -99,7 +99,7 @@ public class Xow_popup_parser { ) { new_tmpl_bgn = tmpl_bgn; tmpl_read_len_cur = Xow_popup_parser_.Calc_read_len(wtxt_ctx, tmpl_read_len_cur, cfg.Tmpl_read_len(), tmpl_src, tmpl_bgn, tmpl_end); - wtxt_ctx.Clear(); + wtxt_ctx.Clear_all(); } else { wrdx_mkr.Process_tkn(cfg, data, data.Wrdx_bfr(), wtxt_root, wtxt_bry, wtxt_len); @@ -194,7 +194,7 @@ public class Xow_popup_parser { } } private void Wtxt_ctx_init(boolean incremental, byte[] bry) { - wtxt_ctx.Clear(); + wtxt_ctx.Clear_all(); wtxt_ctx.Cur_page().Html_data().Html_restricted_(data.Html_restricted()); wtxt_ctx.Para().Enabled_(!incremental); // NOTE: if incremental, disable para; easier to work with \n rather than

    ; also, must be enabled before Page_bgn; DATE:2014-06-18DATE:2014-06-18 wtxt_ctx.Lnke().Dangling_goes_on_stack_(incremental); diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java index 51d75a959..37fe7c58e 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_parser_tst.java @@ -498,7 +498,7 @@ class Xop_popup_parser_fxt { } public void Test_parse(String raw, String expd) {Test_parse(raw, "Test_1", expd);} public void Test_parse(String raw, String ttl, String expd) { - Xoae_page page = Xoae_page.create_(wiki, Xoa_ttl.parse(wiki, Bry_.new_a7(ttl))); + Xoae_page page = Xoae_page.New_edit(wiki, Xoa_ttl.parse(wiki, Bry_.new_a7(ttl))); page.Data_raw_(Bry_.new_u8(raw)); Xow_popup_itm itm = new Xow_popup_itm(1, Bry_.new_u8(raw), Bry_.Empty, word_min); itm.Init(wiki.Domain_bry(), page.Ttl()); diff --git a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_file_page_wtr.java b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_file_page_wtr.java index 6d687d73c..4eb361503 100644 --- a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_file_page_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_file_page_wtr.java @@ -52,7 +52,7 @@ public class Xoh_file_page_wtr { public Bry_fmtr Html_main_img() {return html_main_img;} private final Bry_fmtr html_main_img = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "

    " , " " - , " \"~{thumb_ttl}\"" + , " \"~{thumb_alt}\"" , " " , " " , "" - ), "orig_width", "orig_height", "orig_href", "orig_file_size", "orig_mime_type", "elem_id", "thumb_width", "thumb_height", "thumb_href", "thumb_ttl", "thumb_name", "section_alts"); + ), "orig_width", "orig_height", "orig_href", "orig_file_size", "orig_mime_type", "elem_id", "thumb_width", "thumb_height", "thumb_href", "thumb_alt", "thumb_name", "section_alts"); public Bry_fmtr Html_main_aud() {return html_main_aud;} private final Bry_fmtr html_main_aud = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" , "" - ), "lnki_url", "lnki_title", "play_width", "play_max_width", "play_icon"); + ), "lnki_url", "xowa_title", "play_width", "play_max_width", "play_icon"); public Bry_fmtr Html_main_vid() {return html_main_vid;} private final Bry_fmtr html_main_vid = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "
    " , "
    " - , " " + , " " , " \"~{lnki_alt}\"" , " " , "
    " , "
    " - , " " + , " " , " \"Play" , " " , "
    " , "
    " , "" - ), "elem_id", "lnki_href", "lnki_class", "lnki_title", "lnki_src", "lnki_width", "lnki_height", "lnki_alt", "lnki_url", "play_width", "play_max_width", "play_icon"); + ), "elem_id", "lnki_href", "lnki_class", "xowa_title", "lnki_src", "lnki_width", "lnki_height", "lnki_alt", "lnki_url", "play_width", "play_max_width", "play_icon"); public Bry_fmtr Html_alts() {return html_alts;} private final Bry_fmtr html_alts = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( " " , " ~{thumb_width} × ~{thumb_height}" diff --git a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java index d3f794637..f81edb302 100644 --- a/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/ns_files/Xoh_ns_file_page_mgr.java @@ -59,12 +59,17 @@ public class Xoh_ns_file_page_mgr extends gplx.core.brys.Bfr_arg_base { @Override public void Bfr_arg__add(Bry_bfr bfr) { alt_wtr.Init_by_fmtr(repo_mgr, xfer_itm, html_wtr); Xof_ext orig_ext = xfer_itm.Orig_ext(); + byte[] alt_bry = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Encode(ttl.Full_txt()); + byte[] xowa_title = gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Encode(ttl.Page_url()); if (orig_ext.Id_is_thumbable_img()) - html_wtr.Html_main_img().Bld_bfr_many(bfr, xfer_itm.Orig_w(), xfer_itm.Orig_h(), xfer_itm.Html_orig_url().To_http_file_bry(), file_size_bry, orig_ext.Mime_type(), xfer_itm.Html_uid(), xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_url().To_http_file_bry(), ttl.Full_txt(), gplx.langs.htmls.encoders.Gfo_url_encoder_.Http_url.Encode(ttl.Page_url()), alt_wtr); + html_wtr.Html_main_img().Bld_bfr_many(bfr, xfer_itm.Orig_w(), xfer_itm.Orig_h(), xfer_itm.Html_orig_url().To_http_file_bry(), file_size_bry, orig_ext.Mime_type() + , xfer_itm.Html_uid(), xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Html_view_url().To_http_file_bry() + , alt_bry, xowa_title, alt_wtr); else if (orig_ext.Id_is_video()) // NOTE: video must precede audio else File:***.ogg will not show thumbs - html_wtr.Html_main_vid().Bld_bfr_many(bfr, xfer_itm.Html_uid(), xfer_itm.Html_view_url().To_http_file_bry(), Atr_class_image, ttl.Page_db(), xfer_itm.Html_view_url().To_http_file_bry(), xfer_itm.Html_w(), xfer_itm.Html_h(), Bry_.Empty, xfer_itm.Html_orig_url().To_http_file_bry(), xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); + html_wtr.Html_main_vid().Bld_bfr_many(bfr, xfer_itm.Html_uid(), xfer_itm.Html_view_url().To_http_file_bry(), Atr_class_image, xowa_title + , xfer_itm.Html_view_url().To_http_file_bry(), xfer_itm.Html_w(), xfer_itm.Html_h(), Bry_.Empty, xfer_itm.Html_orig_url().To_http_file_bry(), xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); else if (orig_ext.Id_is_audio()) - html_wtr.Html_main_aud().Bld_bfr_many(bfr, xfer_itm.Html_orig_url().To_http_file_bry(), ttl.Page_db(), xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); + html_wtr.Html_main_aud().Bld_bfr_many(bfr, xfer_itm.Html_orig_url().To_http_file_bry(), xowa_title, xfer_itm.Html_w(), xfer_itm.Html_w(), play_btn_icon); } private static final byte[] Atr_class_image = Bry_.new_a7("image"); private static final String Str_commons_notice = String_.Concat_lines_nl_skip_last diff --git a/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java b/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java index 04fa7cf52..a6b804972 100644 --- a/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/portal/Xow_portal_mgr.java @@ -53,7 +53,7 @@ public class Xow_portal_mgr implements GfoInvkAble { byte[] wiki_user_name = wiki.User().Name(); div_personal_bry = Init_fmtr(tmp_bfr, eval_mgr, div_personal_fmtr, Bry_.Add(Xoh_href_.Bry__wiki, wiki.Ns_mgr().Ids_get_or_null(Xow_ns_.Tid__user).Name_db_w_colon(), wiki_user_name), wiki_user_name, Ns_cls_by_id(wiki.Ns_mgr(), Xow_ns_.Tid__user), Bry_.Add(Xoh_href_.Bry__wiki, wiki.Ns_mgr().Ids_get_or_null(Xow_ns_.Tid__user_talk).Name_db_w_colon(), wiki_user_name), Ns_cls_by_id(wiki.Ns_mgr(), Xow_ns_.Tid__user_talk)); byte[] main_page_href_bry = tmp_bfr.Add(Xoh_href_.Bry__site).Add(wiki.Domain_bry()).Add(Xoh_href_.Bry__wiki).To_bry_and_clear(); // NOTE: build /site/en.wikipedia.org/wiki/ href; no Main_Page, as that will be inserted by Xoh_href_parser - div_logo_bry = Init_fmtr(tmp_bfr, eval_mgr, div_logo_fmtr, main_page_href_bry, gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys.Encode_to_file_protocol(wiki.Appe().Usere().Fsys_mgr().Wiki_root_dir().GenSubFil_nest(wiki.Domain_str(), "html", "logo.png"))); + div_logo_bry = Init_fmtr(tmp_bfr, eval_mgr, div_logo_fmtr, main_page_href_bry, gplx.langs.htmls.encoders.Gfo_url_encoder_.Fsys_lnx.Encode_to_file_protocol(wiki.Appe().Usere().Fsys_mgr().Wiki_root_dir().GenSubFil_nest(wiki.Domain_str(), "html", "logo.png"))); div_home_bry = Init_fmtr(tmp_bfr, eval_mgr, div_home_fmtr); div_wikis_fmtr.Eval_mgr_(eval_mgr); Xow_msg_mgr msg_mgr = wiki.Msg_mgr(); diff --git a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_hdr_mgr.java b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_hdr_mgr.java index df827ff01..fad40a654 100644 --- a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_hdr_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_hdr_mgr.java @@ -108,7 +108,8 @@ public class Xow_hdr_mgr { break; case Xop_tkn_itm_.Tid_lnki: Xop_lnki_tkn lnki = (Xop_lnki_tkn)sub; - if (lnki.Ns_id() == Xow_ns_.Tid__category) {} // Category text should not print; DATE:2013-12-09 + if ( lnki.Ns_id() == Xow_ns_.Tid__category // Category text should not print; DATE:2013-12-09 + && !lnki.Ttl().ForceLiteralLink()) {} // unless it is literal link; EX: [[:Category:A]]; PAGE:s.w:Wikipedia:Requests_for_deletion/Log_1 DATE:2015-11-29 else { if (lnki.Caption_exists()) Id_bld_recurse(raw_bfr, src, lnki.Caption_val_tkn()); diff --git a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java index 7d290243a..4d6656a9c 100644 --- a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java @@ -454,11 +454,11 @@ public class Xow_toc_mgr_tst { , String_.Concat_lines_nl ( fxt.toc_tbl_nl_n ( " " ) - , "

    ACategory:B

    " + , "

    ACategory:B

    " )); } @Test public void File() { // PURPOSE: file should show in in TOC; EX: tr.w:D�nya_Miraslari; DATE:2014-06-06 diff --git a/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java b/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java index 9cdc197c9..58786d0eb 100644 --- a/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java +++ b/400_xowa/src/gplx/xowa/langs/parsers/Xol_lang_srl.java @@ -36,6 +36,7 @@ public class Xol_lang_srl { break; case Byte_ascii.Nl: byte[] cur_name = csv_parser.Load(src, fld_bgn, pos); + cur_name = Xoa_ttl.Replace_spaces(cur_name); // NOTE: *.gfs files will have names with \s instead of _; this comes from Language.php which also has same \s convention; EX: "Template talk" instead of "Template_talk" Xow_ns ns = new Xow_ns(cur_id, Xow_ns_case_.Tid__1st, cur_name, false); rv.Add(ns); fld_bgn = pos + 1; diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_regy.java b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_regy.java index e1658ca2d..90acb6343 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_regy.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xol_vnt_regy.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; -import gplx.core.btries.*; +import gplx.core.btries.*; import gplx.core.bits.*; import gplx.xowa.parsers.vnts.*; public class Xol_vnt_regy { private final Hash_adp_bry hash = Hash_adp_bry.ci_a7(); private int hash_len; diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java index fd84f0bba..623f80a62 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java @@ -61,10 +61,10 @@ public class Xop_ctx { public boolean Only_include_evaluate() {return only_include_evaluate;} public Xop_ctx Only_include_evaluate_(boolean v) {only_include_evaluate = v; return this;} private boolean only_include_evaluate; public Lst_section_nde_mgr Lst_section_mgr() {if (lst_section_mgr == null) lst_section_mgr = new Lst_section_nde_mgr(); return lst_section_mgr;} private Lst_section_nde_mgr lst_section_mgr; public Hash_adp_bry Lst_page_regy() {return lst_page_regy;} private Hash_adp_bry lst_page_regy; - public boolean Ref_ignore() {return ref_ignore;} public Xop_ctx Ref_ignore_(boolean v) {ref_ignore = v; return this;} private boolean ref_ignore; // NOTE: only applies to sub_ctx's created by and {{#lst}}; if true, does not add to page.Ref_mgr; DATE:2014-04-24 - public byte[] References_group() {return references_group;} public Xop_ctx References_group_(byte[] v) {references_group = v; return this;} private byte[] references_group; - public boolean Tid_is_popup() {return tid_is_popup;} public void Tid_is_popup_(boolean v) {tid_is_popup = v;} private boolean tid_is_popup = false; - public boolean Tid_is_image_map() {return tid_is_image_map;} public Xop_ctx Tid_is_image_map_(boolean v) {tid_is_image_map = v; return this;} private boolean tid_is_image_map; + public boolean Ref_ignore() {return ref_ignore;} public Xop_ctx Ref_ignore_(boolean v) {ref_ignore = v; return this;} private boolean ref_ignore; // NOTE: only applies to sub_ctx's created by and {{#lst}}; if true, does not add to page.Ref_mgr; DATE:2014-04-24 + public byte[] References_group() {return references_group;} public Xop_ctx References_group_(byte[] v) {references_group = v; return this;} private byte[] references_group; + public boolean Tid_is_popup() {return tid_is_popup;} public void Tid_is_popup_(boolean v) {tid_is_popup = v;} private boolean tid_is_popup = false; + public boolean Tid_is_image_map() {return tid_is_image_map;} public Xop_ctx Tid_is_image_map_(boolean v) {tid_is_image_map = v; return this;} private boolean tid_is_image_map; public Xop_log_invoke_wkr Xtn__scribunto__invoke_wkr() { if (scrib_invoke_wkr == null) scrib_invoke_wkr = ((Scrib_xtn_mgr)(app.Xtn_mgr().Get_or_fail(Scrib_xtn_mgr.XTN_KEY))).Invoke_wkr(); @@ -72,8 +72,9 @@ public class Xop_ctx { } private Xop_log_invoke_wkr scrib_invoke_wkr; public Xop_log_property_wkr Xtn__wikidata__property_wkr() {return app.Wiki_mgr().Wdata_mgr().Property_wkr();} public Gfo_msg_log Msg_log() {return msg_log;} private Gfo_msg_log msg_log; - public Xop_ctx Clear() { - cur_page.Clear(); + public Xop_ctx Clear_all() {return Clear(true);} + public Xop_ctx Clear(boolean clear_scrib) { + cur_page.Clear(clear_scrib); stack = Xop_tkn_itm_.Ary_empty; stack_len = stack_max = 0; app.Wiki_mgr().Wdata_mgr().Clear(); @@ -96,12 +97,12 @@ public class Xop_ctx { Stack_pop_til(root, src, 0, true, src_len, src_len, Xop_tkn_itm_.Tid_txt); for (Xop_ctx_wkr wkr : wkrs) wkr.Page_end(this, root, src, src_len); } - public boolean Lxr_make() {return lxr_make;} public Xop_ctx Lxr_make_(boolean v) {lxr_make = v; return this;} private boolean lxr_make = false; - public int Lxr_make_txt_(int pos) {lxr_make = false; return pos;} - public int Lxr_make_log_(Gfo_msg_itm itm, byte[] src, int bgn_pos, int cur_pos) {lxr_make = false; msg_log.Add_itm_none(itm, src, bgn_pos, cur_pos); return cur_pos;} - public boolean Empty_ignored() {return empty_ignored;} - public void Empty_ignored_y_() {empty_ignored = true;} private boolean empty_ignored = false; - public void Empty_ignored_n_() {empty_ignored = false;} + public boolean Lxr_make() {return lxr_make;} public Xop_ctx Lxr_make_(boolean v) {lxr_make = v; return this;} private boolean lxr_make = false; + public int Lxr_make_txt_(int pos) {lxr_make = false; return pos;} + public int Lxr_make_log_(Gfo_msg_itm itm, byte[] src, int bgn_pos, int cur_pos) {lxr_make = false; msg_log.Add_itm_none(itm, src, bgn_pos, cur_pos); return cur_pos;} + public boolean Empty_ignored() {return empty_ignored;} + public void Empty_ignored_y_() {empty_ignored = Bool_.Y;} private boolean empty_ignored = false; + public void Empty_ignored_n_() {empty_ignored = Bool_.N;} public void Empty_ignore(Xop_root_tkn root, int empty_bgn) { int empty_end = root.Subs_len(); for (int i = empty_bgn; i < empty_end; i++) { @@ -303,15 +304,12 @@ public class Xop_ctx { if (stack_pos == -1) return; ctx.Stack_pop_til(root, src, stack_pos, true, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_txt); } - public static Xop_ctx new_(Xowe_wiki wiki) { - Xop_ctx rv = new Xop_ctx(wiki, Xoae_page.new_(wiki, Xoa_ttl.parse(wiki, Xoa_page_.Main_page_bry))); // HACK: use "Main_Page" to put in valid page title - return rv; - } - public static Xop_ctx new_sub_(Xowe_wiki wiki) {return new_sub_(wiki, wiki.Parser_mgr().Ctx().cur_page);} + public static Xop_ctx new_main_page(Xowe_wiki wiki) {return new_(wiki, Xoa_page_.Main_page_bry);} // HACK: use "Main_Page" to put in valid page title + public static Xop_ctx new_(Xowe_wiki wiki, byte[] ttl_bry) {return new Xop_ctx(wiki, Xoae_page.New(wiki, wiki.Ttl_parse(ttl_bry)));} + public static Xop_ctx new_sub_(Xowe_wiki wiki) {return new_sub_(wiki, wiki.Parser_mgr().Ctx().cur_page);} public static Xop_ctx new_sub_(Xowe_wiki wiki, Xoae_page page) { // TODO: new_sub_ should reuse ctx's page; callers who want new_page should call new_sub_page_; DATE:2014-04-10 - Xop_ctx ctx = wiki.Parser_mgr().Ctx(); Xop_ctx rv = new Xop_ctx(wiki, page); - new_copy(ctx, rv); + new_copy(wiki.Parser_mgr().Ctx(), rv); return rv; } public static Xop_ctx new_sub_page_(Xowe_wiki wiki, Xop_ctx ctx, Hash_adp_bry lst_page_regy) { @@ -320,8 +318,17 @@ public class Xop_ctx { rv.lst_page_regy = lst_page_regy; // NOTE: must share ref for lst only (do not share for sub_(), else stack overflow) return rv; } + public static Xop_ctx New_sub_by_ctx(Xop_ctx ctx) { + Xowe_wiki wiki = ctx.Wiki(); + Xop_ctx rv = new Xop_ctx(wiki, Xoae_page.New(wiki, wiki.Ttl_parse(ctx.Cur_page().Ttl().Full_db()))); + new_copy(ctx, rv); + return rv; + } private static void new_copy(Xop_ctx src, Xop_ctx trg) { trg.Lnki().File_wkr_(src.Lnki().File_wkr()); // always share file_wkr between sub contexts trg.tmpl_output = src.tmpl_output; // share bfr for optimization purposes + trg.ref_ignore = src.ref_ignore; // copy ref_ignore; needed for refs inside poem else duplicate refs; it.s:La_Secchia_rapita/Canto_primo; DATE:2015-12-03 + trg.references_group = src.references_group; + trg.cur_page.Ref_mgr_(src.cur_page.Ref_mgr()); } } diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java index 13ea6597b..53f20053b 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_parser.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_parser.java @@ -70,7 +70,7 @@ public class Xop_parser { // NOTE: parsers are reused; do not keep any read-writ tmpl.Init_by_new(ns, name, src, root, tmpl_props.OnlyInclude_exists); } private Xot_compile_data tmpl_props = new Xot_compile_data(); public void Parse_page_all_clear(Xop_root_tkn root, Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, byte[] src) { - ctx.Cur_page().Clear(); ctx.App().Msg_log().Clear(); + ctx.Cur_page().Clear_all(); ctx.App().Msg_log().Clear(); Parse_text_to_wdom(root, ctx, tkn_mkr, src, Xop_parser_.Doc_bgn_bos); } public Xop_root_tkn Parse_text_to_wdom_old_ctx(Xop_ctx old_ctx, byte[] src, boolean doc_bgn_pos) {return Parse_text_to_wdom(Xop_ctx.new_sub_(old_ctx.Wiki()), src, doc_bgn_pos);} diff --git a/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java b/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java index 98ddec40e..aa06de173 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java +++ b/400_xowa/src/gplx/xowa/parsers/Xow_parser_mgr.java @@ -22,7 +22,7 @@ public class Xow_parser_mgr { private Xop_parser anchor_encode_parser; public Xow_parser_mgr(Xowe_wiki wiki) { this.wiki = wiki; this.tkn_mkr = wiki.Appe().Parser_mgr().Tkn_mkr(); - this.ctx = Xop_ctx.new_(wiki); + this.ctx = Xop_ctx.new_main_page(wiki); this.main = Xop_parser.new_wiki(wiki); } public Xop_ctx Ctx() {return ctx;} private final Xop_ctx ctx; @@ -40,7 +40,7 @@ public class Xow_parser_mgr { gplx.xowa.xtns.scribunto.Scrib_core.Core_page_changed(page); // notify scribunto about page changed ctx.Cur_page_(page); Xop_root_tkn root = ctx.Tkn_mkr().Root(page.Data_raw()); - if (clear) {page.Clear();} + if (clear) {page.Clear_all();} Xoa_ttl ttl = page.Ttl(); if (Xow_page_tid.Identify(wiki.Domain_tid(), ttl.Ns().Id(), ttl.Page_db()) == Xow_page_tid.Tid_wikitext) // only parse page if wikitext; skip .js, .css, Module; DATE:2013-11-10 main.Parse_text_to_wdom(root, ctx, tkn_mkr, page.Data_raw(), Xop_parser_.Doc_bgn_bos); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_type.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_type.java index c63c45fce..04f8c32ea 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_type.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_type.java @@ -16,8 +16,20 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import gplx.core.bits.*; public class Xop_lnki_type { public static final byte Id_null = 0, Id_none = 1, Id_frameless = 2, Id_frame = 4, Id_thumb = 8; + public static final byte Tid_null = 0, Tid_none = 1, Tid_frameless = 2, Tid_frame = 3, Tid_thumb = 4; // SERIALIZED + public static byte To_tid(byte flag) { + switch (flag) { + case Xop_lnki_type.Id_null: return Xop_lnki_type.Tid_null; + case Xop_lnki_type.Id_none: return Xop_lnki_type.Tid_none; + case Xop_lnki_type.Id_frameless: return Xop_lnki_type.Tid_frameless; + case Xop_lnki_type.Id_frame: return Xop_lnki_type.Tid_frame; + case Xop_lnki_type.Id_thumb: return Xop_lnki_type.Tid_thumb; + default: throw Err_.new_unhandled(flag); + } + } public static boolean Id_is_thumbable(byte id) { return ( Bitmask_.Has_int(id, Id_thumb) // for purposes of displaying images on page, thumb and frame both create a thumb box || Bitmask_.Has_int(id, Id_frame) diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java index a8654850e..fc5bc6e60 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__basic_tst.java @@ -265,14 +265,26 @@ public class Xop_lnki_wkr__basic_tst { @Test public void Encoded_url() { // PURPOSE.fix: url-encoded characters broke parser when embedded in link; DATE:2013-03-01 fxt.Init_xwiki_add_user_("commons.wikimedia.org"); fxt.Test_parse_page_wiki_str("[[File:A.png|link=//commons.wikimedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0?uselang=ru|b]]" - , "\"b\""); + , "\"b\""); } - @Test public void Link_invalid() { // PURPOSE.fix: do not render invalid text; EX: link={{{1}}}; [[Fil:Randers_-_Hadsund_railway.png|120x160px|link={{{3}}}|Randers-Hadsund Jernbane]]; DATE:2013-03-04 + @Test public void Link__invalid() { // PURPOSE.fix: do not render invalid text; EX: link={{{1}}}; [[Fil:Randers_-_Hadsund_railway.png|120x160px|link={{{3}}}|Randers-Hadsund Jernbane]]; DATE:2013-03-04 fxt.Test_parse_page_wiki_str ( "[[File:A.png|12x10px|link={{{1}}}|c]]", String_.Concat_lines_nl_skip_last ( "\"c\"" )); } + @Test public void Link__html_ent() {// PURPOSE:html entities should be converted to chars; EX:  -> _; DATE:2013-12-16 + fxt.Test_parse_page_wiki_str + ( "[[File:A.png|link=b c]]", String_.Concat_lines_nl_skip_last + ( "\"\"" + )); + } + @Test public void Link__encode() {// PURPOSE:spaces should become underscore; DATE:2015-11-27 + fxt.Test_parse_page_wiki_str + ( "[[File:A.png|link=File:A b ç.ogg]]", String_.Concat_lines_nl_skip_last + ( "\"\"" + )); + } @Test public void Href_anchor_leading_space() { // PURPOSE: ?action=edit should be encoded; DATE:2013-02-10 fxt.Test_parse_page_all_str("[[A #b]]", "A #b"); } @@ -292,19 +304,13 @@ public class Xop_lnki_wkr__basic_tst { fxt.Test_parse_page_all_str("[[Ab]]çd e", "Abçd e"); lnki_trail_mgr.Del(ltr_c_in_french); } - @Test public void Link_html_ent() {// PURPOSE:html entities should be converted to chars; EX:  -> _; DATE:2013-12-16 - fxt.Test_parse_page_wiki_str - ( "[[File:A.png|link=b c]]", String_.Concat_lines_nl_skip_last - ( "\"\"" - )); - } @Test public void Page() { fxt.Test_parse_page_wiki("[[File:A.pdf|page=12]]" , fxt.tkn_lnki_().Page_(12)); } @Test public void Visited() { // PURPOSE: show redirected titles as visited; EX:fr.w:Alpes_Pennines; DATE:2014-02-28 Xowe_wiki wiki = fxt.Wiki(); Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.new_a7("Src")); // simulate requrest for "Src" page - Xoae_page previous_page = Xoae_page.test_(wiki, ttl); + Xoae_page previous_page = Xoae_page.New_test(wiki, ttl); previous_page.Redirected_ttls().Add(Bry_.new_a7("Src")); // simulate redirect from "Src" fxt.App().Usere().History_mgr().Add(previous_page); // simulate "Src" already being clicked once; this is the key call fxt.Wtr_cfg().Lnki_visited_y_(); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__link_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__link_tst.java index 58f2140fd..67b19a205 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__link_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr__link_tst.java @@ -41,7 +41,7 @@ public class Xop_lnki_wkr__link_tst { @Test public void Link_file_system() { fxt.Test_parse_page_wiki_str ( "[[File:A.png|12x10px|link=file:///C/B.png|c]]", String_.Concat_lines_nl_skip_last - ( "\"c\"" + ( "\"c\"" )); } @Test public void Link_file_ns() { diff --git a/400_xowa/src/gplx/xowa/parsers/miscs/Xop_ignore_tkn.java b/400_xowa/src/gplx/xowa/parsers/miscs/Xop_ignore_tkn.java index 44fc99cb1..f1a53f696 100644 --- a/400_xowa/src/gplx/xowa/parsers/miscs/Xop_ignore_tkn.java +++ b/400_xowa/src/gplx/xowa/parsers/miscs/Xop_ignore_tkn.java @@ -25,5 +25,5 @@ public class Xop_ignore_tkn extends Xop_tkn_itm_base { @Override public boolean Tmpl_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Bry_bfr bfr) {return true;} public static final byte Ignore_tid_null = 0, Ignore_tid_comment = 1, Ignore_tid_include_tmpl = 2, Ignore_tid_include_wiki = 3, Ignore_tid_htmlTidy_tblw = 4 - , Ignore_tid_xnde_dangling = 5, Ignore_tid_nbsp = 6, Ignore_tid_empty_li = 7, Ignore_tid_pre_at_bos = 8, Ignore_tid_tr_w_td = 9; + , Ignore_tid_xnde_dangling = 5, Ignore_tid_nbsp = 6, Ignore_tid_empty_li = 7, Ignore_tid_pre_at_bos = 8, Ignore_tid_tr_w_td = 9, Ignore_tid_double_pipe = 10; } diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java index d60f4c982..ee8b98500 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr.java @@ -189,7 +189,12 @@ public class Xop_tblw_wkr implements Xop_ctx_wkr { case Tblw_type_td2: boolean create_th = false; switch (prv_tid) { - case Xop_tkn_itm_.Tid_tblw_tr: break; // noop; + case Xop_tkn_itm_.Tid_tblw_tr: + if (wlxr_type == Tblw_type_td2) { // ignore sequences like "\n|- ||"; PAGE: nl.w:Tabel_van_Belgische_gemeenten; DATE:2015-12-03 + ctx.Subs_add(root, tkn_mkr.Ignore(bgn_pos, cur_pos, Xop_ignore_tkn.Ignore_tid_double_pipe)); + return cur_pos; + } + break; case Xop_tkn_itm_.Tid_tblw_td: // fix; -> if ( prv_tkn.Tblw_xml() // prv is && !tbl_is_xml // cur is "\n|" diff --git a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__uncommon_tst.java b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__uncommon_tst.java index 8af907485..feba294b1 100644 --- a/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__uncommon_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/tblws/Xop_tblw_wkr__uncommon_tst.java @@ -111,4 +111,19 @@ public class Xop_tblw_wkr__uncommon_tst { , "" )); } + @Test public void Tr_with_pipe_should_ignore() { // PURPOSE: ignore sequences like "\n|- ||"; PAGE: nl.w:Tabel_van_Belgische_gemeenten; DATE:2015-12-03 + fxt.Test_parse_page_wiki_str(String_.Concat_lines_nl_skip_last + ( "{|" + , "|- ||" + , "|a|b" + , "|}" + ), String_.Concat_lines_nl_skip_last + ( "" + , " " + , " " + , " " + , "
    b" + , "
    " + )); + } } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn.java index b4ae84f49..95ccd41ba 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xot_defn.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; -public interface Xot_defn extends RlsAble { +public interface Xot_defn extends Rls_able { byte Defn_tid(); byte[] Name(); int Cache_size(); diff --git a/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java b/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java index 6ea69776b..4bc8a98eb 100644 --- a/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java +++ b/400_xowa/src/gplx/xowa/parsers/vnts/Vnt_log_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.parsers.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.dbs.*; -public class Vnt_log_tbl implements RlsAble { +public class Vnt_log_tbl implements Rls_able { private final String tbl_name = "log_vnt"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_uid, fld_page_id, fld_rule_idx , fld_flag_count, fld_lang_count, fld_undi_count, fld_bidi_count diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java index b1d97d9c2..6ef22a5da 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_tag_.java @@ -21,7 +21,7 @@ public class Xop_xnde_tag_ { public static final int End_nde_mode_normal = 0, End_nde_mode_inline = 1, End_nde_mode_escape = 2; // escape is for hr which does not support public static final int Bgn_nde_mode_normal = 0, Bgn_nde_mode_inline = 1; public static final byte[] Name_onlyinclude = Bry_.new_a7("onlyinclude"); - public static final byte[] Xtn_end_tag_bgn = Bry_.new_a7(""); + public static final byte[] Xtn_end_tag_bgn = Bry_.new_a7(" -1 - && Bry_.Eq(src, tag_bgn, tag_bgn + Pfunc_tag.Xtag_bgn_lhs.length, Pfunc_tag.Xtag_bgn_lhs)) // xtn created by tag - return Find_xtn_end_tag(ctx, src, src_len, open_end, close_bry, tag_bgn + Pfunc_tag.Xtag_bgn); - else { // search rest of String for case-insensitive name; NOTE: used to do CS first, then fall-back on CI; DATE:2013-12-02 - xtn_end_tag_trie.Clear(); - xtn_end_tag_trie.Add_obj(close_bry, close_bry); - for (int i = open_end; i < src_len; i++) { - Object o = xtn_end_tag_trie.Match_bgn(src, i, src_len); - if (o != null) { - return i; - } - } - return Bry_find_.Not_found; - } - } - private int Find_xtn_end_tag(Xop_ctx ctx, byte[] src, int src_len, int open_end, byte[] close_bry, int tag_bgn) { - int tag_id = Bry_.To_int_or(src, tag_bgn, tag_bgn + 10, -1); - if (tag_id == -1) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not extract int: page=~{0}", ctx.Cur_page().Url().To_str()); return Bry_find_.Not_found;} - Bry_bfr tmp = ctx.Wiki().Utl__bfr_mkr().Get_b128(); - tmp.Add(Pfunc_tag.Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, 10, tag_id).Add(Pfunc_tag.Xtag_rhs); - byte[] tag_end = tmp.To_bry_and_rls(); - int rv = Bry_find_.Find_fwd(src, tag_end, open_end + Pfunc_tag.Xtag_rhs.length); - if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find end: page=~{0}", ctx.Cur_page().Url().To_str()); return Bry_find_.Not_found;} - rv = Bry_find_.Find_bwd(src, Byte_ascii.Lt, rv - 1); - if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find <: page=~{0}", ctx.Cur_page().Url().To_str()); return Bry_find_.Not_found;} - return rv; + && Bry_.Eq(src, tag_bgn, tag_bgn, Pfunc_tag.Xtag_bgn_lhs)) // xtn created by tag + return Xop_xnde_wkr_.Find_xtag_end(ctx, src, open_end, src_len); + else // search rest of String for case-insensitive name; NOTE: used to do CS first, then fall-back on CI; DATE:2013-12-02 + return Xop_xnde_wkr_.Find_xtn_end(ctx, src, open_end, src_len, close_bry); } private int Make_xnde_xtn(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, Xop_xnde_tag tag, int open_bgn, int open_end, int name_bgn, int name_end, int atrs_bgn, int atrs_end, Mwh_atr_itm[] atrs, boolean inline, boolean pre2_hack) { // NOTE: find end_tag that exactly matches bgnTag; must be case sensitive; @@ -704,7 +683,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } } return xnde_end; - } private Btrie_slim_mgr xtn_end_tag_trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; listed XML node names are en + } private Xop_xnde_tkn New_xnde_pair(Xop_ctx ctx, Xop_root_tkn root, Xop_tkn_mkr tkn_mkr, Xop_xnde_tag tag, int open_bgn, int open_end, int close_bgn, int close_end) { Xop_xnde_tkn rv = tkn_mkr.Xnde(open_bgn, close_end).Tag_(tag).Tag_open_rng_(open_bgn, open_end).Tag_close_rng_(close_bgn, close_end).CloseMode_(Xop_xnde_tkn.CloseMode_pair); int name_bgn = open_bgn + 1; @@ -736,20 +715,6 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { } public static Xop_log_basic_wkr Timeline_log_wkr = Xop_log_basic_wkr.Null; } -class Xop_xnde_wkr_ { - public static void AutoClose_handle_dangling_nde_in_caption(Xop_root_tkn root, Xop_tkn_itm owner) { - int subs_bgn = -1, subs_len = owner.Subs_len(); - for (int i = 0; i < subs_len; i++) { - Xop_tkn_itm sub_itm = owner.Subs_get(i); - if (sub_itm.Tkn_tid() == Xop_tkn_itm_.Tid_pipe) { // tkn is "|"; assume that caption should end here - subs_bgn = i; - break; - } - } - if (subs_bgn != -1) - root.Subs_move(owner, subs_bgn, subs_len); // move everything after "|" back to root - } -} /* NOTE_1: special logic for <*include*> cannot process like regular xnde tag b/c cannot auto-close tags on tmpl diff --git a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr_.java b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr_.java new file mode 100644 index 000000000..c4508daf7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr_.java @@ -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 . +*/ +package gplx.xowa.parsers.xndes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; +import gplx.core.primitives.*; import gplx.core.btries.*; +import gplx.xowa.xtns.pfuncs.strings.*; +class Xop_xnde_wkr_ { + private static final Btrie_slim_mgr xtn_end_tag_trie = Btrie_slim_mgr.ci_a7(); // NOTE:ci.ascii:MW_const.en; listed XML node names are en + private static final int Find_xtn_end__tid__end = 0, Find_xtn_end__tid__xtag = 1; + private static final Int_obj_ref Find_xtn_end__key__end = Int_obj_ref.new_(Find_xtn_end__tid__end), Find_xtn_end__key__xtag = Int_obj_ref.new_(Find_xtn_end__tid__xtag); + private static final Bry_bfr Find_xtag_end__bfr = Bry_bfr.new_(32); + public static void AutoClose_handle_dangling_nde_in_caption(Xop_root_tkn root, Xop_tkn_itm owner) { + int subs_bgn = -1, subs_len = owner.Subs_len(); + for (int i = 0; i < subs_len; i++) { + Xop_tkn_itm sub_itm = owner.Subs_get(i); + if (sub_itm.Tkn_tid() == Xop_tkn_itm_.Tid_pipe) { // tkn is "|"; assume that caption should end here + subs_bgn = i; + break; + } + } + if (subs_bgn != -1) + root.Subs_move(owner, subs_bgn, subs_len); // move everything after "|" back to root + } + public static int Find_xtn_end(Xop_ctx ctx, byte[] src, int open_end, int src_end, byte[] close_bry) { + xtn_end_tag_trie.Clear(); + xtn_end_tag_trie.Add_obj(Pfunc_tag.Xtag_bgn_lhs, Find_xtn_end__key__xtag); + xtn_end_tag_trie.Add_obj(close_bry, Find_xtn_end__key__end); + for (int i = open_end; i < src_end; ++i) { + Object o = xtn_end_tag_trie.Match_bgn(src, i, src_end); + if (o != null) { + int tid = ((Int_obj_ref)o).Val(); + if (tid == Find_xtn_end__tid__end) // xtn_end found; use it + return i; + else { // xtag found; skip over it; PAGE:it.s:La_Secchia_rapita/Canto_primo DATE:2015-12-03 + int xtag_end = Find_xtag_end(ctx, src, i, src_end); + int angle_end = Bry_find_.Find_fwd(src, Byte_ascii.Angle_end, xtag_end, src_end); + i = angle_end; + } + } + } + return Bry_find_.Not_found; + } + public static int Find_xtag_end(Xop_ctx ctx, byte[] src, int pos, int src_end) { + int xtag_bgn = pos + Pfunc_tag.Xtag_bgn_lhs.length; + int tag_id = Bry_.To_int_or(src, xtag_bgn, xtag_bgn + Pfunc_tag.Id_len, -1); if (tag_id == -1) {Xoa_app_.Usr_dlg().Warn_many("", "", "parser.xtn: could not extract id from xtag_bgn: page=~{0}", ctx.Cur_page().Url().To_str()); return Bry_find_.Not_found;} + Find_xtag_end__bfr.Add(Pfunc_tag.Xtag_end_lhs).Add_int_pad_bgn(Byte_ascii.Num_0, Pfunc_tag.Id_len, tag_id).Add(Pfunc_tag.Xtag_rhs); + byte[] tag_end = Find_xtag_end__bfr.To_bry_and_clear(); + int rv = Bry_find_.Find_fwd(src, tag_end, pos + Pfunc_tag.Xtag_rhs.length); if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find xtag end: page=~{0}", ctx.Cur_page().Url().To_str()); return Bry_find_.Not_found;} + rv = Bry_find_.Find_bwd(src, Byte_ascii.Lt, rv - 1); if (rv == Bry_find_.Not_found) {ctx.App().Usr_dlg().Warn_many("", "", "parser.xtn: could not find <: page=~{0}", ctx.Cur_page().Url().To_str()); return Bry_find_.Not_found;} + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java index 90c65327a..db2dc1a7b 100644 --- a/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java +++ b/400_xowa/src/gplx/xowa/specials/search/Xosrh_core_tst.java @@ -189,7 +189,7 @@ public class Xosrh_core_tst { // wiki.Init_needed_(false); // byte[] ttl_bry = Bry_.new_a7(ttl_str); // Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); -// Xoae_page page = Xoae_page.test_(wiki, ttl); +// Xoae_page page = Xoae_page.New_test(wiki, ttl); // byte[] url_bry = Bry_.new_a7("http://en.wikipedia.org/wiki/Special:Search/" + ttl_str + args_str); // Xoa_url url = wiki.Appe().Url_parser().Parse(url_bry); // search_mgr.Special_gen(url, page, wiki, ttl); diff --git a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java index 5ced92023..5803d5366 100644 --- a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java +++ b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_dir_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.users.bmks; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; import gplx.dbs.qrys.*; -public class Xoud_bmk_dir_tbl implements RlsAble { +public class Xoud_bmk_dir_tbl implements Rls_able { private final String tbl_name = "bmk_dir"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_owner, fld_sort, fld_name; public Xoud_bmk_dir_tbl(Db_conn conn) { diff --git a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java index 556f9a4c4..6944a3d7c 100644 --- a/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java +++ b/400_xowa/src/gplx/xowa/users/bmks/Xoud_bmk_itm_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.users.bmks; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; import gplx.dbs.qrys.*; -public class Xoud_bmk_itm_tbl implements RlsAble { +public class Xoud_bmk_itm_tbl implements Rls_able { private final String tbl_name = "bmk_itm"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_owner, fld_sort, fld_name, fld_wiki, fld_url, fld_comment; private Db_stmt stmt_update_sort; diff --git a/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java b/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java index 7c7144f2e..fcbce1089 100644 --- a/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java +++ b/400_xowa/src/gplx/xowa/users/data/Xoud_site_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.users.data; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; -public class Xoud_site_tbl implements RlsAble { +public class Xoud_site_tbl implements Rls_able { private final String tbl_name = "user_site"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_site_id, fld_site_priority, fld_site_domain, fld_site_name, fld_site_path, fld_site_xtn; private final Db_conn conn; diff --git a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java index 90dfb4916..70499174d 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/users/history/Xou_history_mgr_tst.java @@ -66,7 +66,7 @@ class Xou_history_mgr_fxt { public Xou_history_mgr_fxt Add_one(String ttl_str, String arg_str) { byte[] ttl_bry = Bry_.new_u8(ttl_str); Xoa_ttl ttl = Xoa_ttl.parse(wiki, ttl_bry); - Xoae_page page = Xoae_page.test_(wiki, ttl); + Xoae_page page = Xoae_page.New_test(wiki, ttl); page.Revision_data().Modified_on_(DateAdp_.Now()); byte[] url_bry = ttl_bry; if (arg_str != null) url_bry = Bry_.Add(url_bry, Bry_.new_u8(arg_str)); diff --git a/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java b/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java index bda98f947..befb3575b 100644 --- a/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java +++ b/400_xowa/src/gplx/xowa/users/history/Xoud_history_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.users.history; import gplx.*; import gplx.xowa.*; import gplx.xowa.users.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.dbs.metas.*; import gplx.dbs.metas.updates.*; -public class Xoud_history_tbl implements RlsAble { +public class Xoud_history_tbl implements Rls_able { private final String tbl_name = "user_history"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_wiki, fld_url, fld_time, fld_count; private final Db_conn conn; private Db_stmt stmt_select_by_page, stmt_select_by_top, stmt_insert, stmt_update, stmt_delete; diff --git a/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java b/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java index 68a962475..dbb01ad97 100644 --- a/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java +++ b/400_xowa/src/gplx/xowa/users/prefs/Prefs_mgr.java @@ -102,9 +102,9 @@ public class Prefs_mgr implements GfoInvkAble { catch (Exception e) {Err_.Noop(e); return null;} } private byte[] Parse_wikitext_to_html(byte[] src) { - Xowe_wiki wiki = app.Usere().Wiki(); // NOTE: this limits prefs to home_wiki only + Xowe_wiki wiki = app.Usere().Wiki(); // NOTE: this limits prefs to home_wiki only Xop_root_tkn root = new Xop_root_tkn(); - Xop_ctx ctx = Xop_ctx.new_(wiki); // NOTE: always create new ctx; do not reuse existing, else popup will clear out existing page's prefs; DATE:2015-04-29 + Xop_ctx ctx = Xop_ctx.new_main_page(wiki); // NOTE: always create new ctx; do not reuse existing, else popup will clear out existing page's prefs; DATE:2015-04-29 wiki.Parser_mgr().Main().Parse_text_to_wdom(root, ctx, ctx.Tkn_mkr(), src, 0); return root.Data_mid(); } diff --git a/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java index 0421538c8..57f521a6d 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/Xoae_wiki_mgr.java @@ -72,7 +72,7 @@ public class Xoae_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble { for (int i = 0; i < list_len; i++) { Xowe_wiki wiki = (Xowe_wiki)list.Get_at(i); // wiki.Defn_cache().ReduceCache(); - if (clear_ctx) wiki.Parser_mgr().Ctx().Clear(); // NOTE: clear_ctx will reset toc and refs + if (clear_ctx) wiki.Parser_mgr().Ctx().Clear_all(); // NOTE: clear_ctx will reset toc and refs wiki.Cache_mgr().Page_cache().Free_mem_all(); wiki.Cache_mgr().Tmpl_result_cache().Clear(); } @@ -103,7 +103,7 @@ public class Xoae_wiki_mgr implements Xoa_wiki_mgr, GfoInvkAble { lang = new Xol_lang_itm(app.Lang_mgr(), Xol_lang_itm_.Key_en).Kwd_mgr__strx_(true); // create a new english lang, but enable strx functions; DATE:2015-08-23 Xol_lang_itm_.Lang_init(lang); } - Xow_ns_mgr ns_mgr = Xow_ns_mgr_.default_(lang.Case_mgr()); + Xow_ns_mgr ns_mgr = Xow_ns_mgr_.default_(lang.Case_mgr()); //app.Meta_mgr().Ns__get_or_load(key); Io_url wiki_dir = app.Fsys_mgr().Wiki_dir().GenSubDir(domain_itm.Domain_str()); Xowe_wiki rv = new Xowe_wiki(app, lang, ns_mgr, domain_itm, wiki_dir); Add(rv); diff --git a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_all.java b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_all.java index e4e3dea6a..4aa29bf3f 100644 --- a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_all.java +++ b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_all.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.core.brys.fmtrs.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; class Xoctg_fmtr_all { public Xoctg_fmtr_all(byte tid) {this.Ctor(tid);} public byte Tid() {return tid;} private byte tid; @@ -118,7 +118,7 @@ class Xoctg_fmtr_all { private void Html_nav_bry(Bry_bfr bfr, Xowe_wiki wiki, Xoa_ttl ttl, Xoctg_view_grp view_grp, boolean fill_at_bgn) { Bry_bfr href_bfr = wiki.Utl__bfr_mkr().Get_b512(); Xoae_app app = wiki.Appe(); - app.Html__href_wtr().Build_to_bfr(href_bfr, app, wiki.Domain_bry(), ttl); + app.Html__href_wtr().Build_to_bfr(href_bfr, app, Xoh_wtr_ctx.Mode_basic, wiki.Domain_bry(), ttl); byte[] arg_idx_lbl = null; byte[] arg_sortkey = null; if (fill_at_bgn) { arg_idx_lbl = url_arg_bgn; @@ -157,6 +157,6 @@ interface Xoctg_fmtr_itm extends gplx.core.brys.Bfr_arg { int Grp_end_idx(); boolean Grp_end_at_col(); int Col_idx(); void Col_idx_(int col_idx, int col_bgn); - void Init_from_all(Xowe_wiki wiki, Xol_lang_itm lang, Xoctg_view_ctg ctg, Xoctg_fmtr_all mgr, Xoctg_view_grp itms_list, int itms_list_len); + void Init_from_all(Xowe_wiki wiki, Xol_lang_itm lang, Xoh_wtr_ctx hctx, Xoctg_view_ctg ctg, Xoctg_fmtr_all mgr, Xoctg_view_grp itms_list, int itms_list_len); void Init_from_grp(byte[] grp_ttl, int i); } diff --git a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_grp.java b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_grp.java index 8dec710d9..215510302 100644 --- a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_grp.java +++ b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_grp.java @@ -17,11 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.wikis.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.core.brys.fmtrs.*; +import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; class Xoctg_fmtr_grp extends gplx.core.brys.Bfr_arg_base { - public void Init_from_all(Xowe_wiki wiki, Xol_lang_itm lang, Xoctg_view_ctg ctg, Xoctg_fmtr_all mgr, Xoctg_view_grp itms_list) { + public void Init_from_all(Xowe_wiki wiki, Xol_lang_itm lang, Xoh_wtr_ctx hctx, Xoctg_view_ctg ctg, Xoctg_fmtr_all mgr, Xoctg_view_grp itms_list) { this.wiki = wiki; this.mgr = mgr; this.itms_fmtr = mgr.Fmtr_itm(); this.itms_list = itms_list; len = itms_list.Len(); - itms_fmtr.Init_from_all(wiki, lang, ctg, mgr, itms_list, len); + itms_fmtr.Init_from_all(wiki, lang, hctx, ctg, mgr, itms_list, len); } private Xowe_wiki wiki; Xoctg_fmtr_itm itms_fmtr; Xoctg_view_grp itms_list; int len; Xoctg_fmtr_all mgr; @Override public void Bfr_arg__add(Bry_bfr bfr) { if (mgr.Grps_enabled()) { diff --git a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_itm.java b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_itm.java index a45d3c361..0118ca5ad 100644 --- a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_itm.java +++ b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_fmtr_itm.java @@ -17,18 +17,19 @@ along with this program. If not, see . */ package gplx.xowa.wikis.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.core.brys.fmtrs.*; -import gplx.xowa.htmls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; +import gplx.xowa.htmls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.users.history.*; abstract class Xoctg_fmtr_itm_base extends gplx.core.brys.Bfr_arg_base implements Xoctg_fmtr_itm { - public void Init_from_all(Xowe_wiki wiki, Xol_lang_itm lang, Xoctg_view_ctg ctg, Xoctg_fmtr_all mgr, Xoctg_view_grp itms_list, int itms_list_len) { - this.wiki = wiki; this.lang = lang; this.ctg = ctg; this.list = itms_list; this.len = itms_list_len; this.msg_mgr = wiki.Msg_mgr(); + private Xou_history_mgr history_mgr; private Xoh_wtr_ctx hctx; + protected Xowe_wiki wiki; Xol_lang_itm lang; Xoctg_view_ctg ctg; protected int len; protected Xoh_href_parser href_parser; protected Bry_fmtr html_itm, html_itm_missing; protected Xoctg_view_grp list; protected Xow_msg_mgr msg_mgr; + public void Init_from_all(Xowe_wiki wiki, Xol_lang_itm lang, Xoh_wtr_ctx hctx, Xoctg_view_ctg ctg, Xoctg_fmtr_all mgr, Xoctg_view_grp itms_list, int itms_list_len) { + this.wiki = wiki; this.lang = lang; this.hctx = hctx; this.ctg = ctg; this.list = itms_list; this.len = itms_list_len; this.msg_mgr = wiki.Msg_mgr(); href_parser = wiki.Appe().Html__href_parser(); html_itm = mgr.Html_itm(); html_itm_missing = mgr.Html_itm_missing(); history_mgr = wiki.Appe().Usere().History_mgr(); - } protected Xowe_wiki wiki; Xol_lang_itm lang; Xoctg_view_ctg ctg; protected int len; protected Xoh_href_parser href_parser; protected Bry_fmtr html_itm, html_itm_missing; protected Xoctg_view_grp list; protected Xow_msg_mgr msg_mgr; - Xou_history_mgr history_mgr; + } public void Init_from_grp(byte[] ttl_char_0, int col_bgn) {this.ttl_char_0 = ttl_char_0; this.col_bgn = col_bgn;} private byte[] ttl_char_0; int col_bgn; int col_end; public int Col_idx() {return col_idx;} public void Col_idx_(int col_idx, int col_bgn) { @@ -54,15 +55,15 @@ abstract class Xoctg_fmtr_itm_base extends gplx.core.brys.Bfr_arg_base implement grp_end_at_col = i == col_end; return; } - Bld_html(bfr, wiki, itm, ttl, ttl_bry, href_parser, html_itm); + Bld_html(bfr, wiki, hctx, itm, ttl, ttl_bry, href_parser, html_itm); } grp_end_idx = len; grp_end_at_col = true; } - @gplx.Virtual public void Bld_html(Bry_bfr bfr, Xowe_wiki wiki, Xoctg_view_itm itm, Xoa_ttl ttl, byte[] ttl_page, Xoh_href_parser href_parser, Bry_fmtr html_itm) { + @gplx.Virtual public void Bld_html(Bry_bfr bfr, Xowe_wiki wiki, Xoh_wtr_ctx hctx, Xoctg_view_itm itm, Xoa_ttl ttl, byte[] ttl_page, Xoh_href_parser href_parser, Bry_fmtr html_itm) { byte[] itm_href = wiki.App().Html__href_wtr().Build_to_bry(wiki, ttl); byte[] itm_full_ttl = ttl.Full_txt();// NOTE: ttl.Full_txt() to get full ns; EX: Template:A instead of just "A" - byte[] itm_atr_cls = Xoh_lnki_wtr.Lnki_cls_visited(history_mgr, wiki.Domain_bry(), ttl.Page_txt()); // NOTE: must be ttl.Page_txt() in order to match Xou_history_mgr.Add + byte[] itm_atr_cls = hctx.Mode_is_hdump() ? Bry_.Empty : Xoh_lnki_wtr.Lnki_cls_visited(history_mgr, wiki.Domain_bry(), ttl.Page_txt()); // NOTE: must be ttl.Page_txt() in order to match Xou_history_mgr.Add Bry_fmtr fmtr = itm.Missing() ? html_itm_missing : html_itm; fmtr.Bld_bfr_many(bfr, itm_href, itm_full_ttl, itm_full_ttl, itm.Page_id(), itm_atr_cls); } @@ -95,7 +96,7 @@ class Xoctg_fmtr_itm_file extends Xoctg_fmtr_itm_base { public static final Xoctg_fmtr_itm_file Instance = new Xoctg_fmtr_itm_file(); Xoctg_fmtr_itm_file() {} } class Xoctg_fmtr_itm_subc extends Xoctg_fmtr_itm_base { - @Override public void Bld_html(Bry_bfr bfr, Xowe_wiki wiki, Xoctg_view_itm itm, Xoa_ttl ttl, byte[] ttl_page, Xoh_href_parser href_parser, Bry_fmtr html_itm) { + @Override public void Bld_html(Bry_bfr bfr, Xowe_wiki wiki, Xoh_wtr_ctx hctx, Xoctg_view_itm itm, Xoa_ttl ttl, byte[] ttl_page, Xoh_href_parser href_parser, Bry_fmtr html_itm) { byte[] itm_href = wiki.App().Html__href_wtr().Build_to_bry(wiki, ttl); int sub_ctgs = 0; // itm.Subs_ctgs(); int sub_pages = 0; // itm.Subs_pages(); diff --git a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr.java b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr.java index 477854e3d..9078c1bf7 100644 --- a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.wikis.nss.*; public class Xoctg_html_mgr implements GfoInvkAble { @gplx.Internal protected Xoctg_fmtr_grp Fmtr_grp() {return fmtr_grp;} private Xoctg_fmtr_grp fmtr_grp = new Xoctg_fmtr_grp(); @@ -25,13 +25,13 @@ public class Xoctg_html_mgr implements GfoInvkAble { private final Xoctg_fmtr_all mgr_pages = new Xoctg_fmtr_all(Xoa_ctg_mgr.Tid_page); private final Xoctg_fmtr_all mgr_files = new Xoctg_fmtr_all(Xoa_ctg_mgr.Tid_file); public Xoctg_data_cache Data_cache() {return data_cache;} private Xoctg_data_cache data_cache = new Xoctg_data_cache(); - public void Bld_html(Xowe_wiki wiki, Xoae_page page, Bry_bfr bfr) { + public void Bld_html(Xowe_wiki wiki, Xoae_page page, Xoh_wtr_ctx hctx, Bry_bfr bfr) { Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_m001(); try { if (wiki.Db_mgr().Category_version() == Xoa_ctg_mgr.Version_2) - Bld_html_v2(wiki, page, tmp_bfr); + Bld_html_v2(wiki, page, hctx, tmp_bfr); else - Bld_html_v1(wiki, page, tmp_bfr); + Bld_html_v1(wiki, page, hctx, tmp_bfr); bfr.Add_bfr_and_preserve(tmp_bfr.Mkr_rls()); } catch (Exception e) { // ctg error should never cause page to fail @@ -39,14 +39,14 @@ public class Xoctg_html_mgr implements GfoInvkAble { Xoa_app_.Usr_dlg().Warn_many("", "", "failed to generate category: title=~{0} err=~{1}", String_.new_u8(page.Ttl().Full_txt()), Err_.Message_gplx_full(e)); } } private Xoctg_url url_ctg = new Xoctg_url(); - private void Bld_html_v2(Xowe_wiki wiki, Xoae_page page, Bry_bfr bfr) { + private void Bld_html_v2(Xowe_wiki wiki, Xoae_page page, Xoh_wtr_ctx hctx, Bry_bfr bfr) { byte[] ttl_bry = page.Ttl().Page_db(); Xoctg_view_ctg view_ctg = new Xoctg_view_ctg().Name_(page.Ttl().Page_txt()); url_ctg.Parse(wiki.Appe().Usr_dlg(), page.Url()); wiki.Db_mgr().Load_mgr().Load_ctg_v2a(view_ctg, url_ctg, ttl_bry, Grp_max_default); - Bld_all(bfr, wiki, page.Lang(), view_ctg, Xoa_ctg_mgr.Tid_subc); - Bld_all(bfr, wiki, page.Lang(), view_ctg, Xoa_ctg_mgr.Tid_page); - Bld_all(bfr, wiki, page.Lang(), view_ctg, Xoa_ctg_mgr.Tid_file); + Bld_all(bfr, wiki, page.Lang(), hctx, view_ctg, Xoa_ctg_mgr.Tid_subc); + Bld_all(bfr, wiki, page.Lang(), hctx, view_ctg, Xoa_ctg_mgr.Tid_page); + Bld_all(bfr, wiki, page.Lang(), hctx, view_ctg, Xoa_ctg_mgr.Tid_file); } public void Get_titles(Gfo_usr_dlg usr_dlg, Xowe_wiki wiki, Xoctg_view_ctg ctg) { title_list.Clear(); @@ -80,14 +80,14 @@ public class Xoctg_html_mgr implements GfoInvkAble { title_list.Add(itm); } } - private void Bld_html_v1(Xowe_wiki wiki, Xoae_page page, Bry_bfr bfr) { + private void Bld_html_v1(Xowe_wiki wiki, Xoae_page page, Xoh_wtr_ctx hctx, Bry_bfr bfr) { Xoctg_view_ctg ctg = new Xoctg_view_ctg().Name_(page.Ttl().Page_txt()); boolean found = wiki.Db_mgr().Load_mgr().Load_ctg_v1(ctg, page.Ttl().Page_db()); if (!found) return; - Bld_all(bfr, wiki, page.Lang(), ctg, Xoa_ctg_mgr.Tid_subc); - Bld_all(bfr, wiki, page.Lang(), ctg, Xoa_ctg_mgr.Tid_page); - Bld_all(bfr, wiki, page.Lang(), ctg, Xoa_ctg_mgr.Tid_file); + Bld_all(bfr, wiki, page.Lang(), hctx, ctg, Xoa_ctg_mgr.Tid_subc); + Bld_all(bfr, wiki, page.Lang(), hctx, ctg, Xoa_ctg_mgr.Tid_page); + Bld_all(bfr, wiki, page.Lang(), hctx, ctg, Xoa_ctg_mgr.Tid_file); } - @gplx.Internal protected void Bld_all(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, Xoctg_view_ctg view_ctg, byte tid) { + @gplx.Internal protected void Bld_all(Bry_bfr bfr, Xowe_wiki wiki, Xol_lang_itm lang, Xoh_wtr_ctx hctx, Xoctg_view_ctg view_ctg, byte tid) { Xoctg_view_grp view_grp = view_ctg.Grp_by_tid(tid); int view_grp_len = view_grp.Itms().length; if (view_grp_len == 0) return; view_grp.End_(view_grp_len); @@ -98,7 +98,7 @@ public class Xoctg_html_mgr implements GfoInvkAble { Xoa_ttl ctg_ttl = Xoa_ttl.parse(wiki, Xow_ns_.Tid__category, view_ctg.Name()); byte[] all_navs = fmtr_all.Bld_bwd_fwd(wiki, ctg_ttl, view_grp); Array_.Sort(view_grp.Itms(), Xoctg_view_itm_sorter_sortkey.Instance); - fmtr_grp.Init_from_all(wiki, lang, view_ctg, fmtr_all, view_grp); // NOTE: must assert sorted for v1; PAGE:s.w:Category:Computer_science; DATE:2015-11-22 + fmtr_grp.Init_from_all(wiki, lang, hctx, view_ctg, fmtr_all, view_grp); // NOTE: must assert sorted for v1; PAGE:s.w:Category:Computer_science; DATE:2015-11-22 fmtr_all.Html_all().Bld_bfr_many(bfr, fmtr_all.Div_id(), all_label, all_stats, all_navs, lang.Key_bry(), lang.Dir_ltr_bry(), fmtr_grp); } public static final int Cols_max = 3; diff --git a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr_tst.java b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr_tst.java index fa21d9851..1bed9e21b 100644 --- a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_html_mgr_tst.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.wikis.ctgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -import org.junit.*; +import org.junit.*; import gplx.xowa.htmls.core.htmls.*; public class Xoctg_html_mgr_tst { @Before public void init() {fxt.Clear();} private Xoh_ctg_page_fxt fxt = new Xoh_ctg_page_fxt(); @Test public void Page_itm() { @@ -247,7 +247,7 @@ class Xoh_ctg_page_fxt { Xoctg_fmtr_all list_mgr = ctg_html.Fmtr(tid); Xoctg_fmtr_itm fmtr_itm = list_mgr.Fmtr_itm(); Xoctg_view_grp list = ctg.Grp_by_tid(tid); - fmtr_itm.Init_from_all(wiki, wiki.Lang(), ctg, list_mgr, list, list.Len()); + fmtr_itm.Init_from_all(wiki, wiki.Lang(), Xoh_wtr_ctx.Basic, ctg, list_mgr, list, list.Len()); fmtr_itm.Init_from_grp(new byte[] {grp_char_0}, 0); fmtr_itm.Col_idx_(0, 0); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); @@ -257,14 +257,14 @@ class Xoh_ctg_page_fxt { public void Test_html_grp(byte tid, String expd) { Xoctg_fmtr_all list_mgr = ctg_html.Fmtr(tid); Xoctg_fmtr_grp fmtr_grp = ctg_html.Fmtr_grp(); - fmtr_grp.Init_from_all(wiki, wiki.Lang(), ctg, list_mgr, ctg.Grp_by_tid(tid)); + fmtr_grp.Init_from_all(wiki, wiki.Lang(), Xoh_wtr_ctx.Basic, ctg, list_mgr, ctg.Grp_by_tid(tid)); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); fmtr_grp.Bfr_arg__add(bfr); Tfds.Eq_str_lines(expd, bfr.To_str_and_rls()); } public void Test_html_all(byte tid, String expd) { Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); - ctg_html.Bld_all(bfr, wiki, wiki.Lang(), ctg, tid); + ctg_html.Bld_all(bfr, wiki, wiki.Lang(), Xoh_wtr_ctx.Basic, ctg, tid); Tfds.Eq_str_lines(expd, bfr.To_str_and_rls()); } } diff --git a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr.java b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr.java index c6b437009..01e612523 100644 --- a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr.java +++ b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr.java @@ -46,26 +46,26 @@ public class Xoctg_pagelist_wtr { ); public Bry_fmtr Fmtr_grp_normal() {return fmtr_grp_normal;} private Bry_fmtr fmtr_grp_normal = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
    " - , " ~{ctg_text}:" - , "
      ~{grp_itms}" - , "
    " - , "
    " + , "
    " + , "~{ctg_text}:" + , "
      ~{grp_itms}" + , "
    " + , "
    " ), "ctg_help_page", "ctg_text", "grp_itms" ); public Bry_fmtr Fmtr_grp_hidden() {return fmtr_grp_hidden;} private Bry_fmtr fmtr_grp_hidden = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , " " + , "" ), "hidden_ctg_txt", "grp_itms" ); public Bry_fmtr Fmtr_itm() {return fmtr_itm;} private Bry_fmtr fmtr_itm = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last ( "" - , "
  • " - , " ~{lnki_text}" - , "
  • " + , "
  • " + , "~{lnki_text}" + , "
  • " ), "lnki_cls", "lnki_href", "lnki_ttl", "lnki_text" ); } diff --git a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr_tst.java b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr_tst.java index 06db1bf4e..8c62165cb 100644 --- a/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/ctgs/Xoctg_pagelist_wtr_tst.java @@ -25,33 +25,33 @@ public class Xoctg_pagelist_wtr_tst { fxt.Init_ctg_normal("D", "E", "F"); fxt.Test_print_hidden(String_.Concat_lines_nl ( "
    " - , "
    " - , " Categories:" - , "
      " - , "
    • " - , " D" - , "
    • " - , "
    • " - , " E" - , "
    • " - , "
    • " - , " F" - , "
    • " - , "
    " - , "
    " - , " " + , "
    " + , "Categories:" + , "
      " + , "
    • " + , "D" + , "
    • " + , "
    • " + , "E" + , "
    • " + , "
    • " + , "F" + , "
    • " + , "
    " + , "
    " + , "" , "
    " )); } diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr.java b/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr.java index 27c49db35..dbfaa34e5 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr.java @@ -32,11 +32,11 @@ public class Xow_data_mgr implements GfoInvkAble { public Xoae_page Get_page(Xoa_ttl ttl, boolean called_from_tmpl) {tmp_url = wiki.Utl__url_parser().Parse(ttl.Raw()); return Get_page(tmp_url, ttl, called_from_tmpl, false);} public Xoae_page Get_page_from_msg(Xoa_ttl ttl) {tmp_url = wiki.Utl__url_parser().Parse(ttl.Raw()); return Get_page(tmp_url, ttl, false, true);} public Xoae_page Get_page(Xoa_url url, Xoa_ttl ttl, boolean called_from_tmpl, boolean called_from_msg) { - Xoae_page rv = Xoae_page.new_(wiki, ttl); + Xoae_page rv = Xoae_page.New(wiki, ttl); return Get_page(rv, url, ttl, called_from_tmpl, called_from_msg); } public Xoae_page Get_page(Xoae_page rv, Xoa_url url, Xoa_ttl ttl, boolean called_from_tmpl, boolean called_from_msg) { - rv.Url_(url); // NOTE: must update page.Url(); should combine with Xoae_page.new_() + rv.Url_(url); // NOTE: must update page.Url(); should combine with Xoae_page.New() Xow_ns ns = ttl.Ns(); switch (ns.Id()) { case Xow_ns_.Tid__special: @@ -87,7 +87,7 @@ public class Xow_data_mgr implements GfoInvkAble { public Xoae_page Load_page_by_ttl(Xoa_url url, Xoa_ttl ttl, Xog_tab_itm tab) {return Load_page_by_ttl(url, ttl, wiki.Lang(), tab, true);} public Xoae_page Load_page_by_ttl(Xoa_url url, Xoa_ttl ttl, Xol_lang_itm lang, Xog_tab_itm tab, boolean parse_page) { wiki.Init_assert(); - Xoae_page page = Xoae_page.new_(wiki, ttl); page.Tab_data().Tab_(tab); + Xoae_page page = Xoae_page.New(wiki, ttl); page.Tab_data().Tab_(tab); this.Get_page(page, url, ttl, false, false); // get page from data_mgr if (page.Missing()) { // page doesn't exist boolean vnt_missing = true; diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java b/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java index 63a22f9a9..f1818f418 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xow_data_mgr_tst.java @@ -138,13 +138,13 @@ class Xow_data_mgr_fxt { } public Xow_data_mgr_fxt Update(String ttl_str, String data) { Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.new_u8(ttl_str)); - Xoae_page page = Xoae_page.test_(wiki, ttl); + Xoae_page page = Xoae_page.New_test(wiki, ttl); wiki.Db_mgr().Save_mgr().Data_update(page, Bry_.new_u8(data)); return this; } public Xow_data_mgr_fxt Rename(String old_ttl, String new_ttl) { Xoa_ttl ttl = Xoa_ttl.parse(wiki, Bry_.new_u8(old_ttl)); - Xoae_page page = Xoae_page.test_(wiki, ttl); + Xoae_page page = Xoae_page.New_test(wiki, ttl); wiki.Db_mgr().Save_mgr().Data_rename(page, ttl.Ns().Id(), Bry_.new_u8(new_ttl)); return this; } diff --git a/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java index 69f5573fc..1704e15a2 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java +++ b/400_xowa/src/gplx/xowa/wikis/data/Xowd_core_db_props.java @@ -19,11 +19,12 @@ package gplx.xowa.wikis.data; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.metas.*; import gplx.xowa.bldrs.cmds.*; import gplx.xowa.wikis.dbs.*; public class Xowd_core_db_props { - public Xowd_core_db_props(int schema, Xowd_db_layout layout_text, Xowd_db_layout layout_html, Xowd_db_layout layout_file, byte zip_tid_text, byte zip_tid_html, boolean hzip_enabled) { + public Xowd_core_db_props(int schema, Xowd_db_layout layout_text, Xowd_db_layout layout_html, Xowd_db_layout layout_file + , byte zip_tid_text, byte zip_tid_html, boolean hzip_enabled, boolean hzip_mode_is_b256) { this.schema = schema; this.layout_text = layout_text; this.layout_html = layout_html; this.layout_file = layout_file; this.zip_tid_text = zip_tid_text; this.zip_tid_html = zip_tid_html; - this.hzip_enabled = hzip_enabled; + this.hzip_enabled = hzip_enabled; this.hzip_mode_is_b256 = hzip_mode_is_b256; } public int Schema() {return schema;} private final int schema; public boolean Schema_is_1() {return schema == 1;} @@ -33,6 +34,7 @@ public class Xowd_core_db_props { public byte Zip_tid_text() {return zip_tid_text;} private final byte zip_tid_text; public byte Zip_tid_html() {return zip_tid_html;} private final byte zip_tid_html; public boolean Hzip_enabled() {return hzip_enabled;} private final boolean hzip_enabled; + public boolean Hzip_mode_is_b256() {return hzip_mode_is_b256;} private final boolean hzip_mode_is_b256; public void Cfg_save(Db_cfg_tbl tbl) { tbl.Conn().Txn_bgn("make__core__cfg__save"); tbl.Insert_int (Cfg_grp, Cfg_key__schema_version , schema); @@ -42,12 +44,15 @@ public class Xowd_core_db_props { tbl.Insert_byte (Cfg_grp, Cfg_key__zip_tid_text , zip_tid_text); tbl.Insert_byte (Cfg_grp, Cfg_key__zip_tid_html , zip_tid_html); tbl.Insert_yn (Cfg_grp, Cfg_key__hzip_enabled , hzip_enabled); + tbl.Insert_yn (Cfg_grp, Cfg_key__hzip_mode_is_b256 , hzip_mode_is_b256); tbl.Conn().Txn_end(); } public static Xowd_core_db_props Cfg_load(Io_url url, Db_conn conn) { Db_cfg_tbl cfg_tbl = new Db_cfg_tbl(conn, "xowa_cfg"); return cfg_tbl.Select_int_or(Cfg_grp, Cfg_key__schema_version, 1) == 1 - ? new Xowd_core_db_props(1, Xowd_db_layout.Itm_lot, Xowd_db_layout.Itm_lot, Xowd_db_layout.Itm_lot, cfg_tbl.Select_byte_or(Xowe_wiki.Invk_db_mgr, Xodb_mgr_sql.Invk_data_storage_format, Io_stream_.Tid_gzip), Io_stream_.Tid_gzip, Bool_.Y) + ? new Xowd_core_db_props + ( 1, Xowd_db_layout.Itm_lot, Xowd_db_layout.Itm_lot, Xowd_db_layout.Itm_lot, cfg_tbl.Select_byte_or(Xowe_wiki.Invk_db_mgr, Xodb_mgr_sql.Invk_data_storage_format + , Io_stream_.Tid_gzip), Io_stream_.Tid_gzip, Bool_.Y, Bool_.N) : Cfg_load(cfg_tbl); } private static Xowd_core_db_props Cfg_load(Db_cfg_tbl tbl) { @@ -60,6 +65,7 @@ public class Xowd_core_db_props { , cfg_hash.Get_by(Cfg_key__zip_tid_text).To_byte() , cfg_hash.Get_by(Cfg_key__zip_tid_html).To_byte() , cfg_hash.Get_by(Cfg_key__hzip_enabled).To_yn_or(Bool_.N) + , cfg_hash.Get_by(Cfg_key__hzip_mode_is_b256).To_yn_or(Bool_.N) ); } private static final String Cfg_grp = Xow_cfg_consts.Grp__wiki_core @@ -70,6 +76,7 @@ public class Xowd_core_db_props { , Cfg_key__zip_tid_text = "zip_tid_text" , Cfg_key__zip_tid_html = "zip_tid_html" , Cfg_key__hzip_enabled = "hzip_enabled" + , Cfg_key__hzip_mode_is_b256 = "hzip_mode_is_b256" ; - public static final Xowd_core_db_props Test = new Xowd_core_db_props(2, Xowd_db_layout.Itm_few, Xowd_db_layout.Itm_few, Xowd_db_layout.Itm_few, Io_stream_.Tid_raw, Io_stream_.Tid_raw, Bool_.Y); + public static final Xowd_core_db_props Test = new Xowd_core_db_props(2, Xowd_db_layout.Itm_few, Xowd_db_layout.Itm_few, Xowd_db_layout.Itm_few, Io_stream_.Tid_raw, Io_stream_.Tid_raw, Bool_.Y, Bool_.Y); } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java index ff9f17ecc..bff8e53f3 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_core_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.dbs.*; -public class Xowd_cat_core_tbl implements RlsAble { +public class Xowd_cat_core_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_pages, fld_subcats, fld_files, fld_hidden, fld_link_db_id; private final Db_conn conn; private Db_stmt stmt_insert, stmt_update, stmt_select; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java index 8e9b60824..c1a2e2250 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_cat_link_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.ctgs.*; -public class Xowd_cat_link_tbl implements RlsAble { +public class Xowd_cat_link_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_from, fld_to_id, fld_sortkey, fld_timestamp, fld_type_id; private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_in; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java index ce60684ab..05c485b2c 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_core_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.dbs.*; -public class Xowd_css_core_tbl implements RlsAble { +public class Xowd_css_core_tbl implements Rls_able { private final String tbl_name = "css_core"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_key, fld_updated_on; public Xowd_css_core_tbl(Db_conn conn) { diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_tbl.java index 61822e229..ca30e2e9c 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_css_file_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.dbs.*; -public class Xowd_css_file_tbl implements RlsAble { +public class Xowd_css_file_tbl implements Rls_able { private final String tbl_name = "css_file"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_css_id, fld_path, fld_data; private final Db_conn conn; private Db_stmt stmt_insert; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java index 7c0d1c29c..f94462673 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_page_tbl.java @@ -19,7 +19,7 @@ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gpl import gplx.core.primitives.*; import gplx.core.criterias.*; import gplx.dbs.*; import gplx.xowa.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.nss.*; -public class Xowd_page_tbl implements RlsAble { +public class Xowd_page_tbl implements Rls_able { private final String tbl_name = "page"; private String fld_id, fld_ns, fld_title, fld_is_redirect, fld_touched, fld_len, fld_random_int, fld_text_db_id, fld_html_db_id, fld_redirect_id; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_tbl.java index 391b409c4..30a1da5f0 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*; -public class Xowd_pagelinks_tbl implements RlsAble { +public class Xowd_pagelinks_tbl implements Rls_able { private final String tbl_name = "pagelink"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_src_id, fld_trg_id; private final Db_conn conn; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_temp_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_temp_tbl.java index a75e4f1d0..397ed11f7 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_temp_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_pagelinks_temp_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.wikis.dbs.*; import gplx.dbs.cfgs.*; -public class Xowd_pagelinks_temp_tbl implements RlsAble { +public class Xowd_pagelinks_temp_tbl implements Rls_able { private final String tbl_name = "pagelinks_temp"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_src_id, fld_trg_ns, fld_trg_ttl; private final Db_conn conn; private Db_stmt stmt_insert; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java index f1fd2b5df..864e61cc0 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_search_word_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.core.primitives.*; import gplx.dbs.*; import gplx.dbs.cfgs.*; import gplx.dbs.qrys.*; -public class Xowd_search_word_tbl implements RlsAble { +public class Xowd_search_word_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_id, fld_text; private String fld_page_count; private boolean page_count_exists; private final Db_conn conn; private Db_stmt stmt_insert, stmt_select_by, stmt_select_in; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java index c97d48d02..7b56e9f62 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_text_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.core.ios.*; import gplx.dbs.*; import gplx.dbs.utls.*; -public class Xowd_text_tbl implements RlsAble { +public class Xowd_text_tbl implements Rls_able { private final String tbl_name = "text"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_page_id, fld_text_data; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java index 3eda255de..0e3615f13 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_pid_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.dbs.*; import gplx.xowa.xtns.wdatas.*; -public class Xowd_wbase_pid_tbl implements RlsAble { +public class Xowd_wbase_pid_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_src_lang, fld_src_ttl, fld_trg_ttl; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert; diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java index 40abd1e62..585d06715 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Xowd_wbase_qid_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.wikis.data.tbls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.data.*; import gplx.dbs.*; -public class Xowd_wbase_qid_tbl implements RlsAble { +public class Xowd_wbase_qid_tbl implements Rls_able { private final String tbl_name; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_src_wiki, fld_src_ns, fld_src_ttl, fld_trg_ttl; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert; diff --git a/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_itm_.java b/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_itm_.java index 5d4124095..7b781c363 100644 --- a/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_itm_.java +++ b/400_xowa/src/gplx/xowa/wikis/domains/Xow_domain_itm_.java @@ -74,14 +74,22 @@ public class Xow_domain_itm_ { } private static Xow_domain_itm new_other(byte[] raw) {return Xow_domain_itm.new_(raw, Xow_domain_tid_.Int__other, Xol_lang_stub_.Key__unknown);} private static byte[] Get_lang_code_for_mw_messages_file(byte[] v) { - Object o = lang_to_gfs_hash.Get_by_bry(v); + Object o = alt_domain__lang_by_subdomain.Get_by_bry(v); return o == null ? v : (byte[])o; } - private static final Hash_adp_bry lang_to_gfs_hash = Hash_adp_bry.ci_a7() // ASCII:lang_code + public static byte[] Alt_domain__get_subdomain_by_lang(byte[] lang) { + Object o = alt_domain__subdomain_by_lang.Get_by_bry(lang); + return o == null ? lang : (byte[])o; + } + private static final Hash_adp_bry alt_domain__lang_by_subdomain = Hash_adp_bry.ci_a7() // ASCII:lang_code .Add_str_obj("simple" , Bry_.new_a7("en")) .Add_str_obj("zh-classical" , Bry_.new_a7("lzh")) .Add_str_obj("no" , Bry_.new_a7("nb")) ; + private static final Hash_adp_bry alt_domain__subdomain_by_lang = Hash_adp_bry.ci_a7() // ASCII:lang_code + .Add_str_obj("lzh" , Bry_.new_a7("zh-classical")) + .Add_str_obj("nb" , Bry_.new_a7("no")) + ; public static final String Str__enwiki = "en.wikipedia.org" , Str__species = "species.wikimedia.org" diff --git a/400_xowa/src/gplx/xowa/wikis/nss/Xow_ns_.java b/400_xowa/src/gplx/xowa/wikis/nss/Xow_ns_.java index cc41a298d..bf7c83beb 100644 --- a/400_xowa/src/gplx/xowa/wikis/nss/Xow_ns_.java +++ b/400_xowa/src/gplx/xowa/wikis/nss/Xow_ns_.java @@ -36,15 +36,15 @@ public class Xow_ns_ { Key__media = "Media" , Key__special = "Special" , Key__main = "(Main)" , Key__talk = "Talk" - , Key__user = "User" , Key__user_talk = "User talk" - , Key__project = "Project" , Key__project_talk = "Project talk" - , Key__file = "File" , Key__file_talk = "File talk" - , Key__mediawiki = "MediaWiki" , Key__mediawiki_talk = "MediaWiki talk" - , Key__template = "Template" , Key__template_talk = "Template talk" - , Key__help = "Help" , Key__help_talk = "Help talk" - , Key__category = "Category" , Key__category_talk = "Category talk" - , Key__portal = "Portal" , Key__portal_talk = "Portal talk" - , Key__module = "Module" , Key__module_talk = "Module talk" + , Key__user = "User" , Key__user_talk = "User_talk" + , Key__project = "Project" , Key__project_talk = "Project_talk" + , Key__file = "File" , Key__file_talk = "File_talk" + , Key__mediawiki = "MediaWiki" , Key__mediawiki_talk = "MediaWiki_talk" + , Key__template = "Template" , Key__template_talk = "Template_talk" + , Key__help = "Help" , Key__help_talk = "Help_talk" + , Key__category = "Category" , Key__category_talk = "Category_talk" + , Key__portal = "Portal" , Key__portal_talk = "Portal_talk" + , Key__module = "Module" , Key__module_talk = "Module_talk" , Key__null = "null" , Key__wikipedia = "Wikipedia" ; diff --git a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_module_mgr.java b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_module_mgr.java index 814c08b16..2f4a34a0b 100644 --- a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_module_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_module_mgr.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.wikis.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; +import gplx.core.bits.*; public class Xopg_module_mgr { public boolean Math_exists() {return math_exists;} public void Math_exists_(boolean v) {math_exists = v;} private boolean math_exists; public boolean Imap_exists() {return imap_exists;} public void Imap_exists_(boolean v) {imap_exists = v;} private boolean imap_exists; diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm.java index 8db9fa3e8..8067e63fd 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm.java @@ -25,13 +25,7 @@ public class Xow_xwiki_itm implements gplx.CompareAble { this.url_fmt = url_fmt; this.lang_id = lang_id; this.url_fmtr = Bry_.Len_eq_0(url_fmt) ? null : Bry_fmtr.new_(url_fmt, "0"); this.domain_tid = domain_tid; this.domain_bry = domain_bry; this.domain_name = domain_name; this.abrv_wm = abrv_wm; - int key_bry_len = key_bry.length; - this.show_in_sitelangs_base - = lang_id != Xol_lang_stub_.Id__unknown // valid lang code - && domain_tid != Xow_domain_tid_.Int__commons // commons should never be considered an xwiki_lang; EX:[[commons:A]] PAGE:species:Scarabaeidae; DATE:2014-09-10 - && Bry_.Len_gt_0(url_fmt) // url_fmt exists - && Bry_.Match(domain_bry, 0, key_bry_len, key_bry) && key_bry_len + 1 < domain_bry.length && domain_bry[key_bry_len] == Byte_ascii.Dot // key + . matches start of domain; EX: "en" and "en.wikipedia.org" - ; + this.show_in_sitelangs_base = Calc_show_in_sitelangs(key_bry, url_fmt, lang_id, domain_tid, domain_bry); } public byte[] Key_bry() {return key_bry;} private final byte[] key_bry; // EX: commons public String Key_str() {return key_str;} private final String key_str; @@ -52,4 +46,15 @@ public class Xow_xwiki_itm implements gplx.CompareAble { public static Xow_xwiki_itm new_(byte[] key_bry, byte[] url_fmt, int lang_id, int domain_tid, byte[] domain_bry, byte[] abrv_wm) { return new Xow_xwiki_itm(key_bry, url_fmt, lang_id, domain_tid, domain_bry, domain_bry, abrv_wm); } + private static boolean Calc_show_in_sitelangs(byte[] key_bry, byte[] url_fmt, int lang_id, int domain_tid, byte[] domain_bry) { + key_bry = Xow_domain_itm_.Alt_domain__get_subdomain_by_lang(key_bry); // handle "nb" as alias for "no.wikipedia.org"; PAGE: nn.w:; DATE:2015-12-04 + int key_len = key_bry.length; + boolean key_matches_domain_bgn = Bry_.Match(domain_bry, 0, key_len, key_bry) && key_len + 1 < domain_bry.length && domain_bry[key_len] == Byte_ascii.Dot; // key + . matches start of domain; EX: "en" and "en.wikipedia.org" + return lang_id != Xol_lang_stub_.Id__unknown // valid lang code + && domain_tid != Xow_domain_tid_.Int__commons // commons should never be considered an xwiki_lang; EX:[[commons:A]] PAGE:species:Scarabaeidae; DATE:2014-09-10 + && Bry_.Len_gt_0(url_fmt) // url_fmt exists + && key_matches_domain_bgn + ; + } + } diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm_tst.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm_tst.java index b4e078806..96eaf181b 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_itm_tst.java @@ -20,23 +20,27 @@ import org.junit.*; import gplx.xowa.langs.*; import gplx.xowa.wikis.domains.*; public class Xow_xwiki_itm_tst { private final Xow_xwiki_itm_fxt fxt = new Xow_xwiki_itm_fxt(); @Test public void Show_in_sitelangs__basic() { // PURPOSE: basic test for show in "In other languages"; DATE:2015-11-06 - fxt.Test__type_is_xwiki_lang(Bool_.Y, fxt.Make_xwiki("en", "en.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "simple"); + fxt.Test__type_is_xwiki_lang(Bool_.Y, fxt.Make__xwiki("en", "en.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "simple"); } @Test public void Show_in_sitelangs__lang_like() { // PURPOSE: only consider xwikis with key similar to domain; EX: [[w:A]] in simplewiki; PAGE:Main_Page; DATE:2015-11-06 - fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make_xwiki("e", "en.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "simple"); + fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make__xwiki("w", "en.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "simple"); } @Test public void Show_in_sitelangs__same() { // PURPOSE: same wiki should not appear in "In other languages"; DATE:2015-11-06 - fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make_xwiki("en", "en.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "en"); + fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make__xwiki("en", "en.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "en"); } @Test public void Show_in_sitelangs__no_url_fmt() { // PURPOSE: xwikis with no format should not appear in "In other languages"; DATE:2015-11-06 - fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make_xwiki("en", "", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "simple"); + fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make__xwiki("en", "", Xol_lang_stub_.Id_en, Xow_domain_tid_.Int__wikipedia, "en.wikipedia.org", "enwiki"), "simple"); } @Test public void Show_in_sitelangs__commons() { // PURPOSE: commons should not appear in "In other languages"; DATE:2015-11-06 - fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make_xwiki("c", "commons.wikimedia.org/wiki/{0}", Xol_lang_stub_.Id__intl, Xow_domain_tid_.Int__commons, "commons.wikimedia.org", "commonswiki"), "en"); + fxt.Test__type_is_xwiki_lang(Bool_.N, fxt.Make__xwiki("c", "commons.wikimedia.org/wiki/{0}", Xol_lang_stub_.Id__intl, Xow_domain_tid_.Int__commons, "commons.wikimedia.org", "commonswiki"), "en"); + } + @Test public void Show_in_sitelangs__nb() { // PURPOSE: handle special wikis like nb, lzh, simple; EX: [[nb:]] -> no.w; PAGE:nn.w:; DATE:2015-12-04 + fxt.Test__type_is_xwiki_lang(Bool_.Y, fxt.Make__xwiki("nb", "no.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_no, Xow_domain_tid_.Int__wikipedia, "no.wikipedia.org", "nbwiki"), "nn"); + fxt.Test__type_is_xwiki_lang(Bool_.Y, fxt.Make__xwiki("lzh", "zh-classical.wikipedia.org/wiki/{0}", Xol_lang_stub_.Id_zh, Xow_domain_tid_.Int__wikipedia, "zh-classical.wikipedia.org", "lzwwiki"), "zh"); } } class Xow_xwiki_itm_fxt { - public Xow_xwiki_itm Make_xwiki(String key_bry, String url_fmt, int lang_id, int domain_tid, String domain_bry, String abrv_wm) { + public Xow_xwiki_itm Make__xwiki(String key_bry, String url_fmt, int lang_id, int domain_tid, String domain_bry, String abrv_wm) { return Xow_xwiki_itm.new_(Bry_.new_u8(key_bry), Bry_.new_u8(url_fmt), lang_id, domain_tid, Bry_.new_u8(domain_bry), Bry_.new_u8(abrv_wm)); } public void Test__type_is_xwiki_lang(boolean expd, Xow_xwiki_itm xwiki_itm, String cur_lang_key) { diff --git a/400_xowa/src/gplx/xowa/xtns/cldrs/Cldr_lang_tbl.java b/400_xowa/src/gplx/xowa/xtns/cldrs/Cldr_lang_tbl.java index 1ba4f21d1..f1183c420 100644 --- a/400_xowa/src/gplx/xowa/xtns/cldrs/Cldr_lang_tbl.java +++ b/400_xowa/src/gplx/xowa/xtns/cldrs/Cldr_lang_tbl.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.xtns.cldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.dbs.*; -class Cldr_lang_tbl implements RlsAble { +class Cldr_lang_tbl implements Rls_able { private final String tbl_name = "cldr_lang"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_(); private final String fld_cldr_code, fld_lang_code, fld_lang_name; private final Db_conn conn; private Db_stmt stmt_select, stmt_insert; diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_img_fmtr_arg.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_img_fmtr_arg.java index 6e13464d1..5bbfa3e60 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_img_fmtr_arg.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_img_fmtr_arg.java @@ -20,12 +20,12 @@ import gplx.core.primitives.*; import gplx.core.brys.fmtrs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*; import gplx.xowa.parsers.*; class Imap_img_fmtr_arg extends gplx.core.brys.Bfr_arg_base { - private Xoh_wtr_ctx hctx; private Imap_map map; private Imap_xtn_mgr xtn_mgr; + private Xoh_wtr_ctx hctx; private Imap_map map; private Imap_xtn_mgr xtn_mgr; // private byte[] src; private int img_elem_id, img_w, img_h; private byte[] img_alt, img_src, img_cls, img_href; private Int_2_ref margin_calc = new Int_2_ref(); - public void Init(Xoh_wtr_ctx hctx, Imap_xtn_mgr xtn_mgr, Imap_map map, int img_elem_id, byte[] img_alt, byte[] img_src, int img_w, int img_h, byte[] img_cls, byte[] img_href) { - this.hctx = hctx; this.map = map; this.xtn_mgr = xtn_mgr; + public void Init(Xoh_wtr_ctx hctx, Imap_xtn_mgr xtn_mgr, Imap_map map, byte[] src, int img_elem_id, byte[] img_alt, byte[] img_src, int img_w, int img_h, byte[] img_cls, byte[] img_href) { + this.hctx = hctx; this.map = map; this.xtn_mgr = xtn_mgr; // this.src = src; this.img_elem_id = img_elem_id; this.img_w = img_w; this.img_h = img_h; this.img_alt = img_alt; this.img_src = img_src; @@ -40,6 +40,9 @@ class Imap_img_fmtr_arg extends gplx.core.brys.Bfr_arg_base { Xoh_arg_img_core img_core_fmtr = xtn_mgr.Img_core_fmtr(hctx_is_hdump); img_core_fmtr.Init(img_elem_id, img_src, img_w, img_h); if (itm_dflt != null) { +// Xowe_wiki wiki = map.Xtn_mgr().Wiki(); +// if (src.length != 0) // imap update will pass 0 src +// Imap_link_owner_.Write(itm_dflt, wiki.Appe(), wiki, hctx, src); fmtr = itm_dflt.Link_tid() == Xop_tkn_itm_.Tid_lnki ? Imap_html_fmtrs.Img_anchor_lnki : Imap_html_fmtrs.Img_anchor_lnke; anchor_href = itm_dflt.Link_href(); anchor_text = itm_dflt.Link_text(); diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm.java index 4e845a287..4b8525e7c 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.xowa.parsers.lnkis.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; interface Imap_itm { byte Itm_tid(); } @@ -49,9 +49,11 @@ class Imap_itm_desc implements Imap_itm { } class Imap_itm_dflt implements Imap_itm, Imap_link_owner { public byte Itm_tid() {return Imap_itm_.Tid_dflt;} - public int Link_tid() {return link_tid;} public void Link_tid_(int v) {link_tid = v;} private int link_tid; + public int Link_tid() {return link_tid;} private int link_tid; + public Xop_tkn_itm Link_tkn() {return link_tkn;} private Xop_tkn_itm link_tkn; + public void Link_tid_(int tid, Xop_tkn_itm tkn) {link_tid = tid; link_tkn = tkn;} public byte[] Link_href() {return link_href;} public void Link_href_(byte[] v) {this.link_href = v;} private byte[] link_href; - public byte[] Link_text() {return link_text;} public void Link_text_(byte[] v) {this.link_text = v;} private byte[] link_text; + public byte[] Link_text() {return link_text;} public void Link_text_(byte[] v) {this.link_text = v;} private byte[] link_text; } class Imap_err { public Imap_err(int itm_idx, String err_key) {this.itm_idx = itm_idx; this.err_key = err_key;} diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm_shape.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm_shape.java index f7b15cd8e..ed5fb35e7 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm_shape.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_itm_shape.java @@ -17,10 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.core.primitives.*; import gplx.core.net.*; -import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.htmls.core.htmls.*; -import gplx.xowa.htmls.core.wkrs.lnkes.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkes.*; +import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.wkrs.lnkes.*; interface Imap_link_owner { - void Link_tid_(int v); + int Link_tid(); + Xop_tkn_itm Link_tkn(); + void Link_tid_(int v, Xop_tkn_itm tkn); void Link_href_(byte[] v); void Link_text_(byte[] v); } @@ -29,7 +31,7 @@ class Imap_link_owner_ { Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); try { int tkn_tid = tkn.Tkn_tid(); - link_owner.Link_tid_(tkn_tid); + link_owner.Link_tid_(tkn_tid, tkn); switch (tkn_tid) { case Xop_tkn_itm_.Tid_lnki: { Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)tkn; @@ -43,7 +45,7 @@ class Imap_link_owner_ { Xop_ctx ctx = wiki.Parser_mgr().Ctx(); int lnke_bgn = lnke.Lnke_href_bgn(), lnke_end = lnke.Lnke_href_end(); boolean proto_is_xowa = lnke.Proto_tid() == Gfo_protocol_itm.Tid_xowa; Xoh_lnke_html lnke_wtr = wiki.Html_mgr().Html_wtr().Wkr__lnke(); - lnke_wtr.Write_href(bfr, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); + lnke_wtr.Write_href(bfr, Xoh_wtr_ctx.Basic, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); link_owner.Link_href_(bfr.To_bry_and_clear()); lnke_wtr.Write_caption(bfr, wiki.Html_mgr().Html_wtr(), Xoh_wtr_ctx.Basic, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); link_owner.Link_text_(bfr.To_bry_and_clear()); @@ -53,6 +55,32 @@ class Imap_link_owner_ { } finally {bfr.Mkr_rls();} // release buffer in case of null error; PAGE:de.u:PPA/Raster/TK25/51/18/12/20; DATE:2015-02-02 } + public static void Write_todo(Imap_link_owner link_owner, Xoae_app app, Xowe_wiki wiki, Xoh_wtr_ctx hctx, byte[] src) { + Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); + try { + switch (link_owner.Link_tid()) { + case Xop_tkn_itm_.Tid_lnki: { + Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)link_owner.Link_tkn(); + link_owner.Link_href_(app.Html__href_wtr().Build_to_bry(wiki, lnki_tkn.Ttl())); + wiki.Html_mgr().Html_wtr().Lnki_wtr().Write_caption(bfr, hctx, src, lnki_tkn, lnki_tkn.Ttl()); + link_owner.Link_text_(bfr.To_bry_and_clear()); + break; + } + case Xop_tkn_itm_.Tid_lnke: { + Xop_lnke_tkn lnke = (Xop_lnke_tkn)link_owner.Link_tkn(); + Xop_ctx ctx = wiki.Parser_mgr().Ctx(); + int lnke_bgn = lnke.Lnke_href_bgn(), lnke_end = lnke.Lnke_href_end(); boolean proto_is_xowa = lnke.Proto_tid() == Gfo_protocol_itm.Tid_xowa; + Xoh_lnke_html lnke_wtr = wiki.Html_mgr().Html_wtr().Wkr__lnke(); + lnke_wtr.Write_href(bfr, Xoh_wtr_ctx.Basic, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); + link_owner.Link_href_(bfr.To_bry_and_clear()); + lnke_wtr.Write_caption(bfr, wiki.Html_mgr().Html_wtr(), hctx, ctx, src, lnke, lnke_bgn, lnke_end, proto_is_xowa); + link_owner.Link_text_(bfr.To_bry_and_clear()); + break; + } + } + } + finally {bfr.Mkr_rls();} // release buffer in case of null error; PAGE:de.u:PPA/Raster/TK25/51/18/12/20; DATE:2015-02-02 + } } class Imap_itm_shape implements Imap_itm, Imap_link_owner { public Imap_itm_shape(byte shape_tid, Double_obj_val[] shape_pts) { @@ -61,8 +89,10 @@ class Imap_itm_shape implements Imap_itm, Imap_link_owner { } public byte Itm_tid() {return shape_tid;} private byte shape_tid; public Double_obj_val[] Shape_pts() {return shape_pts;} private Double_obj_val[] shape_pts; - public int Link_tid() {return link_tid;} public void Link_tid_(int v) {link_tid = v;} private int link_tid; + public int Link_tid() {return link_tid;} private int link_tid; + public Xop_tkn_itm Link_tkn() {return link_tkn;} private Xop_tkn_itm link_tkn; + public void Link_tid_(int tid, Xop_tkn_itm tkn) {link_tid = tid; link_tkn = tkn;} public byte[] Link_href() {return link_href;} public void Link_href_(byte[] v) {this.link_href = v;} private byte[] link_href; - public byte[] Link_text() {return link_text;} public void Link_text_(byte[] v) {this.link_text = v;} private byte[] link_text; + public byte[] Link_text() {return link_text;} public void Link_text_(byte[] v) {this.link_text = v;} private byte[] link_text; public static final byte Tid_default = 0, Tid_rect = 4, Tid_circle = 3, Tid_poly = 5; } diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java index 7c119edd0..745e068cc 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_map.java @@ -36,27 +36,32 @@ public class Imap_map implements Xoh_file_img_wkr, Js_img_wkr { @gplx.Internal protected Imap_err[] Errs() {return errs;} private Imap_err[] errs; private byte img_cls_tid; private byte[] a_href, img_alt, img_cls_other; - public void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, Xof_file_itm xfer_itm, int uid + public void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoae_page page, byte[] src, Xof_file_itm xfer_itm, int uid , byte[] a_href, 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 ) { xfer_itm.Html_img_wkr_(this); xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_imap); this.a_href = a_href; this.img_alt = img_alt; this.img_cls_tid = img_cls; this.img_cls_other = img_cls_other; - Write_imap_div(tmp_bfr, hctx, uid, img_w, img_h, img_src, xfer_itm.Orig_w(), xfer_itm.Orig_h()); + Write_imap_div(tmp_bfr, page.Wikie(), hctx, src, uid, img_w, img_h, img_src, xfer_itm.Orig_w(), xfer_itm.Orig_h()); if (hctx.Mode_is_hdump()) page.Hdump_data().Imgs_add_img(new Xohd_img_itm__img(), xfer_itm, Xohd_img_itm__gallery_itm.Tid_basic); } public void Html_update(Xoa_page page, Xog_js_wkr js_wkr, int html_uid, int html_w, int html_h, Io_url html_view_url, int orig_w, int orig_h, Io_url html_orig_url, byte[] lnki_ttl) { Xowe_wiki wiki = xtn_mgr.Wiki(); Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_k004(); - Write_imap_div(tmp_bfr, Xoh_wtr_ctx.Basic, html_uid, html_w, html_h, html_view_url.To_http_file_bry(), orig_w, orig_h); + Write_imap_div(tmp_bfr, (Xowe_wiki)page.Wiki(), Xoh_wtr_ctx.Basic, Bry_.Empty, html_uid, html_w, html_h, html_view_url.To_http_file_bry(), orig_w, orig_h); js_wkr.Html_elem_replace_html("imap_div_" + Int_.To_str(html_uid), tmp_bfr.To_str_and_rls()); } - private void Write_imap_div(Bry_bfr bfr, Xoh_wtr_ctx hctx, int html_uid, int html_w, int html_h, byte[] html_src, int orig_w, int orig_h) { + private void Write_imap_div(Bry_bfr bfr, Xowe_wiki wiki, Xoh_wtr_ctx hctx, byte[] src, int html_uid, int html_w, int html_h, byte[] html_src, int orig_w, int orig_h) { byte[] desc_style = Calc_desc_style(html_w, html_h); +// int shapes_len = shapes.length; +// for (int i = 0; i < shapes_len; ++i) { +// Imap_itm_shape shape = shapes[i]; +// Imap_link_owner_.Write(shape, wiki.Appe(), wiki, hctx, src); +// } map_fmtr_arg.Init(id, shapes, Calc_scale(orig_w, orig_h, html_w, html_h)); - img_fmtr_arg.Init(hctx, xtn_mgr, this, html_uid, img_alt, html_src, html_w, html_h, Xoh_img_cls_.To_html(img_cls_tid, img_cls_other), a_href); + img_fmtr_arg.Init(hctx, xtn_mgr, this, src, html_uid, img_alt, html_src, html_w, html_h, Xoh_img_cls_.To_html(img_cls_tid, img_cls_other), a_href); Imap_html_fmtrs.All.Bld_bfr_many(bfr, html_uid, desc_style, map_fmtr_arg, img_fmtr_arg); } private byte[] Calc_desc_style(int html_w, int html_h) { diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java index 58695f44f..0669f45bb 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java @@ -29,13 +29,11 @@ class Imap_parser { private int itm_idx; private int itm_bgn, itm_end; private Xoae_app app; private Xowe_wiki wiki; private Xop_ctx wiki_ctx, imap_ctx; private Xop_root_tkn imap_root; public Imap_parser(Imap_xtn_mgr xtn_mgr) {this.xtn_mgr = xtn_mgr;} - public void Init(Xowe_wiki wiki, Xoa_url page_url, Gfo_usr_dlg usr_dlg) { - this.app = wiki.Appe(); this.wiki = wiki; this.page_url = page_url; this.usr_dlg = usr_dlg; + public void Init(Xowe_wiki wiki, Xoae_page page, Gfo_usr_dlg usr_dlg) {// SCOPE.PAGE + this.app = wiki.Appe(); this.wiki = wiki; this.page_url = page.Url(); this.usr_dlg = usr_dlg; this.wiki_ctx = wiki.Parser_mgr().Ctx(); - if (imap_ctx == null) { - imap_ctx = Xop_ctx.new_(wiki); - imap_root = app.Parser_mgr().Tkn_mkr().Root(Bry_.Empty); - } + imap_ctx = Xop_ctx.new_(wiki, page.Ttl().Raw()); // NOTE: must update page ttl for Modules; PAGE:it.s:Patria_Esercito_Re/Indice_generale; DATE:2015-12-02 + imap_root = app.Parser_mgr().Tkn_mkr().Root(Bry_.Empty); } public void Clear() { this.itm_idx = 0; @@ -44,7 +42,7 @@ class Imap_parser { } public Imap_map Parse(Xowe_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) { Imap_map rv = new Imap_map(ctx.Cur_page().Html_data().Xtn_imap_next_id()); - Init(wiki, ctx.Cur_page().Url(), wiki.Appe().Usr_dlg()); + Init(wiki, ctx.Cur_page(), wiki.Appe().Usr_dlg()); this.Parse(rv, src, xnde.Tag_open_end(), xnde.Tag_close_bgn()); return rv; } @@ -56,7 +54,7 @@ class Imap_parser { if (itm_end == src_end) break; itm_bgn = Bry_find_.Trim_fwd_space_tab(src, itm_end + 1, src_end); // trim ws at start, and look for first char if (itm_bgn == src_end) break; // line is entirely ws and terminated by eos; EX: "\n EOS" - itm_end = Bry_find_.Find_fwd_until(src, itm_bgn, src_end, Byte_ascii.Nl); // look for \n + itm_end = Bry_find_.Find_fwd_until(src, itm_bgn, src_end, Byte_ascii.Nl); // look for \n if (itm_end == Bry_find_.Not_found) itm_end = src_end; // no \n; make EOS = \n itm_end = Bry_find_.Trim_bwd_space_tab(src, itm_end, itm_bgn); // trim any ws at end if (itm_end - itm_bgn == 0) continue; // line is entirely ws; continue; @@ -171,7 +169,7 @@ class Imap_parser { } private Xop_tkn_itm Parse_link(byte[] raw) { imap_root.Clear(); - imap_ctx.Clear(); + imap_ctx.Clear(false); // NOTE: imap should not reset scrib; PAGE:it.s:La_guerra_del_vespro_siciliano/Indice DATE:2015-12-02 wiki.Parser_mgr().Main().Parse_text_to_wdom(imap_root, imap_ctx, wiki.Appe().Parser_mgr().Tkn_mkr(), raw, 0); int subs_len = imap_root.Subs_len(); for (int i = 0; i < subs_len; ++i) { @@ -194,7 +192,7 @@ class Imap_parser { if ( tkn_itm == null // no lnki or lnke || tkn_itm.Tkn_tid() != Xop_tkn_itm_.Tid_lnki // no lnki; occurs with badly constructed maps; PAGE:en.w:Demography_of_the_United_Kingdom DATE:2015-01-22 ) - imap_ctx.Wiki().Appe().Usr_dlg().Warn_many("", "", "image_map failed to find lnki; page=~{0} imageMap=~{1}", String_.new_u8(imap_ctx.Cur_page().Ttl().Full_txt()), String_.new_u8(imap_img_src)); + Xoa_app_.Usr_dlg().Warn_many("", "", "image_map failed to find lnki; page=~{0} imageMap=~{1}", page_url.To_str(), imap_img_src); else { Xop_lnki_tkn lnki_tkn = (Xop_lnki_tkn)tkn_itm; imap_img = new Imap_itm_img(lnki_tkn); @@ -216,7 +214,7 @@ class Imap_parser { else { Object tid_obj = tid_trie.Match_bgn_w_byte(b, src, pos, src_end); if (tid_obj == null) { // not a known imap line; assume continuation of img line and skip to next line - imap_ctx.Wiki().Appe().Usr_dlg().Note_many("", "", "image_map extending image over multiple lines; page=~{0} imageMap=~{1}", String_.new_u8(imap_ctx.Cur_page().Ttl().Full_txt()), String_.new_u8(imap_img_src)); + Xoa_app_.Usr_dlg().Note_many("", "", "image_map extending image over multiple lines; page=~{0} imageMap=~{1}", page_url.To_str(), imap_img_src); int next_line = Bry_find_.Find_fwd(src, Byte_ascii.Nl, pos); if (next_line == Bry_find_.Not_found) next_line = src_end; rv = next_line; diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java index 58474a262..dfdd473e9 100644 --- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser_tst.java @@ -67,10 +67,11 @@ class Imap_parser_fxt extends Imap_fxt_base { private Imap_map imap; @Override public void Reset() { super.Reset(); - Xoa_url url = Xoa_url.new_(wiki.Domain_bry(), Bry_.new_a7("Test_1")); + byte[] ttl_bry = Bry_.new_a7("Test_1"); Imap_xtn_mgr xtn_mgr = new Imap_xtn_mgr(); + Xoae_page page = Xoae_page.New(wiki, wiki.Ttl_parse(ttl_bry)); parser = new Imap_parser(xtn_mgr); - parser.Init(wiki, url, Gfo_usr_dlg_.Noop); + parser.Init(wiki, page, Gfo_usr_dlg_.Noop); parser.Clear(); imap = new Imap_map(1); } diff --git a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst_tst.java b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst_tst.java index b0014c0bd..cc0c3b6f2 100644 --- a/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/lst/Lst_pfunc_lst_tst.java @@ -83,6 +83,43 @@ public class Lst_pfunc_lst_tst { fxt.Fxt().Init_page_create("Sub_0", "
    a{{Sub_1}}
    "); fxt.Fxt().Test_parse_page_all_str("{{#section:Sub_0|key_0}}", "ab"); } + @Test public void Nested__ref() { // PURPOSE: handle tags; PAGE:it.s:La_Secchia_rapita/Canto_primo DATE:2015-12-02 + fxt.Fxt().Init_page_create("Template:TagTemplate", "xyz"); + fxt.Fxt().Init_page_create("PoemPage", "A{{TagTemplate}}B"); + fxt.Fxt().Test_parse_page_all_str("{{#section:PoemPage}}", String_.Replace(String_.Concat_lines_nl_skip_last + ( "
    " + , "

    " + , "A[1]B" + , "

    " + , "
      " + , "
    1. ^ xyz
    2. " + , "
    " + , "" + ), "'", "\"")); + } + @Test public void Nested__ref_poem() { // PURPOSE: handle tags; PAGE:it.s:La_Secchia_rapita/Canto_primo DATE:2015-12-02 + fxt.Fxt().Init_page_create("Template:TagTemplate", "{{#tag:ref|abcdefxyz}}"); + fxt.Fxt().Init_page_create("PoemPage", String_.Concat_lines_nl_skip_last + ( "A{{TagTemplate}}" + , " B" + , "" + )); + fxt.Fxt().Test_parse_page_all_str("{{#section:PoemPage}}", String_.Replace(String_.Concat_lines_nl_skip_last + ( "
    " + , "

    " + , "A[1]
    " + , "    B" + , "

    " + , "
      " + , "
    1. ^ abc
      " + , "

      " + , "def" + , "

      " + , "
      xyz
    2. " + , "
    " + , "" + ), "'", "\"")); + } } class Lst_pfunc_lst_fxt { public Lst_pfunc_lst_fxt Clear() { diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func_tst.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func_tst.java index d79abdbb2..5e37a81bc 100644 --- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_deg2dd_func_tst.java @@ -23,4 +23,5 @@ public class Map_deg2dd_func_tst { @Test public void Prec_round() {fxt.Test_parse_tmpl_str_test("{{#deg2dd: 1.2345|3}}" , "{{test}}" , "1.235");} @Test public void Example() {fxt.Test_parse_tmpl_str_test("{{#deg2dd: 14° 23' 45'' S|precision=3}}" , "{{test}}" , "-14.396");} @Test public void Example_N() {fxt.Test_parse_tmpl_str_test("{{#deg2dd: 14° 23' 45'' N|precision=3}}" , "{{test}}" , "14.396");} + @Test public void Apos() {fxt.Test_parse_tmpl_str_test("{{#deg2dd: 42°39’49’’N |precision=2}}" , "{{test}}" , "42.66");} // PURPOSE: handle ’’ to "; PAGE:it.v:Morro_d'Oro DATE:2015-12-06 } diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_math.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_math.java index 15676413f..ef4d90965 100644 --- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_math.java +++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_math.java @@ -245,30 +245,19 @@ class Map_math {// REF.MW:MapSources_math.php else return 4; } private Bry_bfr tmp_bfr = Bry_bfr.reset_(32); - private static byte[] Parse_input_normalize(Bry_bfr bfr, byte[] input) { - int input_end = input.length; if (input_end == 0) return null; - int i = 0; - while (i < input_end) { - byte b = input[i]; - Object o = Input_trie.Match_bgn_w_byte(b, input, i, input_end); - if (o == null) { - bfr.Add_byte(b); - ++i; - } - else { - byte tid = ((Byte_obj_val)o).Val(); - switch (tid) { - case Input_tid_apos: bfr.Add_byte(Byte_ascii.Apos).Add_byte_space(); break; // EX: "'" -> "' " - case Input_tid_quote: bfr.Add_byte(Byte_ascii.Quote).Add_byte_space(); break; // EX: '"' -> '" ' - case Input_tid_dash: bfr.Add_byte(Byte_ascii.Dash); break; - case Input_tid_space: bfr.Add_byte_space(); break; - case Input_tid_degree: bfr.Add_byte(Byte_ascii.Slash); bfr.Add_byte_space(); break; // EX: "°" -> "° " - case Input_tid_compass: bfr.Add_byte_space(); bfr.Add_byte(Byte_ascii.Case_upper(b)); break; // NOTE: always single-char ASCII; EX: N,E,S,W,n,e,s,w - } - i = Input_trie.Match_pos(); - } - } - return bfr.To_bry_and_clear_and_trim(); + public static byte[] Parse_input_normalize(Bry_bfr bfr, byte[] src) { + /* + $w = str_replace( array( '‘', '’', '′' ), "'", $input ); + $w = str_replace( array( "''", '“', '”', '″' ), '"', $w ); + $w = str_replace( '−', '-', $w ); + $w = strtoupper( str_replace( array( '_', '/', "\t", "\n", "\r" ), ' ', $w ) ); + $w = str_replace( array( '°', "'", '"' ), array( '° ', "' ", '" ' ), $w ); + $w = trim( str_replace( array( 'N', 'S', 'E', 'W' ), array( ' N', ' S', ' E', ' W' ), $w ) ); + */ + int src_end = src.length; if (src_end == 0) return null; + src = Trie__normalize__apos.Replace(bfr, src, 0, src_end); // normalize apos separately, since 2 apos can go to quotes; EX: ‘’ -> "; PAGE:it.v:Morro_d'Oro DATE:2015-12-06 + src = Trie__normalize__rest.Replace(bfr, src, 0, src.length); // normalize rest; + return Bry_.Trim(src); } private static final byte Dir_unknown_id = 0, Dir_lat_id = 1, Dir_long_id = 2; public static final byte[] Dir_lat_bry = Bry_.new_a7("lat"), Dir_long_bry = Bry_.new_a7("long"); @@ -282,38 +271,20 @@ class Map_math {// REF.MW:MapSources_math.php , Compass_S = new byte[] {Byte_ascii.Ltr_S} , Compass_W = new byte[] {Byte_ascii.Ltr_W} ; - private static final byte Input_tid_apos = 1, Input_tid_quote = 2, Input_tid_dash = 3, Input_tid_space = 4, Input_tid_degree = 5, Input_tid_compass = 6; private static final byte Input_byte_degree = Byte_ascii.Slash; // NOTE: ugly cheat to avoid using multi-byte char; note that all "/" are swapped out to " ", so any remaining "/" was added by the normalizer; EX: "123° 4/5" -> "123/ 4 5" private static final byte[] Input_units = new byte[] {Input_byte_degree, Byte_ascii.Apos, Byte_ascii.Quote, Byte_ascii.Space}; private static final int Input_units_len = Input_units.length; - private static final byte[] Input_bry_degree = Bry_.new_u8("°"); - private static final Btrie_slim_mgr Input_trie = Btrie_slim_mgr.cs() - .Add_str_byte("'" , Input_tid_apos) // NOTE: must add ' so that "'" -> "' " - .Add_str_byte("‘" , Input_tid_apos) - .Add_str_byte("’" , Input_tid_apos) - .Add_str_byte("′" , Input_tid_apos) - .Add_str_byte("\"" , Input_tid_quote) // NOTE: must add " so that '"' -> '" ' - .Add_str_byte("''" , Input_tid_quote) - .Add_str_byte("“" , Input_tid_quote) - .Add_str_byte("”" , Input_tid_quote) - .Add_str_byte("″" , Input_tid_quote) - .Add_str_byte("-" , Input_tid_dash) - .Add_str_byte("−" , Input_tid_dash) - .Add_str_byte(" " , Input_tid_space) - .Add_str_byte("_" , Input_tid_space) - .Add_str_byte("/" , Input_tid_space) - .Add_str_byte("\t" , Input_tid_space) - .Add_str_byte("\n" , Input_tid_space) - .Add_str_byte("\r" , Input_tid_space) - .Add_bry_byte(Input_bry_degree , Input_tid_degree) - .Add_str_byte("N" , Input_tid_compass) - .Add_str_byte("S" , Input_tid_compass) - .Add_str_byte("E" , Input_tid_compass) - .Add_str_byte("W" , Input_tid_compass) - .Add_str_byte("n" , Input_tid_compass) - .Add_str_byte("s" , Input_tid_compass) - .Add_str_byte("e" , Input_tid_compass) - .Add_str_byte("w" , Input_tid_compass) - ; + private static final Btrie_slim_mgr Trie__normalize__apos = Btrie_slim_mgr.cs() + .Add_replace_many (Byte_ascii.Apos_bry , "‘", "’", "′"); + private static final Btrie_slim_mgr Trie__normalize__rest = Btrie_slim_mgr.cs() + .Add_replace_many ("' " , "'") + .Add_replace_many ("\" " , "\"", "''", "“", "”", "″") + .Add_replace_many (Byte_ascii.Dash_bry , "-", "−") // NOTE: emdash and endash + .Add_replace_many (Byte_ascii.Space_bry , " ", "_", "/", "\t", "\n", "\r") // NOTE: " " =   + .Add_replace_many ("/ " , "°") + .Add_replace_many (" N" , "N", "n") + .Add_replace_many (" S" , "S", "s") + .Add_replace_many (" E" , "E", "e") + .Add_replace_many (" W" , "W", "w"); public static final Map_math Instance = new Map_math(); } diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java index 6dd9fa254..84ad7917f 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/strings/Pfunc_tag.java @@ -56,6 +56,7 @@ public class Pfunc_tag extends Pf_func_base { public static final int Xtag_len = 27 // , Xtag_bgn = 14 // \n Poem_xtn_mgr xtn_mgr = (Poem_xtn_mgr)wiki.Xtn_mgr().Get_or_fail(Poem_xtn_mgr.XTN_KEY); byte[] poem_bry = Parse_lines(wiki.Utl__bfr_mkr(), src, itm_bgn, itm_end); - xtn_root = xtn_mgr.Parser().Parse_text_to_wdom_old_ctx(ctx, poem_bry, true); // NOTE: ignoring paragraph mode; technically MW enables para mode, but by replacing "\n" with "
    \n" all the logic with para/pre mode is skipped + // xtn_root = xtn_mgr.Parser().Parse_text_to_wdom_old_ctx(ctx, poem_bry, true); // NOTE: ignoring paragraph mode; technically MW enables para mode, but by replacing "\n" with "
    \n" all the logic with para/pre mode is skipped + xtn_root = xtn_mgr.Parser().Parse_text_to_wdom(Xop_ctx.New_sub_by_ctx(ctx), poem_bry, true); // NOTE: ignoring paragraph mode; technically MW enables para mode, but by replacing "\n" with "
    \n" all the logic with para/pre mode is skipped } public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) { if (xtn_root == null) return; // inline poem; write nothing; EX: diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java index 6927f6451..3dae3a9e9 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.scribunto.libs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.scribunto.*; +import gplx.core.bits.*; import gplx.xowa.langs.msgs.*; public class Scrib_lib_text implements Scrib_lib { private final Scrib_lib_text__json_util json_util = new Scrib_lib_text__json_util(); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text__json_util.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text__json_util.java index 8fb13eb51..e459ff7e1 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text__json_util.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text__json_util.java @@ -95,7 +95,8 @@ class Scrib_lib_text__json_util { Json_kv json_kv = root.Get_at_as_kv(i); String kv_str = json_kv.Key_as_str(); Object kv_val = Decode_obj(json_kv.Val()); - decode_rslt_as_nde[i] = KeyVal_.new_(kv_str, kv_val); + int kv_int = Int_.parse_or(kv_str, Int_.Min_value); + decode_rslt_as_nde[i] = kv_int == Int_.Min_value ? KeyVal_.new_(kv_str, kv_val) : KeyVal_.int_(kv_int, kv_val); // use int_key if applicable; PAGE:it.s:Il_Re_Cervo; DATE:2015-12-06 } return Bool_.Y_byte; } @@ -123,7 +124,10 @@ class Scrib_lib_text__json_util { KeyVal[] rv = new KeyVal[len]; for (int i = 0; i < len; ++i) { Json_kv itm = nde.Get_at_as_kv(i); - rv[i] = KeyVal_.new_(itm.Key_as_str(), Decode_obj(itm.Val())); + String kv_str = itm.Key_as_str(); + int kv_int = Int_.parse_or(kv_str, Int_.Min_value); + Object kv_val = Decode_obj(itm.Val()); + rv[i] = kv_int == Int_.Min_value ? KeyVal_.new_(kv_str, kv_val) : KeyVal_.int_(kv_int, kv_val); // use int_key if applicable; PAGE:it.s:Il_Re_Cervo; DATE:2015-12-06 } return rv; } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_json_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_json_tst.java index cb2409bf8..5e885fb7b 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_json_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_text_json_tst.java @@ -215,6 +215,26 @@ public class Scrib_lib_text_json_tst { ) ); } + @Test public void Decode__key__int() { + KeyVal[] kv_ary = (KeyVal[])json_fxt.Test_json_decode(fxt, lib + , Scrib_lib_text__json_util.Flag__none + , Json_doc.Make_str_by_apos + ( "{ '1':" + , " { '11':'aa'" + , " }" + , ", '2':'b'" + , "}" + ) + , KeyVal_.Ary + ( KeyVal_.int_(1, KeyVal_.Ary + ( KeyVal_.int_(11, "aa") + )) + , KeyVal_.int_(2, "b") + ) + ); + Tfds.Eq(kv_ary[0].Key_as_obj(), 1); + Tfds.Eq(((KeyVal[])kv_ary[0].Val())[0].Key_as_obj(), 11); + } } class Scrib_lib_json_fxt { private final Json_wtr wtr = new Json_wtr(); @@ -222,9 +242,10 @@ class Scrib_lib_json_fxt { Test_json_decode(fxt, lib, Scrib_lib_text__json_util.Flag__none, json, obj); Test_json_encode(fxt, lib, Scrib_lib_text__json_util.Flag__none, obj, json); } - public void Test_json_decode(Scrib_invoke_func_fxt fxt, Scrib_lib_text lib, int flag, String raw, Object expd) { + public Object Test_json_decode(Scrib_invoke_func_fxt fxt, Scrib_lib_text lib, int flag, String raw, Object expd) { Object actl = fxt.Test_scrib_proc_rv_as_obj(lib, Scrib_lib_text.Invk_jsonDecode, Object_.Ary(raw, flag)); Tfds.Eq_str_lines(To_str(expd), To_str(actl), raw); + return actl; } public void Test_json_encode(Scrib_invoke_func_fxt fxt, Scrib_lib_text lib, int flag, Object raw, String expd) { fxt.Test_scrib_proc_str_ary(lib, Scrib_lib_text.Invk_jsonEncode, Object_.Ary(raw, flag), "1=" + String_.Replace(expd, "'", "\"")); diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java index 591f251bb..5d66b605e 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl.java @@ -139,7 +139,7 @@ class Scrib_lib_wikibase_srl { return (KeyVal[])rv.To_ary_and_clear(KeyVal.class); } private static KeyVal[] Srl_claims_prop_itm_core(String pid, Wdata_claim_itm_core itm) { - boolean snak_is_valued = itm.Snak_tid() != Wdata_dict_snak_tid.Tid_novalue; + boolean snak_is_valued = itm.Snak_tid() == Wdata_dict_snak_tid.Tid_value; // PURPOSE: was != Wdata_dict_snak_tid.Tid_novalue; PAGE:it.s:Autore:Anonimo DATE:2015-12-06 int snak_is_valued_adj = snak_is_valued ? 1 : 0; KeyVal[] rv = new KeyVal[3 + snak_is_valued_adj]; if (snak_is_valued) // NOTE: novalue must not return slot (no datavalue node in json); PAGE:ru.w:Лимонов,_Эдуард_Вениаминович; DATE:2015-02-16; ALSO: sv.w:Joseph_Jaquet; DATE:2015-07-31 @@ -160,6 +160,6 @@ class Scrib_lib_wikibase_srl { } } public static final String Key_type = "type", Key_value = "value"; - private static final KeyVal[] Datavalue_somevalue = new KeyVal[] {KeyVal_.new_(Key_type, ""), KeyVal_.new_(Key_value, "")}; // NOTE: must return ""; null fails; EX:w:Joseph-François_Malgaigne; DATE:2014-04-07 + private static final KeyVal[] Datavalue_somevalue = KeyVal_.Ary_empty; // changed to not return value-node; PAGE:it.s:Autore:Anonimo DATE:2015-12-06 // new KeyVal[] {KeyVal_.new_(Key_type, ""), KeyVal_.new_(Key_value, "")}; // NOTE: must return ""; null fails; EX:w:Joseph-François_Malgaigne; DATE:2014-04-07 private static final KeyVal[] Datavalue_novalue = KeyVal_.Ary_empty; } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java index 5aa3958c0..e03f440e4 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_wikibase_srl_tst.java @@ -144,7 +144,7 @@ public class Scrib_lib_wikibase_srl_tst { , "" ); } - @Test public void Claims_somevalue() { // PURPOSE: somevalue should always return value node; EX:w:Joseph-François_Malgaigne; DATE:2014-04-07 + @Test public void Claims_somevalue() { // PURPOSE: changed to not return value-node; PAGE:it.s:Autore:Anonimo DATE:2015-12-06 // somevalue should always return value node; EX:w:Joseph-François_Malgaigne; DATE:2014-04-07; fxt.Init_prop(fxt.Wdata_fxt().Make_claim_somevalue(2)); fxt.Test ( "claims:" @@ -152,9 +152,6 @@ public class Scrib_lib_wikibase_srl_tst { , " 1:" , " id:'P2'" , " mainsnak:" - , " datavalue:" - , " type:''" - , " value:''" , " property:'P2'" , " snaktype:'somevalue'" , " datatype:'unknown'" diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_lang_sorter.java b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_lang_sorter.java index 32308639f..96e67918e 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_lang_sorter.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/core/Wdata_lang_sorter.java @@ -69,7 +69,7 @@ public class Wdata_lang_sorter implements GfoEvObj, gplx.core.lists.ComparerAble return new_sort; } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Xoapi_wikibase.Evt_sort_langs_changed)) Langs_((byte[][])m.ReadObj("v", ParseAble_.Null)); + if (ctx.Match(k, Xoapi_wikibase.Evt_sort_langs_changed)) Langs_((byte[][])m.ReadObj("v", null)); else return GfoInvkAble_.Rv_unhandled; return this; } diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java index cc053d494..d391d299f 100644 --- a/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java +++ b/400_xowa/src/gplx/xowa/xtns/wdatas/parsers/Wdata_claims_parser_v2.java @@ -28,6 +28,9 @@ class Wdata_claims_parser_v2 { Wdata_claim_itm_base itm = Parse_claim_itm(qid, claim_itm_nde, pid); if (itm != null) // HACK: itm can be null if value is "somevalue"; DATE:2014-09-20 claim_itms_list.Add(itm); + else { + Tfds.Write(); + } } } private Wdata_claim_itm_core Parse_claim_itm(byte[] qid, Json_nde nde, int pid) { diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa index d44fa62bc..ffc190c39 100644 Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa differ