diff --git a/100_core/.classpath b/100_core/.classpath index a8a01ddbc..072132222 100644 --- a/100_core/.classpath +++ b/100_core/.classpath @@ -5,5 +5,6 @@ + diff --git a/100_core/src/gplx/core/encoders/Hex_utl_.java b/100_core/src/gplx/core/encoders/Hex_utl_.java index 8e5dec22b..1a9a0232d 100644 --- a/100_core/src/gplx/core/encoders/Hex_utl_.java +++ b/100_core/src/gplx/core/encoders/Hex_utl_.java @@ -49,6 +49,12 @@ public class Hex_utl_ { } return rv; } + public static byte[] Encode_bry(byte[] src) { + int src_len = src.length; + byte[] trg = new byte[src_len * 2]; + Encode_bry(src, trg); + return trg; + } public static void Encode_bry(byte[] src, byte[] trg) { int src_len = src.length, trg_len = trg.length; if (trg_len != src_len * 2) throw Err_.new_("hex", "trg.len must be src.len * 2", "src_len", src_len, "trg_len", trg_len); @@ -59,6 +65,14 @@ public class Hex_utl_ { trg[++trg_idx] = To_byte_lcase(0xf & src_byte); } } + public static void Encode_bfr(Bry_bfr bfr, byte[] src) { + int src_len = src.length; + for (int src_idx = 0; src_idx < src_len; ++src_idx) { + byte src_byte = src[src_idx]; + bfr.Add_byte(To_byte_lcase(0xf & src_byte >>> 4)); + bfr.Add_byte(To_byte_lcase(0xf & src_byte)); + } + } public static String To_str(int val, int pad) { char[] ary = new char[8]; int idx = 8; // 8 is max len of hexString; (2^4 * 8); EX: int.MaxValue = 7FFFFFFF do { diff --git a/100_core/src/gplx/core/ios/IoEngine_memory.java b/100_core/src/gplx/core/ios/IoEngine_memory.java index f55671d1a..5e89d513a 100644 --- a/100_core/src/gplx/core/ios/IoEngine_memory.java +++ b/100_core/src/gplx/core/ios/IoEngine_memory.java @@ -190,7 +190,7 @@ public class IoEngine_memory extends IoEngine_base { return Io_stream_rdr_.Noop; } byte[] bry = Bry_.new_u8(FetchFil(Io_url_.mem_fil_(xrg.Src())).Text()); - return Io_stream_rdr_.mem_(bry); + return Io_stream_rdr_.New__mem(bry); } IoItmHash dirs = IoItmHash.new_(); diff --git a/100_core/src/gplx/core/ios/IoEngine_system.java b/100_core/src/gplx/core/ios/IoEngine_system.java index 84b2aa612..54894dd27 100644 --- a/100_core/src/gplx/core/ios/IoEngine_system.java +++ b/100_core/src/gplx/core/ios/IoEngine_system.java @@ -638,7 +638,7 @@ class Io_stream_rdr_http implements Io_stream_rdr { public Io_stream_rdr_http(IoEngine_xrg_downloadFil xrg) { this.xrg = xrg; } private IoEngine_xrg_downloadFil xrg; - public byte Tid() {return Io_stream_.Tid_raw;} + public byte Tid() {return Io_stream_tid_.Tid__raw;} public boolean Exists() {return exists;} private boolean exists = false; public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {url = v; return this;} private Io_url url; public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len = IoItmFil.Size_invalid; // NOTE: must default size to -1; DATE:2014-06-21 diff --git a/100_core/src/gplx/core/ios/streams/Io_stream_.java b/100_core/src/gplx/core/ios/streams/Io_stream_.java deleted file mode 100644 index 1db74a8aa..000000000 --- a/100_core/src/gplx/core/ios/streams/Io_stream_.java +++ /dev/null @@ -1,55 +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.core.ios.streams; import gplx.*; import gplx.core.*; import gplx.core.ios.*; -public class Io_stream_ { // SERIALIZED - public static final byte Tid_null = 0, Tid_raw = 1, Tid_zip = 2, Tid_gzip = 3, Tid_bzip2 = 4; - public static final String Ext_zip = ".zip", Ext_gz = ".gz", Ext_bz2 = ".bz2"; - - public static String Obsolete_to_str(byte v) { - switch (v) { - case Io_stream_.Tid_raw : return ".xdat"; - case Io_stream_.Tid_zip : return ".zip"; - case Io_stream_.Tid_gzip : return ".gz"; - case Io_stream_.Tid_bzip2 : return ".bz2"; - default : throw Err_.new_unhandled(v); - } - } - public static byte Obsolete_to_tid(String v) { - if (String_.Eq(v, ".xdat")) return Io_stream_.Tid_raw; - else if (String_.Eq(v, ".zip")) return Io_stream_.Tid_zip; - else if (String_.Eq(v, ".gz")) return Io_stream_.Tid_gzip; - else if (String_.Eq(v, ".bz2")) return Io_stream_.Tid_bzip2; - else throw Err_.new_unhandled(v); - } - public static String To_str(byte v) { - switch (v) { - case Io_stream_.Tid_raw : return "raw"; - case Io_stream_.Tid_zip : return "zip"; - case Io_stream_.Tid_gzip : return "gzip"; - case Io_stream_.Tid_bzip2 : return "bzip2"; - default : throw Err_.new_unhandled(v); - } - } - public static byte To_tid(String v) { - if (String_.Eq(v, "raw")) return Io_stream_.Tid_raw; - else if (String_.Eq(v, "zip")) return Io_stream_.Tid_zip; - else if (String_.Eq(v, "gzip")) return Io_stream_.Tid_gzip; - else if (String_.Eq(v, "bzip2")) return Io_stream_.Tid_bzip2; - else throw Err_.new_unhandled(v); - } -} diff --git a/100_core/src/gplx/core/ios/streams/Io_stream_rdr.java b/100_core/src/gplx/core/ios/streams/Io_stream_rdr.java index 2e649c71f..7cd94d671 100644 --- a/100_core/src/gplx/core/ios/streams/Io_stream_rdr.java +++ b/100_core/src/gplx/core/ios/streams/Io_stream_rdr.java @@ -17,14 +17,14 @@ along with this program. If not, see . */ package gplx.core.ios.streams; import gplx.*; import gplx.core.*; import gplx.core.ios.*; public interface Io_stream_rdr extends Rls_able { - byte Tid(); - boolean Exists(); - Io_url Url(); Io_stream_rdr Url_(Io_url v); - long Len(); Io_stream_rdr Len_(long v); - Io_stream_rdr Open(); - void Open_mem(byte[] v); - Object Under(); + byte Tid(); + boolean Exists(); + Io_url Url(); Io_stream_rdr Url_(Io_url v); + long Len(); Io_stream_rdr Len_(long v); + Io_stream_rdr Open(); + void Open_mem(byte[] v); + Object Under(); - int Read(byte[] bry, int bgn, int len); - long Skip(long len); + int Read(byte[] bry, int bgn, int len); + long Skip(long len); } diff --git a/100_core/src/gplx/core/ios/streams/Io_stream_rdr_.java b/100_core/src/gplx/core/ios/streams/Io_stream_rdr_.java index 5267238ad..b845469fe 100644 --- a/100_core/src/gplx/core/ios/streams/Io_stream_rdr_.java +++ b/100_core/src/gplx/core/ios/streams/Io_stream_rdr_.java @@ -16,39 +16,43 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.ios.streams; import gplx.*; import gplx.core.*; import gplx.core.ios.*; +import gplx.core.ios.streams.rdrs.*; public class Io_stream_rdr_ { - public static Io_stream_rdr file_(Io_url url) {return new Io_stream_rdr_file().Url_(url);} - public static Io_stream_rdr file_(java.io.InputStream strm) {return new Io_stream_rdr_file().Under_(strm);} - public static Io_stream_rdr zip_(Io_url url) {return new Io_stream_rdr_zip().Url_(url);} - public static Io_stream_rdr gzip_(Io_url url) {return new Io_stream_rdr_gzip().Url_(url);} - public static Io_stream_rdr bzip2_(Io_url url) {return new Io_stream_rdr_bzip2().Url_(url);} - public static Io_stream_rdr new_by_url_(Io_url url) { + public static final int Read_done = -1, Read_done_compare = 1; + public static final Io_stream_rdr Noop = new Io_stream_rdr__noop(); + public static Io_stream_rdr New__raw(Io_url url) {return new Io_stream_rdr__raw().Url_(url);} + public static Io_stream_rdr New__raw(java.io.InputStream strm) {return new Io_stream_rdr__raw().Under_(strm);} + private static Io_stream_rdr New__zip(Io_url url) {return new Io_stream_rdr__zip().Url_(url);} + private static Io_stream_rdr New__gzip(Io_url url) {return new Io_stream_rdr__gzip().Url_(url);} + public static Io_stream_rdr New__bzip2(Io_url url) {return new Io_stream_rdr__bzip2().Url_(url);} + public static Io_stream_rdr New__mem(String v) {return New__mem(Bry_.new_u8(v));} + public static Io_stream_rdr New__mem(byte[] v) { + Io_stream_rdr rv = new Io_stream_rdr__adp(New__mem_as_stream(v)); + rv.Len_(v.length); + return rv; + } + public static java.io.InputStream New__mem_as_stream(byte[] v) { + return new java.io.ByteArrayInputStream(v); + } + public static Io_stream_rdr New_by_url(Io_url url) { String ext = url.Ext(); - if (String_.Eq(ext, Io_stream_.Ext_zip)) return gplx.core.ios.streams.Io_stream_rdr_.zip_(url); - else if (String_.Eq(ext, Io_stream_.Ext_gz)) return gplx.core.ios.streams.Io_stream_rdr_.gzip_(url); - else if (String_.Eq(ext, Io_stream_.Ext_bz2)) return gplx.core.ios.streams.Io_stream_rdr_.bzip2_(url); - else return gplx.core.ios.streams.Io_stream_rdr_.file_(url); + if (String_.Eq(ext, Io_stream_tid_.Ext__zip)) return Io_stream_rdr_.New__zip(url); + else if (String_.Eq(ext, Io_stream_tid_.Ext__gz)) return Io_stream_rdr_.New__gzip(url); + else if (String_.Eq(ext, Io_stream_tid_.Ext__bz2)) return Io_stream_rdr_.New__bzip2(url); + else if (String_.Eq(ext, Io_stream_tid_.Ext__xz)) return new Io_stream_rdr__xz().Url_(url); + else return Io_stream_rdr_.New__raw(url); } - public static Io_stream_rdr new_by_tid_(byte tid) { + public static Io_stream_rdr New_by_tid(byte tid) { switch (tid) { - case Io_stream_.Tid_raw: return new Io_stream_rdr_file(); - case Io_stream_.Tid_zip: return new Io_stream_rdr_zip(); - case Io_stream_.Tid_gzip: return new Io_stream_rdr_gzip(); - case Io_stream_.Tid_bzip2: return new Io_stream_rdr_bzip2(); - default: throw Err_.new_unhandled(tid); + case Io_stream_tid_.Tid__raw: return new Io_stream_rdr__raw(); + case Io_stream_tid_.Tid__zip: return new Io_stream_rdr__zip(); + case Io_stream_tid_.Tid__gzip: return new Io_stream_rdr__gzip(); + case Io_stream_tid_.Tid__bzip2: return new Io_stream_rdr__bzip2(); + case Io_stream_tid_.Tid__xz: return new Io_stream_rdr__xz(); + default: throw Err_.new_unhandled_default(tid); } } - public static byte[] Load_all(Io_url url) { - Io_stream_rdr rdr = new_by_url_(url); - Bry_bfr rv = Bry_bfr_.New(); - try { - rdr.Open(); - return Load_all_as_bry(rv, rdr); - } - finally {rdr.Rls();} - } - public static String Load_all_as_str(Io_stream_rdr rdr) {return String_.new_u8(Load_all_as_bry(rdr));} - public static byte[] Load_all_as_bry(Io_stream_rdr rdr) {return Load_all_as_bry(Bry_bfr_.New(), rdr);} + public static String Load_all_as_str(Io_stream_rdr rdr) {return String_.new_u8(Load_all_as_bry(Bry_bfr_.New(), rdr));} public static byte[] Load_all_as_bry(Bry_bfr rv, Io_stream_rdr rdr) { Load_all_to_bfr(rv, rdr); return rv.To_bry_and_clear(); @@ -63,24 +67,7 @@ public class Io_stream_rdr_ { } } finally {rdr.Rls();} } - public static final Io_stream_rdr Noop = new Io_stream_rdr_noop(); - public static Io_stream_rdr mem_(String v) {return mem_(Bry_.new_u8(v));} - public static Io_stream_rdr mem_(byte[] v) { - Io_stream_rdr rv = new Io_stream_rdr_adp(Stream_new_mem(v)); - rv.Len_(v.length); - return rv; - } - public static java.io.InputStream Stream_new_mem(byte[] v) { - return new java.io.ByteArrayInputStream(v); - } - public static boolean Stream_close(java.io.InputStream stream) { - try { - if (stream != null) - stream.close(); - return true; - } catch (Exception e) {Err_.Noop(e); return false;} - } - public static int Stream_read_by_parts(java.io.InputStream stream, int part_len, byte[] bry, int bgn, int len) { + public static int Read_by_parts(java.io.InputStream stream, int part_len, byte[] bry, int bgn, int len) { /* NOTE: BZip2CompressorInputStream will fail if large len is used Instead, make smaller requests and fill bry @@ -106,163 +93,10 @@ public class Io_stream_rdr_ { throw Err_.new_exc(exc, "io", "read failed", "bgn", bgn, "len", len); } } - public static final int Read_done = -1; - public static final int Read_done_compare = 1; -} -class Io_stream_rdr_noop implements Io_stream_rdr { - public Object Under() {return null;} - public byte Tid() {return Io_stream_.Tid_null;} - public boolean Exists() {return false;} - public Io_url Url() {return Io_url_.Empty;} public Io_stream_rdr Url_(Io_url v) {return this;} - public long Len() {return Io_mgr.Len_null;} public Io_stream_rdr Len_(long v) {return this;} - public void Open_mem(byte[] v) {} - public Io_stream_rdr Open() {return this;} - public int Read(byte[] bry, int bgn, int len) {return Io_stream_rdr_.Read_done;} - public long Skip(long len) {return Io_stream_rdr_.Read_done;} - public void Rls() {} -} -class Io_stream_rdr_adp implements Io_stream_rdr { - private java.io.InputStream strm; - public Io_stream_rdr_adp(java.io.InputStream strm) {this.strm = strm;} - public Object Under() {return strm;} - public byte Tid() {return Io_stream_.Tid_raw;} - public boolean Exists() {return len > 0;} - public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {this.url = v; return this;} private Io_url url; - public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len = Io_mgr.Len_null; - public void Open_mem(byte[] v) {} - public Io_stream_rdr Open() {return this;} - public int Read(byte[] bry, int bgn, int len) { - try {return strm.read(bry, bgn, len);} - catch (Exception e) {throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len);} - } - public long Skip(long len) { - try {return strm.skip(len);} - catch (Exception e) {throw Err_.new_exc(e, "io", "skip failed", "len", len);} - } - public void Rls() { - try {strm.close();} - catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Xto_api());} - } -} -abstract class Io_stream_rdr_base implements Io_stream_rdr { - public abstract byte Tid(); - public boolean Exists() {return this.Len() > 0;} - public Object Under() {return stream;} public Io_stream_rdr Under_(java.io.InputStream v) {this.stream = v; return this;} protected java.io.InputStream stream; - public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {this.url = v; return this;} protected Io_url url; - public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len = Io_mgr.Len_null; - public void Open_mem(byte[] v) { - stream = Wrap_stream(new java.io.ByteArrayInputStream(v)); - } - public Io_stream_rdr Open() { - try {stream = Wrap_stream(new java.io.FileInputStream(url.Xto_api()));} - catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Xto_api());} - return this; - } - public int Read(byte[] bry, int bgn, int len) { - try {return stream.read(bry, bgn, len);} - catch (Exception e) {throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len);} - } - public long Skip(long len) { - try {return stream.skip(len);} - catch (Exception e) {throw Err_.new_exc(e, "io", "skip failed", "len", len);} - } - public void Rls() { - try {stream.close();} - catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Xto_api());} - } - public abstract java.io.InputStream Wrap_stream(java.io.InputStream stream); -} -class Io_stream_rdr_file extends Io_stream_rdr_base { - @Override public byte Tid() {return Io_stream_.Tid_raw;} - public Io_stream_rdr Open() { + public static boolean Close(java.io.InputStream stream) { try { - if (!Io_mgr.Instance.Exists(url)) - stream = Wrap_stream(new java.io.ByteArrayInputStream(Bry_.Empty)); - else { - if (url.Info().EngineKey() == IoEngine_.MemKey) - stream = Wrap_stream(new java.io.ByteArrayInputStream(Io_mgr.Instance.LoadFilBry(url.Xto_api()))); - else - stream = Wrap_stream(new java.io.FileInputStream(url.Xto_api())); - } - } - catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Xto_api());} - return this; - } - @Override public java.io.InputStream Wrap_stream(java.io.InputStream stream) {return stream;} -} -class Io_stream_rdr_zip implements Io_stream_rdr { - @Override public byte Tid() {return Io_stream_.Tid_zip;} - public boolean Exists() {return this.Len() > 0;} - public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {this.url = v; return this;} Io_url url; - public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len = Io_mgr.Len_null; - public Object Under() {return zip_stream;} private java.util.zip.ZipInputStream zip_stream; - public void Src_bfr_(Bry_bfr v) {this.src_bfr = v;} Bry_bfr src_bfr; - public void Open_mem(byte[] v) { - Wrap_stream(new java.io.ByteArrayInputStream(v)); - } - public Io_stream_rdr Open() { - try {Wrap_stream(new java.io.FileInputStream(url.Xto_api()));} - catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Xto_api());} - return this; - } - void Wrap_stream(java.io.InputStream input_stream) {zip_stream = new java.util.zip.ZipInputStream(input_stream);} - public int Read(byte[] bry, int bgn, int len) { - try { - while (true){ - int read = zip_stream.read(bry, bgn, len); - if (read == Io_stream_rdr_.Read_done) { - if (zip_stream.getNextEntry() == null) - return Io_stream_rdr_.Read_done; - } - else - return read; - } - } - catch (Exception e) {throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len);} - } - public long Skip(long len) { - try {return zip_stream.skip(len);} - catch (Exception e) {throw Err_.new_exc(e, "io", "skip failed", "len", len);} - } - public void Rls() { - try {zip_stream.close();} - catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Xto_api());} + if (stream != null) stream.close(); + return true; + } catch (Exception e) {Err_.Noop(e); return false;} } } -class Io_stream_rdr_gzip extends Io_stream_rdr_base { - @Override public byte Tid() {return Io_stream_.Tid_gzip;} - @Override public int Read(byte[] bry, int bgn, int len) { - synchronized (this) { - try { - int total_read = 0; - while (true) { // NOTE: the gz stream reads partially; (request 100; only get back 10); keep reading until entire bfr is full or -1 - int read = stream.read(bry, bgn, len); - if (read == Io_stream_rdr_.Read_done) break; - total_read += read; - if (total_read >= len) break; // entire bfr full; stop - bgn += read; // increase bgn by amount read - len -= read; // decrease len by amount read - } - return total_read == 0 ? Io_stream_rdr_.Read_done : total_read; // gzip seems to allow 0 bytes read (bz2 and zip return -1 instead); normalize return to -1; - } - catch (Exception e) { - throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len); - } - } - } - @Override public java.io.InputStream Wrap_stream(java.io.InputStream stream) { - try {return new java.util.zip.GZIPInputStream(stream);} - catch (Exception exc) {throw Err_.new_wo_type("failed to open gz stream");} - } -} -class Io_stream_rdr_bzip2 extends Io_stream_rdr_base { - @Override public byte Tid() {return Io_stream_.Tid_bzip2;} - @Override public java.io.InputStream Wrap_stream(java.io.InputStream stream) { - try {return new org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream(stream, true);} - catch (Exception exc) {throw Err_.new_wo_type("failed to open bzip2 stream");} - } - @Override public int Read(byte[] bry, int bgn, int len) { - return Io_stream_rdr_.Stream_read_by_parts(stream, Read_len, bry, bgn, len); - } - private static final int Read_len = Io_mgr.Len_mb * 128; -} diff --git a/100_core/src/gplx/core/ios/streams/Io_stream_rdr_tst.java b/100_core/src/gplx/core/ios/streams/Io_stream_rdr__tst.java similarity index 75% rename from 100_core/src/gplx/core/ios/streams/Io_stream_rdr_tst.java rename to 100_core/src/gplx/core/ios/streams/Io_stream_rdr__tst.java index 5094f1d13..a3ea55cb9 100644 --- a/100_core/src/gplx/core/ios/streams/Io_stream_rdr_tst.java +++ b/100_core/src/gplx/core/ios/streams/Io_stream_rdr__tst.java @@ -17,8 +17,8 @@ along with this program. If not, see . */ package gplx.core.ios.streams; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import org.junit.*; -public class Io_stream_rdr_tst { - @Before public void init() {fxt.Clear();} private Io_stream_rdr_fxt fxt = new Io_stream_rdr_fxt(); +public class Io_stream_rdr__tst { + @Before public void init() {fxt.Clear();} private Io_stream_rdr__fxt fxt = new Io_stream_rdr__fxt(); @After public void term() {fxt.Rls();} @Test public void Bz2_read() { fxt .Init_stream("abcd") // read everything at once @@ -30,27 +30,27 @@ public class Io_stream_rdr_tst { ; } } -class Io_stream_rdr_fxt { +class Io_stream_rdr__fxt { private java.io.InputStream stream; private int stream_bry_len; public void Clear() { expd_bytes_read = Int_.Min_value; } - public Io_stream_rdr_fxt Expd_bytes_read(int v) {expd_bytes_read = v; return this;} private int expd_bytes_read = Int_.Min_value; - public Io_stream_rdr_fxt Init_stream(String v) { + public Io_stream_rdr__fxt Expd_bytes_read(int v) {expd_bytes_read = v; return this;} private int expd_bytes_read = Int_.Min_value; + public Io_stream_rdr__fxt Init_stream(String v) { byte[] stream_bry = Bry_.new_a7(v); stream_bry_len = stream_bry.length; - stream = Io_stream_rdr_.Stream_new_mem(stream_bry); + stream = Io_stream_rdr_.New__mem_as_stream(stream_bry); return this; } - public Io_stream_rdr_fxt Test_read(int bgn, int len, String expd_str) { + public Io_stream_rdr__fxt Test_read(int bgn, int len, String expd_str) { byte[] bfr = new byte[stream_bry_len]; // allocate whole stream; may not use it all - int actl_bytes_read = Io_stream_rdr_.Stream_read_by_parts(stream, 8, bfr, bgn, len); + int actl_bytes_read = Io_stream_rdr_.Read_by_parts(stream, 8, bfr, bgn, len); Tfds.Eq(expd_bytes_read, actl_bytes_read, "bytes_read"); Tfds.Eq(expd_str, String_.new_u8(bfr, bgn, bgn + actl_bytes_read), "str"); return this; } public void Rls() { - Io_stream_rdr_.Stream_close(stream); + Io_stream_rdr_.Close(stream); } } diff --git a/100_core/src/gplx/core/ios/streams/Io_stream_tid_.java b/100_core/src/gplx/core/ios/streams/Io_stream_tid_.java new file mode 100644 index 000000000..ec5b3b2c4 --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/Io_stream_tid_.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.core.ios.streams; import gplx.*; import gplx.core.*; import gplx.core.ios.*; +public class Io_stream_tid_ { + public static final byte Tid__null = 0, Tid__raw = 1, Tid__zip = 2, Tid__gzip = 3, Tid__bzip2 = 4, Tid__xz = 5; // SERIALIZED:xo.text_db;xo.html_db + public static final String Ext__zip = ".zip", Ext__gz = ".gz", Ext__bz2 = ".bz2", Ext__xz = ".xz"; + private static final String Key__raw = "raw", Key__zip = "zip", Key__gzip = "gzip", Key__bzip2 = "bzip2", Key__xz = "xz"; + + public static String To_key(byte v) { + switch (v) { + case Io_stream_tid_.Tid__raw : return Key__raw; + case Io_stream_tid_.Tid__zip : return Key__zip; + case Io_stream_tid_.Tid__gzip : return Key__gzip; + case Io_stream_tid_.Tid__bzip2 : return Key__bzip2; + case Io_stream_tid_.Tid__xz : return Key__xz; + default : throw Err_.new_unhandled_default(v); + } + } + public static byte To_tid(String v) { + if (String_.Eq(v, Key__raw)) return Io_stream_tid_.Tid__raw; + else if (String_.Eq(v, Key__zip)) return Io_stream_tid_.Tid__zip; + else if (String_.Eq(v, Key__gzip)) return Io_stream_tid_.Tid__gzip; + else if (String_.Eq(v, Key__bzip2)) return Io_stream_tid_.Tid__bzip2; + else if (String_.Eq(v, Key__xz)) return Io_stream_tid_.Tid__xz; + else throw Err_.new_unhandled_default(v); + } + public static String Obsolete_to_str(byte v) { + switch (v) { + case Io_stream_tid_.Tid__raw : return ".xdat"; + case Io_stream_tid_.Tid__zip : return ".zip"; + case Io_stream_tid_.Tid__gzip : return ".gz"; + case Io_stream_tid_.Tid__bzip2 : return ".bz2"; + default : throw Err_.new_unhandled_default(v); + } + } + public static byte Obsolete_to_tid(String v) { + if (String_.Eq(v, ".xdat")) return Io_stream_tid_.Tid__raw; + else if (String_.Eq(v, ".zip")) return Io_stream_tid_.Tid__zip; + else if (String_.Eq(v, ".gz")) return Io_stream_tid_.Tid__gzip; + else if (String_.Eq(v, ".bz2")) return Io_stream_tid_.Tid__bzip2; + else throw Err_.new_unhandled_default(v); + } +} diff --git a/100_core/src/gplx/core/ios/streams/Io_stream_wtr.java b/100_core/src/gplx/core/ios/streams/Io_stream_wtr.java index bb292a3e9..ad49c49b1 100644 --- a/100_core/src/gplx/core/ios/streams/Io_stream_wtr.java +++ b/100_core/src/gplx/core/ios/streams/Io_stream_wtr.java @@ -17,12 +17,12 @@ along with this program. If not, see . */ package gplx.core.ios.streams; import gplx.*; import gplx.core.*; import gplx.core.ios.*; 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); - Io_stream_wtr Open(); - byte[] To_ary_and_clear(); + byte Tid(); + Io_url Url(); Io_stream_wtr Url_(Io_url v); + void Trg_bfr_(Bry_bfr v); + Io_stream_wtr Open(); + byte[] To_ary_and_clear(); - void Write(byte[] bry, int bgn, int len); - void Flush(); + void Write(byte[] bry, int bgn, int len); + void Flush(); } diff --git a/100_core/src/gplx/core/ios/streams/Io_stream_wtr_.java b/100_core/src/gplx/core/ios/streams/Io_stream_wtr_.java index cfda588b3..0a1a75eff 100644 --- a/100_core/src/gplx/core/ios/streams/Io_stream_wtr_.java +++ b/100_core/src/gplx/core/ios/streams/Io_stream_wtr_.java @@ -16,44 +16,38 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.ios.streams; import gplx.*; import gplx.core.*; import gplx.core.ios.*; +import gplx.core.ios.streams.wtrs.*; public class Io_stream_wtr_ { - public static Io_stream_wtr bzip2_(Io_url url) {return new Io_stream_wtr_bzip2().Url_(url);} - public static Io_stream_wtr gzip_(Io_url url) {return new Io_stream_wtr_gzip().Url_(url);} - public static Io_stream_wtr zip_(Io_url url) {return new Io_stream_wtr_zip().Url_(url);} - public static Io_stream_wtr file_(Io_url url) {return new Io_stream_wtr_file().Url_(url);} - public static Io_stream_wtr new_by_url_(Io_url url) { + public static Io_stream_wtr New__raw(Io_url url) {return new Io_stream_wtr__raw().Url_(url);} + private static Io_stream_wtr New__zip(Io_url url) {return new Io_stream_wtr__zip().Url_(url);} + private static Io_stream_wtr New__gzip(Io_url url) {return new Io_stream_wtr__gzip().Url_(url);} + private static Io_stream_wtr New__bzip2(Io_url url) {return new Io_stream_wtr__bzip2().Url_(url);} + public static Io_stream_wtr New_by_url(Io_url url) { String ext = url.Ext(); - if (String_.Eq(ext, Io_stream_.Ext_zip)) return gplx.core.ios.streams.Io_stream_wtr_.zip_(url); - else if (String_.Eq(ext, Io_stream_.Ext_gz)) return gplx.core.ios.streams.Io_stream_wtr_.gzip_(url); - else if (String_.Eq(ext, Io_stream_.Ext_bz2)) return gplx.core.ios.streams.Io_stream_wtr_.bzip2_(url); - else return gplx.core.ios.streams.Io_stream_wtr_.file_(url); + if (String_.Eq(ext, Io_stream_tid_.Ext__zip)) return Io_stream_wtr_.New__zip(url); + else if (String_.Eq(ext, Io_stream_tid_.Ext__gz)) return Io_stream_wtr_.New__gzip(url); + else if (String_.Eq(ext, Io_stream_tid_.Ext__bz2)) return Io_stream_wtr_.New__bzip2(url); + else if (String_.Eq(ext, Io_stream_tid_.Ext__xz)) return new Io_stream_wtr__xz().Url_(url); + else return Io_stream_wtr_.New__raw(url); } - public static Io_stream_wtr new_by_mem(Bry_bfr bfr, byte tid) { - Io_stream_wtr wtr = new_by_tid_(tid).Url_(Io_url_.Empty); + public static Io_stream_wtr New_by_tid(byte v) { + switch (v) { + case Io_stream_tid_.Tid__raw: return new Io_stream_wtr__raw(); + case Io_stream_tid_.Tid__zip: return new Io_stream_wtr__zip(); + case Io_stream_tid_.Tid__gzip: return new Io_stream_wtr__gzip(); + case Io_stream_tid_.Tid__bzip2: return new Io_stream_wtr__bzip2(); + case Io_stream_tid_.Tid__xz: return new Io_stream_wtr__xz(); + default: throw Err_.new_unhandled(v); + } + } + public static Io_stream_wtr New_by_mem(Bry_bfr bfr, byte tid) { + Io_stream_wtr wtr = New_by_tid(tid).Url_(Io_url_.Empty); wtr.Trg_bfr_(bfr); return wtr; } - public static Io_stream_wtr new_by_tid_(byte v) { - switch (v) { - case gplx.core.ios.streams.Io_stream_.Tid_raw : return new Io_stream_wtr_file(); - case gplx.core.ios.streams.Io_stream_.Tid_zip : return new Io_stream_wtr_zip(); - case gplx.core.ios.streams.Io_stream_.Tid_gzip : return new Io_stream_wtr_gzip(); - case gplx.core.ios.streams.Io_stream_.Tid_bzip2 : return new Io_stream_wtr_bzip2(); - default : throw Err_.new_unhandled(v); - } - } - public static void Save_all(Io_url url, byte[] bry, int bgn, int end) { - Io_stream_wtr wtr = new_by_url_(url); - try { - wtr.Open(); - wtr.Write(bry, bgn, end); - wtr.Flush(); - } - finally {wtr.Rls();} - } public static void Save_rdr(Io_url url, Io_stream_rdr rdr, Io_download_fmt download_progress) { byte[] bry = new byte[4096]; - Io_stream_wtr wtr = new_by_url_(url); + Io_stream_wtr wtr = New_by_url(url); try { wtr.Open(); if (download_progress != Io_download_fmt.Null) @@ -72,142 +66,3 @@ public class Io_stream_wtr_ { finally {wtr.Rls(); rdr.Rls();} } } -abstract class Io_stream_wtr_base implements Io_stream_wtr { - java.io.OutputStream zip_stream; - public Io_url Url() {return url;} public Io_stream_wtr Url_(Io_url v) {url = v; trg_bfr = null; return this;} Io_url url; - public void Trg_bfr_(Bry_bfr v) {trg_bfr = v;} Bry_bfr trg_bfr; java.io.ByteArrayOutputStream mem_stream; - public byte[] To_ary_and_clear() {return trg_bfr.To_bry_and_clear();} - public Io_stream_wtr Open() { - java.io.OutputStream bry_stream = null; - if (trg_bfr == null) { - if (!Io_mgr.Instance.ExistsFil(url)) Io_mgr.Instance.SaveFilStr(url, ""); - try {bry_stream = new java.io.FileOutputStream(url.Raw());} - catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} - } - else { - mem_stream = new java.io.ByteArrayOutputStream(); - bry_stream = mem_stream; - } - zip_stream = Wrap_stream(bry_stream); - return this; - } - public void Write(byte[] bry, int bgn, int len) { - try {zip_stream.write(bry, bgn, len);} - catch (Exception e) {Err_.new_exc(e, "io", "write failed", "bgn", bgn, "len", len);} - } - public void Flush() { - if (trg_bfr != null) { - try {zip_stream.close();} catch (Exception e) {throw Err_.new_exc(e, "io", "flush failed");} // must close zip_stream to flush all bytes - trg_bfr.Add(mem_stream.toByteArray()); - } - } - public void Rls() { - try { - if (zip_stream != null) zip_stream.close(); - if (mem_stream != null) mem_stream.close(); - } - catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Raw());} - } - public abstract java.io.OutputStream Wrap_stream(java.io.OutputStream stream); -} -class Io_stream_wtr_bzip2 extends Io_stream_wtr_base { - @Override public byte Tid() {return Io_stream_.Tid_bzip2;} - @Override public java.io.OutputStream Wrap_stream(java.io.OutputStream stream) { - try {return new org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream(stream);} - catch (Exception e) {throw Err_.new_exc(e, "io", "failed to open bzip2 stream");} - } - static final byte[] Bz2_header = new byte[] {Byte_ascii.Ltr_B, Byte_ascii.Ltr_Z}; -} -class Io_stream_wtr_gzip extends Io_stream_wtr_base { - @Override public byte Tid() {return Io_stream_.Tid_gzip;} - @Override public java.io.OutputStream Wrap_stream(java.io.OutputStream stream) { - try {return new java.util.zip.GZIPOutputStream(stream);} - catch (Exception e) {throw Err_.new_exc(e, "io", "failed to open gz stream");} - } -} -class Io_stream_wtr_zip implements Io_stream_wtr { - private java.util.zip.ZipOutputStream zip_stream; - @Override public byte Tid() {return Io_stream_.Tid_zip;} - public Io_url Url() {return url;} public Io_stream_wtr Url_(Io_url v) {url = v; trg_bfr = null; return this;} private Io_url url = Io_url_.Empty; - public void Trg_bfr_(Bry_bfr v) {trg_bfr = v;} private Bry_bfr trg_bfr; private java.io.ByteArrayOutputStream mem_stream; - // rely on zip_stream to close bry_stream - public Io_stream_wtr Open() { - java.io.OutputStream bry_stream; - if (trg_bfr == null) { - if (!Io_mgr.Instance.ExistsFil(url)) Io_mgr.Instance.SaveFilStr(url, ""); // create file if it doesn't exist - try {bry_stream = new java.io.FileOutputStream(url.Xto_api());} - catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} - } - else { - mem_stream = new java.io.ByteArrayOutputStream(); - bry_stream = mem_stream; - } - zip_stream = new java.util.zip.ZipOutputStream(bry_stream); - java.util.zip.ZipEntry entry = new java.util.zip.ZipEntry("file"); - try {zip_stream.putNextEntry(entry);} - catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} - return this; - } - public void Write(byte[] bry, int bgn, int len) { - try {zip_stream.write(bry, bgn, len);} - catch (Exception e) {throw Err_.new_exc(e, "io", "write failed", "url", url.Raw(), "bgn", bgn, "len", len);} - } - public void Flush() {// fixed as of DATE:2014-04-15 - try { - zip_stream.closeEntry(); - zip_stream.close(); - if (trg_bfr != null) - trg_bfr.Add(mem_stream.toByteArray()); - zip_stream.flush(); - } - catch (Exception e) {throw Err_.new_exc(e, "io", "flush failed", "url", url.Raw());} - } - public void Rls() { - try { - if (zip_stream != null) zip_stream.close(); - if (mem_stream != null) mem_stream.close(); - } - catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Raw());} - } - public byte[] To_ary_and_clear() { - byte[] rv = trg_bfr.To_bry_and_clear(); - this.Rls(); - return rv; - } -} -class Io_stream_wtr_file implements Io_stream_wtr { - IoStream bry_stream; - @Override public byte Tid() {return Io_stream_.Tid_raw;} - public Io_url Url() {return url;} public Io_stream_wtr Url_(Io_url v) {url = v; return this;} Io_url url; - public void Trg_bfr_(Bry_bfr v) {trg_bfr = v;} private Bry_bfr trg_bfr; java.io.ByteArrayOutputStream mem_stream; - public Io_stream_wtr Open() { - try { - if (trg_bfr == null) - bry_stream = Io_mgr.Instance.OpenStreamWrite(url); - } - catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} - return this; - } - public void Write(byte[] bry, int bgn, int len) { - if (trg_bfr == null) { - try {bry_stream.Write(bry, bgn, len);} - catch (Exception e) {throw Err_.new_exc(e, "io", "write failed", "url", url.Raw(), "bgn", bgn, "len", len);} - } - else - trg_bfr.Add_mid(bry, bgn, bgn + len); - } - public byte[] To_ary_and_clear() { - return trg_bfr == null ? Io_mgr.Instance.LoadFilBry(url) : trg_bfr.To_bry_and_clear(); - } - public void Flush() { - if (trg_bfr == null) - bry_stream.Flush(); - } - public void Rls() { - try { - if (trg_bfr == null) - bry_stream.Rls(); - } - catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Raw());} - } -} diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__adp.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__adp.java new file mode 100644 index 000000000..022c93060 --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__adp.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.core.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_rdr__adp implements Io_stream_rdr { + private java.io.InputStream strm; + public Io_stream_rdr__adp(java.io.InputStream strm) {this.strm = strm;} + public Object Under() {return strm;} + public byte Tid() {return Io_stream_tid_.Tid__raw;} + public boolean Exists() {return len > 0;} + public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {this.url = v; return this;} private Io_url url; + public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len = Io_mgr.Len_null; + public void Open_mem(byte[] v) {} + public Io_stream_rdr Open() {return this;} + public int Read(byte[] bry, int bgn, int len) { + try {return strm.read(bry, bgn, len);} + catch (Exception e) {throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len);} + } + public long Skip(long len) { + try {return strm.skip(len);} + catch (Exception e) {throw Err_.new_exc(e, "io", "skip failed", "len", len);} + } + public void Rls() { + try {strm.close();} + catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Xto_api());} + } +} diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__base.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__base.java new file mode 100644 index 000000000..5958cfdc5 --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__base.java @@ -0,0 +1,48 @@ +/* +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.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public abstract class Io_stream_rdr__base implements Io_stream_rdr { + public abstract byte Tid(); + public Io_url Url() {return url;} protected Io_url url; + public long Len() {return len;} private long len = Io_mgr.Len_null; + public boolean Exists() {return this.Len() > 0;} + public Io_stream_rdr Url_(Io_url v) {this.url = v; return this;} + public Io_stream_rdr Len_(long v) {len = v; return this;} + public Object Under() {return stream;} public Io_stream_rdr Under_(java.io.InputStream v) {this.stream = v; return this;} protected java.io.InputStream stream; + public void Open_mem(byte[] v) { + stream = Wrap_stream(new java.io.ByteArrayInputStream(v)); + } + public Io_stream_rdr Open() { + try {stream = Wrap_stream(new java.io.FileInputStream(url.Xto_api()));} + catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Xto_api());} + return this; + } + public int Read(byte[] bry, int bgn, int len) { + try {return stream.read(bry, bgn, len);} + catch (Exception e) {throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len);} + } + public long Skip(long len) { + try {return stream.skip(len);} + catch (Exception e) {throw Err_.new_exc(e, "io", "skip failed", "len", len);} + } + public void Rls() { + try {stream.close();} + catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Xto_api());} + } + public abstract java.io.InputStream Wrap_stream(java.io.InputStream stream); + } diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__bzip2.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__bzip2.java new file mode 100644 index 000000000..baf173d0c --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__bzip2.java @@ -0,0 +1,29 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_rdr__bzip2 extends Io_stream_rdr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__bzip2;} + @Override public int Read(byte[] bry, int bgn, int len) { + return Io_stream_rdr_.Read_by_parts(stream, Read_len, bry, bgn, len); + } + @Override public java.io.InputStream Wrap_stream(java.io.InputStream stream) { + try {return new org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream(stream, true);} + catch (Exception exc) {throw Err_.new_wo_type("failed to open bzip2 stream");} + } + private static final int Read_len = Io_mgr.Len_mb * 128; + } diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__gzip.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__gzip.java new file mode 100644 index 000000000..7ec7ad93b --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__gzip.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.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_rdr__gzip extends Io_stream_rdr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__gzip;} + @Override public int Read(byte[] bry, int bgn, int len) { + synchronized (this) { + try { + int total_read = 0; + while (true) { // NOTE: the gz stream reads partially; (request 100; only get back 10); keep reading until entire bfr is full or -1 + int read = stream.read(bry, bgn, len); + if (read == Io_stream_rdr_.Read_done) break; + total_read += read; + if (total_read >= len) break; // entire bfr full; stop + bgn += read; // increase bgn by amount read + len -= read; // decrease len by amount read + } + return total_read == 0 ? Io_stream_rdr_.Read_done : total_read; // gzip seems to allow 0 bytes read (bz2 and zip return -1 instead); normalize return to -1; + } + catch (Exception e) { + throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len); + } + } + } + @Override public java.io.InputStream Wrap_stream(java.io.InputStream stream) { + try {return new java.util.zip.GZIPInputStream(stream);} + catch (Exception exc) {throw Err_.new_wo_type("failed to open gz stream");} + } + } diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__noop.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__noop.java new file mode 100644 index 000000000..0efb8aa87 --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__noop.java @@ -0,0 +1,30 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_rdr__noop implements Io_stream_rdr { + public Object Under() {return null;} + public byte Tid() {return Io_stream_tid_.Tid__null;} + public boolean Exists() {return false;} + public Io_url Url() {return Io_url_.Empty;} public Io_stream_rdr Url_(Io_url v) {return this;} + public long Len() {return Io_mgr.Len_null;} public Io_stream_rdr Len_(long v) {return this;} + public void Open_mem(byte[] v) {} + public Io_stream_rdr Open() {return this;} + public int Read(byte[] bry, int bgn, int len) {return Io_stream_rdr_.Read_done;} + public long Skip(long len) {return Io_stream_rdr_.Read_done;} + public void Rls() {} +} diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__raw.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__raw.java new file mode 100644 index 000000000..cc45965f5 --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__raw.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.core.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_rdr__raw extends Io_stream_rdr__base { + public byte Tid() {return Io_stream_tid_.Tid__raw;} + public Io_stream_rdr Open() { + Io_url url = this.Url(); + try { + if (!Io_mgr.Instance.Exists(url)) + stream = Wrap_stream(new java.io.ByteArrayInputStream(Bry_.Empty)); + else { + if (url.Info().EngineKey() == IoEngine_.MemKey) + stream = Wrap_stream(new java.io.ByteArrayInputStream(Io_mgr.Instance.LoadFilBry(url.Xto_api()))); + else + stream = Wrap_stream(new java.io.FileInputStream(url.Xto_api())); + } + } + catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Xto_api());} + return this; + } + @Override public java.io.InputStream Wrap_stream(java.io.InputStream stream) {return stream;} + } diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__xz.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__xz.java new file mode 100644 index 000000000..f29ebfe6e --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__xz.java @@ -0,0 +1,25 @@ +/* +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.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_rdr__xz extends Io_stream_rdr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__xz;} + @Override public java.io.InputStream Wrap_stream(java.io.InputStream stream) { + try {return new org.tukaani.xz.XZInputStream(stream);} + catch (Exception exc) {throw Err_.new_wo_type("failed to open xz stream");} + } + } diff --git a/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__zip.java b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__zip.java new file mode 100644 index 000000000..98e84ef17 --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/rdrs/Io_stream_rdr__zip.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.core.ios.streams.rdrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_rdr__zip extends Io_stream_rdr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__gzip;} + public Object Under() {return zip_stream;} private java.util.zip.ZipInputStream zip_stream; + public void Src_bfr_(Bry_bfr v) {this.src_bfr = v;} Bry_bfr src_bfr; + public void Open_mem(byte[] v) { + this.zip_stream = (java.util.zip.ZipInputStream)Wrap_stream(new java.io.ByteArrayInputStream(v)); + } + public Io_stream_rdr Open() { + try {this.zip_stream = (java.util.zip.ZipInputStream)Wrap_stream(new java.io.FileInputStream(url.Xto_api()));} + catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Xto_api());} + return this; + } + public int Read(byte[] bry, int bgn, int len) { + try { + while (true){ + int read = zip_stream.read(bry, bgn, len); + if (read == Io_stream_rdr_.Read_done) { + if (zip_stream.getNextEntry() == null) + return Io_stream_rdr_.Read_done; + } + else + return read; + } + } + catch (Exception e) {throw Err_.new_exc(e, "io", "read failed", "bgn", bgn, "len", len);} + } + public long Skip(long len) { + try {return zip_stream.skip(len);} + catch (Exception e) {throw Err_.new_exc(e, "io", "skip failed", "len", len);} + } + public void Rls() { + try {zip_stream.close();} + catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Xto_api());} + } + @Override public java.io.InputStream Wrap_stream(java.io.InputStream input_stream) {return new java.util.zip.ZipInputStream(input_stream);} + } diff --git a/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__base.java b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__base.java new file mode 100644 index 000000000..736751b6d --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__base.java @@ -0,0 +1,60 @@ +/* +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.ios.streams.wtrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public abstract class Io_stream_wtr__base implements Io_stream_wtr { + public abstract byte Tid(); + public Io_url Url() {return url;} private Io_url url; + public Io_stream_wtr Url_(Io_url v) {url = v; return this;} + public void Trg_bfr_(Bry_bfr v) {this.trg_bfr = v;} private Bry_bfr trg_bfr; + public byte[] To_ary_and_clear() {return trg_bfr.To_bry_and_clear();} + + private java.io.OutputStream zip_stream; + private java.io.ByteArrayOutputStream mem_stream; + @Virtual public Io_stream_wtr Open() { + java.io.OutputStream bry_stream = null; + if (trg_bfr == null) { + if (!Io_mgr.Instance.ExistsFil(url)) Io_mgr.Instance.SaveFilStr(url, ""); + try {bry_stream = new java.io.FileOutputStream(url.Raw());} + catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} + } + else { + mem_stream = new java.io.ByteArrayOutputStream(); + bry_stream = mem_stream; + } + zip_stream = Wrap_stream(bry_stream); + return this; + } + public void Write(byte[] bry, int bgn, int len) { + try {zip_stream.write(bry, bgn, len);} + catch (Exception e) {Err_.new_exc(e, "io", "write failed", "bgn", bgn, "len", len);} + } + public void Flush() { + if (trg_bfr != null) { + try {zip_stream.close();} catch (Exception e) {throw Err_.new_exc(e, "io", "flush failed");} // must close zip_stream to flush all bytes + trg_bfr.Add(mem_stream.toByteArray()); + } + } + public void Rls() { + try { + if (zip_stream != null) zip_stream.close(); + if (mem_stream != null) mem_stream.close(); + } + catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Raw());} + } + @Virtual protected java.io.OutputStream Wrap_stream(java.io.OutputStream stream) {throw Err_.new_unimplemented();} + } diff --git a/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__bzip2.java b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__bzip2.java new file mode 100644 index 000000000..28659a25c --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__bzip2.java @@ -0,0 +1,25 @@ +/* +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.ios.streams.wtrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_wtr__bzip2 extends Io_stream_wtr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__bzip2;} + @Override public java.io.OutputStream Wrap_stream(java.io.OutputStream stream) { + try {return new org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream(stream);} + catch (Exception e) {throw Err_.new_exc(e, "io", "failed to open bzip2 stream");} + } + } diff --git a/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__gzip.java b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__gzip.java new file mode 100644 index 000000000..e6a846a6f --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__gzip.java @@ -0,0 +1,25 @@ +/* +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.ios.streams.wtrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_wtr__gzip extends Io_stream_wtr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__gzip;} + @Override public java.io.OutputStream Wrap_stream(java.io.OutputStream stream) { + try {return new java.util.zip.GZIPOutputStream(stream);} + catch (Exception e) {throw Err_.new_exc(e, "io", "failed to open gz stream");} + } + } diff --git a/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__raw.java b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__raw.java new file mode 100644 index 000000000..28e229e2b --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__raw.java @@ -0,0 +1,55 @@ +/* +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.ios.streams.wtrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_wtr__raw implements Io_stream_wtr { + public byte Tid() {return Io_stream_tid_.Tid__raw;} + public Io_url Url() {return url;} public Io_stream_wtr Url_(Io_url v) {url = v; return this;} private Io_url url; + public void Trg_bfr_(Bry_bfr v) {trg_bfr = v;} private Bry_bfr trg_bfr; + + private IoStream bry_stream; + @Override public Io_stream_wtr Open() { + try { + if (trg_bfr == null) + bry_stream = Io_mgr.Instance.OpenStreamWrite(url); + } + catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} + return this; + } + public void Write(byte[] bry, int bgn, int len) { + if (trg_bfr == null) { + try {bry_stream.Write(bry, bgn, len);} + catch (Exception e) {throw Err_.new_exc(e, "io", "write failed", "url", url.Raw(), "bgn", bgn, "len", len);} + } + else + trg_bfr.Add_mid(bry, bgn, bgn + len); + } + public byte[] To_ary_and_clear() { + return trg_bfr == null ? Io_mgr.Instance.LoadFilBry(url) : trg_bfr.To_bry_and_clear(); + } + public void Flush() { + if (trg_bfr == null) + bry_stream.Flush(); + } + public void Rls() { + try { + if (trg_bfr == null) + bry_stream.Rls(); + } + catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Raw());} + } + } diff --git a/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__xz.java b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__xz.java new file mode 100644 index 000000000..f623040ac --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__xz.java @@ -0,0 +1,25 @@ +/* +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.ios.streams.wtrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_wtr__xz extends Io_stream_wtr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__xz;} + @Override public java.io.OutputStream Wrap_stream(java.io.OutputStream stream) { + try {return new org.tukaani.xz.XZOutputStream(stream, new org.tukaani.xz.LZMA2Options(org.tukaani.xz.LZMA2Options.PRESET_DEFAULT));} + catch (Exception e) {throw Err_.new_exc(e, "io", "failed to open xz stream");} + } + } diff --git a/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__zip.java b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__zip.java new file mode 100644 index 000000000..cd6240a2d --- /dev/null +++ b/100_core/src/gplx/core/ios/streams/wtrs/Io_stream_wtr__zip.java @@ -0,0 +1,68 @@ +/* +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.ios.streams.wtrs; import gplx.*; import gplx.core.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; +public class Io_stream_wtr__zip extends Io_stream_wtr__base { + @Override public byte Tid() {return Io_stream_tid_.Tid__zip;} + private java.util.zip.ZipOutputStream zip_stream; + public Io_url Url() {return url;} public Io_stream_wtr Url_(Io_url v) {url = v; trg_bfr = null; return this;} private Io_url url = Io_url_.Empty; + public void Trg_bfr_(Bry_bfr v) {trg_bfr = v;} private Bry_bfr trg_bfr; private java.io.ByteArrayOutputStream mem_stream; + // rely on zip_stream to close bry_stream + @Override public Io_stream_wtr Open() { + java.io.OutputStream bry_stream; + if (trg_bfr == null) { + if (!Io_mgr.Instance.ExistsFil(url)) Io_mgr.Instance.SaveFilStr(url, ""); // create file if it doesn't exist + try {bry_stream = new java.io.FileOutputStream(url.Xto_api());} + catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} + } + else { + mem_stream = new java.io.ByteArrayOutputStream(); + bry_stream = mem_stream; + } + zip_stream = new java.util.zip.ZipOutputStream(bry_stream); + java.util.zip.ZipEntry entry = new java.util.zip.ZipEntry("file"); + try {zip_stream.putNextEntry(entry);} + catch (Exception e) {throw Err_.new_exc(e, "io", "open failed", "url", url.Raw());} + return this; + } + public void Write(byte[] bry, int bgn, int len) { + try {zip_stream.write(bry, bgn, len);} + catch (Exception e) {throw Err_.new_exc(e, "io", "write failed", "url", url.Raw(), "bgn", bgn, "len", len);} + } + public void Flush() {// fixed as of DATE:2014-04-15 + try { + zip_stream.closeEntry(); + zip_stream.close(); + if (trg_bfr != null) + trg_bfr.Add(mem_stream.toByteArray()); + zip_stream.flush(); + } + catch (Exception e) {throw Err_.new_exc(e, "io", "flush failed", "url", url.Raw());} + } + public void Rls() { + try { + if (zip_stream != null) zip_stream.close(); + if (mem_stream != null) mem_stream.close(); + } + catch (Exception e) {throw Err_.new_exc(e, "io", "close failed", "url", url.Raw());} + } + public byte[] To_ary_and_clear() { + byte[] rv = trg_bfr.To_bry_and_clear(); + this.Rls(); + return rv; + } + } diff --git a/140_dbs/src/gplx/core/stores/Db_data_rdr.java b/140_dbs/src/gplx/core/stores/Db_data_rdr.java index 6d870cc15..cf9a06b3a 100644 --- a/140_dbs/src/gplx/core/stores/Db_data_rdr.java +++ b/140_dbs/src/gplx/core/stores/Db_data_rdr.java @@ -54,7 +54,7 @@ public class Db_data_rdr extends DataRdr_base implements DataRdr { @Override public gplx.core.ios.streams.Io_stream_rdr ReadRdr(String key) { try { java.io.InputStream input_stream = rdr.getBinaryStream(key); - return gplx.core.ios.streams.Io_stream_rdr_.file_(input_stream); + return gplx.core.ios.streams.Io_stream_rdr_.New__raw(input_stream); } catch (SQLException e) {return gplx.core.ios.streams.Io_stream_rdr_.Noop;} } diff --git a/140_dbs/src/gplx/dbs/Db_sql_.java b/140_dbs/src/gplx/dbs/Db_sql_.java new file mode 100644 index 000000000..113f3463a --- /dev/null +++ b/140_dbs/src/gplx/dbs/Db_sql_.java @@ -0,0 +1,53 @@ +/* +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.dbs; import gplx.*; +public class Db_sql_ { + public static String Make_by_fmt(String[] lines, Object... args) { + Bry_bfr bfr = Bry_bfr_.New(); + int len = lines.length; + for (int i = 0; i < len; ++i) { + if (i != 0) bfr.Add_byte_nl(); + bfr.Add_str_u8(lines[i]); + } + String fmt = bfr.To_str_and_clear(); + return String_.Format(fmt, args); + } + public static byte[] Escape_arg(byte[] raw) { + int len = raw.length; + Bry_bfr bfr = null; + boolean dirty = false; + + for (int i = 0; i < len; ++i) { + byte b = raw[i]; + if (b == Byte_ascii.Apos) { + if (bfr == null) { + dirty = true; + bfr = Bry_bfr_.New(); + bfr.Add_mid(raw, 0, i); + } + bfr.Add_byte_apos().Add_byte_apos(); + } + else { + if (dirty) { + bfr.Add_byte(b); + } + } + } + return dirty ? bfr.To_bry_and_clear() : raw; + } +} diff --git a/400_xowa/.classpath b/400_xowa/.classpath index b48a48ee5..a5620aadc 100644 --- a/400_xowa/.classpath +++ b/400_xowa/.classpath @@ -7,6 +7,7 @@ + diff --git a/400_xowa/src/gplx/core/intls/ucas/Uca_collator.java b/400_xowa/src/gplx/core/intls/ucas/Uca_collator.java new file mode 100644 index 000000000..750aaff6d --- /dev/null +++ b/400_xowa/src/gplx/core/intls/ucas/Uca_collator.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.core.intls.ucas; import gplx.*; import gplx.core.*; import gplx.core.intls.*; +public interface Uca_collator { + void Init(String locale, boolean numeric_ordering); + byte[] Get_sortkey(String s); +} diff --git a/400_xowa/src/gplx/core/intls/ucas/Uca_collator_.java b/400_xowa/src/gplx/core/intls/ucas/Uca_collator_.java new file mode 100644 index 000000000..db24fbabe --- /dev/null +++ b/400_xowa/src/gplx/core/intls/ucas/Uca_collator_.java @@ -0,0 +1,25 @@ +/* +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.intls.ucas; import gplx.*; import gplx.core.*; import gplx.core.intls.*; +public class Uca_collator_ { + public static Uca_collator New(String locale, boolean numeric_ordering) { + Uca_collator rv = new Uca_collator__icu__4_8(); + rv.Init(locale, numeric_ordering); + return rv; + } +} diff --git a/400_xowa/src/gplx/core/intls/ucas/Uca_collator__icu__4_8.java b/400_xowa/src/gplx/core/intls/ucas/Uca_collator__icu__4_8.java new file mode 100644 index 000000000..773bc7b1c --- /dev/null +++ b/400_xowa/src/gplx/core/intls/ucas/Uca_collator__icu__4_8.java @@ -0,0 +1,49 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.intls.ucas; import gplx.*; import gplx.core.*; import gplx.core.intls.*; +import java.util.Locale; +import com.ibm.icu.text.CollationKey; +import com.ibm.icu.text.Collator; +import com.ibm.icu.text.RuleBasedCollator; +class Uca_collator__icu__4_8 implements Uca_collator { + private Collator collator; + public void Init(String locale, boolean numeric_ordering) { + try { + this.collator = Collator.getInstance(Locale.forLanguageTag(locale)); + if (numeric_ordering) { + RuleBasedCollator rbc = (RuleBasedCollator)collator; + rbc.setNumericCollation(true); + } + } catch (Exception e) {throw Err_.new_wo_type("collator init failed", "err", Err_.Message_lang(e));} + } + public byte[] Get_sortkey(String s) { + CollationKey key = collator.getCollationKey(s); + byte[] src = key.toByteArray(); + int src_len = src.length; + byte[] rv = src; + + // remove last byte if it is 0 (which it often is) + if (src_len > 0 && src[src_len - 1] == 0) { + int rv_len = src_len - 1; + rv = new byte[rv_len]; + for (int i = 0; i < rv_len; ++i) + rv[i] = src[i]; + } + return rv; + } +} diff --git a/400_xowa/src/gplx/core/intls/ucas/Uca_ltr_extractor.java b/400_xowa/src/gplx/core/intls/ucas/Uca_ltr_extractor.java new file mode 100644 index 000000000..e3865a992 --- /dev/null +++ b/400_xowa/src/gplx/core/intls/ucas/Uca_ltr_extractor.java @@ -0,0 +1,51 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.core.intls.ucas; import gplx.*; import gplx.core.*; import gplx.core.intls.*; +public class Uca_ltr_extractor { + private final boolean numeric; + private final byte[] numeric_heading; + private final Hash_adp_bry numeric_hash; + public Uca_ltr_extractor(boolean numeric) { + this.numeric = numeric; + if (numeric) { + numeric_heading = Bry_.new_a7("0-9"); + + // create hash of "0", "1", "2", ... + numeric_hash = Hash_adp_bry.cs(); + for (int i = 0; i < 10; ++i) { + byte[] digit_bry = Bry_.new_by_int(Byte_ascii.Num_0 + i); + numeric_hash.Add(digit_bry, digit_bry); + } + } + else { + numeric_heading = null; + numeric_hash = null; + } + } + public byte[] Get_1st_ltr(byte[] bry) { + // NOTE: this is simplified and only does numeric logic; MW code loads up all ICU chars via first-letters-root.ser, adds custom chars, sorts them, and then does a binary search to find it; REF:IcuCollation.php!getFirstLetter + int bry_len = bry.length; + if (bry_len == 0) return Bry_.Empty; + byte[] rv = gplx.core.intls.Utf8_.Get_char_at_pos_as_bry(bry, 0); + if (numeric) { + if (numeric_hash.Has(rv)) + rv = numeric_heading; + } + return rv; + } +} diff --git a/400_xowa/src/gplx/core/ios/Io_buffer_rdr_tst.java b/400_xowa/src/gplx/core/ios/Io_buffer_rdr_tst.java index cd8479868..9e89f4db3 100644 --- a/400_xowa/src/gplx/core/ios/Io_buffer_rdr_tst.java +++ b/400_xowa/src/gplx/core/ios/Io_buffer_rdr_tst.java @@ -22,7 +22,7 @@ public class Io_buffer_rdr_tst { Io_mgr.Instance.InitEngine_mem(); fil = Io_url_.mem_fil_("mem/byteStreamRdr.txt"); ini_Write("0123456789"); - rdr = Io_buffer_rdr.new_(Io_stream_rdr_.file_(fil), 4); + rdr = Io_buffer_rdr.new_(Io_stream_rdr_.New__raw(fil), 4); } Io_buffer_rdr rdr; Io_url fil; @After public void teardown() {rdr.Rls();} @Test public void Bfr_load_all() { diff --git a/400_xowa/src/gplx/core/ios/Io_stream_rdr_process.java b/400_xowa/src/gplx/core/ios/Io_stream_rdr_process.java index bacc6d9f3..4e00c5d9f 100644 --- a/400_xowa/src/gplx/core/ios/Io_stream_rdr_process.java +++ b/400_xowa/src/gplx/core/ios/Io_stream_rdr_process.java @@ -23,7 +23,7 @@ public class Io_stream_rdr_process implements Io_stream_rdr { private InputStream stream_read; private String[] process_args; Io_stream_rdr_process(Io_url process_exe, Io_url stream_url, String[] process_args) {this.process_exe = process_exe; this.url = stream_url; this.process_args = process_args;} - public byte Tid() {return Io_stream_.Tid_bzip2;} // for now, classify as bzip2; not sure if separate tid is necessary + public byte Tid() {return Io_stream_tid_.Tid__bzip2;} // for now, classify as bzip2; not sure if separate tid is necessary public boolean Exists() {return this.Len() > 0;} public Io_url Url() {return url;} public Io_stream_rdr Url_(Io_url v) {url = v; return this;} private Io_url url; public long Len() {return len;} public Io_stream_rdr Len_(long v) {len = v; return this;} private long len; diff --git a/400_xowa/src/gplx/core/ios/Io_stream_zip_mgr.java b/400_xowa/src/gplx/core/ios/Io_stream_zip_mgr.java index ed6e8493c..06afda451 100644 --- a/400_xowa/src/gplx/core/ios/Io_stream_zip_mgr.java +++ b/400_xowa/src/gplx/core/ios/Io_stream_zip_mgr.java @@ -18,16 +18,16 @@ along with this program. If not, see . package gplx.core.ios; import gplx.*; import gplx.core.*; import gplx.core.ios.streams.*; public class Io_stream_zip_mgr { - private Io_stream_wtr wtr_gzip, wtr_zip, wtr_bzip2; + private Io_stream_wtr wtr__gzip, wtr__zip, wtr__bzip2, wtr__xz; public byte[] Zip(byte type, byte[] val) { - if (type == Io_stream_.Tid_raw) return val; + if (type == Io_stream_tid_.Tid__raw) return val; Io_stream_wtr wtr = Wtr(type); wtr.Write(val, 0, val.length); wtr.Flush(); return wtr.To_ary_and_clear(); } public byte[] Unzip(byte type, byte[] val) { - if (type == Io_stream_.Tid_raw) return val; + if (type == Io_stream_tid_.Tid__raw) return val; Io_stream_rdr rdr = Rdr(type); rdr.Open_mem(val); return Io_stream_rdr_.Load_all_as_bry(Bry_bfr_.New(), rdr); @@ -35,20 +35,22 @@ public class Io_stream_zip_mgr { private Io_stream_wtr Wtr(byte type) { Bry_bfr bfr = Bry_bfr_.New(); switch (type) { - case Io_stream_.Tid_gzip : if (wtr_gzip == null) wtr_gzip = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_gzip) ; return wtr_gzip.Open(); - case Io_stream_.Tid_zip : if (wtr_zip == null) wtr_zip = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_zip) ; return wtr_zip.Open(); - case Io_stream_.Tid_bzip2 : if (wtr_bzip2 == null) wtr_bzip2 = Io_stream_wtr_.new_by_mem(bfr, Io_stream_.Tid_bzip2) ; return wtr_bzip2.Open(); - case Io_stream_.Tid_raw : - default : throw Err_.new_unhandled(type); + case Io_stream_tid_.Tid__gzip: if (wtr__gzip == null) wtr__gzip = Io_stream_wtr_.New_by_mem(bfr, Io_stream_tid_.Tid__gzip); return wtr__gzip.Open(); + case Io_stream_tid_.Tid__zip: if (wtr__zip == null) wtr__zip = Io_stream_wtr_.New_by_mem(bfr, Io_stream_tid_.Tid__zip); return wtr__zip.Open(); + case Io_stream_tid_.Tid__bzip2: if (wtr__bzip2 == null) wtr__bzip2 = Io_stream_wtr_.New_by_mem(bfr, Io_stream_tid_.Tid__bzip2); return wtr__bzip2.Open(); + case Io_stream_tid_.Tid__xz: if (wtr__xz == null) wtr__xz = Io_stream_wtr_.New_by_mem(bfr, Io_stream_tid_.Tid__xz); return wtr__xz.Open(); + case Io_stream_tid_.Tid__raw: + default: throw Err_.new_unhandled(type); } } private Io_stream_rdr Rdr(byte type) { // TS.MEM: DATE:2016-07-12 switch (type) { - case Io_stream_.Tid_gzip : return Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_gzip); - case Io_stream_.Tid_zip : return Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_zip); - case Io_stream_.Tid_bzip2 : return Io_stream_rdr_.new_by_tid_(Io_stream_.Tid_bzip2); - case Io_stream_.Tid_raw : - default : throw Err_.new_unhandled(type); + case Io_stream_tid_.Tid__gzip: return Io_stream_rdr_.New_by_tid(Io_stream_tid_.Tid__gzip); + case Io_stream_tid_.Tid__zip: return Io_stream_rdr_.New_by_tid(Io_stream_tid_.Tid__zip); + case Io_stream_tid_.Tid__bzip2: return Io_stream_rdr_.New_by_tid(Io_stream_tid_.Tid__bzip2); + case Io_stream_tid_.Tid__xz: return Io_stream_rdr_.New_by_tid(Io_stream_tid_.Tid__xz); + case Io_stream_tid_.Tid__raw: + default: throw Err_.new_unhandled(type); } } } diff --git a/400_xowa/src/gplx/core/net/Gfo_url.java b/400_xowa/src/gplx/core/net/Gfo_url.java index 1cf8eb573..39915f1bc 100644 --- a/400_xowa/src/gplx/core/net/Gfo_url.java +++ b/400_xowa/src/gplx/core/net/Gfo_url.java @@ -18,22 +18,23 @@ along with this program. If not, see . package gplx.core.net; import gplx.*; import gplx.core.*; import gplx.core.net.qargs.*; public class Gfo_url { - public byte[] Raw() {return raw;} private byte[] raw; - public byte Protocol_tid() {return protocol_tid;} private byte protocol_tid; - public byte[] Protocol_bry() {return protocol_bry;} private byte[] protocol_bry; - public byte[] Anch() {return anch;} private byte[] anch; - public Gfo_qarg_itm[] Qargs() {return qargs;} private Gfo_qarg_itm[] qargs; - public byte[][] Segs() {return segs;} private byte[][] segs; private int segs__len; - public byte[] Segs__get_at(int i) {return i < segs__len ? segs[i] : null;} - public byte[] Segs__get_at_1st() {return segs__len > 0 ? segs[0] : null;} - public byte[] Segs__get_at_nth() {return segs__len > 1 ? segs[segs__len - 1] : null;} - public Gfo_url Ctor(byte[] raw, byte protocol_tid, byte[] protocol_bry, byte[][] segs, Gfo_qarg_itm[] qargs, byte[] anch) { + private final int segs__len; + public Gfo_url(byte[] raw, byte protocol_tid, byte[] protocol_bry, byte[][] segs, Gfo_qarg_itm[] qargs, byte[] anch) { this.raw = raw; this.protocol_tid = protocol_tid; this.protocol_bry = protocol_bry; this.segs = segs; this.segs__len = segs.length; this.qargs = qargs; this.anch = anch; - return this; } - public static final Gfo_url Empty = new Gfo_url().Ctor(Bry_.Empty, Gfo_protocol_itm.Tid_unknown, Bry_.Empty, Bry_.Ary_empty, null, null); + public byte[] Raw() {return raw;} private final byte[] raw; + public byte Protocol_tid() {return protocol_tid;} private final byte protocol_tid; + public byte[] Protocol_bry() {return protocol_bry;} private final byte[] protocol_bry; + public byte[] Anch() {return anch;} private final byte[] anch; + public Gfo_qarg_itm[] Qargs() {return qargs;} private final Gfo_qarg_itm[] qargs; + public byte[][] Segs() {return segs;} private final byte[][] segs; + public byte[] Segs__get_at(int i) {return i < segs__len ? segs[i] : null;} + public byte[] Segs__get_at_1st() {return segs__len > 0 ? segs[0] : null;} + public byte[] Segs__get_at_nth() {return segs__len > 1 ? segs[segs__len - 1] : null;} + + public static final Gfo_url Empty = new Gfo_url(Bry_.Empty, Gfo_protocol_itm.Tid_unknown, Bry_.Empty, Bry_.Ary_empty, null, null); } 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 9463c356b..e4edee6f6 100644 --- a/400_xowa/src/gplx/core/net/Gfo_url_parser.java +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser.java @@ -16,20 +16,21 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.core.net; import gplx.*; import gplx.core.*; -import gplx.core.primitives.*; import gplx.core.btries.*; +import gplx.core.btries.*; import gplx.core.net.qargs.*; +import gplx.langs.htmls.encoders.*; public class Gfo_url_parser { private final Btrie_slim_mgr protocols = Btrie_slim_mgr.ci_a7(); // ASCII:url_protocol; EX:"http:", "ftp:", etc - private final Bry_ary segs_ary = new Bry_ary(4), qargs = new Bry_ary(4); - private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(500); private final Btrie_rv trv = new Btrie_rv(); - public byte[] Relative_url_protocol_bry() {return Gfo_protocol_itm.Itm_https.Key_w_colon_bry();} // NOTE: https b/c any WMF wiki will now default to WMF; DATE:2015-07-26 + private final List_adp segs_list = List_adp_.New(), qargs_list = List_adp_.New(); + private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(500); public Gfo_url_parser() { Init_protocols(Gfo_protocol_itm.Ary()); Init_protocol_itm(Gfo_protocol_itm.Bry_relative, Gfo_protocol_itm.Tid_relative_1); Init_protocol_itm(Gfo_protocol_itm.Bry_file, Gfo_protocol_itm.Tid_file); Init_protocol_itm(gplx.xowa.parsers.lnkes.Xop_lnke_wkr.Bry_xowa_protocol, Gfo_protocol_itm.Tid_xowa); } + public byte[] Relative_url_protocol_bry() {return Gfo_protocol_itm.Itm_https.Key_w_colon_bry();} // NOTE: https b/c any WMF wiki will now default to WMF; DATE:2015-07-26 private void Init_protocols(Gfo_protocol_itm... itms) { int len = itms.length; for (int i = 0; i < len; i++) { @@ -37,9 +38,7 @@ public class Gfo_url_parser { Init_protocol_itm(itm.Key_w_colon_bry(), itm.Tid()); } } - public void Init_protocol_itm(byte[] key, byte protocol_tid) { - protocols.Add_bry_byte(key, protocol_tid); - } + public void Init_protocol_itm(byte[] key, byte protocol_tid) {protocols.Add_bry_byte(key, protocol_tid);} public void Parse_site_fast(Gfo_url_site_data site_data, byte[] src, int src_bgn, int src_end) { int pos = src_bgn; boolean rel = false; if (pos + 1 < src_end && src[pos] == Byte_ascii.Slash && src[pos + 1] == Byte_ascii.Slash) { // starts with "//" @@ -62,199 +61,126 @@ public class Gfo_url_parser { slash_pos = Bry_.Trim_end_pos(src, slash_pos); site_data.Atrs_set(rel, pos, slash_pos); } - private static final int Area__path = 1, Area__qarg_key_1st = 2, Area__qarg_key_nth = 3, Area__qarg_val = 4, Area__anch = 5; - private byte[] src; int src_bgn, src_end; - private int area; - private boolean encoded; - private byte protocol_tid; private byte[] protocol_bry, anch; - private int path_bgn, qarg_key_bgn, qarg_val_bgn, anch_bgn, anch_nth_bgn; - public Gfo_url Parse(byte[] src) {return Parse(new Gfo_url(), src, 0, src.length);} - public Gfo_url Parse(Gfo_url rv, byte[] src, int src_bgn, int src_end) { - this.src = src; this.src_bgn = src_bgn; this.src_end = src_end; - encoded = false; - protocol_tid = Gfo_protocol_itm.Tid_null; - protocol_bry = anch = null; - path_bgn = qarg_key_bgn = qarg_val_bgn = anch_bgn = anch_nth_bgn = -1; - segs_ary.Clear(); qargs.Clear(); - int pos = src_bgn; - Object protocol_obj = protocols.Match_at(trv, src, src_bgn, src_end); - pos = trv.Pos(); - pos = Bry_find_.Find_fwd_while(src, pos, src_end, Byte_ascii.Slash); - if (protocol_obj == null) { - this.protocol_tid = Gfo_protocol_itm.Tid_unknown; - } - else { - this.protocol_tid = ((Byte_obj_val)protocol_obj).Val(); - this.protocol_bry = Make_bry(src_bgn, pos); - } - area = Area__path; - path_bgn = pos; - while (true) { - if (pos == src_end) break; - byte b = src[pos]; + public Gfo_url Parse(byte[] src) {return Parse(src, 0, src.length);} + public Gfo_url Parse(byte[] src, int src_bgn, int src_end) { + // protocol + byte protocol_tid = protocols.Match_byte_or(trv, src, src_bgn, src_end, Gfo_protocol_itm.Tid_unknown); + int pos = Bry_find_.Find_fwd_while(src, trv.Pos(), src_end, Byte_ascii.Slash); // set pos after last slash; EX: "https://A" -> position before "A" + byte[] protocol_bry = protocol_tid == Gfo_protocol_itm.Tid_unknown + ? null + : Make_bry(false, src, src_bgn, pos); + + // loop chars and handle "/", "#", "?", and "%" + boolean encoded = false; + int src_zth = src_end - 1; + int anch_bgn = -1, qarg_bgn = -1, seg_bgn = pos; + for (int i = pos; i < src_end; ++i) { + byte b = src[i]; switch (b) { - case Byte_ascii.Slash: pos = Parse_slash(pos, b); break; - case Byte_ascii.Question: pos = Parse_qarg_key_1st(pos, b); break; - case Byte_ascii.Amp: pos = Parse_qarg_key_nth(pos, b); break; - case Byte_ascii.Eq: pos = Parse_qarg_val(pos, b); break; - case Byte_ascii.Hash: if (anch_bgn == -1) pos = Parse_anch(pos, b); else ++pos; break; // anchor begins at 1st #, not last #; EX:A#B#C has anchor of "B#C" not "C" PAGE:en.w:Grand_Central_Terminal; DATE:2015-12-31 - case Byte_ascii.Percent: encoded = true; ++pos; break; - default: - ++pos; + case Byte_ascii.Slash: + if (qarg_bgn == -1) { // ignore slash in qargs + segs_list.Add(Make_bry(encoded, src, seg_bgn, i)); + encoded = false; + seg_bgn = i + 1; // +1 to skip "/" + } + break; + case Byte_ascii.Hash: // set qarg to first #; also, ignore rest of String; EX: A#B#C -> B#C + if (i == src_zth) continue; // ignore # at EOS; EX: "A#" + anch_bgn = i; + i = src_end; + break; + case Byte_ascii.Question: // set qarg to last "?"; EX: A?B?C -> C + if (i == src_zth) continue; // ignore ? at EOS; EX: "A?" + qarg_bgn = i; + break; + case Byte_ascii.Percent: + encoded = true; break; } } - End_area(pos, Byte_ascii.Null); - rv.Ctor(src, protocol_tid, protocol_bry, segs_ary.To_ary(0), Make_qargs(), anch); - return rv; - } - private int Parse_slash(int pos, byte b) { - switch (area) { - case Area__path: return End_area(pos, b); - default: return pos + 1; + + int seg_end = src_end; // set seg_end to src_end; EX: "https://site/A" -> "A"; seg_end may be overriden if "#" or "?" exists + + // set anch + byte[] anch = null; + if (anch_bgn != -1) { + seg_end = anch_bgn; // set seg_end to anch_bgn; EX: "https://site/A#B" -> "A" x> "A#B" + anch = Make_bry(encoded, src, anch_bgn + 1, src_end); // +1 to skip "#" } - } - private int Parse_anch(int pos, byte b) { - switch (area) { - case Area__path: - End_area(pos, b); - area = Area__anch; - anch_bgn = pos + 1; - break; - case Area__anch: // handle double; A#B#C -> "A#B", "C" - Append_to_last_path(Byte_ascii.Hash, Make_bry(anch_bgn, pos)); - anch_bgn = pos + 1; - break; - case Area__qarg_val: - case Area__qarg_key_1st: - case Area__qarg_key_nth: - if (anch_nth_bgn == -1) - anch_nth_bgn = Bry_find_.Find_bwd(src, Byte_ascii.Hash, src_end); - if (pos == anch_nth_bgn) { - End_area(pos, b); - area = Area__anch; - anch_bgn = pos + 1; - } - break; - default: - break; + + // set qargs + Gfo_qarg_itm[] qarg_ary = Gfo_qarg_itm.Ary_empty; + if (qarg_bgn != -1) { + int qarg_end = anch_bgn == -1 + ? src_end // # missing; set to src_end; EX: "A?B=C" -> EOS + : anch_bgn; // # exists; set to anch_bgn; EX: "A?B=C#D" -> # + qarg_ary = Make_qarg_ary(src, qarg_bgn, qarg_end); + seg_end = qarg_ary.length == 0 + ? src_end // set seg_end to src_end if pseudo qarg; EX: "https://site/A?B" -> "A?B" x> "A" + : qarg_bgn; // set seg_end to qarg_bgn; EX: "https://site/A?B=C" -> "A" x> "A#B"; NOTE: overrides anch; "A?B=C#D" -> "A" } - return pos + 1; + + // extract seg_end; note that there will always be a seg_end; if src ends with slash, then it will be ""; EX: "A/" -> "A", "" + segs_list.Add(Make_bry(encoded, src, seg_bgn, seg_end)); + + // build url and return it + return new Gfo_url(src, protocol_tid, protocol_bry, (byte[][])segs_list.To_ary_and_clear(byte[].class), qarg_ary, anch); } - private int Parse_qarg_key_1st(int pos, byte b) { - switch (area) { - case Area__path: // only valid way to start qarg; EX: A?B=C - End_area(pos, b); - area = Area__qarg_key_1st; - qarg_key_bgn = pos + 1; - break; - case Area__qarg_key_1st: // handle dupe; EX: A?B?C - case Area__qarg_key_nth: // handle dupe; EX: A?B=C&D? - case Area__qarg_val: // handle dupe; EX: A?B=? - End_area(pos, b); - Append_to_last_path__qargs(); - area = Area__qarg_key_1st; - qarg_key_bgn = pos + 1; - break; + private Gfo_qarg_itm[] Make_qarg_ary(byte[] src, int qarg_bgn, int qarg_end) { + // init + int key_bgn = qarg_bgn + 1; // +1 to skip "?" + byte[] key_bry = null; + int val_bgn = -1; + boolean encoded = false; + + // loop qarg for "&", "=", "%" + int qarg_pos = qarg_bgn; + while (true) { + boolean b_is_last = qarg_pos == qarg_end; + byte b = b_is_last ? Byte_ascii.Null : src[qarg_pos]; + boolean make_qarg = false; + switch (b) { + case Byte_ascii.Amp: // "&" always makes qarg + make_qarg = true; + break; + case Byte_ascii.Null: // "EOS" makes qarg as long as "=" seen or at least one qarg; specifically, "A?B" shouldn't make qarg + if ( val_bgn != -1 // "=" seen; EX: "?A=B" + || qargs_list.Count() > 0) // at least one qarg exists; EX: "?A=B&C" + make_qarg = true; + break; + case Byte_ascii.Eq: + key_bry = Make_bry(encoded, src, key_bgn, qarg_pos); + encoded = false; + val_bgn = qarg_pos + 1; + break; + case Byte_ascii.Percent: + encoded = true; + break; + } + + // make qarg + if (make_qarg) { + byte[] val_bry = null; + if (key_bry == null) // key missing; EX: "&A" -> "A,null" + key_bry = Make_bry(encoded, src, key_bgn, qarg_pos); + else // key exists; EX: "&A=B" -> "A,B" + val_bry = Make_bry(encoded, src, val_bgn, qarg_pos); + encoded = false; + qargs_list.Add(new Gfo_qarg_itm(key_bry, val_bry)); + + // reset vars + key_bry = null; + key_bgn = qarg_pos + 1; + val_bgn = -1; + } + if (b_is_last) break; + ++qarg_pos; } - return pos + 1; - } - private int Parse_qarg_key_nth(int pos, byte b) { - switch (area) { - case Area__path: // ignore if qarg not started; EX: A&B - break; - case Area__qarg_key_1st: // handle invalid; A?B&C - case Area__qarg_key_nth: // handle invalid; A?B=C&D&E=F - End_area(pos, b); - qargs.Add(null); - area = Area__qarg_key_nth; - qarg_key_bgn = pos + 1; - break; - case Area__qarg_val: - End_area(pos, b); - area = Area__qarg_key_nth; - qarg_key_bgn = pos + 1; - break; - } - return pos + 1; - } - private int Parse_qarg_val(int pos, byte b) { - switch (area) { - case Area__qarg_key_1st: - case Area__qarg_key_nth: - End_area(pos, b); break; - default: break; - } - return pos + 1; - } - private int End_area(int pos, byte b) { - switch (area) { - case Area__path: - segs_ary.Add(Make_bry(path_bgn, pos)); - path_bgn = pos + 1; - break; - case Area__qarg_key_1st: - case Area__qarg_key_nth: - if (b == Byte_ascii.Null && qargs.Len() == 0) // handle A?b but not A?b=c&d - Append_to_last_path(Byte_ascii.Question, Make_bry(qarg_key_bgn, src_end)); - else { - qargs.Add(Make_bry(qarg_key_bgn, pos)); - qarg_val_bgn = pos + 1; - area = Area__qarg_val; - } - break; - case Area__qarg_val: - qargs.Add(Make_bry(qarg_val_bgn, pos)); - qarg_key_bgn = pos + 1; - qarg_val_bgn = -1; - area = Area__qarg_key_nth; - break; - case Area__anch: - if (b == Byte_ascii.Null && anch_bgn == src_end) // handle A# but not "A#B" - Append_to_last_path(Byte_ascii.Hash, Make_bry(anch_bgn, src_end)); - else - anch = Make_bry(anch_bgn, pos); - break; - default: - break; - } - encoded = false; - return pos + 1; - } - private byte[] Make_bry(int bgn, int end) { - return encoded ? gplx.langs.htmls.encoders.Gfo_url_encoder_.Xourl.Decode(tmp_bfr, Bool_.N, src, bgn, end).To_bry_and_clear() : Bry_.Mid(src, bgn, end); - } - private Gfo_qarg_itm[] Make_qargs() { - int qargs_len = qargs.Len(); if (qargs_len == 0) return Gfo_qarg_itm.Ary_empty; - if (qargs_len % 2 == 1) ++qargs_len; // handle odd qargs; EX: ?A=B&C&D=E - Gfo_qarg_itm[] rv = new Gfo_qarg_itm[qargs_len / 2]; - for (int i = 0; i < qargs_len; i += 2) { - byte[] key = qargs.Get_at(i); - int val_idx = i + 1; - byte[] val = val_idx < qargs_len ? qargs.Get_at(val_idx) : null; - rv[i / 2] = new Gfo_qarg_itm(key, val); - } - return rv; - } - private void Append_to_last_path(byte b, byte[] append) { - byte[] last_path = segs_ary.Get_at_last(); if (last_path == null) return; - last_path = Bry_.Add_w_dlm(b, last_path, append); - segs_ary.Set_at_last(last_path); - } - private void Append_to_last_path__qargs() { - byte[] last_path = segs_ary.Get_at_last(); if (last_path == null) return; - tmp_bfr.Add(last_path); - int len = qargs.Len(); - if (len % 2 == 1) qargs.Add(null); // handle odd qargs - for (int i = 0; i < len; i += 2) { - tmp_bfr.Add_byte(i == 0 ? Byte_ascii.Question : Byte_ascii.Amp); - tmp_bfr.Add(qargs.Get_at(i)); - byte[] qarg_val = qargs.Get_at(i + 1); - if (qarg_val != null) // handle "null" added above - tmp_bfr.Add_byte_eq().Add(qarg_val); - } - qargs.Clear(); - segs_ary.Set_at_last(tmp_bfr.To_bry_and_clear()); + return (Gfo_qarg_itm[])qargs_list.To_ary_and_clear(Gfo_qarg_itm.class); + } + private byte[] Make_bry(boolean encoded, byte[] src, int bgn, int end) { + return encoded ? Gfo_url_encoder_.Xourl.Decode(tmp_bfr, Bool_.N, src, bgn, end).To_bry_and_clear() : Bry_.Mid(src, bgn, end); } + public static final byte[] Bry_double_slash = new byte[] {Byte_ascii.Slash, Byte_ascii.Slash}; } diff --git a/400_xowa/src/gplx/core/net/Gfo_url_parser_fxt.java b/400_xowa/src/gplx/core/net/Gfo_url_parser_fxt.java index 0af251c54..034b3d92e 100644 --- a/400_xowa/src/gplx/core/net/Gfo_url_parser_fxt.java +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser_fxt.java @@ -20,15 +20,19 @@ import gplx.core.net.qargs.*; class Gfo_url_parser_fxt { private final Gfo_url_parser parser = new Gfo_url_parser(); private Gfo_url actl; - public Gfo_url_parser_fxt Chk_protocol_tid(byte v) {Tfds.Eq_byte(v, actl.Protocol_tid(), "protocol_tid"); return this;} - public Gfo_url_parser_fxt Chk_protocol_bry(String v) {Tfds.Eq_str(v, actl.Protocol_bry(), "protocol_bry"); return this;} - public Gfo_url_parser_fxt Chk_site(String v) {Tfds.Eq_str(v, actl.Segs__get_at_1st(), "site"); return this;} - public Gfo_url_parser_fxt Chk_page(String v) {Tfds.Eq_str(v, actl.Segs__get_at_nth(), "page"); return this;} - public Gfo_url_parser_fxt Chk_anch(String v) {Tfds.Eq_str(v, actl.Anch(), "anch"); return this;} - public Gfo_url_parser_fxt Chk_segs(String... ary) {Tfds.Eq_int(ary.length, actl.Segs().length, "segs_len"); Tfds.Eq_str_lines(String_.Concat_lines_nl(ary), String_.Concat_lines_nl(String_.Ary(actl.Segs())), "segs"); return this;} - public Gfo_url_parser_fxt Chk_qargs(String... ary) {Tfds.Eq_str_lines(String_.To_str__as_kv_ary(ary), Gfo_qarg_itm.To_str(actl.Qargs()), "qargs"); return this;} - public Gfo_url_parser_fxt Run_parse(String v) { - this.actl = parser.Parse(Bry_.new_u8(v)); + public Gfo_url_parser_fxt Test__protocol_tid(byte v) {Tfds.Eq_byte(v, actl.Protocol_tid(), "protocol_tid"); return this;} + public Gfo_url_parser_fxt Test__protocol_bry(String v) {Tfds.Eq_str(v, actl.Protocol_bry(), "protocol_bry"); return this;} + public Gfo_url_parser_fxt Test__site(String v) {Tfds.Eq_str(v, actl.Segs__get_at_1st(), "site"); return this;} + public Gfo_url_parser_fxt Test__page(String v) {Tfds.Eq_str(v, actl.Segs__get_at_nth(), "page"); return this;} + public Gfo_url_parser_fxt Test__anch(String v) {Tfds.Eq_str(v, actl.Anch(), "anch"); return this;} + public Gfo_url_parser_fxt Test__segs(String... ary) { + Tfds.Eq_str_lines(String_.Concat_lines_nl(ary), String_.Concat_lines_nl(String_.Ary(actl.Segs())), "segs"); + Tfds.Eq_int(ary.length, actl.Segs().length, "segs_len"); + return this; + } + public Gfo_url_parser_fxt Test__qargs(String... ary) {Tfds.Eq_str_lines(String_.To_str__as_kv_ary(ary), Qargs__To_str(actl.Qargs()), "qargs"); return this;} + public Gfo_url_parser_fxt Exec__parse(String v) { + this.actl = parser.Parse(Bry_.new_u8(v), 0, String_.Len(v)); return this; } public void Test_Parse_site_fast(String raw, String expd) { @@ -37,4 +41,16 @@ class Gfo_url_parser_fxt { String actl = String_.new_u8(raw_bry, site_data.Site_bgn(), site_data.Site_end()); Tfds.Eq(expd, actl); } private final Gfo_url_site_data site_data = new Gfo_url_site_data(); + private static String Qargs__To_str(Gfo_qarg_itm[] ary) { + int len = ary.length; + Bry_bfr bfr = Bry_bfr_.New(); + for (int i = 0; i < len; ++i) { + Gfo_qarg_itm itm = ary[i]; + bfr.Add(itm.Key_bry()).Add_byte_eq(); + if (itm.Val_bry() != null) + bfr.Add(itm.Val_bry()); + bfr.Add_byte_nl(); + } + return bfr.To_str_and_clear(); + } } diff --git a/400_xowa/src/gplx/core/net/Gfo_url_parser_tst.java b/400_xowa/src/gplx/core/net/Gfo_url_parser_tst.java index 33eb2073a..f5e508a2e 100644 --- a/400_xowa/src/gplx/core/net/Gfo_url_parser_tst.java +++ b/400_xowa/src/gplx/core/net/Gfo_url_parser_tst.java @@ -18,102 +18,102 @@ along with this program. If not, see . package gplx.core.net; import gplx.*; import gplx.core.*; import org.junit.*; public class Gfo_url_parser_tst { - private final Gfo_url_parser_fxt tstr = new Gfo_url_parser_fxt(); + private final Gfo_url_parser_fxt tstr = new Gfo_url_parser_fxt(); @Test public void Protocol__relative() { - tstr.Run_parse("//en.wikipedia.org").Chk_protocol_tid(Gfo_protocol_itm.Tid_relative_1).Chk_protocol_bry("//").Chk_site("en.wikipedia.org"); + tstr.Exec__parse("//en.wikipedia.org").Test__protocol_tid(Gfo_protocol_itm.Tid_relative_1).Test__protocol_bry("//").Test__site("en.wikipedia.org"); } @Test public void Protocol__none() { - tstr.Run_parse("en.wikipedia.org/wiki/A").Chk_protocol_tid(Gfo_protocol_itm.Tid_unknown).Chk_segs("en.wikipedia.org", "wiki", "A"); + tstr.Exec__parse("en.wikipedia.org/wiki/A").Test__protocol_tid(Gfo_protocol_itm.Tid_unknown).Test__segs("en.wikipedia.org", "wiki", "A"); } @Test public void Site__parts__3() { - tstr.Run_parse("https://en.wikipedia.org").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_protocol_bry("https://").Chk_segs("en.wikipedia.org"); + tstr.Exec__parse("https://en.wikipedia.org").Test__protocol_tid(Gfo_protocol_itm.Tid_https).Test__protocol_bry("https://").Test__segs("en.wikipedia.org"); } @Test public void Site__parts__2() { - tstr.Run_parse("https://wikipedia.org").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_segs("wikipedia.org"); + tstr.Exec__parse("https://wikipedia.org").Test__protocol_tid(Gfo_protocol_itm.Tid_https).Test__segs("wikipedia.org"); } @Test public void Site__parts__1() { - tstr.Run_parse("https://wikipedia").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_segs("wikipedia"); + tstr.Exec__parse("https://wikipedia").Test__protocol_tid(Gfo_protocol_itm.Tid_https).Test__segs("wikipedia"); } @Test public void Site__slash__none() { - tstr.Run_parse("https:site").Chk_protocol_tid(Gfo_protocol_itm.Tid_https).Chk_site("site"); + tstr.Exec__parse("https:site").Test__protocol_tid(Gfo_protocol_itm.Tid_https).Test__site("site"); + } + @Test public void Site__slash__eos() { + tstr.Exec__parse("https://en.wikipedia.org/").Test__protocol_tid(Gfo_protocol_itm.Tid_https).Test__site("en.wikipedia.org"); } @Test public void Paths__1() { - tstr.Run_parse("https://site/A").Chk_segs("site", "A"); + tstr.Exec__parse("https://site/A").Test__segs("site", "A"); } @Test public void Paths__2() { - tstr.Run_parse("https://site/wiki/A").Chk_segs("site", "wiki", "A"); + tstr.Exec__parse("https://site/wiki/A").Test__segs("site", "wiki", "A"); } @Test public void Paths__n() { - tstr.Run_parse("https://site/wiki/A/B/C/D").Chk_segs("site", "wiki", "A", "B", "C", "D"); + tstr.Exec__parse("https://site/wiki/A/B/C/D").Test__segs("site", "wiki", "A", "B", "C", "D"); } @Test public void Qargs__1() { - tstr.Run_parse("https://site/A?B=C").Chk_page("A").Chk_qargs("B", "C"); + tstr.Exec__parse("https://site/A?B=C").Test__page("A").Test__qargs("B", "C"); } @Test public void Qargs__2() { - tstr.Run_parse("https://site/A?B=C&D=E").Chk_page("A").Chk_qargs("B", "C", "D", "E"); + tstr.Exec__parse("https://site/A?B=C&D=E").Test__page("A").Test__qargs("B", "C", "D", "E"); } @Test public void Qargs__3() { - tstr.Run_parse("https://site/A?B=C&D=E&F=G").Chk_page("A").Chk_qargs("B", "C", "D", "E", "F", "G"); + tstr.Exec__parse("https://site/A?B=C&D=E&F=G").Test__page("A").Test__qargs("B", "C", "D", "E", "F", "G"); } @Test public void Qargs__ques__dupe__ques() { - tstr.Run_parse("https://site/A?B?Y=Z").Chk_page("A?B").Chk_qargs("Y", "Z"); + tstr.Exec__parse("https://site/A?B?Y=Z").Test__page("A?B").Test__qargs("Y", "Z"); } @Test public void Qargs__ques__dupe__amp() { - tstr.Run_parse("https://site/A?B=C&D?Y=Z").Chk_page("A?B=C&D").Chk_qargs("Y", "Z"); + tstr.Exec__parse("https://site/A?B=C&D?Y=Z").Test__page("A?B=C&D").Test__qargs("Y", "Z"); } @Test public void Qargs__ques__dupe__eq() { - tstr.Run_parse("https://site/A?B=C?Y=Z").Chk_page("A?B=C").Chk_qargs("Y", "Z"); + tstr.Exec__parse("https://site/A?B=C?Y=Z").Test__page("A?B=C").Test__qargs("Y", "Z"); } @Test public void Qargs__amp__dupe__ques() { - tstr.Run_parse("https://site/A?B&Y=Z").Chk_page("A").Chk_qargs("B", null, "Y", "Z"); + tstr.Exec__parse("https://site/A?B&Y=Z").Test__page("A").Test__qargs("B", null, "Y", "Z"); } @Test public void Qargs__amp__dupe__amp() { - tstr.Run_parse("https://site/A?B=C&D&Y=Z").Chk_page("A").Chk_qargs("B", "C", "D", null, "Y", "Z"); + tstr.Exec__parse("https://site/A?B=C&D&Y=Z").Test__page("A").Test__qargs("B", "C", "D", null, "Y", "Z"); } @Test public void Qargs__missing_val__0() { - tstr.Run_parse("https://site/A?").Chk_page("A?").Chk_qargs(); + tstr.Exec__parse("https://site/A?").Test__page("A?").Test__qargs(); } @Test public void Qargs__missing_val__2() { - tstr.Run_parse("https://site/A?B=C&D&F=G").Chk_page("A").Chk_qargs("B", "C", "D", null, "F", "G"); + tstr.Exec__parse("https://site/A?B=C&D&F=G").Test__page("A").Test__qargs("B", "C", "D", null, "F", "G"); } @Test public void Qargs__missing_val__n() { - tstr.Run_parse("https://site/A?B=C&D=E&F").Chk_page("A").Chk_qargs("B", "C", "D", "E", "F", null); + tstr.Exec__parse("https://site/A?B=C&D=E&F").Test__page("A").Test__qargs("B", "C", "D", "E", "F", null); } @Test public void Qargs__site_less__missing__0() { - tstr.Run_parse("A?B").Chk_segs("A?B").Chk_qargs(); + tstr.Exec__parse("A?B").Test__segs("A?B").Test__qargs(); } @Test public void Qargs__site_less() { - tstr.Run_parse("A?B=C&D=E").Chk_site("A").Chk_qargs("B", "C", "D", "E"); + tstr.Exec__parse("A?B=C&D=E").Test__site("A").Test__qargs("B", "C", "D", "E"); } @Test public void Anch__basic() { - tstr.Run_parse("https://site/A#B").Chk_page("A").Chk_anch("B"); + tstr.Exec__parse("https://site/A#B").Test__page("A").Test__anch("B"); } @Test public void Anch__repeat__2() { - tstr.Run_parse("https://site/A#B#C").Chk_page("A").Chk_anch("B#C"); + tstr.Exec__parse("https://site/A#B#C").Test__page("A").Test__anch("B#C"); } @Test public void Anch__repeat__3() { - tstr.Run_parse("https://site/A#B#C#D").Chk_page("A").Chk_anch("B#C#D"); + tstr.Exec__parse("https://site/A#B#C#D").Test__page("A").Test__anch("B#C#D"); } @Test public void Anch__missing() { - tstr.Run_parse("https://site/A#").Chk_page("A#").Chk_anch(null); + tstr.Exec__parse("https://site/A#").Test__page("A#").Test__anch(null); } @Test public void Anch__missing__eos() { - tstr.Run_parse("https://site/A#B#").Chk_page("A").Chk_anch("B#"); + tstr.Exec__parse("https://site/A#B#").Test__page("A").Test__anch("B#"); } @Test public void Anch__qargs__basic() { - tstr.Run_parse("https://site/A?B=C&D=E#F").Chk_page("A").Chk_qargs("B", "C", "D", "E").Chk_anch("F"); - } - @Test public void Anch__qargs__repeat() { - tstr.Run_parse("https://site/A?B=C#&D=E#F").Chk_page("A").Chk_qargs("B", "C#", "D", "E").Chk_anch("F"); + tstr.Exec__parse("https://site/A?B=C&D=E#F").Test__page("A").Test__qargs("B", "C", "D", "E").Test__anch("F"); } @Test public void Anch__site_less() { - tstr.Run_parse("A#B").Chk_site("A").Chk_anch("B"); + tstr.Exec__parse("A#B").Test__site("A").Test__anch("B"); } @Test public void Encode__page() { - tstr.Run_parse("http://site/A%27s").Chk_site("site").Chk_page("A's"); + tstr.Exec__parse("http://site/A%27s").Test__site("site").Test__page("A's"); } @Test public void Protocol_less__qargs() { - tstr.Run_parse("Special:Search/Earth?fulltext=yes").Chk_segs("Special:Search", "Earth").Chk_page("Earth").Chk_qargs("fulltext", "yes"); + tstr.Exec__parse("Special:Search/Earth?fulltext=yes").Test__segs("Special:Search", "Earth").Test__page("Earth").Test__qargs("fulltext", "yes"); } @Test public void Parse_site_fast() { tstr.Test_Parse_site_fast("http://a.org/B" , "a.org"); @@ -121,4 +121,8 @@ public class Gfo_url_parser_tst { tstr.Test_Parse_site_fast("//a.org/B" , "a.org"); tstr.Test_Parse_site_fast("//a.org/B:C" , "a.org"); } + // DELETED: logic isn't right; anch is first # not last; EX: https://en.wikipedia.org/w/index.php?title=Category:2001_albums&pagefrom=Beautiful+#View#mw-pages; DATE:2016-10-10 + // @Test public void Anch__qargs__repeat() { + // tstr.Exec__parse("https://site/A?B=C#&D=E#F").Test__page("A").Test__qargs("B", "C#", "D", "E").Test__anch("F"); + // } } diff --git a/400_xowa/src/gplx/core/net/qargs/Gfo_qarg_itm.java b/400_xowa/src/gplx/core/net/qargs/Gfo_qarg_itm.java index f37b4f5d3..7448c9aef 100644 --- a/400_xowa/src/gplx/core/net/qargs/Gfo_qarg_itm.java +++ b/400_xowa/src/gplx/core/net/qargs/Gfo_qarg_itm.java @@ -17,35 +17,13 @@ along with this program. If not, see . */ package gplx.core.net.qargs; import gplx.*; import gplx.core.*; import gplx.core.net.*; public class Gfo_qarg_itm { - public Gfo_qarg_itm(byte[] key_bry, byte[] val_bry) {this.key_bry = key_bry; this.val_bry = val_bry;} - public byte[] Key_bry() {return key_bry;} private byte[] key_bry; - public byte[] Val_bry() {return val_bry;} private byte[] val_bry; - public Gfo_qarg_itm Val_bry_(byte[] v) {val_bry = v; return this;} + public Gfo_qarg_itm(byte[] key_bry, byte[] val_bry) { + this.key_bry = key_bry; + this.val_bry = val_bry; + } + public byte[] Key_bry() {return key_bry;} private final byte[] key_bry; + public byte[] Val_bry() {return val_bry;} private byte[] val_bry; + public void Val_bry_(byte[] v) {val_bry = v;} + public static final Gfo_qarg_itm[] Ary_empty = new Gfo_qarg_itm[0]; - public static Gfo_qarg_itm new_key_(String key) {return new Gfo_qarg_itm(Bry_.new_u8(key), Bry_.Empty);} - public static Gfo_qarg_itm[] Ary(String... kvs) { - int len = kvs.length; - Gfo_qarg_itm[] rv = new Gfo_qarg_itm[len / 2]; - String key = null; - for (int i = 0; i < len; ++i) { - String s = kvs[i]; - if (i % 2 == 0) - key = s; - else - rv[i / 2] = new Gfo_qarg_itm(Bry_.new_u8(key), Bry_.new_u8(s)); - } - return rv; - } - public static String To_str(Gfo_qarg_itm[] ary) { - int len = ary.length; - Bry_bfr bfr = Bry_bfr_.New(); - for (int i = 0; i < len; ++i) { - Gfo_qarg_itm itm = ary[i]; - bfr.Add(itm.Key_bry()).Add_byte_eq(); - if (itm.Val_bry() != null) - bfr.Add(itm.Val_bry()); - bfr.Add_byte_nl(); - } - return bfr.To_str_and_clear(); - } } 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 5c5b99ad5..c1219afb8 100644 --- a/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java +++ b/400_xowa/src/gplx/fsdb/data/Fsd_bin_tbl.java @@ -48,8 +48,7 @@ public class Fsd_bin_tbl implements Rls_able { stmt_insert = conn.Stmt_insert(tbl_name, flds); tmp_bfr = Bry_bfr_.Reset(Io_mgr.Len_kb); } - byte[] bin_ary = null; - bin_ary = Io_stream_rdr_.Load_all_as_bry(tmp_bfr, bin_rdr); + byte[] bin_ary = Io_stream_rdr_.Load_all_as_bry(tmp_bfr, bin_rdr); stmt_insert.Clear() .Val_int(fld_owner_id, id) .Val_byte(fld_owner_tid, tid) @@ -62,7 +61,7 @@ public class Fsd_bin_tbl implements Rls_able { byte[] rv = Select(owner_id, null); return rv == null ? Io_stream_rdr_.Noop - : Io_stream_rdr_.mem_(rv); + : Io_stream_rdr_.New__mem(rv); } public boolean Select_to_url(int owner_id, Io_url url) { saved_in_parts.Val_n(); diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 22708aa20..b719318ee 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -32,7 +32,7 @@ public class Xoa_app_ { } } public static final String Name = "xowa"; - public static final String Version = "3.9.4.1"; + public static final String Version = "3.9.4.4"; 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_app_fxt.java b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java index 7f2fb6f43..30913fe34 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_fxt.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_fxt.java @@ -36,7 +36,7 @@ public class Xoa_app_fxt { Io_url user_dir = root_dir.GenSubDir_nest("user", "test_user"); Gfo_usr_dlg__log_base.Instance.Log_dir_(user_dir.GenSubDir_nest("tmp", "current")); Xoae_app app = new Xoae_app(Gfo_usr_dlg_.Test(), Xoa_app_mode.Itm_cmd, root_dir, root_dir.GenSubDir("wiki"), root_dir.GenSubDir("file"), user_dir, root_dir.GenSubDir_nest("user", "anonymous", "wiki"), op_sys); - app.Setup_mgr().Dump_mgr().Data_storage_format_(gplx.core.ios.streams.Io_stream_.Tid_raw); // TEST: set data_storage_format to file, else bldr tests will fails (expects plain text) + app.Setup_mgr().Dump_mgr().Data_storage_format_(gplx.core.ios.streams.Io_stream_tid_.Tid__raw); // TEST: set data_storage_format to file, else bldr tests will fails (expects plain text) GfsCore.Instance.Clear(); // NOTE: must clear GfsCore.Instance.AddCmd(app, Xoae_app.Invk_app); // NOTE: must add app to GfsCore; app.Gfs_mgr() always adds current app to GfsCore; note this causes old test to leave behind GfsCore for new test GfsCore.Instance.AddCmd(app, Xoae_app.Invk_xowa); // add alias for app; DATE:2014-06-09 diff --git a/400_xowa/src/gplx/xowa/Xoa_url.java b/400_xowa/src/gplx/xowa/Xoa_url.java index 730b7ea2c..ffb5fd21a 100644 --- a/400_xowa/src/gplx/xowa/Xoa_url.java +++ b/400_xowa/src/gplx/xowa/Xoa_url.java @@ -21,6 +21,7 @@ import gplx.xowa.htmls.hrefs.*; public class Xoa_url { public int Tid() {return tid;} private int tid; public byte[] Raw() {return raw;} private byte[] raw = Bry_.Empty; + public byte[] Orig() {return orig;} private byte[] orig; public byte[] Wiki_bry() {return wiki_bry;} public Xoa_url Wiki_bry_(byte[] v) {wiki_bry = v; return this;} private byte[] wiki_bry; public byte[] Page_bry() {return page_bry;} public Xoa_url Page_bry_(byte[] v) {page_bry = v; return this;} private byte[] page_bry; public byte[] Anch_bry() {return anch_bry;} public Xoa_url Anch_bry_(byte[] v) {anch_bry = v; return this;} private byte[] anch_bry; @@ -35,10 +36,10 @@ public class Xoa_url { public boolean Wiki_is_missing() {return wiki_is_missing;} private boolean wiki_is_missing; public boolean Wiki_is_same() {return wiki_is_same;} private boolean wiki_is_same; public boolean Page_is_main() {return page_is_main;} private boolean page_is_main; - public Xoa_url Ctor(int tid, byte[] raw, byte protocol_tid, byte[] protocol_bry, boolean protocol_is_relative + public Xoa_url Ctor(int tid, byte[] orig, byte[] raw, byte protocol_tid, byte[] protocol_bry, boolean protocol_is_relative , byte[] wiki, byte[] page, Gfo_qarg_itm[] qargs, byte[] anch , byte[][] segs_ary, byte[] vnt_bry, boolean wiki_is_missing, boolean wiki_is_same, boolean page_is_main) { - this.tid = tid; this.raw = raw; + this.tid = tid; this.orig = orig; this.raw = raw; this.protocol_tid = protocol_tid; this.protocol_bry = protocol_bry; this.protocol_is_relative = protocol_is_relative; this.wiki_bry = wiki; this.page_bry = page; this.qargs_ary = qargs; this.anch_bry = anch; this.segs_ary = segs_ary; this.vnt_bry = vnt_bry; @@ -92,21 +93,16 @@ public class Xoa_url { if (tid_is_anch) page = null; } - byte[] rv = Bry_.Add - ( wiki, wiki_spr // add wiki_key; EX: "en.wikipedia.org", "/wiki/" - , page // add page; EX: "A" - , anch_spr, anch // add anch EX: "#", "B" - ); + + Bry_bfr bfr = Bry_bfr_.New(); + bfr.Add_safe(wiki).Add_safe(wiki_spr); // add wiki_key; EX: "en.wikipedia.org", "/wiki/" + bfr.Add_safe(page); // add page; EX: "A" if (show_qargs || qargs_ary.length > 0) { - Bry_bfr bfr = Bry_bfr_.New(); - try { - bfr.Add(rv); - Gfo_qarg_mgr_old.Concat_bfr(bfr, gplx.langs.htmls.encoders.Gfo_url_encoder_.Href, qargs_ary); - return bfr.To_bry_and_clear(); - } finally {bfr.Mkr_rls();} + Gfo_qarg_mgr_old.Concat_bfr(bfr, gplx.langs.htmls.encoders.Gfo_url_encoder_.Href, qargs_ary); } - else - return rv; + if (anch != null) // NOTE: anch must go last (after qargs); DATE:2016-10-08 + bfr.Add(anch_spr).Add(anch); // add anch EX: "#", "B" + return bfr.To_bry_and_clear(); } public static final Xoa_url Null = null; public static Xoa_url blank() {return new Xoa_url();} diff --git a/400_xowa/src/gplx/xowa/Xow_wiki.java b/400_xowa/src/gplx/xowa/Xow_wiki.java index 32bf5a0fb..b1093c5e9 100644 --- a/400_xowa/src/gplx/xowa/Xow_wiki.java +++ b/400_xowa/src/gplx/xowa/Xow_wiki.java @@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.ios.*; import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.cases.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.metas.*; import gplx.xowa.wikis.data.site_stats.*; import gplx.xowa.wikis.ttls.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.addons.*; import gplx.xowa.files.*; import gplx.xowa.files.repos.*; import gplx.xowa.files.origs.*; import gplx.xowa.files.bins.*; import gplx.fsdb.meta.*; import gplx.fsdb.*; -import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.bridges.dbuis.tbls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; +import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.utls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.bridges.dbuis.tbls.*; import gplx.xowa.htmls.hrefs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.parsers.*; import gplx.xowa.apps.urls.*; public interface Xow_wiki extends Xow_ttl_parser, Gfo_invk { @@ -46,7 +46,8 @@ public interface Xow_wiki extends Xow_ttl_parser, Gfo_invk { Xoh_page_wtr_mgr Html__wtr_mgr(); Xoh_href_wtr Html__href_wtr(); Xoh_lnki_bldr Html__lnki_bldr(); - Xoctg_pagebox_wtr Html__ctg_pagebox_wtr(); + Xoctg_pagebox_wtr Ctg__pagebox_wtr(); + Xoctg_catpage_mgr Ctg__catpage_mgr(); boolean Html__css_installing(); void Html__css_installing_(boolean v); Xow_msg_mgr Msg_mgr(); byte[] Wtxt__expand_tmpl(byte[] src); diff --git a/400_xowa/src/gplx/xowa/Xowe_wiki.java b/400_xowa/src/gplx/xowa/Xowe_wiki.java index 628d5f49b..7108e1f1d 100644 --- a/400_xowa/src/gplx/xowa/Xowe_wiki.java +++ b/400_xowa/src/gplx/xowa/Xowe_wiki.java @@ -29,7 +29,7 @@ import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.guis.cbks.*; import gplx.xowa.guis.views.*; import gplx.xowa.xtns.gallery.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.wikis.tdbs.*; import gplx.xowa.wikis.tdbs.hives.*; -import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.htmls.css.mgrs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; +import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.htmls.css.mgrs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm { private boolean init_in_process = false; public Xowe_wiki(Xoae_app app, Xol_lang_itm lang, Xow_ns_mgr ns_mgr, Xow_domain_itm domain_itm, Io_url wiki_dir) { @@ -78,6 +78,7 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm { cache_mgr = new Xow_cache_mgr(this); /*if (Bry_.Eq(domain_bry, Xow_domain_itm_.Bry__home))*/ xwiki_mgr.Add_by_atrs(domain_bry, domain_bry); // add full name to xwiki_mgr; needed for lookup in home ns; EX: [[home:Help/Contents]] this.lnki_bldr = new Xoh_lnki_bldr(app, href_wtr); + this.ctg_catpage_mgr = new Xoctg_catpage_mgr(this); } public Gfo_evt_mgr Evt_mgr() {return ev_mgr;} private final Gfo_evt_mgr ev_mgr; public Xow_ns_mgr Ns_mgr() {return ns_mgr;} private final Xow_ns_mgr ns_mgr; @@ -105,7 +106,8 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm { public Xoh_page_wtr_mgr Html__wtr_mgr() {return html_mgr.Page_wtr_mgr();} public Xoh_lnki_bldr Html__lnki_bldr() {return lnki_bldr;} private final Xoh_lnki_bldr lnki_bldr; public Xoh_href_wtr Html__href_wtr() {return href_wtr;} private final Xoh_href_wtr href_wtr = new Xoh_href_wtr(); - public Xoctg_pagebox_wtr Html__ctg_pagebox_wtr() {return ctg_pagebox_wtr;} private final Xoctg_pagebox_wtr ctg_pagebox_wtr = new Xoctg_pagebox_wtr(); + public Xoctg_pagebox_wtr Ctg__pagebox_wtr() {return ctg_pagebox_wtr;} private final Xoctg_pagebox_wtr ctg_pagebox_wtr = new Xoctg_pagebox_wtr(); + public Xoctg_catpage_mgr Ctg__catpage_mgr() {return ctg_catpage_mgr;} private final Xoctg_catpage_mgr ctg_catpage_mgr; public boolean Html__css_installing() {return html__css_installing;} public void Html__css_installing_(boolean v) {html__css_installing = v;} private boolean html__css_installing; public Xow_url_parser Utl__url_parser() {return url__parser;} private final Xow_url_parser url__parser; public Xow_mw_parser_mgr Mw_parser_mgr() {return mw_parser_mgr;} private final Xow_mw_parser_mgr mw_parser_mgr = new Xow_mw_parser_mgr(); @@ -266,6 +268,7 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm { else if (ctx.Match(k, Invk_maint)) return maint_mgr; else if (ctx.Match(k, Invk_domain)) return domain_str; else if (ctx.Match(k, Invk_xtns)) return xtn_mgr; + else if (ctx.Match(k, Invk_catpage_mgr)) return ctg_catpage_mgr; else if (ctx.Match(k, Invk_hdump_enabled_)) this.html_mgr__hdump_enabled = m.ReadYn("v"); else if (ctx.Match(k, gplx.xowa.apps.apis.xowa.wikis.langs.Xoap_lang_variants.Evt_current_changed)) lang.Vnt_mgr().Cur_itm_(m.ReadBry("v")); else return Gfo_invk_.Rv_unhandled; @@ -280,6 +283,7 @@ public class Xowe_wiki implements Xow_wiki, Gfo_invk, Gfo_evt_itm { , Invk_xtns = "xtns", Invk_import_mgr = "import" , Invk_db_mgr_to_sql_ = "db_mgr_to_sql_" , Invk_domain = "domain", Invk_maint = "maint", Invk_hdump_enabled_ = "hdump_enabled_" + , Invk_catpage_mgr = "catpage_mgr" ; public static final String Invk_db_mgr = "db_mgr"; // SERIALIZED:000.sqlite3|xowa_cfg public static final String Invk_lang_ = "lang_"; diff --git a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xoac_wiki_cfg_bldr_cmd.java b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xoac_wiki_cfg_bldr_cmd.java similarity index 90% rename from 400_xowa/src/gplx/xowa/bldrs/cfgs/Xoac_wiki_cfg_bldr_cmd.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xoac_wiki_cfg_bldr_cmd.java index fe7f0f5d7..64c13dba9 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xoac_wiki_cfg_bldr_cmd.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xoac_wiki_cfg_bldr_cmd.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.xowa.bldrs.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.addons.bldrs.app_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.core.strings.*; public class Xoac_wiki_cfg_bldr_cmd { public Xoac_wiki_cfg_bldr_cmd(String key, String text) {this.key = key; this.text = text;} diff --git a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xoac_wiki_cfg_bldr_fil.java b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xoac_wiki_cfg_bldr_fil.java similarity index 90% rename from 400_xowa/src/gplx/xowa/bldrs/cfgs/Xoac_wiki_cfg_bldr_fil.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xoac_wiki_cfg_bldr_fil.java index db61bde34..ca42425c0 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xoac_wiki_cfg_bldr_fil.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xoac_wiki_cfg_bldr_fil.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.xowa.bldrs.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.addons.bldrs.app_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; public class Xoac_wiki_cfg_bldr_fil implements Gfo_invk { public Xoac_wiki_cfg_bldr_fil(String wiki) {this.wiki = wiki;} public String Wiki() {return wiki;} private String wiki; diff --git a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr.java b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xob_wiki_cfg_bldr.java similarity index 91% rename from 400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xob_wiki_cfg_bldr.java index 26028ad51..93a3cd013 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xob_wiki_cfg_bldr.java @@ -15,8 +15,9 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.bldrs.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.addons.bldrs.app_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.core.strings.*; +import gplx.xowa.bldrs.*; public class Xob_wiki_cfg_bldr implements Gfo_invk { public Xob_wiki_cfg_bldr(Xob_bldr bldr) {this.app = bldr.App();} private Xoae_app app; public void Exec() { diff --git a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xob_wiki_cfg_bldr_tst.java similarity index 95% rename from 400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java rename to 400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xob_wiki_cfg_bldr_tst.java index fffa42568..319f3a208 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cfgs/Xob_wiki_cfg_bldr_tst.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/Xob_wiki_cfg_bldr_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.xowa.bldrs.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; +package gplx.xowa.addons.bldrs.app_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import org.junit.*; import gplx.core.strings.*; public class Xob_wiki_cfg_bldr_tst { Xob_wiki_cfg_bldr_fxt fxt = new Xob_wiki_cfg_bldr_fxt(); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/wm_server_cfgs/Xowm_server_cfg_cmd.java b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/wm_server_cfgs/Xowm_server_cfg_cmd.java new file mode 100644 index 000000000..924270d46 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/wm_server_cfgs/Xowm_server_cfg_cmd.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.xowa.addons.bldrs.app_cfgs.wm_server_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.app_cfgs.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; +public class Xowm_server_cfg_cmd extends Xob_cmd__base { + public Xowm_server_cfg_cmd(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + @Override public void Cmd_run() { +// wiki.Init_assert(); +// mgr.Exec(wiki); + } + + public static final String BLDR_CMD_KEY = "cfg.wikis.wm_server_cfg"; + @Override public String Cmd_key() {return BLDR_CMD_KEY;} + public static final Xob_cmd Prototype = new Xowm_server_cfg_cmd(null, null); + @Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xowm_server_cfg_cmd(bldr, wiki);} +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/wm_server_cfgs/Xowm_server_cfg_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/wm_server_cfgs/Xowm_server_cfg_mgr.java new file mode 100644 index 000000000..e1e29d425 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/app_cfgs/wm_server_cfgs/Xowm_server_cfg_mgr.java @@ -0,0 +1,36 @@ +/* +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.addons.bldrs.app_cfgs.wm_server_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.app_cfgs.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; +public class Xowm_server_cfg_mgr { + public void Exec() { + byte[] src = Load_or_download(); + Parse_cat_collation(src); + } + private byte[] Load_or_download() { + // Io_mgr.Instance.DownloadFil_args("", Io_url_.NullPtr).Exec_as_bry("https://noc.wikimedia.org/conf/InitialiseSettings.php.txt"); + return null; + } + private void Parse_cat_collation(byte[] src) { + int bgn_pos = Bry_find_.Find_fwd(src, Bry_.new_a7("wgCategoryCollation")); + if (bgn_pos == Bry_find_.Not_found) throw Err_.new_wo_type("could not find wgCategoryCollation bgn"); + int end_pos = Bry_find_.Find_fwd(src, Bry_.new_a7("],")); + if (end_pos == Bry_find_.Not_found) throw Err_.new_wo_type("could not find wgCategoryCollation end"); + Tfds.Write(src, bgn_pos, end_pos); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/Xobc_data_db.java b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/Xobc_data_db.java index 3538efd55..92541278d 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/Xobc_data_db.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/Xobc_data_db.java @@ -54,4 +54,8 @@ public class Xobc_data_db { tbl__import_step.Delete(step_id); } } + + public static Xobc_data_db New(gplx.xowa.apps.fsys.Xoa_fsys_mgr fsys_mgr) { + return new Xobc_data_db(fsys_mgr.Bin_addon_dir().GenSubFil_nest("bldr", "central", "bldr_central.data_db.xowa")); + } } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/Xobc_task_regy_itm.java b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/Xobc_task_regy_itm.java new file mode 100644 index 000000000..510fa2840 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/Xobc_task_regy_itm.java @@ -0,0 +1,32 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.bldrs.centrals.dbs.datas; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.centrals.*; import gplx.xowa.addons.bldrs.centrals.dbs.*; +public class Xobc_task_regy_itm { + public Xobc_task_regy_itm(int id, int seqn, byte[] key, byte[] name, int step_count) { + this.id = id; + this.seqn = seqn; + this.key = key; + this.name = name; + this.step_count = step_count; + } + public int Id() {return id;} private final int id; + public int Seqn() {return seqn;} private final int seqn; + public byte[] Key() {return key;} private final byte[] key; + public byte[] Name() {return name;} private final byte[] name; + public int Step_count() {return step_count;} private final int step_count; +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/Xobc_task_regy_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/Xobc_task_regy_tbl.java index 2c774df52..786e23660 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/Xobc_task_regy_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/Xobc_task_regy_tbl.java @@ -67,6 +67,28 @@ public class Xobc_task_regy_tbl implements Db_tbl { .Val_str(fld_task_key, task_key).Val_str(fld_task_name, task_name) .Exec_insert(); } + public Xobc_task_regy_itm[] Select_by_wiki(byte[] wiki_domain) { + String sql = Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT *" + , "FROM task_regy" + , "WHERE task_key LIKE '{0}%'" + , "AND task_seqn != 999999" + ), wiki_domain); + List_adp list = List_adp_.New(); + Db_rdr rdr = conn.Stmt_sql(sql).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + list.Add(new Xobc_task_regy_itm + ( rdr.Read_int("task_id") + , rdr.Read_int("task_seqn") + , rdr.Read_bry_by_str("task_key") + , rdr.Read_bry_by_str("task_name") + , rdr.Read_int("step_count") + )); + } + } finally {rdr.Rls();} + return (Xobc_task_regy_itm[])list.To_ary_and_clear(Xobc_task_regy_itm.class); + } public void Delete(int task_id) { conn.Stmt_delete(tbl_name, fld_task_id).Crt_int(fld_task_id, task_id).Exec_delete(); } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/imports/Xobc_import_step_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/imports/Xobc_import_step_tbl.java index b8aabe3db..cc46caf7c 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/imports/Xobc_import_step_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/centrals/dbs/datas/imports/Xobc_import_step_tbl.java @@ -44,20 +44,7 @@ public class Xobc_import_step_tbl implements Db_tbl { Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld_step_id).Crt_int(fld_step_id, step_id).Exec_select__rls_auto(); try { return (rdr.Move_next()) - ? new Xobc_import_step_itm - ( rdr.Read_int(fld_step_id) - , rdr.Read_int(fld_host_id) - , rdr.Read_bry_by_str(fld_wiki_abrv) - , rdr.Read_str(fld_wiki_date) - , rdr.Read_str(fld_import_name) - , rdr.Read_int(fld_import_type) - , rdr.Read_byte(fld_import_zip) - , rdr.Read_long(fld_import_size_zip) - , rdr.Read_long(fld_import_size_raw) - , rdr.Read_str(fld_import_md5) - , rdr.Read_long(fld_prog_size_end) - , rdr.Read_int(fld_prog_count_end) - ) + ? New_itm(rdr) : Xobc_import_step_itm.Null; } finally {rdr.Rls();} @@ -95,7 +82,39 @@ public class Xobc_import_step_tbl implements Db_tbl { } } finally {rdr.Rls();} } + public Xobc_import_step_itm[] Select_by_task_id(int task_id) { + List_adp list = List_adp_.New(); + Db_rdr rdr = conn.Stmt_sql(Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT s.*" + , "FROM import_step s" + , " JOIN step_map sm ON s.step_id = sm.step_id" + , "WHERE sm.task_id = {0}" + ), task_id)) + .Exec_select__rls_auto(); + try { + while (rdr.Move_next()) { + list.Add(New_itm(rdr)); + } + } finally {rdr.Rls();} + return (Xobc_import_step_itm[])list.To_ary_and_clear(Xobc_import_step_itm.class); + } public void Rls() { insert_stmt = Db_stmt_.Rls(insert_stmt); } + private Xobc_import_step_itm New_itm(Db_rdr rdr) { + return new Xobc_import_step_itm + ( rdr.Read_int(fld_step_id) + , rdr.Read_int(fld_host_id) + , rdr.Read_bry_by_str(fld_wiki_abrv) + , rdr.Read_str(fld_wiki_date) + , rdr.Read_str(fld_import_name) + , rdr.Read_int(fld_import_type) + , rdr.Read_byte(fld_import_zip) + , rdr.Read_long(fld_import_size_zip) + , rdr.Read_long(fld_import_size_raw) + , rdr.Read_str(fld_import_md5) + , rdr.Read_long(fld_prog_size_end) + , rdr.Read_int(fld_prog_count_end) + ); + } } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/files/Pack_file_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/files/Pack_file_mgr.java index 42227f192..4697e9cb8 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/files/Pack_file_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/files/Pack_file_mgr.java @@ -19,7 +19,7 @@ package gplx.xowa.addons.bldrs.exports.packs.files; import gplx.*; import gplx.x import gplx.core.progs.*; import gplx.core.ios.zips.*; import gplx.core.ios.streams.*; import gplx.core.security.*; import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.addons.bldrs.centrals.dbs.*; import gplx.xowa.addons.bldrs.centrals.dbs.datas.*; import gplx.xowa.addons.bldrs.centrals.dbs.datas.imports.*; import gplx.xowa.addons.bldrs.centrals.steps.*; import gplx.xowa.addons.bldrs.centrals.hosts.*; -class Pack_file_mgr { +public class Pack_file_mgr { public void Exec(Xowe_wiki wiki, Pack_file_bldr_cfg cfg) { // init wiki.Init_assert(); @@ -31,7 +31,7 @@ class Pack_file_mgr { // get import_tbl byte[] wiki_abrv = wiki.Domain_itm().Abrv_xo(); - Xobc_data_db bc_db = new Xobc_data_db(wiki.App().Fsys_mgr().Bin_addon_dir().GenSubFil_nest("bldr", "central", "bldr_central.data_db.xowa")); + Xobc_data_db bc_db = Xobc_data_db.New(wiki.App().Fsys_mgr()); Db_conn bc_conn = bc_db.Conn(); bc_db.Delete_by_import(wiki_abrv, wiki_date); bc_conn.Txn_bgn("xobc_import_insert"); @@ -93,7 +93,7 @@ class Pack_file_mgr { int pack_list_len = pack_list.Len(); // create task - String task_key = wiki.Domain_str() + "|" + wiki_date + "|" + task_type; + String task_key = Task_key__build(wiki.Domain_str(), wiki_date, task_type); String task_name = Build_task_name(tmp_bfr, wiki, wiki_date, task_type, raw_len); Xobc_task_regy_tbl task_regy_tbl = bc_db.Tbl__task_regy(); int task_id = bc_db.Conn().Sys_mgr().Autonum_next("task_regy.task_id"); @@ -161,6 +161,12 @@ class Pack_file_mgr { bc_db.Tbl__step_regy().Insert(step_id, Xobc_step_itm.Type__wiki_import); bc_db.Tbl__import_step().Insert(step_id, gplx.xowa.addons.bldrs.centrals.dbs.datas.Xobc_host_regy_tbl.Host_id__archive_org, wiki_abrv, wiki_date, zip_url.NameAndExt(), itm.Tid(), Xobc_zip_type.Type__zip, zip_md5, zip_len, raw_size, 0, 0); } + private static String Task_key__build(String wiki_domain, String wiki_date, String task_type) { + return String_.Concat(wiki_domain, "|", wiki_date, "|", task_type); + } + public static String[] Task_key__parse(String task_key) { + return String_.Split(task_key, "|"); + } } class Pack_hash_bldr { public static Pack_hash Bld(Xow_wiki wiki, Io_url wiki_dir, Io_url pack_dir, String wiki_date, boolean pack_html, boolean pack_file, DateAdp pack_file_cutoff, boolean pack_fsdb_delete) { diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/splits/Pack_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/splits/Pack_mgr.java index bc3ac2889..67d6ad161 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/splits/Pack_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/exports/packs/splits/Pack_mgr.java @@ -33,7 +33,7 @@ class Pack_mgr { // get import_tbl byte[] wiki_abrv = wiki.Domain_itm().Abrv_xo(); - Xobc_data_db bc_db = new Xobc_data_db(wiki.App().Fsys_mgr().Bin_addon_dir().GenSubFil_nest("bldr", "central", "bldr_central.data_db.xowa")); + Xobc_data_db bc_db = Xobc_data_db.New(wiki.App().Fsys_mgr()); Db_conn bc_conn = bc_db.Conn(); bc_db.Delete_by_import(wiki_abrv, wiki_date); bc_conn.Txn_bgn("xobc_import_insert"); diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/Xoax_builds_files_addon.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/Xoax_builds_files_addon.java index 684b40e84..9f1f056ee 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/files/Xoax_builds_files_addon.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/Xoax_builds_files_addon.java @@ -19,6 +19,8 @@ package gplx.xowa.addons.bldrs.files; import gplx.*; import gplx.xowa.*; import import gplx.xowa.bldrs.wkrs.*; import gplx.xowa.addons.bldrs.files.cmds.*; import gplx.xowa.addons.bldrs.mass_parses.inits.*; import gplx.xowa.addons.bldrs.mass_parses.parses.*; import gplx.xowa.addons.bldrs.mass_parses.makes.*; +import gplx.xowa.addons.bldrs.files.cksums.*; +import gplx.xowa.addons.bldrs.app_cfgs.wm_server_cfgs.*; public class Xoax_builds_files_addon implements Xoax_addon_itm, Xoax_addon_itm__bldr { public Xob_cmd[] Bldr_cmds() { return new Xob_cmd[] @@ -43,6 +45,9 @@ public class Xoax_builds_files_addon implements Xoax_addon_itm, Xoax_addon_itm__ , Xomp_init_cmd.Prototype , Xomp_parse_cmd.Prototype , Xomp_make_cmd.Prototype + , Xocksum_calc_cmd.Prototype + + , Xowm_server_cfg_cmd.Prototype }; } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/Xocksum_calc_cmd.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/Xocksum_calc_cmd.java new file mode 100644 index 000000000..5038f4122 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/Xocksum_calc_cmd.java @@ -0,0 +1,30 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.bldrs.files.cksums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.files.*; +import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wkrs.*; +public class Xocksum_calc_cmd extends Xob_cmd__base { + public Xocksum_calc_cmd(Xob_bldr bldr, Xowe_wiki wiki) {super(bldr, wiki);} + @Override public void Cmd_run() { + wiki.Init_assert(); + new Xocksum_calc_mgr().Exec(wiki); + } + + @Override public String Cmd_key() {return BLDR_CMD_KEY;} private static final String BLDR_CMD_KEY = "fsdb.cksums.calc"; + public static final Xob_cmd Prototype = new Xocksum_calc_cmd(null, null); + @Override public Xob_cmd Cmd_clone(Xob_bldr bldr, Xowe_wiki wiki) {return new Xocksum_calc_cmd(bldr, wiki);} +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/Xocksum_calc_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/Xocksum_calc_mgr.java new file mode 100644 index 000000000..0783d4f96 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/Xocksum_calc_mgr.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.addons.bldrs.files.cksums; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.files.*; +import gplx.core.ios.streams.*; import gplx.core.security.*; +import gplx.dbs.*; import gplx.xowa.addons.bldrs.files.cksums.dbs.*; +import gplx.xowa.files.*; import gplx.fsdb.*; import gplx.fsdb.data.*; +public class Xocksum_calc_mgr { + public void Exec(Xowe_wiki wiki) { + // get conn variables + Xocksum_cksum_db db = Xocksum_cksum_db.Get(wiki); + Db_conn conn = db.Conn(); + Xocksum_cksum_tbl tbl = db.Tbl__cksum(); + conn.Meta_tbl_assert(tbl); + + // insert missing items + tbl.Insert_missing(); + tbl.Create_idx(); + + // get updates + int count = 0; + Hash_algo md5_algo = Hash_algo_.New__md5(); + List_adp updates = List_adp_.New(); + String cur_date = Datetime_now.Get().XtoStr_gplx(); + Db_stmt select_stmt = tbl.Select_samples_stmt(10000); + while (true) { + // get cksum_rows + Xocksum_cksum_row[] rows = tbl.Select_samples(select_stmt); + + // loop cksum_rows and (a) get bin_data; (b) if md5 diff, then add to updates + int len = rows.length; if (len == 0) break; + for (int i = 0; i < len; ++i) { + Xocksum_cksum_row row = rows[i]; + byte[] bin_bry = Get_bin(wiki, row); + if (bin_bry == null) { + Gfo_usr_dlg_.Instance.Prog_many("", "", "null; fil_id=~{0} thm_id=~{1}", row.Fil_id(), row.Thm_id()); + bin_bry = Bry_.Empty; + } + row.Bin_size_(bin_bry.length); + byte[] md5 = md5_algo.Hash_bry_as_bry(bin_bry); + if (!Bry_.Eq(md5, row.Cksum_val())) { + row.Cksum_val_(md5); + updates.Add(row); + } + } + + // run updates + conn.Txn_bgn("cksum_update"); + len = updates.Len(); + for (int i = 0; i < len; ++i) { + Xocksum_cksum_row row = (Xocksum_cksum_row)updates.Get_at(i); + tbl.Update(row.Fil_id(), row.Thm_id(), row.Bin_db_id(), row.Bin_size(), row.Cksum_tid(), 0, row.Cksum_val(), cur_date); + if (++count % 2000 == 0) Gfo_usr_dlg_.Instance.Prog_many("", "", "updating; rows=~{0}", count); + } + updates.Clear(); + conn.Txn_end(); + } + select_stmt.Rls(); + } + private byte[] Get_bin(Xowe_wiki wiki, Xocksum_cksum_row row) { + int bin_id = row.Thm_id() == -1 ? row.Fil_id() : row.Thm_id(); + Fsd_bin_itm bin_itm = wiki.File__mnt_mgr().Mnts__get_main().Bin_mgr().Dbs__get_at(row.Bin_db_id()).Select_as_itm(bin_id); + return bin_itm.Bin_data(); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_db.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_db.java new file mode 100644 index 000000000..c8c0695db --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_db.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.xowa.addons.bldrs.files.cksums.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.files.*; import gplx.xowa.addons.bldrs.files.cksums.*; +import gplx.dbs.*; import gplx.fsdb.meta.*; +public class Xocksum_cksum_db { + public Xocksum_cksum_db(Db_conn conn) { + this.conn = conn; + this.tbl__cksum = new Xocksum_cksum_tbl(conn); + } + public Db_conn Conn() {return conn;} private final Db_conn conn; + public Xocksum_cksum_tbl Tbl__cksum() {return tbl__cksum;} private final Xocksum_cksum_tbl tbl__cksum; + + public static Xocksum_cksum_db Get(Xowe_wiki wiki) { + return new Xocksum_cksum_db(wiki.File__fsdb_core().File__abc_file__at(Fsm_mnt_mgr.Mnt_idx_main).Conn()); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_row.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_row.java new file mode 100644 index 000000000..008289979 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_row.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.addons.bldrs.files.cksums.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.files.*; import gplx.xowa.addons.bldrs.files.cksums.*; +public class Xocksum_cksum_row { + public Xocksum_cksum_row(int fil_id, int thm_id, int bin_db_id, long bin_size, byte cksum_tid, int cksum_count, byte[] cksum_val, String cksum_date) { + this.fil_id = fil_id; + this.thm_id = thm_id; + this.bin_db_id = bin_db_id; + this.bin_size = bin_size; + this.cksum_tid = cksum_tid; + this.cksum_count = cksum_count; + this.cksum_val = cksum_val; + this.cksum_date = cksum_date; + } + public int Fil_id() {return fil_id;} private final int fil_id; + public int Thm_id() {return thm_id;} private final int thm_id; + public int Bin_db_id() {return bin_db_id;} private final int bin_db_id; + public long Bin_size() {return bin_size;} private long bin_size; + public byte Cksum_tid() {return cksum_tid;} private final byte cksum_tid; + public int Cksum_count() {return cksum_count;} private final int cksum_count; + public byte[] Cksum_val() {return cksum_val;} private byte[] cksum_val; + public String Cksum_date() {return cksum_date;} private final String cksum_date; + + public void Bin_size_(long v) {this.bin_size = v;} + public void Cksum_val_(byte[] v) {this.cksum_val = v;} +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_tbl.java b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_tbl.java new file mode 100644 index 000000000..0824468ac --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/bldrs/files/cksums/dbs/Xocksum_cksum_tbl.java @@ -0,0 +1,107 @@ +/* +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.addons.bldrs.files.cksums.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.files.*; import gplx.xowa.addons.bldrs.files.cksums.*; +import gplx.dbs.*; import gplx.dbs.qrys.*; import gplx.xowa.addons.wikis.ctgs.*; +public class Xocksum_cksum_tbl implements Db_tbl { + private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); + private final String fld__fil_id, fld__thm_id, fld__bin_db_id, fld__bin_len, fld__cksum_tid, fld__cksum_count, fld__cksum_val, fld__cksum_date; + private Db_stmt stmt__update; + public Xocksum_cksum_tbl(Db_conn conn) { + this.conn = conn; + this.tbl_name = "fsdb_cksum"; + this.fld__fil_id = flds.Add_int("fil_id"); + this.fld__thm_id = flds.Add_int("thm_id"); + this.fld__bin_db_id = flds.Add_int("bin_db_id"); + this.fld__bin_len = flds.Add_long("bin_size"); + this.fld__cksum_tid = flds.Add_byte("cksum_tid"); + this.fld__cksum_count = flds.Add_int("cksum_count"); + this.fld__cksum_val = flds.Add_str("cksum_val", 255); + this.fld__cksum_date = flds.Add_str("cksum_date", 16); + conn.Rls_reg(this); + } + public Db_conn Conn() {return conn;} private final Db_conn conn; + public String Tbl_name() {return tbl_name;} private final String tbl_name; + public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} + public void Create_idx() { + conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "fil_id__thm_id", fld__fil_id, fld__thm_id)); + conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, fld__cksum_val, fld__cksum_val)); + } + public void Insert_missing() { + // insert from fsdb_fil + conn.Exec_sql(Db_sql_.Make_by_fmt(String_.Ary + ( "INSERT INTO fsdb_cksum (fil_id, thm_id, bin_db_id, bin_size, cksum_tid, cksum_count, cksum_val, cksum_date)" + , "SELECT f.fil_id, -1, f.fil_bin_db_id, f.fil_size, {0}, 0, '', ''" + , "FROM fsdb_fil f" + , " LEFT JOIN fsdb_cksum c ON c.fil_id = f.fil_id AND c.thm_id = -1" + , "WHERE c.fil_id IS NULL" + , "AND f.fil_bin_db_id != -1" + ), Cksum_tid__md5)); + + // insert from fsdb_fil + conn.Exec_sql(Db_sql_.Make_by_fmt(String_.Ary + ( "INSERT INTO fsdb_cksum (fil_id, thm_id, bin_db_id, bin_size, cksum_tid, cksum_count, cksum_val, cksum_date)" + , "SELECT t.thm_owner_id, t.thm_id, t.thm_bin_db_id, t.thm_size, {0}, 0, '', ''" + , "FROM fsdb_thm t" + , " LEFT JOIN fsdb_cksum c ON c.fil_id = t.thm_owner_id AND c.thm_id = t.thm_id" + , "WHERE c.fil_id IS NULL" + ), Cksum_tid__md5)); + } + public Db_stmt Select_samples_stmt(int count) { + return conn.Stmt_sql(Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT *" + , "FROM fsdb_cksum" + , "WHERE cksum_val = ''" + // , "ORDER BY cksum_count, cksum_date" + , "LIMIT {0}" + ), count)); + } + public Xocksum_cksum_row[] Select_samples(Db_stmt stmt) { + List_adp rv = List_adp_.New(); + + Db_rdr rdr = stmt.Exec_select__rls_manual(); + try { + while (rdr.Move_next()) { + rv.Add(new Xocksum_cksum_row + ( rdr.Read_int("fil_id") + , rdr.Read_int("thm_id") + , rdr.Read_int("bin_db_id") + , rdr.Read_long("bin_size") + , rdr.Read_byte("cksum_tid") + , rdr.Read_int("cksum_count") + , rdr.Read_bry_by_str("cksum_val") + , rdr.Read_str("cksum_date") + )); + } + } finally {rdr.Rls();} + + return (Xocksum_cksum_row[])rv.To_ary_and_clear(Xocksum_cksum_row.class); + } + public void Update(int fil_id, int thm_id, int bin_db_id, long bin_size, byte cksum_tid, int cksum_count, byte[] cksum_val, String cksum_date) { + if (stmt__update == null) stmt__update = conn.Stmt_update_exclude(tbl_name, flds, fld__fil_id, fld__thm_id); + stmt__update.Clear() + .Val_int(fld__bin_db_id, bin_db_id).Val_long(fld__bin_len, bin_size) + .Val_byte(fld__cksum_tid, cksum_tid).Val_int(fld__cksum_count, cksum_count) + .Val_bry_as_str(fld__cksum_val, cksum_val).Val_str(fld__cksum_date, cksum_date) + .Crt_int(fld__fil_id, fil_id).Crt_int(fld__thm_id, thm_id) + .Exec_update(); + } + public void Rls() { + this.stmt__update = Db_stmt_.Rls(stmt__update); + } + public static final byte Cksum_tid__md5 = 1; +} diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Hdump_html_loader.java b/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Hdump_html_loader.java index c2f954548..d9b4a355f 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Hdump_html_loader.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/hdumps/diffs/Hdump_html_loader.java @@ -39,7 +39,7 @@ class Hdump_html_loader { html_db.Tbl__html().Select_by_page(tmp_hpg); // unzip it - byte[] html_hzip = stream_zip_mgr.Unzip(Io_stream_.Tid_gzip, tmp_hpg.Db().Html().Html_bry()); + byte[] html_hzip = stream_zip_mgr.Unzip(Io_stream_tid_.Tid__gzip, tmp_hpg.Db().Html().Html_bry()); return wiki.Html__hdump_mgr().Load_mgr().Decode_as_bry(tmp_bfr, tmp_hpg, html_hzip, true); } } diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_parse_mgr_cfg.java b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_parse_mgr_cfg.java index 9deb3d4d2..8ca80fdd0 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_parse_mgr_cfg.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/mass_parses/parses/mgrs/Xomp_parse_mgr_cfg.java @@ -31,7 +31,7 @@ public class Xomp_parse_mgr_cfg implements Gfo_invk { public boolean Log_file_lnkis() {return log_file_lnkis;} private boolean log_file_lnkis = true; public boolean Load_all_templates() {return load_all_templates;} private boolean load_all_templates = true; public boolean Load_all_imglnks() {return load_all_imglnks;} private boolean load_all_imglnks = true; - public byte Zip_tid() {return zip_tid;} private byte zip_tid = Io_stream_.Tid_gzip; + public byte Zip_tid() {return zip_tid;} private byte zip_tid = Io_stream_tid_.Tid__gzip; public Io_url Mgr_url() {return mgr_url;} private Io_url mgr_url; public String Wkr_machine_name() {return wkr_machine_name;} private String wkr_machine_name; public boolean Show_msg__fetched_pool() {return show_msg__fetched_pool;} private boolean show_msg__fetched_pool; diff --git a/400_xowa/src/gplx/xowa/addons/bldrs/updates/files/Xodel_make_mgr.java b/400_xowa/src/gplx/xowa/addons/bldrs/updates/files/Xodel_make_mgr.java index 4162f062e..c5a4a1620 100644 --- a/400_xowa/src/gplx/xowa/addons/bldrs/updates/files/Xodel_make_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/bldrs/updates/files/Xodel_make_mgr.java @@ -32,7 +32,7 @@ class Xodel_make_mgr { , "FROM xfer_regy xr" , "WHERE xr.lnki_ttl = fsdb_regy.fsdb_name" , "AND xr.file_is_orig = fsdb_regy.fsdb_is_orig" - , "AND xr.orig_repo = fsdb_regy.fsdb_repo" + // , "AND xr.orig_repo = fsdb_regy.fsdb_repo" // TOMBSTONE: do no reinstate; some images exist in both repos, and this will delete images from one repo; DATE:2016-09-28 , "AND xr.file_w = fsdb_regy.fsdb_w" , "AND xr.lnki_time = fsdb_regy.fsdb_time" , "AND xr.lnki_page = fsdb_regy.fsdb_page" diff --git a/400_xowa/src/gplx/xowa/addons/htmls/includes/Script_engine__java.java b/400_xowa/src/gplx/xowa/addons/htmls/includes/Script_engine__java.java new file mode 100644 index 000000000..c6e5ece58 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/htmls/includes/Script_engine__java.java @@ -0,0 +1,59 @@ +/* +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.addons.htmls.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.htmls.*; +import java.io.FileReader; + +import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +class Script_engine__java implements Script_engine { + private final ScriptEngine engine; + private final Invocable invk; + public Script_engine__java() { + ScriptEngineManager manager = new ScriptEngineManager(); + this.engine = manager.getEngineByName("JavaScript"); + this.invk = (Invocable)engine; + } + public void Load_script(Io_url url) { + try { + engine.eval(new FileReader(url.Xto_api())); +// return engine.eval(script); + } catch (Exception e) { + System.out.println(e); + } + } + public void Put_object(String key, Object val) { + engine.put(key, val); + } + public Object Get_object(String obj_name) { + try { + return engine.get(obj_name); + } catch (Exception e) { + System.out.println(e); + return null; + } + } + public Object Invoke_method(Object obj, String func, Object... args) { + try { + return invk.invokeMethod(obj, func, args); + } catch (Exception e) { + System.out.println(e); + return null; + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/htmls/includes/Script_engine__noop.java b/400_xowa/src/gplx/xowa/addons/htmls/includes/Script_engine__noop.java new file mode 100644 index 000000000..052676b40 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/htmls/includes/Script_engine__noop.java @@ -0,0 +1,30 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.htmls.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.htmls.*; +interface Script_engine { + void Load_script(Io_url url); + Object Get_object(String obj_name); + void Put_object(String name, Object obj); + Object Invoke_method(Object obj, String func, Object... args); +} +class Script_engine__noop implements Script_engine { + public void Load_script(Io_url url) {} + public Object Get_object(String obj_name) {return null;} + public void Put_object(String name, Object obj) {} + public Object Invoke_method(Object obj, String func, Object... args) {return null;} +} diff --git a/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoh_include_mgr.java b/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoh_include_mgr.java new file mode 100644 index 000000000..dba3d4eb1 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoh_include_mgr.java @@ -0,0 +1,57 @@ +/* +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.addons.htmls.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.htmls.*; +import gplx.xowa.wikis.pages.tags.*; +public class Xoh_include_mgr { + private Io_url[] main_urls; private int main_urls_len; + public void Init(Xow_wiki wiki) { + // check bin dir + Io_url include_dir = wiki.Fsys_mgr().Root_dir().GenSubDir_nest("bin", "html", "include"); + if (!Io_mgr.Instance.ExistsDir(include_dir)) return; + + this.main_urls = Io_mgr.Instance.QueryDir_args(include_dir).FilPath_("*.js").ExecAsUrlAry(); + this.main_urls_len = main_urls.length; + if (main_urls_len == 0) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "no '.js' files found; dir=~{0}", include_dir.Raw()); + return; + } + } + public void Write(Xow_wiki wiki, Xoa_page page) { + this.Init(wiki); + if (main_urls_len == 0) return; + + // create engine and load scripts + Script_engine engine = new Script_engine__java(); + for (int i = 0; i < main_urls_len; ++i) { + engine.Load_script(main_urls[i]); + } +// engine.Put_object("page", new Xoscript_page()) + Xoscript_page xos_pg = new Xoscript_page(); + + Object xowa_script = engine.Get_object("xowa_script"); +// engine.Invoke_method(xowa_script, "main", page.Url().To_str()); + engine.Invoke_method(xowa_script, "main", xos_pg); +// if (String_.Has(rv, "yes")) { +// Io_url js_url = null; +// page.Html_data().Custom_head_tags().Add(Xopg_tag_itm.New_js_file(js_url)); +// } + } +// public static Xoh_include_mgr Get_or_new(Xow_wiki wiki) { +// wiki.Addon_mgr().Itms__get_or_null(); +// } +} diff --git a/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoscript_page.java b/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoscript_page.java new file mode 100644 index 000000000..c67ddd81c --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoscript_page.java @@ -0,0 +1,24 @@ +/* +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.addons.htmls.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.htmls.*; +public class Xoscript_page { + private Xoscript_page_doc doc = new Xoscript_page_doc(); + public Xoscript_page_doc Doc() { + return doc; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoscript_page_doc.java b/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoscript_page_doc.java new file mode 100644 index 000000000..a002f23e5 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/htmls/includes/Xoscript_page_doc.java @@ -0,0 +1,23 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.addons.htmls.includes; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.htmls.*; +public class Xoscript_page_doc { + public void Test() { + Tfds.Write("hi"); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_mgr.java index 7a562cbbb..7609c97fd 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_mgr.java @@ -19,12 +19,10 @@ package gplx.xowa.addons.wikis.ctgs.bldrs; import gplx.*; import gplx.xowa.*; im import gplx.dbs.*; import gplx.xowa.addons.wikis.ctgs.dbs.*; import gplx.xowa.addons.wikis.ctgs.enums.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.addons.wikis.ctgs.bldrs.ucas.*; class Xob_catlink_mgr { private Xowe_wiki wiki; private Xodb_tmp_cat_db tmp_db; private Db_conn tmp_conn; private Xodb_tmp_cat_link_tbl tmp_link_tbl; private final Xoctg_collation_enum collation_enum = new Xoctg_collation_enum(); private final Xoctg_type_enum type_enum = new Xoctg_type_enum(); - private Uca_trie trie; private final Bry_bfr uca_bfr = Bry_bfr_.New(); private int rows = 0; public void On_cmd_bgn(Xowe_wiki wiki) { this.wiki = wiki; @@ -42,17 +40,13 @@ class Xob_catlink_mgr { byte collation_id = collation_enum.To_tid_or_fail(collation_bry); byte type_id = type_enum.To_tid_or_fail(type_bry); - // sortkey; handle \n + // sortkey byte[] sortkey_actl = sortkey_orig; - int nl_pos = Bry_find_.Find_fwd(sortkey_actl, Byte_ascii.Nl); - if (nl_pos != Bry_find_.Not_found) // some sortkeys have format of "sortkey\ntitle"; discard 2nd to conserve hard-disk space; EX: "WALES, JIMMY\nJIMMY WALES" - sortkey_actl = Bry_.Mid(sortkey_actl, 0, nl_pos); // NOTE: some sortkeys have space which will sort under " "; EX: ' \nART' -> " "; SEE: s.w:Category:Art - - // sortkey; handle uca - if (collation_id == Xoctg_collation_enum.Tid__uca) { - if (trie == null) trie = new Uca_trie(); - trie.Decode(uca_bfr, sortkey_actl, 0, sortkey_actl.length); - sortkey_actl = uca_bfr.Len() == 0 ? Byte_ascii.Space_bry : uca_bfr.To_bry_and_clear(); + if (collation_id != Xoctg_collation_enum.Tid__uca) { + // sortkey; handle \n + int nl_pos = Bry_find_.Find_fwd(sortkey_actl, Byte_ascii.Nl); + if (nl_pos != Bry_find_.Not_found) // some sortkeys have format of "sortkey\ntitle"; discard 2nd to conserve hard-disk space; EX: "WALES, JIMMY\nJIMMY WALES" + sortkey_actl = Bry_.Mid(sortkey_actl, 0, nl_pos); // NOTE: some sortkeys have space which will sort under " "; EX: ' \nART' -> " "; SEE: s.w:Category:Art } // insert to tmp; notify; commit @@ -76,12 +70,12 @@ class Xob_catlink_mgr { } // create tbl - Xodb_cat_sort_tbl cat_sort_tbl = new Xodb_cat_sort_tbl(cat_core_conn); - cat_core_conn.Meta_tbl_remake(cat_sort_tbl); - cat_sort_tbl.Insert_by_select(tmp_conn); + // Xodb_cat_sort_tbl cat_sort_tbl = new Xodb_cat_sort_tbl(cat_core_conn); + // cat_core_conn.Meta_tbl_remake(cat_sort_tbl); + // cat_sort_tbl.Insert_by_select(tmp_conn); // make catlink_dbs - cat_sort_tbl.Create_idx__key(); // index will be needed for join + // cat_sort_tbl.Create_idx__key(); // index will be needed for join tmp_link_tbl.Create_idx__to_ttl(); // index will be needed for join Db_conn page_conn = wiki.Data__core_mgr().Db__core().Conn(); Xob_catlink_wkr wkr = new Xob_catlink_wkr(); @@ -92,7 +86,7 @@ class Xob_catlink_mgr { wkr.Update_page_cat_db_id(wiki, page_conn); // cleanup - cat_sort_tbl.Delete_idx__key(); // remove idx + // cat_sort_tbl.Delete_idx__key(); // remove idx tmp_db.Delete(); } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_wkr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_wkr.java index 903895947..d2b549de8 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_wkr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/Xob_catlink_wkr.java @@ -26,16 +26,16 @@ class Xob_catlink_wkr { ( "SELECT tcl.cl_from" , ", p.page_id" , ", tcl.cl_type_id" - , ", cs.cs_id" , ", tcl.cl_timestamp" + , ", tcl.cl_sortkey" + , ", tcl.cl_sortkey_prefix" , "FROM tmp_cat_link tcl" - , " JOIN cat_sort cs ON tcl.cl_sortkey = cs.cs_key" - , " JOIN page p ON p.page_namespace = 14 AND tcl.cl_to_ttl = p.page_title" + , " JOIN page p ON p.page_namespace = 14 AND tcl.cl_to_ttl = p.page_title" , "ORDER BY 1" // NOTE: must sort by page_id to keep all cats for page in one db )); attach_mgr.Attach(); - // select from tmp_db and insert insert into cat_link + // select from tmp_db and insert into cat_link Xodb_cat_link_tbl cat_link_tbl = Make_cat_link_tbl(wiki, null); Db_rdr rdr = attach_mgr.Conn_main().Stmt_sql(sql).Exec_select__rls_auto(); try { @@ -46,7 +46,9 @@ class Xob_catlink_wkr { while (rdr.Move_next()) { // check if row can fit in db; else update db_size int page_id_cur = rdr.Read_int("cl_from"); - long db_size_new = db_size_cur + 46;// 46 = 3 ints (12) + 1 long (8) + 1 byte (2?) + 2 index (24?) + 9 fudge factor (?); DATE:2016-09-06 + byte[] sortkey = rdr.Read_bry("cl_sortkey"); + byte[] sortkey_prefix = rdr.Read_bry_by_str("cl_sortkey_prefix"); + long db_size_new = db_size_cur + 48 + (sortkey.length * 2) + sortkey_prefix.length;// 46 = 3 ints (12) + 1 long (8) + 1 byte (2?) + 2 index (24?) + 11 fudge factor (?); DATE:2016-09-06 if ( db_size_cur > db_size_max // size exceeded && page_id_cur != page_id_prv) { // and page_id is diff; keeps all page_ids in one db cat_link_tbl = Make_cat_link_tbl(wiki, cat_link_tbl); @@ -56,7 +58,7 @@ class Xob_catlink_wkr { page_id_prv = page_id_cur; // insert; notify; - cat_link_tbl.Insert_cmd_by_batch(page_id_prv, rdr.Read_int("page_id"), rdr.Read_byte("cl_type_id"), rdr.Read_int("cs_id"), rdr.Read_long("cl_timestamp")); + cat_link_tbl.Insert_cmd_by_batch(page_id_prv, rdr.Read_int("page_id"), rdr.Read_byte("cl_type_id"), rdr.Read_long("cl_timestamp"), sortkey, sortkey_prefix); if (++rows % 100000 == 0) Gfo_usr_dlg_.Instance.Prog_many("", "", "inserting cat_link row: ~{0}", Int_.To_str_fmt(rows, "#,##0")); } @@ -82,8 +84,8 @@ class Xob_catlink_wkr { private static void Term_cat_link_tbl(Xodb_cat_link_tbl cat_link_tbl) { if (cat_link_tbl == null) return; cat_link_tbl.Insert_end(); - cat_link_tbl.Create_idx__from(); - cat_link_tbl.Create_idx__to_id(); + cat_link_tbl.Create_idx__catbox(); + cat_link_tbl.Create_idx__catpage(); } public void Make_catcore_tbl(Xowe_wiki wiki, Db_conn tmp_conn, Db_conn page_conn, Db_conn cat_core_conn) { Db_attach_mgr attach_mgr = new Db_attach_mgr(cat_core_conn, new Db_attach_itm("temp_db", tmp_conn), new Db_attach_itm("page_db", page_conn)); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/ucas/Uca_trie.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/ucas/Uca_trie.java deleted file mode 100644 index 681e9644f..000000000 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/ucas/Uca_trie.java +++ /dev/null @@ -1,1076 +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.addons.wikis.ctgs.bldrs.ucas; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.bldrs.*; -import gplx.core.btries.*; -public class Uca_trie { - private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); - private final Btrie_rv trv = new Btrie_rv(); - public Uca_trie() { -Init_itm(1, Bry_.New_by_ints(1,1)); -Init_itm(2, Bry_.New_by_ints(1,1)); -Init_itm(3, Bry_.New_by_ints(1,1)); -Init_itm(4, Bry_.New_by_ints(1,1)); -Init_itm(5, Bry_.New_by_ints(1,1)); -Init_itm(6, Bry_.New_by_ints(1,1)); -Init_itm(7, Bry_.New_by_ints(1,1)); -Init_itm(8, Bry_.New_by_ints(1,1)); -Init_itm(9, Bry_.New_by_ints(3,64,1,5,1,5)); -Init_itm(10, Bry_.New_by_ints(3,66,1,5,1,5)); -Init_itm(11, Bry_.New_by_ints(3,68,1,5,1,5)); -Init_itm(12, Bry_.New_by_ints(3,70,1,5,1,5)); -Init_itm(13, Bry_.New_by_ints(3,72,1,5,1,5)); -Init_itm(14, Bry_.New_by_ints(1,1)); -Init_itm(15, Bry_.New_by_ints(1,1)); -Init_itm(16, Bry_.New_by_ints(1,1)); -Init_itm(17, Bry_.New_by_ints(1,1)); -Init_itm(18, Bry_.New_by_ints(1,1)); -Init_itm(19, Bry_.New_by_ints(1,1)); -Init_itm(20, Bry_.New_by_ints(1,1)); -Init_itm(21, Bry_.New_by_ints(1,1)); -Init_itm(22, Bry_.New_by_ints(1,1)); -Init_itm(23, Bry_.New_by_ints(1,1)); -Init_itm(24, Bry_.New_by_ints(1,1)); -Init_itm(25, Bry_.New_by_ints(1,1)); -Init_itm(26, Bry_.New_by_ints(1,1)); -Init_itm(27, Bry_.New_by_ints(1,1)); -Init_itm(28, Bry_.New_by_ints(1,1)); -Init_itm(29, Bry_.New_by_ints(1,1)); -Init_itm(30, Bry_.New_by_ints(1,1)); -Init_itm(31, Bry_.New_by_ints(1,1)); -Init_itm(32, Bry_.New_by_ints(4,1,5,1,5)); -Init_itm(33, Bry_.New_by_ints(8,129,1,5,1,5)); -Init_itm(34, Bry_.New_by_ints(10,161,1,5,1,5)); -Init_itm(35, Bry_.New_by_ints(11,177,1,5,1,5)); -Init_itm(36, Bry_.New_by_ints(15,14,1,5,1,5)); -Init_itm(37, Bry_.New_by_ints(11,179,1,5,1,5)); -Init_itm(38, Bry_.New_by_ints(11,173,1,5,1,5)); -Init_itm(39, Bry_.New_by_ints(10,147,1,5,1,5)); -Init_itm(40, Bry_.New_by_ints(10,181,1,5,1,5)); -Init_itm(41, Bry_.New_by_ints(10,183,1,5,1,5)); -Init_itm(42, Bry_.New_by_ints(11,159,1,5,1,5)); -Init_itm(43, Bry_.New_by_ints(13,95,1,5,1,5)); -Init_itm(44, Bry_.New_by_ints(7,1,5,1,5)); -Init_itm(45, Bry_.New_by_ints(6,70,1,5,1,5)); -Init_itm(46, Bry_.New_by_ints(9,1,5,1,5)); -Init_itm(47, Bry_.New_by_ints(11,169,1,5,1,5)); -Init_itm(48, Bry_.New_by_ints(18,1,5,1,5)); -Init_itm(49, Bry_.New_by_ints(20,1,5,1,5)); -Init_itm(50, Bry_.New_by_ints(22,1,5,1,5)); -Init_itm(51, Bry_.New_by_ints(24,1,5,1,5)); -Init_itm(52, Bry_.New_by_ints(26,1,5,1,5)); -Init_itm(53, Bry_.New_by_ints(28,1,5,1,5)); -Init_itm(54, Bry_.New_by_ints(30,1,5,1,5)); -Init_itm(55, Bry_.New_by_ints(32,1,5,1,5)); -Init_itm(56, Bry_.New_by_ints(34,1,5,1,5)); -Init_itm(57, Bry_.New_by_ints(36,1,5,1,5)); -Init_itm(58, Bry_.New_by_ints(8,97,1,5,1,5)); -Init_itm(59, Bry_.New_by_ints(8,88,1,5,1,5)); -Init_itm(60, Bry_.New_by_ints(13,103,1,5,1,5)); -Init_itm(61, Bry_.New_by_ints(13,105,1,5,1,5)); -Init_itm(62, Bry_.New_by_ints(13,107,1,5,1,5)); -Init_itm(63, Bry_.New_by_ints(8,136,1,5,1,5)); -Init_itm(64, Bry_.New_by_ints(11,157,1,5,1,5)); -Init_itm(65, Bry_.New_by_ints(39,1,5,1,143)); -Init_itm(66, Bry_.New_by_ints(41,1,5,1,143)); -Init_itm(67, Bry_.New_by_ints(43,1,5,1,143)); -Init_itm(68, Bry_.New_by_ints(45,1,5,1,143)); -Init_itm(69, Bry_.New_by_ints(47,1,5,1,143)); -Init_itm(70, Bry_.New_by_ints(49,1,5,1,143)); -Init_itm(71, Bry_.New_by_ints(51,1,5,1,143)); -Init_itm(72, Bry_.New_by_ints(53,1,5,1,143)); -Init_itm(73, Bry_.New_by_ints(55,1,5,1,143)); -Init_itm(74, Bry_.New_by_ints(57,1,5,1,143)); -Init_itm(75, Bry_.New_by_ints(59,1,5,1,143)); -Init_itm(76, Bry_.New_by_ints(61,1,5,1,143)); -Init_itm(77, Bry_.New_by_ints(63,1,5,1,143)); -Init_itm(78, Bry_.New_by_ints(65,1,5,1,143)); -Init_itm(79, Bry_.New_by_ints(67,1,5,1,143)); -Init_itm(80, Bry_.New_by_ints(69,1,5,1,143)); -Init_itm(81, Bry_.New_by_ints(71,1,5,1,143)); -Init_itm(82, Bry_.New_by_ints(73,1,5,1,143)); -Init_itm(83, Bry_.New_by_ints(75,1,5,1,143)); -Init_itm(84, Bry_.New_by_ints(77,1,5,1,143)); -Init_itm(85, Bry_.New_by_ints(79,1,5,1,143)); -Init_itm(86, Bry_.New_by_ints(81,1,5,1,143)); -Init_itm(87, Bry_.New_by_ints(83,1,5,1,143)); -Init_itm(88, Bry_.New_by_ints(85,1,5,1,143)); -Init_itm(89, Bry_.New_by_ints(87,1,5,1,143)); -Init_itm(90, Bry_.New_by_ints(89,1,5,1,143)); -Init_itm(91, Bry_.New_by_ints(10,185,1,5,1,5)); -Init_itm(92, Bry_.New_by_ints(11,171,1,5,1,5)); -Init_itm(93, Bry_.New_by_ints(10,187,1,5,1,5)); -Init_itm(94, Bry_.New_by_ints(13,15,1,5,1,5)); -Init_itm(95, Bry_.New_by_ints(6,66,1,5,1,5)); -Init_itm(96, Bry_.New_by_ints(13,10,1,5,1,5)); -Init_itm(97, Bry_.New_by_ints(39,1,5,1,5)); -Init_itm(98, Bry_.New_by_ints(41,1,5,1,5)); -Init_itm(99, Bry_.New_by_ints(43,1,5,1,5)); -Init_itm(100, Bry_.New_by_ints(45,1,5,1,5)); -Init_itm(101, Bry_.New_by_ints(47,1,5,1,5)); -Init_itm(102, Bry_.New_by_ints(49,1,5,1,5)); -Init_itm(103, Bry_.New_by_ints(51,1,5,1,5)); -Init_itm(104, Bry_.New_by_ints(53,1,5,1,5)); -Init_itm(105, Bry_.New_by_ints(55,1,5,1,5)); -Init_itm(106, Bry_.New_by_ints(57,1,5,1,5)); -Init_itm(107, Bry_.New_by_ints(59,1,5,1,5)); -Init_itm(108, Bry_.New_by_ints(61,1,5,1,5)); -Init_itm(109, Bry_.New_by_ints(63,1,5,1,5)); -Init_itm(110, Bry_.New_by_ints(65,1,5,1,5)); -Init_itm(111, Bry_.New_by_ints(67,1,5,1,5)); -Init_itm(112, Bry_.New_by_ints(69,1,5,1,5)); -Init_itm(113, Bry_.New_by_ints(71,1,5,1,5)); -Init_itm(114, Bry_.New_by_ints(73,1,5,1,5)); -Init_itm(115, Bry_.New_by_ints(75,1,5,1,5)); -Init_itm(116, Bry_.New_by_ints(77,1,5,1,5)); -Init_itm(117, Bry_.New_by_ints(79,1,5,1,5)); -Init_itm(118, Bry_.New_by_ints(81,1,5,1,5)); -Init_itm(119, Bry_.New_by_ints(83,1,5,1,5)); -Init_itm(120, Bry_.New_by_ints(85,1,5,1,5)); -Init_itm(121, Bry_.New_by_ints(87,1,5,1,5)); -Init_itm(122, Bry_.New_by_ints(89,1,5,1,5)); -Init_itm(123, Bry_.New_by_ints(10,189,1,5,1,5)); -Init_itm(124, Bry_.New_by_ints(13,111,1,5,1,5)); -Init_itm(125, Bry_.New_by_ints(10,191,1,5,1,5)); -Init_itm(126, Bry_.New_by_ints(13,115,1,5,1,5)); -Init_itm(127, Bry_.New_by_ints(1,1)); -Init_itm(128, Bry_.New_by_ints(1,1)); -Init_itm(129, Bry_.New_by_ints(1,1)); -Init_itm(130, Bry_.New_by_ints(1,1)); -Init_itm(131, Bry_.New_by_ints(1,1)); -Init_itm(132, Bry_.New_by_ints(1,1)); -Init_itm(133, Bry_.New_by_ints(3,74,1,5,1,5)); -Init_itm(134, Bry_.New_by_ints(1,1)); -Init_itm(135, Bry_.New_by_ints(1,1)); -Init_itm(136, Bry_.New_by_ints(1,1)); -Init_itm(137, Bry_.New_by_ints(1,1)); -Init_itm(138, Bry_.New_by_ints(1,1)); -Init_itm(139, Bry_.New_by_ints(1,1)); -Init_itm(140, Bry_.New_by_ints(1,1)); -Init_itm(141, Bry_.New_by_ints(1,1)); -Init_itm(142, Bry_.New_by_ints(1,1)); -Init_itm(143, Bry_.New_by_ints(1,1)); -Init_itm(144, Bry_.New_by_ints(1,1)); -Init_itm(145, Bry_.New_by_ints(1,1)); -Init_itm(146, Bry_.New_by_ints(1,1)); -Init_itm(147, Bry_.New_by_ints(1,1)); -Init_itm(148, Bry_.New_by_ints(1,1)); -Init_itm(149, Bry_.New_by_ints(1,1)); -Init_itm(150, Bry_.New_by_ints(1,1)); -Init_itm(151, Bry_.New_by_ints(1,1)); -Init_itm(152, Bry_.New_by_ints(1,1)); -Init_itm(153, Bry_.New_by_ints(1,1)); -Init_itm(154, Bry_.New_by_ints(1,1)); -Init_itm(155, Bry_.New_by_ints(1,1)); -Init_itm(156, Bry_.New_by_ints(1,1)); -Init_itm(157, Bry_.New_by_ints(1,1)); -Init_itm(158, Bry_.New_by_ints(1,1)); -Init_itm(159, Bry_.New_by_ints(1,1)); -Init_itm(160, Bry_.New_by_ints(4,1,5,1,181)); -Init_itm(161, Bry_.New_by_ints(8,131,1,5,1,5)); -Init_itm(162, Bry_.New_by_ints(15,12,1,5,1,5)); -Init_itm(163, Bry_.New_by_ints(15,16,1,5,1,5)); -Init_itm(164, Bry_.New_by_ints(15,10,1,5,1,5)); -Init_itm(165, Bry_.New_by_ints(15,18,1,5,1,5)); -Init_itm(166, Bry_.New_by_ints(13,113,1,5,1,5)); -Init_itm(167, Bry_.New_by_ints(11,149,1,5,1,5)); -Init_itm(168, Bry_.New_by_ints(13,20,1,5,1,5)); -Init_itm(169, Bry_.New_by_ints(13,86,1,5,1,5)); -Init_itm(170, Bry_.New_by_ints(39,1,5,1,167)); -Init_itm(171, Bry_.New_by_ints(10,177,1,5,1,5)); -Init_itm(172, Bry_.New_by_ints(13,109,1,5,1,5)); -Init_itm(173, Bry_.New_by_ints(1,1)); -Init_itm(174, Bry_.New_by_ints(13,88,1,5,1,5)); -Init_itm(175, Bry_.New_by_ints(13,17,1,5,1,5)); -Init_itm(176, Bry_.New_by_ints(13,79,1,5,1,5)); -Init_itm(177, Bry_.New_by_ints(13,97,1,5,1,5)); -Init_itm(178, Bry_.New_by_ints(22,1,5,1,167)); -Init_itm(179, Bry_.New_by_ints(24,1,5,1,167)); -Init_itm(180, Bry_.New_by_ints(13,12,1,5,1,5)); -Init_itm(181, Bry_.New_by_ints(91,46,1,5,1,137)); -Init_itm(182, Bry_.New_by_ints(11,153,1,5,1,5)); -Init_itm(183, Bry_.New_by_ints(10,78,1,5,1,5)); -Init_itm(184, Bry_.New_by_ints(13,23,1,5,1,5)); -Init_itm(185, Bry_.New_by_ints(20,1,5,1,167)); -Init_itm(186, Bry_.New_by_ints(67,1,5,1,167)); -Init_itm(187, Bry_.New_by_ints(10,179,1,5,1,5)); -Init_itm(188, Bry_.New_by_ints(20,13,117,44,26,1,7,1,187,187,189)); -Init_itm(189, Bry_.New_by_ints(20,13,117,44,22,1,7,1,187,187,189)); -Init_itm(190, Bry_.New_by_ints(24,13,117,44,26,1,7,1,187,187,189)); -Init_itm(191, Bry_.New_by_ints(8,138,1,5,1,5)); -Init_itm(192, Bry_.New_by_ints(39,1,134,143,1,143,5)); -Init_itm(193, Bry_.New_by_ints(39,1,134,141,1,143,5)); -Init_itm(194, Bry_.New_by_ints(39,1,134,147,1,143,5)); -Init_itm(195, Bry_.New_by_ints(39,1,134,161,1,143,5)); -Init_itm(196, Bry_.New_by_ints(39,1,134,157,1,143,5)); -Init_itm(197, Bry_.New_by_ints(39,1,134,153,1,143,5)); -Init_itm(198, Bry_.New_by_ints(39,47,1,134,219,169,5,1,147,137,189)); -Init_itm(199, Bry_.New_by_ints(43,1,134,167,1,143,5)); -Init_itm(200, Bry_.New_by_ints(47,1,134,143,1,143,5)); -Init_itm(201, Bry_.New_by_ints(47,1,134,141,1,143,5)); -Init_itm(202, Bry_.New_by_ints(47,1,134,147,1,143,5)); -Init_itm(203, Bry_.New_by_ints(47,1,134,157,1,143,5)); -Init_itm(204, Bry_.New_by_ints(55,1,134,143,1,143,5)); -Init_itm(205, Bry_.New_by_ints(55,1,134,141,1,143,5)); -Init_itm(206, Bry_.New_by_ints(55,1,134,147,1,143,5)); -Init_itm(207, Bry_.New_by_ints(55,1,134,157,1,143,5)); -Init_itm(208, Bry_.New_by_ints(45,1,134,219,169,1,147,137)); -Init_itm(209, Bry_.New_by_ints(65,1,134,161,1,143,5)); -Init_itm(210, Bry_.New_by_ints(67,1,134,143,1,143,5)); -Init_itm(211, Bry_.New_by_ints(67,1,134,141,1,143,5)); -Init_itm(212, Bry_.New_by_ints(67,1,134,147,1,143,5)); -Init_itm(213, Bry_.New_by_ints(67,1,134,161,1,143,5)); -Init_itm(214, Bry_.New_by_ints(67,1,134,157,1,143,5)); -Init_itm(215, Bry_.New_by_ints(13,101,1,5,1,5)); -Init_itm(216, Bry_.New_by_ints(67,1,134,165,1,143,5)); -Init_itm(217, Bry_.New_by_ints(79,1,134,143,1,143,5)); -Init_itm(218, Bry_.New_by_ints(79,1,134,141,1,143,5)); -Init_itm(219, Bry_.New_by_ints(79,1,134,147,1,143,5)); -Init_itm(220, Bry_.New_by_ints(79,1,134,157,1,143,5)); -Init_itm(221, Bry_.New_by_ints(87,1,134,141,1,143,5)); -Init_itm(222, Bry_.New_by_ints(90,96,1,5,1,143)); -Init_itm(223, Bry_.New_by_ints(75,75,1,134,219,169,5,1,137,137,189)); -Init_itm(224, Bry_.New_by_ints(39,1,134,143,1,6)); -Init_itm(225, Bry_.New_by_ints(39,1,134,141,1,6)); -Init_itm(226, Bry_.New_by_ints(39,1,134,147,1,6)); -Init_itm(227, Bry_.New_by_ints(39,1,134,161,1,6)); -Init_itm(228, Bry_.New_by_ints(39,1,134,157,1,6)); -Init_itm(229, Bry_.New_by_ints(39,1,134,153,1,6)); -Init_itm(230, Bry_.New_by_ints(39,47,1,134,219,169,5,1,137,137,189)); -Init_itm(231, Bry_.New_by_ints(43,1,134,167,1,6)); -Init_itm(232, Bry_.New_by_ints(47,1,134,143,1,6)); -Init_itm(233, Bry_.New_by_ints(47,1,134,141,1,6)); -Init_itm(234, Bry_.New_by_ints(47,1,134,147,1,6)); -Init_itm(235, Bry_.New_by_ints(47,1,134,157,1,6)); -Init_itm(236, Bry_.New_by_ints(55,1,134,143,1,6)); -Init_itm(237, Bry_.New_by_ints(55,1,134,141,1,6)); -Init_itm(238, Bry_.New_by_ints(55,1,134,147,1,6)); -Init_itm(239, Bry_.New_by_ints(55,1,134,157,1,6)); -Init_itm(240, Bry_.New_by_ints(45,1,134,219,169,1,137,137)); -Init_itm(241, Bry_.New_by_ints(65,1,134,161,1,6)); -Init_itm(242, Bry_.New_by_ints(67,1,134,143,1,6)); -Init_itm(243, Bry_.New_by_ints(67,1,134,141,1,6)); -Init_itm(244, Bry_.New_by_ints(67,1,134,147,1,6)); -Init_itm(245, Bry_.New_by_ints(67,1,134,161,1,6)); -Init_itm(246, Bry_.New_by_ints(67,1,134,157,1,6)); -Init_itm(247, Bry_.New_by_ints(13,99,1,5,1,5)); -Init_itm(248, Bry_.New_by_ints(67,1,134,165,1,6)); -Init_itm(249, Bry_.New_by_ints(79,1,134,143,1,6)); -Init_itm(250, Bry_.New_by_ints(79,1,134,141,1,6)); -Init_itm(251, Bry_.New_by_ints(79,1,134,147,1,6)); -Init_itm(252, Bry_.New_by_ints(79,1,134,157,1,6)); -Init_itm(253, Bry_.New_by_ints(87,1,134,141,1,6)); -Init_itm(254, Bry_.New_by_ints(90,96,1,5,1,5)); -Init_itm(255, Bry_.New_by_ints(87,1,134,157,1,6)); -Init_itm(256, Bry_.New_by_ints(39,1,134,171,1,143,5)); -Init_itm(257, Bry_.New_by_ints(39,1,134,171,1,6)); -Init_itm(258, Bry_.New_by_ints(39,1,134,145,1,143,5)); -Init_itm(259, Bry_.New_by_ints(39,1,134,145,1,6)); -Init_itm(260, Bry_.New_by_ints(39,1,134,169,1,143,5)); -Init_itm(261, Bry_.New_by_ints(39,1,134,169,1,6)); -Init_itm(262, Bry_.New_by_ints(43,1,134,141,1,143,5)); -Init_itm(263, Bry_.New_by_ints(43,1,134,141,1,6)); -Init_itm(264, Bry_.New_by_ints(43,1,134,147,1,143,5)); -Init_itm(265, Bry_.New_by_ints(43,1,134,147,1,6)); -Init_itm(266, Bry_.New_by_ints(43,1,134,163,1,143,5)); -Init_itm(267, Bry_.New_by_ints(43,1,134,163,1,6)); -Init_itm(268, Bry_.New_by_ints(43,1,134,151,1,143,5)); -Init_itm(269, Bry_.New_by_ints(43,1,134,151,1,6)); -Init_itm(270, Bry_.New_by_ints(45,1,134,151,1,143,5)); -Init_itm(271, Bry_.New_by_ints(45,1,134,151,1,6)); -Init_itm(272, Bry_.New_by_ints(45,1,134,208,61,1,143,5)); -Init_itm(273, Bry_.New_by_ints(45,1,134,208,61,1,6)); -Init_itm(274, Bry_.New_by_ints(47,1,134,171,1,143,5)); -Init_itm(275, Bry_.New_by_ints(47,1,134,171,1,6)); -Init_itm(276, Bry_.New_by_ints(47,1,134,145,1,143,5)); -Init_itm(277, Bry_.New_by_ints(47,1,134,145,1,6)); -Init_itm(278, Bry_.New_by_ints(47,1,134,163,1,143,5)); -Init_itm(279, Bry_.New_by_ints(47,1,134,163,1,6)); -Init_itm(280, Bry_.New_by_ints(47,1,134,169,1,143,5)); -Init_itm(281, Bry_.New_by_ints(47,1,134,169,1,6)); -Init_itm(282, Bry_.New_by_ints(47,1,134,151,1,143,5)); -Init_itm(283, Bry_.New_by_ints(47,1,134,151,1,6)); -Init_itm(284, Bry_.New_by_ints(51,1,134,147,1,143,5)); -Init_itm(285, Bry_.New_by_ints(51,1,134,147,1,6)); -Init_itm(286, Bry_.New_by_ints(51,1,134,145,1,143,5)); -Init_itm(287, Bry_.New_by_ints(51,1,134,145,1,6)); -Init_itm(288, Bry_.New_by_ints(51,1,134,163,1,143,5)); -Init_itm(289, Bry_.New_by_ints(51,1,134,163,1,6)); -Init_itm(290, Bry_.New_by_ints(51,1,134,167,1,143,5)); -Init_itm(291, Bry_.New_by_ints(51,1,134,167,1,6)); -Init_itm(292, Bry_.New_by_ints(53,1,134,147,1,143,5)); -Init_itm(293, Bry_.New_by_ints(53,1,134,147,1,6)); -Init_itm(294, Bry_.New_by_ints(53,1,134,208,61,1,143,5)); -Init_itm(295, Bry_.New_by_ints(53,1,134,208,61,1,6)); -Init_itm(296, Bry_.New_by_ints(55,1,134,161,1,143,5)); -Init_itm(297, Bry_.New_by_ints(55,1,134,161,1,6)); -Init_itm(298, Bry_.New_by_ints(55,1,134,171,1,143,5)); -Init_itm(299, Bry_.New_by_ints(55,1,134,171,1,6)); -Init_itm(300, Bry_.New_by_ints(55,1,134,145,1,143,5)); -Init_itm(301, Bry_.New_by_ints(55,1,134,145,1,6)); -Init_itm(302, Bry_.New_by_ints(55,1,134,169,1,143,5)); -Init_itm(303, Bry_.New_by_ints(55,1,134,169,1,6)); -Init_itm(304, Bry_.New_by_ints(55,1,134,163,1,143,5)); -Init_itm(305, Bry_.New_by_ints(56,64,1,5,1,5)); -Init_itm(306, Bry_.New_by_ints(55,57,1,6,1,147,147)); -Init_itm(307, Bry_.New_by_ints(55,57,1,6,1,137,137)); -Init_itm(308, Bry_.New_by_ints(57,1,134,147,1,143,5)); -Init_itm(309, Bry_.New_by_ints(57,1,134,147,1,6)); -Init_itm(310, Bry_.New_by_ints(59,1,134,167,1,143,5)); -Init_itm(311, Bry_.New_by_ints(59,1,134,167,1,6)); -Init_itm(312, Bry_.New_by_ints(72,72,1,5,1,5)); -Init_itm(313, Bry_.New_by_ints(61,1,134,141,1,143,5)); -Init_itm(314, Bry_.New_by_ints(61,1,134,141,1,6)); -Init_itm(315, Bry_.New_by_ints(61,1,134,167,1,143,5)); -Init_itm(316, Bry_.New_by_ints(61,1,134,167,1,6)); -Init_itm(317, Bry_.New_by_ints(61,1,134,151,1,143,5)); -Init_itm(318, Bry_.New_by_ints(61,1,134,151,1,6)); -Init_itm(319, Bry_.New_by_ints(61,1,134,219,169,1,143,5)); -Init_itm(320, Bry_.New_by_ints(61,1,134,219,169,1,6)); -Init_itm(321, Bry_.New_by_ints(61,1,134,208,61,1,143,5)); -Init_itm(322, Bry_.New_by_ints(61,1,134,208,61,1,6)); -Init_itm(323, Bry_.New_by_ints(65,1,134,141,1,143,5)); -Init_itm(324, Bry_.New_by_ints(65,1,134,141,1,6)); -Init_itm(325, Bry_.New_by_ints(65,1,134,167,1,143,5)); -Init_itm(326, Bry_.New_by_ints(65,1,134,167,1,6)); -Init_itm(327, Bry_.New_by_ints(65,1,134,151,1,143,5)); -Init_itm(328, Bry_.New_by_ints(65,1,134,151,1,6)); -Init_itm(329, Bry_.New_by_ints(90,134,65,1,6,1,137,137)); -Init_itm(330, Bry_.New_by_ints(66,86,1,5,1,143)); -Init_itm(331, Bry_.New_by_ints(66,86,1,5,1,5)); -Init_itm(332, Bry_.New_by_ints(67,1,134,171,1,143,5)); -Init_itm(333, Bry_.New_by_ints(67,1,134,171,1,6)); -Init_itm(334, Bry_.New_by_ints(67,1,134,145,1,143,5)); -Init_itm(335, Bry_.New_by_ints(67,1,134,145,1,6)); -Init_itm(336, Bry_.New_by_ints(67,1,134,159,1,143,5)); -Init_itm(337, Bry_.New_by_ints(67,1,134,159,1,6)); -Init_itm(338, Bry_.New_by_ints(67,47,1,134,219,169,5,1,147,137,189)); -Init_itm(339, Bry_.New_by_ints(67,47,1,134,219,169,5,1,137,137,189)); -Init_itm(340, Bry_.New_by_ints(73,1,134,141,1,143,5)); -Init_itm(341, Bry_.New_by_ints(73,1,134,141,1,6)); -Init_itm(342, Bry_.New_by_ints(73,1,134,167,1,143,5)); -Init_itm(343, Bry_.New_by_ints(73,1,134,167,1,6)); -Init_itm(344, Bry_.New_by_ints(73,1,134,151,1,143,5)); -Init_itm(345, Bry_.New_by_ints(73,1,134,151,1,6)); -Init_itm(346, Bry_.New_by_ints(75,1,134,141,1,143,5)); -Init_itm(347, Bry_.New_by_ints(75,1,134,141,1,6)); -Init_itm(348, Bry_.New_by_ints(75,1,134,147,1,143,5)); -Init_itm(349, Bry_.New_by_ints(75,1,134,147,1,6)); -Init_itm(350, Bry_.New_by_ints(75,1,134,167,1,143,5)); -Init_itm(351, Bry_.New_by_ints(75,1,134,167,1,6)); -Init_itm(352, Bry_.New_by_ints(75,1,134,151,1,143,5)); -Init_itm(353, Bry_.New_by_ints(75,1,134,151,1,6)); -Init_itm(354, Bry_.New_by_ints(77,1,134,167,1,143,5)); -Init_itm(355, Bry_.New_by_ints(77,1,134,167,1,6)); -Init_itm(356, Bry_.New_by_ints(77,1,134,151,1,143,5)); -Init_itm(357, Bry_.New_by_ints(77,1,134,151,1,6)); -Init_itm(358, Bry_.New_by_ints(78,66,1,5,1,143)); -Init_itm(359, Bry_.New_by_ints(78,66,1,5,1,5)); -Init_itm(360, Bry_.New_by_ints(79,1,134,161,1,143,5)); -Init_itm(361, Bry_.New_by_ints(79,1,134,161,1,6)); -Init_itm(362, Bry_.New_by_ints(79,1,134,171,1,143,5)); -Init_itm(363, Bry_.New_by_ints(79,1,134,171,1,6)); -Init_itm(364, Bry_.New_by_ints(79,1,134,145,1,143,5)); -Init_itm(365, Bry_.New_by_ints(79,1,134,145,1,6)); -Init_itm(366, Bry_.New_by_ints(79,1,134,153,1,143,5)); -Init_itm(367, Bry_.New_by_ints(79,1,134,153,1,6)); -Init_itm(368, Bry_.New_by_ints(79,1,134,159,1,143,5)); -Init_itm(369, Bry_.New_by_ints(79,1,134,159,1,6)); -Init_itm(370, Bry_.New_by_ints(79,1,134,169,1,143,5)); -Init_itm(371, Bry_.New_by_ints(79,1,134,169,1,6)); -Init_itm(372, Bry_.New_by_ints(83,1,134,147,1,143,5)); -Init_itm(373, Bry_.New_by_ints(83,1,134,147,1,6)); -Init_itm(374, Bry_.New_by_ints(87,1,134,147,1,143,5)); -Init_itm(375, Bry_.New_by_ints(87,1,134,147,1,6)); -Init_itm(376, Bry_.New_by_ints(87,1,134,157,1,143,5)); -Init_itm(377, Bry_.New_by_ints(89,1,134,141,1,143,5)); -Init_itm(378, Bry_.New_by_ints(89,1,134,141,1,6)); -Init_itm(379, Bry_.New_by_ints(89,1,134,163,1,143,5)); -Init_itm(380, Bry_.New_by_ints(89,1,134,163,1,6)); -Init_itm(381, Bry_.New_by_ints(89,1,134,151,1,143,5)); -Init_itm(382, Bry_.New_by_ints(89,1,134,151,1,6)); -Init_itm(383, Bry_.New_by_ints(75,1,134,219,185,1,137,137)); -Init_itm(384, Bry_.New_by_ints(42,66,1,5,1,5)); -Init_itm(385, Bry_.New_by_ints(42,76,1,5,1,143)); -Init_itm(386, Bry_.New_by_ints(42,78,1,5,1,143)); -Init_itm(387, Bry_.New_by_ints(42,78,1,5,1,5)); -Init_itm(388, Bry_.New_by_ints(90,126,1,5,1,143)); -Init_itm(389, Bry_.New_by_ints(90,126,1,5,1,5)); -Init_itm(390, Bry_.New_by_ints(68,74,1,5,1,143)); -Init_itm(391, Bry_.New_by_ints(44,70,1,5,1,143)); -Init_itm(392, Bry_.New_by_ints(44,70,1,5,1,5)); -Init_itm(393, Bry_.New_by_ints(46,72,1,5,1,143)); -Init_itm(394, Bry_.New_by_ints(46,74,1,5,1,143)); -Init_itm(395, Bry_.New_by_ints(46,78,1,5,1,143)); -Init_itm(396, Bry_.New_by_ints(46,78,1,5,1,5)); -Init_itm(397, Bry_.New_by_ints(89,83,1,6,1,137,137)); -Init_itm(398, Bry_.New_by_ints(48,72,1,5,1,143)); -Init_itm(399, Bry_.New_by_ints(48,76,1,5,1,143)); -Init_itm(400, Bry_.New_by_ints(48,80,1,5,1,143)); -Init_itm(401, Bry_.New_by_ints(50,70,1,5,1,143)); -Init_itm(402, Bry_.New_by_ints(50,70,1,5,1,5)); -Init_itm(403, Bry_.New_by_ints(52,72,1,5,1,143)); -Init_itm(404, Bry_.New_by_ints(52,80,1,5,1,143)); -Init_itm(405, Bry_.New_by_ints(54,66,1,5,1,5)); -Init_itm(406, Bry_.New_by_ints(56,78,1,5,1,143)); -Init_itm(407, Bry_.New_by_ints(56,72,1,5,1,143)); -Init_itm(408, Bry_.New_by_ints(60,68,1,5,1,143)); -Init_itm(409, Bry_.New_by_ints(60,68,1,5,1,5)); -Init_itm(410, Bry_.New_by_ints(62,72,1,5,1,5)); -Init_itm(411, Bry_.New_by_ints(62,94,1,5,1,5)); -Init_itm(412, Bry_.New_by_ints(80,84,1,5,1,143)); -Init_itm(413, Bry_.New_by_ints(66,72,1,5,1,143)); -Init_itm(414, Bry_.New_by_ints(66,74,1,5,1,5)); -Init_itm(415, Bry_.New_by_ints(68,90,1,5,1,143)); -Init_itm(416, Bry_.New_by_ints(67,1,134,191,1,143,5)); -Init_itm(417, Bry_.New_by_ints(67,1,134,191,1,6)); -Init_itm(418, Bry_.New_by_ints(52,82,1,5,1,143)); -Init_itm(419, Bry_.New_by_ints(52,82,1,5,1,5)); -Init_itm(420, Bry_.New_by_ints(70,74,1,5,1,143)); -Init_itm(421, Bry_.New_by_ints(70,74,1,5,1,5)); -Init_itm(422, Bry_.New_by_ints(74,64,1,5,1,143)); -Init_itm(423, Bry_.New_by_ints(90,122,1,5,1,143)); -Init_itm(424, Bry_.New_by_ints(90,122,1,5,1,5)); -Init_itm(425, Bry_.New_by_ints(76,78,1,5,1,143)); -Init_itm(426, Bry_.New_by_ints(76,82,1,5,1,5)); -Init_itm(427, Bry_.New_by_ints(78,72,1,5,1,5)); -Init_itm(428, Bry_.New_by_ints(78,74,1,5,1,143)); -Init_itm(429, Bry_.New_by_ints(78,74,1,5,1,5)); -Init_itm(430, Bry_.New_by_ints(78,76,1,5,1,143)); -Init_itm(431, Bry_.New_by_ints(79,1,134,191,1,143,5)); -Init_itm(432, Bry_.New_by_ints(79,1,134,191,1,6)); -Init_itm(433, Bry_.New_by_ints(80,92,1,5,1,143)); -Init_itm(434, Bry_.New_by_ints(82,70,1,5,1,143)); -Init_itm(435, Bry_.New_by_ints(88,68,1,5,1,143)); -Init_itm(436, Bry_.New_by_ints(88,68,1,5,1,5)); -Init_itm(437, Bry_.New_by_ints(90,66,1,5,1,143)); -Init_itm(438, Bry_.New_by_ints(90,66,1,5,1,5)); -Init_itm(439, Bry_.New_by_ints(90,84,1,5,1,143)); -Init_itm(440, Bry_.New_by_ints(90,88,1,5,1,143)); -Init_itm(441, Bry_.New_by_ints(90,88,1,5,1,5)); -Init_itm(442, Bry_.New_by_ints(90,92,1,5,1,5)); -Init_itm(443, Bry_.New_by_ints(90,114,1,5,1,5)); -Init_itm(444, Bry_.New_by_ints(90,124,1,5,1,143)); -Init_itm(445, Bry_.New_by_ints(90,124,1,5,1,5)); -Init_itm(446, Bry_.New_by_ints(77,75,1,6,1,137,137)); -Init_itm(447, Bry_.New_by_ints(90,102,1,5,1,5)); -Init_itm(448, Bry_.New_by_ints(90,162,1,5,1,5)); -Init_itm(449, Bry_.New_by_ints(90,164,1,5,1,5)); -Init_itm(450, Bry_.New_by_ints(90,166,1,5,1,5)); -Init_itm(451, Bry_.New_by_ints(90,168,1,5,1,5)); -Init_itm(452, Bry_.New_by_ints(45,89,1,133,151,1,147,147,189)); -Init_itm(453, Bry_.New_by_ints(45,89,1,133,151,1,147,137,189)); -Init_itm(454, Bry_.New_by_ints(45,89,1,133,151,1,137,137,189)); -Init_itm(455, Bry_.New_by_ints(61,57,1,6,1,147,147)); -Init_itm(456, Bry_.New_by_ints(61,57,1,6,1,147,137)); -Init_itm(457, Bry_.New_by_ints(61,57,1,6,1,137,137)); -Init_itm(458, Bry_.New_by_ints(65,57,1,6,1,147,147)); -Init_itm(459, Bry_.New_by_ints(65,57,1,6,1,147,137)); -Init_itm(460, Bry_.New_by_ints(65,57,1,6,1,137,137)); -Init_itm(461, Bry_.New_by_ints(39,1,134,151,1,143,5)); -Init_itm(462, Bry_.New_by_ints(39,1,134,151,1,6)); -Init_itm(463, Bry_.New_by_ints(55,1,134,151,1,143,5)); -Init_itm(464, Bry_.New_by_ints(55,1,134,151,1,6)); -Init_itm(465, Bry_.New_by_ints(67,1,134,151,1,143,5)); -Init_itm(466, Bry_.New_by_ints(67,1,134,151,1,6)); -Init_itm(467, Bry_.New_by_ints(79,1,134,151,1,143,5)); -Init_itm(468, Bry_.New_by_ints(79,1,134,151,1,6)); -Init_itm(469, Bry_.New_by_ints(79,1,134,157,171,1,143,6)); -Init_itm(470, Bry_.New_by_ints(79,1,134,157,171,1,7)); -Init_itm(471, Bry_.New_by_ints(79,1,134,157,141,1,143,6)); -Init_itm(472, Bry_.New_by_ints(79,1,134,157,141,1,7)); -Init_itm(473, Bry_.New_by_ints(79,1,134,157,151,1,143,6)); -Init_itm(474, Bry_.New_by_ints(79,1,134,157,151,1,7)); -Init_itm(475, Bry_.New_by_ints(79,1,134,157,143,1,143,6)); -Init_itm(476, Bry_.New_by_ints(79,1,134,157,143,1,7)); -Init_itm(477, Bry_.New_by_ints(48,72,1,5,1,5)); -Init_itm(478, Bry_.New_by_ints(39,1,134,157,171,1,143,6)); -Init_itm(479, Bry_.New_by_ints(39,1,134,157,171,1,7)); -Init_itm(480, Bry_.New_by_ints(39,1,134,163,171,1,143,6)); -Init_itm(481, Bry_.New_by_ints(39,1,134,163,171,1,7)); -Init_itm(482, Bry_.New_by_ints(39,47,1,134,219,169,134,171,1,147,137,189,5)); -Init_itm(483, Bry_.New_by_ints(39,47,1,134,219,169,134,171,1,137,137,189,5)); -Init_itm(484, Bry_.New_by_ints(52,68,1,5,1,143)); -Init_itm(485, Bry_.New_by_ints(52,68,1,5,1,5)); -Init_itm(486, Bry_.New_by_ints(51,1,134,151,1,143,5)); -Init_itm(487, Bry_.New_by_ints(51,1,134,151,1,6)); -Init_itm(488, Bry_.New_by_ints(59,1,134,151,1,143,5)); -Init_itm(489, Bry_.New_by_ints(59,1,134,151,1,6)); -Init_itm(490, Bry_.New_by_ints(67,1,134,169,1,143,5)); -Init_itm(491, Bry_.New_by_ints(67,1,134,169,1,6)); -Init_itm(492, Bry_.New_by_ints(67,1,134,169,171,1,143,6)); -Init_itm(493, Bry_.New_by_ints(67,1,134,169,171,1,7)); -Init_itm(494, Bry_.New_by_ints(90,84,1,134,151,1,143,5)); -Init_itm(495, Bry_.New_by_ints(90,84,1,134,151,1,6)); -Init_itm(496, Bry_.New_by_ints(57,1,134,151,1,6)); -Init_itm(497, Bry_.New_by_ints(45,89,1,6,1,147,147)); -Init_itm(498, Bry_.New_by_ints(45,89,1,6,1,147,137)); -Init_itm(499, Bry_.New_by_ints(45,89,1,6,1,137,137)); -Init_itm(500, Bry_.New_by_ints(51,1,134,141,1,143,5)); -Init_itm(501, Bry_.New_by_ints(51,1,134,141,1,6)); -Init_itm(502, Bry_.New_by_ints(54,66,1,5,1,143)); -Init_itm(503, Bry_.New_by_ints(90,102,1,5,1,143)); -Init_itm(504, Bry_.New_by_ints(65,1,134,143,1,143,5)); -Init_itm(505, Bry_.New_by_ints(65,1,134,143,1,6)); -Init_itm(506, Bry_.New_by_ints(39,1,134,153,141,1,143,6)); -Init_itm(507, Bry_.New_by_ints(39,1,134,153,141,1,7)); -Init_itm(508, Bry_.New_by_ints(39,47,1,134,219,169,134,141,1,147,137,189,5)); -Init_itm(509, Bry_.New_by_ints(39,47,1,134,219,169,134,141,1,137,137,189,5)); -Init_itm(510, Bry_.New_by_ints(67,1,134,165,141,1,143,6)); -Init_itm(511, Bry_.New_by_ints(67,1,134,165,141,1,7)); -Init_itm(512, Bry_.New_by_ints(39,1,134,185,1,143,5)); -Init_itm(513, Bry_.New_by_ints(39,1,134,185,1,6)); -Init_itm(514, Bry_.New_by_ints(39,1,134,189,1,143,5)); -Init_itm(515, Bry_.New_by_ints(39,1,134,189,1,6)); -Init_itm(516, Bry_.New_by_ints(47,1,134,185,1,143,5)); -Init_itm(517, Bry_.New_by_ints(47,1,134,185,1,6)); -Init_itm(518, Bry_.New_by_ints(47,1,134,189,1,143,5)); -Init_itm(519, Bry_.New_by_ints(47,1,134,189,1,6)); -Init_itm(520, Bry_.New_by_ints(55,1,134,185,1,143,5)); -Init_itm(521, Bry_.New_by_ints(55,1,134,185,1,6)); -Init_itm(522, Bry_.New_by_ints(55,1,134,189,1,143,5)); -Init_itm(523, Bry_.New_by_ints(55,1,134,189,1,6)); -Init_itm(524, Bry_.New_by_ints(67,1,134,185,1,143,5)); -Init_itm(525, Bry_.New_by_ints(67,1,134,185,1,6)); -Init_itm(526, Bry_.New_by_ints(67,1,134,189,1,143,5)); -Init_itm(527, Bry_.New_by_ints(67,1,134,189,1,6)); -Init_itm(528, Bry_.New_by_ints(73,1,134,185,1,143,5)); -Init_itm(529, Bry_.New_by_ints(73,1,134,185,1,6)); -Init_itm(530, Bry_.New_by_ints(73,1,134,189,1,143,5)); -Init_itm(531, Bry_.New_by_ints(73,1,134,189,1,6)); -Init_itm(532, Bry_.New_by_ints(79,1,134,185,1,143,5)); -Init_itm(533, Bry_.New_by_ints(79,1,134,185,1,6)); -Init_itm(534, Bry_.New_by_ints(79,1,134,189,1,143,5)); -Init_itm(535, Bry_.New_by_ints(79,1,134,189,1,6)); -Init_itm(536, Bry_.New_by_ints(75,1,134,203,1,143,5)); -Init_itm(537, Bry_.New_by_ints(75,1,134,203,1,6)); -Init_itm(538, Bry_.New_by_ints(77,1,134,203,1,143,5)); -Init_itm(539, Bry_.New_by_ints(77,1,134,203,1,6)); -Init_itm(540, Bry_.New_by_ints(88,72,1,5,1,143)); -Init_itm(541, Bry_.New_by_ints(88,72,1,5,1,5)); -Init_itm(542, Bry_.New_by_ints(53,1,134,151,1,143,5)); -Init_itm(543, Bry_.New_by_ints(53,1,134,151,1,6)); -Init_itm(544, Bry_.New_by_ints(66,74,1,5,1,143)); -Init_itm(545, Bry_.New_by_ints(46,80,1,5,1,5)); -Init_itm(546, Bry_.New_by_ints(68,96,1,5,1,143)); -Init_itm(547, Bry_.New_by_ints(68,96,1,5,1,5)); -Init_itm(548, Bry_.New_by_ints(90,72,1,5,1,143)); -Init_itm(549, Bry_.New_by_ints(90,72,1,5,1,5)); -Init_itm(550, Bry_.New_by_ints(39,1,134,163,1,143,5)); -Init_itm(551, Bry_.New_by_ints(39,1,134,163,1,6)); -Init_itm(552, Bry_.New_by_ints(47,1,134,167,1,143,5)); -Init_itm(553, Bry_.New_by_ints(47,1,134,167,1,6)); -Init_itm(554, Bry_.New_by_ints(67,1,134,157,171,1,143,6)); -Init_itm(555, Bry_.New_by_ints(67,1,134,157,171,1,7)); -Init_itm(556, Bry_.New_by_ints(67,1,134,161,171,1,143,6)); -Init_itm(557, Bry_.New_by_ints(67,1,134,161,171,1,7)); -Init_itm(558, Bry_.New_by_ints(67,1,134,163,1,143,5)); -Init_itm(559, Bry_.New_by_ints(67,1,134,163,1,6)); -Init_itm(560, Bry_.New_by_ints(67,1,134,163,171,1,143,6)); -Init_itm(561, Bry_.New_by_ints(67,1,134,163,171,1,7)); -Init_itm(562, Bry_.New_by_ints(87,1,134,171,1,143,5)); -Init_itm(563, Bry_.New_by_ints(87,1,134,171,1,6)); -Init_itm(564, Bry_.New_by_ints(62,86,1,5,1,5)); -Init_itm(565, Bry_.New_by_ints(66,82,1,5,1,5)); -Init_itm(566, Bry_.New_by_ints(78,78,1,5,1,5)); -Init_itm(567, Bry_.New_by_ints(58,64,1,5,1,5)); -Init_itm(568, Bry_.New_by_ints(45,41,1,6,1,137,137)); -Init_itm(569, Bry_.New_by_ints(71,69,1,6,1,137,137)); -Init_itm(570, Bry_.New_by_ints(40,66,1,5,1,143)); -Init_itm(571, Bry_.New_by_ints(44,66,1,5,1,143)); -Init_itm(572, Bry_.New_by_ints(44,66,1,5,1,5)); -Init_itm(573, Bry_.New_by_ints(62,72,1,5,1,143)); -Init_itm(574, Bry_.New_by_ints(78,68,1,5,1,143)); -Init_itm(575, Bry_.New_by_ints(76,72,1,5,1,5)); -Init_itm(576, Bry_.New_by_ints(90,78,1,5,1,5)); -Init_itm(577, Bry_.New_by_ints(90,130,1,5,1,143)); -Init_itm(578, Bry_.New_by_ints(90,130,1,5,1,5)); -Init_itm(579, Bry_.New_by_ints(42,66,1,5,1,143)); -Init_itm(580, Bry_.New_by_ints(80,72,1,5,1,143)); -Init_itm(581, Bry_.New_by_ints(82,78,1,5,1,143)); -Init_itm(582, Bry_.New_by_ints(48,66,1,5,1,143)); -Init_itm(583, Bry_.New_by_ints(48,66,1,5,1,5)); -Init_itm(584, Bry_.New_by_ints(58,68,1,5,1,143)); -Init_itm(585, Bry_.New_by_ints(58,68,1,5,1,5)); -Init_itm(586, Bry_.New_by_ints(72,70,1,5,1,143)); -Init_itm(587, Bry_.New_by_ints(72,70,1,5,1,5)); -Init_itm(588, Bry_.New_by_ints(74,70,1,5,1,143)); -Init_itm(589, Bry_.New_by_ints(74,70,1,5,1,5)); -Init_itm(590, Bry_.New_by_ints(88,66,1,5,1,143)); -Init_itm(591, Bry_.New_by_ints(88,66,1,5,1,5)); -Init_itm(592, Bry_.New_by_ints(40,74,1,5,1,5)); -Init_itm(593, Bry_.New_by_ints(40,76,1,5,1,5)); -Init_itm(594, Bry_.New_by_ints(40,80,1,5,1,5)); -Init_itm(595, Bry_.New_by_ints(42,76,1,5,1,5)); -Init_itm(596, Bry_.New_by_ints(68,74,1,5,1,5)); -Init_itm(597, Bry_.New_by_ints(44,72,1,5,1,5)); -Init_itm(598, Bry_.New_by_ints(46,72,1,5,1,5)); -Init_itm(599, Bry_.New_by_ints(46,74,1,5,1,5)); -Init_itm(600, Bry_.New_by_ints(48,84,1,5,1,5)); -Init_itm(601, Bry_.New_by_ints(48,76,1,5,1,5)); -Init_itm(602, Bry_.New_by_ints(48,86,1,5,1,5)); -Init_itm(603, Bry_.New_by_ints(48,80,1,5,1,5)); -Init_itm(604, Bry_.New_by_ints(48,88,1,5,1,5)); -Init_itm(605, Bry_.New_by_ints(48,94,1,5,1,5)); -Init_itm(606, Bry_.New_by_ints(48,96,1,5,1,5)); -Init_itm(607, Bry_.New_by_ints(58,72,1,5,1,5)); -Init_itm(608, Bry_.New_by_ints(52,72,1,5,1,5)); -Init_itm(609, Bry_.New_by_ints(52,64,1,5,1,5)); -Init_itm(610, Bry_.New_by_ints(52,66,1,5,1,5)); -Init_itm(611, Bry_.New_by_ints(52,80,1,5,1,5)); -Init_itm(612, Bry_.New_by_ints(48,100,1,5,1,5)); -Init_itm(613, Bry_.New_by_ints(80,78,1,5,1,5)); -Init_itm(614, Bry_.New_by_ints(54,68,1,5,1,5)); -Init_itm(615, Bry_.New_by_ints(54,76,1,5,1,5)); -Init_itm(616, Bry_.New_by_ints(56,72,1,5,1,5)); -Init_itm(617, Bry_.New_by_ints(56,78,1,5,1,5)); -Init_itm(618, Bry_.New_by_ints(56,66,1,5,1,5)); -Init_itm(619, Bry_.New_by_ints(62,76,1,5,1,5)); -Init_itm(620, Bry_.New_by_ints(62,78,1,5,1,5)); -Init_itm(621, Bry_.New_by_ints(62,82,1,5,1,5)); -Init_itm(622, Bry_.New_by_ints(62,90,1,5,1,5)); -Init_itm(623, Bry_.New_by_ints(80,84,1,5,1,5)); -Init_itm(624, Bry_.New_by_ints(80,90,1,5,1,5)); -Init_itm(625, Bry_.New_by_ints(64,70,1,5,1,5)); -Init_itm(626, Bry_.New_by_ints(66,72,1,5,1,5)); -Init_itm(627, Bry_.New_by_ints(66,80,1,5,1,5)); -Init_itm(628, Bry_.New_by_ints(66,64,1,5,1,5)); -Init_itm(629, Bry_.New_by_ints(68,90,1,5,1,5)); -Init_itm(630, Bry_.New_by_ints(68,68,1,5,1,5)); -Init_itm(631, Bry_.New_by_ints(68,94,1,5,1,5)); -Init_itm(632, Bry_.New_by_ints(70,82,1,5,1,5)); -Init_itm(633, Bry_.New_by_ints(74,74,1,5,1,5)); -Init_itm(634, Bry_.New_by_ints(74,78,1,5,1,5)); -Init_itm(635, Bry_.New_by_ints(74,82,1,5,1,5)); -Init_itm(636, Bry_.New_by_ints(74,86,1,5,1,5)); -Init_itm(637, Bry_.New_by_ints(74,88,1,5,1,5)); -Init_itm(638, Bry_.New_by_ints(74,90,1,5,1,5)); -Init_itm(639, Bry_.New_by_ints(74,94,1,5,1,5)); -Init_itm(640, Bry_.New_by_ints(74,64,1,5,1,5)); -Init_itm(641, Bry_.New_by_ints(74,96,1,5,1,5)); -Init_itm(642, Bry_.New_by_ints(76,70,1,5,1,5)); -Init_itm(643, Bry_.New_by_ints(76,78,1,5,1,5)); -Init_itm(644, Bry_.New_by_ints(58,74,1,5,1,5)); -Init_itm(645, Bry_.New_by_ints(76,84,1,5,1,5)); -Init_itm(646, Bry_.New_by_ints(76,88,1,5,1,5)); -Init_itm(647, Bry_.New_by_ints(78,82,1,5,1,5)); -Init_itm(648, Bry_.New_by_ints(78,76,1,5,1,5)); -Init_itm(649, Bry_.New_by_ints(80,72,1,5,1,5)); -Init_itm(650, Bry_.New_by_ints(80,92,1,5,1,5)); -Init_itm(651, Bry_.New_by_ints(82,70,1,5,1,5)); -Init_itm(652, Bry_.New_by_ints(82,78,1,5,1,5)); -Init_itm(653, Bry_.New_by_ints(84,68,1,5,1,5)); -Init_itm(654, Bry_.New_by_ints(62,96,1,5,1,5)); -Init_itm(655, Bry_.New_by_ints(88,64,1,5,1,5)); -Init_itm(656, Bry_.New_by_ints(90,74,1,5,1,5)); -Init_itm(657, Bry_.New_by_ints(90,76,1,5,1,5)); -Init_itm(658, Bry_.New_by_ints(90,84,1,5,1,5)); -Init_itm(659, Bry_.New_by_ints(90,94,1,5,1,5)); -Init_itm(660, Bry_.New_by_ints(90,128,1,5,1,5)); -Init_itm(661, Bry_.New_by_ints(90,144,1,5,1,5)); -Init_itm(662, Bry_.New_by_ints(90,160,1,5,1,5)); -Init_itm(663, Bry_.New_by_ints(90,170,1,5,1,5)); -Init_itm(664, Bry_.New_by_ints(90,172,1,5,1,5)); -Init_itm(665, Bry_.New_by_ints(42,64,1,5,1,5)); -Init_itm(666, Bry_.New_by_ints(48,98,1,5,1,5)); -Init_itm(667, Bry_.New_by_ints(52,74,1,5,1,5)); -Init_itm(668, Bry_.New_by_ints(54,64,1,5,1,5)); -Init_itm(669, Bry_.New_by_ints(58,70,1,5,1,5)); -Init_itm(670, Bry_.New_by_ints(60,78,1,5,1,5)); -Init_itm(671, Bry_.New_by_ints(62,64,1,5,1,5)); -Init_itm(672, Bry_.New_by_ints(72,68,1,5,1,5)); -Init_itm(673, Bry_.New_by_ints(90,156,1,5,1,5)); -Init_itm(674, Bry_.New_by_ints(90,158,1,5,1,5)); -Init_itm(675, Bry_.New_by_ints(45,89,1,6,1,137,137)); -Init_itm(676, Bry_.New_by_ints(45,90,84,1,6,1,137,137)); -Init_itm(677, Bry_.New_by_ints(45,90,76,1,6,1,137,137)); -Init_itm(678, Bry_.New_by_ints(77,75,1,6,1,137,137)); -Init_itm(679, Bry_.New_by_ints(77,76,78,1,6,1,137,137)); -Init_itm(680, Bry_.New_by_ints(77,44,72,1,6,1,137,137)); -Init_itm(681, Bry_.New_by_ints(49,66,86,1,6,1,137,137)); -Init_itm(682, Bry_.New_by_ints(61,75,1,6,1,137,137)); -Init_itm(683, Bry_.New_by_ints(61,89,1,6,1,137,137)); -Init_itm(684, Bry_.New_by_ints(90,174,1,5,1,5)); -Init_itm(685, Bry_.New_by_ints(90,176,1,5,1,5)); -Init_itm(686, Bry_.New_by_ints(80,80,1,5,1,5)); -Init_itm(687, Bry_.New_by_ints(80,82,1,5,1,5)); -Init_itm(688, Bry_.New_by_ints(53,1,5,1,167)); -Init_itm(689, Bry_.New_by_ints(54,68,1,5,1,167)); -Init_itm(690, Bry_.New_by_ints(57,1,5,1,167)); -Init_itm(691, Bry_.New_by_ints(73,1,5,1,167)); -Init_itm(692, Bry_.New_by_ints(74,74,1,5,1,167)); -Init_itm(693, Bry_.New_by_ints(74,82,1,5,1,167)); -Init_itm(694, Bry_.New_by_ints(74,96,1,5,1,167)); -Init_itm(695, Bry_.New_by_ints(83,1,5,1,167)); -Init_itm(696, Bry_.New_by_ints(87,1,5,1,167)); -Init_itm(697, Bry_.New_by_ints(13,26,1,5,1,5)); -Init_itm(698, Bry_.New_by_ints(13,29,1,5,1,5)); -Init_itm(699, Bry_.New_by_ints(54,78,1,5,1,5)); -Init_itm(700, Bry_.New_by_ints(90,134,1,5,1,5)); -Init_itm(701, Bry_.New_by_ints(54,80,1,5,1,5)); -Init_itm(702, Bry_.New_by_ints(90,138,1,5,1,5)); -Init_itm(703, Bry_.New_by_ints(90,146,1,5,1,5)); -Init_itm(704, Bry_.New_by_ints(90,132,1,5,1,5)); -Init_itm(705, Bry_.New_by_ints(90,148,1,5,1,5)); -Init_itm(706, Bry_.New_by_ints(13,31,4,1,5,1,5)); -Init_itm(707, Bry_.New_by_ints(13,31,12,1,5,1,5)); -Init_itm(708, Bry_.New_by_ints(13,31,20,1,5,1,5)); -Init_itm(709, Bry_.New_by_ints(13,31,28,1,5,1,5)); -Init_itm(710, Bry_.New_by_ints(13,32,1,5,1,5)); -Init_itm(711, Bry_.New_by_ints(13,34,1,5,1,5)); -Init_itm(712, Bry_.New_by_ints(13,36,1,5,1,5)); -Init_itm(713, Bry_.New_by_ints(13,38,1,5,1,5)); -Init_itm(714, Bry_.New_by_ints(13,40,1,5,1,5)); -Init_itm(715, Bry_.New_by_ints(13,42,1,5,1,5)); -Init_itm(716, Bry_.New_by_ints(13,44,1,5,1,5)); -Init_itm(717, Bry_.New_by_ints(13,46,1,5,1,5)); -Init_itm(718, Bry_.New_by_ints(13,48,1,5,1,5)); -Init_itm(719, Bry_.New_by_ints(13,50,1,5,1,5)); -Init_itm(720, Bry_.New_by_ints(14,11,1,5,1,5)); -Init_itm(721, Bry_.New_by_ints(14,13,1,5,1,5)); -Init_itm(722, Bry_.New_by_ints(13,52,4,1,5,1,5)); -Init_itm(723, Bry_.New_by_ints(13,52,12,1,5,1,5)); -Init_itm(724, Bry_.New_by_ints(13,52,20,1,5,1,5)); -Init_itm(725, Bry_.New_by_ints(13,52,28,1,5,1,5)); -Init_itm(726, Bry_.New_by_ints(13,52,36,1,5,1,5)); -Init_itm(727, Bry_.New_by_ints(13,52,44,1,5,1,5)); -Init_itm(728, Bry_.New_by_ints(13,19,4,1,5,1,5)); -Init_itm(729, Bry_.New_by_ints(13,19,12,1,5,1,5)); -Init_itm(730, Bry_.New_by_ints(13,22,4,1,5,1,5)); -Init_itm(731, Bry_.New_by_ints(13,25,4,1,5,1,5)); -Init_itm(732, Bry_.New_by_ints(13,14,4,1,5,1,5)); -Init_itm(733, Bry_.New_by_ints(13,22,12,1,5,1,5)); -Init_itm(734, Bry_.New_by_ints(13,52,52,1,5,1,5)); -Init_itm(735, Bry_.New_by_ints(13,52,60,1,5,1,5)); -Init_itm(736, Bry_.New_by_ints(52,80,1,5,1,167)); -Init_itm(737, Bry_.New_by_ints(61,1,5,1,167)); -Init_itm(738, Bry_.New_by_ints(75,1,5,1,167)); -Init_itm(739, Bry_.New_by_ints(85,1,5,1,167)); -Init_itm(740, Bry_.New_by_ints(90,144,1,5,1,167)); -Init_itm(741, Bry_.New_by_ints(13,52,68,1,5,1,5)); -Init_itm(742, Bry_.New_by_ints(13,52,76,1,5,1,5)); -Init_itm(743, Bry_.New_by_ints(13,52,84,1,5,1,5)); -Init_itm(744, Bry_.New_by_ints(13,52,92,1,5,1,5)); -Init_itm(745, Bry_.New_by_ints(13,52,100,1,5,1,5)); -Init_itm(746, Bry_.New_by_ints(13,52,108,1,5,1,5)); -Init_itm(747, Bry_.New_by_ints(13,52,116,1,5,1,5)); -Init_itm(748, Bry_.New_by_ints(13,53,1,5,1,5)); -Init_itm(749, Bry_.New_by_ints(13,55,4,1,5,1,5)); -Init_itm(750, Bry_.New_by_ints(90,136,1,5,1,5)); -Init_itm(751, Bry_.New_by_ints(13,55,12,1,5,1,5)); -Init_itm(752, Bry_.New_by_ints(13,55,20,1,5,1,5)); -Init_itm(753, Bry_.New_by_ints(13,55,28,1,5,1,5)); -Init_itm(754, Bry_.New_by_ints(13,55,36,1,5,1,5)); -Init_itm(755, Bry_.New_by_ints(13,55,44,1,5,1,5)); -Init_itm(756, Bry_.New_by_ints(13,55,52,1,5,1,5)); -Init_itm(757, Bry_.New_by_ints(13,55,60,1,5,1,5)); -Init_itm(758, Bry_.New_by_ints(13,55,68,1,5,1,5)); -Init_itm(759, Bry_.New_by_ints(13,55,76,1,5,1,5)); -Init_itm(760, Bry_.New_by_ints(13,55,84,1,5,1,5)); -Init_itm(761, Bry_.New_by_ints(13,55,92,1,5,1,5)); -Init_itm(762, Bry_.New_by_ints(13,55,100,1,5,1,5)); -Init_itm(763, Bry_.New_by_ints(13,55,108,1,5,1,5)); -Init_itm(764, Bry_.New_by_ints(13,55,116,1,5,1,5)); -Init_itm(765, Bry_.New_by_ints(13,55,124,1,5,1,5)); -Init_itm(766, Bry_.New_by_ints(13,55,132,1,5,1,5)); -Init_itm(767, Bry_.New_by_ints(13,55,140,1,5,1,5)); -Init_itm(768, Bry_.New_by_ints(1,143,1,5)); -Init_itm(769, Bry_.New_by_ints(1,141,1,5)); -Init_itm(770, Bry_.New_by_ints(1,147,1,5)); -Init_itm(771, Bry_.New_by_ints(1,161,1,5)); -Init_itm(772, Bry_.New_by_ints(1,171,1,5)); -Init_itm(773, Bry_.New_by_ints(1,181,1,5)); -Init_itm(774, Bry_.New_by_ints(1,145,1,5)); -Init_itm(775, Bry_.New_by_ints(1,163,1,5)); -Init_itm(776, Bry_.New_by_ints(1,157,1,5)); -Init_itm(777, Bry_.New_by_ints(1,183,1,5)); -Init_itm(778, Bry_.New_by_ints(1,153,1,5)); -Init_itm(779, Bry_.New_by_ints(1,159,1,5)); -Init_itm(780, Bry_.New_by_ints(1,151,1,5)); -Init_itm(781, Bry_.New_by_ints(1,173,1,5)); -Init_itm(782, Bry_.New_by_ints(1,173,1,5)); -Init_itm(783, Bry_.New_by_ints(1,185,1,5)); -Init_itm(784, Bry_.New_by_ints(1,187,1,5)); -Init_itm(785, Bry_.New_by_ints(1,189,1,5)); -Init_itm(786, Bry_.New_by_ints(1,173,1,5)); -Init_itm(787, Bry_.New_by_ints(1,137,1,5)); -Init_itm(788, Bry_.New_by_ints(1,139,1,5)); -Init_itm(789, Bry_.New_by_ints(1,173,1,5)); -Init_itm(790, Bry_.New_by_ints(1,175,1,5)); -Init_itm(791, Bry_.New_by_ints(1,175,1,5)); -Init_itm(792, Bry_.New_by_ints(1,175,1,5)); -Init_itm(793, Bry_.New_by_ints(1,175,1,5)); -Init_itm(794, Bry_.New_by_ints(1,173,1,5)); -Init_itm(795, Bry_.New_by_ints(1,191,1,5)); -Init_itm(796, Bry_.New_by_ints(1,175,1,5)); -Init_itm(797, Bry_.New_by_ints(1,175,1,5)); -Init_itm(798, Bry_.New_by_ints(1,175,1,5)); -Init_itm(799, Bry_.New_by_ints(1,175,1,5)); -Init_itm(800, Bry_.New_by_ints(1,175,1,5)); -Init_itm(801, Bry_.New_by_ints(1,193,1,5)); -Init_itm(802, Bry_.New_by_ints(1,195,1,5)); -Init_itm(803, Bry_.New_by_ints(1,197,1,5)); -Init_itm(804, Bry_.New_by_ints(1,199,1,5)); -Init_itm(805, Bry_.New_by_ints(1,201,1,5)); -Init_itm(806, Bry_.New_by_ints(1,203,1,5)); -Init_itm(807, Bry_.New_by_ints(1,167,1,5)); -Init_itm(808, Bry_.New_by_ints(1,169,1,5)); -Init_itm(809, Bry_.New_by_ints(1,175,1,5)); -Init_itm(810, Bry_.New_by_ints(1,175,1,5)); -Init_itm(811, Bry_.New_by_ints(1,175,1,5)); -Init_itm(812, Bry_.New_by_ints(1,175,1,5)); -Init_itm(813, Bry_.New_by_ints(1,205,1,5)); -Init_itm(814, Bry_.New_by_ints(1,207,1,5)); -Init_itm(815, Bry_.New_by_ints(1,175,1,5)); -Init_itm(816, Bry_.New_by_ints(1,208,13,1,5)); -Init_itm(817, Bry_.New_by_ints(1,208,29,1,5)); -Init_itm(818, Bry_.New_by_ints(1,135,1,5)); -Init_itm(819, Bry_.New_by_ints(1,175,1,5)); -Init_itm(820, Bry_.New_by_ints(1,208,45,1,5)); -Init_itm(821, Bry_.New_by_ints(1,208,61,1,5)); -Init_itm(822, Bry_.New_by_ints(1,177,1,5)); -Init_itm(823, Bry_.New_by_ints(1,177,1,5)); -Init_itm(824, Bry_.New_by_ints(1,165,1,5)); -Init_itm(825, Bry_.New_by_ints(1,208,77,1,5)); -Init_itm(826, Bry_.New_by_ints(1,175,1,5)); -Init_itm(827, Bry_.New_by_ints(1,175,1,5)); -Init_itm(828, Bry_.New_by_ints(1,175,1,5)); -Init_itm(829, Bry_.New_by_ints(1,173,1,5)); -Init_itm(830, Bry_.New_by_ints(1,173,1,5)); -Init_itm(831, Bry_.New_by_ints(1,173,1,5)); -Init_itm(832, Bry_.New_by_ints(1,143,1,5)); -Init_itm(833, Bry_.New_by_ints(1,141,1,5)); -Init_itm(834, Bry_.New_by_ints(1,155,1,5)); -Init_itm(835, Bry_.New_by_ints(1,137,1,5)); -Init_itm(836, Bry_.New_by_ints(1,157,141,1,6)); -Init_itm(837, Bry_.New_by_ints(1,208,93,1,5)); -Init_itm(838, Bry_.New_by_ints(1,173,1,5)); -Init_itm(839, Bry_.New_by_ints(1,175,1,5)); -Init_itm(840, Bry_.New_by_ints(1,175,1,5)); -Init_itm(841, Bry_.New_by_ints(1,175,1,5)); -Init_itm(842, Bry_.New_by_ints(1,173,1,5)); -Init_itm(843, Bry_.New_by_ints(1,173,1,5)); -Init_itm(844, Bry_.New_by_ints(1,173,1,5)); -Init_itm(845, Bry_.New_by_ints(1,175,1,5)); -Init_itm(846, Bry_.New_by_ints(1,175,1,5)); -Init_itm(847, Bry_.New_by_ints(1,1)); -Init_itm(848, Bry_.New_by_ints(1,173,1,5)); -Init_itm(849, Bry_.New_by_ints(1,173,1,5)); -Init_itm(850, Bry_.New_by_ints(1,173,1,5)); -Init_itm(851, Bry_.New_by_ints(1,175,1,5)); -Init_itm(852, Bry_.New_by_ints(1,175,1,5)); -Init_itm(853, Bry_.New_by_ints(1,175,1,5)); -Init_itm(854, Bry_.New_by_ints(1,175,1,5)); -Init_itm(855, Bry_.New_by_ints(1,173,1,5)); -Init_itm(856, Bry_.New_by_ints(1,208,109,1,5)); -Init_itm(857, Bry_.New_by_ints(1,175,1,5)); -Init_itm(858, Bry_.New_by_ints(1,175,1,5)); -Init_itm(859, Bry_.New_by_ints(1,173,1,5)); -Init_itm(860, Bry_.New_by_ints(1,175,1,5)); -Init_itm(861, Bry_.New_by_ints(1,173,1,5)); -Init_itm(862, Bry_.New_by_ints(1,173,1,5)); -Init_itm(863, Bry_.New_by_ints(1,175,1,5)); -Init_itm(864, Bry_.New_by_ints(1,208,125,1,5)); -Init_itm(865, Bry_.New_by_ints(1,208,141,1,5)); -Init_itm(866, Bry_.New_by_ints(1,175,1,5)); -Init_itm(867, Bry_.New_by_ints(39,1,5,1,137)); -Init_itm(868, Bry_.New_by_ints(47,1,5,1,137)); -Init_itm(869, Bry_.New_by_ints(55,1,5,1,137)); -Init_itm(870, Bry_.New_by_ints(67,1,5,1,137)); -Init_itm(871, Bry_.New_by_ints(79,1,5,1,137)); -Init_itm(872, Bry_.New_by_ints(43,1,5,1,137)); -Init_itm(873, Bry_.New_by_ints(45,1,5,1,137)); -Init_itm(874, Bry_.New_by_ints(53,1,5,1,137)); -Init_itm(875, Bry_.New_by_ints(63,1,5,1,137)); -Init_itm(876, Bry_.New_by_ints(73,1,5,1,137)); -Init_itm(877, Bry_.New_by_ints(77,1,5,1,137)); -Init_itm(878, Bry_.New_by_ints(81,1,5,1,137)); -Init_itm(879, Bry_.New_by_ints(85,1,5,1,137)); -Init_itm(880, Bry_.New_by_ints(91,30,1,5,1,143)); -Init_itm(881, Bry_.New_by_ints(91,30,1,5,1,5)); -Init_itm(882, Bry_.New_by_ints(91,94,1,5,1,143)); -Init_itm(883, Bry_.New_by_ints(91,94,1,5,1,5)); -Init_itm(884, Bry_.New_by_ints(13,26,1,5,1,5)); -Init_itm(885, Bry_.New_by_ints(13,28,4,1,5,1,5)); -Init_itm(886, Bry_.New_by_ints(91,24,1,5,1,143)); -Init_itm(887, Bry_.New_by_ints(91,24,1,5,1,5)); -Init_itm(888, Bry_.New_by_ints(226,232,177,228,1,5,1,5)); -Init_itm(889, Bry_.New_by_ints(226,232,178,4,1,5,1,5)); -Init_itm(890, Bry_.New_by_ints(91,36,1,5,1,137)); -Init_itm(891, Bry_.New_by_ints(91,74,1,5,1,5)); -Init_itm(892, Bry_.New_by_ints(91,72,1,5,1,5)); -Init_itm(893, Bry_.New_by_ints(91,76,1,5,1,5)); -Init_itm(894, Bry_.New_by_ints(8,88,1,5,1,5)); -Init_itm(895, Bry_.New_by_ints(226,232,178,172,1,5,1,5)); -Init_itm(896, Bry_.New_by_ints(226,232,178,200,1,5,1,5)); -Init_itm(897, Bry_.New_by_ints(226,232,178,228,1,5,1,5)); -Init_itm(898, Bry_.New_by_ints(226,232,179,4,1,5,1,5)); -Init_itm(899, Bry_.New_by_ints(226,232,179,32,1,5,1,5)); -Init_itm(900, Bry_.New_by_ints(13,12,1,5,1,5)); -Init_itm(901, Bry_.New_by_ints(13,20,1,134,141,1,6)); -Init_itm(902, Bry_.New_by_ints(91,10,1,134,141,1,143,5)); -Init_itm(903, Bry_.New_by_ints(10,78,1,5,1,5)); -Init_itm(904, Bry_.New_by_ints(91,20,1,134,141,1,143,5)); -Init_itm(905, Bry_.New_by_ints(91,32,1,134,141,1,143,5)); -Init_itm(906, Bry_.New_by_ints(91,36,1,134,141,1,143,5)); -Init_itm(907, Bry_.New_by_ints(226,232,180,4,1,5,1,5)); -Init_itm(908, Bry_.New_by_ints(91,52,1,134,141,1,143,5)); -Init_itm(909, Bry_.New_by_ints(226,232,180,60,1,5,1,5)); -Init_itm(910, Bry_.New_by_ints(91,80,1,134,141,1,143,5)); -Init_itm(911, Bry_.New_by_ints(91,90,1,134,141,1,143,5)); -Init_itm(912, Bry_.New_by_ints(91,36,1,134,157,141,1,7)); -Init_itm(913, Bry_.New_by_ints(91,10,1,5,1,143)); -Init_itm(914, Bry_.New_by_ints(91,12,1,5,1,143)); -Init_itm(915, Bry_.New_by_ints(91,14,1,5,1,143)); -Init_itm(916, Bry_.New_by_ints(91,18,1,5,1,143)); -Init_itm(917, Bry_.New_by_ints(91,20,1,5,1,143)); -Init_itm(918, Bry_.New_by_ints(91,28,1,5,1,143)); -Init_itm(919, Bry_.New_by_ints(91,32,1,5,1,143)); -Init_itm(920, Bry_.New_by_ints(91,34,1,5,1,143)); -Init_itm(921, Bry_.New_by_ints(91,36,1,5,1,143)); -Init_itm(922, Bry_.New_by_ints(91,40,1,5,1,143)); -Init_itm(923, Bry_.New_by_ints(91,42,1,5,1,143)); -Init_itm(924, Bry_.New_by_ints(91,46,1,5,1,143)); -Init_itm(925, Bry_.New_by_ints(91,48,1,5,1,143)); -Init_itm(926, Bry_.New_by_ints(91,50,1,5,1,143)); -Init_itm(927, Bry_.New_by_ints(91,52,1,5,1,143)); -Init_itm(928, Bry_.New_by_ints(91,54,1,5,1,143)); -Init_itm(929, Bry_.New_by_ints(91,64,1,5,1,143)); -Init_itm(930, Bry_.New_by_ints(226,232,182,144,1,5,1,5)); -Init_itm(931, Bry_.New_by_ints(91,70,1,5,1,143)); -Init_itm(932, Bry_.New_by_ints(91,78,1,5,1,143)); -Init_itm(933, Bry_.New_by_ints(91,80,1,5,1,143)); -Init_itm(934, Bry_.New_by_ints(91,82,1,5,1,143)); -Init_itm(935, Bry_.New_by_ints(91,84,1,5,1,143)); -Init_itm(936, Bry_.New_by_ints(91,86,1,5,1,143)); -Init_itm(937, Bry_.New_by_ints(91,90,1,5,1,143)); -Init_itm(938, Bry_.New_by_ints(91,36,1,134,157,1,143,5)); -Init_itm(939, Bry_.New_by_ints(91,80,1,134,157,1,143,5)); -Init_itm(940, Bry_.New_by_ints(91,10,1,134,141,1,6)); -Init_itm(941, Bry_.New_by_ints(91,20,1,134,141,1,6)); -Init_itm(942, Bry_.New_by_ints(91,32,1,134,141,1,6)); -Init_itm(943, Bry_.New_by_ints(91,36,1,134,141,1,6)); -Init_itm(944, Bry_.New_by_ints(91,80,1,134,157,141,1,7)); -Init_itm(945, Bry_.New_by_ints(91,10,1,5,1,5)); -Init_itm(946, Bry_.New_by_ints(91,12,1,5,1,5)); -Init_itm(947, Bry_.New_by_ints(91,14,1,5,1,5)); -Init_itm(948, Bry_.New_by_ints(91,18,1,5,1,5)); -Init_itm(949, Bry_.New_by_ints(91,20,1,5,1,5)); -Init_itm(950, Bry_.New_by_ints(91,28,1,5,1,5)); -Init_itm(951, Bry_.New_by_ints(91,32,1,5,1,5)); -Init_itm(952, Bry_.New_by_ints(91,34,1,5,1,5)); -Init_itm(953, Bry_.New_by_ints(91,36,1,5,1,5)); -Init_itm(954, Bry_.New_by_ints(91,40,1,5,1,5)); -Init_itm(955, Bry_.New_by_ints(91,42,1,5,1,5)); -Init_itm(956, Bry_.New_by_ints(91,46,1,5,1,5)); -Init_itm(957, Bry_.New_by_ints(91,48,1,5,1,5)); -Init_itm(958, Bry_.New_by_ints(91,50,1,5,1,5)); -Init_itm(959, Bry_.New_by_ints(91,52,1,5,1,5)); -Init_itm(960, Bry_.New_by_ints(91,54,1,5,1,5)); -Init_itm(961, Bry_.New_by_ints(91,64,1,5,1,5)); -Init_itm(962, Bry_.New_by_ints(91,70,1,5,1,177)); -Init_itm(963, Bry_.New_by_ints(91,70,1,5,1,5)); -Init_itm(964, Bry_.New_by_ints(91,78,1,5,1,5)); -Init_itm(965, Bry_.New_by_ints(91,80,1,5,1,5)); -Init_itm(966, Bry_.New_by_ints(91,82,1,5,1,5)); -Init_itm(967, Bry_.New_by_ints(91,84,1,5,1,5)); -Init_itm(968, Bry_.New_by_ints(91,86,1,5,1,5)); -Init_itm(969, Bry_.New_by_ints(91,90,1,5,1,5)); -Init_itm(970, Bry_.New_by_ints(91,36,1,134,157,1,6)); -Init_itm(971, Bry_.New_by_ints(91,80,1,134,157,1,6)); -Init_itm(972, Bry_.New_by_ints(91,52,1,134,141,1,6)); -Init_itm(973, Bry_.New_by_ints(91,80,1,134,141,1,6)); -Init_itm(974, Bry_.New_by_ints(91,90,1,134,141,1,6)); -Init_itm(975, Bry_.New_by_ints(91,40,10,36,1,7,1,147,137,189)); -Init_itm(976, Bry_.New_by_ints(91,12,1,5,1,137)); -Init_itm(977, Bry_.New_by_ints(91,34,1,5,1,137)); -Init_itm(978, Bry_.New_by_ints(91,80,1,5,1,147)); -Init_itm(979, Bry_.New_by_ints(91,80,1,134,141,1,147,5)); -Init_itm(980, Bry_.New_by_ints(91,80,1,134,157,1,147,5)); -Init_itm(981, Bry_.New_by_ints(91,82,1,5,1,137)); -Init_itm(982, Bry_.New_by_ints(91,54,1,5,1,137)); -Init_itm(983, Bry_.New_by_ints(91,40,10,36,1,7,1,137,137,189)); -Init_itm(984, Bry_.New_by_ints(91,62,1,5,1,143)); -Init_itm(985, Bry_.New_by_ints(91,62,1,5,1,5)); -Init_itm(986, Bry_.New_by_ints(91,26,1,5,1,143)); -Init_itm(987, Bry_.New_by_ints(91,26,1,5,1,5)); -Init_itm(988, Bry_.New_by_ints(91,22,1,5,1,143)); -Init_itm(989, Bry_.New_by_ints(91,22,1,5,1,5)); -Init_itm(990, Bry_.New_by_ints(91,60,1,5,1,143)); -Init_itm(991, Bry_.New_by_ints(91,60,1,5,1,5)); -Init_itm(992, Bry_.New_by_ints(91,92,1,5,1,143)); -Init_itm(993, Bry_.New_by_ints(91,92,1,5,1,5)); -Init_itm(994, Bry_.New_by_ints(91,98,252,1,5,1,143)); -Init_itm(995, Bry_.New_by_ints(91,98,252,1,5,1,5)); -Init_itm(996, Bry_.New_by_ints(91,99,42,1,5,1,143)); -Init_itm(997, Bry_.New_by_ints(91,99,42,1,5,1,5)); -Init_itm(998, Bry_.New_by_ints(91,99,50,1,5,1,143)); -Init_itm(999, Bry_.New_by_ints(91,99,50,1,5,1,5)); -Init_itm(1000, Bry_.New_by_ints(91,99,74,1,5,1,143)); -Init_itm(1001, Bry_.New_by_ints(91,99,74,1,5,1,5)); -Init_itm(1002, Bry_.New_by_ints(91,99,130,1,5,1,143)); -Init_itm(1003, Bry_.New_by_ints(91,99,130,1,5,1,5)); -Init_itm(1004, Bry_.New_by_ints(91,99,154,1,5,1,143)); -Init_itm(1005, Bry_.New_by_ints(91,99,154,1,5,1,5)); -Init_itm(1006, Bry_.New_by_ints(91,99,186,1,5,1,143)); -Init_itm(1007, Bry_.New_by_ints(91,99,186,1,5,1,5)); -Init_itm(1008, Bry_.New_by_ints(91,40,1,5,1,137)); -Init_itm(1009, Bry_.New_by_ints(91,64,1,5,1,137)); -Init_itm(1010, Bry_.New_by_ints(91,70,1,5,1,137)); -Init_itm(1011, Bry_.New_by_ints(91,38,1,5,1,5)); -Init_itm(1012, Bry_.New_by_ints(91,34,1,5,1,147)); -Init_itm(1013, Bry_.New_by_ints(91,20,1,5,1,137)); -Init_itm(1014, Bry_.New_by_ints(13,94,100,1,5,1,5)); -Init_itm(1015, Bry_.New_by_ints(91,96,1,5,1,143)); -Init_itm(1016, Bry_.New_by_ints(91,96,1,5,1,5)); -Init_itm(1017, Bry_.New_by_ints(91,70,1,5,1,147)); -Init_itm(1018, Bry_.New_by_ints(91,58,1,5,1,143)); -Init_itm(1019, Bry_.New_by_ints(91,58,1,5,1,5)); -Init_itm(1020, Bry_.New_by_ints(91,68,1,5,1,5)); -Init_itm(1021, Bry_.New_by_ints(91,74,1,5,1,143)); -Init_itm(1022, Bry_.New_by_ints(91,72,1,5,1,143)); -Init_itm(1023, Bry_.New_by_ints(91,76,1,5,1,143)); -Init_itm(1024, Bry_.New_by_ints(92,52,1,134,143,1,143,5)); - } - public void Clear() {trie.Clear();} - public void Decode(Bry_bfr tmp, byte[] src, int bgn, int end) { - int i = bgn; - while (i < end) { - Object o = trie.Match_at(trv, src, i, end); - if (src[i] < 4) return; - if (o == null) return; //throw Err_.new_fmt_("unknown error: {0}", i); - byte[] utf8_char = (byte[])o; - tmp.Add(utf8_char); - i = trv.Pos(); - } - } - public void Init_itm(int charAsInt, byte[] uca) { - int uca_len = uca.length; - int uca_last = uca_len; - for (int i = 0; i < uca_len; i++) { - byte b = uca[i]; - if (b == 1) { - uca_last = i; - break; - } - } - if (uca_last == 0) return; - uca = Bry_.Mid(uca, 0, uca_last); - if (trie.Match_bgn(uca, 0, uca.length) == null) - trie.Add_obj(uca, gplx.core.intls.Utf16_.Encode_int_to_bry(charAsInt)); - } -} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/ucas/Uca_trie_tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/ucas/Uca_trie_tst.java deleted file mode 100644 index 40d169a87..000000000 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/bldrs/ucas/Uca_trie_tst.java +++ /dev/null @@ -1,45 +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.addons.wikis.ctgs.bldrs.ucas; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.bldrs.*; -import org.junit.*; import gplx.xowa.bldrs.*; -public class Uca_trie_tst { - @Before public void init() {fxt.Clear();} private Xob_base_fxt fxt = new Xob_base_fxt(); - @Test public void Basic() { - Uca_trie_fxt fxt = new Uca_trie_fxt(); - fxt.Clear(); - fxt.Init_trie_itm("a", Bry_.New_by_ints(10, 11)); - fxt.Init_trie_itm("b", Bry_.New_by_ints(20, 21)); - fxt.Init_trie_itm("c", Bry_.New_by_ints(30, 31)); - fxt.Test_decode(Bry_.New_by_ints(10, 11), "a"); - fxt.Test_decode(Bry_.New_by_ints(10, 11, 20, 21, 30, 31), "abc"); - } -} -class Uca_trie_fxt { - public void Clear() { - if (trie == null) { - trie = new Uca_trie(); - bfr = Bry_bfr_.New(); - } - trie.Clear(); - } Uca_trie trie; Bry_bfr bfr; - public void Init_trie_itm(String charAsStr, byte[] uca) {trie.Init_itm(gplx.core.intls.Utf16_.Decode_to_int(Bry_.new_u8(charAsStr), 0), uca);} - public void Test_decode(byte[] bry, String expd) { - trie.Decode(bfr, bry, 0, bry.length); - Tfds.Eq(expd, bfr.To_str_and_clear()); - } -} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java index b5877d1ff..f4e5dc206 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_cat_link_tbl.java @@ -20,32 +20,34 @@ import gplx.dbs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; public class Xodb_cat_link_tbl implements Db_tbl { private final Dbmeta_fld_list flds = new Dbmeta_fld_list(); - private final String fld_from, fld_to_id, fld_type_id, fld_sortkey_id, fld_timestamp_unix; + private final String fld__from, fld__to_id, fld__type_id, fld__timestamp_unix, fld__sortkey, fld__sortkey_prefix; private Db_stmt stmt_insert; public Xodb_cat_link_tbl(Db_conn conn) { this.conn = conn; this.tbl_name = "cat_link"; - this.fld_from = flds.Add_int ("cl_from"); - this.fld_to_id = flds.Add_int ("cl_to_id"); - this.fld_type_id = flds.Add_byte ("cl_type_id"); - this.fld_sortkey_id = flds.Add_int ("cl_sortkey_id"); - this.fld_timestamp_unix = flds.Add_long ("cl_timestamp_unix"); + this.fld__from = flds.Add_int ("cl_from"); + this.fld__to_id = flds.Add_int ("cl_to_id"); + this.fld__type_id = flds.Add_byte ("cl_type_id"); + this.fld__timestamp_unix = flds.Add_long ("cl_timestamp_unix"); + this.fld__sortkey = flds.Add_bry ("cl_sortkey"); + this.fld__sortkey_prefix = flds.Add_str ("cl_sortkey_prefix", 255); conn.Rls_reg(this); } public Db_conn Conn() {return conn;} private final Db_conn conn; public String Tbl_name() {return tbl_name;} private final String tbl_name; public void Create_tbl() {conn.Meta_tbl_create(Dbmeta_tbl_itm.New(tbl_name, flds));} - public void Create_idx__from() {conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, fld_from, fld_from));} - public void Create_idx__to_id() {conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, fld_to_id, fld_to_id));} + public void Create_idx__catbox() {conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "catbox", fld__from));} + public void Create_idx__catpage() {conn.Meta_idx_create(Dbmeta_idx_itm.new_normal_by_tbl(tbl_name, "catpage", fld__to_id, fld__type_id, fld__sortkey));} public void Insert_bgn() {conn.Txn_bgn("cl__insert"); stmt_insert = conn.Stmt_insert(tbl_name, flds);} public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);} - public void Insert_cmd_by_batch(int from, int to_id, byte type_id, int sortkey_id, long timestamp_unix) { + public void Insert_cmd_by_batch(int from, int to_id, byte type_id, long timestamp_unix, byte[] sortkey, byte[] sortkey_prefix) { stmt_insert.Clear() - .Val_int(fld_from , from) - .Val_int(fld_to_id , to_id) - .Val_byte(fld_type_id , type_id) - .Val_int(fld_sortkey_id , sortkey_id) - .Val_long(fld_timestamp_unix , timestamp_unix) + .Val_int(fld__from , from) + .Val_int(fld__to_id , to_id) + .Val_byte(fld__type_id , type_id) + .Val_long(fld__timestamp_unix , timestamp_unix) + .Val_bry(fld__sortkey , sortkey) + .Val_bry_as_str(fld__sortkey_prefix , sortkey_prefix) .Exec_insert(); } public void Rls() { diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_tmp_cat_link_tbl.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_tmp_cat_link_tbl.java index a55e43e5c..a432796d2 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_tmp_cat_link_tbl.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/dbs/Xodb_tmp_cat_link_tbl.java @@ -26,7 +26,7 @@ public class Xodb_tmp_cat_link_tbl implements Db_tbl { this.tbl_name = "tmp_cat_link"; this.fld_from = flds.Add_int ("cl_from"); this.fld_to_ttl = flds.Add_str ("cl_to_ttl", 255); - this.fld_sortkey = flds.Add_str ("cl_sortkey", 230); + this.fld_sortkey = flds.Add_bry ("cl_sortkey"); this.fld_timestamp = flds.Add_long ("cl_timestamp"); this.fld_sortkey_prefix = flds.Add_str ("cl_sortkey_prefix", 230); this.fld_collation_id = flds.Add_byte ("cl_collation_id"); @@ -43,7 +43,7 @@ public class Xodb_tmp_cat_link_tbl implements Db_tbl { stmt_insert.Clear() .Val_int(fld_from , page_id) .Val_bry_as_str(fld_to_ttl , ctg_ttl) - .Val_bry_as_str(fld_sortkey , sortkey) + .Val_bry(fld_sortkey , sortkey) .Val_long(fld_timestamp , timestamp) .Val_bry_as_str(fld_sortkey_prefix , sortkey_prefix) .Val_byte(fld_collation_id , collation_id) diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr.java index 645ed2f5a..b1a28edf0 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr.java @@ -17,14 +17,21 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.core.intls.ucas.*; import gplx.xowa.wikis.nss.*; -import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.utls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; -public class Xoctg_catpage_mgr { +import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.dbs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs.*; +public class Xoctg_catpage_mgr implements Gfo_invk { + private final Xow_wiki wiki; private final Hash_adp_bry cache = Hash_adp_bry.cs(); private final Xoctg_catpage_loader loader = new Xoctg_catpage_loader(); private final Xoctg_fmt_grp fmt_subcs = Xoctg_fmt_grp.New__subc(), fmt_pages = Xoctg_fmt_grp.New__page(), fmt_files = Xoctg_fmt_grp.New__file(); + private final Uca_ltr_extractor ltr_extractor = new Uca_ltr_extractor(true); public int Grp_max() {return grp_max;} private int grp_max = Grp_max_dflt; + public Xoctg_catpage_mgr(Xow_wiki wiki) { + this.wiki = wiki; + this.collation_mgr = new Xoctg_collation_mgr(wiki); + } + public Xoctg_collation_mgr Collation_mgr() {return collation_mgr;} private Xoctg_collation_mgr collation_mgr; public Xoctg_fmt_grp Fmt(byte tid) { switch (tid) { case Xoa_ctg_mgr.Tid__subc: return fmt_subcs; @@ -34,32 +41,33 @@ public class Xoctg_catpage_mgr { } } public void Free_mem_all() {cache.Clear();} - public Xoctg_catpage_ctg Get_or_load_or_null(Xow_wiki wiki, Xoa_ttl cat_ttl) { + public Xoctg_catpage_ctg Get_or_load_or_null(Xoctg_catpage_url catpage_url, Xoa_ttl cat_ttl, int limit) { // load categories from cat dbs; exit if not found Xoctg_catpage_ctg ctg = (Xoctg_catpage_ctg)cache.Get_by(cat_ttl.Full_db()); if (ctg == null) { if (gplx.core.envs.Env_.Mode_testing()) return null; // needed for dpl test - ctg = loader.Load_by_ttl_or_null(wiki, cat_ttl); + synchronized (thread_lock) { // LOCK:used by multiple wrks; DATE:2016-09-12 + ctg = loader.Load_ctg_or_null(wiki, this, catpage_url, cat_ttl, limit); + } if (ctg == null) return null; // not in cache or db; exit - cache.Add(cat_ttl.Full_db(), ctg); + // cache.Add(cat_ttl.Full_db(), ctg); } return ctg; } - public void Write_catpage(Bry_bfr bfr, Xow_wiki wiki, Xoa_page page, Xoh_wtr_ctx hctx) { + public void Write_catpage(Bry_bfr bfr, Xoa_page page, Xoh_wtr_ctx hctx) { try { - // load categories from cat dbs; exit if not found - Xoctg_catpage_ctg ctg = Get_or_load_or_null(wiki, page.Ttl()); - if (ctg == null) return; - - // filter subs; need for large categories like de.w:Category:Mann + // get catpage_url Xoctg_catpage_url catpage_url = Xoctg_catpage_url_parser.Parse(page.Url()); - Xoctg_catpage_filter.Filter(grp_max, catpage_url, ctg); + + // load categories from cat dbs; exit if not found + Xoctg_catpage_ctg ctg = Get_or_load_or_null(catpage_url, page.Ttl(), grp_max); + if (ctg == null) return; // write html Xol_lang_itm lang = page.Lang(); - fmt_subcs.Write_catpage_grp(bfr, wiki, lang, ctg, grp_max); - fmt_pages.Write_catpage_grp(bfr, wiki, lang, ctg, grp_max); - fmt_files.Write_catpage_grp(bfr, wiki, lang, ctg, grp_max); + fmt_subcs.Write_catpage_grp(bfr, wiki, lang, ltr_extractor, ctg, grp_max); + fmt_pages.Write_catpage_grp(bfr, wiki, lang, ltr_extractor, ctg, grp_max); + fmt_files.Write_catpage_grp(bfr, wiki, lang, ltr_extractor, ctg, grp_max); } catch (Exception e) { Xoa_app_.Usr_dlg().Warn_many("", "", "failed to generate category: title=~{0} err=~{1}", page.Url_bry_safe(), Err_.Message_gplx_log(e)); @@ -70,5 +78,12 @@ public class Xoctg_catpage_mgr { cache.Add(ttl, ctg); } public void Grp_max_(int v) {grp_max = v;} // TEST: + public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { + if (ctx.Match(k, Invk__collation_)) collation_mgr.Collation_name_(m.ReadStr("v")); + else return Gfo_invk_.Rv_unhandled; + return this; + } private static final String Invk__collation_ = "collation_"; + public static int Grp_max_dflt = 200; + private static final Object thread_lock = new Object(); } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java index 598a5ace8..e9258c822 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java @@ -16,25 +16,27 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; -import org.junit.*; import gplx.xowa.htmls.core.htmls.*; +import org.junit.*; import gplx.xowa.htmls.core.htmls.*; import gplx.core.intls.ucas.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts.*; public class Xoctg_catpage_mgr__basic__tst { @Before public void init() {fxt.Clear();} private Xoctg_catpage_mgr_fxt fxt = new Xoctg_catpage_mgr_fxt(); @Test public void Page_itm() { fxt .Init_itms__pages("A1") - .Test__html__page(Xoa_ctg_mgr.Tid__page, Byte_ascii.Ltr_A, "\n
  • A1
  • "); + .Test__html__page(Xoa_ctg_mgr.Tid__page, Byte_ascii.Ltr_A, "\n
  • A1
  • "); } @Test public void Page_itm_missing() { - fxt .Init_itms__pages("A1"); - fxt .Ctg().Grp_by_tid(Xoa_ctg_mgr.Tid__page).Itms__get_at(0).Missing_y_(); - fxt .Test__html__page(Xoa_ctg_mgr.Tid__page, Byte_ascii.Ltr_A, "\n
  • A1 (missing)
  • "); + fxt.Init_itms__pages("A1"); + Xoctg_catpage_itm itm = fxt.Ctg().Grp_by_tid(Xoa_ctg_mgr.Tid__page).Itms__get_at(0); + itm.Page_ttl_(Xoa_ttl.Null); + itm.Sortkey_handle_make(Bry_bfr_.New(), Bry_.Empty); + fxt.Test__html__page(Xoa_ctg_mgr.Tid__page, Byte_ascii.Ltr_A, "\n
  • A1 (missing)
  • "); } @Test public void Visited_doesnt_work_for_space() {// PURPOSE: xowa-visited not inserted for pages with space byte[] page_bry = Bry_.new_a7("A 1"); Xoa_url url = Xoa_url.New(Bry_.new_a7("en.wikipedia.org"), page_bry); Xoa_ttl ttl = Xoa_ttl.Parse(fxt.Wiki(), page_bry); fxt.Wiki().Appe().Usere().History_mgr().Add(url, ttl, page_bry); - fxt .Init_itms__pages("A_1").Init_grp__pages(0, 1) + fxt .Init_itms__pages("A_1") .Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last ( "" , "
    " @@ -46,7 +48,7 @@ public class Xoctg_catpage_mgr__basic__tst { , " " , "

    A

    " , " " , " " , " " @@ -56,7 +58,7 @@ public class Xoctg_catpage_mgr__basic__tst { )); } @Test public void Page_all() { - fxt .Init_itms__pages("A1").Init_grp__pages(0, 1) + fxt .Init_itms__pages("A1") .Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last ( "" , "
    " @@ -68,7 +70,7 @@ public class Xoctg_catpage_mgr__basic__tst { , " " , "

    A

    " , "
      " - , "
    • A1
    • " + , "
    • A1
    • " , "
    " , " " , " " @@ -78,7 +80,7 @@ public class Xoctg_catpage_mgr__basic__tst { )); } @Test public void File_all() { - fxt .Init_itms__files("File:A1.png").Init_grp__files(0, 1) + fxt .Init_itms__files("File:A1.png") .Test__html__all(Xoa_ctg_mgr.Tid__file, String_.Concat_lines_nl_skip_last ( "" , "
    " @@ -90,7 +92,7 @@ public class Xoctg_catpage_mgr__basic__tst { , " " , "

    A

    " , " " , " " , " " @@ -98,25 +100,9 @@ public class Xoctg_catpage_mgr__basic__tst { , "
    " , "
    " )); -// , " " } @Test public void Subc_all() { - fxt .Init_itms__subcs("Category:Subc_1").Init_grp__files(0, 1) + fxt .Init_itms__subcs("Category:Subc_1") .Test__html__all(Xoa_ctg_mgr.Tid__subc, String_.Concat_lines_nl_skip_last ( "" , "
    " @@ -152,46 +138,82 @@ public class Xoctg_catpage_mgr__basic__tst { )); } @Test public void Page_all_cols() { - fxt .Init_itms__pages("A1", "A2", "A3", "B1", "C1").Init_grp__pages(0, 5) - .Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last - ( "" - , "
    " - , "

    Pages in category \"Ctg_1\"

    " - , "

    The following 5 pages are in this category, out of 5 total.

    " - , "
    " - , " " - , " " - , " " - , " " - , " " - , " " - , "
    " - , "

    A

    " - , "
      " - , "
    • A1
    • " - , "
    • A2
    • " - , "
    " - , "
    " - , "

    A cont.

    " - , "
      " - , "
    • A3
    • " - , "
    " - , "

    B

    " - , "
      " - , "
    • B1
    • " - , "
    " - , "
    " - , "

    C

    " - , "
      " - , "
    • C1
    • " - , "
    " - , "
    " - , "
    " - , "
    " - )); + fxt.Init_itms__pages("A1", "A2", "A3", "B1", "C1"); + fxt.Init__grp_max_(6); + fxt.Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last + ( "" + , "
    " + , "

    Pages in category \"Ctg_1\"

    " + , "

    The following 5 pages are in this category, out of 5 total.

    " + , "
    " + , " " + , " " + , " " + , " " + , " " + , " " + , "
    " + , "

    A

    " + , "
      " + , "
    • A1
    • " + , "
    • A2
    • " + , "
    " + , "
    " + , "

    A cont.

    " + , "
      " + , "
    • A3
    • " + , "
    " + , "

    B

    " + , "
      " + , "
    • B1
    • " + , "
    " + , "
    " + , "

    C

    " + , "
      " + , "
    • C1
    • " + , "
    " + , "
    " + , "
    " + , "
    " + )); + } + @Test public void Page__numeric() { // PURPOSE: check numeric sorting; 0, 9, 10; not 0, 10, 9; DATE:2016-10-09 + fxt.Init_itms__pages("0", "9", "10"); + fxt.Init__grp_max_(6); + fxt.Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last + ( "" + , "
    " + , "

    Pages in category \"Ctg_1\"

    " + , "

    The following 3 pages are in this category, out of 3 total.

    " + , "
    " + , " " + , " " + , " " + , " " + , " " + , " " + , "
    " + , "

    0-9

    " + , "
      " + , "
    • 0
    • " + , "
    " + , "
    " + , "

    0-9 cont.

    " + , "
      " + , "
    • 9
    • " + , "
    " + , "
    " + , "

    0-9 cont.

    " + , "
      " + , "
    • 10
    • " + , "
    " + , "
    " + , "
    " + , "
    " + )); } @Test public void Title__escape_quotes() {// PURPOSE: quotes in title should be escaped; DATE:2015-12-28 - fxt .Init_itms__pages("A\"1").Init_grp__pages(0, 1) + fxt .Init_itms__pages("A\"1") .Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last ( "" , "
    " @@ -203,7 +225,7 @@ public class Xoctg_catpage_mgr__basic__tst { , " " , "

    A

    " , " " , " " , " " @@ -226,44 +248,49 @@ public class Xoctg_catpage_mgr__basic__tst { } class Xoctg_catpage_mgr_fxt { private int grp_max; + private Uca_ltr_extractor ltr_extractor = new Uca_ltr_extractor(true); public Xoctg_catpage_mgr_fxt Clear() { if (app == null) { app = Xoa_app_fxt.Make__app__edit(); wiki = Xoa_app_fxt.Make__wiki__edit(app); - ctg_html = wiki.Html_mgr().Catpage_mgr(); + ctg_html = wiki.Ctg__catpage_mgr(); } - ctg = new Xoctg_catpage_ctg(Bry_.new_a7("Ctg_1")); - grp_max = Xoctg_catpage_mgr.Grp_max_dflt; + ctg = new Xoctg_catpage_ctg(1, Bry_.new_a7("Ctg_1")); + grp_max = 3; // default to 3 paer page return this; } private Xoae_app app; private Xoctg_catpage_mgr ctg_html; public void Test__calc_col_len(int grp_len, int col_idx, int expd) {Tfds.Eq(expd, Xoctg_fmt_itm_base.Calc_col_len(grp_len, col_idx, 3));} public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki; public Xoctg_catpage_ctg Ctg() {return ctg;} private Xoctg_catpage_ctg ctg; + public void Init__grp_max_(int v) {this.grp_max = v;} + public void Init__prev_hide_y_(byte tid) {ctg.Grp_by_tid(tid).Prev_disable_(true);} + public void Init__next_sortkey_(byte tid, String v) {ctg.Grp_by_tid(tid).Next_sortkey_(Bry_.new_u8(v));} public void Test__navlink(boolean next, String ctg_str, String expd) { byte[] actl = ctg_html.Fmt(Xoa_ctg_mgr.Tid__page).Bld_bwd_fwd(wiki, Xoa_ttl.Parse(wiki, Bry_.new_a7(ctg_str)), ctg.Grp_by_tid(Xoa_ctg_mgr.Tid__page), grp_max); Tfds.Eq_str_lines(expd, String_.new_u8(actl)); } - public Xoctg_catpage_mgr_fxt Init_grp_max(int v) {this.grp_max = v; return this;} - public Xoctg_catpage_mgr_fxt Init_grp__pages(int bgn, int count) {ctg.Pages().Rng_(bgn, count); return this;} - public Xoctg_catpage_mgr_fxt Init_grp__files(int bgn, int count) {ctg.Files().Rng_(bgn, count); return this;} public Xoctg_catpage_mgr_fxt Init_itms__pages(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__page, titles);} public Xoctg_catpage_mgr_fxt Init_itms__files(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__file, titles);} public Xoctg_catpage_mgr_fxt Init_itms__subcs(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__subc, titles);} private Xoctg_catpage_mgr_fxt Init_itms(byte tid, String[] ttls) { int len = ttls.length; + Xoctg_catpage_tmp tmp = new Xoctg_catpage_tmp(); Xoctg_catpage_grp grp = ctg.Grp_by_tid(tid); + grp.Count_all_(len); for (int i = 0; i < len; ++i) { - Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.new_u8(ttls[i])); - grp.Itms__add(new Xoctg_catpage_itm(i, ttl, ttl.Page_txt())); + byte[] page_ttl_bry = Bry_.new_u8(ttls[i]); + Xoa_ttl ttl = Xoa_ttl.Parse(wiki, page_ttl_bry); + Xoctg_catpage_itm itm = Xoctg_catpage_itm.New_by_ttl(tid, i, ttl); + tmp.Add(itm); } - grp.Itms__make(); + tmp.Make_by_grp(grp); return this; } public void Test__html__page(byte tid, byte grp_char_0, String expd) { Xoctg_fmt_grp list_mgr = ctg_html.Fmt(tid); Xoctg_fmt_itm_base itm_fmt = list_mgr.Itm_fmt(); Xoctg_catpage_grp list = ctg.Grp_by_tid(tid); - itm_fmt.Init_from_ltr(wiki, list); + itm_fmt.Init_from_ltr(wiki, list, ltr_extractor); itm_fmt.Set_ltr_and_bgn(new byte[] {grp_char_0}, 0); itm_fmt.Col_end_(0, 0); Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512(); @@ -273,14 +300,14 @@ class Xoctg_catpage_mgr_fxt { public void Test__html_grp(byte tid, String expd) { Xoctg_fmt_grp list_mgr = ctg_html.Fmt(tid); Xoctg_fmt_ltr fmtr_grp = new Xoctg_fmt_ltr(list_mgr.Itm_fmt()); - fmtr_grp.Init_from_grp(wiki, ctg.Grp_by_tid(tid)); + fmtr_grp.Init_from_grp(wiki, ctg.Grp_by_tid(tid), ltr_extractor); 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.Fmt(tid).Write_catpage_grp(bfr, wiki, wiki.Lang(), ctg, grp_max); + ctg_html.Fmt(tid).Write_catpage_grp(bfr, wiki, wiki.Lang(), ltr_extractor, ctg, grp_max); Tfds.Eq_str_lines(expd, bfr.To_str_and_rls()); } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java index c33f88423..9f48d0d5e 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__navlink__tst.java @@ -21,43 +21,39 @@ import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addon public class Xoctg_catpage_mgr__navlink__tst { @Before public void init() {fxt.Clear();} private Xoctg_catpage_mgr_fxt fxt = new Xoctg_catpage_mgr_fxt(); @Test public void Navlink__basic() { - fxt .Init_itms__pages("A1", "A2", "A3").Init_grp_max(1).Init_grp__pages(1, 2) - .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl + fxt.Init_itms__pages("A2", "A3", "A4"); + fxt.Init__next_sortkey_(Xoa_ctg_mgr.Tid__page, "A5"); + fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl ( "" - , "(previous 1)" - , "(next 1)" + , "(previous 3)" + , "(next 3)" )); } @Test public void Navlink__encoded() { // escape quotes and spaces; DATE:2016-01-11 - fxt .Init_itms__pages("A\" 1", "A\" 2", "A\" 3").Init_grp_max(1).Init_grp__pages(1, 2) - .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl + fxt.Init_itms__pages("A\" 2", "A\" 3", "A\" 4"); + fxt.Init__next_sortkey_(Xoa_ctg_mgr.Tid__page, "A\" 5"); + fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl ( "" - , "(previous 1)" - , "(next 1)" + , "(previous 3)" + , "(next 3)" )); } @Test public void Navlink__bos() { - fxt .Init_itms__pages("A1", "A2", "A3").Init_grp_max(1).Init_grp__pages(0, 1) - .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl + fxt.Init_itms__pages("A2", "A3", "A4"); + fxt.Init__prev_hide_y_(Xoa_ctg_mgr.Tid__page); + fxt.Init__next_sortkey_(Xoa_ctg_mgr.Tid__page, "A5"); + fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl ( "" - , "(previous 1)" - , "(next 1)" + , "(previous 3)" + , "(next 3)" )); } @Test public void Navlink__eos() { - fxt .Init_itms__pages("A1", "A2", "A3").Init_grp_max(2).Init_grp__pages(2, 3) - .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl + fxt.Init_itms__pages("A2", "A3", "A4"); + fxt.Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl ( "" - , "(previous 2)" - , "(next 2)" - )); - } - @Test public void Navlink__eos__2() { // PURPOSE.fix: do not suppress next page on penultimate page; DATE:2016-09-25 - fxt .Init_itms__pages("A1", "A2", "A3", "A4").Init_grp_max(2).Init_grp__pages(2, 3) - .Test__navlink(Bool_.Y, "Category:Ctg_1", String_.Concat_lines_nl - ( "" - , "(previous 2)" - , "(next 2)" + , "(previous 3)" + , "(next 3)" )); } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java new file mode 100644 index 000000000..d09ba0044 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java @@ -0,0 +1,182 @@ +/* +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.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs.*; +class Xoctg_catlink_loader { + private byte version; + private int link_dbs_len; + private Db_attach_mgr attach_mgr; + private final Bry_bfr sortkey_val_bfr = Bry_bfr_.New(); + public void Run(Xoctg_catpage_ctg rv, Xow_wiki wiki, Xoctg_catpage_mgr catpage_mgr, Xowd_page_tbl page_tbl, int cat_id, byte grp_tid, boolean url_is_from, byte[] url_sortkey, int limit) { + String sql = Bld_sql(catpage_mgr, cat_id, grp_tid, url_is_from, url_sortkey, limit); + Load_catlinks(rv, wiki, page_tbl, rv.Grp_by_tid(grp_tid), sql, url_is_from, limit); + } + public void Make_attach_mgr__v2(Xow_db_mgr db_mgr, int cat_link_db_idx) { + this.version = 2; + this.link_dbs_len = 1; + Xow_db_file cat_link_db = db_mgr.Dbs__get_by_id_or_fail(cat_link_db_idx); + this.attach_mgr = new Db_attach_mgr(cat_link_db.Conn(), new Db_attach_itm("link_db_1", cat_link_db.Conn())); + } + public void Make_attach_mgr__v3_v4(Xow_db_mgr db_mgr, Db_conn cat_core_conn) { + // init db vars + List_adp db_list = List_adp_.New(); + Db_conn db_1st = null; + int db_idx = 0; + + // fill db_list by looping over each db unless (a) cat_link_db or (b) core_db (if all or few) + int len = db_mgr.Dbs__len(); + for (int i = 0; i < len; ++i) { + Xow_db_file cl_db = db_mgr.Dbs__get_at(i); + switch (cl_db.Tid()) { + case Xow_db_file_.Tid__cat_link: // always use cat_link db + break; + case Xow_db_file_.Tid__core: // only use core if all or few + if (db_mgr.Props().Layout_text().Tid_is_lot()) + continue; + else + break; + default: // skip all other files + continue; + } + + // add to db_list + if (db_1st == null) db_1st = cl_db.Conn(); + db_list.Add(new Db_attach_itm("link_db_" + ++db_idx, cl_db.Conn())); + } + + // make attach_mgr + this.version = 4; + this.link_dbs_len = db_list.Len(); + if (cat_core_conn.Meta_tbl_exists("cat_sort")) { + version = 3; + db_1st = cat_core_conn; + } + this.attach_mgr = new Db_attach_mgr(db_1st, (Db_attach_itm[])db_list.To_ary_and_clear(Db_attach_itm.class)); + } + private String Bld_sql (Xoctg_catpage_mgr catpage_mgr, int cat_id, byte grp_tid, boolean url_is_from, byte[] url_sortkey, int limit) { + Bry_bfr bfr = Bry_bfr_.New(); + for (int i = 0; i < link_dbs_len; ++i) + Bld_sql_by_db(catpage_mgr, cat_id, grp_tid, url_is_from, url_sortkey, i + List_adp_.Base1, bfr); + bfr.Add_str_u8_fmt + ( "\nORDER BY cl_to_id, cl_type_id, cl_sortkey {0}" + + "\nLIMIT {1}" + , url_is_from ? "ASC" : "DESC", limit + 1); + return bfr.To_str_and_clear(); + } + private void Bld_sql_by_db (Xoctg_catpage_mgr catpage_mgr, int cat_id, byte grp_tid, boolean url_is_from, byte[] url_sortkey, int link_db_id, Bry_bfr bfr) { + if (link_db_id != List_adp_.Base1) bfr.Add_str_a7("\nUNION\n"); + + // change sortkey vars per version; note that v3 differs from v2 and v4 b/c of cat_sort tbl + String sortkey_col = "cl_sortkey"; + String sortkey_join = ""; + if (version == 3) { // NOTE: version 3 takes sortkey from cat_sort + sortkey_col = "cs.cs_key"; + sortkey_join = "\n JOIN cat_sort cs ON cl.cl_sortkey_id = cs.cs_id"; + } + + // sortkey_val + byte[] sortkey_val = null; + String sortkey_prefix_fld = version == 4 ? "cl_sortkey_prefix" : "''"; + sortkey_val = Build_sortkey_val(sortkey_val_bfr, version, catpage_mgr.Collation_mgr(), url_sortkey); + + // bld sql; NOTE: building sql with args embedded b/c (a) UNION requires multiple Crt_arg for each ?; (EX: 4 unions, 3 ? require 12 .Crt_arg); (b) easier to debug + String sql = Db_sql_.Make_by_fmt(String_.Ary + ( "SELECT cl_to_id" + , ", cl_from" + , ", cl_type_id" + , ", {3} AS cl_sortkey" + , ", {7} AS cl_sortkey_prefix" + , "FROM cat_link cl{6}" + , "WHERE cl_to_id = {1}" + , "AND cl_type_id = {2}" + , "AND {3} {4} {5}" + ), link_db_id, cat_id, grp_tid, sortkey_col, url_is_from ? ">=" : "<", sortkey_val, sortkey_join, sortkey_prefix_fld); + bfr.Add_str_u8(sql); + } + private void Load_catlinks(Xoctg_catpage_ctg rv, Xow_wiki wiki, Xowd_page_tbl page_tbl, Xoctg_catpage_grp grp, String sql, boolean url_is_from, int limit) { + // init; prep sql + Xoctg_page_loader catlink_loader = new Xoctg_page_loader(wiki); + Ordered_hash hash = catlink_loader.Hash(); + sql = attach_mgr.Resolve_sql(sql); + + // run sql and create itms based on cat_link + Xoctg_catpage_itm itm_zth = null; + Db_rdr rdr = Db_rdr_.Empty; + int row_idx = 0; + try { + attach_mgr.Attach(); + rdr = attach_mgr.Conn_main().Stmt_sql(sql).Exec_select__rls_auto(); + while (rdr.Move_next()) { + Xoctg_catpage_itm itm = Xoctg_catpage_itm.New_by_rdr(rdr, version); + if (row_idx++ < limit) // row_idx >= limit for last row; EX: 200 < 200 + hash.Add(itm.Page_id(), itm); + else { // last row; EX: 201 + if (url_is_from) // from=some_key; 201st row is sort_key for "(Next 200)" + itm_zth = itm; + else // until=some_key; 201st row means that 200th row is not 1st row; show prev link + grp.Prev_disable_(false); + } + } + } + finally { + rdr.Rls(); + attach_mgr.Detach(); + } + + // load ns / ttl from page + page_tbl.Select_in__id(catlink_loader); + grp.Itms_((Xoctg_catpage_itm[])hash.To_ary_and_clear(Xoctg_catpage_itm.class)); + + // set data for Next 200 / Previous 200 + if (itm_zth != null) { + if (version == 4) { + Xowd_page_itm tmp_pg = new Xowd_page_itm(); + page_tbl.Select_by_id(tmp_pg, itm_zth.Page_id()); + Xoa_ttl zth_ttl = wiki.Ttl_parse(tmp_pg.Ns_id(), tmp_pg.Ttl_page_db()); + itm_zth.Page_ttl_(zth_ttl); + itm_zth.Sortkey_handle_make(Bry_bfr_.New(), grp.Itms__get_at(grp.Itms__len() - 1).Sortkey_handle()); + grp.Next_sortkey_(itm_zth.Sortkey_handle()); + } + else + grp.Next_sortkey_(itm_zth.Sortkey_handle()); + } + } + public static byte[] Build_sortkey_val(Bry_bfr sortkey_val_bfr, byte version, Xoctg_collation_mgr collation_mgr, byte[] url_sortkey) { + // find \n and ignore everything after it; needed else "< 'A\nA'" will pull up "A"; NOTE: can't find logic in MediaWiki CategoryViewer.php; DATE:2016-10-11 + // ALSO: needed for v2 else SQL will literally have WHERE cl_sortkey = 'A\nA'; + byte[] tmp_sortkey = url_sortkey; + int nl_pos = Bry_find_.Find_fwd(tmp_sortkey, Byte_ascii.Nl); + if (nl_pos != Bry_find_.Not_found) + tmp_sortkey = Bry_.Mid(tmp_sortkey, 0, nl_pos); + + if (version == 4) { + if (Bry_.Len_gt_0(url_sortkey)) { + // make sortkey_val + sortkey_val_bfr.Add_byte(Byte_ascii.Ltr_x).Add_byte_apos(); + gplx.core.encoders.Hex_utl_.Encode_bfr(sortkey_val_bfr, collation_mgr.Get_sortkey(tmp_sortkey)); + sortkey_val_bfr.Add_byte_apos(); + } + else + sortkey_val_bfr.Add_byte_apos().Add_byte_apos(); + } + else + sortkey_val_bfr.Add_byte_apos().Add(Db_sql_.Escape_arg(tmp_sortkey)).Add_byte_apos(); + return sortkey_val_bfr.To_bry_and_clear(); + } +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader__tst.java new file mode 100644 index 000000000..65a49d135 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader__tst.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.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; +import org.junit.*; import gplx.core.tests.*; import gplx.xowa.apps.urls.*; +import gplx.xowa.langs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs.*; +public class Xoctg_catlink_loader__tst { + private final Xoctg_catlink_loader__fxt fxt = new Xoctg_catlink_loader__fxt(); + @Test public void Build_sortkey_val__v4() { // PURPOSE: remove "\n" and afterwards else will omit 1 record + fxt.Test__build_sortkey_sql(4, "A\nA", "x'41'"); // fails if "x'410a41'" + } + @Test public void Build_sortkey_val__v2() { // PURPOSE: remove "\n" and afterwards else SQL will be malformed + fxt.Test__build_sortkey_sql(2, "A\nA", "'A'"); // fails if "'A\nA'" + } +} +class Xoctg_catlink_loader__fxt { + public void Test__build_sortkey_sql(int version, String sortkey, String expd) { + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "de.wikipedia.org"); // use "de.wikipedia.org" for simple "uppercase" collation + Xoctg_collation_mgr collation_mgr = new Xoctg_collation_mgr(wiki); + + Bry_bfr bfr = Bry_bfr_.New(); + Gftest.Eq__str(expd, Xoctg_catlink_loader.Build_sortkey_val(bfr, Byte_.By_int(version), collation_mgr, Bry_.new_u8(sortkey))); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catpage_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catpage_loader.java new file mode 100644 index 000000000..36a045ebd --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catpage_loader.java @@ -0,0 +1,71 @@ +/* +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.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.wikis.ctgs.dbs.*; +import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.dbs.*; +public class Xoctg_catpage_loader { + public Xoctg_catpage_ctg Load_ctg_or_null(Xow_wiki wiki, Xoctg_catpage_mgr catpage_mgr, Xoctg_catpage_url cat_url, Xoa_ttl cat_ttl, int limit) { + // get cat_id from page_tbl + Xow_db_mgr db_mgr = wiki.Data__core_mgr(); + Xowd_page_tbl page_tbl = db_mgr.Db__core().Tbl__page(); + Xowd_page_itm page_itm = page_tbl.Select_by_ttl_as_itm_or_null(cat_ttl); + if (page_itm == null) { + Gfo_usr_dlg_.Instance.Warn_many("", "", "category does not exist in page table; ttl=~{0}", cat_ttl.Full_db()); + return null; + } + int cat_id = page_itm.Id(); + + // get cat_core_itm from cat_core_tbl + Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr); + Xowd_category_itm cat_core_itm = cat_core_tbl.Select(cat_id); + if (cat_core_itm == Xowd_category_itm.Null) { + Gfo_usr_dlg_.Instance.Log_many("", "", "category does not exist in cat_core table; ttl=~{0}", cat_ttl.Full_db()); // NOTE: this is not rare as Category pages can be created as deliberately empty, or as redirects; fr.w:Catégorie:Utilisateur_hess-4; DATE:2016-09-12 + return null; + } + + // load itms from cat_link_db for each grp_tid + Xoctg_catpage_ctg rv = new Xoctg_catpage_ctg(cat_id, cat_ttl.Page_txt()); + for (byte grp_tid = Xoa_ctg_mgr.Tid__subc; grp_tid < Xoa_ctg_mgr.Tid___max; ++grp_tid) { + Xoctg_catpage_grp grp = rv.Grp_by_tid(grp_tid); + grp.Count_all_(cat_core_itm.Count_by_tid(grp_tid)); // set total counts per grp based on cat_core_itm; + + // init url_vars + boolean url_is_from = cat_url.Grp_fwds()[grp_tid]; // EX: "pagefrom=A"; "pageuntil=B" + byte[] url_sortkey = cat_url.Grp_keys()[grp_tid]; + + // set prev / next props to dflt values + if (url_is_from) { // url is from; EX: from=A + if (Bry_.Len_eq_0(url_sortkey)) // no sortkey specified for group, so group always starts with 1st itm -> disable previous link + grp.Prev_disable_(true); + } + else { // url is until; EX: until=A + grp.Prev_disable_(true); // default prev link to disabled; loader will load 201 items and set to false if 201st found + grp.Next_sortkey_(url_sortkey); // next sortkey is always sortkey of until url arg; + } + + // load links + Xoctg_catlink_loader loader = new Xoctg_catlink_loader(); + if (cat_core_itm.File_idx() == -1) // v3 or v4: loop over all cat_link dbs { + loader.Make_attach_mgr__v3_v4 (db_mgr, cat_core_tbl.Conn()); + else // v2: use cat_link_db + loader.Make_attach_mgr__v2 (db_mgr, cat_core_itm.File_idx()); + loader.Run(rv, wiki, catpage_mgr, page_tbl, cat_id, grp_tid, url_is_from, url_sortkey, limit); + } + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_page_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_page_loader.java new file mode 100644 index 000000000..65f736531 --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_page_loader.java @@ -0,0 +1,42 @@ +/* +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.addons.wikis.ctgs.htmls.catpages.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; +import gplx.dbs.*; import gplx.xowa.wikis.data.tbls.*; +import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; +public class Xoctg_page_loader implements Select_in_cbk { + private final Xow_wiki wiki; + private final Ordered_hash hash = Ordered_hash_.New(); + public Xoctg_page_loader(Xow_wiki wiki) {this.wiki = wiki;} + public Ordered_hash Hash() {return hash;} + public int Hash_max() {return hash.Len();} + public void Write_sql(Bry_bfr bfr, int idx) { + Xoctg_catpage_itm itm = (Xoctg_catpage_itm)hash.Get_at(idx); + bfr.Add_int_variable(itm.Page_id()); + } + public void Read_data(Db_rdr rdr) { + // read values from page_tbl + int page_id = rdr.Read_int("page_id"); + int page_ns = rdr.Read_int("page_namespace"); + byte[] page_ttl = rdr.Read_bry_by_str("page_title"); + + // get itm and set data + Xoctg_catpage_itm itm = (Xoctg_catpage_itm)hash.Get_by(page_id); + if (itm == null) return; // NOTE: itms can exist in cat_links_tbl, but not in page_tbl; EX:User:Any_page + itm.Page_ttl_(wiki.Ttl_parse(page_ns, page_ttl)); + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java index 0dadf10c2..fc0fb109d 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_ctg.java @@ -17,12 +17,15 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; public class Xoctg_catpage_ctg { - public Xoctg_catpage_ctg(byte[] name) {this.name = name;} - public byte[] Name() {return name;} private final byte[] name; - public Xoctg_catpage_grp Subcs() {return subcs;} private final Xoctg_catpage_grp subcs = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__subc); - public Xoctg_catpage_grp Pages() {return pages;} private final Xoctg_catpage_grp pages = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__page); - public Xoctg_catpage_grp Files() {return files;} private final Xoctg_catpage_grp files = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__file); - public int Total() {return subcs.Itms__len() + pages.Itms__len() + files.Itms__len();} + public Xoctg_catpage_ctg(int id, byte[] name) { + this.id = id; this.name = name; + } + public int Id() {return id;} private final int id; + public byte[] Name() {return name;} private final byte[] name; + public Xoctg_catpage_grp Subcs() {return subcs;} private final Xoctg_catpage_grp subcs = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__subc); + public Xoctg_catpage_grp Pages() {return pages;} private final Xoctg_catpage_grp pages = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__page); + public Xoctg_catpage_grp Files() {return files;} private final Xoctg_catpage_grp files = new Xoctg_catpage_grp(Xoa_ctg_mgr.Tid__file); + public int Total() {return subcs.Count_all() + pages.Count_all() + files.Count_all();} public Xoctg_catpage_grp Grp_by_tid(byte tid) { switch (tid) { case Xoa_ctg_mgr.Tid__subc: return subcs; @@ -31,10 +34,4 @@ public class Xoctg_catpage_ctg { default: throw Err_.new_unhandled(tid); } } - public void Make_itms() { - for (byte i = 0; i < Xoa_ctg_mgr.Tid___max; ++i) { - Xoctg_catpage_grp grp = Grp_by_tid(i); - grp.Itms__make(); - } - } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java index cd4556f18..82c8e29e8 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java @@ -17,27 +17,38 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; public class Xoctg_catpage_grp { - private final List_adp tmp_list = List_adp_.New(); + private Xoctg_catpage_itm[] itms = Xoctg_catpage_itm.Ary_empty; + private byte[] next_sortkey = Bry_.Empty; public Xoctg_catpage_grp(byte tid) {this.tid = tid;} - public byte Tid() {return tid;} private byte tid; // subc|page|file - public int Bgn() {return bgn;} private int bgn; // idx of 1st item; EX: 200 - public int End() {return end;} private int end; // idx of nth item + 1; EX: 399 - public int Count_by_page() {return end - bgn;} // count of items on page; EX: 200 - public int Itms__len() {return itms_len;} private int itms_len; // count of items in entire category; EX: 456 - public Xoctg_catpage_itm[] Itms() {return itms;} private Xoctg_catpage_itm[] itms = Xoctg_catpage_itm.Ary_empty; - public Xoctg_catpage_itm Itms__get_at(int i) { - if (i < 0 || i >= itms.length) throw Err_.new_wo_type("catpage: i is out of bounds", "i", i, "len", itms.length, "tid", tid); - Xoctg_catpage_itm rv = itms[i]; if (rv == null) throw Err_.new_wo_type("ctg.view: itm is null", "i", i, "len", itms.length, "tid", tid); - return rv; + public byte Tid() {return tid;} private byte tid; // subc|page|file + public int Count_all() {return count_all;} private int count_all; // count of items in entire category; EX: 456 + public boolean Prev_disable() {return prev_disable;} private boolean prev_disable; // prev_link: disable link + public byte[] Next_sortkey() {return next_sortkey;} // next_link: set sortkey + public int Itms__len() {return itms.length;} + public Xoctg_catpage_itm Itms__get_at(int i) {return itms[i];} + + public void Count_all_(int v) {this.count_all = v;} + public void Prev_disable_(boolean v) {this.prev_disable = v;} + public void Next_sortkey_(byte[] v) {this.next_sortkey = v;} + public void Itms_(Xoctg_catpage_itm[] v) { + this.itms = v; + Array_.Sort(itms, new Xoctg_catpage_itm_sorter()); // NOTE: need to reorder for page_until b/c ORDER BY DESC + + // make sortkey_handle + Bry_bfr tmp_bfr = Bry_bfr_.New(); + int itms_len = itms.length; + byte[] prv_sortkey_handle = Bry_.Empty; + for (int i = 0; i < itms_len; ++i) { + Xoctg_catpage_itm itm = itms[i]; + prv_sortkey_handle = itm.Sortkey_handle_make(tmp_bfr, prv_sortkey_handle); + } } - public void Itms__add(Xoctg_catpage_itm sub) {tmp_list.Add(sub);} - public void Itms__make() { - tmp_list.Sort_by(Xoctg_catpage_itm_sorter__sort_key.Sorter); - itms = (Xoctg_catpage_itm[])tmp_list.To_ary_and_clear(Xoctg_catpage_itm.class); - bgn = 0; - end = itms_len = itms.length; - } - public void Rng_(int bgn, int end) { - this.bgn = bgn; this.end = end; + +} +class Xoctg_catpage_itm_sorter implements gplx.core.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Xoctg_catpage_itm lhs = (Xoctg_catpage_itm)lhsObj; + Xoctg_catpage_itm rhs = (Xoctg_catpage_itm)rhsObj; + return Bry_.Compare(lhs.Sortkey_binary(), rhs.Sortkey_binary()); } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java index 8fb9a12cb..d3fd4b6ea 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java @@ -16,17 +16,86 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; +import gplx.dbs.*; import gplx.xowa.wikis.nss.*; public class Xoctg_catpage_itm { - public Xoctg_catpage_itm(int page_id, Xoa_ttl page_ttl, byte[] sort_key) { + private byte version; + Xoctg_catpage_itm(byte version, byte grp_tid, int page_id, byte[] sortkey_prefix, byte[] sortkey_binary) { + this.version = version; + this.grp_tid = grp_tid; this.page_id = page_id; - this.page_ttl = page_ttl; - this.sort_key = sort_key.length == 0 ? page_ttl.Page_db() : sort_key; // v1 will not have sortkey data; PAGE:s.w:Category:Computer_science DATE:2015-11-22 + this.page_ttl = Xoa_ttl.Null; + this.sortkey_prefix = sortkey_prefix; + this.sortkey_handle = sortkey_prefix; // default handle to sortkey_prefix; + this.sortkey_binary = sortkey_binary; + } + public byte Grp_tid() {return grp_tid;} private final byte grp_tid; // v2-v4:cl_type_id; subc,page,file + public int Page_id() {return page_id;} private final int page_id; // v2-v4:cl_from + public byte[] Sortkey_prefix() {return sortkey_prefix;} private byte[] sortkey_prefix; // v2-v3:cl_sortkey; v4:cl_sortkey_prefix + public byte[] Sortkey_handle() {return sortkey_handle;} private byte[] sortkey_handle; // v2-v3:cl_sortkey; v4:cl_sortkey_prefix\nttl_txt; never "cl_sortkey" which is binary ICU value; + public byte[] Sortkey_binary() {return sortkey_binary;} private byte[] sortkey_binary; // v2-v4:cl_sortkey; note that v4 is binary icu value + public Xoa_ttl Page_ttl() {return page_ttl;} private Xoa_ttl page_ttl; + + public void Page_ttl_(Xoa_ttl ttl) { + this.page_ttl = ttl; + // sortkey_prefix will be blank for v2; use page_ttl; PAGE:s.w:Category:Computer_science DATE:2015-11-22 + if (version == Version__2 && Bry_.Len_eq_0(sortkey_prefix)) + sortkey_prefix = page_ttl.Page_txt(); + + // sortkey_binary will be blank for v2,v3; use page_ttl; PAGE:fr.w:Article_contenant_un_appel_à_traduction_en_anglais; DATE:2016-10-11 + if (version != Version__4 && Bry_.Len_eq_0(sortkey_binary)) sortkey_binary = page_ttl.Page_txt(); + } + public byte[] Sortkey_handle_make(Bry_bfr tmp_bfr, byte[] prv_sortkey_handle) { + // page.tbl missing even though in cat_link.tbl; happens for "User:" namespace pages; + if (page_ttl == Xoa_ttl.Null) { + // sortkey_prefix exists; happens for [[Category:A]] as opposed to [[Category:A|some_sortkey_prefix]] + if (Bry_.Len_gt_0(sortkey_prefix)) { + sortkey_handle = sortkey_prefix; + return sortkey_handle; // set sortkey_prefix as new prv_sortkey_handle; + } + else { + // set sortkey_handle to "prv_sortkey" + "page_id"; needed for multiple "missing" catlinks which span 200 page boundaries + tmp_bfr.Add(prv_sortkey_handle); + tmp_bfr.Add_byte_nl(); + tmp_bfr.Add_int_variable(page_id); + sortkey_handle = tmp_bfr.To_bry_and_clear(); + return prv_sortkey_handle; + } + } + // page.tbl exists + else { + // "In UCA, tab is the only character that can sort above LF so we strip both of them from the original prefix."; Title.php|getCategorySortKey + if (sortkey_prefix.length == 0) { + sortkey_handle = page_ttl.Page_txt(); + } + else { + byte[] sortkey_normalized = Bry_.Replace(sortkey_prefix, Sortkey_prefix_replace__src, Sortkey_prefix_replace__trg); + tmp_bfr.Add(sortkey_normalized); + tmp_bfr.Add_byte_nl().Add(page_ttl.Page_txt()); // "$prefix\n$unprefixed"; + sortkey_handle = tmp_bfr.To_bry_and_clear(); + } + return sortkey_handle; + } } - public int Page_id() {return page_id;} private int page_id; - public Xoa_ttl Page_ttl() {return page_ttl;} private Xoa_ttl page_ttl; - public byte[] Sort_key() {return sort_key;} private byte[] sort_key; - public boolean Missing() {return missing;} private boolean missing; // not used; remove?; - public void Missing_y_() {missing = true;} public static final Xoctg_catpage_itm[] Ary_empty = new Xoctg_catpage_itm[0]; + public static Xoctg_catpage_itm New_by_rdr(Db_rdr rdr, byte version) { + byte[] sortkey_binary = Bry_.Empty; + byte[] sortkey_prefix = Bry_.Empty; + if (version == Version__4) { + sortkey_binary = rdr.Read_bry("cl_sortkey"); + sortkey_prefix = rdr.Read_bry_by_str("cl_sortkey_prefix"); + } + else { + sortkey_binary = Bry_.Empty; + sortkey_prefix = rdr.Read_bry_by_str("cl_sortkey"); + } + return new Xoctg_catpage_itm(version, rdr.Read_byte("cl_type_id"), rdr.Read_int("cl_from"), sortkey_prefix, sortkey_binary); + } + public static Xoctg_catpage_itm New_by_ttl(byte grp_tid, int page_id, Xoa_ttl ttl) { // TEST + Xoctg_catpage_itm rv = new Xoctg_catpage_itm(Version__4, grp_tid, page_id, ttl.Page_txt(), Bry_.Empty); + rv.Page_ttl_(ttl); + return rv; + } + private static final byte Version__2 = 2, Version__4 = 4; + private static final byte[] Sortkey_prefix_replace__src = Bry_.new_a7("\n\t"), Sortkey_prefix_replace__trg = Bry_.new_a7(" "); } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm_sorter__sort_key.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java similarity index 52% rename from 400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm_sorter__sort_key.java rename to 400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java index 3bdb77ede..36d69ea1a 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm_sorter__sort_key.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java @@ -16,15 +16,28 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; -public class Xoctg_catpage_itm_sorter__sort_key implements gplx.core.lists.ComparerAble, gplx.core.lists.binary_searches.Binary_comparer { - public int compare(Object lhsObj, Object rhsObj) { - Xoctg_catpage_itm lhs = (Xoctg_catpage_itm)lhsObj; - Xoctg_catpage_itm rhs = (Xoctg_catpage_itm)rhsObj; - return Bry_.Compare(lhs.Sort_key(), rhs.Sort_key()); +public class Xoctg_catpage_tmp { + private final List_adp subc_list = List_adp_.New(), page_list = List_adp_.New(), file_list = List_adp_.New(); + public void Add(Xoctg_catpage_itm itm) { + List_adp list = Get_by_tid(itm.Grp_tid()); + list.Add(itm); } - public int Compare_val_to_obj(Object val, Object obj) { - Xoctg_catpage_itm itm = (Xoctg_catpage_itm)obj; - return Bry_.Compare((byte[])val, itm.Sort_key()); + public void Make_by_ctg(Xoctg_catpage_ctg ctg) { // TEST: + for (byte tid = 0; tid < Xoa_ctg_mgr.Tid___max; ++tid) + Make_by_grp(ctg.Grp_by_tid(tid)); + } + public void Make_by_grp(Xoctg_catpage_grp grp) { + byte tid = grp.Tid(); + List_adp list = Get_by_tid(tid); + if (list.Len() == 0) return; + grp.Itms_((Xoctg_catpage_itm[])list.To_ary_and_clear(Xoctg_catpage_itm.class)); + } + private List_adp Get_by_tid(byte tid) { + switch (tid) { + case Xoa_ctg_mgr.Tid__subc: return subc_list; + case Xoa_ctg_mgr.Tid__page: return page_list; + case Xoa_ctg_mgr.Tid__file: return file_list; + default: throw Err_.new_unhandled_default(tid); + } } - public static final Xoctg_catpage_itm_sorter__sort_key Sorter = new Xoctg_catpage_itm_sorter__sort_key(); } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java index 44425d2ac..8f4164a20 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.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.addons.wikis.ctgs.htmls.catpages.fmts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.langs.htmls.encoders.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.htmls.core.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.core.intls.ucas.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; public class Xoctg_fmt_grp { // subc|page|file @@ -32,47 +32,43 @@ public class Xoctg_fmt_grp { // subc|page|file this.url_arg_bgn = url_arg_bgn; this.url_arg_end = url_arg_end; this.div_id = div_id; } public Xoctg_fmt_itm_base Itm_fmt() {return itm_fmt;} private final Xoctg_fmt_itm_base itm_fmt; - public void Write_catpage_grp(Bry_bfr bfr, Xow_wiki wiki, Xol_lang_itm lang, Xoctg_catpage_ctg dom_ctg, int grp_max) { // TEST: + public void Write_catpage_grp(Bry_bfr bfr, Xow_wiki wiki, Xol_lang_itm lang, Uca_ltr_extractor ltr_extractor, Xoctg_catpage_ctg dom_ctg, int grp_max) { // TEST: Xoctg_catpage_grp dom_grp = dom_ctg.Grp_by_tid(tid); - if (dom_grp.Itms__len() == 0) return; // no items in grp; EX: 0 items in File + if (dom_grp.Count_all() == 0) return; // no items in grp; EX: 0 items in File // get msgs Xow_msg_mgr msg_mgr = wiki.Msg_mgr(); byte[] msg_label_bry = msg_mgr.Val_by_id_args(msg_label_id, dom_ctg.Name()); - byte[] msg_stats_bry = msg_mgr.Val_by_id_args(msg_stats_id, dom_grp.Count_by_page(), dom_grp.Itms__len()); + byte[] msg_stats_bry = msg_mgr.Val_by_id_args(msg_stats_id, dom_grp.Itms__len(), dom_grp.Count_all()); // get nav html; next / previous 200 Xoa_ttl ctg_ttl = wiki.Ttl_parse(Xow_ns_.Tid__category, dom_ctg.Name()); byte[] nav_html = this.Bld_bwd_fwd(wiki, ctg_ttl, dom_grp, grp_max); // init grp; write - itms_fmt.Init_from_grp(wiki, dom_grp); + itms_fmt.Init_from_grp(wiki, dom_grp, ltr_extractor); Fmt__ctg.Bld_many(bfr, div_id, msg_label_bry, msg_stats_bry, nav_html, lang.Key_bry(), lang.Dir_ltr_bry(), itms_fmt); } public byte[] Bld_bwd_fwd(Xow_wiki wiki, Xoa_ttl ttl, Xoctg_catpage_grp view_grp, int grp_max) { // TEST: - if (view_grp.Itms__len() < grp_max) return Bry_.Empty; // < 200; never show; + if (view_grp.Count_all() < grp_max) return Bry_.Empty; // < 200; never show; Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_k004(); Html_nav_bry(bfr, wiki, ttl, view_grp, grp_max, Bool_.N); Html_nav_bry(bfr, wiki, ttl, view_grp, grp_max, Bool_.Y); return bfr.To_bry_and_rls(); } - private void Html_nav_bry(Bry_bfr bfr, Xow_wiki wiki, Xoa_ttl ttl, Xoctg_catpage_grp grp, int grp_max, boolean type_is_next) { + private void Html_nav_bry(Bry_bfr bfr, Xow_wiki wiki, Xoa_ttl ttl, Xoctg_catpage_grp grp, int grp_max, boolean url_is_from) { Bry_bfr href_bfr = wiki.Utl__bfr_mkr().Get_b512(); // get nav_href; EX:href="/wiki/Category:Ctg_1?pageuntil=A1#mw-pages" wiki.Html__href_wtr().Build_to_bfr(href_bfr, wiki.App(), Xoh_wtr_ctx.Basic, wiki.Domain_bry(), ttl); byte[] arg_idx_lbl = null; byte[] arg_sortkey = null; - if (type_is_next) { + if (url_is_from) { arg_idx_lbl = url_arg_bgn; - - // get next category after last one on page; needed for "Next 200 (href=Cat_201)" - int nxt_idx = grp.End(); - if (nxt_idx == grp.Itms__len()) --nxt_idx; // if last item, then grp.End() does not exist; just use last one - arg_sortkey = grp.Itms__get_at(nxt_idx).Sort_key(); + arg_sortkey = grp.Next_sortkey(); } else { arg_idx_lbl = url_arg_end; - arg_sortkey = grp.Itms__get_at(grp.Bgn()).Sort_key(); // use 1st item as sortkey for "until" args + arg_sortkey = grp.Itms__get_at(0).Sortkey_handle(); // use 1st item as sortkey for "until" args } href_bfr.Add_byte(Byte_ascii.Question).Add(arg_idx_lbl).Add_byte(Byte_ascii.Eq); // filefrom= Gfo_url_encoder_.Http_url.Encode(href_bfr, arg_sortkey); // Abc @@ -80,12 +76,12 @@ public class Xoctg_fmt_grp { // subc|page|file byte[] nav_href = href_bfr.To_bry_and_rls(); // get nav_text - int nav_text_id = type_is_next ? Xol_msg_itm_.Id_next_results : Xol_msg_itm_.Id_prev_results; + int nav_text_id = url_is_from ? Xol_msg_itm_.Id_next_results : Xol_msg_itm_.Id_prev_results; byte[] nav_text = wiki.Msg_mgr().Val_by_id_args(nav_text_id, grp_max); // next 200 / previous 200 // print text if 1st / zth page; else, print html - if ( ( type_is_next && grp.Bgn() + grp_max > grp.Itms__len()) - || (!type_is_next && grp.Bgn() - grp_max < 0) + if ( ( url_is_from && Bry_.Len_eq_0(grp.Next_sortkey())) + || (!url_is_from && grp.Prev_disable()) ) Fmt__nav__text.Bld_many(bfr, nav_text); else diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java index 1d3c9b98e..eda036130 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_itm_base.java @@ -17,27 +17,32 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.langs.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.langs.*; import gplx.xowa.langs.msgs.*; import gplx.core.intls.ucas.*; import gplx.xowa.users.history.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; public abstract class Xoctg_fmt_itm_base implements gplx.core.brys.Bfr_arg { private final Bry_bfr tmp_bfr = Bry_bfr_.New(); private Xow_wiki wiki; private Xoctg_catpage_grp grp; + private Uca_ltr_extractor ltr_extractor; private byte[] ltr_cur; private int loop_bgn; private int col_end; public int Loop_end_idx() {return loop_end_idx;} private int loop_end_idx; public boolean Loop_ends_at_col() {return loop_ends_at_col;} private boolean loop_ends_at_col; public void Col_end_(int col_bgn, int col_idx) { - this.col_end = col_bgn + Calc_col_len(grp.Count_by_page(), col_idx, Cols_max); + this.col_end = col_bgn + Calc_col_len(grp.Itms__len(), col_idx, Cols_max); + } + public void Init_from_ltr(Xow_wiki wiki, Xoctg_catpage_grp grp, Uca_ltr_extractor ltr_extractor) { + this.wiki = wiki; + this.grp = grp; + this.ltr_extractor = ltr_extractor; } - public void Init_from_ltr(Xow_wiki wiki, Xoctg_catpage_grp grp) {this.wiki = wiki; this.grp = grp;} public void Set_ltr_and_bgn(byte[] ltr_cur, int loop_bgn) {this.ltr_cur = ltr_cur; this.loop_bgn = loop_bgn;} public void Bfr_arg__add(Bry_bfr bfr) { // init vars Xoh_href_parser href_parser = wiki.App().Html__href_parser(); Xou_history_mgr history_mgr = wiki.App().User().History_mgr(); - int grp_end = grp.End(); + int grp_end = grp.Itms__len(); // loop over itms; for (int i = loop_bgn; i < grp_end; i++) { @@ -50,28 +55,30 @@ public abstract class Xoctg_fmt_itm_base implements gplx.core.brys.Bfr_arg { // get sortkey Xoctg_catpage_itm itm = grp.Itms__get_at(i); - byte[] itm_sortkey = itm.Sort_key(); + byte[] itm_sortkey = itm.Sortkey_handle(); // reached end of ltr; exit - if (!Bry_.Has_at_bgn(itm_sortkey, ltr_cur, 0, itm_sortkey.length)) { + byte[] ltr_1st = ltr_extractor.Get_1st_ltr(itm_sortkey); + if (!Bry_.Has_at_bgn(ltr_1st, ltr_cur, 0, ltr_1st.length)) { loop_end_idx = i; loop_ends_at_col = i == col_end; return; } - Bld_html(bfr, wiki, history_mgr, href_parser, itm, itm.Page_ttl()); + Xoa_ttl itm_ttl = itm.Page_ttl(); + Bld_html(bfr, wiki, history_mgr, href_parser, itm, itm_ttl); } loop_end_idx = grp_end; loop_ends_at_col = true; } @gplx.Virtual public void Bld_html(Bry_bfr bfr, Xow_wiki wiki, Xou_history_mgr history_mgr, Xoh_href_parser href_parser, Xoctg_catpage_itm itm, Xoa_ttl ttl) { - byte[] itm_full_ttl = Gfh_utl.Escape_html_as_bry(tmp_bfr, ttl.Full_txt_w_ttl_case());// NOTE: ttl.Full_txt() to get full ns; EX: Template:A instead of just "A" - if (itm.Missing()) - fmt_missing.Bld_many(bfr, itm.Page_id(), itm_full_ttl); + if (ttl == Xoa_ttl.Null) + fmt_missing.Bld_many(bfr, itm.Page_id(), itm.Sortkey_handle()); else { + byte[] itm_full_ttl = Gfh_utl.Escape_html_as_bry(tmp_bfr, ttl.Full_txt_w_ttl_case());// NOTE: ttl.Full_txt() to get full ns; EX: Template:A instead of just "A" byte[] itm_href = wiki.Html__href_wtr().Build_to_bry(wiki, ttl); 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 - fmt_exists.Bld_many(bfr, itm_href, itm_atr_cls, itm_full_ttl, itm_full_ttl); + fmt_exists.Bld_many(bfr, itm_href, itm_atr_cls, itm_full_ttl, itm_full_ttl, gplx.core.encoders.Hex_utl_.Encode_bry(itm.Sortkey_binary())); } } private static final Bry_fmt @@ -81,7 +88,7 @@ public abstract class Xoctg_fmt_itm_base implements gplx.core.brys.Bfr_arg { ) , fmt_exists = Bry_fmt.Auto_nl_skip_last ( "" - , "
  • ~{itm_text}
  • " + , "
  • ~{itm_text}
  • " ) ; public static final int Cols_max = 3; diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java index 370b0da14..c5ceddd79 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_ltr.java @@ -17,23 +17,25 @@ along with this program. If not, see . */ package gplx.xowa.addons.wikis.ctgs.htmls.catpages.fmts; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.htmls.core.htmls.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; -import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; +import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.core.intls.ucas.*; +import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; public class Xoctg_fmt_ltr implements gplx.core.brys.Bfr_arg { // "A", "B", "C cont." private final Xoctg_fmt_itm_base itm_fmt; private Xoctg_catpage_grp grp; private byte[] msg__list_continues; + private Uca_ltr_extractor ltr_extractor; public Xoctg_fmt_ltr(Xoctg_fmt_itm_base itm_fmt) { this.itm_fmt = itm_fmt; } - public void Init_from_grp(Xow_wiki wiki, Xoctg_catpage_grp grp) { + public void Init_from_grp(Xow_wiki wiki, Xoctg_catpage_grp grp, Uca_ltr_extractor ltr_extractor) { this.grp = grp; this.msg__list_continues = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_list_continues); - itm_fmt.Init_from_ltr(wiki, grp); + this.ltr_extractor = ltr_extractor; + itm_fmt.Init_from_ltr(wiki, grp, ltr_extractor); } public void Bfr_arg__add(Bry_bfr bfr) { - int itm_idx = grp.Bgn(); // itm idx; EX: idx=201 in len=500 - int itm_end = grp.End(); + int itm_idx = 0; + int itm_end = grp.Itms__len(); int itms_len = itm_end - itm_idx; if (itms_len == 0) return; // no items; exit int col_idx = 0; // col idx; EX: 3 cols; idx = 0, 1, 2 @@ -45,8 +47,9 @@ public class Xoctg_fmt_ltr implements gplx.core.brys.Bfr_arg { // "A", "B", "C c Xoctg_catpage_itm itm = grp.Itms__get_at(itm_idx); // get ltr_head; EX: "C" or "C cont." - byte[] itm_sortkey = itm.Sort_key(); - byte[] ltr_cur = gplx.core.intls.Utf8_.Get_char_at_pos_as_bry(itm_sortkey, 0); + byte[] itm_sortkey = itm.Sortkey_handle(); + // byte[] ltr_cur = gplx.core.intls.Utf8_.Get_char_at_pos_as_bry(itm_sortkey, 0); + byte[] ltr_cur = ltr_extractor.Get_1st_ltr(itm_sortkey); byte[] ltr_head = Bry_.Eq(ltr_prv, ltr_cur) ? Bry_.Add(ltr_prv, Byte_ascii.Space_bry, msg__list_continues) // new col uses same ltr as last itm in old col; add "cont."; EX: "C cont." : ltr_cur; // else, just use ltr; EX: "C" diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/langs/Xoctg_collation_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/langs/Xoctg_collation_mgr.java new file mode 100644 index 000000000..faca4a53a --- /dev/null +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/langs/Xoctg_collation_mgr.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.addons.wikis.ctgs.htmls.catpages.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; +import gplx.core.intls.ucas.*; +public class Xoctg_collation_mgr { + private final Xow_wiki wiki; + private Uca_collator collator; + private String collation_name = "uppercase"; // REF:https://noc.wikimedia.org/conf/InitialiseSettings.php.txt|wgCategoryCollation|default + public Xoctg_collation_mgr(Xow_wiki wiki) { + this.wiki = wiki; + if (String_.Eq(wiki.Domain_str(), "en.wikipedia.org")) + collation_name = "uca-default-kn"; + } + public void Collation_name_(String v) { + this.collation_name = v; + } + public byte[] Get_sortkey(byte[] src) { + if (String_.Eq(collation_name, "uppercase")) { + return wiki.Lang().Case_mgr().Case_build_upper(src); + } + else { + if (collator == null) collator = Uca_collator_.New(collation_name, true); + return collator.Get_sortkey(String_.new_u8(src)); + } + } +} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java index c75640f95..9dbf26271 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url.java @@ -20,4 +20,16 @@ public class Xoctg_catpage_url { public Xoctg_catpage_url(byte[][] keys, boolean[] fwds) {this.keys = keys; this.fwds = fwds;} public byte[][] Grp_keys() {return keys;} private final byte[][] keys; public boolean[] Grp_fwds() {return fwds;} private final boolean[] fwds; + + public static Xoctg_catpage_url New__blank() { + byte[][] keys = new byte[Xoa_ctg_mgr.Tid___max][]; + boolean[] fwds = new boolean[Xoa_ctg_mgr.Tid___max]; + + // for blank url, all fwds are true; EX: "Category:A" -> keys {"", "", ""}, fwds {true, true, true} + for (int i = 0; i < Xoa_ctg_mgr.Tid___max; ++i) { + fwds[i] = Bool_.Y; + keys[i] = Bry_.Empty; + } + return new Xoctg_catpage_url(keys, fwds); + } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java index 25e90b494..d8f6f13fe 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/urls/Xoctg_catpage_url_parser.java @@ -21,15 +21,20 @@ import gplx.langs.htmls.encoders.*; public class Xoctg_catpage_url_parser { public static Xoctg_catpage_url Parse(Xoa_url url) { Gfo_qarg_itm[] args = url.Qargs_ary(); - if (args == null) return null; + if (args == null) return Xoctg_catpage_url.New__blank(); + int len = args.length; + if (len == 0) return Xoctg_catpage_url.New__blank(); // init caturl structs byte[][] keys = new byte[Xoa_ctg_mgr.Tid___max][]; boolean[] fwds = new boolean[Xoa_ctg_mgr.Tid___max]; + for (int i = 0; i < Xoa_ctg_mgr.Tid___max; ++i) { + fwds[i] = Bool_.Y; + keys[i] = Bry_.Empty; + } Bry_bfr tmp_bfr = Bry_bfr_.New(); // loop qargs; EX: "?subcatfrom=B&filefrom=C&pagefrom=D" - int len = args.length; for (int i = 0; i < len; ++i) { Gfo_qarg_itm arg = args[i]; diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter.java deleted file mode 100644 index e5f039e1f..000000000 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter.java +++ /dev/null @@ -1,62 +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.addons.wikis.ctgs.htmls.catpages.utls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; -import gplx.core.lists.binary_searches.*; -import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; -public class Xoctg_catpage_filter { - public static void Filter(int limit, Xoctg_catpage_url cat_url, Xoctg_catpage_ctg ctg) { - int len = Xoa_ctg_mgr.Tid___max; - for (byte i = 0; i < len; ++i) { - Filter_by_grp(limit, cat_url, ctg.Grp_by_tid(i)); - } - } - private static void Filter_by_grp(int grp_len, Xoctg_catpage_url cat_url, Xoctg_catpage_grp grp) { - byte grp_tid = grp.Tid(); - byte[] grp_key = cat_url.Grp_keys()[grp_tid]; - - // dflt to bos; EX: grp_bgn=0 grp_end=200 - int grp_bgn = 0; - int grp_end = grp_bgn + grp_len; - - // key specified; calc new grp_bgn, grp_end - if (grp_key != null) { - // get idx of key - int key_idx = Binary_search_.Search(grp.Itms(), Xoctg_catpage_itm_sorter__sort_key.Sorter, grp_key); - - // if fwd, set grp_bgn to key_idx, and add grp_len - if (cat_url.Grp_fwds()[grp_tid]) { - grp_bgn = key_idx; - grp_end = grp_bgn + grp_len; - } - // if bwd, set grp_end to key_idx, and subtract grp_len - else { - grp_end = key_idx; - grp_bgn = grp_end - grp_len; - - // assert new grp_bgn is not negative - if (grp_bgn < 0) grp_bgn = 0; - } - } - - // assert new grp_end is not > grp_max; note that this needs to be specified for when grp_key is null and not null - int grp_max = grp.Itms__len(); - if (grp_end > grp_max) - grp_end = grp_max; - grp.Rng_(grp_bgn, grp_end); - } -} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter__tst.java deleted file mode 100644 index 8f02083c8..000000000 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_filter__tst.java +++ /dev/null @@ -1,107 +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.addons.wikis.ctgs.htmls.catpages.utls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; -import org.junit.*; import gplx.core.tests.*; -import gplx.xowa.apps.urls.*; -import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; -public class Xoctg_catpage_filter__tst { - private final Xoctg_catpage_filter__fxt fxt = new Xoctg_catpage_filter__fxt(); - private Xoctg_catpage_ctg ctg; - @Before public void init() { - this.ctg = fxt.Make__ctg(25, 25, 25); - } - @Test public void Initial() { - fxt.Exec__filter(5, "A", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 0, 5); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5); - } - @Test public void Fwd__page__05() { - fxt.Exec__filter(5, "A?pagefrom=05", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 5, 10); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5); - } - @Test public void Fwd__page__10() { - fxt.Exec__filter(5, "A?pagefrom=10", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 10, 15); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5); - } - @Test public void Fwd__page__23() { - fxt.Exec__filter(5, "A?pagefrom=23", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 23, 25); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5); - } - @Test public void Fwd__full__06() { - fxt.Exec__filter(5, "A?from=06", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 6, 11); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 6, 11); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 6, 11); - } - @Test public void Bwd__page__20() { - fxt.Exec__filter(5, "A?pageuntil=20", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 15, 20); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5); - } - @Test public void Bwd__page__2() { - fxt.Exec__filter(5, "A?pageuntil=01", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 0, 1); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 0, 5); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 0, 5); - } - @Test public void Bwd__full__11() { - fxt.Exec__filter(5, "A?until=11", ctg); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__page, 6, 11); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__subc, 6, 11); - fxt.Test__cat_grp(ctg, Xoa_ctg_mgr.Tid__file, 6, 11); - } -} -class Xoctg_catpage_filter__fxt { - private Xow_url_parser url_parser; - public Xoctg_catpage_filter__fxt() { - Xoa_app app = Xoa_app_fxt.Make__app__edit(); - this.url_parser = app.User().Wikii().Utl__url_parser(); - } - public Xoctg_catpage_ctg Make__ctg(int subc, int page, int file) { - Xoctg_catpage_ctg ctg = new Xoctg_catpage_ctg(Bry_.new_a7("A")); - Make__ctg_grp(ctg, Xoa_ctg_mgr.Tid__subc, subc); - Make__ctg_grp(ctg, Xoa_ctg_mgr.Tid__page, page); - Make__ctg_grp(ctg, Xoa_ctg_mgr.Tid__file, file); - return ctg; - } - private void Make__ctg_grp(Xoctg_catpage_ctg ctg, byte tid, int count) { - Xoctg_catpage_grp grp = ctg.Grp_by_tid(tid); - for (int i = 0; i < count; ++i) { - Xoctg_catpage_itm itm = new Xoctg_catpage_itm(i * tid, Xoa_ttl.Null, Bry_.new_a7(Int_.To_str_pad_bgn_zero(i, 2))); - grp.Itms__add(itm); - } - grp.Itms__make(); - } - public void Exec__filter(int limit, String cat_url_str, Xoctg_catpage_ctg ctg) { - Xoctg_catpage_url cat_url = Xoctg_catpage_url_parser.Parse(url_parser.Parse(Bry_.new_a7(cat_url_str))); - Xoctg_catpage_filter.Filter(limit, cat_url, ctg); - } - public void Test__cat_grp(Xoctg_catpage_ctg ctg, byte tid, int expd_bgn, int expd_end) { - Xoctg_catpage_grp grp = ctg.Grp_by_tid(tid); - Gftest.Eq__int(expd_bgn, grp.Bgn(), "bgn failed; tid={0}", tid); - Gftest.Eq__int(expd_end, grp.End(), "end failed; tid={0}", tid); - } -} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_loader.java deleted file mode 100644 index aba13c4c7..000000000 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/utls/Xoctg_catpage_loader.java +++ /dev/null @@ -1,120 +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.addons.wikis.ctgs.htmls.catpages.utls; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; -import gplx.dbs.*; import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.wikis.ctgs.dbs.*; -import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; -public class Xoctg_catpage_loader { - private static final Object thread_lock = new Object(); - public Xoctg_catpage_ctg Load_by_ttl_or_null(Xow_wiki wiki, Xoa_ttl cat_ttl) { - // get cat_id for cat_ttl from page_tbl - Xow_db_mgr db_mgr = wiki.Data__core_mgr(); - Xowd_page_tbl page_tbl = db_mgr.Db__core().Tbl__page(); - Xowd_page_itm page_itm = page_tbl.Select_by_ttl_as_itm_or_null(cat_ttl); - if (page_itm == null) { - Gfo_usr_dlg_.Instance.Warn_many("", "", "category does not exist in page table; ttl=~{0}", cat_ttl.Full_db()); - return null; - } - - // get cat_link db from cat_core_tbl - Xowd_cat_core_tbl cat_core_tbl = Xodb_cat_db_.Get_cat_core_or_fail(db_mgr); - int cat_id = page_itm.Id(); - Xowd_category_itm cat_core_itm = cat_core_tbl.Select(cat_id); - if (cat_core_itm == Xowd_category_itm.Null) { - Gfo_usr_dlg_.Instance.Log_many("", "", "category does not exist in cat_core table; ttl=~{0}", cat_ttl.Full_db()); // NOTE: this is not rare as Category pages can be created as deliberately empty, or as redirects; fr.w:Catégorie:Utilisateur_hess-4; DATE:2016-09-12 - return null; - } - - // load itms from cat_link_db - Xoctg_catpage_ctg rv = new Xoctg_catpage_ctg(cat_ttl.Page_txt()); - if (cat_core_itm.File_idx() == -1) // new v3: loop over all cat_link dbs - Search_cat_core_tbls_for_cat_id(rv, wiki, db_mgr, page_tbl.Conn(), cat_core_tbl.Conn(), cat_id); - else { // old v2: use cat_link_db - Xow_db_file cat_link_db = db_mgr.Dbs__get_by_id_or_fail(cat_core_itm.File_idx()); - Select_by_cat_id(rv, wiki, page_tbl.Conn(), cat_core_tbl.Conn(), cat_link_db.Conn(), cat_id, Sql_for_v2(cat_id)); - } - rv.Make_itms(); - return rv; - } - private static void Search_cat_core_tbls_for_cat_id(Xoctg_catpage_ctg rv, Xow_wiki wiki, Xow_db_mgr db_mgr, Db_conn page_conn, Db_conn cat_core_conn, int cat_id) { - // loop over each db unless (a) cat_link_db; (b) core_db (if all or few) - int len = db_mgr.Dbs__len(); - for (int i = 0; i < len; ++i) { - Xow_db_file db_file = db_mgr.Dbs__get_at(i); - switch (db_file.Tid()) { - case Xow_db_file_.Tid__cat_link: // always use cat_link db - break; - case Xow_db_file_.Tid__core: // only use core if all or few - if (db_mgr.Props().Layout_text().Tid_is_lot()) - continue; - else - break; - default: // else ignore all other files - continue; - } - Select_by_cat_id(rv, wiki, page_conn, cat_core_conn, db_file.Conn(), cat_id, Sql_for_v3(cat_id)); - } - } - private static void Select_by_cat_id(Xoctg_catpage_ctg rv, Xow_wiki wiki, Db_conn page_conn, Db_conn cat_core_conn, Db_conn cat_link_conn, int cat_id, String sql) { - // prep sql - Db_attach_mgr attach_mgr = new Db_attach_mgr(cat_link_conn, new Db_attach_itm("page_db", page_conn), new Db_attach_itm("cat_core_db", cat_core_conn)); - sql = attach_mgr.Resolve_sql(sql); - - // run sql and create itms based on cat_link - Db_rdr rdr = Db_rdr_.Empty; - synchronized (thread_lock) { // LOCK:used by multiple wrks; DATE:2016-09-12 - try { - attach_mgr.Attach(); - rdr = cat_link_conn.Stmt_sql(sql).Exec_select__rls_auto(); - while (rdr.Move_next()) { - Xoa_ttl page_ttl = wiki.Ttl_parse(rdr.Read_int("page_namespace"), rdr.Read_bry_by_str("page_title")); - Xoctg_catpage_itm itm = new Xoctg_catpage_itm(rdr.Read_int("cl_from"), page_ttl, Bry_.new_u8(rdr.Read_str("cl_sortkey"))); - rv.Grp_by_tid(rdr.Read_byte("cl_type_id")).Itms__add(itm); - } - } - finally { - rdr.Rls(); - attach_mgr.Detach(); - } - } - } - private static String Sql_for_v3(int cat_id) { - return String_.Concat_lines_nl_skip_last // ANSI.Y - ( "SELECT cl.cl_from" - , ", cl.cl_type_id" - , ", p.page_namespace" - , ", p.page_title" - , ", cs.cs_key AS cl_sortkey" - , "FROM cat_link cl" - , " JOIN page p ON cl.cl_from = p.page_id" - , " JOIN cat_sort cs ON cl.cl_sortkey_id = cs.cs_id" - , "WHERE cl.cl_to_id = " + Int_.To_str(cat_id) - ); - } - private static String Sql_for_v2(int cat_id) { // NOTE: main difference is cl_sortkey is on cat_link, not in cat_sort - return String_.Concat_lines_nl_skip_last // ANSI.Y - ( "SELECT cl.cl_from" - , ", cl.cl_type_id" - , ", p.page_namespace" - , ", p.page_title" - , ", cl.cl_sortkey" - , "FROM cat_link cl" - , " JOIN page p ON cl.cl_from = p.page_id" - , "WHERE cl.cl_to_id = " + Int_.To_str(cat_id) - ); - } -} diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java index bc73cbbe2..e406bb5f5 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_loader.java @@ -31,7 +31,7 @@ class Xoctg_pagebox_loader implements Select_in_cbk { int cat_id = rdr.Read_int("cat_id"); Xoctg_pagebox_itm page = (Xoctg_pagebox_itm)hash.Get_by_id(cat_id); if (page == null) {// unlikely, but possible for itms to exist in cat_links, but not in cat_core; log and return; - Gfo_usr_dlg_.Instance.Warn_many("", "", "cat_id in cat_link but not in cat_core; page=~{0} cat_id=~{0}", page_url, cat_id); + Gfo_usr_dlg_.Instance.Warn_many("", "", "cat_id in cat_link but not in cat_core; page=~{0} cat_id=~{1}", page_url, cat_id); } page.Load_by_cat_core(rdr.Read_bool_by_byte("cat_hidden"), rdr.Read_int("cat_pages"), rdr.Read_int("cat_subcats"), rdr.Read_int("cat_files")); } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java index 08c2107ad..75e936dcb 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/Xoctg_pagebox_wtr.java @@ -46,7 +46,7 @@ public class Xoctg_pagebox_wtr { Xoctg_pagebox_loader select_cbk = new Xoctg_pagebox_loader(hash, page.Url_bry_safe()); // get cat_db_id from page - boolean exists = wiki.Data__core_mgr().Tbl__page().Select_by_ttl(tmp_page_itm, page.Ttl().Ns(), page.Ttl().Page_txt()); + boolean exists = wiki.Data__core_mgr().Tbl__page().Select_by_ttl(tmp_page_itm, page.Ttl().Ns(), page.Ttl().Page_db()); int cat_db_id = tmp_page_itm.Cat_db_id(); if (exists && cat_db_id != -1) {// note that wtxt_dbs can have 0 ctgs but will have cat_db_id == -1 Xow_db_file cat_link_db = wiki.Data__core_mgr().Dbs__get_by_id_or_null(cat_db_id); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java index 853e33c28..1d9eab72e 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/pageboxs/doubles/Xoctg_double_box.java @@ -35,9 +35,9 @@ public class Xoctg_double_box implements Bfr_arg { int len = ary.length; for (int i = 0; i < len; ++i) { - Xoctg_pagebox_itm ctg = ary[i]; - Xoctg_double_grp list = ctg.Hidden() ? grp_hidden : grp_normal; - list.Itms().Itms__add(ctg); + Xoctg_pagebox_itm itm = ary[i]; + Xoctg_double_grp list = itm.Hidden() ? grp_hidden : grp_normal; + list.Itms().Itms__add(itm); } this.Bfr_arg__add(bfr); } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java index 4a5b306d8..5475f3d0f 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/pages/syncs/core/parsers/Xowd_html_tbl_mgr.java @@ -31,7 +31,7 @@ public class Xowd_html_tbl_mgr { byte[] content_sub = null; byte[] sidebar_div = null; db.Conn().Meta_tbl_assert(tbl); - tbl.Upsert(page_id, Xopg_module_mgr.Tid_null, Io_stream_.Tid_raw, Xoh_hzip_dict_.Hzip__plain, display_ttl, content_sub, sidebar_div, src); + tbl.Upsert(page_id, Xopg_module_mgr.Tid_null, Io_stream_tid_.Tid__raw, Xoh_hzip_dict_.Hzip__plain, display_ttl, content_sub, sidebar_div, src); wiki.Data__core_mgr().Db__core().Tbl__page().Update__html_db_id(page_id, db.Id()); } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java index a5a4eee03..92bc1d02d 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/Srch_search_cfg.java @@ -38,8 +38,7 @@ public class Srch_search_cfg implements Gfo_invk { public void Args_default_str_(String v) { this.args_default_str = v; byte[] bry = Bry_.new_a7("http://x.org/a?" + v); - Gfo_url tmp_url = new Gfo_url(); - app.User().Wikii().Utl__url_parser().Url_parser().Parse(tmp_url, bry, 0, bry.length); + Gfo_url tmp_url = app.User().Wikii().Utl__url_parser().Url_parser().Parse(bry, 0, bry.length); args_default = tmp_url.Qargs(); } private Srch_search_addon addon; diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java index daafd6ed4..52ef05ed7 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java @@ -21,10 +21,17 @@ public class Xoapi_addon implements Gfo_invk { public void Ctor_by_app(Xoa_app app) {} public Xoapi_addon_search Search() {return search;} private final Xoapi_addon_search search = new Xoapi_addon_search(); public Xoapi_addon_bldr Bldr() {return bldr;} private final Xoapi_addon_bldr bldr = new Xoapi_addon_bldr(); + public boolean Wikis__ctgs__hidden_enabled() {return wikis__ctgs__hidden_enabled;} private boolean wikis__ctgs__hidden_enabled = false; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk__search)) return search; else if (ctx.Match(k, Invk__bldr)) return bldr; + else if (ctx.Match(k, Invk__wikis__ctgs__hidden_enabled)) return Yn.To_str(wikis__ctgs__hidden_enabled); + else if (ctx.Match(k, Invk__wikis__ctgs__hidden_enabled_)) wikis__ctgs__hidden_enabled = m.ReadYn("v"); else return Gfo_invk_.Rv_unhandled; + return this; } - private static final String Invk__search = "search", Invk__bldr = "bldr"; + private static final String Invk__search = "search", Invk__bldr = "bldr" + , Invk__wikis__ctgs__hidden_enabled = "wikis__ctgs__hidden_enabled" + , Invk__wikis__ctgs__hidden_enabled_ = "wikis__ctgs__hidden_enabled_" + ; } diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java index 29ebe042b..f8d141d08 100644 --- a/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java +++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/addons/Xoapi_addon_bldr.java @@ -20,13 +20,14 @@ import gplx.xowa.apps.apis.xowa.addons.bldrs.*; public class Xoapi_addon_bldr implements Gfo_invk { public Xoapi_central_api Central() {return central;} private final Xoapi_central_api central = new Xoapi_central_api(); public Xoapi_sync_api Sync() {return sync;} private final Xoapi_sync_api sync = new Xoapi_sync_api(); + public boolean Wikis__ctgs__hidden_enabled() {return wikis__ctgs__hidden_enabled;} private boolean wikis__ctgs__hidden_enabled = false; public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk__central)) return central; else if (ctx.Match(k, Invk__sync)) return sync; else return Gfo_invk_.Rv_unhandled; } private static final String - Invk__central = "central" - , Invk__sync = "sync" + Invk__central = "central" + , Invk__sync = "sync" ; } 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 de7e0a16c..c99348617 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 @@ -29,8 +29,8 @@ public class Xoapi_import implements Gfo_invk { public long Html_db_max() {return html_db_max;} private long html_db_max = Io_size_.To_long_by_int_mb(1500); // 3.0 GB; v2; use same as text public long File_db_max() {return file_db_max;} private long file_db_max = Io_size_.To_long_by_int_mb(1500); // 3.2 GB; v2 public byte[] Ns_file_map() {return ns_file_map;} private byte[] ns_file_map = Ns_file_map__each; - 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 byte Zip_tid_text() {return zip_tid_text;} private byte zip_tid_text = Io_stream_tid_.Tid__gzip; + public byte Zip_tid_html() {return zip_tid_html;} private byte zip_tid_html = Io_stream_tid_.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"; @@ -51,7 +51,7 @@ public class Xoapi_import implements Gfo_invk { : gplx.xowa.bldrs.cmds.Xob_ns_file_itm_parser.Ns_file_map__each; // DB.FEW: DATE:2016-06-07 // return dump_file_size < layout_text_max ? Bry_.Empty : Ns_file_map__each; } - public void Zip_tid_text_raw_() {zip_tid_text = Io_stream_.Tid_raw;} // TEST: + public void Zip_tid_text_raw_() {zip_tid_text = Io_stream_tid_.Tid__raw;} // TEST: public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { if (ctx.Match(k, Invk_layout_all_max)) return Io_size_.To_str_mb(layout_all_max); else if (ctx.Match(k, Invk_layout_all_max_)) layout_all_max = Io_size_.To_long_by_msg_mb(m, layout_all_max); @@ -71,11 +71,11 @@ public class Xoapi_import implements Gfo_invk { else if (ctx.Match(k, Invk_file_db_max_)) file_db_max = Io_size_.To_long_by_msg_mb(m, file_db_max); else if (ctx.Match(k, Invk_ns_file_map)) return String_.new_u8(ns_file_map); else if (ctx.Match(k, Invk_ns_file_map_)) ns_file_map = m.ReadBry("v"); - else if (ctx.Match(k, Invk_zip_tid_text)) return Io_stream_.To_str(zip_tid_text); - else if (ctx.Match(k, Invk_zip_tid_text_)) zip_tid_text = Io_stream_.To_tid(m.ReadStr("v")); + else if (ctx.Match(k, Invk_zip_tid_text)) return Io_stream_tid_.To_key(zip_tid_text); + else if (ctx.Match(k, Invk_zip_tid_text_)) zip_tid_text = Io_stream_tid_.To_tid(m.ReadStr("v")); else if (ctx.Match(k, Invk_zip_tid_list)) return Options_zip_tid__list; - else if (ctx.Match(k, Invk_zip_tid_html)) return Io_stream_.To_str(zip_tid_html); - 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_zip_tid_html)) return Io_stream_tid_.To_key(zip_tid_html); + else if (ctx.Match(k, Invk_zip_tid_html_)) zip_tid_html = Io_stream_tid_.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); @@ -86,7 +86,7 @@ public class Xoapi_import implements Gfo_invk { else return Gfo_invk_.Rv_unhandled; return this; } - private static final Keyval[] Options_zip_tid__list = Keyval_.Ary(Keyval_.new_("raw", "text"), Keyval_.new_("gzip"), Keyval_.new_("bzip2")); + private static final Keyval[] Options_zip_tid__list = Keyval_.Ary(Keyval_.new_("raw", "text"), Keyval_.new_("gzip"), Keyval_.new_("bzip2"), Keyval_.new_("xz")); private static final String Invk_layout_all_max = "layout_all_max" , Invk_layout_all_max_ = "layout_all_max_" , Invk_layout_text_max = "layout_text_max" , Invk_layout_text_max_ = "layout_text_max_" diff --git a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java index 1228e2187..7882890b5 100644 --- a/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java +++ b/400_xowa/src/gplx/xowa/apps/servers/http/Http_server_wkr.java @@ -89,7 +89,7 @@ class Http_server_wkr implements Gfo_invk { // client_wtr.Write_str("Expires: Sun, 17-Jan-2038 19:14:07 GMT\n"); String mime_type = String_.new_u8(Http_file_utl.To_mime_type_by_path_as_bry(path)); client_wtr.Write_str("Content-Type: " + mime_type + "\n\n"); - Io_stream_rdr file_stream = Io_stream_rdr_.new_by_url_(Io_url_.new_fil_(String_.new_u8(path))).Open(); + Io_stream_rdr file_stream = Io_stream_rdr_.New_by_url(Io_url_.new_fil_(String_.new_u8(path))).Open(); client_wtr.Write_stream(file_stream); file_stream.Rls(); client_rdr.Rls(); socket.Rls(); } diff --git a/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java b/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java index 5441d51b0..70c58c91c 100644 --- a/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java +++ b/400_xowa/src/gplx/xowa/apps/site_cfgs/Xoa_site_cfg_itm__interwikimap.java @@ -21,7 +21,7 @@ import gplx.xowa.langs.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*; class Xoa_site_cfg_itm__interwikimap extends Xoa_site_cfg_itm__base { private final Bry_bfr tmp_bfr = Bry_bfr_.New(); - private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url(); + private final Gfo_url_parser url_parser = new Gfo_url_parser(); public Xoa_site_cfg_itm__interwikimap() {this.Ctor(Xoa_site_cfg_loader__inet.Qarg__interwikimap);} @Override public void Parse_json_ary_itm(Bry_bfr bfr, Xow_wiki wiki, int i, Json_itm itm) { Json_nde nde = Json_nde.cast(itm); @@ -40,7 +40,7 @@ class Xoa_site_cfg_itm__interwikimap extends Xoa_site_cfg_itm__base { byte[] line = lines[i]; if (Bry_.Len_eq_0(line)) continue; // ignore blank lines byte[][] flds = Bry_split_.Split(line, Byte_ascii.Pipe); byte[] url_fmt = flds[1]; - byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, url_fmt); + byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url_fmt); wiki.Xwiki_mgr().Add_by_atrs(flds[0], domain_bry, url_fmt); } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java index 00dc03a3f..ab7641f58 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xoa_url__to_str__tst.java @@ -50,7 +50,7 @@ class Xoa_url__to_str__fxt extends Xow_url_parser_fxt { private final Xoh_hr public void Chk_to_str_href(boolean full, String raw, String expd) {Chk_to_str_href(cur_wiki, full, raw, expd);} public void Chk_to_str_href(Xowe_wiki wiki, boolean full, String raw, String expd) { href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), wiki, Bry__page); - this.Chk_to_str(full, expd); + this.Test__to_str(full, expd); } private static final byte[] Bry__page = Bry_.new_a7("Page_1"); } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java index ed32efbb2..458976be1 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser.java @@ -25,12 +25,12 @@ public class Xow_url_parser { private final Object thread_lock = new Object(); private final Gfo_url_encoder encoder; private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255); - private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url gfo_url = new Gfo_url(); + private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url_encoder gfs_encoder = Gfo_url_encoder_.New__gfs().Make(); private final Xoa_app app; private final Xow_wiki wiki; private final byte[] domain_bry; private byte tmp_protocol_tid; private int tmp_tid; - private byte[] tmp_raw, tmp_wiki, tmp_page, tmp_anch, tmp_protocol_bry; private Gfo_qarg_itm[] tmp_qargs; + private byte[] tmp_raw, tmp_orig, tmp_wiki, tmp_page, tmp_anch, tmp_protocol_bry; private Gfo_qarg_itm[] tmp_qargs; private byte[][] tmp_segs; private int tmp_segs_len; private boolean tmp_protocol_is_relative, tmp_page_is_main, tmp_wiki_is_missing; private byte[] tmp_vnt; @@ -69,9 +69,10 @@ public class Xow_url_parser { public boolean Parse(Xoa_url rv, byte[] src, int bgn, int end) { synchronized (thread_lock) { if (end - bgn == 0) {Init_tmp_vars(Gfo_url.Empty); Make(rv); return false;} - src = encoder.Decode(src, bgn, end); // NOTE: must decode any url-encoded parameters - int src_len = src.length; - url_parser.Parse(gfo_url, src, 0, src_len); // parse to plain gfo_url + tmp_orig = (bgn == 0 && end == src.length) ? src : Bry_.Mid(src, bgn, end); + // src = encoder.Decode(src, bgn, end); // NOTE: must decode any url-encoded parameters; TOMBSTONE:do not auto-decode DATE:2016-10-10 + int src_len = end - bgn; + Gfo_url gfo_url = url_parser.Parse(src, bgn, end); // parse to plain gfo_url Init_tmp_vars(gfo_url); if (src[0] == Byte_ascii.Hash) // src is anch; EX: #A Bld_anch(); @@ -134,7 +135,7 @@ public class Xow_url_parser { } private Xoa_url Make(Xoa_url rv) { rv.Ctor - ( tmp_tid, tmp_raw, tmp_protocol_tid, tmp_protocol_bry, tmp_protocol_is_relative + ( tmp_tid, tmp_orig, tmp_raw, tmp_protocol_tid, tmp_protocol_bry, tmp_protocol_is_relative , tmp_wiki, tmp_page, tmp_qargs, tmp_anch , tmp_segs, tmp_vnt, tmp_wiki_is_missing, Bry_.Eq(tmp_wiki, wiki.Domain_bry()), tmp_page_is_main); return rv; @@ -264,9 +265,7 @@ public class Xow_url_parser { int qargs_len = tmp_qargs.length; for (int i = 0; i < qargs_len; ++i) { Gfo_qarg_itm qarg = tmp_qargs[i]; - if ( Bry_.Eq(qarg.Key_bry(), Qarg__title) - && qarg.Val_bry() != null // HACK: handle "bad-urls" from xml-encoded entities where page is null b/c = is encoded as =; http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template standardisation/demometa DATE:2015-08-02 - ) + if (Bry_.Eq(qarg.Key_bry(), Qarg__title)) tmp_page = qarg.Val_bry(); // handle /w/index.php?title=Earth } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java index 9d5e8e10d..2040286d2 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__proto_tst.java @@ -20,23 +20,23 @@ import org.junit.*; public class Xow_url_parser__proto_tst { private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Relative() { - tstr.Run_parse("//en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + tstr.Exec__parse("//en.wikipedia.org/wiki/A").Test__wiki("en.wikipedia.org").Test__page("A"); } @Test public void Http__basic() { - tstr.Run_parse("http://en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + tstr.Exec__parse("http://en.wikipedia.org/wiki/A").Test__wiki("en.wikipedia.org").Test__page("A"); } @Test public void Upload__basic() { tstr.Prep_add_xwiki_to_user("commons.wikimedia.org"); // NOTE: need to add xwiki to be able to resolve "/commons/" - tstr.Run_parse("http://upload.wikimedia.org/wikipedia/commons/a/ab/C.svg").Chk_wiki("commons.wikimedia.org").Chk_page("File:C.svg"); // orig - tstr.Run_parse("http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/A.png/220px-A.png").Chk_wiki("commons.wikimedia.org").Chk_page("File:A.png"); // thum + tstr.Exec__parse("http://upload.wikimedia.org/wikipedia/commons/a/ab/C.svg").Test__wiki("commons.wikimedia.org").Test__page("File:C.svg"); // orig + tstr.Exec__parse("http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/A.png/220px-A.png").Test__wiki("commons.wikimedia.org").Test__page("File:A.png"); // thum } @Test public void File__basic() { - tstr.Run_parse("file:///C:/a/b/c").Chk_tid(Xoa_url_.Tid_file); + tstr.Exec__parse("file:///C:/a/b/c").Test__tid(Xoa_url_.Tid_file); } @Test public void Ftp__basic() { - tstr.Run_parse("ftp://en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_inet); + tstr.Exec__parse("ftp://en.wikipedia.org/wiki/A").Test__tid(Xoa_url_.Tid_inet); } @Test public void Extended() { - tstr.Run_parse("http://en.wikipedia.org/w/index.php?A=B").Chk_wiki("en.wikipedia.org").Chk_page("index.php").Chk_qargs("?A=B").Chk_anch(null); + tstr.Exec__parse("http://en.wikipedia.org/w/index.php?A=B").Test__wiki("en.wikipedia.org").Test__page("index.php").Test__qargs("?A=B").Test__anch(null); } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg__tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg__tst.java new file mode 100644 index 000000000..e008fc332 --- /dev/null +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg__tst.java @@ -0,0 +1,68 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; +import org.junit.*; +public class Xow_url_parser__qarg__tst { + private final Xow_url_parser_fxt fxt = new Xow_url_parser_fxt(); + @Test public void Redirect() { + fxt.Exec__parse("A?redirect=no").Test__wiki("en.wikipedia.org").Test__page("A").Test__qargs("?redirect=no"); + } + @Test public void Action_is_edit() { + fxt.Exec__parse("A?action=edit").Test__wiki("en.wikipedia.org").Test__page("A").Test__action_is_edit_y(); + } + @Test public void Assert_state_cleared() { // PURPOSE.fix: action_is_edit (et. al.) was not being cleared on parse even though Xoa_url reused; DATE:20121231 + fxt.Exec__parse("A?action=edit") .Test__action_is_edit_y(); + fxt.Exec__parse_reuse("B") .Test__action_is_edit_n(); + } + @Test public void Query_arg() { // PURPOSE.fix: query args were not printing out + fxt.Exec__parse("en.wikipedia.org/wiki/Special:Search/Earth?fulltext=yes").Test__build_str_is_same(); + } + @Test public void Dupe_key() { + fxt.Exec__parse("A?B=C1&B=C2").Test__page("A").Test__qargs("?B=C1&B=C2"); + } + @Test public void Question_is_eos() { + fxt.Exec__parse("A?").Test__wiki("en.wikipedia.org").Test__page("A?").Test__qargs(""); + } + @Test public void Question_is_page() { + fxt.Exec__parse("A?B").Test__wiki("en.wikipedia.org").Test__page("A?B").Test__qargs(""); + } + @Test public void Question_is_anchor() { + fxt.Exec__parse("A#b?c").Test__wiki("en.wikipedia.org").Test__page("A").Test__anch("b.3Fc"); + } + @Test public void Title_remove_w() { // PURPOSE: fix /w/ showing up as seg; DATE:2014-05-30 + fxt.Exec__parse("http://en.wikipedia.org/w/index.php?title=A").Test__wiki("en.wikipedia.org").Test__page("A"); + } + @Test public void Ctg() { + fxt.Exec__parse("Category:A?pagefrom=A#mw-pages").Test__page("Category:A").Test__qargs("?pagefrom=A").Test__anch("mw-pages"); + } + @Test public void Anch() { + fxt.Exec__parse("A?k1=v1#anch"); + fxt.Test__page("A"); + fxt.Test__anch("anch"); + fxt.Test__qargs("?k1=v1"); + fxt.Test__to_str("en.wikipedia.org/wiki/A?k1=v1#anch"); + } + // DELETED: search should not depend on url-decoded entities; should be "Special:Search/Moon?fulltext=y&xowa_page_index=1" DATE:2016-10-10 + // @Test public void Search() { + // fxt.Exec__parse("Special:Search/Moon%3Ffulltext%3Dy%26xowa_page_index%3D1").Test__page("Special:Search/Moon").Test__qargs("?fulltext=y&xowa_page_index=1"); + //} + // DELETED: this is wrong as url should not handle html_entities like = instead # should strictly designate anch_href; DATE:2016-10-10 + // @Test public void Encoded() { + // fxt.Exec__parse("en.wikipedia.org/wiki/A?action=edit&preload=B").Test__wiki("en.wikipedia.org").Test__page("A").Test__qargs("?action==edit=&preload=&=").Test__anch("61.3BB"); // NOTE: this is wrong; fix later + // } +} diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java deleted file mode 100644 index 47ceff5b8..000000000 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__qarg_tst.java +++ /dev/null @@ -1,59 +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.apps.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; -import org.junit.*; -public class Xow_url_parser__qarg_tst { - private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); - @Test public void Redirect() { - tstr.Run_parse("A?redirect=no").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_qargs("?redirect=no"); - } - @Test public void Action_is_edit() { - tstr.Run_parse("A?action=edit").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_action_is_edit_y(); - } - @Test public void Assert_state_cleared() { // PURPOSE.fix: action_is_edit (et. al.) was not being cleared on parse even though Xoa_url reused; DATE:20121231 - tstr.Run_parse("A?action=edit") .Chk_action_is_edit_y(); - tstr.Run_parse_reuse("B") .Chk_action_is_edit_n(); - } - @Test public void Query_arg() { // PURPOSE.fix: query args were not printing out - tstr.Run_parse("en.wikipedia.org/wiki/Special:Search/Earth?fulltext=yes").Chk_build_str_is_same(); - } - @Test public void Dupe_key() { - tstr.Run_parse("A?B=C1&B=C2").Chk_page("A").Chk_qargs("?B=C1&B=C2"); - } - @Test public void Question_is_eos() { - tstr.Run_parse("A?").Chk_wiki("en.wikipedia.org").Chk_page("A?").Chk_qargs(""); - } - @Test public void Question_is_page() { - tstr.Run_parse("A?B").Chk_wiki("en.wikipedia.org").Chk_page("A?B").Chk_qargs(""); - } - @Test public void Question_is_anchor() { - tstr.Run_parse("A#b?c").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_anch("b.3Fc"); - } - @Test public void Title_remove_w() { // PURPOSE: fix /w/ showing up as seg; DATE:2014-05-30 - tstr.Run_parse("http://en.wikipedia.org/w/index.php?title=A").Chk_wiki("en.wikipedia.org").Chk_page("A"); - } - @Test public void Search() { - tstr.Run_parse("Special:Search/Moon%3Ffulltext%3Dy%26xowa_page_index%3D1").Chk_page("Special:Search/Moon").Chk_qargs("?fulltext=y&xowa_page_index=1"); - } - @Test public void Ctg() { - tstr.Run_parse("Category:A?pagefrom=A#mw-pages").Chk_page("Category:A").Chk_qargs("?pagefrom=A").Chk_anch("mw-pages"); - } - @Test public void Encoded() { - tstr.Run_parse("en.wikipedia.org/wiki/A?action=edit&preload=B").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_qargs("?action==edit=&preload=&=").Chk_anch("61.3BB"); // NOTE: this is wrong; fix later - } -} diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java index dc325a5fc..f7fca8b01 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__ttl_tst.java @@ -20,37 +20,37 @@ import org.junit.*; public class Xow_url_parser__ttl_tst { private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Name() { - tstr.Run_parse("A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + tstr.Exec__parse("A").Test__wiki("en.wikipedia.org").Test__page("A"); } @Test public void Sub_1() { - tstr.Run_parse("A/b").Chk_wiki("en.wikipedia.org").Chk_page("A/b"); + tstr.Exec__parse("A/b").Test__wiki("en.wikipedia.org").Test__page("A/b"); } @Test public void Sub_2() { - tstr.Run_parse("A/b/c").Chk_wiki("en.wikipedia.org").Chk_page("A/b/c"); + tstr.Exec__parse("A/b/c").Test__wiki("en.wikipedia.org").Test__page("A/b/c"); } @Test public void Anch() { - tstr.Run_parse("A#b").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_anch("b"); + tstr.Exec__parse("A#b").Test__wiki("en.wikipedia.org").Test__page("A").Test__anch("b"); } @Test public void Anch_w_slash() { // PURPOSE: A/b#c/d was not parsing correctly; PAGE:en.w:Enlightenment_Spain#Enlightened_despotism_.281759%E2%80%931788.29 - tstr.Run_parse("A/b#c/d").Chk_page("A/b").Chk_anch("c.2Fd"); + tstr.Exec__parse("A/b#c/d").Test__page("A/b").Test__anch("c.2Fd"); } @Test public void Ns_category() { - tstr.Run_parse("Category:A").Chk_wiki("en.wikipedia.org").Chk_page("Category:A"); + tstr.Exec__parse("Category:A").Test__wiki("en.wikipedia.org").Test__page("Category:A"); } @Test public void Main_page__basic() { - tstr.Run_parse("en.wikipedia.org") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); - tstr.Run_parse("en.wikipedia.org/") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); - tstr.Run_parse("en.wikipedia.org/wiki") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); - tstr.Run_parse("en.wikipedia.org/wiki/") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_y(); - tstr.Run_parse("en.wikipedia.org/wiki/A") .Chk_wiki("en.wikipedia.org").Chk_page_is_main_n(); + tstr.Exec__parse("en.wikipedia.org") .Test__wiki("en.wikipedia.org").Test__page_is_main_y(); + tstr.Exec__parse("en.wikipedia.org/") .Test__wiki("en.wikipedia.org").Test__page_is_main_y(); + tstr.Exec__parse("en.wikipedia.org/wiki") .Test__wiki("en.wikipedia.org").Test__page_is_main_y(); + tstr.Exec__parse("en.wikipedia.org/wiki/") .Test__wiki("en.wikipedia.org").Test__page_is_main_y(); + tstr.Exec__parse("en.wikipedia.org/wiki/A") .Test__wiki("en.wikipedia.org").Test__page_is_main_n(); } @Test public void Ns_file__basic() {// PURPOSE: "File:A" should not be mistaken for "file:///" ns - tstr.Run_parse("File:A").Chk_wiki("en.wikipedia.org").Chk_page("File:A"); + tstr.Exec__parse("File:A").Test__wiki("en.wikipedia.org").Test__page("File:A"); } @Test public void Ns_file__nested() {// PURPOSE: handle fictitious "File:A/B/C.png" - tstr.Run_parse("File:A/B/C.png").Chk_wiki("en.wikipedia.org").Chk_page("File:A/B/C.png"); // should not be C.png b/c of Gfo_url_parser_old + tstr.Exec__parse("File:A/B/C.png").Test__wiki("en.wikipedia.org").Test__page("File:A/B/C.png"); // should not be C.png b/c of Gfo_url_parser_old } @Test public void Anch__basic() {// DATE:2015-07-26 - tstr.Run_parse("#A").Chk_tid(Xoa_url_.Tid_anch).Chk_wiki_is_missing(true).Chk_page("").Chk_anch("A"); + tstr.Exec__parse("#A").Test__tid(Xoa_url_.Tid_anch).Test__wiki_is_missing(true).Test__page("").Test__anch("A"); } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java index 19fe1ecad..7c867f5d6 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__url_bar_tst.java @@ -20,49 +20,49 @@ import org.junit.*; public class Xow_url_parser__url_bar_tst { private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Basic() { - tstr.Run_parse_from_url_bar("Page_1").Chk_to_str("en.wikipedia.org/wiki/Page_1"); // basic + tstr.Exec__parse_from_url_bar("Page_1").Test__to_str("en.wikipedia.org/wiki/Page_1"); // basic } @Test public void Lang() { tstr.Prep_add_xwiki_to_user("uk", "uk.wikipedia.org"); - tstr.Run_parse_from_url_bar("uk").Chk_to_str("en.wikipedia.org/wiki/Uk"); // lang-like page (uk=Ukraine) should not try to open wiki; DATE:2014-02-07 + tstr.Exec__parse_from_url_bar("uk").Test__to_str("en.wikipedia.org/wiki/Uk"); // lang-like page (uk=Ukraine) should not try to open wiki; DATE:2014-02-07 } @Test public void Lang_like() { tstr.Prep_add_xwiki_to_user("uk", "uk.wikipedia.org", "http://~{1}.wikipedia.org"); // NOTE: fmt needed for Type_is_lang - tstr.Run_parse_from_url_bar("uk/A").Chk_to_str("en.wikipedia.org/wiki/Uk/A"); // uk/A should not try be interpreted as wiki="uk" page="A"; DATE:2014-04-26 + tstr.Exec__parse_from_url_bar("uk/A").Test__to_str("en.wikipedia.org/wiki/Uk/A"); // uk/A should not try be interpreted as wiki="uk" page="A"; DATE:2014-04-26 } @Test public void Macro() { tstr.Prep_add_xwiki_to_user("fr.wikisource.org"); - tstr.Run_parse_from_url_bar("fr.s:Auteur:Shakespeare").Chk_to_str("fr.wikisource.org/wiki/Auteur:Shakespeare"); // url_macros + tstr.Exec__parse_from_url_bar("fr.s:Auteur:Shakespeare").Test__to_str("fr.wikisource.org/wiki/Auteur:Shakespeare"); // url_macros } @Test public void Main_page__home() { - tstr.Run_parse_from_url_bar("home").Chk_to_str("en.wikipedia.org/wiki/Home"); // home should go to current wiki's home; DATE:2014-02-09 - tstr.Run_parse_from_url_bar("home/wiki/Main_Page").Chk_to_str("home/wiki/Main_Page"); // home Main_Page should go to home; DATE:2014-02-09 + tstr.Exec__parse_from_url_bar("home").Test__to_str("en.wikipedia.org/wiki/Home"); // home should go to current wiki's home; DATE:2014-02-09 + tstr.Exec__parse_from_url_bar("home/wiki/Main_Page").Test__to_str("home/wiki/Main_Page"); // home Main_Page should go to home; DATE:2014-02-09 } @Test public void Main_page__zhw() { Xowe_wiki zh_wiki = tstr.Prep_create_wiki("zh.wikipedia.org"); zh_wiki.Props().Main_page_(Bry_.new_a7("Zh_Main_Page")); - tstr.Run_parse_from_url_bar("zh.w:Main_Page") .Chk_page_is_main_n().Chk_to_str("zh.wikipedia.org/wiki/Main_Page"); - tstr.Run_parse_from_url_bar("zh.w:") .Chk_page_is_main_y().Chk_to_str("zh.wikipedia.org/wiki/Zh_Main_Page"); - tstr.Run_parse_from_url_bar("en.w:") .Chk_page_is_main_y().Chk_to_str("en.wikipedia.org/wiki/Main_Page"); // old bug: still stuck at zh main page due to reused objects + tstr.Exec__parse_from_url_bar("zh.w:Main_Page") .Test__page_is_main_n().Test__to_str("zh.wikipedia.org/wiki/Main_Page"); + tstr.Exec__parse_from_url_bar("zh.w:") .Test__page_is_main_y().Test__to_str("zh.wikipedia.org/wiki/Zh_Main_Page"); + tstr.Exec__parse_from_url_bar("en.w:") .Test__page_is_main_y().Test__to_str("en.wikipedia.org/wiki/Main_Page"); // old bug: still stuck at zh main page due to reused objects } @Test public void Mobile() { // PURPOSE: handle mobile links; DATE:2014-05-03 - tstr.Run_parse_from_url_bar("en.m.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // basic - tstr.Run_parse_from_url_bar("en.M.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // upper - tstr.Run_parse_from_url_bar("A" ).Chk_to_str("en.wikipedia.org/wiki/A"); // bounds-check: 0 - tstr.Run_parse_from_url_bar("A." ).Chk_to_str("en.wikipedia.org/wiki/A."); // bounds-check: 1 - tstr.Run_parse_from_url_bar("A.b" ).Chk_to_str("en.wikipedia.org/wiki/A.b"); // bounds-check: 2 - tstr.Run_parse_from_url_bar("A.b.m." ).Chk_to_str("en.wikipedia.org/wiki/A.b.m."); // false-match - tstr.Run_parse_from_url_bar("en.x.wikipedia.org/wiki/A" ).Chk_to_str("en.wikipedia.org/wiki/En.x.wikipedia.org/wiki/A"); // fail + tstr.Exec__parse_from_url_bar("en.m.wikipedia.org/wiki/A" ).Test__to_str("en.wikipedia.org/wiki/A"); // basic + tstr.Exec__parse_from_url_bar("en.M.wikipedia.org/wiki/A" ).Test__to_str("en.wikipedia.org/wiki/A"); // upper + tstr.Exec__parse_from_url_bar("A" ).Test__to_str("en.wikipedia.org/wiki/A"); // bounds-check: 0 + tstr.Exec__parse_from_url_bar("A." ).Test__to_str("en.wikipedia.org/wiki/A."); // bounds-check: 1 + tstr.Exec__parse_from_url_bar("A.b" ).Test__to_str("en.wikipedia.org/wiki/A.b"); // bounds-check: 2 + tstr.Exec__parse_from_url_bar("A.b.m." ).Test__to_str("en.wikipedia.org/wiki/A.b.m."); // false-match + tstr.Exec__parse_from_url_bar("en.x.wikipedia.org/wiki/A" ).Test__to_str("en.wikipedia.org/wiki/En.x.wikipedia.org/wiki/A"); // fail } @Test public void Missing_page() { - tstr.Run_parse_from_url_bar("http://a.org").Chk_is_null(); // unknown wiki; return null; - tstr.Run_parse_from_url_bar("http://en.wikipedia.org").Chk_to_str("en.wikipedia.org/wiki/Main_Page"); // known wiki; return Main_Page + tstr.Exec__parse_from_url_bar("http://a.org").Test__is_null(); // unknown wiki; return null; + tstr.Exec__parse_from_url_bar("http://en.wikipedia.org").Test__to_str("en.wikipedia.org/wiki/Main_Page"); // known wiki; return Main_Page } @Test public void Invalid_names() { - tstr.Run_parse_from_url_bar("http://a/b/c").Chk_is_null(); // unknown url - tstr.Run_parse_from_url_bar("war").Chk_to_str("en.wikipedia.org/wiki/War"); // word looks like lang, but is actually page; default to current + tstr.Exec__parse_from_url_bar("http://a/b/c").Test__is_null(); // unknown url + tstr.Exec__parse_from_url_bar("war").Test__to_str("en.wikipedia.org/wiki/War"); // word looks like lang, but is actually page; default to current } @Test public void Proper_case() { - tstr.Run_parse_from_url_bar("a" ).Chk_to_str("en.wikipedia.org/wiki/A"); // "a" -> "A" x> "a" + tstr.Exec__parse_from_url_bar("a" ).Test__to_str("en.wikipedia.org/wiki/A"); // "a" -> "A" x> "a" } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java index c32ac95c0..53ca76693 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__wiki_tst.java @@ -20,22 +20,22 @@ import org.junit.*; public class Xow_url_parser__wiki_tst { private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Basic() { - tstr.Run_parse("en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("en.wikipedia.org").Chk_page("A"); + tstr.Exec__parse("en.wikipedia.org/wiki/A").Test__tid(Xoa_url_.Tid_page).Test__wiki("en.wikipedia.org").Test__page("A"); } @Test public void No_wiki() { // PURPOSE: no "/wiki/" - tstr.Run_parse("en.wikipedia.org/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); + tstr.Exec__parse("en.wikipedia.org/A").Test__wiki("en.wikipedia.org").Test__page("A"); } @Test public void Nested() { - tstr.Run_parse("en.wikipedia.org/wiki/A/b").Chk_wiki("en.wikipedia.org").Chk_page("A/b"); + tstr.Exec__parse("en.wikipedia.org/wiki/A/b").Test__wiki("en.wikipedia.org").Test__page("A/b"); } @Test public void Slash() { - tstr.Run_parse("en.wikipedia.org/wiki//A").Chk_wiki("en.wikipedia.org").Chk_page("/A"); - tstr.Run_parse("en.wikipedia.org/wiki/A//b").Chk_wiki("en.wikipedia.org").Chk_page("A//b"); - tstr.Run_parse("en.wikipedia.org/wiki///A").Chk_wiki("en.wikipedia.org").Chk_page("//A"); + tstr.Exec__parse("en.wikipedia.org/wiki//A").Test__wiki("en.wikipedia.org").Test__page("/A"); + tstr.Exec__parse("en.wikipedia.org/wiki/A//b").Test__wiki("en.wikipedia.org").Test__page("A//b"); + tstr.Exec__parse("en.wikipedia.org/wiki///A").Test__wiki("en.wikipedia.org").Test__page("//A"); } @Test public void Vnt() { Xowe_wiki wiki = tstr.Wiki(); gplx.xowa.langs.vnts.Xol_vnt_regy_fxt.Init__vnt_mgr(wiki.Lang().Vnt_mgr(), 0, String_.Ary("zh-hans", "zh-hant")); - tstr.Run_parse("en.wikipedia.org/zh-hans/A").Chk_wiki("en.wikipedia.org").Chk_page("A").Chk_vnt("zh-hans"); + tstr.Exec__parse("en.wikipedia.org/zh-hans/A").Test__wiki("en.wikipedia.org").Test__page("A").Test__vnt("zh-hans"); } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java index 4affd34b6..7ba5b5750 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xcmd_tst.java @@ -20,12 +20,12 @@ import org.junit.*; public class Xow_url_parser__xcmd_tst { private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Basic() { - tstr.Run_parse("xowa-cmd:xowa.app.version").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("xowa.app.version"); + tstr.Exec__parse("xowa-cmd:xowa.app.version").Test__tid(Xoa_url_.Tid_xcmd).Test__page("xowa.app.version"); } @Test public void Encoded() { - tstr.Run_parse("xowa-cmd:a%22b*c").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a\"b*c"); + tstr.Exec__parse("xowa-cmd:a%22b*c").Test__tid(Xoa_url_.Tid_xcmd).Test__page("a\"b*c"); } @Test public void Ignore_anchor_and_qargs() { - tstr.Run_parse("xowa-cmd:a/b/c?d=e#f").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a/b/c?d=e#f"); + tstr.Exec__parse("xowa-cmd:a/b/c?d=e#f").Test__tid(Xoa_url_.Tid_xcmd).Test__page("a/b/c?d=e#f"); } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java index 5e5a48792..448bb515f 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser__xwiki_tst.java @@ -21,60 +21,60 @@ public class Xow_url_parser__xwiki_tst { private final Xow_url_parser_fxt tstr = new Xow_url_parser_fxt(); @Test public void Commons() { // PURPOSE: "C" was being picked up as an xwiki to commons; PAGE:no.b:C/Variabler; DATE:2014-10-14 tstr.Prep_add_xwiki_to_user("c", "commons.wikimedia.org"); // add alias of "c" - tstr.Run_parse("C/D").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("en.wikipedia.org").Chk_page("C/D"); // should use current wiki (enwiki), not xwiki to commons; also, page should be "C/D", not "D" + tstr.Exec__parse("C/D").Test__tid(Xoa_url_.Tid_page).Test__wiki("en.wikipedia.org").Test__page("C/D"); // should use current wiki (enwiki), not xwiki to commons; also, page should be "C/D", not "D" } @Test public void Parse_lang() { tstr.Prep_add_xwiki_to_wiki("fr", "fr.wikipedia.org", "http://fr.wikipedia.org/~{0}"); - tstr.Run_parse("http://en.wikipedia.org/wiki/fr:A").Chk_tid(Xoa_url_.Tid_page).Chk_wiki("fr.wikipedia.org").Chk_page("A"); + tstr.Exec__parse("http://en.wikipedia.org/wiki/fr:A").Test__tid(Xoa_url_.Tid_page).Test__wiki("fr.wikipedia.org").Test__page("A"); } @Test public void Alias_wiki() { tstr.Prep_add_xwiki_to_wiki("s", "en.wikisource.org"); - tstr.Run_parse("s:A/b/c").Chk_wiki("en.wikisource.org").Chk_page("A/b/c"); + tstr.Exec__parse("s:A/b/c").Test__wiki("en.wikisource.org").Test__page("A/b/c"); } @Test public void Xwiki_no_segs() { // PURPOSE: handle xwiki without full url; EX: "commons:Commons:Media_of_the_day"; DATE:2014-02-19 tstr.Prep_add_xwiki_to_wiki("s", "en.wikisource.org"); - tstr.Run_parse("s:Project:A").Chk_wiki("en.wikisource.org").Chk_page("Project:A"); + tstr.Exec__parse("s:Project:A").Test__wiki("en.wikisource.org").Test__page("Project:A"); } @Test public void Domain_only() { tstr.Prep_add_xwiki_to_user("fr.wikipedia.org"); - tstr.Run_parse("fr.wikipedia.org").Chk_wiki("fr.wikipedia.org").Chk_page(""); + tstr.Exec__parse("fr.wikipedia.org").Test__wiki("fr.wikipedia.org").Test__page(""); } @Test public void Domain_and_wiki() { tstr.Prep_add_xwiki_to_user("fr.wikipedia.org"); - tstr.Run_parse("fr.wikipedia.org/wiki").Chk_wiki("fr.wikipedia.org").Chk_page(""); + tstr.Exec__parse("fr.wikipedia.org/wiki").Test__wiki("fr.wikipedia.org").Test__page(""); } @Test public void Domain_and_wiki_w_http() { tstr.Prep_add_xwiki_to_user("fr.wikipedia.org"); - tstr.Run_parse("http://fr.wikipedia.org/wiki").Chk_wiki("fr.wikipedia.org").Chk_page(""); + tstr.Exec__parse("http://fr.wikipedia.org/wiki").Test__wiki("fr.wikipedia.org").Test__page(""); } @Test public void Namespace_in_different_wiki() { // PURPOSE.fix: namespaced titles would default to default_wiki instead of current_wiki Xowe_wiki en_s = tstr.Prep_create_wiki("en.wikisource.org"); - tstr.Run_parse(en_s, "Category:A").Chk_wiki("en.wikisource.org").Chk_page("Category:A"); + tstr.Exec__parse(en_s, "Category:A").Test__wiki("en.wikisource.org").Test__page("Category:A"); } @Test public void Case_sensitive() { - // tstr.Run_parse("en.wikipedia.org/wiki/a").Chk_wiki("en.wikipedia.org").Chk_page("A"); + // tstr.Exec__parse("en.wikipedia.org/wiki/a").Test__wiki("en.wikipedia.org").Test__page("A"); Xowe_wiki en_d = tstr.Prep_create_wiki("en.wiktionary.org"); Xow_ns_mgr ns_mgr = en_d.Ns_mgr(); ns_mgr.Ns_main().Case_match_(Xow_ns_case_.Tid__all); - tstr.Run_parse("en.wiktionary.org/wiki/a").Chk_wiki("en.wiktionary.org").Chk_page("a"); + tstr.Exec__parse("en.wiktionary.org/wiki/a").Test__wiki("en.wiktionary.org").Test__page("a"); ns_mgr.Ns_category().Case_match_(Xow_ns_case_.Tid__all); - tstr.Run_parse("en.wiktionary.org/wiki/Category:a").Chk_wiki("en.wiktionary.org").Chk_page("Category:a"); + tstr.Exec__parse("en.wiktionary.org/wiki/Category:a").Test__wiki("en.wiktionary.org").Test__page("Category:a"); - tstr.Run_parse("en.wiktionary.org/wiki/A/B/C").Chk_page("A/B/C"); + tstr.Exec__parse("en.wiktionary.org/wiki/A/B/C").Test__page("A/B/C"); } @Test public void Xwiki__to_enwiki() { // PURPOSE: handle alias of "wikipedia" and sv.wikipedia.org/wiki/Wikipedia:Main_Page; DATE:2015-07-31 Xowe_wiki xwiki = tstr.Prep_create_wiki("sv.wikipedia.org"); tstr.Prep_xwiki(xwiki, "wikipedia", "en.wikipedia.org", null); tstr.Prep_get_ns_mgr_from_meta("sv.wikipedia.org").Add_new(Xow_ns_.Tid__project, "Wikipedia"); - tstr.Run_parse(xwiki, "sv.wikipedia.org/wiki/wikipedia:X").Chk_wiki("sv.wikipedia.org").Chk_page("wikipedia:X"); - tstr.Run_parse(xwiki, "sv.wikipedia.org/wiki/Wikipedia:X").Chk_wiki("sv.wikipedia.org").Chk_page("Wikipedia:X"); + tstr.Exec__parse(xwiki, "sv.wikipedia.org/wiki/wikipedia:X").Test__wiki("sv.wikipedia.org").Test__page("wikipedia:X"); + tstr.Exec__parse(xwiki, "sv.wikipedia.org/wiki/Wikipedia:X").Test__wiki("sv.wikipedia.org").Test__page("Wikipedia:X"); } @Test public void Xwiki__to_ns() { // PURPOSE: handle alias of "wikipedia" in current, but no "Wikipedia" ns in other wiki; PAGE:pt.w:Wikipedia:P�gina_de_testes DATE:2015-09-17 tstr.Prep_create_wiki("pt.wikipedia.org"); tstr.Prep_get_ns_mgr_from_meta("pt.wikipedia.org").Add_new(Xow_ns_.Tid__project, "Project"); // clear ns_mgr and add only "Project" ns, not "Wikipedia" ns tstr.Prep_xwiki(tstr.Wiki(), "wikipedia", "en.wikipedia.org", null); // add alias of "wikipedia" in current wiki - tstr.Run_parse(tstr.Wiki(), "pt.wikipedia.org/wiki/Wikipedia:X").Chk_wiki("pt.wikipedia.org").Chk_page("Wikipedia:X"); // should get "pt.wikipedia.org", not "en.wikipedia.org" (through alias) + tstr.Exec__parse(tstr.Wiki(), "pt.wikipedia.org/wiki/Wikipedia:X").Test__wiki("pt.wikipedia.org").Test__page("Wikipedia:X"); // should get "pt.wikipedia.org", not "en.wikipedia.org" (through alias) } } diff --git a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java index 32f5379e8..4c3144b17 100644 --- a/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java +++ b/400_xowa/src/gplx/xowa/apps/urls/Xow_url_parser_fxt.java @@ -46,36 +46,36 @@ public class Xow_url_parser_fxt { public Xow_ns_mgr Prep_get_ns_mgr_from_meta(String wiki) { return app.Dbmeta_mgr().Ns__get_or_load(Bry_.new_u8(wiki)); } - public Xow_url_parser_fxt Run_parse(String actl_str) {return Run_parse(cur_wiki, actl_str);} - public Xow_url_parser_fxt Run_parse(Xow_wiki wiki, String actl_str) { + public Xow_url_parser_fxt Exec__parse(String actl_str) {return Exec__parse(cur_wiki, actl_str);} + public Xow_url_parser_fxt Exec__parse(Xow_wiki wiki, String actl_str) { this.actl_url = wiki.Utl__url_parser().Parse(Bry_.new_u8(actl_str)); return this; } - public Xow_url_parser_fxt Run_parse_reuse(String actl_str) { + public Xow_url_parser_fxt Exec__parse_reuse(String actl_str) { this.actl_url = parser.Parse(Bry_.new_u8(actl_str)); return this; } - public Xow_url_parser_fxt Run_parse_from_url_bar(String raw) { + public Xow_url_parser_fxt Exec__parse_from_url_bar(String raw) { this.actl_url = parser.Parse_by_urlbar_or_null(raw); return this; } - public Xow_url_parser_fxt Chk_tid(int v) {Tfds.Eq_int(v, actl_url.Tid() , "tid"); return this;} - public Xow_url_parser_fxt Chk_is_null() {Tfds.Eq_bool(true, actl_url == null); return this;} - public Xow_url_parser_fxt Chk_vnt(String v) {Tfds.Eq_str(v, actl_url.Vnt_bry() , "vnt"); return this;} - public Xow_url_parser_fxt Chk_wiki(String v) {Tfds.Eq_str(v, actl_url.Wiki_bry() , "wiki"); return this;} - public Xow_url_parser_fxt Chk_wiki_is_missing(boolean v) {Tfds.Eq_bool(v, actl_url.Wiki_is_missing(), "wiki_is_missing"); return this;} - public Xow_url_parser_fxt Chk_page(String v) {Tfds.Eq_str(v, actl_url.Page_bry() , "page"); return this;} - public Xow_url_parser_fxt Chk_qargs(String v) {Tfds.Eq_str(v, actl_url.Qargs_mgr().To_bry(), "qargs"); return this;} - public Xow_url_parser_fxt Chk_page_is_main_y() {return Chk_page_is_main(Bool_.Y);} - public Xow_url_parser_fxt Chk_page_is_main_n() {return Chk_page_is_main(Bool_.N);} - public Xow_url_parser_fxt Chk_page_is_main(boolean v) {Tfds.Eq_bool(v, actl_url.Page_is_main() , "page_is_main"); return this;} - public Xow_url_parser_fxt Chk_anch(String v) {Tfds.Eq_str(v, actl_url.Anch_bry(), "anch"); return this;} - public Xow_url_parser_fxt Chk_action_is_edit_y() {return Chk_action_is_edit_(Bool_.Y);} - public Xow_url_parser_fxt Chk_action_is_edit_n() {return Chk_action_is_edit_(Bool_.N);} - private Xow_url_parser_fxt Chk_action_is_edit_(boolean v) {Tfds.Eq_bool(v, actl_url.Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit), "action_is_edit"); return this;} - public Xow_url_parser_fxt Chk_to_str(String v) {return Chk_to_str(Bool_.Y, v);} - public Xow_url_parser_fxt Chk_to_str(boolean full, String v) {Tfds.Eq_str(v, actl_url.To_bry(full, Bool_.Y), "To_bry"); return this;} - public Xow_url_parser_fxt Chk_build_str_is_same() { + public Xow_url_parser_fxt Test__tid(int v) {Tfds.Eq_int(v, actl_url.Tid() , "tid"); return this;} + public Xow_url_parser_fxt Test__is_null() {Tfds.Eq_bool(true, actl_url == null); return this;} + public Xow_url_parser_fxt Test__vnt(String v) {Tfds.Eq_str(v, actl_url.Vnt_bry() , "vnt"); return this;} + public Xow_url_parser_fxt Test__wiki(String v) {Tfds.Eq_str(v, actl_url.Wiki_bry() , "wiki"); return this;} + public Xow_url_parser_fxt Test__wiki_is_missing(boolean v) {Tfds.Eq_bool(v, actl_url.Wiki_is_missing(), "wiki_is_missing"); return this;} + public Xow_url_parser_fxt Test__page(String v) {Tfds.Eq_str(v, actl_url.Page_bry() , "page"); return this;} + public Xow_url_parser_fxt Test__qargs(String v) {Tfds.Eq_str(v, actl_url.Qargs_mgr().To_bry(), "qargs"); return this;} + public Xow_url_parser_fxt Test__page_is_main_y() {return Test__page_is_main(Bool_.Y);} + public Xow_url_parser_fxt Test__page_is_main_n() {return Test__page_is_main(Bool_.N);} + public Xow_url_parser_fxt Test__page_is_main(boolean v) {Tfds.Eq_bool(v, actl_url.Page_is_main() , "page_is_main"); return this;} + public Xow_url_parser_fxt Test__anch(String v) {Tfds.Eq_str(v, actl_url.Anch_bry(), "anch"); return this;} + public Xow_url_parser_fxt Test__action_is_edit_y() {return Test__action_is_edit_(Bool_.Y);} + public Xow_url_parser_fxt Test__action_is_edit_n() {return Test__action_is_edit_(Bool_.N);} + private Xow_url_parser_fxt Test__action_is_edit_(boolean v) {Tfds.Eq_bool(v, actl_url.Qargs_mgr().Match(Xoa_url_.Qarg__action, Xoa_url_.Qarg__action__edit), "action_is_edit"); return this;} + public Xow_url_parser_fxt Test__to_str(String v) {return Test__to_str(Bool_.Y, v);} + public Xow_url_parser_fxt Test__to_str(boolean full, String v) {Tfds.Eq_str(v, actl_url.To_bry(full, Bool_.Y), "To_bry"); return this;} + public Xow_url_parser_fxt Test__build_str_is_same() { Xow_url_parser parser = new Xow_url_parser(cur_wiki); Tfds.Eq_str(actl_url.Raw(), parser.Build_str(actl_url), "build_str"); return this; diff --git a/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java index 5bed2850d..6773dad63 100644 --- a/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java +++ b/400_xowa/src/gplx/xowa/apps/wms/apis/origs/Xoapi_orig_wmf.java @@ -46,7 +46,8 @@ public class Xoapi_orig_wmf extends Xoapi_orig_base { if (Parse_xml_val(tmp_rng, usr_dlg, xml, xml_len, pos, Bry_xml_descriptionurl)) { byte[] file_url = Bry_.Mid(xml, tmp_rng.Val_0(), tmp_rng.Val_1()); - orig_wiki = gplx.xowa.wikis.xwikis.Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, file_url); + Gfo_url url = url_parser.Parse(file_url, 0, file_url.length); + orig_wiki = url.Segs__get_at_1st(); byte[] page = Xoa_ttl.Replace_spaces(url.Segs__get_at_nth()); int colon_pos = Bry_find_.Find_fwd(page, Byte_ascii.Colon, 0, page.length); if (colon_pos != Bry_find_.Not_found) @@ -58,7 +59,7 @@ public class Xoapi_orig_wmf extends Xoapi_orig_base { } } private static Int_2_ref tmp_rng = new Int_2_ref(); - private static Gfo_url_parser url_parser = new Gfo_url_parser(); private static Gfo_url url = new Gfo_url(); + private static Gfo_url_parser url_parser = new Gfo_url_parser(); private static boolean Parse_xml_val(Int_2_ref rv, Gfo_usr_dlg usr_dlg, byte[] xml, int xml_len, int pos, byte[] key) { int bgn = 0, end = 0; bgn = Bry_find_.Find_fwd(xml, key, pos, xml_len); if (bgn == Bry_find_.Not_found) return false; diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java b/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java index a089868ef..a3cedd74c 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_bldr.java @@ -17,9 +17,10 @@ along with this program. If not, see . */ package gplx.xowa.bldrs; import gplx.*; import gplx.xowa.*; import gplx.core.consoles.*; import gplx.core.envs.*; -import gplx.xowa.apps.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.bldrs.cfgs.*; import gplx.xowa.langs.bldrs.*; +import gplx.xowa.apps.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.xmls.*; import gplx.xowa.langs.bldrs.*; import gplx.xowa.bldrs.wkrs.*; import gplx.langs.jsons.*; +import gplx.xowa.addons.bldrs.app_cfgs.*; public class Xob_bldr implements Gfo_invk { private boolean pause_at_end = false; private long prv_prog_time; private Xob_xml_parser dump_parser; public Xob_bldr(Xoae_app app) { diff --git a/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java index 7d2857553..b3a811c98 100644 --- a/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java +++ b/400_xowa/src/gplx/xowa/bldrs/Xob_page_wkr_cmd.java @@ -36,7 +36,7 @@ public class Xob_page_wkr_cmd implements Xob_cmd { gplx.core.ios.streams.Io_stream_rdr src_rdr = wiki.Import_cfg().Src_rdr(); fil = Io_buffer_rdr.new_(src_rdr, optRdrBfrSize); fil_len = fil.Fil_len(); - if (src_rdr.Tid() == gplx.core.ios.streams.Io_stream_.Tid_bzip2) fil_len = (fil_len * 100) / 18; // HACK: no way to get actual file progress; assume 18% compression + if (src_rdr.Tid() == gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2) fil_len = (fil_len * 100) / 18; // HACK: no way to get actual file progress; assume 18% compression // fil.Seek(bldr.Opts().ResumeAt()); int prv_pos = 0; while (true) { diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java index 50ebe5fab..5495d0cb3 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/texts/tdbs/Xob_make_cmd_site.java @@ -107,7 +107,7 @@ public class Xob_make_cmd_site implements Io_make_cmd { fil_wtr.Add_idx_direct(itm_len, Byte_.Zero); Io_stream_wtr wtr = null; try { - wtr = Io_stream_wtr_.file_(fil_wtr.Fil_url()); + wtr = Io_stream_wtr_.New__raw(fil_wtr.Fil_url()); wtr.Open(); fil_wtr.FlushIdx(wtr); wtr.Write(bry, itm_bgn, itm_end); diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java index ccb9e45f2..a092678cc 100644 --- a/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java +++ b/400_xowa/src/gplx/xowa/bldrs/cmds/utils/Xob_unzip_wkr.java @@ -30,9 +30,9 @@ public class Xob_unzip_wkr { } public void Decompress(Io_url src, Io_url trg) { String src_ext = src.Ext(); - if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_.Ext_bz2)) process = decompress_bz2; - else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_.Ext_zip)) process = decompress_zip; - else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_.Ext_gz)) process = decompress_gz; + if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_tid_.Ext__bz2)) process = decompress_bz2; + else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_tid_.Ext__zip)) process = decompress_zip; + else if (String_.Eq(src_ext, gplx.core.ios.streams.Io_stream_tid_.Ext__gz)) process = decompress_gz; else throw Err_.new_unhandled(src_ext); Io_url trg_owner_dir = trg.OwnerDir(); Io_mgr.Instance.CreateDirIfAbsent(trg_owner_dir); diff --git a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java index 93871e62e..f0e130407 100644 --- a/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java +++ b/400_xowa/src/gplx/xowa/bldrs/css/Xoa_css_extractor.java @@ -240,7 +240,6 @@ public class Xoa_css_extractor { int prv_pos = 0; int css_find_bgn_len = Css_find_bgn.length; byte[] protocol_prefix_bry = Bry_.new_u8(protocol_prefix); - Gfo_url gfo_url = new Gfo_url(); while (true) { int url_bgn = Bry_find_.Find_fwd(raw, Css_find_bgn, prv_pos); if (url_bgn == Bry_find_.Not_found) break; // nothing left; stop url_bgn += css_find_bgn_len; @@ -249,7 +248,7 @@ public class Xoa_css_extractor { css_url_bry = Bry_.Replace(css_url_bry, Css_amp_find, Css_amp_repl); // & -> & css_url_bry = url_encoder.Decode(css_url_bry); // %2C -> %7C -> | css_url_bry = Xoa_css_extractor.Url_root_fix(wiki_domain, css_url_bry); - url_parser.Parse(gfo_url, css_url_bry, 0, css_url_bry.length); + Gfo_url gfo_url = url_parser.Parse(css_url_bry, 0, css_url_bry.length); if ( gfo_url.Protocol_tid() == Gfo_protocol_itm.Tid_relative_1 // if rel url, add protocol_prefix DATE:2015-08-01 || (Env_.Mode_testing() && gfo_url.Protocol_tid() == Gfo_protocol_itm.Tid_unknown)) // TEST: css_url_bry = Bry_.Add(protocol_prefix_bry, css_url_bry); diff --git a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java index 1dca99e6c..9d4376002 100644 --- a/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java +++ b/400_xowa/src/gplx/xowa/bldrs/installs/Xoi_dump_mgr.java @@ -21,7 +21,7 @@ import gplx.xowa.bldrs.wms.dumps.*; public class Xoi_dump_mgr implements Gfo_invk { public String[] Server_urls() {return server_urls;} private String[] server_urls = String_.Ary(Xowm_dump_file_.Server_your_org, Xowm_dump_file_.Server_wmf_https, Xowm_dump_file_.Server_c3sl, Xowm_dump_file_.Server_masaryk); // promote your.org to primary url; DATE:2016-08-07 public String[] Custom_cmds() {return custom_cmds;} private String[] custom_cmds = String_.Ary(Xoi_cmd_wiki_download.Key_wiki_download, Xoi_cmd_wiki_import.KEY); - public byte Data_storage_format() {return data_storage_format;} public Xoi_dump_mgr Data_storage_format_(byte v) {data_storage_format = v; return this;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_.Tid_gzip; + public byte Data_storage_format() {return data_storage_format;} public Xoi_dump_mgr Data_storage_format_(byte v) {data_storage_format = v; return this;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_tid_.Tid__gzip; public long Db_text_max() {return db_text_max;} private long db_text_max = (long)3000 * Io_mgr.Len_mb; public long Db_categorylinks_max() {return db_categorylinks_max;} private long db_categorylinks_max = (long)3600 * Io_mgr.Len_mb; public long Db_wikidata_max() {return db_wikidata_max;} private long db_wikidata_max = (long)3600 * Io_mgr.Len_mb; @@ -38,8 +38,8 @@ public class Xoi_dump_mgr implements Gfo_invk { else if (ctx.Match(k, Invk_server_urls_)) server_urls = m.ReadStrAryIgnore("v", ",", "\n"); else if (ctx.Match(k, Invk_custom_cmds)) return String_.Concat_with_str(",", custom_cmds); else if (ctx.Match(k, Invk_custom_cmds_)) custom_cmds = String_.Ary_filter(m.ReadStrAry("v", ","), Xoi_cmd_mgr.Wiki_cmds_valid); - else if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(data_storage_format); - else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_.Obsolete_to_tid(m.ReadStr("v")); + else if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_tid_.Obsolete_to_str(data_storage_format); + else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_tid_.Obsolete_to_tid(m.ReadStr("v")); else if (ctx.Match(k, Invk_data_storage_format_list)) return Options_data_storage_format_list; else if (ctx.Match(k, Invk_db_text_max)) return db_text_max / Io_mgr.Len_mb; else if (ctx.Match(k, Invk_db_text_max_)) db_text_max = m.ReadLong("v") * Io_mgr.Len_mb; diff --git a/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java b/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java index c085f2a78..ef0818154 100644 --- a/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java +++ b/400_xowa/src/gplx/xowa/bldrs/sql_dumps/Xosql_dump_parser.java @@ -32,7 +32,7 @@ public class Xosql_dump_parser { try { // init bfrs, rdr Bry_bfr val_bfr = Bry_bfr_.New(); - rdr = Io_buffer_rdr.new_(Io_stream_rdr_.new_by_url_(src_fil), src_rdr_bfr_len); + rdr = Io_buffer_rdr.new_(Io_stream_rdr_.New_by_url(src_fil), src_rdr_bfr_len); byte[] bfr = rdr.Bfr(); int bfr_len = rdr.Bfr_len(), fld_idx = 0, cur_pos = 0; this.tbl_flds = Identify_flds(cbk_flds, bfr); diff --git a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java index 190342e1e..1b5388978 100644 --- a/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java +++ b/400_xowa/src/gplx/xowa/bldrs/wiki_cfgs/Xoi_wiki_props_api_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.bldrs.wiki_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import org.junit.*; import gplx.core.strings.*; import gplx.langs.xmls.*; -import gplx.xowa.bldrs.cfgs.*; +import gplx.xowa.addons.bldrs.app_cfgs.*; public class Xoi_wiki_props_api_tst { private Xoi_wiki_props_fxt fxt = new Xoi_wiki_props_fxt(); @Before public void init() {} // private Xob_subpage_tst_fxt fxt = new] Xob_subpage_tst_fxt(); diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java index 4759e9a20..bb215b11b 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_import_cfg.java @@ -49,12 +49,12 @@ public class Xob_import_cfg { return Io_stream_rdr_process.new_(process.Exe_url(), src_fil_bz2, process.Xto_process_bldr_args(src_fil_bz2.Raw())); } else - return Io_stream_rdr_.bzip2_(src_fil_bz2); + return Io_stream_rdr_.New__bzip2(src_fil_bz2); } else { Chk_file_ext(wiki.Appe(), src_fil_xml, ".xml", "bz2"); src_fil = src_fil_xml; src_rdr_len = Io_mgr.Instance.QueryFil(src_fil_xml).Size(); - return Io_stream_rdr_.file_(src_fil_xml); + return Io_stream_rdr_.New__raw(src_fil_xml); } } private static void Chk_file_ext(Xoae_app app, Io_url fil, String expd_ext, String alt_ext) { diff --git a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java index 40a14a4ff..b7dc09f93 100644 --- a/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java +++ b/400_xowa/src/gplx/xowa/bldrs/xmls/Xob_xml_page_bldr.java @@ -23,7 +23,7 @@ public class Xob_xml_page_bldr { public Io_buffer_rdr XtoByteStreamRdr(int bfr_len) { Io_url url = Io_url_.mem_fil_("mem/byteStreamRdr.txt"); Io_mgr.Instance.SaveFilBry(url, bfr.To_bry_and_clear()); - return Io_buffer_rdr.new_(gplx.core.ios.streams.Io_stream_rdr_.file_(url), bfr_len); + return Io_buffer_rdr.new_(gplx.core.ios.streams.Io_stream_rdr_.New__raw(url), bfr_len); } public Bry_bfr Bfr() {return bfr;} Bry_bfr bfr = Bry_bfr_.New(); public Xob_xml_page_bldr Upd(String find, String repl) { diff --git a/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java b/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java index 5ff8ae344..561903264 100644 --- a/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java +++ b/400_xowa/src/gplx/xowa/drds/Xowd_data_tstr.java @@ -35,7 +35,7 @@ public class Xowd_data_tstr { Xoh_page hpg = new Xoh_page(); hpg.Db().Html().Html_bry_(html_bry); byte[] data = html_bry; - html_db.Tbl__html().Insert(page_id, 0, gplx.core.ios.streams.Io_stream_.Tid_raw, gplx.xowa.htmls.core.hzips.Xoh_hzip_dict_.Hzip__none, Bry_.Empty, Bry_.Empty, Bry_.Empty, data); + html_db.Tbl__html().Insert(page_id, 0, gplx.core.ios.streams.Io_stream_tid_.Tid__raw, gplx.xowa.htmls.core.hzips.Xoh_hzip_dict_.Hzip__none, Bry_.Empty, Bry_.Empty, Bry_.Empty, data); } public void Text__insert(int page_id, String text) { Xow_db_file db = wiki.Data__core_mgr().Db__text(); diff --git a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java index 2d5bbb8ad..ff3fc6b73 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java +++ b/400_xowa/src/gplx/xowa/files/Xof_file_wkr.java @@ -120,7 +120,7 @@ public class Xof_file_wkr implements Gfo_thread_wkr { } public static void Save_bin(Xof_fsdb_itm itm, Fsm_mnt_mgr mnt_mgr, Io_url html_url) { long rdr_len = Io_mgr.Instance.QueryFil(html_url).Size(); - Io_stream_rdr rdr = gplx.core.ios.streams.Io_stream_rdr_.file_(html_url); + Io_stream_rdr rdr = gplx.core.ios.streams.Io_stream_rdr_.New__raw(html_url); try { rdr.Open(); Fsm_mnt_itm mnt_itm = mnt_mgr.Mnts__get_insert(); diff --git a/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java index 64daf8e14..d376b66ec 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java +++ b/400_xowa/src/gplx/xowa/files/bins/Io_download_mgr__memory.java @@ -23,6 +23,6 @@ public class Io_download_mgr__memory implements Io_download_mgr { public void Upload_data(String url, byte[] data) {hash.Add(url, data);} public Io_stream_rdr Download_as_rdr(String url) { byte[] data = (byte[])hash.Get_by(url); if (data == null) return Io_stream_rdr_.Noop; - return Io_stream_rdr_.mem_(data); + return Io_stream_rdr_.New__mem(data); } } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java index f038dec8e..7e59a1aa3 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_mgr.java @@ -110,7 +110,7 @@ public class Xof_bin_mgr { boolean resized = Resize(exec_tid, fsdb, file_is_orig, orig, trg); if (!resized) continue; fsdb.File_exists_y_(); - rv = Io_stream_rdr_.file_(trg); // return stream of resized url; (result of imageMagick / inkscape) + rv = Io_stream_rdr_.New__raw(trg); // return stream of resized url; (result of imageMagick / inkscape) rv.Open(); return rv; } @@ -151,7 +151,7 @@ public class Xof_bin_mgr { if (save_to_fsys) { // noop; already saved to trg } else { - Io_stream_rdr rdr = Io_stream_rdr_.file_(trg); // return stream of resized url; (result of imageMagick / inkscape) + Io_stream_rdr rdr = Io_stream_rdr_.New__raw(trg); // return stream of resized url; (result of imageMagick / inkscape) rdr.Open(); rdr_wrapper.Rdr_(rdr); } diff --git a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java index c1298865c..87a744d70 100644 --- a/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java +++ b/400_xowa/src/gplx/xowa/files/bins/Xof_bin_wkr__fsys_base.java @@ -25,7 +25,7 @@ public abstract class Xof_bin_wkr__fsys_base implements Xof_bin_wkr, Gfo_invk { public boolean Resize_allowed() {return resize_allowed;} public void Resize_allowed_(boolean v) {resize_allowed = v;} private boolean resize_allowed = false; public Io_stream_rdr Get_as_rdr(Xof_fsdb_itm itm, boolean is_thumb, int w) { Io_url src_url = this.Get_src_url(Xof_img_mode_.By_bool(is_thumb), String_.new_u8(itm.Orig_repo_name()), itm.Orig_ttl(), itm.Orig_ttl_md5(), itm.Orig_ext(), w, itm.Lnki_time(), itm.Lnki_page()); - return (src_url == Io_url_.Empty) ? gplx.core.ios.streams.Io_stream_rdr_.Noop : gplx.core.ios.streams.Io_stream_rdr_.file_(src_url); + return (src_url == Io_url_.Empty) ? gplx.core.ios.streams.Io_stream_rdr_.Noop : gplx.core.ios.streams.Io_stream_rdr_.New__raw(src_url); } public boolean Get_to_fsys(Xof_fsdb_itm itm, boolean is_thumb, int w, Io_url bin_url) { return Get_to_fsys(itm.Orig_repo_name(), itm.Orig_ttl(), itm.Orig_ttl_md5(), itm.Orig_ext(), is_thumb, w, itm.Lnki_time(), itm.Lnki_page(), bin_url); 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 74eaf8810..caca2e854 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 @@ -59,9 +59,9 @@ class Xof_file_fxt { Fsm_atr_fil atr_fil = mnt_itm.Atr_mgr().Db__core(); Fsm_bin_fil bin_fil = mnt_itm.Bin_mgr().Dbs__get_nth(); if (arg.Is_thumb()) - mnt_itm.Insert_thm(tmp_thm, atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Time(), arg.Page(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.mem_(arg.Bin())); + mnt_itm.Insert_thm(tmp_thm, atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Time(), arg.Page(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.New__mem(arg.Bin())); else - mnt_itm.Insert_img(atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.mem_(arg.Bin())); + mnt_itm.Insert_img(atr_fil, bin_fil, arg.Wiki(), arg.Ttl(), arg.Ext(), arg.W(), arg.H(), arg.Bin().length, gplx.core.ios.streams.Io_stream_rdr_.New__mem(arg.Bin())); } public void Exec_get(Xof_exec_arg arg) { byte[] ttl_bry = arg.Ttl(); 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 3c891fdc8..5368e27e6 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 @@ -26,24 +26,27 @@ public class Xog_url_wkr { private Xoae_app app; private Xog_win_itm win; private Xowe_wiki wiki; private Xoae_page page; private final Xof_img_size img_size = new Xof_img_size(); private final Xof_url_bldr url_bldr = Xof_url_bldr.new_v2(); private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make(); - public Xog_url_wkr Parse(Xog_win_itm win, String href_str) { - if (href_str == null) return this; // text is not link; return; + public Xoa_url Parse(Xog_win_itm win, String href_str) { + if (href_str == null) return tmp_url; // text is not link; return; byte[] href_bry = Bry_.new_u8(href_str); this.win = win; this.app = win.App(); this.page = win.Active_page(); this.wiki = win.Active_tab().Wiki(); app.Html__href_parser().Parse_as_url(tmp_url, href_bry, wiki, page.Ttl().Page_url()); - return this; + return tmp_url; } - public Xoa_url Exec() { - switch (tmp_url.Tid()) { + public void Init(Xowe_wiki wiki) { // TEST: + this.wiki = wiki; + } + public Xoa_url Exec(Xoa_url url) { + switch (url.Tid()) { case Xoa_url_.Tid_unknown: return Xoa_url.Null; // unknown; return null which will become a noop case Xoa_url_.Tid_inet: return Exec_url_http(app); // http://site.org case Xoa_url_.Tid_anch: return Exec_url_anchor(win); // #anchor case Xoa_url_.Tid_xcmd: return Exec_url_xowa(app); // xowa:app.version or /xcmd/app.version - case Xoa_url_.Tid_file: return Exec_url_file(app, wiki, page, win, tmp_url.Raw()); // file:///xowa/A.png - case Xoa_url_.Tid_page: return Exec_url_page(app, wiki, page, win, tmp_url.Raw()); // Page /wiki/Page - default: throw Err_.new_unhandled(tmp_url.Tid()); + case Xoa_url_.Tid_file: return Exec_url_file(app, wiki, page, win, url.Raw()); // file:///xowa/A.png + case Xoa_url_.Tid_page: return Exec_url_page(wiki, url.Orig()); // /wiki/Page + default: throw Err_.new_unhandled(url.Tid()); } } private Xoa_url Exec_url_xowa(Xoae_app app) { // EX: xowa:app.version @@ -90,24 +93,13 @@ public class Xog_url_wkr { } return Rslt_handled; } - private Xoa_url Exec_url_page(Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xog_win_itm win, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19 - Xoa_url rv = wiki.Utl__url_parser().Parse(href_bry);// needed for query_args - Gfo_qarg_itm[] qargs = rv.Qargs_ary(); - int qargs_len = qargs.length; - if (qargs_len > 0) { // remove anchors from qargs; EX: "to=B#mw_pages" - for (int i = 0; i < qargs_len; i++) { - Gfo_qarg_itm arg = qargs[i]; - int anch_pos = Bry_find_.Find_bwd(arg.Val_bry(), Byte_ascii.Hash); // NOTE: must .FindBwd to handle Category args like de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages; DATE:2013-06-18 - if (anch_pos != Bry_find_.Not_found) - arg.Val_bry_(Bry_.Mid(arg.Val_bry(), 0, anch_pos)); - } - } - return rv; + private Xoa_url Exec_url_page(Xowe_wiki wiki, byte[] href_bry) { // EX: "Page"; "/wiki/Page"; // rewritten; DATE:2014-01-19 + return wiki.Utl__url_parser().Parse(href_bry); } public static Xoa_url Rslt_handled = null; public static Xoa_url Exec_url(Xog_win_itm win, String href_str) { Xog_url_wkr url_wkr = new Xog_url_wkr(); - url_wkr.Parse(win, href_str); - return url_wkr.Exec(); + Xoa_url url = url_wkr.Parse(win, href_str); + return url_wkr.Exec(url); } } diff --git a/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java new file mode 100644 index 000000000..b494a1080 --- /dev/null +++ b/400_xowa/src/gplx/xowa/guis/urls/Xog_url_wkr__tst.java @@ -0,0 +1,48 @@ +/* +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.guis.urls; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*; +import org.junit.*; import gplx.core.tests.*; +public class Xog_url_wkr__tst { + private final Xog_url_wkr__fxt fxt = new Xog_url_wkr__fxt(); + @Test public void Basic() { + fxt.Exec__parse("/wiki/A?k1=B%26C"); + fxt.Test__raw("/wiki/A?k1=B%26C"); + } + @Test public void Anch_early() { // de.wikipedia.org/wiki/Kategorie:Begriffskl%C3%A4rung?pagefrom=#::12%20PANZERDIVISION#mw-pages + fxt.Exec__parse("/wiki/A?pagefrom=%23%3A7p#mw-pages"); + fxt.Test__qarg("?pagefrom=#:7p"); + fxt.Test__anch("mw-pages"); + } +} +class Xog_url_wkr__fxt { + private final Xowe_wiki wiki; + private final Xog_url_wkr wkr = new Xog_url_wkr(); + private Xoa_url url; + public Xog_url_wkr__fxt() { + Xoae_app app = Xoa_app_fxt.Make__app__edit(); + this.wiki = Xoa_app_fxt.Make__wiki__edit(app); + wkr.Init(wiki); + } + public void Exec__parse(String href) { + this.url = wiki.Utl__url_parser().Parse(Bry_.new_u8(href)); + this.url = wkr.Exec(url); + } + public void Test__raw(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Raw()));} + public void Test__qarg(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Qargs_mgr().To_bry()));} + public void Test__anch(String expd) {Gftest.Eq__str(expd, String_.new_u8(url.Anch_bry()));} +} 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 9af1c6a0a..a17caddbe 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 @@ -60,6 +60,10 @@ public class Xoh_page_wtr_wkr { if (page_mode == Xopg_page_.Tid_html) // if html, write page again, but wrap it in html skin this time Write_page_by_tid(ctx, hctx, page_mode, rv, mgr.Page_html_fmtr(), Gfh_utl.Escape_html_as_bry(rv.To_bry_and_clear())); wdata_lang_wtr.Page_(null); + + if (page_mode == Xopg_page_.Tid_read) { // EXPERIMENTAL + new gplx.xowa.addons.htmls.includes.Xoh_include_mgr().Write(wiki, page); + } } } else @@ -176,7 +180,7 @@ public class Xoh_page_wtr_wkr { } // 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().Catpage_mgr().Write_catpage(tidy_bfr, wiki, page, hctx); + if (ns_id == Xow_ns_.Tid__category) wiki.Ctg__catpage_mgr().Write_catpage(tidy_bfr, page, hctx); // tidy html wiki.Html_mgr().Tidy_mgr().Exec_tidy(tidy_bfr, !hctx.Mode_is_hdump(), page.Url_bry_safe()); @@ -192,8 +196,9 @@ public class Xoh_page_wtr_wkr { && !wiki.Html_mgr().Importing_ctgs() // do not show categories if importing categories, page will wait for category import to be done; DATE:2014-10-15 ) { if (app.Mode().Tid_is_gui()) app.Usr_dlg().Prog_many("", "", "loading categories: count=~{0}", ctgs_len); - Xoctg_pagebox_itm[] pagebox_itms = wiki.Html__ctg_pagebox_wtr().Get_catlinks_by_page(wiki, page); - wiki.Html__ctg_pagebox_wtr().Write_pagebox(app.Ctg_mgr().Pagecats_grouping_enabled(), bfr, wiki, page, pagebox_itms); + Xoctg_pagebox_itm[] pagebox_itms = wiki.Ctg__pagebox_wtr().Get_catlinks_by_page(wiki, page); + boolean hidden_enabled = wiki.App().Api_root().Addon().Wikis__ctgs__hidden_enabled(); + wiki.Ctg__pagebox_wtr().Write_pagebox(hidden_enabled, bfr, wiki, page, pagebox_itms); } // translate if variants are enabled 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 76cfc093d..480cc9c3d 100644 --- a/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/Xow_html_mgr.java @@ -23,7 +23,6 @@ import gplx.xowa.parsers.xndes.*; import gplx.xowa.htmls.portal.*; import gplx.xowa.addons.htmls.tocs.*; import gplx.xowa.wikis.modules.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.hzips.*; import gplx.xowa.htmls.core.htmls.tidy.*; import gplx.xowa.htmls.js.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.singles.*; -import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; public class Xow_html_mgr implements Gfo_invk { private final Gfo_url_encoder fsys_lnx_encoder = Gfo_url_encoder_.New__fsys_lnx().Make(); public Xow_html_mgr(Xowe_wiki wiki) { @@ -53,7 +52,6 @@ public class Xow_html_mgr implements Gfo_invk { public Xop_xatr_whitelist_mgr Whitelist_mgr() {return whitelist_mgr;} private final Xop_xatr_whitelist_mgr whitelist_mgr = new Xop_xatr_whitelist_mgr().Ini(); public Xow_portal_mgr Portal_mgr() {return portal_mgr;} private Xow_portal_mgr portal_mgr; public Xow_module_mgr Head_mgr() {return module_mgr;} private Xow_module_mgr module_mgr; - public Xoctg_catpage_mgr Catpage_mgr() {return catpage_mgr;} private final Xoctg_catpage_mgr catpage_mgr = new Xoctg_catpage_mgr(); public boolean Importing_ctgs() {return importing_ctgs;} public void Importing_ctgs_(boolean v) {importing_ctgs = v;} private boolean importing_ctgs; public int Img_thumb_width() {return img_thumb_width;} private int img_thumb_width = 220; public byte[] Img_xowa_protocol() {return img_xowa_protocol;} private byte[] img_xowa_protocol; 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 147cc67e8..5b09d880c 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 @@ -30,7 +30,7 @@ public class Xow_hdump_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 dflt_zip_tid = gplx.core.ios.streams.Io_stream_.Tid_raw; + byte dflt_zip_tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw; boolean dflt_hzip_enable = false; boolean mode_is_b256 = false; if (wiki.Data__core_mgr() != null) { // TEST: handle null data mgr 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 842574390..2c7f1b840 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 @@ -57,10 +57,11 @@ public class Xow_hdump_mgr__load { byte[] src = Parse(hpg, hpg.Db().Html().Zip_tid(), hpg.Db().Html().Hzip_tid(), hpg.Db().Html().Html_bry()); // write ctgs - Xoctg_pagebox_itm[] pagebox_itms = wiki.Html__ctg_pagebox_wtr().Get_catlinks_by_page(wiki, hpg); + Xoctg_pagebox_itm[] pagebox_itms = wiki.Ctg__pagebox_wtr().Get_catlinks_by_page(wiki, hpg); if (pagebox_itms.length > 0) { - tmp_bfr.Add(src); - wiki.Html__ctg_pagebox_wtr().Write_pagebox(Bool_.Y, tmp_bfr, wiki, hpg, pagebox_itms); + tmp_bfr.Add(src); + boolean hidden_enabled = wiki.App().Api_root().Addon().Wikis__ctgs__hidden_enabled(); + wiki.Ctg__pagebox_wtr().Write_pagebox(hidden_enabled, tmp_bfr, wiki, hpg, pagebox_itms); src = tmp_bfr.To_bry_and_clear(); } @@ -70,7 +71,7 @@ public class Xow_hdump_mgr__load { } 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.streams.Io_stream_.Tid_raw) + if (zip_tid > gplx.core.ios.streams.Io_stream_tid_.Tid__raw) src = zip_mgr.Unzip((byte)zip_tid, src); switch (hzip_tid) { case Xoh_hzip_dict_.Hzip__none: 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 4fc3ef1b1..122acf63d 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 @@ -52,7 +52,7 @@ public class Xow_hdump_mgr__save { 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.streams.Io_stream_.Tid_raw) + if (zip_tid > gplx.core.ios.streams.Io_stream_tid_.Tid__raw) src = zip_mgr.Zip((byte)zip_tid, src); return src; } diff --git a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java index f5c1c902e..338a1ed49 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/htmls/Xoh_html_wtr.java @@ -348,6 +348,7 @@ public class Xoh_html_wtr { case Xop_xnde_tag_.Tid__math: case Xop_xnde_tag_.Tid__indicator: case Xop_xnde_tag_.Tid__xowa_html: + case Xop_xnde_tag_.Tid__xowa_wiki_setup: case Xop_xnde_tag_.Tid__graph: case Xop_xnde_tag_.Tid__random_selection: case Xop_xnde_tag_.Tid__tabber: @@ -360,7 +361,7 @@ public class Xoh_html_wtr { break; default: // unknown tag if (tag.Restricted()) { // a; img; script; etc.. - if ( !page.Html_data().Html_restricted() // page is not marked restricted (only [[Special:]]) + if ( !page.Html_data().Html_restricted() // page is not marked restricted (only [[Special:]]) || page.Wiki().Domain_tid() == Xow_domain_tid_.Tid__home) { // page is in home wiki bfr.Add_mid(src, xnde.Src_bgn(), xnde.Src_end()); return; 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 af2a256d8..bf49608a1 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 @@ -212,7 +212,7 @@ public class Xoh_file_wtr__basic { boolean a_href_is_file = true; if (xowa_title_bry == null) {xowa_title_bry = lnki_ttl; a_href_is_file = false;} 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 + link_arg = Gfo_url_encoder_.Href_quotes_v2.Encode(link_arg); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16; changed to use "v2" so not to double encode "%" values; DATE:2016-10-10 // 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 img_fmtr.Add_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, a_href_is_file, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anch_ttl, Xoh_file_fmtr__basic.Escape_xowa_title(xowa_title_bry), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other); } diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__basic__tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__basic__tst.java new file mode 100644 index 000000000..f343ced7b --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__basic__tst.java @@ -0,0 +1,96 @@ +/* +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.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*; +public class Xoh_href_parser__basic__tst { + private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt(); + @Test public void Site__basic() { + fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A").Test__tid(Xoa_url_.Tid_page).Test__to_str("en.wikipedia.org/wiki/A").Test__page("A"); + } + @Test public void Site__ns_case() { + fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/file:A").Test__page("File:A"); + } + @Test public void Site__main_page() { + fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/").Test__page("Main_Page").Test__page_is_main_y(); + } + @Test public void Site__anch() { + fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A#b_c").Test__page("A").Test__anch("b_c"); + } + @Test public void Site__qarg() { + fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A?action=edit").Test__page("A").Test__qargs("?action=edit"); + } + @Test public void Site__invalid_ttl_shouldnt_fail() { // PURPOSE: invalid title shouldn't fail; EX: A{{B}} is invalid (b/c of braces); + fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/A{{B}}").Test__page(""); + } + @Test public void Site__xwiki_cases_correctly() { // PURPOSE: xwiki links should use case_match of xwiki (en.wiktionary.org) not cur_wiki (en.wikipedia.org); EX:w:Alphabet + Xowe_wiki en_wiktionary_org = fxt.Prep_create_wiki("en.wiktionary.org"); + en_wiktionary_org.Ns_mgr().Ns_main().Case_match_(Xow_ns_case_.Tid__all); + fxt.Prep_add_xwiki_to_user("en.wiktionary.org", "en.wiktionary.org"); + fxt.Exec__parse_as_url("/site/en.wiktionary.org/wiki/alphabet"); + fxt.Test__to_str("en.wiktionary.org/wiki/alphabet").Test__page("alphabet"); + } + @Test public void Site__xwiki_compound() { // PURPOSE: [[[w:wikt:]] not handled; DATE:2013-07-25 + fxt.Prep_add_xwiki_to_wiki("wikt", "en.wiktionary.org"); + fxt.Exec__parse_as_url("/site/en.wikipedia.org/wiki/wikt:") + .Test__tid(Xoa_url_.Tid_page) + .Test__page("Main_Page") + .Test__to_str("en.wiktionary.org/wiki/Main_Page") + ; + } +// @Test public void Vnt() { +// Xowe_wiki wiki = fxt.Wiki(); +// fxt.Prep_add_xwiki_to_user("zh.wikipedia.org"); +// wiki.Lang().Vnt_mgr().Enabled_(true); +// wiki.Lang().Vnt_mgr().Vnt_grp().Add(new gplx.xowa.langs.vnts.Vnt_mnu_itm(Bry_.new_a7("zh-hans"), Bry_.new_a7("zh-hant"))); +// fxt.Exec__parse_as_url("/site/zh.wikipedia.org/zh-hant/A").Test__page("A").Chk_vnt("zh-hant"); +// } + @Test public void Http__basic() { + fxt.Exec__parse_as_url("http://a.org/b").Test__tid(Xoa_url_.Tid_inet); + } + @Test public void Prot__ftp() { // PURPOSE: check that urls with form of "ftp://" return back Tid_ftp; DATE:2014-04-25 + fxt.Exec__parse_as_url("ftp://a.org").Test__tid(Xoa_url_.Tid_inet); + } + @Test public void File__basic() { + fxt.Exec__parse_as_url("file:///C/xowa/file/a.png").Test__tid(Xoa_url_.Tid_file); + } + @Test public void Anchor__basic() { + fxt.Exec__parse_as_url("#a").Test__tid(Xoa_url_.Tid_anch).Test__to_str("en.wikipedia.org/wiki/Page 1#a").Test__anch("a"); + } + @Test public void Xcmd__basic() { + fxt.Exec__parse_as_url("/xcmd/page_edit").Test__tid(Xoa_url_.Tid_xcmd).Test__page("page_edit"); + } + @Test public void Xowa__basic() { + fxt.Exec__parse_as_url("xowa-cmd:a%22b*c").Test__tid(Xoa_url_.Tid_xcmd).Test__page("a\"b*c"); + } + // COMMENTED: this seems wrong; [//wikisource.org] should go to https://wikisource.org not https://en.wikisource.org; both sites are different; DATE:2015-08-02 +// @Test public void Site__user_wiki() {// PURPOSE: outlier for wikisource.org which is alias to en.wikisource.org; alias added in user_wiki; EX: [//wikisource.org a]; in browser, automatically goes to http://wikisource.org; in xowa, should go to /site/en.wikisource.org +// fxt.Prep_xwiki(fxt.App().User().Wikii(), "en_wiki_alias", "en.wikipedia.org", null); +// fxt.Exec__parse_as_url("/site/en_wiki_alias/wiki/") +// .Test__tid(Xoa_url_.Tid_page) +// .Test__page("Main_Page") +// .Test__to_str("en.wikipedia.org/wiki/Main_Page") +// ; +// } +} +class Xoh_href_parser_fxt extends Xow_url_parser_fxt { private final Xoh_href_parser href_parser = new Xoh_href_parser(); + public Xoh_href_parser_fxt Exec__parse_as_url(String raw) { + href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), cur_wiki, Bry__page_1); + return this; + } + private static final byte[] Bry__page_1 = Bry_.new_a7("Page 1"); +} diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__qargs__tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__qargs__tst.java new file mode 100644 index 000000000..7ed471cfe --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__qargs__tst.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.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*; +public class Xoh_href_parser__qargs__tst { + private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt(); + @Test public void Basic() { + fxt.Exec__parse_as_url("/wiki/A?k1=v1&k2=v2"); + fxt.Test__page("A"); + fxt.Test__to_str("en.wikipedia.org/wiki/A?k1=v1&k2=v2"); + } + @Test public void Anch() { // PURPOSE.fix: anchor was being placed before qargs; DATE:2016-10-08 + fxt.Exec__parse_as_url("/wiki/Category:A?pagefrom=A#mw-pages"); + fxt.Test__page("Category:A"); + fxt.Test__to_str("en.wikipedia.org/wiki/Category:A?pagefrom=A#mw-pages"); // was Category:A#mw-page?pagefrom=A + } + // FUTURE: qargs should be unencoded by default; decoded on request + @Test public void Encoded() { // PURPOSE.fix: do not use decoded String; DATE:2016-10-08 + fxt.Exec__parse_as_url("/wiki/Category:A?pagefrom=A%26B#mw-pages"); + fxt.Test__page("Category:A"); + fxt.Test__qargs("?pagefrom=A&B"); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__wiki__tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__wiki__tst.java new file mode 100644 index 000000000..0aa25b416 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser__wiki__tst.java @@ -0,0 +1,50 @@ +/* +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.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; +import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*; +public class Xoh_href_parser__wiki__tst { + private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt(); + @Test public void Basic() { + fxt.Exec__parse_as_url("/wiki/A").Test__tid(Xoa_url_.Tid_page).Test__to_str("en.wikipedia.org/wiki/A").Test__wiki("en.wikipedia.org").Test__page("A"); + } + @Test public void Page__w_question() { + fxt.Exec__parse_as_url("/wiki/%3F").Test__page("?"); + } + @Test public void Qarg() { + fxt.Exec__parse_as_url("/wiki/A?action=edit").Test__page("A").Test__qargs("?action=edit").Test__to_str("en.wikipedia.org/wiki/A?action=edit"); + } + @Test public void Qarg__w_question() { + fxt.Exec__parse_as_url("/wiki/A%3F?action=edit").Test__page("A?").Test__qargs("?action=edit"); + } + @Test public void Anchor() { + fxt.Exec__parse_as_url("/wiki/A#b").Test__to_str("en.wikipedia.org/wiki/A#b").Test__anch("b"); + } + @Test public void Xwiki__only() { + fxt.Prep_add_xwiki_to_wiki("c", "commons.wikimedia.org"); + fxt.Exec__parse_as_url("/wiki/c:").Test__page_is_main_y().Test__page("Main_Page").Test__to_str("commons.wikimedia.org/wiki/Main_Page"); + } + @Test public void Encoded() { + fxt.Exec__parse_as_url("/wiki/A%22b%22c").Test__page("A\"b\"c"); + } + @Test public void Triple_slash() { // PURPOSE: handle triple slashes; PAGE:esolangs.org/wiki/Language_list; DATE:2015-11-14 + fxt.Exec__parse_as_url("/wiki////").Test__to_str("en.wikipedia.org/wiki////").Test__wiki("en.wikipedia.org").Test__page("///"); + } + @Test public void Http() { // PURPOSE: variant of triple slashes; DATE:2015-11-14 + fxt.Exec__parse_as_url("/wiki/http://a").Test__to_str("en.wikipedia.org/wiki/Http://a").Test__wiki("en.wikipedia.org").Test__page("Http://a"); + } +} diff --git a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java b/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java deleted file mode 100644 index 163944cee..000000000 --- a/400_xowa/src/gplx/xowa/htmls/hrefs/Xoh_href_parser_tst.java +++ /dev/null @@ -1,124 +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.hrefs; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; -import org.junit.*; import gplx.xowa.apps.urls.*; import gplx.xowa.wikis.nss.*; -public class Xoh_href_parser_tst { - private final Xoh_href_parser_fxt fxt = new Xoh_href_parser_fxt(); - @Test public void Wiki__basic() { - fxt.Run_parse_by_href("/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_to_str("en.wikipedia.org/wiki/A").Chk_wiki("en.wikipedia.org").Chk_page("A"); - } - @Test public void Wiki__page__w_question() { - fxt.Run_parse_by_href("/wiki/%3F").Chk_page("?"); - } - @Test public void Wiki__qarg() { - fxt.Run_parse_by_href("/wiki/A?action=edit").Chk_page("A").Chk_qargs("?action=edit").Chk_to_str("en.wikipedia.org/wiki/A?action=edit"); - } - @Test public void Wiki__qarg__w_question() { - fxt.Run_parse_by_href("/wiki/A%3F?action=edit").Chk_page("A?").Chk_qargs("?action=edit"); - } - @Test public void Wiki__anchor() { - fxt.Run_parse_by_href("/wiki/A#b").Chk_to_str("en.wikipedia.org/wiki/A#b").Chk_anch("b"); - } - @Test public void Wiki__xwiki__only() { - fxt.Prep_add_xwiki_to_wiki("c", "commons.wikimedia.org"); - fxt.Run_parse_by_href("/wiki/c:").Chk_page_is_main_y().Chk_page("Main_Page").Chk_to_str("commons.wikimedia.org/wiki/Main_Page"); - } - @Test public void Wiki__encoded() { - fxt.Run_parse_by_href("/wiki/A%22b%22c").Chk_page("A\"b\"c"); - } - @Test public void Wiki__triple_slash() { // PURPOSE: handle triple slashes; PAGE:esolangs.org/wiki/Language_list; DATE:2015-11-14 - fxt.Run_parse_by_href("/wiki////").Chk_to_str("en.wikipedia.org/wiki////").Chk_wiki("en.wikipedia.org").Chk_page("///"); - } - @Test public void Wiki__http() { // PURPOSE: variant of triple slashes; DATE:2015-11-14 - fxt.Run_parse_by_href("/wiki/http://a").Chk_to_str("en.wikipedia.org/wiki/Http://a").Chk_wiki("en.wikipedia.org").Chk_page("Http://a"); - } - @Test public void Site__basic() { - fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A").Chk_tid(Xoa_url_.Tid_page).Chk_to_str("en.wikipedia.org/wiki/A").Chk_page("A"); - } - @Test public void Site__ns_case() { - fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/file:A").Chk_page("File:A"); - } - @Test public void Site__main_page() { - fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/").Chk_page("Main_Page").Chk_page_is_main_y(); - } - @Test public void Site__anch() { - fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A#b_c").Chk_page("A").Chk_anch("b_c"); - } - @Test public void Site__qarg() { - fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A?action=edit").Chk_page("A").Chk_qargs("?action=edit"); - } - @Test public void Site__invalid_ttl_shouldnt_fail() { // PURPOSE: invalid title shouldn't fail; EX: A{{B}} is invalid (b/c of braces); - fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/A{{B}}").Chk_page(""); - } - @Test public void Site__xwiki_cases_correctly() { // PURPOSE: xwiki links should use case_match of xwiki (en.wiktionary.org) not cur_wiki (en.wikipedia.org); EX:w:Alphabet - Xowe_wiki en_wiktionary_org = fxt.Prep_create_wiki("en.wiktionary.org"); - en_wiktionary_org.Ns_mgr().Ns_main().Case_match_(Xow_ns_case_.Tid__all); - fxt.Prep_add_xwiki_to_user("en.wiktionary.org", "en.wiktionary.org"); - fxt.Run_parse_by_href("/site/en.wiktionary.org/wiki/alphabet"); - fxt.Chk_to_str("en.wiktionary.org/wiki/alphabet").Chk_page("alphabet"); - } - @Test public void Site__xwiki_compound() { // PURPOSE: [[[w:wikt:]] not handled; DATE:2013-07-25 - fxt.Prep_add_xwiki_to_wiki("wikt", "en.wiktionary.org"); - fxt.Run_parse_by_href("/site/en.wikipedia.org/wiki/wikt:") - .Chk_tid(Xoa_url_.Tid_page) - .Chk_page("Main_Page") - .Chk_to_str("en.wiktionary.org/wiki/Main_Page") - ; - } -// @Test public void Vnt() { -// Xowe_wiki wiki = fxt.Wiki(); -// fxt.Prep_add_xwiki_to_user("zh.wikipedia.org"); -// wiki.Lang().Vnt_mgr().Enabled_(true); -// wiki.Lang().Vnt_mgr().Vnt_grp().Add(new gplx.xowa.langs.vnts.Vnt_mnu_itm(Bry_.new_a7("zh-hans"), Bry_.new_a7("zh-hant"))); -// fxt.Run_parse_by_href("/site/zh.wikipedia.org/zh-hant/A").Chk_page("A").Chk_vnt("zh-hant"); -// } - @Test public void Http__basic() { - fxt.Run_parse_by_href("http://a.org/b").Chk_tid(Xoa_url_.Tid_inet); - } - @Test public void Prot__ftp() { // PURPOSE: check that urls with form of "ftp://" return back Tid_ftp; DATE:2014-04-25 - fxt.Run_parse_by_href("ftp://a.org").Chk_tid(Xoa_url_.Tid_inet); - } - @Test public void File__basic() { - fxt.Run_parse_by_href("file:///C/xowa/file/a.png").Chk_tid(Xoa_url_.Tid_file); - } - @Test public void Anchor__basic() { - fxt.Run_parse_by_href("#a").Chk_tid(Xoa_url_.Tid_anch).Chk_to_str("en.wikipedia.org/wiki/Page 1#a").Chk_anch("a"); - } - @Test public void Xcmd__basic() { - fxt.Run_parse_by_href("/xcmd/page_edit").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("page_edit"); - } - @Test public void Xowa__basic() { - fxt.Run_parse_by_href("xowa-cmd:a%22b*c").Chk_tid(Xoa_url_.Tid_xcmd).Chk_page("a\"b*c"); - } - // COMMENTED: this seems wrong; [//wikisource.org] should go to https://wikisource.org not https://en.wikisource.org; both sites are different; DATE:2015-08-02 -// @Test public void Site__user_wiki() {// PURPOSE: outlier for wikisource.org which is alias to en.wikisource.org; alias added in user_wiki; EX: [//wikisource.org a]; in browser, automatically goes to http://wikisource.org; in xowa, should go to /site/en.wikisource.org -// fxt.Prep_xwiki(fxt.App().User().Wikii(), "en_wiki_alias", "en.wikipedia.org", null); -// fxt.Run_parse_by_href("/site/en_wiki_alias/wiki/") -// .Chk_tid(Xoa_url_.Tid_page) -// .Chk_page("Main_Page") -// .Chk_to_str("en.wikipedia.org/wiki/Main_Page") -// ; -// } -} -class Xoh_href_parser_fxt extends Xow_url_parser_fxt { private final Xoh_href_parser href_parser = new Xoh_href_parser(); - public Xoh_href_parser_fxt Run_parse_by_href(String raw) { - href_parser.Parse_as_url(actl_url, Bry_.new_u8(raw), cur_wiki, Bry__page_1); - return this; - } - private static final byte[] Bry__page_1 = Bry_.new_a7("Page 1"); -} diff --git a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java index 590bd67a1..65acdd743 100644 --- a/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java +++ b/400_xowa/src/gplx/xowa/htmls/modules/popups/Xow_popup_wrdx_mkr.java @@ -57,6 +57,7 @@ public class Xow_popup_wrdx_mkr { case Xop_xnde_tag_.Tid__table: case Xop_xnde_tag_.Tid__tr: case Xop_xnde_tag_.Tid__td: case Xop_xnde_tag_.Tid__th: case Xop_xnde_tag_.Tid__caption: case Xop_xnde_tag_.Tid__thead: case Xop_xnde_tag_.Tid__tfoot: case Xop_xnde_tag_.Tid__tbody: case Xop_xnde_tag_.Tid__ref: case Xop_xnde_tag_.Tid__gallery: case Xop_xnde_tag_.Tid__imageMap: case Xop_xnde_tag_.Tid__timeline: + case Xop_xnde_tag_.Tid__xowa_wiki_setup: case Xop_xnde_tag_.Tid__xowa_html: // needed for Help:Options, else \n at top of doc; DATE:2014-06-22 add_tkn = add_subs = false; // skip tblxs xnde = null; diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java b/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java index 2a095f3a3..524674378 100644 --- a/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java +++ b/400_xowa/src/gplx/xowa/parsers/Xop_tkn_mkr.java @@ -84,6 +84,7 @@ public class Xop_tkn_mkr { public gplx.xowa.xtns.quiz.Quiz_xnde Xnde__quiz() {return new gplx.xowa.xtns.quiz.Quiz_xnde();} public gplx.xowa.xtns.indicators.Indicator_xnde Xnde__indicator() {return new gplx.xowa.xtns.indicators.Indicator_xnde();} public gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd Xnde__xowa_html() {return new gplx.xowa.xtns.xowa_cmds.Xox_xowa_html_cmd();} + public gplx.xowa.xtns.xowa_cmds.wiki_setups.Xop_wiki_setup_xnde Xnde__xowa_wiki_setup() {return new gplx.xowa.xtns.xowa_cmds.wiki_setups.Xop_wiki_setup_xnde();} public gplx.xowa.xtns.listings.Listing_xnde Xnde__listing(int tag_id) {return new gplx.xowa.xtns.listings.Listing_xnde(tag_id);} public gplx.xowa.xtns.scores.Score_xnde Xnde__score() {return new gplx.xowa.xtns.scores.Score_xnde();} public gplx.xowa.xtns.inputBox.Xtn_inputbox_nde Xnde__inputbox() {return new gplx.xowa.xtns.inputBox.Xtn_inputbox_nde();} diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java index c8fbad6f2..5c5d60890 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr.java @@ -169,11 +169,14 @@ public class Xop_lnke_wkr implements Xop_ctx_wkr { && Bry_.Match(src, site_bgn, site_end, xwiki.Domain_bry()) // only consider full domains, not alliases; EX: [http://w/b] should not match alias of w for en.wikipedia.org ) { Xowe_wiki wiki = ctx.Wiki(); - xo_url_parser_url = wiki.Utl__url_parser().Parse(src, lnke_bgn, lnke_end); + + // HACK: this is not correct; "=" or "&" is not handled by Gfo_url_parser which assumes that all "&" separates qargs; DATE:2016-10-10 + byte[] decoded_src = gplx.xowa.parsers.amps.Xop_amp_mgr.Instance.Decode_as_bry(Bry_.Mid(src, lnke_bgn, lnke_end)); + xo_url_parser_url = wiki.Utl__url_parser().Parse(decoded_src, 0, decoded_src.length); + byte[] xwiki_wiki = xo_url_parser_url.Wiki_bry(); byte[] xwiki_page = xo_url_parser_url.Page_bry(); - byte[] ttl_bry = xo_url_parser_url.Page_bry(); - Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry); + Xoa_ttl ttl = Xoa_ttl.Parse(wiki, xwiki_page); if (ttl != null && ttl.Wik_itm() != null) { xwiki_wiki = ttl.Wik_itm().Domain_bry(); xwiki_page = ttl.Page_url(); diff --git a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java index 879b5c2bc..b87a64ed1 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkes/Xop_lnke_wkr_xwiki_tst.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.parsers.lnkes; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import org.junit.*; public class Xop_lnke_wkr_xwiki_tst { - @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt(); + @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt(); @Test public void Xwiki() { fxt.App().Usere().Wiki().Xwiki_mgr().Add_by_atrs(Bry_.new_a7("en.wikipedia.org"), Bry_.new_a7("en.wikipedia.org")); fxt.Test__parse__wtxt_to_html("[http://en.wikipedia.org/wiki/A a]", "a"); @@ -49,7 +49,11 @@ public class Xop_lnke_wkr_xwiki_tst { } @Test public void Xwiki__qargs() { // PURPOSE: fix null ref error; PAGE:en.w:Wikipedia:Template_standardisation/demometa DATE:2015-08-02 fxt.Init_xwiki_add_user_("en.wikipedia.org"); - fxt.Test__parse__wtxt_to_html("[http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template_standardisation/demometa]" - , "[1]"); + fxt.Test__parse__wtxt_to_html + ( "[http://en.wikipedia.org/w/index.php?action=edit&preload=Template:Afd2+starter&editintro=Template:Afd3+starter&title=Wikipedia:Articles+for+deletion/Template_standardisation/demometa]" + // CHANGED: lnke_now decodes html_entities; DATE:2016-10-10 + //, "[1]" + , "[1]" + ); } } 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 8c224eac2..6d564b327 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 @@ -142,8 +142,9 @@ public class Xop_xnde_tag_ { , Tid__random_selection = 115 , Tid__tabber = 116 , Tid__tabview = 117 +, Tid__xowa_wiki_setup = 118 ; - public static final int Tid__len = 118; + public static final int Tid__len = 119; public static final Xop_xnde_tag[] Ary = new Xop_xnde_tag[Tid__len]; private static Xop_xnde_tag New(int id, String name) { Xop_xnde_tag rv = new Xop_xnde_tag(id, name); @@ -269,5 +270,6 @@ public class Xop_xnde_tag_ { , Tag__random_selection = New(Tid__random_selection, "choose").Xtn_mw_() , Tag__tabber = New(Tid__tabber, "tabber").Xtn_mw_() , Tag__tabview = New(Tid__tabview, "tabview").Xtn_mw_() +, Tag__xowa_wiki_setup = New(Tid__xowa_wiki_setup, "xowa_Wiki_setup").Xtn_() ; } 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 index 7c0e7761b..0174c774a 100644 --- a/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/xndes/Xop_xnde_wkr.java @@ -646,6 +646,7 @@ public class Xop_xnde_wkr implements Xop_ctx_wkr { case Xop_xnde_tag_.Tid__quiz: xnde_xtn = tkn_mkr.Xnde__quiz(); break; case Xop_xnde_tag_.Tid__indicator: xnde_xtn = tkn_mkr.Xnde__indicator(); break; case Xop_xnde_tag_.Tid__xowa_html: xnde_xtn = tkn_mkr.Xnde__xowa_html(); break; + case Xop_xnde_tag_.Tid__xowa_wiki_setup: xnde_xtn = tkn_mkr.Xnde__xowa_wiki_setup(); break; case Xop_xnde_tag_.Tid__graph: xnde_xtn = tkn_mkr.Xnde__graph(); break; case Xop_xnde_tag_.Tid__random_selection: xnde_xtn = tkn_mkr.Xnde__random_selection(); break; case Xop_xnde_tag_.Tid__tabber: xnde_xtn = tkn_mkr.Xnde__tabber(); break; diff --git a/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java b/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java index 1c88561ed..947250bfb 100644 --- a/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java +++ b/400_xowa/src/gplx/xowa/wikis/Xowv_wiki.java @@ -29,7 +29,7 @@ import gplx.xowa.parsers.*; import gplx.xowa.apps.urls.*; import gplx.fsdb.*; import gplx.fsdb.meta.*; import gplx.xowa.specials.mgrs.*; -import gplx.xowa.addons.wikis.htmls.css.bldrs.*; import gplx.xowa.addons.wikis.htmls.css.mgrs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; +import gplx.xowa.addons.wikis.htmls.css.bldrs.*; import gplx.xowa.addons.wikis.htmls.css.mgrs.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*; public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser, Gfo_invk { private final Xof_fsdb_mgr__sql fsdb_mgr; private Fsdb_db_mgr db_core_mgr; private boolean init_needed = true; @@ -50,6 +50,7 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser, Gfo_invk { this.xwiki_mgr = new Xow_xwiki_mgr(this); this.stats = new Xow_site_stats_mgr(this); this.lnki_bldr = new Xoh_lnki_bldr(app, href_wtr); + this.ctg_catpage_mgr = new Xoctg_catpage_mgr(this); } public Xoa_app App() {return app;} public boolean Type_is_edit() {return Bool_.N;} @@ -73,7 +74,8 @@ public class Xowv_wiki implements Xow_wiki, Xow_ttl_parser, Gfo_invk { public Xow_hdump_mgr Html__hdump_mgr() {return html__hdump_mgr;} private final Xow_hdump_mgr html__hdump_mgr; public boolean Html__css_installing() {return html__css_installing;} public void Html__css_installing_(boolean v) {html__css_installing = v;} private boolean html__css_installing; public Xoh_page_wtr_mgr Html__wtr_mgr() {return html__wtr_mgr;} private final Xoh_page_wtr_mgr html__wtr_mgr = new Xoh_page_wtr_mgr(Bool_.Y); - public Xoctg_pagebox_wtr Html__ctg_pagebox_wtr() {return ctg_pagebox_wtr;} private final Xoctg_pagebox_wtr ctg_pagebox_wtr = new Xoctg_pagebox_wtr(); + public Xoctg_pagebox_wtr Ctg__pagebox_wtr() {return ctg_pagebox_wtr;} private final Xoctg_pagebox_wtr ctg_pagebox_wtr = new Xoctg_pagebox_wtr(); + public Xoctg_catpage_mgr Ctg__catpage_mgr() {return ctg_catpage_mgr;} private final Xoctg_catpage_mgr ctg_catpage_mgr; public Xow_msg_mgr Msg_mgr() {return msg_mgr;} private final Xow_msg_mgr msg_mgr; public byte[] Wtxt__expand_tmpl(byte[] src) {return src;} public Xow_mw_parser_mgr Mw_parser_mgr() {return mw_parser_mgr;} private final Xow_mw_parser_mgr mw_parser_mgr = new Xow_mw_parser_mgr(); diff --git a/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java b/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java index 033d9c3ee..c085aad9a 100644 --- a/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/caches/Xow_cache_mgr.java @@ -58,7 +58,7 @@ public class Xow_cache_mgr { ifexist_cache.Clear(); wiki.Appe().Wiki_mgr().Wdata_mgr().Clear(); // moved from ctx.Clear(); DATE:2016-07-21 } - wiki.Html_mgr().Catpage_mgr().Free_mem_all(); + wiki.Ctg__catpage_mgr().Free_mem_all(); tmpl_result_cache.Clear(); defn_cache.Free_mem_all(); misc_cache.Clear(); 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 0cc585b04..4dd290c63 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 @@ -62,7 +62,7 @@ public class Xow_data_mgr_tst { ; } @Test public void Update_zip() { -// fxt.Wiki().Fsys_mgr().Dir_regy()[Xow_ns_.Tid__main].Ext_tid_(gplx.core.ios.streams.Io_stream_.Tid_zip); +// fxt.Wiki().Fsys_mgr().Dir_regy()[Xow_ns_.Tid__main].Ext_tid_(gplx.core.ios.streams.Io_stream_tid_.Tid__zip); // fxt.Wiki().Data_mgr().Zip_mgr_(new Io_zip_mgr_mok()); // fxt .Create("A1", "A1 data") // .Create("B12", "B12 data") 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 b624795c1..0ec36f816 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 @@ -52,7 +52,7 @@ public class Xowd_core_db_props { return cfg_tbl.Select_int_or(Cfg_grp, Cfg_key__schema_version, 1) == 1 ? new Xowd_core_db_props ( 1, Xow_db_layout.Itm_lot, Xow_db_layout.Itm_lot, Xow_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) + , Io_stream_tid_.Tid__gzip), Io_stream_tid_.Tid__gzip, Bool_.Y, Bool_.N) : Cfg_load(cfg_tbl); } private static Xowd_core_db_props Cfg_load(Db_cfg_tbl tbl) { @@ -78,5 +78,5 @@ public class Xowd_core_db_props { , 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, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Io_stream_.Tid_raw, Io_stream_.Tid_raw, Bool_.Y, Bool_.Y); + public static final Xowd_core_db_props Test = new Xowd_core_db_props(2, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Xow_db_layout.Itm_few, Io_stream_tid_.Tid__raw, Io_stream_tid_.Tid__raw, Bool_.Y, Bool_.Y); } diff --git a/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java b/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java index 7b02a03db..803212088 100644 --- a/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java +++ b/400_xowa/src/gplx/xowa/wikis/data/tbls/Select_in_cbk.java @@ -18,9 +18,9 @@ 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 interface Select_in_cbk { + int Hash_max(); void Write_sql(Bry_bfr bfr, int idx); void Read_data(Db_rdr rdr); - int Hash_max(); } class Select_in_wkr { private final byte[] sql_bgn; 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 970977908..f440aa1d1 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 @@ -157,6 +157,20 @@ public class Xowd_page_tbl implements Rls_able { return rdr.Move_next() ? rdr.Read_int(fld_id) : Xowd_page_itm.Id_null; } finally {rdr.Rls();} } + public void Select_in__id(Select_in_cbk cbk) { + int pos = 0; + Bry_bfr bfr = Bry_bfr_.New(); + Select_in_wkr wkr = Select_in_wkr.New(bfr, tbl_name, Flds_select_all(), fld_id); + while (true) { + pos = wkr.Make_sql_or_null(bfr, cbk, pos); + if (pos == -1) break; + Db_rdr rdr = conn.Stmt_sql(bfr.To_str_and_clear()).Exec_select__rls_auto(); + try { + while (rdr.Move_next()) + cbk.Read_data(rdr); + } finally {rdr.Rls();} + } + } public void Select_in__ttl(Cancelable cancelable, Ordered_hash rv, int ns_id, int bgn, int end) { Xowd_page_tbl__ttl wkr = new Xowd_page_tbl__ttl(); wkr.Ctor(this, tbl_name, fld_title); diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java index 10796e196..0125dbd64 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr.java @@ -27,7 +27,6 @@ public interface Xodb_load_mgr { void Load_by_ids (Cancelable cancelable, List_adp rv, int bgn, int end); boolean Load_by_ttl (Xowd_page_itm rv, Xow_ns ns, byte[] ttl); void Load_by_ttls (Cancelable cancelable, Ordered_hash rv, boolean fill_idx_fields_only, int bgn, int end); - boolean Load_ctg_v1 (Xoctg_catpage_ctg rv, byte[] ttl); void Load_ttls_for_all_pages (Cancelable cancelable, List_adp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item); void Load_ttls_for_search_suggest(Cancelable cancelable, List_adp rslt_list, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item); byte[] Find_random_ttl (Xow_ns ns); diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java index 793c081f4..6cecc0e3f 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_sql.java @@ -58,11 +58,6 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { } public boolean Load_by_id (Xowd_page_itm rv, int id) {return db_mgr.Core_data_mgr().Tbl__page().Select_by_id(rv, id);} public void Load_by_ids(Cancelable cancelable, List_adp rv, int bgn, int end) {db_mgr.Core_data_mgr().Tbl__page().Select_in__id(cancelable, false, true, rv, bgn, end);} - public boolean Load_ctg_v1(Xoctg_catpage_ctg rv, byte[] ctg_bry) { - int cat_page_id = db_mgr.Core_data_mgr().Tbl__page().Select_id(Xow_ns_.Tid__category, ctg_bry); if (cat_page_id == Xowd_page_itm.Id_null) return false; - Xowd_category_itm ctg = fsys_mgr.Db__cat_core().Tbl__cat_core().Select(cat_page_id); if (ctg == Xowd_category_itm.Null) return false; - return Ctg_select_v1(db_mgr.Wiki(), db_mgr.Core_data_mgr(), rv, ctg.File_idx(), ctg); - } public void Load_ttls_for_all_pages(Cancelable cancelable, List_adp rslt_list, Xowd_page_itm rslt_nxt, Xowd_page_itm rslt_prv, Int_obj_ref rslt_count, Xow_ns ns, byte[] key, int max_results, int min_page_len, int browse_len, boolean include_redirects, boolean fetch_prv_item) { db_mgr.Core_data_mgr().Tbl__page().Select_for_special_all_pages(cancelable, rslt_list, rslt_nxt, rslt_prv, rslt_count, ns, key, max_results, min_page_len, browse_len, include_redirects, fetch_prv_item); } @@ -74,31 +69,4 @@ public class Xodb_load_mgr_sql implements Xodb_load_mgr { public byte[] Find_random_ttl(Xow_ns ns) {return db_mgr.Core_data_mgr().Tbl__page().Select_random(ns);} public Xodb_page_rdr Get_page_rdr(Xowe_wiki wiki) {return new Xodb_page_rdr__sql(wiki);} public void Clear() {} - private static boolean Ctg_select_v1(Xowe_wiki wiki, Xow_db_mgr core_data_mgr, Xoctg_catpage_ctg view_ctg, int link_db_id, Xowd_category_itm ctg) { - List_adp link_list = List_adp_.New(); - core_data_mgr.Dbs__get_by_id_or_fail(link_db_id).Tbl__cat_link().Select_in(link_list, ctg.Id()); - int link_list_len = link_list.Count(); - link_list.Sort_by(Xowd_page_itm_sorter.IdAsc); - core_data_mgr.Tbl__page().Select_in__id(Cancelable_.Never, false, true, link_list, 0, link_list_len); - link_list.Sort_by(Xowd_page_itm_sorter.Ns_id_TtlAsc); - boolean rv = false; - for (int i = 0; i < link_list.Count(); i++) { - Xowd_page_itm page = (Xowd_page_itm)link_list.Get_at(i); - if (page.Ns_id() == Int_.Min_value) continue; // HACK: page not found; ignore - byte ctg_tid = Load_ctg_v1_tid(page.Ns_id()); - Xoctg_catpage_grp ctg_grp = view_ctg.Grp_by_tid(ctg_tid); - Xoctg_catpage_itm ctg_itm = new Xoctg_catpage_itm(page.Id(), Xoa_ttl.Parse(wiki, page.Ns_id(), page.Ttl_page_db()), page.Ttl_page_db()); - ctg_grp.Itms__add(ctg_itm); - rv = true; - } - view_ctg.Make_itms(); - return rv; - } - public static byte Load_ctg_v1_tid(int ns_id) { - switch (ns_id) { - case Xow_ns_.Tid__category: return Xoa_ctg_mgr.Tid__subc; - case Xow_ns_.Tid__file: return Xoa_ctg_mgr.Tid__file; - default: return Xoa_ctg_mgr.Tid__page; - } - } } diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java index 0d831f59c..5ad1e1394 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_load_mgr_txt.java @@ -38,7 +38,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { public void Load_page(Xowd_page_itm rv, Xow_ns ns) {Load_page(rv, rv.Text_db_id(), rv.Tdb_row_idx(), ns, false, tmp_xdat_file, tmp_xdat_itm);} public void Load_page(Xowd_page_itm rv, int txt_fil_idx, int txt_row_idx, Xow_ns ns, boolean timestamp_enabled, Xob_xdat_file xdat_file, Xob_xdat_itm xdat_itm) { Io_url file = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ns.Id(), txt_fil_idx); - byte[] bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(file); int bry_len = bry.length; + byte[] bry = Io_mgr.Instance.LoadFilBry(file); int bry_len = bry.length; xdat_file.Clear().Parse(bry, bry_len, file).GetAt(xdat_itm, txt_row_idx); Load_page_parse(rv, bry, bry_len, xdat_itm.Itm_bgn(), xdat_itm.Itm_end(), timestamp_enabled); } @@ -236,59 +236,6 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr { count.Val_(tmp_count); return rv; } - public boolean Load_ctg_v1(Xoctg_catpage_ctg view_ctg, byte[] ctg_ttl) {return Load_ctg_v1_wkr(view_ctg, ctg_ttl, null);} - private boolean Load_ctg_v1_wkr(Xoctg_catpage_ctg view_ctg, byte[] ctg_ttl, Int_obj_ref count_only) { - Xowd_regy_mgr ctg_regy = Get_regy_by_site(Xotdb_dir_info_.Tid_category); - int fil_idx = ctg_regy.Files_find(ctg_ttl); - if (fil_idx == Xowd_regy_mgr.Regy_null) return false; // NOTE: must check for -1, not 0; else defect in which entries in file 0 are ignored; DATE:2013-04-11 - Io_url fil = fsys_mgr.Url_site_fil(Xotdb_dir_info_.Tid_category, fil_idx); - Load_xdat_file(Cancelable_.Never, tmp_xdat_file, fil); - tmp_xdat_file.Find(tmp_xdat_itm, ctg_ttl, 0, Byte_ascii.Pipe, true); - if (tmp_xdat_itm.Missing()) return false; - List_adp ctgs = List_adp_.New(); - Load_ctg_v1_parse(ctgs, wiki.Appe().Usr_dlg(), tmp_xdat_itm.Itm_bry()); - ctgs.Sort_by(Xowd_page_itm_sorter.IdAsc); - this.Load_by_ids(Cancelable_.Never, ctgs, 0, ctgs.Count()); - ctgs.Sort_by(Xowd_page_itm_sorter.Ns_id_TtlAsc); - - int ctgs_len = ctgs.Count(); if (ctgs_len == 0) return false; - if (count_only != null) { // Ctg_count specificed - count_only.Val_(ctgs_len); - return true; - } - for (int i = 0; i < ctgs_len; i++) { - Xowd_page_itm itm = (Xowd_page_itm)ctgs.Get_at(i); - byte itm_tid = Xodb_load_mgr_sql.Load_ctg_v1_tid(itm.Ns_id()); - Xoctg_catpage_itm sub = new Xoctg_catpage_itm(itm.Id(), Xoa_ttl.Parse(wiki, itm.Ns_id(), itm.Ttl_page_db()), itm.Ttl_page_db()); - view_ctg.Grp_by_tid(itm_tid).Itms__add(sub); - } - view_ctg.Make_itms(); - return true; - } - private static void Load_ctg_v1_parse(List_adp rv, Gfo_usr_dlg usr_dlg, byte[] ary) { - int aryLen = ary.length; - int pos = Bry_find_.Find_fwd(ary, Byte_ascii.Pipe, 0, aryLen); - int rowCount = (aryLen - pos + 1) / (Base85_.Len_int + gplx.xowa.apps.progs.Xoa_prog_mgr.Len_dlm_fld); - rv.Clear(); - boolean garbage = false; - for (int i = 0; i < rowCount; i++) { - Xowd_page_itm row = new Xowd_page_itm(); - rv.Add(row); - if (garbage) continue; - int bgn = pos + 1 + (i * (Base85_.Len_int + gplx.xowa.apps.progs.Xoa_prog_mgr.Len_dlm_fld)); - try { - int id = Base85_.To_int_by_bry(ary, bgn, bgn + Base85_.Len_int - 1); - if (id < 0) throw Err_.new_wo_type("invalid id", "id", id); - row.Id_(id); - } - catch (Exception e) { - row.Id_(0); - usr_dlg.Warn_many("xowa.ttl_request", "parse", "failed to parse row: row=~{0} err=~{1}", String_.new_u8(ary), Err_.Message_lang(e)); - garbage = true; - continue; // NOTE: must break b/c rest of ids are garbage - } - } - } public static boolean Load_page_or_false(Xowd_page_itm page, Xob_xdat_itm xdat, int ns_id) { byte[] src = xdat.Src(); int itm_end = xdat.Itm_end(); int bgn = xdat.Itm_bgn(); diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java index a6b054755..00db5fe77 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_sql.java @@ -45,7 +45,7 @@ public class Xodb_mgr_sql implements Xodb_mgr, Gfo_invk { core_data_mgr.Tbl__cfg().Insert_byte(grp, key, category_version); } public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(core_data_mgr.Props().Zip_tid_text()); + if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_tid_.Obsolete_to_str(core_data_mgr.Props().Zip_tid_text()); else if (ctx.Match(k, Invk_data_storage_format_)) {} // SERIALIZED:000.sqlite3|xowa_cfg; ignore; read from Xow_db_props else if (ctx.Match(k, Invk_category_version)) return category_version; else if (ctx.Match(k, Invk_category_version_)) category_version = m.ReadByte("v"); diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java index 9c5151107..7d932e635 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_mgr_txt.java @@ -27,7 +27,7 @@ public class Xodb_mgr_txt implements Xodb_mgr { } private Xowe_wiki wiki; public byte Tid() {return Tid_txt;} public static final byte Tid_txt = 0; public String Tid_name() {return "xdat";} - public byte Data_storage_format() {return data_storage_format;} public void Data_storage_format_(byte v) {data_storage_format = v;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_.Tid_raw; + public byte Data_storage_format() {return data_storage_format;} public void Data_storage_format_(byte v) {data_storage_format = v;} private byte data_storage_format = gplx.core.ios.streams.Io_stream_tid_.Tid__raw; public Xodb_load_mgr Load_mgr() {return load_mgr;} private Xodb_load_mgr_txt load_mgr; public Xodb_save_mgr Save_mgr() {return save_mgr;} private Xodb_save_mgr_txt save_mgr; public DateAdp Dump_date_query() { @@ -46,8 +46,8 @@ public class Xodb_mgr_txt implements Xodb_mgr { public byte Search_version() {return gplx.xowa.addons.wikis.searchs.specials.Srch_special_page.Version_2;} public void Search_version_refresh() {throw Err_.new_unimplemented();} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_.Obsolete_to_str(data_storage_format); - else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_.Obsolete_to_tid(m.ReadStr("v")); + if (ctx.Match(k, Invk_data_storage_format)) return Io_stream_tid_.Obsolete_to_str(data_storage_format); + else if (ctx.Match(k, Invk_data_storage_format_)) data_storage_format = Io_stream_tid_.Obsolete_to_tid(m.ReadStr("v")); else if (ctx.Match(k, Invk_category_version)) return this.Category_version(); else if (ctx.Match(k, Invk_category_version_)) category_version = m.ReadByte("v"); else if (ctx.Match(k, Invk_search_version)) return this.Search_version(); diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java index 111feff30..9c6239c1f 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_page_rdr__tdb.java @@ -49,7 +49,7 @@ public class Xodb_page_rdr__tdb implements Xodb_page_rdr { continue; } this.cur_file = cur_file_ary[cur_file_idx]; - byte[] bry = Io_stream_rdr_.Load_all(cur_file); + byte[] bry = Io_mgr.Instance.LoadFilBry(cur_file); cur_xdat_file.Clear().Parse(bry, bry.length, cur_file); this.cur_xdat_len = cur_xdat_file.Count(); this.cur_xdat_idx = -1; diff --git a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java index e5c9a7e0d..7218486bc 100644 --- a/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java +++ b/400_xowa/src/gplx/xowa/wikis/dbs/Xodb_save_mgr_txt.java @@ -43,7 +43,7 @@ public class Xodb_save_mgr_txt implements Xodb_save_mgr { int ns_id = ttl.Ns().Id(); Xotdb_page_itm_.Txt_page_save(tmp, page_id, Datetime_now.Get(), ttl_bry, text, true); Io_url page_rdr_url = fsys_mgr.Url_ns_fil(Xotdb_dir_info_.Tid_page, ns_id, fil_idx); - byte[] page_rdr_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(page_rdr_url); + byte[] page_rdr_bry = Io_mgr.Instance.LoadFilBry(page_rdr_url); Xob_xdat_file page_rdr = new Xob_xdat_file(); if (Bry_.Len_gt_0(page_rdr_bry)) page_rdr.Parse(page_rdr_bry, page_rdr_bry.length, page_rdr_url); int row_idx = page_rdr.Count(); diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java index 46fff6ace..1d1d7a555 100644 --- a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java +++ b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_dir_info.java @@ -30,24 +30,24 @@ public class Xotdb_dir_info { ext_bry = Wtr_ext(v); ext_str = String_.new_a7(ext_bry); return this; - } byte ext_tid = gplx.core.ios.streams.Io_stream_.Tid_raw; + } byte ext_tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw; public static final String Wtr_xdat_str = ".xdat", Wtr_zip_str = ".zip", Wtr_gz_str = ".gz", Wtr_bz2_str = ".bz2"; public static final byte[] Wtr_xdat_bry = Bry_.new_a7(Wtr_xdat_str), Wtr_zip_bry = Bry_.new_a7(Wtr_zip_str), Wtr_gz_bry = Bry_.new_a7(Wtr_gz_str), Wtr_bz2_bry = Bry_.new_a7(Wtr_bz2_str); public static String Wtr_dir(byte v) { switch (v) { - case gplx.core.ios.streams.Io_stream_.Tid_raw : return ""; - case gplx.core.ios.streams.Io_stream_.Tid_zip : return "_zip"; - case gplx.core.ios.streams.Io_stream_.Tid_gzip : return "_gz"; - case gplx.core.ios.streams.Io_stream_.Tid_bzip2 : return "_bz2"; + case gplx.core.ios.streams.Io_stream_tid_.Tid__raw : return ""; + case gplx.core.ios.streams.Io_stream_tid_.Tid__zip : return "_zip"; + case gplx.core.ios.streams.Io_stream_tid_.Tid__gzip : return "_gz"; + case gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2 : return "_bz2"; default : throw Err_.new_unhandled(v); } } public static byte[] Wtr_ext(byte v) { switch (v) { - case gplx.core.ios.streams.Io_stream_.Tid_raw : return Wtr_xdat_bry; - case gplx.core.ios.streams.Io_stream_.Tid_zip : return Wtr_zip_bry; - case gplx.core.ios.streams.Io_stream_.Tid_gzip : return Wtr_gz_bry; - case gplx.core.ios.streams.Io_stream_.Tid_bzip2 : return Wtr_bz2_bry; + case gplx.core.ios.streams.Io_stream_tid_.Tid__raw : return Wtr_xdat_bry; + case gplx.core.ios.streams.Io_stream_tid_.Tid__zip : return Wtr_zip_bry; + case gplx.core.ios.streams.Io_stream_tid_.Tid__gzip : return Wtr_gz_bry; + case gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2 : return Wtr_bz2_bry; default : throw Err_.new_unhandled(v); } } diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java index d16dddcf2..def9fb700 100644 --- a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr.java @@ -56,14 +56,14 @@ public class Xotdb_fsys_mgr { private static void Scan_dirs_zip(Xotdb_fsys_mgr fsys_mgr, byte id) { Io_url[] dirs = Io_mgr.Instance.QueryDir_args(fsys_mgr.Ns_dir().GenSubDir_nest("000")).FilPath_("*page*").DirOnly_().Recur_(false).ExecAsUrlAry(); int len = dirs.length; - byte tid = gplx.core.ios.streams.Io_stream_.Tid_raw; // needed for Xoa_xowa_exec_tst + byte tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw; // needed for Xoa_xowa_exec_tst for (int i = 0; i < len; i++) { Io_url dir = dirs[i]; String dir_name = dir.NameOnly(); - if (String_.Eq(dir_name, "page")) {tid = gplx.core.ios.streams.Io_stream_.Tid_raw; break;} - else if (String_.Eq(dir_name, "page_zip")) tid = gplx.core.ios.streams.Io_stream_.Tid_zip; - else if (String_.Eq(dir_name, "page_gz")) tid = gplx.core.ios.streams.Io_stream_.Tid_gzip; - else if (String_.Eq(dir_name, "page_bz2")) tid = gplx.core.ios.streams.Io_stream_.Tid_bzip2; + if (String_.Eq(dir_name, "page")) {tid = gplx.core.ios.streams.Io_stream_tid_.Tid__raw; break;} + else if (String_.Eq(dir_name, "page_zip")) tid = gplx.core.ios.streams.Io_stream_tid_.Tid__zip; + else if (String_.Eq(dir_name, "page_gz")) tid = gplx.core.ios.streams.Io_stream_tid_.Tid__gzip; + else if (String_.Eq(dir_name, "page_bz2")) tid = gplx.core.ios.streams.Io_stream_tid_.Tid__bzip2; } fsys_mgr.Tdb_dir_regy()[id].Ext_tid_(tid); } diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java index 91597409c..7bf1e9923 100644 --- a/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/wikis/tdbs/Xotdb_fsys_mgr_tst.java @@ -31,7 +31,7 @@ class Xow_fsys_mgr_fxt { wiki = Xoa_app_fxt.Make__wiki__edit(app); } Xoae_app app; Xowe_wiki wiki; - public Xow_fsys_mgr_fxt Zip_(byte tid, boolean v) {wiki.Tdb_fsys_mgr().Tdb_dir_regy()[tid].Ext_tid_(v ? gplx.core.ios.streams.Io_stream_.Tid_zip : gplx.core.ios.streams.Io_stream_.Tid_raw); return this;} + public Xow_fsys_mgr_fxt Zip_(byte tid, boolean v) {wiki.Tdb_fsys_mgr().Tdb_dir_regy()[tid].Ext_tid_(v ? gplx.core.ios.streams.Io_stream_tid_.Tid__zip : gplx.core.ios.streams.Io_stream_tid_.Tid__raw); return this;} public void Url_ns_fil(byte tid, int ns_id, int fil_idx, String expd) { Tfds.Eq(expd, wiki.Tdb_fsys_mgr().Url_ns_fil(tid, ns_id, fil_idx).Raw()); } diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java b/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java index 746cb2aa1..942f627b2 100644 --- a/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/tdbs/hives/Xob_hive_mgr.java @@ -37,7 +37,7 @@ public class Xob_hive_mgr { } Xob_xdat_file xdat_load_(Xob_xdat_file xdat, byte dir_tid, Xow_ns ns, int fil_idx) { Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), fil_idx); - byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url); + byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url); xdat.Parse(xdat_bry, xdat_bry.length, xdat_url); return xdat; } @@ -115,7 +115,7 @@ public class Xob_hive_mgr { byte dir_tid = Xotdb_dir_info_.Tid_ttl; int xdat_idx = Regy__find_file_ns(key, dir_tid, ns.Num_str()); Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), xdat_idx); - byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url); + byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url); xdat.Parse(xdat_bry, xdat_bry.length, xdat_url); xdat.Find(xdat_itm, key, Xotdb_page_itm_.Txt_ttl_pos, Byte_ascii.Tab, false); Find_nearby_add_fwd(list, dir_tid, ns, include_redirects, count, xdat_idx, xdat_itm.Itm_idx()); @@ -132,7 +132,7 @@ public class Xob_hive_mgr { // while (loop) { // if (fil_idx == -1) break; // Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), fil_idx); -// byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url); +// byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url); // xdat.Parse(xdat_bry, xdat_bry.length, xdat_url); // int row_idx = first && row_bgn != -1 ? row_bgn : xdat.Count() - 1; // first = false; @@ -155,7 +155,7 @@ public class Xob_hive_mgr { while (loop) { if (fil_idx == regy_len) break; Io_url xdat_url = fsys_mgr.Url_ns_fil(dir_tid, ns.Id(), fil_idx); - byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url); + byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url); xdat.Parse(xdat_bry, xdat_bry.length, xdat_url); int row_idx = first ? row_bgn : 0; int rows_len = xdat.Count(); @@ -186,7 +186,7 @@ public class Xob_hive_mgr { int Regy__find_file_by_url(byte[] key, Io_url regy_url) {regy.Init(regy_url); return regy.Files_find(key);} private Xowd_regy_mgr regy = new Xowd_regy_mgr(); private void Xdat__create_row(byte dir_tid, byte[] key, byte[] row, int xdat_idx) { Io_url xdat_url = fsys_mgr.Url_site_fil(dir_tid, xdat_idx); - byte[] xdat_bry = gplx.core.ios.streams.Io_stream_rdr_.Load_all(xdat_url); + byte[] xdat_bry = Io_mgr.Instance.LoadFilBry(xdat_url); Xob_xdat_file xdat_fil = new Xob_xdat_file(); if (xdat_bry.length > 0) // if file is not empty, load it and parse it xdat_fil.Parse(xdat_bry, xdat_bry.length, xdat_url); diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java index 6af0d00d4..3b1575d87 100644 --- a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java +++ b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file.java @@ -103,7 +103,7 @@ public class Xob_xdat_file { public void Save(Io_url url) { Bry_bfr bfr = Bry_bfr_.New(); Srl_save_bry(bfr); - Io_stream_wtr wtr = Io_stream_wtr_.new_by_url_(url); + Io_stream_wtr wtr = Io_stream_wtr_.New_by_url(url); try { wtr.Open(); wtr.Write(bfr.Bfr(), 0, bfr.Len()); diff --git a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java index c5d8b3358..024837c15 100644 --- a/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java +++ b/400_xowa/src/gplx/xowa/wikis/tdbs/xdats/Xob_xdat_file_wtr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.wikis.tdbs.xdats; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.tdbs.*; import gplx.core.ios.*; import gplx.core.ios.streams.*; import gplx.core.encoders.*; import gplx.xowa.wikis.tdbs.*; public class Xob_xdat_file_wtr { - public static Xob_xdat_file_wtr new_file_(int fil_max, Io_url root_dir) {return new Xob_xdat_file_wtr(fil_max, root_dir, Io_stream_.Tid_raw);} + public static Xob_xdat_file_wtr new_file_(int fil_max, Io_url root_dir) {return new Xob_xdat_file_wtr(fil_max, root_dir, Io_stream_tid_.Tid__raw);} public static Xob_xdat_file_wtr new_by_tid_(int fil_max, Io_url root_dir, byte dir_tid, byte tid) {return new Xob_xdat_file_wtr(fil_max, root_dir.GenSubDir(Xotdb_dir_info_.Tid_name(dir_tid) + Xotdb_dir_info.Wtr_dir(tid)), tid);} Xob_xdat_file_wtr(int fil_max, Io_url root_dir, byte wtr_tid) { this.fil_max = fil_max; @@ -27,7 +27,7 @@ public class Xob_xdat_file_wtr { bfr = Bry_bfr_.New_w_size(fil_max); idx = new int[fil_max / 8]; // ASSUME: any given row must at least be 8 bytes long Url_gen(fil_idx); // set 1st url - wtr = Io_stream_wtr_.new_by_tid_(wtr_tid); + wtr = Io_stream_wtr_.New_by_tid(wtr_tid); } int fil_max; Io_stream_wtr wtr; byte[] fil_ext; public int Fil_idx() {return fil_idx;} public Xob_xdat_file_wtr Fil_idx_(int v) {fil_idx = v; return this;} private int fil_idx; public int Ns_ord_idx() {return ns_ord_idx;} public Xob_xdat_file_wtr Ns_ord_idx_(int v) {ns_ord_idx = v; return this;} private int ns_ord_idx; // NOTE: optional; needed for page cmd which will flush all wtrs, but needs ns_idx for stats diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java index b93c39ddc..0d40be419 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/Xow_xwiki_mgr.java @@ -83,8 +83,8 @@ public class Xow_xwiki_mgr { default: return tid; } } - public static byte[] Get_domain_from_url(Gfo_url_parser url_parser, Gfo_url url, byte[] url_fmt) { // extract "commons.wikimedia.org" from "http://commons.wikimedia.org/wiki/Category:~{0}" - url_parser.Parse(url, url_fmt, 0, url_fmt.length); + public static byte[] Get_domain_from_url(Gfo_url_parser url_parser, byte[] url_fmt) { // extract "commons.wikimedia.org" from "http://commons.wikimedia.org/wiki/Category:~{0}" + Gfo_url url = url_parser.Parse(url_fmt, 0, url_fmt.length); return url.Segs__get_at_1st(); } public static byte[] Bld_url_fmt(byte[] domain_bry) {return Bry_.Add(gplx.core.net.Gfo_protocol_itm.Itm_https.Text_bry(), domain_bry, Bry__url_fmt_end);} diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java index 89227a931..c916678af 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/bldrs/Xow_xwiki_itm_bldr.java @@ -22,10 +22,10 @@ import gplx.xowa.langs.*; import gplx.xowa.wikis.domains.*; public class Xow_xwiki_itm_bldr { private final Bry_bfr tmp_bfr = Bry_bfr_.New(); - private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url(); + private final Gfo_url_parser url_parser = new Gfo_url_parser(); public Xow_xwiki_itm Bld_mw(Xow_domain_itm cur_domain, byte[] key, byte[] mw_url, byte[] domain_name) {return Bld_xo(cur_domain, key, Gfs_php_converter.To_gfs(tmp_bfr, mw_url), domain_name);} // EX: "//commons.wikimedia.org/wiki/Category:$1" -> "//commons.wikimedia.org/wiki/Category:~{0}" public Xow_xwiki_itm Bld_xo(Xow_domain_itm cur_domain, byte[] key, byte[] xo_url, byte[] domain_name) { - byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, xo_url); + byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, xo_url); Xow_domain_itm domain_itm = Xow_domain_itm_.parse(domain_bry); Xol_lang_stub lang_itm = Xol_lang_stub_.Get_by_key_or_null(domain_itm.Lang_actl_key()); int lang_id = lang_itm == null ? Xol_lang_stub_.Id__unknown : lang_itm.Id(); diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java b/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java index b3ccadea5..be011a832 100644 --- a/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java +++ b/400_xowa/src/gplx/xowa/wikis/xwikis/parsers/Xow_xwiki_itm_parser.java @@ -23,7 +23,7 @@ import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.bldrs.*; public class Xow_xwiki_itm_parser extends Dsv_wkr_base { private Xow_domain_itm owner_domain_itm; private int cur_tid = -1; private byte[] cur_fld1, cur_fld2, cur_fld3; - private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url(); + private final Gfo_url_parser url_parser = new Gfo_url_parser(); public Ordered_hash Xwiki_list() {return xwiki_list;} private final Ordered_hash xwiki_list = Ordered_hash_.New(); @Override public Dsv_fld_parser[] Fld_parsers() {return new Dsv_fld_parser[] {Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser};} @Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) { @@ -46,7 +46,7 @@ public class Xow_xwiki_itm_parser extends Dsv_wkr_base { case Tid__manual: // EX: "0|domz|http://www.dmoz.org/~{0}|DMOZ" xwiki_is_mw = false; url_fmt = cur_fld2; - domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, url_fmt); + domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url_fmt); break; case Tid__mw_domain: // EX: "1|w|en.wikipedia.org" domain_bry = cur_fld2; diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java index 4b7d3a4b4..6b89ae730 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java @@ -20,7 +20,7 @@ import gplx.core.primitives.*; import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; import gplx.xowa.parsers.amps.*; -import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; +import gplx.xowa.addons.wikis.ctgs.htmls.catpages.doms.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.urls.*; public class Dpl_xnde implements Xox_xnde { private Dpl_itm itm = new Dpl_itm(); private List_adp pages = List_adp_.New(); public void Xatr__set(Xowe_wiki wiki, byte[] src, Mwh_atr_itm xatr, Object xatr_id_obj) {} // NOTE: has no attributes @@ -117,7 +117,7 @@ class Dpl_page_finder { } } private static void Find_pages_in_ctg(Ordered_hash rv, Xowe_wiki wiki, Xodb_load_mgr load_mgr, Xowd_page_itm tmp_page, Int_obj_ref tmp_id, byte[] ctg_ttl) { - Xoctg_catpage_ctg ctg = wiki.Html_mgr().Catpage_mgr().Get_or_load_or_null(wiki, wiki.Ttl_parse(gplx.xowa.wikis.nss.Xow_ns_.Tid__category, ctg_ttl)); + Xoctg_catpage_ctg ctg = wiki.Ctg__catpage_mgr().Get_or_load_or_null(Xoctg_catpage_url.New__blank(), wiki.Ttl_parse(gplx.xowa.wikis.nss.Xow_ns_.Tid__category, ctg_ttl), -1); if (ctg == null) return; // loop grps to get grp @@ -158,7 +158,8 @@ class Dpl_page_finder { int found_len = cur_regy.Count(); for (int j = 0; j < found_len; j++) { // if new_page is in cur, add it Xoctg_catpage_itm cur_itm = (Xoctg_catpage_itm)cur_regy.Get_at(j); - if (ns_filter != Dpl_itm.Ns_filter_null && ns_filter != cur_itm.Page_ttl().Ns().Id()) continue; + Xoa_ttl cur_ttl = cur_itm.Page_ttl(); if (cur_ttl == null) continue; + if (ns_filter != Dpl_itm.Ns_filter_null && ns_filter != cur_ttl.Ns().Id()) continue; tmp_id.Val_(cur_itm.Page_id()); // set tmp_id, since it will be used at least once if (exclude_pages.Has(tmp_id)) continue; // ignore excluded pages if (i != 0) { // skip logic for first ctg (which doesn't have a predecessor) diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java index ca0e0085e..87207b6f0 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java @@ -307,9 +307,10 @@ class Dpl_xnde_fxt { ary[i] = Dpl_page_mok.new_(++next_id, ttls[i]); Init__create_ctg_pages(ctg, ary); } - public void Init__create_ctg_pages(String ctg, Dpl_page_mok... pages) { - Xoctg_catpage_ctg captage_ctg = new Xoctg_catpage_ctg(Bry_.new_u8(ctg)); + public void Init__create_ctg_pages(String ctg_ttl, Dpl_page_mok... pages) { + Xoctg_catpage_ctg ctg = new Xoctg_catpage_ctg(1, Bry_.new_u8(ctg_ttl)); int pages_len = pages.length; + Xoctg_catpage_tmp tmp = new Xoctg_catpage_tmp(); for (int i = 0; i < pages_len; i++) { Dpl_page_mok page = pages[i]; int id = page.Id(); @@ -320,12 +321,13 @@ class Dpl_xnde_fxt { fxt.Init_page_create(ttl_str, ttl_str); fxt.Init_id_create (id, 0, 0, false, 5, Xow_ns_.Tid__main, ttl_str); } - Xoctg_catpage_itm captage_itm = new Xoctg_catpage_itm(page.Id(), ttl, ttl.Page_db()); - captage_ctg.Pages().Itms__add(captage_itm); + byte tid = gplx.xowa.addons.wikis.ctgs.Xoa_ctg_mgr.Tid__page; + Xoctg_catpage_itm catpage_itm = Xoctg_catpage_itm.New_by_ttl(tid, page.Id(), ttl); + tmp.Add(catpage_itm); } - captage_ctg.Make_itms(); - Xoctg_catpage_mgr catpage_mgr = fxt.Wiki().Html_mgr().Catpage_mgr(); - catpage_mgr.Cache__add(Bry_.new_u8("Category:" + ctg), captage_ctg); + tmp.Make_by_ctg(ctg); + Xoctg_catpage_mgr catpage_mgr = fxt.Wiki().Ctg__catpage_mgr(); + catpage_mgr.Cache__add(Bry_.new_u8("Category:" + ctg_ttl), ctg); } public String Make__html__itms__null(String... pages) {return this.Make__html(null, pages);} public String Make__html(String itm_html, String... pages) { diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java index 915f9e140..b9f3c0116 100644 --- a/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/ttls/Pfunc_filepath_tst.java @@ -49,7 +49,7 @@ public class Pfunc_filepath_tst { } @Test public void Wiki_is_commons() { fxt.Init_page_create(commons_wiki, "File:A.png", ""); - commons_wiki.Tdb_fsys_mgr().Tdb_dir_regy()[Xotdb_dir_info_.Tid_page].Ext_tid_(gplx.core.ios.streams.Io_stream_.Tid_raw); + commons_wiki.Tdb_fsys_mgr().Tdb_dir_regy()[Xotdb_dir_info_.Tid_page].Ext_tid_(gplx.core.ios.streams.Io_stream_tid_.Tid__raw); mock_wkr.Redirect_("A.png", "A.png").Repo_idx_(1); fxt.Test_parse_tmpl_str_test("{{filepath:A.png}}", "{{test}}", "file:///mem/xowa/file/commons/trg/orig/7/0/1/c/A.png"); } diff --git a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java index 8c733a89e..547a50d4d 100644 --- a/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java +++ b/400_xowa/src/gplx/xowa/xtns/scribunto/libs/Scrib_lib_mw.java @@ -292,9 +292,11 @@ public class Scrib_lib_mw implements Scrib_lib { int fnc_name_len = fnc_name.length; int fnc_name_colon_pos = Bry_find_.Find_fwd(fnc_name, Byte_ascii.Colon, 0, fnc_name_len); if (fnc_name_colon_pos == Bry_find_.Not_found) { - Keyval arg_argx = (Keyval)rv.Get_at(0); - argx_ref.Val_(arg_argx.Val_to_bry()); - rv.Del_at(0); + if (rv.Len() > 0) { + Keyval arg_argx = (Keyval)rv.Get_at(0); + argx_ref.Val_(arg_argx.Val_to_bry()); + rv.Del_at(0); + } } else { argx_ref.Val_(Bry_.Mid(fnc_name, fnc_name_colon_pos + 1, fnc_name_len)); diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java index e03616801..f41673dfa 100644 --- a/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java +++ b/400_xowa/src/gplx/xowa/xtns/wbases/Wdata_prop_val_visitor.java @@ -44,15 +44,45 @@ class Wdata_prop_val_visitor implements Wbase_claim_visitor { bfr.Add(label); } public void Visit_quantity(Wbase_claim_quantity itm) { - byte[] amount_bry = itm.Amount(); - long val = Bry_.To_long_or(amount_bry, Byte_ascii.Comma_bry, 0, amount_bry.length, 0); // NOTE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02 + // get val + byte[] val_bry = itm.Amount(); + long val = Bry_.To_long_or(val_bry, Byte_ascii.Comma_bry, 0, val_bry.length, 0); // NOTE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02 + + // get lo, hi + long lo = itm.Lbound_as_num().To_long(); + long hi = itm.Ubound_as_num().To_long(); + + // fmt val Xol_lang_itm lang = app.Lang_mgr().Get_by(lang_key); - bfr.Add(lang.Num_mgr().Format_num_by_long(val)); // amount; EX: 1,234 - if (itm.Lbound_as_num().To_long() != val && itm.Ubound_as_num().To_long() != val) { // NOTE: do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02 - bfr.Add(Bry__quantity_margin_of_error); // symbol: EX: ± + if (lo == val && hi == val) // lo, hi, val are same; print val only; + bfr.Add(lang.Num_mgr().Format_num_by_long(val)); // amount; EX: 1,234 + else { + long lo_dif = val - lo; + long hi_dif = hi - val; + if (lo_dif == hi_dif) { // lo_dif, hi_dif are same; print val±dif + bfr.Add(lang.Num_mgr().Format_num_by_long(val)); // amount; EX: 1,234 + bfr.Add(Bry__quantity_margin_of_error); // symbol: EX: ± + bfr.Add(lang.Num_mgr().Format_num_by_long(lo_dif)); // amount; EX: 4 + } + else { // lo_dif, hi_dif are diff; print lo - hi; this may not be what MW does + bfr.Add(lang.Num_mgr().Format_num_by_long(lo)); // lo; EX: 1,230 + bfr.Add_byte(Byte_ascii.Dash); // dash: EX: - + bfr.Add(lang.Num_mgr().Format_num_by_long(hi)); // hi; EX: 1,238 + } + } + + // output unit + bfr.Add_byte_space(); + int unit_qid_bgn = Bry_find_.Find_fwd(itm.Unit(), Wikidata_url); + if (unit_qid_bgn == Bry_find_.Not_found) // entity missing; just output unit literally bfr.Add(itm.Unit()); // unit; EX: 1 + else { // entity exists; EX:"http://www.wikidata.org/entity/Q11573" (meter) + byte[] xid = Bry_.Mid(itm.Unit(), Wikidata_url.length); + Wdata_doc entity_doc = wdata_mgr.Doc_mgr.Get_by_xid_or_null(xid); + bfr.Add(entity_doc.Label_list__get_or_fallback(lang)); } } + private static final byte[] Wikidata_url = Bry_.new_a7("http://www.wikidata.org/entity/"); public void Visit_globecoordinate(Wbase_claim_globecoordinate itm) { Wdata_prop_val_visitor_.Render__geo(bfr, itm.Lat(), itm.Lng()); } diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java b/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java index 8aa151692..f33f0b301 100644 --- a/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java +++ b/400_xowa/src/gplx/xowa/xtns/wbases/imports/Io_stream_rdr_mgr.java @@ -32,7 +32,7 @@ class Io_stream_rdr_mgr { Io_url src_itm_url = src_itm.Url(); Io_stream_rdr rv = unzip_mgr.Handles(src_itm_url) ? unzip_mgr.New_rdr(src_itm_url) - : Io_stream_rdr_.file_(src_itm_url); + : Io_stream_rdr_.New__raw(src_itm_url); rv.Len_(src_itm.Size()); return rv; } @@ -67,7 +67,7 @@ class Io_stream_unzip_mgr { public Io_stream_rdr New_rdr(Io_url url) { return stdout_enabled ? Io_stream_rdr_process.new_(stdout_process.Exe_url(), url, stdout_process.Xto_process_bldr_args(url.Raw())) - : Io_stream_rdr_.bzip2_(url) + : Io_stream_rdr_.New__bzip2(url) ; } } diff --git a/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java b/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java index da88cb666..ee9fb631d 100644 --- a/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java +++ b/400_xowa/src/gplx/xowa/xtns/wbases/pfuncs/Wdata_pf_property__basic__tst.java @@ -53,20 +53,33 @@ public class Wdata_pf_property__basic__tst { fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_geo(1, "6.789", "1.2345"))); fxt.Test_parse("{{#property:p1}}", "1.2345, 6.789"); } - @Test public void Quantity() { + @Test public void Quantity__plus_minus__y() { fxt.Init_links_add("enwiki", "Test_page", "q1"); - fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "2", "+1236", "+1232"))); - fxt.Test_parse("{{#property:p1}}", "1,234±2"); + fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "meter", "+1236", "+1232"))); + fxt.Test_parse("{{#property:p1}}", "1,234±2 meter"); } - @Test public void Quantity__no_plus_minus() { // PURPOSE:do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02 + @Test public void Quantity__plus_minus__n() { // PURPOSE:do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02 fxt.Init_links_add("enwiki", "Test_page", "q1"); - fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "1", "+1234", "+1234"))); - fxt.Test_parse("{{#property:p1}}", "1,234"); + fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "meter", "+1234", "+1234"))); + fxt.Test_parse("{{#property:p1}}", "1,234 meter"); + } + @Test public void Quantity__range() { // PURPOSE:do not output ± if lbound == val == ubound; PAGE:en.w:Tintinan DATE:2015-08-02 + fxt.Init_links_add("enwiki", "Test_page", "q1"); + fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "meter", "+1236", "+1233"))); + fxt.Test_parse("{{#property:p1}}", "1,233-1,236 meter"); } @Test public void Quantity__long() { // PURPOSE: must cast to long for large numbers; EX:{{#property:P1082}} PAGE:en.w:Earth; DATE:2015-08-02 fxt.Init_links_add("enwiki", "Test_page", "q1"); - fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+4321000000", "1", "4321000000", "4321000000"))); - fxt.Test_parse("{{#property:p1}}", "4,321,000,000"); + fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+4321000000", "meter", "4321000000", "4321000000"))); + fxt.Test_parse("{{#property:p1}}", "4,321,000,000 meter"); + } + @Test public void Quantity__unit__entity() {// PURPOSE: get entity name; EX:{{#invoke:Wikidata|getUnits|P2386|FETCH_WIKIDATA}} PAGE:en.w:Arecibo_Observatory; DATE:2016-10-11 + fxt.Init_links_add("enwiki", "Test_page", "q1"); + fxt.Init__docs__add(fxt.doc_("q1", fxt.Make_claim_quantity(1, "+1234", "http://www.wikidata.org/entity/q2", "+1236", "+1232"))); + Wdata_doc wdoc = fxt.doc_("q2", fxt.Make_claim_string(2, "a")); + wdoc.Label_list().Add(Bry_.new_a7("en"), new gplx.xowa.xtns.wbases.core.Wdata_langtext_itm(Bry_.new_a7("en"), Bry_.new_a7("meter"))); + fxt.Init__docs__add(wdoc); + fxt.Test_parse("{{#property:p1}}", "1,234±2 meter"); } @Test public void Monolingualtext() { fxt.Init_links_add("enwiki", "Test_page", "q1"); diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_mgr.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_mgr.java new file mode 100644 index 000000000..5136156be --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_mgr.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.xtns.xowa_cmds.wiki_setups; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.xowa_cmds.*; +import gplx.langs.mustaches.*; +import gplx.xowa.addons.bldrs.centrals.dbs.*; import gplx.xowa.addons.bldrs.centrals.dbs.datas.*; import gplx.xowa.addons.bldrs.centrals.dbs.datas.imports.*; import gplx.xowa.addons.bldrs.centrals.hosts.*; +import gplx.xowa.addons.bldrs.exports.packs.files.*; +import gplx.xowa.parsers.*; +class Xop_wiki_setup_mgr { + private final Mustache_tkn_parser parser = new Mustache_tkn_parser(); + private Xobc_data_db data_db; + public Xop_root_tkn Write(Xoae_app app, Xowe_wiki wiki, Xop_ctx ctx, Xoae_page wpg, byte[] language, byte[][] wiki_domains) { + Io_url mustache_url = app.Fsys_mgr().Bin_addon_dir().GenSubFil_nest("bldr", "wiki_setup", "wiki_setup_main.mustache.html"); + Mustache_tkn_itm root = parser.Parse(Io_mgr.Instance.LoadFilBry(mustache_url)); + Mustache_render_ctx mctx = new Mustache_render_ctx(); + Bry_bfr tmp_bfr = Bry_bfr_.New(); + Mustache_bfr mbfr = new Mustache_bfr(tmp_bfr); + + this.data_db = Xobc_data_db.New(app.Fsys_mgr()); + root.Render(mbfr, mctx.Init(Make_root(language, wiki_domains))); + + return wiki.Parser_mgr().Main().Parse_text_to_wdom(Xop_ctx.New__sub(wiki, ctx, wpg), mbfr.To_bry_and_clear(), true); + } + private Xows_root_itm Make_root(byte[] language, byte[][] wiki_domains) { + Bry_bfr url_list_bfr = Bry_bfr_.New(); + int len = wiki_domains.length; + Xows_wiki_itm[] wiki_ary = new Xows_wiki_itm[len]; + for (int i = 0; i < len; ++i) { + byte[] wiki_domain = wiki_domains[i]; + wiki_ary[i] = new Xows_wiki_itm(wiki_domain, Make_task_ary(url_list_bfr, wiki_domain)); + } + return new Xows_root_itm(language, url_list_bfr.To_bry_and_clear(), wiki_ary); + } + private Xows_task_itm[] Make_task_ary(Bry_bfr url_list_bfr, byte[] wiki_domain) { + Xobc_task_regy_itm[] task_rows = data_db.Tbl__task_regy().Select_by_wiki(wiki_domain); + int len = task_rows.length; + Xows_task_itm[] rv = new Xows_task_itm[len]; + for (int i = 0; i < len; ++i) { + Xobc_task_regy_itm task_row = task_rows[i]; + String[] task_key_parts = Pack_file_mgr.Task_key__parse(String_.new_u8(task_row.Key())); + String task_key_type = task_key_parts[2]; + if (String_.Eq(task_key_type, "html")) task_key_type = "Articles"; + else if (String_.Eq(task_key_type, "file")) task_key_type = "Images"; + + Xows_file_itm[] files = Make_file_ary(url_list_bfr, wiki_domain, task_row.Id()); + rv[i] = new Xows_task_itm(task_row.Seqn(), wiki_domain, task_row.Name(), Bry_.new_u8(task_key_type), Bry_.Replace(Bry_.new_u8(task_key_parts[1]), Byte_ascii.Dot, Byte_ascii.Dash), files); + } + Array_.Sort(rv, new Xows_task_itm_sorter()); + return rv; + } + private Xows_file_itm[] Make_file_ary(Bry_bfr url_list_bfr, byte[] wiki_domain, int task_id) { + Xobc_import_step_itm[] rows = data_db.Tbl__import_step().Select_by_task_id(task_id); + int len = rows.length; + Xows_file_itm[] rv = new Xows_file_itm[len]; + Host_eval_itm host_eval = new Host_eval_itm(); + for (int i = 0; i < len; ++i) { + Xobc_import_step_itm row = rows[i]; + String src_fil = host_eval.Eval_src_fil(data_db, row.Host_id, gplx.xowa.wikis.domains.Xow_domain_itm_.parse(wiki_domain), row.Import_name); + url_list_bfr.Add_str_u8(src_fil).Add_byte_nl(); + rv[i] = new Xows_file_itm(row.Step_id, Bry_.new_u8(src_fil)); + } + Array_.Sort(rv, new Xows_file_itm_sorter()); + return rv; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_xnde.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_xnde.java new file mode 100644 index 000000000..8f96f918c --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xop_wiki_setup_xnde.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.xowa.xtns.xowa_cmds.wiki_setups; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.xowa_cmds.*; +import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.*; +import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; +import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*; import gplx.xowa.wikis.pages.htmls.*; +public class Xop_wiki_setup_xnde implements Xox_xnde, Mwh_atr_itm_owner2 { + private byte[] language; + private byte[][] wikis_ary; + private Xop_root_tkn root; + public void Xatr__set(Xowe_wiki wiki, byte[] src, Mwh_atr_itm xatr, byte xatr_id) { + switch (xatr_id) { + case Xatr__language: language = xatr.Val_as_bry(); break; + case Xatr__wikis: wikis_ary = Bry_split_.Split(xatr.Val_as_bry(), Byte_ascii.Pipe_bry); break; + default: Gfo_usr_dlg_.Instance.Warn_many("", "", "unhandled xnde atr; key=~{0}", xatr.Key_bry()); break; + } + } + public void Xtn_parse(Xowe_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) { + if (!wiki.Sys_cfg().Xowa_cmd_enabled()) { // not allowed; warn and exit + wiki.Appe().Usr_dlg().Warn_many("", "", "xowa_wiki_setup only allowed in xowa_home"); + return; + } + + Xox_xnde_.Parse_xatrs(wiki, this, xatr_hash, src, xnde); + this.root = new Xop_wiki_setup_mgr().Write(wiki.Appe(), wiki, ctx, ctx.Page(), language, wikis_ary); + } + public void Xtn_write(Bry_bfr bfr, Xoae_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xoae_page wpg, Xop_xnde_tkn xnde, byte[] src) { + html_wtr.Write_tkn_to_html(bfr, ctx, hctx, root.Root_src(), xnde, Xoh_html_wtr.Sub_idx_null, root); +// + } + + public Xop_root_tkn Xtn_root() {throw Err_.new_unimplemented_w_msg("xowa_wiki_setup.xtn_root should not be called");} + public byte[] Xtn_html() {throw Err_.new_unimplemented_w_msg("xowa_wiki_setup.xtn_html should not be called");} + + private static final byte Xatr__language = 1, Xatr__wikis = 2; + private static final Hash_adp_bry xatr_hash = Hash_adp_bry.ci_a7().Add_str_byte("language", Xatr__language).Add_str_byte("wikis", Xatr__wikis); +} diff --git a/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xows_root_itm.java b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xows_root_itm.java new file mode 100644 index 000000000..5583fa72c --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/xowa_cmds/wiki_setups/Xows_root_itm.java @@ -0,0 +1,108 @@ +/* +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.xtns.xowa_cmds.wiki_setups; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.xowa_cmds.*; +import gplx.langs.mustaches.*; +class Xows_root_itm implements Mustache_doc_itm { + private final byte[] language, url_list; + private final Xows_wiki_itm[] wiki_ary; + public Xows_root_itm(byte[] language, byte[] url_list, Xows_wiki_itm[] wiki_ary) { + this.language = language; + this.url_list = url_list; + this.wiki_ary = wiki_ary; + } + public boolean Mustache__write(String key, Mustache_bfr bfr) { + if (String_.Eq(key, "language")) bfr.Add_bry(language); + else if (String_.Eq(key, "url_list")) bfr.Add_bry(url_list); + else if (String_.Eq(key, "wikis__1st")) bfr.Add_bry(wiki_ary[0].Wiki_domain()); + else return false; + return false; + } + public Mustache_doc_itm[] Mustache__subs(String key) { + if (String_.Eq(key, "wikis")) return wiki_ary; + return Mustache_doc_itm_.Ary__empty; + } +} +class Xows_wiki_itm implements Mustache_doc_itm { + private final Xows_task_itm[] task_ary; + public Xows_wiki_itm(byte[] wiki_domain, Xows_task_itm[] task_ary) { + this.wiki_domain = wiki_domain; + this.task_ary = task_ary; + } + public byte[] Wiki_domain() {return wiki_domain;} private final byte[] wiki_domain; + public boolean Mustache__write(String key, Mustache_bfr bfr) { + if (String_.Eq(key, "wiki_domain")) bfr.Add_bry(wiki_domain); + else return false; + return true; + } + public Mustache_doc_itm[] Mustache__subs(String key) { + if (String_.Eq(key, "tasks")) return task_ary; + return Mustache_doc_itm_.Ary__empty; + } +} +class Xows_task_itm implements Mustache_doc_itm { + private final byte[] wiki_domain, task_full_name, task_name, task_date; + private final Xows_file_itm[] file_ary; + public Xows_task_itm(int seqn_id, byte[] wiki_domain, byte[] task_full_name, byte[] task_name, byte[] task_date, Xows_file_itm[] file_ary) { + this.seqn_id = seqn_id; + this.wiki_domain = wiki_domain; this.task_full_name = task_full_name; this.task_name = task_name; this.task_date = task_date; + this.file_ary = file_ary; + } + public int Seqn_id() {return seqn_id;} private final int seqn_id; + public boolean Mustache__write(String key, Mustache_bfr bfr) { + if (String_.Eq(key, "wiki_domain")) bfr.Add_bry(wiki_domain); + else if (String_.Eq(key, "task_name")) bfr.Add_bry(task_name); + else if (String_.Eq(key, "task_full_name")) bfr.Add_bry(task_full_name); + else if (String_.Eq(key, "task_date")) bfr.Add_bry(task_date); + else return false; + return true; + } + public Mustache_doc_itm[] Mustache__subs(String key) { + if (String_.Eq(key, "files")) return file_ary; + return Mustache_doc_itm_.Ary__empty; + } +} +class Xows_file_itm implements Mustache_doc_itm { + private final byte[] file_href; + public Xows_file_itm(int step_id, byte[] file_href) { + this.step_id = step_id; + this.file_href = file_href; + } + public int Step_id() {return step_id;} private final int step_id; + public boolean Mustache__write(String key, Mustache_bfr bfr) { + if (String_.Eq(key, "file_href")) bfr.Add_bry(file_href); + else return false; + return true; + } + public Mustache_doc_itm[] Mustache__subs(String key) { + return Mustache_doc_itm_.Ary__empty; + } +} +class Xows_task_itm_sorter implements gplx.core.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Xows_task_itm lhs = (Xows_task_itm)lhsObj; + Xows_task_itm rhs = (Xows_task_itm)rhsObj; + return Int_.Compare(lhs.Seqn_id(), rhs.Seqn_id()); + } +} +class Xows_file_itm_sorter implements gplx.core.lists.ComparerAble { + public int compare(Object lhsObj, Object rhsObj) { + Xows_file_itm lhs = (Xows_file_itm)lhsObj; + Xows_file_itm rhs = (Xows_file_itm)rhsObj; + return Int_.Compare(lhs.Step_id(), rhs.Step_id()); + } +}