mirror of
https://github.com/gnosygnu/xowa.git
synced 2025-06-13 12:54:14 +00:00
Compare commits
115 Commits
v4.6.6.200
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
2a4abd8f75 | ||
|
17a3b4e7b3 | ||
|
659bca3660 | ||
|
8684783139 | ||
|
7e53c8462d | ||
|
559503786b | ||
|
e117823e60 | ||
|
ff0f92b950 | ||
|
4187dc4a76 | ||
|
1a6a203cfd | ||
|
814e85ea70 | ||
|
0ef5058cfd | ||
|
aeef520228 | ||
|
4a7bd19056 | ||
|
7d357540c7 | ||
|
b1c52aa2b2 | ||
|
845253af79 | ||
|
541f5f6524 | ||
|
067e62dd03 | ||
|
19a315b8cd | ||
|
5c3d6a173b | ||
|
c801e3a20b | ||
|
59d8a42b22 | ||
|
567e03dc1d | ||
|
7550894dda | ||
|
caad4145d5 | ||
|
de841f8ff2 | ||
|
5f2e9c7514 | ||
|
d3896bf547 | ||
|
316c6c6a58 | ||
|
72051f4ce9 | ||
|
f19228c886 | ||
|
1b6324938c | ||
|
9b4ea48753 | ||
|
6ed7659b4d | ||
|
1eea3682ca | ||
|
4f87d1a195 | ||
|
ea9b592cfd | ||
|
3c9fd50ddc | ||
|
619d2f9844 | ||
|
bdae819908 | ||
|
f122a8d8a3 | ||
|
174e93cbfa | ||
|
0aced904a5 | ||
|
dc374fa7fc | ||
|
95e833d70c | ||
|
afed865c84 | ||
|
7b6b3ed09a | ||
|
a0c0b5b2fd | ||
|
062d308128 | ||
|
ad607d952c | ||
|
6592eaf8de | ||
|
45adc036a2 | ||
|
6b2e120fc1 | ||
|
7c0a8c5064 | ||
|
35475d631c | ||
|
efe415d3a3 | ||
|
97b1055b4e | ||
|
b51d224f09 | ||
|
b87e4d07cb | ||
|
b4516f5060 | ||
|
49e18a2255 | ||
|
026288f809 | ||
|
1103674d88 | ||
|
27756f8056 | ||
|
398a1c854a | ||
|
35f2027b20 | ||
|
be072de8d9 | ||
|
f760fd9cd0 | ||
|
3d5ec47aa8 | ||
|
53762288d7 | ||
|
7a0247417d | ||
|
0cdfa0992c | ||
|
dc66b926d3 | ||
|
8c7c9f88ff | ||
|
94b757682a | ||
|
1ebc9d3488 | ||
|
654810d56c | ||
|
b551c1875b | ||
|
ba1d4e0b7c | ||
|
a2fe75f402 | ||
|
a6331f5c89 | ||
|
43866163b9 | ||
|
49f8d4b000 | ||
|
994d405a26 | ||
|
04c499ce3e | ||
|
ebe82bea6a | ||
|
a9367eaca8 | ||
|
ee68162a4a | ||
|
6663b769d5 | ||
|
2dab6a90be | ||
|
b0e02979ac | ||
|
f9cf49c160 | ||
|
0d917bccc7 | ||
|
d1345bf724 | ||
|
3d74406a3e | ||
|
a6b128422e | ||
|
0c3cb1ba3d | ||
|
105446f5ca | ||
|
db73b4302d | ||
|
bd71db3ed6 | ||
|
a4b5f5de5d | ||
|
ecbcf1e707 | ||
|
7b00918941 | ||
|
8807dcfbeb | ||
|
a6ac592212 | ||
|
b05e3cd188 | ||
|
9c8650a4d9 | ||
|
73a56ffab3 | ||
|
e9e5724a2a | ||
|
c3c9d4ad1e | ||
|
5a35f3b05b | ||
|
7ad1291768 | ||
|
17d7a7ebed | ||
|
9809dfd6c7 |
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
*.iml
|
||||||
|
**/.idea/**
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -14,9 +14,10 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx;
|
package gplx;
|
||||||
import java.lang.*;
|
|
||||||
import gplx.core.brys.*; import gplx.core.primitives.*; import gplx.core.ios.*;
|
import gplx.core.primitives.Int_obj_ref;
|
||||||
import gplx.langs.htmls.entitys.*;
|
import gplx.langs.htmls.entitys.Gfh_entity_;
|
||||||
|
|
||||||
public class Bry_ {
|
public class Bry_ {
|
||||||
public static final String Cls_val_name = "byte[]";
|
public static final String Cls_val_name = "byte[]";
|
||||||
public static final byte[] Empty = new byte[0];
|
public static final byte[] Empty = new byte[0];
|
||||||
@ -475,6 +476,19 @@ public class Bry_ {
|
|||||||
else
|
else
|
||||||
return Bry_.Mid(src, txt_bgn, txt_end);
|
return Bry_.Mid(src, txt_bgn, txt_end);
|
||||||
}
|
}
|
||||||
|
public static byte[] Trim_bgn(byte[] v, byte trim, int bgn) {
|
||||||
|
boolean trimmed = false;
|
||||||
|
int len = v.length;
|
||||||
|
int pos = bgn;
|
||||||
|
for (; pos < len; pos++) {
|
||||||
|
if (v[pos] == trim) {
|
||||||
|
trimmed = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return trimmed ? Bry_.Mid(v, pos, len) : v;
|
||||||
|
}
|
||||||
public static byte[] Trim_end(byte[] v, byte trim, int end) {
|
public static byte[] Trim_end(byte[] v, byte trim, int end) {
|
||||||
boolean trimmed = false;
|
boolean trimmed = false;
|
||||||
int pos = end - 1; // NOTE: -1 b/c callers will always be passing pos + 1; EX: src, src_len
|
int pos = end - 1; // NOTE: -1 b/c callers will always be passing pos + 1; EX: src, src_len
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -14,7 +14,11 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx;
|
package gplx;
|
||||||
import org.junit.*; import gplx.core.primitives.*; import gplx.core.brys.*; import gplx.core.tests.*;
|
|
||||||
|
import gplx.core.primitives.Int_obj_ref;
|
||||||
|
import gplx.core.tests.Gftest;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class Bry__tst {
|
public class Bry__tst {
|
||||||
private final Bry__fxt fxt = new Bry__fxt();
|
private final Bry__fxt fxt = new Bry__fxt();
|
||||||
@Test public void new_ascii_() {
|
@Test public void new_ascii_() {
|
||||||
@ -256,6 +260,12 @@ public class Bry__tst {
|
|||||||
void Tst_match_bwd_any(String src, int src_end, int src_bgn, String find, boolean expd) {
|
void Tst_match_bwd_any(String src, int src_end, int src_bgn, String find, boolean expd) {
|
||||||
Tfds.Eq(expd, Bry_.Match_bwd_any(Bry_.new_a7(src), src_end, src_bgn, Bry_.new_a7(find)));
|
Tfds.Eq(expd, Bry_.Match_bwd_any(Bry_.new_a7(src), src_end, src_bgn, Bry_.new_a7(find)));
|
||||||
}
|
}
|
||||||
|
@Test public void Trim_bgn() {
|
||||||
|
fxt.Test_trim_bgn(" a" , Byte_ascii.Space, "a"); // trim.one
|
||||||
|
fxt.Test_trim_bgn(" a" , Byte_ascii.Space, "a"); // trim.many
|
||||||
|
fxt.Test_trim_bgn("a" , Byte_ascii.Space, "a"); // trim.none
|
||||||
|
fxt.Test_trim_bgn("" , Byte_ascii.Space, ""); // empty
|
||||||
|
}
|
||||||
@Test public void Trim_end() {
|
@Test public void Trim_end() {
|
||||||
fxt.Test_trim_end("a " , Byte_ascii.Space, "a"); // trim.one
|
fxt.Test_trim_end("a " , Byte_ascii.Space, "a"); // trim.one
|
||||||
fxt.Test_trim_end("a " , Byte_ascii.Space, "a"); // trim.many
|
fxt.Test_trim_end("a " , Byte_ascii.Space, "a"); // trim.many
|
||||||
@ -288,6 +298,10 @@ class Bry__fxt {
|
|||||||
byte[] raw_bry = Bry_.new_a7(raw);
|
byte[] raw_bry = Bry_.new_a7(raw);
|
||||||
Tfds.Eq(expd, String_.new_u8(Bry_.Trim_end(raw_bry, trim, raw_bry.length)));
|
Tfds.Eq(expd, String_.new_u8(Bry_.Trim_end(raw_bry, trim, raw_bry.length)));
|
||||||
}
|
}
|
||||||
|
public void Test_trim_bgn(String raw, byte trim, String expd) {
|
||||||
|
byte[] raw_bry = Bry_.new_a7(raw);
|
||||||
|
Tfds.Eq(expd, String_.new_u8(Bry_.Trim_bgn(raw_bry, trim, 0)));
|
||||||
|
}
|
||||||
public void Test_new_u8(String raw, byte[] expd) {Tfds.Eq_ary(expd, Bry_.new_u8(raw));}
|
public void Test_new_u8(String raw, byte[] expd) {Tfds.Eq_ary(expd, Bry_.new_u8(raw));}
|
||||||
public void Test_new_a7(String raw, byte[] expd) {Tfds.Eq_ary(expd, Bry_.new_a7(raw));}
|
public void Test_new_a7(String raw, byte[] expd) {Tfds.Eq_ary(expd, Bry_.new_a7(raw));}
|
||||||
public void Test_add(String s, byte b, String expd) {Tfds.Eq_str(expd, String_.new_u8(Bry_.Add(Bry_.new_u8(s), b)));}
|
public void Test_add(String s, byte b, String expd) {Tfds.Eq_str(expd, String_.new_u8(Bry_.Add(Bry_.new_u8(s), b)));}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2021 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -14,10 +14,15 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx;
|
package gplx;
|
||||||
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.DecimalFormat;
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.MathContext;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
public class Decimal_adp_ {
|
public class Decimal_adp_ {
|
||||||
public static final String Cls_val_name = "decimal";
|
public static final String Cls_val_name = "decimal";
|
||||||
public static final Class<?> Cls_ref_type = Decimal_adp.class;
|
public static final Class<?> Cls_ref_type = Decimal_adp.class;
|
||||||
@ -53,17 +58,34 @@ public class Decimal_adp_ {
|
|||||||
return Decimal_adp_.float_(Float_.Div(dividend, divisor) * 100).To_str(fmt) + "%";
|
return Decimal_adp_.float_(Float_.Div(dividend, divisor) * 100).To_str(fmt) + "%";
|
||||||
}
|
}
|
||||||
public static Decimal_adp divide_safe_(long lhs, long rhs) {return rhs == 0 ? Zero : divide_(lhs, rhs);}
|
public static Decimal_adp divide_safe_(long lhs, long rhs) {return rhs == 0 ? Zero : divide_(lhs, rhs);}
|
||||||
public static Decimal_adp divide_(long lhs, long rhs) {
return new Decimal_adp(new BigDecimal(lhs).divide(new BigDecimal(rhs), Gplx_rounding_context));
}
public static Decimal_adp int_(int v) {return new Decimal_adp(new BigDecimal(v));}
public static Decimal_adp long_(long v) {return new Decimal_adp(new BigDecimal(v));}
|
public static Decimal_adp divide_(long lhs, long rhs) {
|
||||||
public static Decimal_adp float_(float v) {return new Decimal_adp(new BigDecimal(v));}
public static Decimal_adp double_(double v) {return new Decimal_adp(new BigDecimal(v));}
|
return new Decimal_adp(new BigDecimal(lhs).divide(new BigDecimal(rhs), Gplx_rounding_context));
|
||||||
|
}
|
||||||
|
public static Decimal_adp int_(int v) {return new Decimal_adp(new BigDecimal(v));}
|
||||||
|
public static Decimal_adp long_(long v) {return new Decimal_adp(new BigDecimal(v));}
|
||||||
|
public static Decimal_adp float_(float v) {return new Decimal_adp(new BigDecimal(v));}
|
||||||
|
public static Decimal_adp double_(double v) {return new Decimal_adp(new BigDecimal(v));}
|
||||||
public static Decimal_adp double_thru_str_(double v) {return new Decimal_adp(BigDecimal.valueOf(v));}
|
public static Decimal_adp double_thru_str_(double v) {return new Decimal_adp(BigDecimal.valueOf(v));}
|
||||||
public static Decimal_adp db_(Object v) {return new Decimal_adp((BigDecimal)v);}
public static Decimal_adp parse(String raw) {
|
public static Decimal_adp db_(Object v) {return new Decimal_adp((BigDecimal)v);}
|
||||||
|
public static Decimal_adp parse(String raw) {
|
||||||
try {
|
try {
|
||||||
DecimalFormat nf = (DecimalFormat)NumberFormat.getInstance(Locale.US); // always parse as US format; EX:".9" should not be ",9" in german; DATE:2016-01-31
|
DecimalFormat nf = (DecimalFormat)NumberFormat.getInstance(Locale.US); // always parse as US format; EX:".9" should not be ",9" in german; DATE:2016-01-31
|
||||||
nf.setParseBigDecimal(true);
|
nf.setParseBigDecimal(true);
|
||||||
|
// 2020-08-27|ISSUE#:565|Parse 'e' as 'E'; PAGE:en.w:Huntington_Plaza
|
||||||
|
if (raw.contains("e")) {
|
||||||
|
raw = raw.replace("e", "E");
|
||||||
|
}
|
||||||
|
// 2021-02-13|ISSUE#:838|Parse '.' as '0.'; PAGE:en.w:2019_FIVB_Volleyball_Women%27s_Challenger_Cup#Pool_A
|
||||||
|
if (raw.startsWith(".")) {
|
||||||
|
raw = "0" + raw;
|
||||||
|
}
|
||||||
BigDecimal bd = (BigDecimal)nf.parse(raw);
|
BigDecimal bd = (BigDecimal)nf.parse(raw);
|
||||||
return new Decimal_adp(bd);
|
return new Decimal_adp(bd);
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
throw Err_.new_("Decimal_adp_", "parse to decimal failed", "raw", raw);
|
throw Err_.new_("Decimal_adp_", "parse to decimal failed", "raw", raw);
|
||||||
}
|
}
|
||||||
}
public static Decimal_adp pow_10_(int v) {return new Decimal_adp(new BigDecimal(1).scaleByPowerOfTen(v));}
|
}
|
||||||
public static final MathContext RoundDownContext = new MathContext(0, RoundingMode.DOWN);
public static final MathContext Gplx_rounding_context = new MathContext(14, RoundingMode.HALF_UP); // changed from 28 to 14; DATE:2015-07-31
}
|
public static Decimal_adp pow_10_(int v) {return new Decimal_adp(new BigDecimal(1).scaleByPowerOfTen(v));}
|
||||||
|
public static final MathContext RoundDownContext = new MathContext(0, RoundingMode.DOWN);
|
||||||
|
public static final MathContext Gplx_rounding_context = new MathContext(14, RoundingMode.HALF_UP); // changed from 28 to 14; DATE:2015-07-31
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2021 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -14,7 +14,9 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx;
|
package gplx;
|
||||||
|
|
||||||
import org.junit.*;
|
import org.junit.*;
|
||||||
|
|
||||||
public class Decimal_adp__tst {
|
public class Decimal_adp__tst {
|
||||||
private final Decimal_adp__fxt fxt = new Decimal_adp__fxt();
|
private final Decimal_adp__fxt fxt = new Decimal_adp__fxt();
|
||||||
@Test public void divide_() {
|
@Test public void divide_() {
|
||||||
@ -38,6 +40,10 @@ public class Decimal_adp__tst {
|
|||||||
fxt.Test_parse("1.2", "1.2");
|
fxt.Test_parse("1.2", "1.2");
|
||||||
fxt.Test_parse("0.1", "0.1");
|
fxt.Test_parse("0.1", "0.1");
|
||||||
fxt.Test_parse("1.2E1", "12");
|
fxt.Test_parse("1.2E1", "12");
|
||||||
|
fxt.Test_parse("1.2e1", "12"); // 2020-08-27|ISSUE#:565|Parse 'e' as 'E'; PAGE:en.w:Huntington_Plaza
|
||||||
|
}
|
||||||
|
@Test public void parse_dot() {
|
||||||
|
fxt.Test_parse(".", "0"); // 2021-02-13|ISSUE#:838|Parse '.' as '0.'; PAGE:en.w:2019_FIVB_Volleyball_Women%27s_Challenger_Cup#Pool_A
|
||||||
}
|
}
|
||||||
@Test public void Truncate_decimal() {
|
@Test public void Truncate_decimal() {
|
||||||
fxt.Test_truncate_decimal("1", "1");
|
fxt.Test_truncate_decimal("1", "1");
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -14,6 +14,7 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx;
|
package gplx;
|
||||||
|
|
||||||
public class Double_ {
|
public class Double_ {
|
||||||
public static final String Cls_val_name = "double";
|
public static final String Cls_val_name = "double";
|
||||||
public static final Class<?> Cls_ref_type = Double.class;
|
public static final Class<?> Cls_ref_type = Double.class;
|
||||||
@ -42,7 +43,9 @@ public class Double_ {
|
|||||||
int v_as_int = (int)v;
|
int v_as_int = (int)v;
|
||||||
return v == v_as_int
|
return v == v_as_int
|
||||||
? Int_.To_str(v_as_int) // convert to int, and call print String to eliminate any trailing decimal places
|
? Int_.To_str(v_as_int) // convert to int, and call print String to eliminate any trailing decimal places
|
||||||
: Float_.To_str((float)v); // calling ((float)v).toString is better at removing trailing 0s than String.format("%g", v). note that .net .toString() handles it better; EX:2449.600000000000d; DATE:2014-07-29
|
// DATE:2014-07-29; calling ((float)v).toString is better at removing trailing 0s than String.format("%g", v). note that .net .toString() handles it better; EX:2449.600000000000d
|
||||||
|
// DATE:2020-08-12; calling ToStrByPrintF b/c better at removing trailing 0s; ISSUE#:697;
|
||||||
|
: gplx.objects.primitives.Double_.ToStrByPrintF(v);
|
||||||
}
|
}
|
||||||
public static int Compare(double lhs, double rhs) {
|
public static int Compare(double lhs, double rhs) {
|
||||||
if (lhs == rhs) return CompareAble_.Same;
|
if (lhs == rhs) return CompareAble_.Same;
|
||||||
|
@ -28,6 +28,7 @@ public class Int_ {
|
|||||||
, Null = Int_.Min_value
|
, Null = Int_.Min_value
|
||||||
, Base1 = 1 // for super 1 lists / arrays; EX: PHP; [a, b, c]; [1] => a
|
, Base1 = 1 // for super 1 lists / arrays; EX: PHP; [a, b, c]; [1] => a
|
||||||
, Offset_1 = 1 // common symbol for + 1 after current pos; EX: String_.Mid(lhs + Offset_1, rhs)
|
, Offset_1 = 1 // common symbol for + 1 after current pos; EX: String_.Mid(lhs + Offset_1, rhs)
|
||||||
|
, Zero = 0
|
||||||
;
|
;
|
||||||
|
|
||||||
public static int Cast(Object obj) {
|
public static int Cast(Object obj) {
|
||||||
|
@ -24,7 +24,9 @@ public class Io_url__tst {
|
|||||||
class Io_url__fxt {
|
class Io_url__fxt {
|
||||||
public void Clear() {Io_mgr.Instance.InitEngine_mem();}
|
public void Clear() {Io_mgr.Instance.InitEngine_mem();}
|
||||||
public void Test__New__http_or_null(boolean os_is_wnt, String raw, String expd) {
|
public void Test__New__http_or_null(boolean os_is_wnt, String raw, String expd) {
|
||||||
|
int curTid = Op_sys.Cur().Tid();
|
||||||
Op_sys.Cur_(os_is_wnt ? Op_sys.Tid_wnt : Op_sys.Tid_lnx);
|
Op_sys.Cur_(os_is_wnt ? Op_sys.Tid_wnt : Op_sys.Tid_lnx);
|
||||||
Gftest.Eq__obj_or_null(expd, Io_url_.New__http_or_null(raw));
|
Gftest.Eq__obj_or_null(expd, Io_url_.New__http_or_null(raw));
|
||||||
|
Op_sys.Cur_(curTid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -14,6 +14,7 @@ GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx;
|
package gplx;
|
||||||
|
|
||||||
public class Type_ {//RF:2017-10-08
|
public class Type_ {//RF:2017-10-08
|
||||||
public static Class<?> Type_by_obj(Object o) {return o.getClass();}
|
public static Class<?> Type_by_obj(Object o) {return o.getClass();}
|
||||||
public static Class<?> Type_by_primitive(Object o) {
|
public static Class<?> Type_by_primitive(Object o) {
|
||||||
@ -45,6 +46,11 @@ public class Type_ {//RF:2017-10-08
|
|||||||
return type.getName();
|
return type.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String SimpleName_by_obj(Object obj) {return obj == null ? String_.Null_mark : SimpleName(Type_by_obj(obj));}
|
||||||
|
public static String SimpleName(Class<?> type) {
|
||||||
|
return type.getSimpleName();
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean Is_array(Class<?> t) {
|
public static boolean Is_array(Class<?> t) {
|
||||||
return t.isArray();
|
return t.isArray();
|
||||||
}
|
}
|
||||||
|
25
100_core/src/gplx/core/primitives/ObjectWrapperRef.java
Normal file
25
100_core/src/gplx/core/primitives/ObjectWrapperRef.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.core.primitives;
|
||||||
|
|
||||||
|
import gplx.Object_;
|
||||||
|
|
||||||
|
public class ObjectWrapperRef {
|
||||||
|
public ObjectWrapperRef() {}
|
||||||
|
public Object Val() {return val;} public ObjectWrapperRef Val_(Object v) {val = v; return this;} private Object val;
|
||||||
|
public ObjectWrapperRef Val_null_() {return Val_(null);}
|
||||||
|
@Override public String toString() {return Object_.Xto_str_strict_or_null(val);}
|
||||||
|
}
|
17
100_core/src/gplx/core/tests/GfoTestMethod.java
Normal file
17
100_core/src/gplx/core/tests/GfoTestMethod.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.core.tests;
|
||||||
|
public @interface GfoTestMethod {}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -112,6 +112,7 @@ public class Gftest {
|
|||||||
bfr.Add(Bry__line_end);
|
bfr.Add(Bry__line_end);
|
||||||
throw Err_.new_wo_type(bfr.To_str_and_clear());
|
throw Err_.new_wo_type(bfr.To_str_and_clear());
|
||||||
}
|
}
|
||||||
|
public static void Eq__bool_n(boolean actl) {Eq__bool(Bool_.N, actl, null);}
|
||||||
public static void Eq__bool_y(boolean actl) {Eq__bool(Bool_.Y, actl, null);}
|
public static void Eq__bool_y(boolean actl) {Eq__bool(Bool_.Y, actl, null);}
|
||||||
public static void Eq__bool_y(boolean actl, String msg_fmt, Object... msg_args) {Eq__bool(Bool_.Y, actl, msg_fmt, msg_args);}
|
public static void Eq__bool_y(boolean actl, String msg_fmt, Object... msg_args) {Eq__bool(Bool_.Y, actl, msg_fmt, msg_args);}
|
||||||
public static void Eq__bool(boolean expd, boolean actl) {Eq__bool(expd, actl, null);}
|
public static void Eq__bool(boolean expd, boolean actl) {Eq__bool(expd, actl, null);}
|
||||||
|
@ -22,6 +22,11 @@ public class Base64Converter {
|
|||||||
for(int i=0; i< ALPHABET.length; i++){
|
for(int i=0; i< ALPHABET.length; i++){
|
||||||
toInt[ALPHABET[i]]= i;
|
toInt[ALPHABET[i]]= i;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
public static char GetIndexChar(int i) {return ALPHABET[i];}
|
||||||
|
public static int GetIndexInt(char c) {
|
||||||
|
if (toInt == null) Init();
|
||||||
|
return toInt[c];
|
||||||
}
|
}
|
||||||
public static String EncodeString(String orig) {return Encode(Bry_.new_u8(orig));}
|
public static String EncodeString(String orig) {return Encode(Bry_.new_u8(orig));}
|
||||||
public static String Encode(byte[] buf){
|
public static String Encode(byte[] buf){
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,17 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.core.threads; import gplx.*; import gplx.core.*;
|
package gplx.core.threads;
|
||||||
import java.lang.*;
|
|
||||||
|
import gplx.Cancelable;
|
||||||
|
import gplx.Cancelable_;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.GfoMsg;
|
||||||
|
import gplx.GfoMsg_;
|
||||||
|
import gplx.Gfo_invk;
|
||||||
|
import gplx.Gfo_invk_;
|
||||||
|
import gplx.Gfo_log_;
|
||||||
|
|
||||||
public class Thread_adp implements Runnable {
|
public class Thread_adp implements Runnable {
|
||||||
private final String thread_name; private final Cancelable cxl; private final boolean cxlable;
|
private final String thread_name; private final Cancelable cxl; private final boolean cxlable;
|
||||||
private final Gfo_invk invk_itm; private final String invk_cmd; private final GfoMsg invk_msg;
|
private final Gfo_invk invk_itm; private final String invk_cmd; private final GfoMsg invk_msg;
|
||||||
@ -28,6 +37,7 @@ public class Thread_adp implements Runnable {
|
|||||||
public boolean Thread__cancelable() {return cxlable;}
|
public boolean Thread__cancelable() {return cxlable;}
|
||||||
public boolean Thread__is_alive() {return thread == null ? false : thread.isAlive();}
|
public boolean Thread__is_alive() {return thread == null ? false : thread.isAlive();}
|
||||||
public void Thread__interrupt() {thread.interrupt();}
|
public void Thread__interrupt() {thread.interrupt();}
|
||||||
|
public void Thread__stop() {thread.stop();}
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
Gfo_invk_.Invk_by_msg(invk_itm, invk_cmd, invk_msg);
|
Gfo_invk_.Invk_by_msg(invk_itm, invk_cmd, invk_msg);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,7 +13,15 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.core.threads; import gplx.*; import gplx.core.*;
|
package gplx.core.threads;
|
||||||
|
|
||||||
|
import gplx.Cancelable;
|
||||||
|
import gplx.Cancelable_;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.GfoMsg;
|
||||||
|
import gplx.GfoMsg_;
|
||||||
|
import gplx.Gfo_invk;
|
||||||
|
|
||||||
public class Thread_adp_ {
|
public class Thread_adp_ {
|
||||||
public static void Sleep(int milliseconds) {
|
public static void Sleep(int milliseconds) {
|
||||||
try {
|
try {
|
||||||
|
78
100_core/src/gplx/core/tooling/asserts/TestAssert.java
Normal file
78
100_core/src/gplx/core/tooling/asserts/TestAssert.java
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
package gplx.core.tooling.asserts;
|
||||||
|
|
||||||
|
import gplx.core.tests.Gftest;
|
||||||
|
import gplx.core.tooling.dataCollectors.GfoDataCollectorGrp;
|
||||||
|
import gplx.core.tooling.dataCollectors.GfoDataCollectorMgr;
|
||||||
|
import gplx.langs.java.util.List_;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface TestAssert {
|
||||||
|
void Test(GfoDataCollectorGrp actlItm);
|
||||||
|
void NotePrepend(String s);
|
||||||
|
static void Test(String note, GfoDataCollectorMgr mgr, TestAssert.Grp[] itms) {
|
||||||
|
for (TestAssert.Grp itm : itms) {
|
||||||
|
itm.NotePrepend(note);
|
||||||
|
itm.Test(mgr.GetGrp(itm.Key()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Grp implements TestAssert {
|
||||||
|
private String key;
|
||||||
|
private TestAssert[] rules;
|
||||||
|
public Grp(String key, TestAssert... rules) {
|
||||||
|
this.key = key;
|
||||||
|
this.rules = rules;
|
||||||
|
}
|
||||||
|
public String Key() {return key;}
|
||||||
|
public void NotePrepend(String s) {
|
||||||
|
note = s;
|
||||||
|
for (TestAssert rule : rules) {
|
||||||
|
rule.NotePrepend(s);
|
||||||
|
}
|
||||||
|
} private String note;
|
||||||
|
public void Test(GfoDataCollectorGrp grp) {
|
||||||
|
for (TestAssert rule : rules) {
|
||||||
|
rule.Test(grp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class StringEq implements TestAssert {
|
||||||
|
private String key;
|
||||||
|
private String expdVal;
|
||||||
|
public StringEq(String key, String expd) {
|
||||||
|
this.key = key;
|
||||||
|
this.expdVal = expd;
|
||||||
|
}
|
||||||
|
public void NotePrepend(String s) {note = s + "." + key;} private String note;
|
||||||
|
public void Test(GfoDataCollectorGrp grp) {
|
||||||
|
String actlVal = (String)grp.Get(key);
|
||||||
|
Gftest.Eq__str(expdVal, actlVal, note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class StringHas implements TestAssert {
|
||||||
|
private String key;
|
||||||
|
private String expdVal;
|
||||||
|
public StringHas(String key, String expd) {
|
||||||
|
this.key = key;
|
||||||
|
this.expdVal = expd;
|
||||||
|
}
|
||||||
|
public void NotePrepend(String s) {note = s + "." + key;} private String note;
|
||||||
|
public void Test(GfoDataCollectorGrp grp) {
|
||||||
|
String actlVal = (String)grp.Get(key);
|
||||||
|
Gftest.Eq__bool_y(actlVal.contains(expdVal), note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class ListEq implements TestAssert {
|
||||||
|
private String key;
|
||||||
|
private List<?> expdList;
|
||||||
|
public ListEq(String key, Object... expd) {
|
||||||
|
this.key = key;
|
||||||
|
this.expdList = List_.NewByAry(expd);
|
||||||
|
}
|
||||||
|
public void NotePrepend(String s) {note = s + "." + key;} private String note;
|
||||||
|
public void Test(GfoDataCollectorGrp grp) {
|
||||||
|
List<?> actlList = (List<?>)grp.Get(key);
|
||||||
|
Gftest.Eq__ary(expdList.toArray(), actlList.toArray(), note);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package gplx.core.tooling.dataCollectors;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class GfoDataCollectorGrp {
|
||||||
|
private final String key;
|
||||||
|
private final LinkedHashMap<String, Object> hash = new LinkedHashMap<>();
|
||||||
|
public GfoDataCollectorGrp(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
public String Key() {return key;}
|
||||||
|
public GfoDataCollectorGrp Add(String dataKey, String dataVal) {
|
||||||
|
hash.put(dataKey, dataVal);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public GfoDataCollectorGrp Add(String dataKey, List<?> dataVal) {
|
||||||
|
hash.put(dataKey, dataVal);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public Object Get(String dataKey) {
|
||||||
|
return hash.get(dataKey);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
package gplx.core.tooling.dataCollectors;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
public class GfoDataCollectorMgr {
|
||||||
|
private final LinkedHashMap<String, GfoDataCollectorGrp> hash = new LinkedHashMap<>();
|
||||||
|
public GfoDataCollectorGrp GetGrp(String grpKey) {return hash.get(grpKey);}
|
||||||
|
public GfoDataCollectorGrp AddGrp(String grpKey) {
|
||||||
|
GfoDataCollectorGrp grp = new GfoDataCollectorGrp(grpKey);
|
||||||
|
hash.put(grpKey, grp);
|
||||||
|
return grp;
|
||||||
|
}
|
||||||
|
}
|
13
100_core/src/gplx/langs/java/util/List_.java
Normal file
13
100_core/src/gplx/langs/java/util/List_.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package gplx.langs.java.util;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class List_ {
|
||||||
|
public static List<Object> NewByAry(Object[] ary) {
|
||||||
|
List<Object> rv = new ArrayList<>();
|
||||||
|
for (Object o : ary)
|
||||||
|
rv.add(o);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,19 +13,49 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.dbs; import gplx.*;
|
package gplx.dbs;
|
||||||
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.engines.*; import gplx.dbs.qrys.*; import gplx.dbs.sys.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.bats.*;
|
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.Double_;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.Gfo_log_;
|
||||||
|
import gplx.Gfo_usr_dlg;
|
||||||
|
import gplx.Gfo_usr_dlg_;
|
||||||
|
import gplx.Int_;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
import gplx.Rls_able;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.stores.DataRdr;
|
||||||
|
import gplx.core.stores.DataRdr_;
|
||||||
|
import gplx.dbs.conn_props.Db_conn_props_mgr;
|
||||||
|
import gplx.dbs.engines.Db_engine;
|
||||||
|
import gplx.dbs.metas.Dbmeta_idx_fld;
|
||||||
|
import gplx.dbs.metas.Dbmeta_tbl_mgr;
|
||||||
|
import gplx.dbs.qrys.Db_qry__select_in_tbl;
|
||||||
|
import gplx.dbs.qrys.Db_qry_delete;
|
||||||
|
import gplx.dbs.qrys.Db_qry_insert;
|
||||||
|
import gplx.dbs.qrys.Db_qry_sql;
|
||||||
|
import gplx.dbs.qrys.Db_qry_update;
|
||||||
|
import gplx.dbs.qrys.bats.Db_batch_mgr;
|
||||||
|
import gplx.dbs.sys.Db_sys_mgr;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
public class Db_conn {
|
public class Db_conn {
|
||||||
private final List_adp rls_list = List_adp_.New();
|
private final List_adp rls_list = List_adp_.New();
|
||||||
public Db_conn(Db_engine engine) {
|
public Db_conn(Db_engine engine) {
|
||||||
this.engine = engine;
|
this.engine = engine;
|
||||||
this.sys_mgr = new Db_sys_mgr(this);
|
this.sys_mgr = new Db_sys_mgr(this);
|
||||||
|
this.wkrMgr = new SqlWkrMgr(this);
|
||||||
|
engine.CtorConn(wkrMgr);
|
||||||
}
|
}
|
||||||
public Db_conn_info Conn_info() {return engine.Conn_info();}
|
public Db_conn_info Conn_info() {return engine.Conn_info();}
|
||||||
public Db_conn_props_mgr Props() {return engine.Props();}
|
public Db_conn_props_mgr Props() {return engine.Props();}
|
||||||
public Db_batch_mgr Batch_mgr() {return engine.Batch_mgr();}
|
public Db_batch_mgr Batch_mgr() {return engine.Batch_mgr();}
|
||||||
public Db_engine Engine() {return engine;} private final Db_engine engine;
|
public Db_engine Engine() {return engine;} private final Db_engine engine;
|
||||||
public Db_sys_mgr Sys_mgr() {return sys_mgr;} private final Db_sys_mgr sys_mgr; // autonum and other functions
|
public Db_sys_mgr Sys_mgr() {return sys_mgr;} private final Db_sys_mgr sys_mgr; // autonum and other functions
|
||||||
|
public SqlWkrMgr WkrMgr() {return wkrMgr;} private final SqlWkrMgr wkrMgr;
|
||||||
public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Db_api(), comp.Conn_info().Db_api());}
|
public boolean Eq(Db_conn comp) {return String_.Eq(engine.Conn_info().Db_api(), comp.Conn_info().Db_api());}
|
||||||
public void Txn_bgn(String name) {engine.Txn_bgn(name);}
|
public void Txn_bgn(String name) {engine.Txn_bgn(name);}
|
||||||
public void Txn_end() {engine.Txn_end();}
|
public void Txn_end() {engine.Txn_end();}
|
||||||
|
@ -28,6 +28,7 @@ public class Db_crt_ {
|
|||||||
public static Criteria_fld New_between (String key, Comparable lo, Comparable hi) {return Criteria_fld.new_(key, Criteria_.between_(lo, hi));}
|
public static Criteria_fld New_between (String key, Comparable lo, Comparable hi) {return Criteria_fld.new_(key, Criteria_.between_(lo, hi));}
|
||||||
public static Criteria_fld New_in (String key, Object... vals) {return Criteria_fld.new_(key, Criteria_.in_(vals));}
|
public static Criteria_fld New_in (String key, Object... vals) {return Criteria_fld.new_(key, Criteria_.in_(vals));}
|
||||||
public static Criteria_fld New_like (String key, String pattern) {return Criteria_fld.new_(key, Criteria_.like_(pattern));}
|
public static Criteria_fld New_like (String key, String pattern) {return Criteria_fld.new_(key, Criteria_.like_(pattern));}
|
||||||
|
public static Criteria_fld New_like_not (String key, String pattern) {return Criteria_fld.new_(key, Criteria_.Not(Criteria_.like_(pattern)));}
|
||||||
|
|
||||||
public static Criteria eq_many_(String... ary) {
|
public static Criteria eq_many_(String... ary) {
|
||||||
Criteria rv = null;
|
Criteria rv = null;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,14 +13,32 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.dbs.engines; import gplx.*; import gplx.dbs.*;
|
package gplx.dbs.engines;
|
||||||
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.sqls.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.bats.*;
|
|
||||||
|
import gplx.Gfo_usr_dlg;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.core.stores.DataRdr;
|
||||||
|
import gplx.dbs.Db_conn;
|
||||||
|
import gplx.dbs.Db_conn_info;
|
||||||
|
import gplx.dbs.Db_qry;
|
||||||
|
import gplx.dbs.Db_rdr;
|
||||||
|
import gplx.dbs.Db_stmt;
|
||||||
|
import gplx.dbs.Dbmeta_fld_itm;
|
||||||
|
import gplx.dbs.Dbmeta_idx_itm;
|
||||||
|
import gplx.dbs.Dbmeta_tbl_itm;
|
||||||
|
import gplx.dbs.conn_props.Db_conn_props_mgr;
|
||||||
|
import gplx.dbs.metas.Dbmeta_tbl_mgr;
|
||||||
|
import gplx.dbs.qrys.bats.Db_batch_mgr;
|
||||||
|
import gplx.dbs.sqls.Sql_qry_wtr;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
public interface Db_engine {
|
public interface Db_engine {
|
||||||
String Tid();
|
String Tid();
|
||||||
Db_conn_info Conn_info();
|
Db_conn_info Conn_info();
|
||||||
Db_conn_props_mgr Props();
|
Db_conn_props_mgr Props();
|
||||||
Db_batch_mgr Batch_mgr();
|
Db_batch_mgr Batch_mgr();
|
||||||
Sql_qry_wtr Sql_wtr();
|
Sql_qry_wtr Sql_wtr();
|
||||||
|
void CtorConn(SqlWkrMgr wkrMgr);
|
||||||
Db_engine New_clone(Db_conn_info conn_info);
|
Db_engine New_clone(Db_conn_info conn_info);
|
||||||
void Conn_open();
|
void Conn_open();
|
||||||
void Conn_term();
|
void Conn_term();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -15,6 +15,8 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|||||||
*/
|
*/
|
||||||
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||||
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.sqls.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.bats.*;
|
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.sqls.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.bats.*;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
public class Mem_engine implements Db_engine {
|
public class Mem_engine implements Db_engine {
|
||||||
private final Hash_adp tbl_hash = Hash_adp_.New();
|
private final Hash_adp tbl_hash = Hash_adp_.New();
|
||||||
Mem_engine(Db_conn_info conn_info) {
|
Mem_engine(Db_conn_info conn_info) {
|
||||||
@ -27,6 +29,7 @@ public class Mem_engine implements Db_engine {
|
|||||||
public Db_batch_mgr Batch_mgr() {return batch_mgr;} private final Db_batch_mgr batch_mgr = new Db_batch_mgr();
|
public Db_batch_mgr Batch_mgr() {return batch_mgr;} private final Db_batch_mgr batch_mgr = new Db_batch_mgr();
|
||||||
public Mem_exec_select Qry_runner() {return qry_runner;} private Mem_exec_select qry_runner;
|
public Mem_exec_select Qry_runner() {return qry_runner;} private Mem_exec_select qry_runner;
|
||||||
public Sql_qry_wtr Sql_wtr() {return sql_wtr;} private final Sql_qry_wtr sql_wtr = Sql_qry_wtr_.New__basic();
|
public Sql_qry_wtr Sql_wtr() {return sql_wtr;} private final Sql_qry_wtr sql_wtr = Sql_qry_wtr_.New__basic();
|
||||||
|
@Override public void CtorConn(SqlWkrMgr wkrMgr) {}
|
||||||
public Db_engine New_clone(Db_conn_info conn_info) {return new Mem_engine(conn_info);}
|
public Db_engine New_clone(Db_conn_info conn_info) {return new Mem_engine(conn_info);}
|
||||||
public Db_stmt Stmt_by_qry(Db_qry qry) {return new Mem_stmt(this, qry);}
|
public Db_stmt Stmt_by_qry(Db_qry qry) {return new Mem_stmt(this, qry);}
|
||||||
public Mem_tbl Tbls__get(String name) {return (Mem_tbl)tbl_hash.Get_by(name);}
|
public Mem_tbl Tbls__get(String name) {return (Mem_tbl)tbl_hash.Get_by(name);}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -15,10 +15,13 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|||||||
*/
|
*/
|
||||||
package gplx.dbs.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
package gplx.dbs.engines.mysql; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||||
import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import gplx.dbs.metas.*;
|
import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import gplx.dbs.metas.*;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
public class Mysql_engine extends Db_engine_sql_base {
|
public class Mysql_engine extends Db_engine_sql_base {
|
||||||
@Override public String Tid() {return Mysql_conn_info.Tid_const;}
|
@Override public String Tid() {return Mysql_conn_info.Tid_const;}
|
||||||
@Override public Sql_qry_wtr Sql_wtr() {return Sql_qry_wtr_.New__mysql();}
|
@Override public Sql_qry_wtr Sql_wtr() {return Sql_qry_wtr_.New__mysql();}
|
||||||
|
@Override public void CtorConn(SqlWkrMgr wkrMgr) {}
|
||||||
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
||||||
Mysql_engine rv = new Mysql_engine();
|
Mysql_engine rv = new Mysql_engine();
|
||||||
rv.Ctor(connectInfo);
|
rv.Ctor(connectInfo);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -15,12 +15,15 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|||||||
*/
|
*/
|
||||||
package gplx.dbs.engines.noops; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
package gplx.dbs.engines.noops; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||||
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.sqls.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.bats.*;
|
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.sqls.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.bats.*;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
public class Noop_engine implements Db_engine {
|
public class Noop_engine implements Db_engine {
|
||||||
public String Tid() {return Noop_conn_info.Tid_const;}
|
public String Tid() {return Noop_conn_info.Tid_const;}
|
||||||
public Db_conn_info Conn_info() {return Db_conn_info_.Null;}
|
public Db_conn_info Conn_info() {return Db_conn_info_.Null;}
|
||||||
public Db_conn_props_mgr Props() {return props;} private final Db_conn_props_mgr props = new Db_conn_props_mgr();
|
public Db_conn_props_mgr Props() {return props;} private final Db_conn_props_mgr props = new Db_conn_props_mgr();
|
||||||
public Db_batch_mgr Batch_mgr() {return batch_mgr;} private final Db_batch_mgr batch_mgr = new Db_batch_mgr();
|
public Db_batch_mgr Batch_mgr() {return batch_mgr;} private final Db_batch_mgr batch_mgr = new Db_batch_mgr();
|
||||||
public Sql_qry_wtr Sql_wtr() {return sql_wtr;} private final Sql_qry_wtr sql_wtr = Sql_qry_wtr_.New__basic();
|
public Sql_qry_wtr Sql_wtr() {return sql_wtr;} private final Sql_qry_wtr sql_wtr = Sql_qry_wtr_.New__basic();
|
||||||
|
@Override public void CtorConn(SqlWkrMgr wkrMgr) {}
|
||||||
public void Conn_open() {}
|
public void Conn_open() {}
|
||||||
public void Conn_term() {}
|
public void Conn_term() {}
|
||||||
public Db_engine New_clone(Db_conn_info url) {return this;}
|
public Db_engine New_clone(Db_conn_info url) {return this;}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -15,10 +15,15 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|||||||
*/
|
*/
|
||||||
package gplx.dbs.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
package gplx.dbs.engines.postgres; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||||
import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import gplx.dbs.metas.*;
|
import gplx.core.stores.*; import gplx.dbs.engines.*; import gplx.dbs.sqls.*; import gplx.dbs.metas.*;
|
||||||
import java.sql.*;
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
|
||||||
public class Postgres_engine extends Db_engine_sql_base {
|
public class Postgres_engine extends Db_engine_sql_base {
|
||||||
@Override public String Tid() {return Postgres_conn_info.Tid_const;}
|
@Override public String Tid() {return Postgres_conn_info.Tid_const;}
|
||||||
@Override public Sql_qry_wtr Sql_wtr() {return Sql_qry_wtr_.New__mysql();}
|
@Override public Sql_qry_wtr Sql_wtr() {return Sql_qry_wtr_.New__mysql();}
|
||||||
|
@Override public void CtorConn(SqlWkrMgr wkrMgr) {}
|
||||||
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
||||||
Postgres_engine rv = new Postgres_engine();
|
Postgres_engine rv = new Postgres_engine();
|
||||||
rv.Ctor(connectInfo);
|
rv.Ctor(connectInfo);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -21,6 +21,8 @@ import gplx.core.consoles.Console_adp_;
|
|||||||
import gplx.core.consoles.Console_adp__sys;
|
import gplx.core.consoles.Console_adp__sys;
|
||||||
import gplx.core.ios.IoItmFil;
|
import gplx.core.ios.IoItmFil;
|
||||||
|
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
import gplx.dbs.wkrs.randoms.SqliteRandomWkr;
|
||||||
import org.sqlite.SQLiteConnection;
|
import org.sqlite.SQLiteConnection;
|
||||||
public class Sqlite_engine extends Db_engine_sql_base {
|
public class Sqlite_engine extends Db_engine_sql_base {
|
||||||
private final Sqlite_txn_mgr txn_mgr; private final Sqlite_schema_mgr schema_mgr;
|
private final Sqlite_txn_mgr txn_mgr; private final Sqlite_schema_mgr schema_mgr;
|
||||||
@ -30,6 +32,10 @@ public class Sqlite_engine extends Db_engine_sql_base {
|
|||||||
}
|
}
|
||||||
@Override public String Tid() {return Sqlite_conn_info.Key_const;}
|
@Override public String Tid() {return Sqlite_conn_info.Key_const;}
|
||||||
@Override public gplx.dbs.sqls.Sql_qry_wtr Sql_wtr() {return Sql_qry_wtr_.New__sqlite();}
|
@Override public gplx.dbs.sqls.Sql_qry_wtr Sql_wtr() {return Sql_qry_wtr_.New__sqlite();}
|
||||||
|
public void CtorConn(SqlWkrMgr wkrMgr) {
|
||||||
|
wkrMgr.Set(new SqliteRandomWkr());
|
||||||
|
}
|
||||||
|
|
||||||
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
@Override public Db_engine New_clone(Db_conn_info connectInfo) {
|
||||||
Sqlite_engine rv = new Sqlite_engine();
|
Sqlite_engine rv = new Sqlite_engine();
|
||||||
rv.Ctor(connectInfo);
|
rv.Ctor(connectInfo);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -15,6 +15,8 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|||||||
*/
|
*/
|
||||||
package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
package gplx.dbs.engines.tdbs; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||||
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; import gplx.dbs.qrys.bats.*;
|
import gplx.core.stores.*; import gplx.dbs.metas.*; import gplx.dbs.conn_props.*; import gplx.dbs.qrys.*; import gplx.dbs.sqls.*; import gplx.dbs.qrys.bats.*;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
public class TdbEngine implements Db_engine {
|
public class TdbEngine implements Db_engine {
|
||||||
public String Tid() {return Tdb_conn_info.Tid_const;}
|
public String Tid() {return Tdb_conn_info.Tid_const;}
|
||||||
public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info;
|
public Db_conn_info Conn_info() {return conn_info;} private Db_conn_info conn_info;
|
||||||
@ -22,6 +24,7 @@ public class TdbEngine implements Db_engine {
|
|||||||
public Db_batch_mgr Batch_mgr() {return batch_mgr;} private final Db_batch_mgr batch_mgr = new Db_batch_mgr();
|
public Db_batch_mgr Batch_mgr() {return batch_mgr;} private final Db_batch_mgr batch_mgr = new Db_batch_mgr();
|
||||||
public Sql_qry_wtr Sql_wtr() {return sql_wtr;} private final Sql_qry_wtr sql_wtr = Sql_qry_wtr_.New__basic();
|
public Sql_qry_wtr Sql_wtr() {return sql_wtr;} private final Sql_qry_wtr sql_wtr = Sql_qry_wtr_.New__basic();
|
||||||
public TdbDatabase Db() {return db;} TdbDatabase db;
|
public TdbDatabase Db() {return db;} TdbDatabase db;
|
||||||
|
@Override public void CtorConn(SqlWkrMgr wkrMgr) {}
|
||||||
public void Conn_open() {
|
public void Conn_open() {
|
||||||
Tdb_conn_info tdb_url = (Tdb_conn_info)conn_info;
|
Tdb_conn_info tdb_url = (Tdb_conn_info)conn_info;
|
||||||
String url_str = tdb_url.Server();
|
String url_str = tdb_url.Server();
|
||||||
|
20
140_dbs/src/gplx/dbs/wkrs/SqlWkr.java
Normal file
20
140_dbs/src/gplx/dbs/wkrs/SqlWkr.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.dbs.wkrs;
|
||||||
|
|
||||||
|
public interface SqlWkr {
|
||||||
|
String Key();
|
||||||
|
}
|
43
140_dbs/src/gplx/dbs/wkrs/SqlWkrMgr.java
Normal file
43
140_dbs/src/gplx/dbs/wkrs/SqlWkrMgr.java
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.dbs.wkrs;
|
||||||
|
|
||||||
|
import gplx.dbs.Db_conn;
|
||||||
|
import gplx.dbs.wkrs.randoms.SqlRandomWkr;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class SqlWkrMgr {
|
||||||
|
private final Map<String, SqlWkr> map = new HashMap<>();
|
||||||
|
private final Db_conn conn;
|
||||||
|
public SqlWkrMgr(Db_conn conn) {
|
||||||
|
this.conn = conn;
|
||||||
|
}
|
||||||
|
public SqlWkr Get(String key) {
|
||||||
|
return map.get(key);
|
||||||
|
}
|
||||||
|
public void Set(SqlWkr wkr) {
|
||||||
|
map.put(wkr.Key(), wkr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object ExecRandomObj(String select, String from, String where) {
|
||||||
|
SqlRandomWkr wkr = (SqlRandomWkr)map.get(SqlWkrMgr.WKR_RANDOM);
|
||||||
|
return wkr.SelectRandomRow(conn, select, from, where)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String WKR_RANDOM = "random";
|
||||||
|
}
|
23
140_dbs/src/gplx/dbs/wkrs/randoms/SqlRandomWkr.java
Normal file
23
140_dbs/src/gplx/dbs/wkrs/randoms/SqlRandomWkr.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.dbs.wkrs.randoms;
|
||||||
|
|
||||||
|
import gplx.dbs.Db_conn;
|
||||||
|
import gplx.dbs.wkrs.SqlWkr;
|
||||||
|
|
||||||
|
public interface SqlRandomWkr extends SqlWkr {
|
||||||
|
Object[] SelectRandomRow(Db_conn conn, String select, String from, String where);
|
||||||
|
}
|
60
140_dbs/src/gplx/dbs/wkrs/randoms/SqliteRandomWkr.java
Normal file
60
140_dbs/src/gplx/dbs/wkrs/randoms/SqliteRandomWkr.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.dbs.wkrs.randoms;
|
||||||
|
|
||||||
|
import gplx.RandomAdp_;
|
||||||
|
import gplx.dbs.Db_conn;
|
||||||
|
import gplx.dbs.Db_rdr;
|
||||||
|
import gplx.dbs.Db_rdr_;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
|
public class SqliteRandomWkr implements SqlRandomWkr {
|
||||||
|
@Override public String Key() {return SqlWkrMgr.WKR_RANDOM;}
|
||||||
|
|
||||||
|
// NOTE: selects only 1 random row to simplify method signature
|
||||||
|
// * uses COUNT, LIMIT, OFFSET, so should also work for MySQL
|
||||||
|
// * to return many rows, look at https://stackoverflow.com/questions/4114940/select-random-rows-in-sqlite
|
||||||
|
// EX: SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
|
||||||
|
// Also, note that SQLite does not support TYPE_FORWARD_ONLY so can't jump back and forth thru ResultSet
|
||||||
|
@Override public Object[] SelectRandomRow(Db_conn conn, String select, String from, String where) {
|
||||||
|
Db_rdr rdr = Db_rdr_.Empty;
|
||||||
|
try {
|
||||||
|
String sqlSuffix = ("FROM " + from + " WHERE " + where);
|
||||||
|
|
||||||
|
// get rowCount of resultSet
|
||||||
|
rdr = conn.Stmt_sql("SELECT COUNT(*) AS RowCount " + sqlSuffix).Exec_select__rls_auto();
|
||||||
|
int rowCount = rdr.Read_int("RowCount");
|
||||||
|
|
||||||
|
// get random row
|
||||||
|
int random = RandomAdp_.new_().Next(rowCount);
|
||||||
|
rdr = conn.Stmt_sql("SELECT " + select + " " + sqlSuffix + " LIMIT 1 OFFSET " + random).Exec_select__rls_auto();
|
||||||
|
|
||||||
|
// return result
|
||||||
|
int fldsLen = rdr.Fld_len();
|
||||||
|
Object[] rv = new Object[fldsLen];
|
||||||
|
for (int i = 0; i < fldsLen; i++) {
|
||||||
|
rv[i] = rdr.Read_at(i);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
catch (Exception exc) { // for debugging; should log
|
||||||
|
throw exc;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
rdr.Rls();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
51
140_dbs/src/gplx/dbs/wkrs/randoms/TestRandomWkr.java
Normal file
51
140_dbs/src/gplx/dbs/wkrs/randoms/TestRandomWkr.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.dbs.wkrs.randoms;
|
||||||
|
|
||||||
|
import gplx.dbs.Db_conn;
|
||||||
|
import gplx.dbs.wkrs.SqlWkrMgr;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TestRandomWkr implements SqlRandomWkr {
|
||||||
|
private final List<Object[]> list = new ArrayList<>();
|
||||||
|
private int index = 0;
|
||||||
|
public void AddRow(Object... ary) {
|
||||||
|
list.add(ary);
|
||||||
|
}
|
||||||
|
public void Clear() {
|
||||||
|
list.clear();
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
public String SelectRandomRowSelect() {return selectRandomRowSelect;} private String selectRandomRowSelect;
|
||||||
|
public String SelectRandomRowFrom() {return selectRandomRowFrom;} private String selectRandomRowFrom;
|
||||||
|
public String SelectRandomRowWhere() {return selectRandomRowWhere;} private String selectRandomRowWhere;
|
||||||
|
|
||||||
|
@Override public String Key() {return SqlWkrMgr.WKR_RANDOM;}
|
||||||
|
@Override public Object[] SelectRandomRow(Db_conn conn, String select, String from, String where) {
|
||||||
|
this.selectRandomRowSelect = select;
|
||||||
|
this.selectRandomRowFrom = from;
|
||||||
|
this.selectRandomRowWhere = where;
|
||||||
|
return list.get(index++);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TestRandomWkr New(Db_conn conn) {
|
||||||
|
TestRandomWkr wkr = new TestRandomWkr();
|
||||||
|
conn.WkrMgr().Set(wkr);
|
||||||
|
return wkr;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2021 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,10 +13,31 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.gfui.kits.swts; import gplx.*; import gplx.gfui.*; import gplx.gfui.kits.*;
|
package gplx.gfui.kits.swts;
|
||||||
|
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.GfoMsg;
|
||||||
|
import gplx.Gfo_evt_itm;
|
||||||
|
import gplx.Gfo_evt_mgr;
|
||||||
|
import gplx.Gfo_evt_mgr_;
|
||||||
|
import gplx.Gfo_evt_mgr_owner;
|
||||||
|
import gplx.Gfo_invk;
|
||||||
|
import gplx.Gfo_invk_;
|
||||||
|
import gplx.GfsCtx;
|
||||||
|
import gplx.Int_;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.Keyval_hash;
|
||||||
|
import gplx.Long_;
|
||||||
|
import gplx.Object_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.Type_;
|
||||||
|
import gplx.UsrDlg_;
|
||||||
import gplx.core.envs.System_;
|
import gplx.core.envs.System_;
|
||||||
import gplx.core.primitives.*;
|
|
||||||
import gplx.core.threads.Thread_adp_;
|
|
||||||
import gplx.gfui.controls.elems.GfuiElem;
|
import gplx.gfui.controls.elems.GfuiElem;
|
||||||
import gplx.gfui.controls.gxws.GxwCbkHost;
|
import gplx.gfui.controls.gxws.GxwCbkHost;
|
||||||
import gplx.gfui.controls.gxws.GxwCore_base;
|
import gplx.gfui.controls.gxws.GxwCore_base;
|
||||||
@ -24,27 +45,32 @@ import gplx.gfui.controls.gxws.GxwElem;
|
|||||||
import gplx.gfui.controls.gxws.Gxw_html;
|
import gplx.gfui.controls.gxws.Gxw_html;
|
||||||
import gplx.gfui.controls.gxws.Gxw_html_load_tid_;
|
import gplx.gfui.controls.gxws.Gxw_html_load_tid_;
|
||||||
import gplx.gfui.controls.standards.Gfui_html;
|
import gplx.gfui.controls.standards.Gfui_html;
|
||||||
import gplx.gfui.controls.standards.Gfui_tab_mgr;
|
import gplx.gfui.ipts.IptEvtDataMouse;
|
||||||
import gplx.gfui.draws.ColorAdp;
|
import gplx.gfui.ipts.IptMouseBtn;
|
||||||
import gplx.gfui.draws.ColorAdp_;
|
import gplx.gfui.ipts.IptMouseBtn_;
|
||||||
import gplx.gfui.ipts.*;
|
import gplx.gfui.ipts.IptMouseWheel_;
|
||||||
import gplx.gfui.kits.core.Swt_kit;
|
import gplx.gfui.kits.core.Swt_kit;
|
||||||
|
|
||||||
import java.security.acl.Owner;
|
|
||||||
import gplx.*;
|
|
||||||
|
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.browser.*;
|
import org.eclipse.swt.browser.Browser;
|
||||||
import org.eclipse.swt.events.*;
|
import org.eclipse.swt.browser.BrowserFunction;
|
||||||
import org.eclipse.swt.graphics.*;
|
import org.eclipse.swt.browser.LocationEvent;
|
||||||
import org.eclipse.swt.widgets.*;
|
import org.eclipse.swt.browser.LocationListener;
|
||||||
import java.security.acl.Owner;
|
import org.eclipse.swt.browser.ProgressEvent;
|
||||||
|
import org.eclipse.swt.browser.ProgressListener;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.browser.StatusTextEvent;
|
||||||
import org.eclipse.swt.browser.*;
|
import org.eclipse.swt.browser.StatusTextListener;
|
||||||
import org.eclipse.swt.events.*;
|
import org.eclipse.swt.browser.TitleEvent;
|
||||||
import org.eclipse.swt.graphics.*;
|
import org.eclipse.swt.browser.TitleListener;
|
||||||
import org.eclipse.swt.widgets.*;
|
import org.eclipse.swt.events.FocusEvent;
|
||||||
|
import org.eclipse.swt.events.FocusListener;
|
||||||
|
import org.eclipse.swt.events.MouseEvent;
|
||||||
|
import org.eclipse.swt.events.MouseListener;
|
||||||
|
import org.eclipse.swt.events.MouseWheelListener;
|
||||||
|
import org.eclipse.swt.events.TraverseEvent;
|
||||||
|
import org.eclipse.swt.events.TraverseListener;
|
||||||
|
import org.eclipse.swt.graphics.Point;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
|
||||||
public class Swt_html implements Gxw_html, Swt_control, FocusListener, Gfo_evt_mgr_owner {
|
public class Swt_html implements Gxw_html, Swt_control, FocusListener, Gfo_evt_mgr_owner {
|
||||||
private Swt_html_lnr_location lnr_location; private Swt_html_lnr_status lnr_status;
|
private Swt_html_lnr_location lnr_location; private Swt_html_lnr_status lnr_status;
|
||||||
@ -206,7 +232,10 @@ class Swt_html_lnr_status implements StatusTextListener {
|
|||||||
public void Host_set(Gfo_evt_itm host) {this.host = host;} Gfo_evt_itm host;
|
public void Host_set(Gfo_evt_itm host) {this.host = host;} Gfo_evt_itm host;
|
||||||
@Override public void changed(StatusTextEvent ev) {
|
@Override public void changed(StatusTextEvent ev) {
|
||||||
if (html_box.Kit().Kit_mode__term()) return; // shutting down raises status changed events; ignore, else SWT exception thrown; DATE:2014-05-29
|
if (html_box.Kit().Kit_mode__term()) return; // shutting down raises status changed events; ignore, else SWT exception thrown; DATE:2014-05-29
|
||||||
String ev_text = ev.text;
|
|
||||||
|
// 2020-09-22|ISSUE#:799|normalize URL due to SWT 4.16
|
||||||
|
String ev_text = Swt_html_utl.NormalizeSwtUrl(ev.text);
|
||||||
|
|
||||||
String load_by_url_path = html_box.Load_by_url_path();
|
String load_by_url_path = html_box.Load_by_url_path();
|
||||||
if (load_by_url_path != null) ev_text = String_.Replace(ev_text, load_by_url_path, ""); // remove "C:/xowa/tab_1.html"
|
if (load_by_url_path != null) ev_text = String_.Replace(ev_text, load_by_url_path, ""); // remove "C:/xowa/tab_1.html"
|
||||||
// if (String_.Has(ev_text, "Loading [MathJax]")) return; // suppress MathJax messages; // NOTE: disabled for 2.1 (which no longer outputs messages to status); DATE:2013-05-03
|
// if (String_.Has(ev_text, "Loading [MathJax]")) return; // suppress MathJax messages; // NOTE: disabled for 2.1 (which no longer outputs messages to status); DATE:2013-05-03
|
||||||
@ -227,17 +256,28 @@ class Swt_html_lnr_location implements LocationListener {
|
|||||||
@Override public void changed(LocationEvent arg) {Pub_evt(arg, Gfui_html.Evt_location_changed);}
|
@Override public void changed(LocationEvent arg) {Pub_evt(arg, Gfui_html.Evt_location_changed);}
|
||||||
@Override public void changing(LocationEvent arg) {Pub_evt(arg, Gfui_html.Evt_location_changing);}
|
@Override public void changing(LocationEvent arg) {Pub_evt(arg, Gfui_html.Evt_location_changing);}
|
||||||
private void Pub_evt(LocationEvent arg, String evt) {
|
private void Pub_evt(LocationEvent arg, String evt) {
|
||||||
String location = arg.location;
|
// 2020-09-22|ISSUE#:799|normalize URL due to SWT 4.16
|
||||||
if (String_.Eq(location, "about:blank")) return; // location changing event fires once when page is loaded; ignore
|
String location = Swt_html_utl.NormalizeSwtUrl(arg.location);
|
||||||
if ( html_box.Browser_tid() == Swt_html.Browser_tid_webkit // webkit prefixes "about:blank" to anchors; causes TOC to fail when clicking on links; EX:about:blank#TOC1; DATE:2015-06-09
|
|
||||||
&& String_.Has_at_bgn(location, "about:blank")) {
|
// location_changing fires once when page is loaded -> ignore
|
||||||
location = String_.Mid(location, 11); // 11 = "about:blank".length
|
if (String_.Eq(location, String_.Empty)) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if ( html_box.Html_doc_html_load_tid() == Gxw_html_load_tid_.Tid_url // navigating to file://page.html will fire location event; ignore if url mode
|
|
||||||
|
// navigating to file://page.html will fire location event; ignore if url mode (loading pages from file)
|
||||||
|
if (html_box.Html_doc_html_load_tid() == Gxw_html_load_tid_.Tid_url
|
||||||
&& String_.Has_at_bgn(location, "file:")
|
&& String_.Has_at_bgn(location, "file:")
|
||||||
&& String_.Has_at_end(location, ".html")
|
&& String_.Has_at_end(location, ".html")
|
||||||
)
|
) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (String_.Has_at_bgn(location, "javascript:")) {
|
||||||
|
html_box.Html_js_eval_script(location);
|
||||||
|
arg.doit = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Gfo_evt_mgr_.Pub_obj(host, evt, "v", location);
|
Gfo_evt_mgr_.Pub_obj(host, evt, "v", location);
|
||||||
arg.doit = false; // cancel navigation event, else there will be an error when trying to go to invalid location
|
arg.doit = false; // cancel navigation event, else there will be an error when trying to go to invalid location
|
||||||
|
40
150_gfui/src/gplx/gfui/kits/swts/Swt_html_utl.java
Normal file
40
150_gfui/src/gplx/gfui/kits/swts/Swt_html_utl.java
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.gfui.kits.swts;
|
||||||
|
|
||||||
|
import gplx.String_;
|
||||||
|
|
||||||
|
public class Swt_html_utl {
|
||||||
|
private static final String URL_PREFIX_ABOUT = "about:";
|
||||||
|
private static final String URL_PREFIX_BLANK = "blank";
|
||||||
|
|
||||||
|
public static String NormalizeSwtUrl(String url) {
|
||||||
|
String rv = url;
|
||||||
|
|
||||||
|
// 2020-09-19|ISSUE#:799|strip "about:" from url due to SWT 4.16
|
||||||
|
rv = String_.Has_at_bgn(rv, URL_PREFIX_ABOUT)
|
||||||
|
? String_.Mid(rv, URL_PREFIX_ABOUT.length())
|
||||||
|
: rv;
|
||||||
|
|
||||||
|
// 2015-06-09|webkit prefixes "about:blank" to anchors; causes TOC to fail when clicking on links; EX:about:blank#TOC1
|
||||||
|
// 2020-09-22|removed webkit check due to SWT 4.16; `html_box.Browser_tid() == Swt_html.Browser_tid_webkit`
|
||||||
|
// still strip "blank"; note that SWT 4.16 changes anchors from "file:///#anchor" to "en.w/wiki/page/#anchor"
|
||||||
|
rv = String_.Has_at_bgn(rv, URL_PREFIX_BLANK)
|
||||||
|
? String_.Mid(rv, URL_PREFIX_BLANK.length())
|
||||||
|
: rv;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,24 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.core.gfobjs; import gplx.*; import gplx.core.*;
|
package gplx.core.gfobjs;
|
||||||
import gplx.langs.jsons.*;
|
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.langs.jsons.Json_ary;
|
||||||
|
import gplx.langs.jsons.Json_doc;
|
||||||
|
import gplx.langs.jsons.Json_itm;
|
||||||
|
import gplx.langs.jsons.Json_itm_;
|
||||||
|
import gplx.langs.jsons.Json_itm_bool;
|
||||||
|
import gplx.langs.jsons.Json_itm_decimal;
|
||||||
|
import gplx.langs.jsons.Json_itm_int;
|
||||||
|
import gplx.langs.jsons.Json_itm_long;
|
||||||
|
import gplx.langs.jsons.Json_itm_str;
|
||||||
|
import gplx.langs.jsons.Json_kv;
|
||||||
|
import gplx.langs.jsons.Json_nde;
|
||||||
|
import gplx.langs.jsons.Json_parser;
|
||||||
|
|
||||||
public class Gfobj_rdr__json {
|
public class Gfobj_rdr__json {
|
||||||
private final Json_parser parser = new Json_parser();
|
private final Json_parser parser = new Json_parser();
|
||||||
public Gfobj_grp Load(Io_url url) {
|
public Gfobj_grp Load(Io_url url) {
|
||||||
@ -56,7 +72,7 @@ public class Gfobj_rdr__json {
|
|||||||
case Json_itm_.Tid__nde:
|
case Json_itm_.Tid__nde:
|
||||||
Gfobj_nde sub_gnde = Gfobj_nde.New();
|
Gfobj_nde sub_gnde = Gfobj_nde.New();
|
||||||
gnde.Add_nde(key_str, sub_gnde);
|
gnde.Add_nde(key_str, sub_gnde);
|
||||||
Parse_nde(Json_nde.cast(val), sub_gnde);
|
Parse_nde(Json_nde.Cast(val), sub_gnde);
|
||||||
break;
|
break;
|
||||||
default: throw Err_.new_unhandled_default(val_tid);
|
default: throw Err_.new_unhandled_default(val_tid);
|
||||||
}
|
}
|
||||||
@ -77,7 +93,7 @@ public class Gfobj_rdr__json {
|
|||||||
}
|
}
|
||||||
case Json_itm_.Tid__nde: {
|
case Json_itm_.Tid__nde: {
|
||||||
Gfobj_nde sub_ary = Gfobj_nde.New();
|
Gfobj_nde sub_ary = Gfobj_nde.New();
|
||||||
Parse_nde(Json_nde.cast(jsub), sub_ary);
|
Parse_nde(Json_nde.Cast(jsub), sub_ary);
|
||||||
ary[i] = sub_ary;
|
ary[i] = sub_ary;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,7 +13,14 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.core.primitives; import gplx.*; import gplx.core.*;
|
package gplx.core.primitives;
|
||||||
|
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Decimal_adp;
|
||||||
|
import gplx.Decimal_adp_;
|
||||||
|
import gplx.Int_;
|
||||||
|
import gplx.Math_;
|
||||||
|
|
||||||
public class Gfo_number_parser {
|
public class Gfo_number_parser {
|
||||||
public int Rv_as_int() {return (int)num_val;} private long num_val = 0;
|
public int Rv_as_int() {return (int)num_val;} private long num_val = 0;
|
||||||
public long Rv_as_long() {return num_val;}
|
public long Rv_as_long() {return num_val;}
|
||||||
@ -112,6 +119,7 @@ public class Gfo_number_parser {
|
|||||||
has_exp = true;
|
has_exp = true;
|
||||||
has_neg = false;
|
has_neg = false;
|
||||||
has_plus = false; // allow +1E+2
|
has_plus = false; // allow +1E+2
|
||||||
|
has_num = false; // 2020-09-07|ISSUE#:795|scientific notation requires coefficient; set has_num to false which will fail below if no coefficient
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Byte_ascii.Ltr_A:
|
case Byte_ascii.Ltr_A:
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,15 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.core.primitives; import gplx.*; import gplx.core.*;
|
package gplx.core.primitives;
|
||||||
import org.junit.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Decimal_adp;
|
||||||
|
import gplx.Decimal_adp_;
|
||||||
|
import gplx.Tfds;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class Gfo_number_parser_tst {
|
public class Gfo_number_parser_tst {
|
||||||
@Before public void init() {fxt.Clear();} private final Gfo_number_parser_fxt fxt = new Gfo_number_parser_fxt();
|
@Before public void init() {fxt.Clear();} private final Gfo_number_parser_fxt fxt = new Gfo_number_parser_fxt();
|
||||||
@Test public void Integer() {
|
@Test public void Integer() {
|
||||||
@ -42,6 +49,7 @@ public class Gfo_number_parser_tst {
|
|||||||
fxt.Test_dec("1.234E-2", Decimal_adp_.parse(".01234"));
|
fxt.Test_dec("1.234E-2", Decimal_adp_.parse(".01234"));
|
||||||
fxt.Test_dec("123.4E-2", Decimal_adp_.parse("1.234"));
|
fxt.Test_dec("123.4E-2", Decimal_adp_.parse("1.234"));
|
||||||
fxt.Test_dec("+6.0E-3", Decimal_adp_.parse(".006"));
|
fxt.Test_dec("+6.0E-3", Decimal_adp_.parse(".006"));
|
||||||
|
fxt.Test_err("e24", true); // 2020-09-07|ISSUE#:795|scientific notation requires coefficient
|
||||||
}
|
}
|
||||||
@Test public void Err() {
|
@Test public void Err() {
|
||||||
fxt.Test_err("+", true);
|
fxt.Test_err("+", true);
|
||||||
|
46
400_xowa/src/gplx/core/serials/binarys/BinaryLoadMgr.java
Normal file
46
400_xowa/src/gplx/core/serials/binarys/BinaryLoadMgr.java
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package gplx.core.serials.binarys;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.core.serials.core.SerialLoadMgr;
|
||||||
|
import gplx.core.serials.core.SerialLoadWkr;
|
||||||
|
import gplx.core.texts.Base64Converter;
|
||||||
|
|
||||||
|
public class BinaryLoadMgr implements SerialLoadMgr {
|
||||||
|
public static final int CORE_VERSION = 0;
|
||||||
|
private byte[] data;
|
||||||
|
private int headerEnd;
|
||||||
|
private int dataVersion;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int CoreVersion() {
|
||||||
|
return CORE_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int DataVersion() {return dataVersion;}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void ReadHeader(byte[] data) {
|
||||||
|
this.data = data;
|
||||||
|
this.dataVersion = Base64Converter.GetIndexInt((char)data[1]);
|
||||||
|
this.headerEnd = 3; // 1=coreVersion; 2=dataVersion; 3=\n
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] Data() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int HeaderEnd() {
|
||||||
|
return headerEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SerialLoadWkr NewLoadWkr() {
|
||||||
|
return new BinaryLoadWkr().Ctor(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] FldDlm() {return fldDlm;} private final byte[] fldDlm = Bry_.new_a7("|");
|
||||||
|
public byte[] RowDlm() {return rowDlm;} private final byte[] rowDlm = Bry_.new_a7("\n");
|
||||||
|
}
|
75
400_xowa/src/gplx/core/serials/binarys/BinaryLoadWkr.java
Normal file
75
400_xowa/src/gplx/core/serials/binarys/BinaryLoadWkr.java
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
package gplx.core.serials.binarys;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_find_;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.serials.core.SerialLoadMgr;
|
||||||
|
import gplx.core.serials.core.SerialLoadWkr;
|
||||||
|
|
||||||
|
public class BinaryLoadWkr implements SerialLoadWkr {
|
||||||
|
private BinaryLoadMgr mgr;
|
||||||
|
private byte[] fldDlm;
|
||||||
|
private byte[] rowDlm;
|
||||||
|
private byte[] src;
|
||||||
|
private int srcLen;
|
||||||
|
private int cur;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SerialLoadWkr Ctor(SerialLoadMgr mgrObj) {
|
||||||
|
this.mgr = (BinaryLoadMgr)mgrObj;
|
||||||
|
this.fldDlm = mgr.FldDlm();
|
||||||
|
this.rowDlm = mgr.RowDlm();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Init(byte[] src, int cur) {
|
||||||
|
this.src = src;
|
||||||
|
this.srcLen = src.length;
|
||||||
|
this.cur = cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String LoadStr() {
|
||||||
|
return String_.new_u8(LoadBry());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int LoadInt() {
|
||||||
|
return LoadInt(rowDlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] LoadBry() {
|
||||||
|
int bryLen = LoadInt(fldDlm);
|
||||||
|
|
||||||
|
// extract bry
|
||||||
|
int bryBgn = cur;
|
||||||
|
int bryEnd = bryBgn + bryLen;
|
||||||
|
if (bryEnd > srcLen) {
|
||||||
|
throw Err_.new_wo_type(String_.Format("End position is out of bounds; src={0} currentPosition={1} byteArrayLength={2} remainder={3}", src, cur, bryLen, Bry_.Mid(src, bryBgn, bryEnd)));
|
||||||
|
}
|
||||||
|
cur = bryEnd + rowDlm.length;
|
||||||
|
|
||||||
|
return Bry_.Mid(src, bryBgn, bryEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int LoadInt(byte[] dlm) {
|
||||||
|
int bgn = cur;
|
||||||
|
|
||||||
|
// find position of delimiter
|
||||||
|
int end = Bry_find_.Find_fwd(src, dlm, cur, srcLen);
|
||||||
|
if (end == Bry_find_.Not_found) {
|
||||||
|
throw Err_.new_wo_type(String_.Format("Failed to find delimiter for integer's end position; src={0} currentPosition={1} delimiter={2}", src, cur, fldDlm));
|
||||||
|
}
|
||||||
|
cur = end + dlm.length;
|
||||||
|
|
||||||
|
// parse int
|
||||||
|
int val = Bry_.To_int_or(src, bgn, end, -1);
|
||||||
|
if (val == -1) {
|
||||||
|
throw Err_.new_wo_type(String_.Format("Failed to parse integer; src={0} currentPosition={1} string={2}", src, cur, Bry_.Mid(src, bgn, end)));
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
}
|
16
400_xowa/src/gplx/core/serials/binarys/BinarySaveMgr.java
Normal file
16
400_xowa/src/gplx/core/serials/binarys/BinarySaveMgr.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package gplx.core.serials.binarys;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.core.serials.core.SerialSaveMgr;
|
||||||
|
import gplx.core.serials.core.SerialSaveWkr;
|
||||||
|
|
||||||
|
public class BinarySaveMgr implements SerialSaveMgr {
|
||||||
|
public int CoreVersion() {return BinaryLoadMgr.CORE_VERSION;}
|
||||||
|
public byte[] FldDlm() {return fldDlm;} private final byte[] fldDlm = Bry_.new_a7("|");
|
||||||
|
public byte[] RowDlm() {return rowDlm;} private final byte[] rowDlm = Bry_.new_a7("\n");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SerialSaveWkr NewSaveWkr() {
|
||||||
|
return new BinarySaveWkr().Ctor(this);
|
||||||
|
}
|
||||||
|
}
|
60
400_xowa/src/gplx/core/serials/binarys/BinarySaveWkr.java
Normal file
60
400_xowa/src/gplx/core/serials/binarys/BinarySaveWkr.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package gplx.core.serials.binarys;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.core.serials.core.SerialSaveMgr;
|
||||||
|
import gplx.core.serials.core.SerialSaveWkr;
|
||||||
|
import gplx.core.texts.Base64Converter;
|
||||||
|
|
||||||
|
public class BinarySaveWkr implements SerialSaveWkr {
|
||||||
|
private byte[] fldDlm;
|
||||||
|
private byte[] rowDlm;
|
||||||
|
private BinarySaveMgr mgr;
|
||||||
|
private final Bry_bfr bfr = Bry_bfr_.New();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SerialSaveWkr Ctor(SerialSaveMgr mgrObj) {
|
||||||
|
this.mgr = (BinarySaveMgr)mgrObj;
|
||||||
|
this.fldDlm = mgr.FldDlm();
|
||||||
|
this.rowDlm = mgr.RowDlm();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Init() {
|
||||||
|
bfr.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void SaveHdr(int dataVersion) {
|
||||||
|
// EX: AA -> SerialCoreMgrID+DataVersionID
|
||||||
|
bfr.Add_byte((byte)Base64Converter.GetIndexChar(mgr.CoreVersion()));
|
||||||
|
bfr.Add_byte((byte)Base64Converter.GetIndexChar(dataVersion)).Add(rowDlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void SaveInt(int val) {
|
||||||
|
SaveInt(val, rowDlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void SaveStr(String val) {
|
||||||
|
this.SaveBry(Bry_.new_u8(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void SaveBry(byte[] val) {
|
||||||
|
SaveInt(val.length, fldDlm);
|
||||||
|
bfr.Add(val).Add(rowDlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SaveInt(int val, byte[] dlm) {
|
||||||
|
bfr.Add_int_variable(val).Add(dlm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] ToBry() {
|
||||||
|
return bfr.To_bry();
|
||||||
|
}
|
||||||
|
}
|
24
400_xowa/src/gplx/core/serials/core/SerialCoreFactory.java
Normal file
24
400_xowa/src/gplx/core/serials/core/SerialCoreFactory.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package gplx.core.serials.core;
|
||||||
|
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.core.serials.binarys.BinaryLoadMgr;
|
||||||
|
import gplx.core.serials.binarys.BinarySaveMgr;
|
||||||
|
import gplx.core.texts.Base64Converter;
|
||||||
|
|
||||||
|
public class SerialCoreFactory {
|
||||||
|
public static SerialSaveMgr NewSaveMgr(int coreVersion) {
|
||||||
|
if (coreVersion == BinaryLoadMgr.CORE_VERSION) {
|
||||||
|
return new BinarySaveMgr();
|
||||||
|
}
|
||||||
|
throw Err_.new_unhandled_default(coreVersion);
|
||||||
|
}
|
||||||
|
public static SerialLoadMgr NewLoadMgr(byte[] data) {
|
||||||
|
int coreVersion = Base64Converter.GetIndexInt((char)data[0]);
|
||||||
|
if (coreVersion == BinaryLoadMgr.CORE_VERSION) {
|
||||||
|
BinaryLoadMgr loadMgr = new BinaryLoadMgr();
|
||||||
|
loadMgr.ReadHeader(data);
|
||||||
|
return loadMgr;
|
||||||
|
}
|
||||||
|
throw Err_.new_unhandled_default(coreVersion);
|
||||||
|
}
|
||||||
|
}
|
10
400_xowa/src/gplx/core/serials/core/SerialLoadMgr.java
Normal file
10
400_xowa/src/gplx/core/serials/core/SerialLoadMgr.java
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package gplx.core.serials.core;
|
||||||
|
|
||||||
|
public interface SerialLoadMgr {
|
||||||
|
int CoreVersion();
|
||||||
|
int DataVersion();
|
||||||
|
SerialLoadWkr NewLoadWkr();
|
||||||
|
void ReadHeader(byte[] data);
|
||||||
|
byte[] Data();
|
||||||
|
int HeaderEnd();
|
||||||
|
}
|
9
400_xowa/src/gplx/core/serials/core/SerialLoadWkr.java
Normal file
9
400_xowa/src/gplx/core/serials/core/SerialLoadWkr.java
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package gplx.core.serials.core;
|
||||||
|
|
||||||
|
public interface SerialLoadWkr {
|
||||||
|
SerialLoadWkr Ctor(SerialLoadMgr mgr);
|
||||||
|
void Init(byte[] src, int cur);
|
||||||
|
int LoadInt();
|
||||||
|
byte[] LoadBry();
|
||||||
|
String LoadStr();
|
||||||
|
}
|
6
400_xowa/src/gplx/core/serials/core/SerialSaveMgr.java
Normal file
6
400_xowa/src/gplx/core/serials/core/SerialSaveMgr.java
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package gplx.core.serials.core;
|
||||||
|
|
||||||
|
public interface SerialSaveMgr {
|
||||||
|
int CoreVersion();
|
||||||
|
SerialSaveWkr NewSaveWkr();
|
||||||
|
}
|
11
400_xowa/src/gplx/core/serials/core/SerialSaveWkr.java
Normal file
11
400_xowa/src/gplx/core/serials/core/SerialSaveWkr.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package gplx.core.serials.core;
|
||||||
|
|
||||||
|
public interface SerialSaveWkr {
|
||||||
|
SerialSaveWkr Ctor(SerialSaveMgr mgr);
|
||||||
|
void Init();
|
||||||
|
void SaveHdr(int dataVersion);
|
||||||
|
void SaveInt(int val);
|
||||||
|
void SaveStr(String val);
|
||||||
|
void SaveBry(byte[] val);
|
||||||
|
byte[] ToBry();
|
||||||
|
}
|
157
400_xowa/src/gplx/langs/javascripts/JsString_.java
Normal file
157
400_xowa/src/gplx/langs/javascripts/JsString_.java
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
package gplx.langs.javascripts;
|
||||||
|
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.langs.javascripts.util.regex.JsPattern_;
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class JsString_ {
|
||||||
|
public static boolean charAtEq(String s, int i, char m) {
|
||||||
|
int len = s.length();
|
||||||
|
if (i < 0 || i >= len) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return s.charAt(i) == m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static boolean charAtEqNot(String s, int i, char m) {
|
||||||
|
int len = s.length();
|
||||||
|
if (i < 0 || i >= len) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return s.charAt(i) != m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static String charAt(String s, int i) {
|
||||||
|
int len = s.length();
|
||||||
|
if (i < 0 || i >= len) {
|
||||||
|
return String_.Empty;
|
||||||
|
} else {
|
||||||
|
return Character.toString(s.charAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static String slice(String str, int beginIndex) {
|
||||||
|
return slice(str, beginIndex, str.length());
|
||||||
|
}
|
||||||
|
// REF.JOS:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice
|
||||||
|
public static String slice(String str, int beginIndex, int endIndex) {
|
||||||
|
int srcLen = str.length();
|
||||||
|
|
||||||
|
// bgn
|
||||||
|
if (beginIndex < 0) {
|
||||||
|
beginIndex = srcLen + beginIndex;
|
||||||
|
if (beginIndex < 0) {
|
||||||
|
beginIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (beginIndex > srcLen) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// end
|
||||||
|
if (endIndex < 0) {
|
||||||
|
endIndex = srcLen + endIndex;
|
||||||
|
if (endIndex < 0) {
|
||||||
|
endIndex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (endIndex > srcLen) {
|
||||||
|
endIndex = srcLen;
|
||||||
|
}
|
||||||
|
if (endIndex < beginIndex) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return str.substring(beginIndex, endIndex);
|
||||||
|
}
|
||||||
|
private static final int
|
||||||
|
REPLACE_TYPE_STR = 0
|
||||||
|
, REPLACE_TYPE_MATCHER = 1
|
||||||
|
, REPLACE_TYPE_ARG1 = 2
|
||||||
|
, REPLACE_TYPE_ARG2 = 3
|
||||||
|
, REPLACE_TYPE_ARG3 = 4
|
||||||
|
;
|
||||||
|
public interface JsStringReplaceArg1 {
|
||||||
|
String processMatcher(String all);
|
||||||
|
}
|
||||||
|
public interface JsStringReplaceArg2 {
|
||||||
|
String processMatcher(String all, String arg1);
|
||||||
|
}
|
||||||
|
public interface JsStringReplaceArg3 {
|
||||||
|
String processMatcher(String all, String arg1, String arg2);
|
||||||
|
}
|
||||||
|
public interface JsStringReplaceMatcher {
|
||||||
|
String processMatcher(Matcher m);
|
||||||
|
}
|
||||||
|
public static String replace(String s, ConcurrentHashMap<String, Pattern> map, String p, String repl) {
|
||||||
|
return replace(s, map, p, JsPattern_.NONE, repl);
|
||||||
|
}
|
||||||
|
public static String replace(String src, ConcurrentHashMap<String, Pattern> map, String pat, int patFlags, String repl) {
|
||||||
|
return replaceObject(src, map, pat, patFlags, repl, REPLACE_TYPE_STR);
|
||||||
|
}
|
||||||
|
public static String replaceArg1(String src, ConcurrentHashMap<String, Pattern> map, String pat, JsStringReplaceArg1 func) {
|
||||||
|
return replaceObject(src, map, pat, JsPattern_.NONE, func, REPLACE_TYPE_ARG1);
|
||||||
|
}
|
||||||
|
public static String replaceArg1(String src, ConcurrentHashMap<String, Pattern> map, String pat, int patFlags, JsStringReplaceArg1 func) {
|
||||||
|
return replaceObject(src, map, pat, patFlags, func, REPLACE_TYPE_ARG1);
|
||||||
|
}
|
||||||
|
public static String replaceArg2(String src, ConcurrentHashMap<String, Pattern> map, String pat, JsStringReplaceArg2 func) {
|
||||||
|
return replaceObject(src, map, pat, JsPattern_.NONE, func, REPLACE_TYPE_ARG2);
|
||||||
|
}
|
||||||
|
public static String replaceArg2(String src, ConcurrentHashMap<String, Pattern> map, String pat, int patFlags, JsStringReplaceArg2 func) {
|
||||||
|
return replaceObject(src, map, pat, patFlags, func, REPLACE_TYPE_ARG2);
|
||||||
|
}
|
||||||
|
public static String replaceArg3(String src, ConcurrentHashMap<String, Pattern> map, String pat, int patFlags, JsStringReplaceArg3 func) {
|
||||||
|
return replaceObject(src, map, pat, patFlags, func, REPLACE_TYPE_ARG3);
|
||||||
|
}
|
||||||
|
public static String replaceMatcher(String src, ConcurrentHashMap<String, Pattern> map, String pat, int patFlags, JsStringReplaceMatcher func) {
|
||||||
|
return replaceObject(src, map, pat, patFlags, func, REPLACE_TYPE_MATCHER);
|
||||||
|
}
|
||||||
|
private static String replaceObject(String src, ConcurrentHashMap<String, Pattern> map, String pat, int patFlags, Object replObj, int replType) {
|
||||||
|
Pattern pattern = JsPattern_.getOrCompile(map, pat, patFlags);
|
||||||
|
|
||||||
|
// match
|
||||||
|
Matcher m = pattern.matcher(src);
|
||||||
|
StringBuffer sb = null;
|
||||||
|
while (m.find()) {
|
||||||
|
// get repl
|
||||||
|
String repl = null;
|
||||||
|
switch (replType) {
|
||||||
|
case REPLACE_TYPE_STR:
|
||||||
|
repl = (String)replObj;
|
||||||
|
break;
|
||||||
|
case REPLACE_TYPE_MATCHER:
|
||||||
|
repl = ((JsStringReplaceMatcher)replObj).processMatcher(m);
|
||||||
|
break;
|
||||||
|
case REPLACE_TYPE_ARG1:
|
||||||
|
repl = ((JsStringReplaceArg1)replObj).processMatcher(m.group(0));
|
||||||
|
break;
|
||||||
|
case REPLACE_TYPE_ARG2:
|
||||||
|
repl = ((JsStringReplaceArg2)replObj).processMatcher(m.group(0), m.group(1));
|
||||||
|
break;
|
||||||
|
case REPLACE_TYPE_ARG3:
|
||||||
|
repl = ((JsStringReplaceArg3)replObj).processMatcher(m.group(0), m.group(1), m.group(2));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw Err_.new_unhandled_default(replType);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sb == null) {
|
||||||
|
sb = new StringBuffer();
|
||||||
|
}
|
||||||
|
m.appendReplacement(sb, repl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return
|
||||||
|
if (sb != null) {
|
||||||
|
m.appendTail(sb);
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package gplx.langs.javascripts.util.regex;
|
||||||
|
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class JsPattern_ {
|
||||||
|
public static final int NONE = 0;
|
||||||
|
public static Pattern getOrCompile(ConcurrentHashMap<String, Pattern> map, String pat) {return getOrCompile(map, pat, NONE);}
|
||||||
|
public static Pattern getOrCompile(ConcurrentHashMap<String, Pattern> map, String pat, int patFlags) {
|
||||||
|
// get pattern
|
||||||
|
Pattern pattern = map.get(pat);
|
||||||
|
if (pattern == null) {
|
||||||
|
pattern = Pattern.compile(pat, patFlags);
|
||||||
|
map.put(pat, pattern);
|
||||||
|
}
|
||||||
|
return pattern;
|
||||||
|
}
|
||||||
|
}
|
69
400_xowa/src/gplx/langs/jsons/JsonDocBldr.java
Normal file
69
400_xowa/src/gplx/langs/jsons/JsonDocBldr.java
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
import gplx.String_;
|
||||||
|
|
||||||
|
public class JsonDocBldr {
|
||||||
|
private final List_adp stack = List_adp_.New();
|
||||||
|
private final Json_doc doc = new Json_doc();
|
||||||
|
private Json_grp root;
|
||||||
|
private Json_grp cur;
|
||||||
|
JsonDocBldr() {}
|
||||||
|
public JsonDocBldr Clear(boolean isRootNode) {
|
||||||
|
this.root = isRootNode ? Json_nde.NewByDoc(doc, 0) : Json_ary.NewByDoc(doc, 0, 0);
|
||||||
|
doc.Ctor(Bry_.Empty, root);
|
||||||
|
this.cur = root;
|
||||||
|
stack.Clear();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public JsonDocBldr NdeBgn(String key) {
|
||||||
|
Json_nde nde = Json_nde.NewByDoc(doc, 1);
|
||||||
|
if (cur.Tid() == Json_itm_.Tid__nde) {
|
||||||
|
Json_kv kv = new Json_kv(Json_itm_str.NewByVal(key), nde);
|
||||||
|
cur.Add(kv);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cur.Add(nde);
|
||||||
|
}
|
||||||
|
stack.Add(cur);
|
||||||
|
cur = nde;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public JsonDocBldr NdeEnd() {
|
||||||
|
this.cur = (Json_grp)List_adp_.Pop_last(stack);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public JsonDocBldr KvBool(String key, boolean val) {return Kv(key, Json_itm_bool.Get(val));}
|
||||||
|
public JsonDocBldr KvInt(String key, int val) {return Kv(key, Json_itm_int.NewByVal(val));}
|
||||||
|
public JsonDocBldr KvStr(String key, byte[] val) {return Kv(key, Json_itm_str.NewByVal(String_.new_u8(val)));}
|
||||||
|
public JsonDocBldr KvStr(String key, String val) {return Kv(key, Json_itm_str.NewByVal(val));}
|
||||||
|
private JsonDocBldr Kv(String key, Json_itm val) {
|
||||||
|
Json_kv rv = new Json_kv(Json_itm_str.NewByVal(key), val);
|
||||||
|
cur.Add(rv);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public Json_doc ToDoc() {
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
public Json_nde ToRootNde() {
|
||||||
|
return doc.Root_nde();
|
||||||
|
}
|
||||||
|
public static JsonDocBldr NewRootNde() {return new JsonDocBldr().Clear(true);}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,11 +13,18 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Array_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Err_;
|
||||||
|
|
||||||
public class Json_ary extends Json_itm_base implements Json_grp {
|
public class Json_ary extends Json_itm_base implements Json_grp {
|
||||||
public Json_ary(int src_bgn, int src_end) {this.Ctor(src_bgn, src_end);}
|
private Json_ary() {}
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__ary;}
|
@Override public byte Tid() {return Json_itm_.Tid__ary;}
|
||||||
public void Src_end_(int v) {this.src_end = v;}
|
public void Src_end_(int v) {}
|
||||||
@Override public Object Data() {return null;}
|
@Override public Object Data() {return null;}
|
||||||
@Override public byte[] Data_bry() {return null;}
|
@Override public byte[] Data_bry() {return null;}
|
||||||
public int Len() {return subs_len;} private int subs_len = 0, subs_max = 0;
|
public int Len() {return subs_len;} private int subs_len = 0, subs_max = 0;
|
||||||
@ -26,7 +33,7 @@ public class Json_ary extends Json_itm_base implements Json_grp {
|
|||||||
return (Json_nde)rv;
|
return (Json_nde)rv;
|
||||||
}
|
}
|
||||||
public Json_itm Get_at(int i) {return subs[i];}
|
public Json_itm Get_at(int i) {return subs[i];}
|
||||||
public Json_nde Get_as_nde(int i) {return Json_nde.cast(subs[i]);}
|
public Json_nde Get_as_nde(int i) {return Json_nde.Cast(subs[i]);}
|
||||||
public Json_ary Add_many(Json_itm... ary) {
|
public Json_ary Add_many(Json_itm... ary) {
|
||||||
int len = ary.length;
|
int len = ary.length;
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++)
|
||||||
@ -75,4 +82,6 @@ public class Json_ary extends Json_itm_base implements Json_grp {
|
|||||||
if (v == null || v.Tid() != Json_itm_.Tid__ary) throw Err_.new_("json", "itm is not array");
|
if (v == null || v.Tid() != Json_itm_.Tid__ary) throw Err_.new_("json", "itm is not array");
|
||||||
return (Json_ary)v;
|
return (Json_ary)v;
|
||||||
}
|
}
|
||||||
|
public static Json_ary NewByDoc(Json_doc doc, int src_bgn, int src_end) {return new Json_ary();}
|
||||||
|
public static Json_ary NewByVal() {return new Json_ary();}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,15 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
import gplx.core.primitives.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.primitives.Gfo_number_parser;
|
||||||
|
|
||||||
public class Json_doc {
|
public class Json_doc {
|
||||||
private final byte[][] tmp_qry_bry = new byte[1][];
|
private final byte[][] tmp_qry_bry = new byte[1][];
|
||||||
public void Ctor(byte[] src, Json_grp new_root) {
|
public void Ctor(byte[] src, Json_grp new_root) {
|
||||||
@ -66,10 +73,10 @@ public class Json_doc {
|
|||||||
byte[] path = paths[paths_idx];
|
byte[] path = paths[paths_idx];
|
||||||
int subs_len = owner.Len();
|
int subs_len = owner.Len();
|
||||||
for (int i = 0; i < subs_len; i++) {
|
for (int i = 0; i < subs_len; i++) {
|
||||||
Json_kv itm = Json_kv.cast(owner.Get_at(i)); if (itm == null) continue; // ignore simple props, arrays, ndes
|
Json_kv itm = Json_kv.Cast(owner.Get_at(i)); if (itm == null) continue; // ignore simple props, arrays, ndes
|
||||||
if (!itm.Key_eq(path)) continue;
|
if (!itm.Key_eq(path)) continue;
|
||||||
if (paths_idx == paths_last) return itm.Val();
|
if (paths_idx == paths_last) return itm.Val();
|
||||||
Json_nde sub_nde = Json_nde.cast(itm.Val()); if (sub_nde == null) return null; // match, but has not a nde; exit
|
Json_nde sub_nde = Json_nde.Cast(itm.Val()); if (sub_nde == null) return null; // match, but has not a nde; exit
|
||||||
return Find_nde(sub_nde, paths, paths_last, paths_idx + 1);
|
return Find_nde(sub_nde, paths, paths_last, paths_idx + 1);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -1,40 +0,0 @@
|
|||||||
/*
|
|
||||||
XOWA: the XOWA Offline Wiki Application
|
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
|
||||||
|
|
||||||
You may use XOWA according to either of these licenses as is most appropriate
|
|
||||||
for your project on a case-by-case basis.
|
|
||||||
|
|
||||||
The terms of each license can be found in the source code repository:
|
|
||||||
|
|
||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|
||||||
*/
|
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
|
||||||
public class Json_doc_bldr {
|
|
||||||
public Json_nde Nde(Json_doc jdoc) {return factory.Nde(jdoc, -1);}
|
|
||||||
public Json_nde Nde(Json_doc jdoc, Json_grp owner) {
|
|
||||||
Json_nde rv = factory.Nde(jdoc, -1);
|
|
||||||
owner.Add(rv);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
public Json_itm Str(byte[] v) {return Str(String_.new_u8(v));}
|
|
||||||
public Json_itm Str(String v) {return Json_itm_tmp.new_str_(v);}
|
|
||||||
public Json_itm Int(int v) {return Json_itm_tmp.new_int_(v);}
|
|
||||||
public Json_kv Kv_int(Json_grp owner, String key, int val) {Json_kv rv = factory.Kv(Json_itm_tmp.new_str_(key), Json_itm_tmp.new_int_(val)); owner.Add(rv); return rv;}
|
|
||||||
public Json_kv Kv_str(Json_grp owner, String key, String val) {Json_kv rv = factory.Kv(Json_itm_tmp.new_str_(key), Json_itm_tmp.new_str_(val)); owner.Add(rv); return rv;}
|
|
||||||
public Json_ary Kv_ary(Json_grp owner, String key, Json_itm... subs) {
|
|
||||||
Json_itm key_itm = Json_itm_tmp.new_str_(key);
|
|
||||||
Json_ary val_ary = factory.Ary(-1, -1);
|
|
||||||
Json_kv kv = factory.Kv(key_itm, val_ary);
|
|
||||||
owner.Add(kv);
|
|
||||||
int len = subs.length;
|
|
||||||
for (int i = 0; i < len; i++)
|
|
||||||
val_ary.Add(subs[i]);
|
|
||||||
return val_ary;
|
|
||||||
}
|
|
||||||
Json_doc doc = new Json_doc(); Json_factory factory = new Json_factory();
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,9 +13,20 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
import gplx.objects.strings.unicodes.*;
|
|
||||||
import gplx.core.encoders.*;
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Double_;
|
||||||
|
import gplx.Object_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.encoders.Hex_utl_;
|
||||||
|
import gplx.objects.strings.unicodes.Ustring;
|
||||||
|
import gplx.objects.strings.unicodes.Ustring_;
|
||||||
|
|
||||||
public class Json_doc_wtr {
|
public class Json_doc_wtr {
|
||||||
private int indent = -2;
|
private int indent = -2;
|
||||||
private Bry_bfr bfr = Bry_bfr_.Reset(255);
|
private Bry_bfr bfr = Bry_bfr_.Reset(255);
|
||||||
@ -96,6 +107,7 @@ public class Json_doc_wtr {
|
|||||||
bfr.Add_byte_nl();
|
bfr.Add_byte_nl();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
public Json_doc_wtr Kv(boolean comma, String key, byte[] val) {return Kv(comma, Bry_.new_u8(key), val);}
|
||||||
public Json_doc_wtr Kv(boolean comma, byte[] key, byte[] val) {
|
public Json_doc_wtr Kv(boolean comma, byte[] key, byte[] val) {
|
||||||
Key_internal(comma, key);
|
Key_internal(comma, key);
|
||||||
Str(val);
|
Str(val);
|
||||||
@ -108,12 +120,15 @@ public class Json_doc_wtr {
|
|||||||
bfr.Add_byte_nl();
|
bfr.Add_byte_nl();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
public Json_doc_wtr Kv(boolean comma, String key, int v) {return Kv(comma, Bry_.new_u8(key), v);}
|
||||||
public Json_doc_wtr Kv(boolean comma, byte[] key, int v) {
|
public Json_doc_wtr Kv(boolean comma, byte[] key, int v) {
|
||||||
Key_internal(comma, key);
|
Key_internal(comma, key);
|
||||||
Int(v);
|
Int(v);
|
||||||
bfr.Add_byte_nl();
|
bfr.Add_byte_nl();
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
public Json_doc_wtr Kv(boolean comma, String key, double v) {return Kv(comma, Bry_.new_u8(key), Bry_.new_u8(Double_.To_str(v)));}
|
||||||
|
public Json_doc_wtr Kv(boolean comma, String key, boolean v) {return Kv(comma, Bry_.new_u8(key), v ? Bool_.Y_bry : Bool_.N_bry);}
|
||||||
public Json_doc_wtr Key(boolean comma, String key) {return Key(comma, Bry_.new_u8(key));}
|
public Json_doc_wtr Key(boolean comma, String key) {return Key(comma, Bry_.new_u8(key));}
|
||||||
public Json_doc_wtr Key(boolean comma, byte[] key) {
|
public Json_doc_wtr Key(boolean comma, byte[] key) {
|
||||||
Key_internal(comma, key);
|
Key_internal(comma, key);
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
XOWA: the XOWA Offline Wiki Application
|
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
|
||||||
|
|
||||||
You may use XOWA according to either of these licenses as is most appropriate
|
|
||||||
for your project on a case-by-case basis.
|
|
||||||
|
|
||||||
The terms of each license can be found in the source code repository:
|
|
||||||
|
|
||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|
||||||
*/
|
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
|
||||||
public class Json_factory {
|
|
||||||
public Json_itm Null() {return Json_itm_null.Null;}
|
|
||||||
public Json_itm Bool_n() {return Json_itm_bool.Bool_n;}
|
|
||||||
public Json_itm Bool_y() {return Json_itm_bool.Bool_y;}
|
|
||||||
public Json_itm_int Int(Json_doc doc, int bgn, int end) {return new Json_itm_int(doc, bgn, end);}
|
|
||||||
public Json_itm_long Long(Json_doc doc, int bgn, int end) {return new Json_itm_long(doc, bgn, end);}
|
|
||||||
public Json_itm Decimal(Json_doc doc, int bgn, int end) {return new Json_itm_decimal(doc, bgn, end);}
|
|
||||||
public Json_itm Str(Json_doc doc, int bgn, int end, boolean exact) {return new Json_itm_str(doc, bgn, end, exact);}
|
|
||||||
public Json_kv Kv(Json_itm key, Json_itm val) {return new Json_kv(key, val);}
|
|
||||||
public Json_ary Ary(int bgn, int end) {return new Json_ary(bgn, end);}
|
|
||||||
public Json_nde Nde(Json_doc doc, int bgn) {return new Json_nde(doc, bgn);}
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,18 +13,20 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Object_;
|
||||||
|
|
||||||
public interface Json_itm {
|
public interface Json_itm {
|
||||||
byte Tid();
|
byte Tid();
|
||||||
int Src_bgn();
|
|
||||||
int Src_end();
|
|
||||||
Object Data();
|
Object Data();
|
||||||
byte[] Data_bry();
|
byte[] Data_bry();
|
||||||
void Print_as_json(Bry_bfr bfr, int depth);
|
|
||||||
boolean Data_eq(byte[] comp);
|
boolean Data_eq(byte[] comp);
|
||||||
|
void Print_as_json(Bry_bfr bfr, int depth);
|
||||||
}
|
}
|
||||||
class Json_itm_null extends Json_itm_base {
|
class Json_itm_null extends Json_itm_base {
|
||||||
Json_itm_null() {this.Ctor(-1, -1);}
|
Json_itm_null() {}
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__null;}
|
@Override public byte Tid() {return Json_itm_.Tid__null;}
|
||||||
@Override public Object Data() {return null;}
|
@Override public Object Data() {return null;}
|
||||||
@Override public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add(Object_.Bry__null);}
|
@Override public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add(Object_.Bry__null);}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,15 +13,20 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
|
||||||
public abstract class Json_itm_base implements Json_itm {
|
public abstract class Json_itm_base implements Json_itm {
|
||||||
public abstract byte Tid();
|
public abstract byte Tid();
|
||||||
public void Ctor(int src_bgn, int src_end) {this.src_bgn = src_bgn; this.src_end = src_end;}
|
|
||||||
public int Src_bgn() {return src_bgn;} private int src_bgn;
|
|
||||||
public int Src_end() {return src_end;} protected int src_end;
|
|
||||||
public abstract Object Data();
|
public abstract Object Data();
|
||||||
public abstract byte[] Data_bry();
|
public abstract byte[] Data_bry();
|
||||||
public String Print_as_json() {Bry_bfr bfr = Bry_bfr_.New(); Print_as_json(bfr, 0); return bfr.To_str_and_clear();}
|
public String Print_as_json() {
|
||||||
|
Bry_bfr bfr = Bry_bfr_.New();
|
||||||
|
Print_as_json(bfr, 0);
|
||||||
|
return bfr.To_str_and_clear();
|
||||||
|
}
|
||||||
public abstract void Print_as_json(Bry_bfr bfr, int depth);
|
public abstract void Print_as_json(Bry_bfr bfr, int depth);
|
||||||
@gplx.Virtual public boolean Data_eq(byte[] comp) {return false;}
|
@gplx.Virtual public boolean Data_eq(byte[] comp) {return false;}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,14 +13,22 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
|
||||||
public class Json_itm_bool extends Json_itm_base {
|
public class Json_itm_bool extends Json_itm_base {
|
||||||
private boolean data;
|
private boolean data;
|
||||||
public Json_itm_bool(boolean data) {this.data = data; this.Ctor(-1, -1);}
|
private Json_itm_bool(boolean data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__bool;}
|
@Override public byte Tid() {return Json_itm_.Tid__bool;}
|
||||||
public boolean Data_as_bool() {return data;}
|
public boolean Data_as_bool() {return data;}
|
||||||
@Override public Object Data() {return data;}
|
@Override public Object Data() {return data;}
|
||||||
@Override public byte[] Data_bry() {return data ? Json_itm_.Bry__true : Json_itm_.Bry__false;}
|
@Override public byte[] Data_bry() {return data ? Json_itm_.Bry__true : Json_itm_.Bry__false;}
|
||||||
@Override public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add(data ? Json_itm_.Bry__true: Json_itm_.Bry__false);}
|
@Override public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add(data ? Json_itm_.Bry__true: Json_itm_.Bry__false);}
|
||||||
|
|
||||||
public static final Json_itm_bool Bool_n = new Json_itm_bool(false), Bool_y = new Json_itm_bool(true);
|
public static final Json_itm_bool Bool_n = new Json_itm_bool(false), Bool_y = new Json_itm_bool(true);
|
||||||
|
public static final Json_itm_bool Get(boolean v) {return v ? Bool_y : Bool_n;}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,14 +13,35 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Decimal_adp;
|
||||||
|
import gplx.Decimal_adp_;
|
||||||
|
import gplx.Double_;
|
||||||
|
import gplx.String_;
|
||||||
|
|
||||||
public class Json_itm_decimal extends Json_itm_base {
|
public class Json_itm_decimal extends Json_itm_base {
|
||||||
private final Json_doc doc; private Decimal_adp data; private byte[] data_bry;
|
private final Json_doc doc;
|
||||||
public Json_itm_decimal(Json_doc doc, int src_bgn, int src_end) {this.Ctor(src_bgn, src_end); this.doc = doc;}
|
private final int src_bgn, src_end;
|
||||||
|
private Decimal_adp data;
|
||||||
|
private byte[] data_bry;
|
||||||
|
|
||||||
|
private Json_itm_decimal(Json_doc doc, int src_bgn, int src_end, Decimal_adp data) {
|
||||||
|
this.doc = doc;
|
||||||
|
this.src_bgn = src_bgn;
|
||||||
|
this.src_end = src_end;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__decimal;}
|
@Override public byte Tid() {return Json_itm_.Tid__decimal;}
|
||||||
@Override public Object Data() {return this.Data_as_decimal();}
|
@Override public Object Data() {return this.Data_as_decimal();}
|
||||||
@Override public byte[] Data_bry() {
|
@Override public byte[] Data_bry() {
|
||||||
if (data_bry == null) data_bry = Bry_.Mid(doc.Src(), this.Src_bgn(), this.Src_end());
|
if (data_bry == null) {
|
||||||
|
data_bry = data == null
|
||||||
|
? Bry_.Mid(doc.Src(), src_bgn, src_end)
|
||||||
|
: Bry_.new_u8(Double_.To_str_loose(data.To_double()));
|
||||||
|
}
|
||||||
return data_bry;
|
return data_bry;
|
||||||
}
|
}
|
||||||
public Decimal_adp Data_as_decimal() {
|
public Decimal_adp Data_as_decimal() {
|
||||||
@ -31,5 +52,15 @@ public class Json_itm_decimal extends Json_itm_base {
|
|||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@Override public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add_mid(doc.Src(), this.Src_bgn(), this.Src_end());}
|
@Override public void Print_as_json(Bry_bfr bfr, int depth) {
|
||||||
|
if (doc == null) {
|
||||||
|
bfr.Add_str_a7(Double_.To_str_loose(data.To_double()));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bfr.Add_mid(doc.Src(), src_bgn, src_end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Json_itm_decimal NewByDoc(Json_doc doc, int src_bgn, int src_end) {return new Json_itm_decimal(doc, src_bgn, src_end, null);}
|
||||||
|
public static Json_itm_decimal NewByVal(Decimal_adp val) {return new Json_itm_decimal(null, -1, -1, val);}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,21 +13,52 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Int_;
|
||||||
|
|
||||||
public class Json_itm_int extends Json_itm_base {
|
public class Json_itm_int extends Json_itm_base {
|
||||||
private final Json_doc doc;
|
private final Json_doc doc;
|
||||||
private byte[] data_bry; private int data; private boolean data_is_null = true;
|
private final int src_bgn, src_end;
|
||||||
public Json_itm_int(Json_doc doc, int src_bgn, int src_end) {this.Ctor(src_bgn, src_end); this.doc = doc;}
|
private byte[] data_bry;
|
||||||
|
private int data;
|
||||||
|
private boolean data_needs_making;
|
||||||
|
|
||||||
|
private Json_itm_int(Json_doc doc, int src_bgn, int src_end, boolean data_needs_making, int data) {
|
||||||
|
this.doc = doc;
|
||||||
|
this.src_bgn = src_bgn;
|
||||||
|
this.src_end = src_end;
|
||||||
|
this.data_needs_making = data_needs_making;
|
||||||
|
if (!data_needs_making)
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__int;}
|
@Override public byte Tid() {return Json_itm_.Tid__int;}
|
||||||
|
@Override public Object Data() {return Data_as_int();}
|
||||||
|
@Override public byte[] Data_bry() {
|
||||||
|
if (data_bry == null) {
|
||||||
|
data_bry = doc == null
|
||||||
|
? Int_.To_bry(data)
|
||||||
|
: Bry_.Mid(doc.Src(), src_bgn, src_end);
|
||||||
|
}
|
||||||
|
return data_bry;
|
||||||
|
}
|
||||||
public int Data_as_int() {
|
public int Data_as_int() {
|
||||||
if (data_is_null) {
|
if (data_needs_making) {
|
||||||
data = doc.Utl_num_parser().Parse(doc.Src(), Src_bgn(), Src_end()).Rv_as_int();
|
data = doc.Utl_num_parser().Parse(doc.Src(), src_bgn, src_end).Rv_as_int();
|
||||||
data_is_null = false;
|
data_needs_making = false;
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@Override public Object Data() {return Data_as_int();}
|
@Override public void Print_as_json(Bry_bfr bfr, int depth) {
|
||||||
@Override public byte[] Data_bry() {if (data_bry == null) data_bry = Bry_.Mid(doc.Src(), this.Src_bgn(), this.Src_end()); return data_bry;}
|
if (doc == null)
|
||||||
@Override public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add_mid(doc.Src(), this.Src_bgn(), this.Src_end());}
|
bfr.Add_int_variable(data);
|
||||||
public static Json_itm_int cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__int ? null : (Json_itm_int)v;}
|
else
|
||||||
|
bfr.Add_mid(doc.Src(), src_bgn, src_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Json_itm_int NewByDoc(Json_doc doc, int src_bgn, int src_end) {return new Json_itm_int(doc, src_bgn, src_end, true, -1);}
|
||||||
|
public static Json_itm_int NewByVal(int val) {return new Json_itm_int(null, -1, -1, false, val);}
|
||||||
|
public static Json_itm_int Cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__int ? null : (Json_itm_int)v;}
|
||||||
}
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,21 +13,51 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Long_;
|
||||||
|
|
||||||
public class Json_itm_long extends Json_itm_base {
|
public class Json_itm_long extends Json_itm_base {
|
||||||
private final Json_doc doc;
|
private final Json_doc doc;
|
||||||
private byte[] data_bry; private long data; private boolean data_is_null = true;
|
private final int src_bgn, src_end;
|
||||||
public Json_itm_long(Json_doc doc, int src_bgn, int src_end) {this.Ctor(src_bgn, src_end); this.doc = doc;}
|
private byte[] data_bry;
|
||||||
|
private long data;
|
||||||
|
private boolean data_needs_making = true;
|
||||||
|
private Json_itm_long(Json_doc doc, int src_bgn, int src_end, boolean data_needs_making, long data) {
|
||||||
|
this.doc = doc;
|
||||||
|
this.src_bgn = src_bgn;
|
||||||
|
this.src_end = src_end;
|
||||||
|
this.data_needs_making = data_needs_making;
|
||||||
|
if (!data_needs_making)
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__long;}
|
@Override public byte Tid() {return Json_itm_.Tid__long;}
|
||||||
|
@Override public Object Data() {return Data_as_long();}
|
||||||
|
@Override public byte[] Data_bry() {
|
||||||
|
if (data_bry == null) {
|
||||||
|
data_bry = doc == null
|
||||||
|
? Bry_.new_u8(Long_.To_str(data))
|
||||||
|
: Bry_.Mid(doc.Src(), src_bgn, src_end);
|
||||||
|
}
|
||||||
|
return data_bry;
|
||||||
|
}
|
||||||
public long Data_as_long() {
|
public long Data_as_long() {
|
||||||
if (data_is_null) {
|
if (data_needs_making) {
|
||||||
data = doc.Utl_num_parser().Parse(doc.Src(), Src_bgn(), Src_end()).Rv_as_long();
|
data = doc.Utl_num_parser().Parse(doc.Src(), src_bgn, src_end).Rv_as_long();
|
||||||
data_is_null = false;
|
data_needs_making = false;
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@Override public Object Data() {return Data_as_long();}
|
@Override public void Print_as_json(Bry_bfr bfr, int depth) {
|
||||||
@Override public byte[] Data_bry() {if (data_bry == null) data_bry = Bry_.Mid(doc.Src(), this.Src_bgn(), this.Src_end()); return data_bry;}
|
if (doc == null)
|
||||||
@Override public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add_mid(doc.Src(), this.Src_bgn(), this.Src_end());}
|
bfr.Add_long_variable(data);
|
||||||
public static Json_itm_long cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__long ? null : (Json_itm_long)v;}
|
else
|
||||||
|
bfr.Add_mid(doc.Src(), src_bgn, src_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Json_itm_long NewByDoc(Json_doc doc, int src_bgn, int src_end) {return new Json_itm_long(doc, src_bgn, src_end, true, -1);}
|
||||||
|
public static Json_itm_long NewByVal(long val) {return new Json_itm_long(null, -1, -1, false, val);}
|
||||||
|
public static Json_itm_long Cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__long ? null : (Json_itm_long)v;}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,38 +13,97 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
import gplx.core.intls.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.intls.Utf16_;
|
||||||
|
import gplx.langs.htmls.Gfh_utl;
|
||||||
|
|
||||||
public class Json_itm_str extends Json_itm_base {
|
public class Json_itm_str extends Json_itm_base {
|
||||||
private final boolean exact; private final Json_doc doc;
|
private final Json_doc doc;
|
||||||
private String data_str; private byte[] data_bry = null;
|
private final int src_bgn, src_end;
|
||||||
public Json_itm_str(Json_doc doc, int src_bgn, int src_end, boolean exact) {this.Ctor(src_bgn + 1, src_end - 1); this.doc = doc; this.exact = exact;}
|
private String data_str;
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__str;}
|
private byte[] data_bry;
|
||||||
@Override public void Print_as_json(Bry_bfr bfr, int depth) {
|
private boolean data_needs_making;
|
||||||
bfr.Add_byte(Byte_ascii.Quote);
|
private boolean escaped;
|
||||||
gplx.langs.htmls.Gfh_utl.Escape_html_to_bfr(bfr, doc.Src(), this.Src_bgn(), this.Src_end(), true, true, true, true, false); // false to apos for backwards compatibility
|
|
||||||
bfr.Add_byte(Byte_ascii.Quote);
|
private Json_itm_str(Json_doc doc, int src_bgn, int src_end, String data_str, boolean escaped) {
|
||||||
|
this.doc = doc;
|
||||||
|
this.src_bgn = src_bgn;
|
||||||
|
this.src_end = src_end;
|
||||||
|
this.data_str = data_str;
|
||||||
|
this.data_bry = null;
|
||||||
|
this.data_needs_making = true;
|
||||||
|
this.escaped = escaped;
|
||||||
}
|
}
|
||||||
|
@Override public byte Tid() {return Json_itm_.Tid__str;}
|
||||||
@Override public Object Data() {return this.Data_as_str();}
|
@Override public Object Data() {return this.Data_as_str();}
|
||||||
|
public void Overwrite_bry(byte[] v) {
|
||||||
|
this.data_bry = v; //needed by MapLink/MapFrame
|
||||||
|
this.data_needs_making = false;
|
||||||
|
}
|
||||||
|
@Override public byte[] Data_bry() {
|
||||||
|
if (data_bry == null) {
|
||||||
|
data_bry = Data_make_bry();
|
||||||
|
}
|
||||||
|
return data_bry;
|
||||||
|
}
|
||||||
public String Data_as_str() {
|
public String Data_as_str() {
|
||||||
if (data_str == null) {
|
if (data_str == null) {
|
||||||
if (data_bry == null)
|
|
||||||
data_bry = Data_make_bry();
|
data_bry = Data_make_bry();
|
||||||
data_str = String_.new_u8(data_bry);
|
data_str = String_.new_u8(data_bry);
|
||||||
}
|
}
|
||||||
return data_str;
|
return data_str;
|
||||||
}
|
}
|
||||||
@Override public byte[] Data_bry() {if (data_bry == null) data_bry = Data_make_bry(); return data_bry;}
|
|
||||||
@Override public boolean Data_eq(byte[] comp) {
|
@Override public boolean Data_eq(byte[] comp) {
|
||||||
if (exact) return Bry_.Eq(doc.Src(), this.Src_bgn(), this.Src_end(), comp);
|
return Bry_.Match(this.Data_bry(), comp);
|
||||||
if (data_bry == null) data_bry = Data_make_bry();
|
|
||||||
return Bry_.Match(data_bry, comp);
|
|
||||||
}
|
}
|
||||||
private byte[] Data_make_bry() {
|
private byte[] Data_make_bry() {
|
||||||
byte[] src = doc.Src(); int bgn = this.Src_bgn(), end = this.Src_end();
|
// data already made; return it;
|
||||||
if (exact) return Bry_.Mid(src, bgn, end);
|
if (!data_needs_making)
|
||||||
Bry_bfr bfr = doc.Bfr();
|
return data_bry;
|
||||||
byte[] utf8_bry = doc.Tmp_u8_bry();
|
|
||||||
|
// mark data as made
|
||||||
|
this.data_needs_making = false;
|
||||||
|
|
||||||
|
// get src, bgn, end, depending on whether or not itm is from jdoc or standalone
|
||||||
|
byte[] src;
|
||||||
|
int bgn;
|
||||||
|
int end;
|
||||||
|
if (doc == null) {
|
||||||
|
src = Bry_.new_u8_safe(this.data_str);
|
||||||
|
bgn = 0;
|
||||||
|
end = src == null ? 0 : src.length;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
src = doc.Src();
|
||||||
|
bgn = src_bgn;
|
||||||
|
end = src_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// not escaped -> return the src
|
||||||
|
if (!escaped) {
|
||||||
|
this.data_bry = Bry_.Mid(src, bgn, end);
|
||||||
|
return data_bry;
|
||||||
|
}
|
||||||
|
|
||||||
|
// escaped; get some temp vars
|
||||||
|
Bry_bfr bfr;
|
||||||
|
byte[] utf8_bry;
|
||||||
|
if (doc == null) {
|
||||||
|
bfr = Bry_bfr_.New();
|
||||||
|
utf8_bry = new byte[6];
|
||||||
|
}
|
||||||
|
else { // PERF:reuse bfr / bry on jdoc itself
|
||||||
|
bfr = doc.Bfr();
|
||||||
|
utf8_bry = doc.Tmp_u8_bry();
|
||||||
|
}
|
||||||
|
|
||||||
|
// loop and unescape
|
||||||
for (int i = bgn; i < end; i++) {
|
for (int i = bgn; i < end; i++) {
|
||||||
byte b = src[i];
|
byte b = src[i];
|
||||||
switch (b) {
|
switch (b) {
|
||||||
@ -90,6 +149,17 @@ public class Json_itm_str extends Json_itm_base {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bfr.To_bry_and_clear();
|
this.data_bry = bfr.To_bry_and_clear();
|
||||||
|
return data_bry;
|
||||||
}
|
}
|
||||||
|
@Override public void Print_as_json(Bry_bfr bfr, int depth) {
|
||||||
|
bfr.Add_byte(Byte_ascii.Quote);
|
||||||
|
byte[] data_bry = this.Data_bry();
|
||||||
|
int data_len = data_bry.length;
|
||||||
|
Gfh_utl.Escape_html_to_bfr(bfr, data_bry, 0, data_len, true, true, true, true, false); // false to apos for backwards compatibility
|
||||||
|
bfr.Add_byte(Byte_ascii.Quote);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Json_itm_str NewByDoc(Json_doc doc, int src_bgn, int src_end, boolean escaped) {return new Json_itm_str(doc, src_bgn + 1, src_end - 1, null, escaped);}
|
||||||
|
public static Json_itm_str NewByVal(String val) {return new Json_itm_str(null, -1, -1, val, false);}
|
||||||
}
|
}
|
@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
XOWA: the XOWA Offline Wiki Application
|
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
|
||||||
|
|
||||||
You may use XOWA according to either of these licenses as is most appropriate
|
|
||||||
for your project on a case-by-case basis.
|
|
||||||
|
|
||||||
The terms of each license can be found in the source code repository:
|
|
||||||
|
|
||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|
||||||
*/
|
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
|
||||||
public class Json_itm_tmp implements Json_itm { // TEST:
|
|
||||||
public Json_itm_tmp(byte tid, String data) {this.tid = tid; this.data = data;}
|
|
||||||
public byte Tid() {return tid;} private byte tid;
|
|
||||||
public byte[] Data_bry() {return Bry_.new_u8(Object_.Xto_str_strict_or_empty(data));}
|
|
||||||
public int Src_bgn() {return -1;}
|
|
||||||
public int Src_end() {return -1;}
|
|
||||||
public Object Data() {return data;} private String data;
|
|
||||||
public void Print_as_json(Bry_bfr bfr, int depth) {bfr.Add_str_u8(data);}
|
|
||||||
public boolean Data_eq(byte[] comp) {return false;}
|
|
||||||
public void Clear() {}
|
|
||||||
public static Json_itm new_str_(String v) {return new Json_itm_tmp(Json_itm_.Tid__str, "\"" + v + "\"");}
|
|
||||||
public static Json_itm new_int_(int v) {return new Json_itm_tmp(Json_itm_.Tid__int, Int_.To_str(v));}
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,7 +13,11 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
|
||||||
public class Json_kv extends Json_itm_base {
|
public class Json_kv extends Json_itm_base {
|
||||||
public Json_kv(Json_itm key, Json_itm val) {this.key = key; this.val = val;}
|
public Json_kv(Json_itm key, Json_itm val) {this.key = key; this.val = val;}
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__kv;}
|
@Override public byte Tid() {return Json_itm_.Tid__kv;}
|
||||||
@ -22,7 +26,7 @@ public class Json_kv extends Json_itm_base {
|
|||||||
public byte[] Key_as_bry() {return key.Data_bry();}
|
public byte[] Key_as_bry() {return key.Data_bry();}
|
||||||
public String Key_as_str() {return (String)key.Data();}
|
public String Key_as_str() {return (String)key.Data();}
|
||||||
public byte[] Val_as_bry() {return val.Data_bry();}
|
public byte[] Val_as_bry() {return val.Data_bry();}
|
||||||
public Json_nde Val_as_nde() {return Json_nde.cast(val);}
|
public Json_nde Val_as_nde() {return Json_nde.Cast(val);}
|
||||||
public Json_ary Val_as_ary() {return Json_ary.cast(val);}
|
public Json_ary Val_as_ary() {return Json_ary.cast(val);}
|
||||||
public boolean Key_eq(byte[] comp) {return ((Json_itm_str)key).Data_eq(comp);}
|
public boolean Key_eq(byte[] comp) {return ((Json_itm_str)key).Data_eq(comp);}
|
||||||
@Override public Object Data() {return null;}
|
@Override public Object Data() {return null;}
|
||||||
@ -33,5 +37,5 @@ public class Json_kv extends Json_itm_base {
|
|||||||
val.Print_as_json(bfr, depth);
|
val.Print_as_json(bfr, depth);
|
||||||
}
|
}
|
||||||
public static final Json_kv[] Ary_empty = new Json_kv[0];
|
public static final Json_kv[] Ary_empty = new Json_kv[0];
|
||||||
public static Json_kv cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__kv ? null : (Json_kv)v;}
|
public static Json_kv Cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__kv ? null : (Json_kv)v;}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,37 +13,42 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
import org.junit.*;
|
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Decimal_adp;
|
||||||
|
import gplx.Decimal_adp_;
|
||||||
|
import gplx.Keyval;
|
||||||
|
import gplx.Keyval_;
|
||||||
|
import gplx.Tfds;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class Json_kv_ary_srl_tst {
|
public class Json_kv_ary_srl_tst {
|
||||||
@Before public void init() {fxt.Clear();} private Json_kv_ary_srl_fxt fxt = new Json_kv_ary_srl_fxt();
|
private final Json_kv_ary_srl_fxt fxt = new Json_kv_ary_srl_fxt();
|
||||||
@Test public void Null() {fxt.Test_parse("{'k0':null}" , fxt.ary_(fxt.kv_str_("k0", null)));}
|
@Test public void Null() {fxt.Test_parse("{'k0':null}" , fxt.ary_(fxt.New_kv_str("k0", null)));}
|
||||||
@Test public void Bool_n() {fxt.Test_parse("{'k0':false}" , fxt.ary_(fxt.kv_bool_("k0", false)));}
|
@Test public void Bool_n() {fxt.Test_parse("{'k0':false}" , fxt.ary_(fxt.New_kv_bool("k0", false)));}
|
||||||
@Test public void Num() {fxt.Test_parse("{'k0':123}" , fxt.ary_(fxt.kv_int_("k0", 123)));}
|
@Test public void Num() {fxt.Test_parse("{'k0':123}" , fxt.ary_(fxt.New_kv_int("k0", 123)));}
|
||||||
@Test public void Num_exp() {fxt.Test_parse("{'k0':1.23e2}" , fxt.ary_(fxt.kv_int_("k0", 123)));} // exponent can be either "e" or "E" in JSON, but Java decimal parse only takes "E"; ISSUE#:565; DATE:2020-03-25
|
@Test public void Num_exp() {fxt.Test_parse("{'k0':1.23e2}" , fxt.ary_(fxt.New_kv_int("k0", 123)));} // exponent can be either "e" or "E" in JSON, but Java decimal parse only takes "E"; ISSUE#:565; DATE:2020-03-25
|
||||||
@Test public void Str() {fxt.Test_parse("{'k0':'v0'}" , fxt.ary_(fxt.kv_str_("k0", "v0")));}
|
@Test public void Str() {fxt.Test_parse("{'k0':'v0'}" , fxt.ary_(fxt.New_kv_str("k0", "v0")));}
|
||||||
@Test public void Num_dec() {fxt.Test_parse("{'k0':1.23}" , fxt.ary_(fxt.kv_dec_("k0", Decimal_adp_.parse("1.23"))));}
|
@Test public void Num_dec() {fxt.Test_parse("{'k0':1.23}" , fxt.ary_(fxt.New_kv_dec("k0", Decimal_adp_.parse("1.23"))));}
|
||||||
@Test public void Ary_int() {fxt.Test_parse("{'k0':[1,2,3]}" , fxt.ary_(fxt.kv_obj_("k0", fxt.ary_(fxt.kv_int_("1", 1), fxt.kv_int_("2", 2), fxt.kv_int_("3", 3)))));}
|
@Test public void Ary_int() {fxt.Test_parse("{'k0':[1,2,3]}" , fxt.ary_(fxt.New_kv_obj("k0", fxt.ary_(fxt.New_kv_int("1", 1), fxt.New_kv_int("2", 2), fxt.New_kv_int("3", 3)))));}
|
||||||
@Test public void Ary_empty() {fxt.Test_parse("{'k0':[]}" , fxt.ary_(fxt.kv_obj_("k0", fxt.ary_())));}
|
@Test public void Ary_empty() {fxt.Test_parse("{'k0':[]}" , fxt.ary_(fxt.New_kv_obj("k0", fxt.ary_())));}
|
||||||
@Test public void Subs_int() {fxt.Test_parse("{'k0':{'k00':1,'k01':2}}" , fxt.ary_(fxt.kv_obj_("k0", fxt.ary_(fxt.kv_int_("k00", 1), fxt.kv_int_("k01", 2)))));}
|
@Test public void Subs_int() {fxt.Test_parse("{'k0':{'k00':1,'k01':2}}" , fxt.ary_(fxt.New_kv_obj("k0", fxt.ary_(fxt.New_kv_int("k00", 1), fxt.New_kv_int("k01", 2)))));}
|
||||||
@Test public void Subs_empty() {fxt.Test_parse("{'k0':{}}" , fxt.ary_(fxt.kv_obj_("k0", fxt.ary_())));}
|
@Test public void Subs_empty() {fxt.Test_parse("{'k0':{}}" , fxt.ary_(fxt.New_kv_obj("k0", fxt.ary_())));}
|
||||||
}
|
}
|
||||||
class Json_kv_ary_srl_fxt {
|
class Json_kv_ary_srl_fxt {
|
||||||
public void Clear() {
|
private final Json_parser parser = new Json_parser();
|
||||||
if (parser == null) {
|
|
||||||
parser = new Json_parser();
|
|
||||||
}
|
|
||||||
} private Json_parser parser;
|
|
||||||
public void Test_parse(String raw_str, Keyval[] expd) {
|
public void Test_parse(String raw_str, Keyval[] expd) {
|
||||||
byte[] raw_bry = Json_parser_tst.Replace_apos(Bry_.new_u8(raw_str));
|
byte[] raw_bry = Bry_.new_u8(Json_doc.Make_str_by_apos(raw_str));
|
||||||
Json_doc doc = parser.Parse(raw_bry);
|
Json_doc doc = parser.Parse(raw_bry);
|
||||||
Keyval[] actl = Json_kv_ary_srl.Val_by_itm_nde(doc.Root_nde());
|
Keyval[] actl = Json_kv_ary_srl.Val_by_itm_nde(doc.Root_nde());
|
||||||
Tfds.Eq_str_lines(Keyval_.Ary_to_str(expd), Keyval_.Ary_to_str(actl));
|
Tfds.Eq_str_lines(Keyval_.Ary_to_str(expd), Keyval_.Ary_to_str(actl));
|
||||||
}
|
}
|
||||||
public Keyval[] ary_(Keyval... ary) {return ary;}
|
public Keyval[] ary_(Keyval... ary) {return ary;}
|
||||||
public Keyval kv_obj_(String key, Object val) {return Keyval_.new_(key, val);}
|
public Keyval New_kv_obj(String key, Object val) {return Keyval_.new_(key, val);}
|
||||||
public Keyval kv_str_(String key, String val) {return Keyval_.new_(key, val);}
|
public Keyval New_kv_str(String key, String val) {return Keyval_.new_(key, val);}
|
||||||
public Keyval kv_int_(String key, int val) {return Keyval_.new_(key, val);}
|
public Keyval New_kv_int(String key, int val) {return Keyval_.new_(key, val);}
|
||||||
public Keyval kv_bool_(String key, boolean val) {return Keyval_.new_(key, Bool_.To_str_lower(val));}
|
public Keyval New_kv_bool(String key, boolean val) {return Keyval_.new_(key, Bool_.To_str_lower(val));}
|
||||||
public Keyval kv_dec_(String key, Decimal_adp val) {return Keyval_.new_(key, val.To_str());}
|
public Keyval New_kv_dec(String key, Decimal_adp val) {return Keyval_.new_(key, val.To_str());}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,11 +13,33 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
|
|
||||||
|
import gplx.Array_;
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.DateAdp;
|
||||||
|
import gplx.DateAdp_;
|
||||||
|
import gplx.Decimal_adp_;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.Hash_adp_bry;
|
||||||
|
import gplx.Int_;
|
||||||
|
import gplx.Long_;
|
||||||
|
import gplx.String_;
|
||||||
|
|
||||||
public class Json_nde extends Json_itm_base implements Json_grp {
|
public class Json_nde extends Json_itm_base implements Json_grp {
|
||||||
private Json_itm[] subs = Json_itm_.Ary_empty; private int subs_len = 0, subs_max = 0;
|
private final int src_bgn;
|
||||||
|
private int src_end;
|
||||||
|
private Json_itm[] subs = Json_itm_.Ary_empty;
|
||||||
|
private int subs_len = 0, subs_max = 0;
|
||||||
private Hash_adp_bry subs_hash;
|
private Hash_adp_bry subs_hash;
|
||||||
public Json_nde(Json_doc jdoc, int src_bgn) {this.jdoc = jdoc; this.Ctor(src_bgn, -1);}
|
|
||||||
|
private Json_nde(Json_doc jdoc, int src_bgn) {
|
||||||
|
this.jdoc = jdoc;
|
||||||
|
this.src_bgn = src_bgn;
|
||||||
|
}
|
||||||
@Override public byte Tid() {return Json_itm_.Tid__nde;}
|
@Override public byte Tid() {return Json_itm_.Tid__nde;}
|
||||||
public Json_doc Doc() {return jdoc;} private final Json_doc jdoc;
|
public Json_doc Doc() {return jdoc;} private final Json_doc jdoc;
|
||||||
public void Src_end_(int v) {this.src_end = v;}
|
public void Src_end_(int v) {this.src_end = v;}
|
||||||
@ -25,15 +47,23 @@ public class Json_nde extends Json_itm_base implements Json_grp {
|
|||||||
@Override public byte[] Data_bry() {return null;}
|
@Override public byte[] Data_bry() {return null;}
|
||||||
public int Len() {return subs_len;}
|
public int Len() {return subs_len;}
|
||||||
public Json_itm Get_at(int i) {return subs[i];}
|
public Json_itm Get_at(int i) {return subs[i];}
|
||||||
|
public Json_itm Get_as_itm_or_null(String key) {return Get_as_itm_or_null(Bry_.new_u8(key));}
|
||||||
public Json_itm Get_as_itm_or_null(byte[] key) {if (subs_hash == null) subs_hash = subs_hash_init(); return (Json_itm)subs_hash.Get_by_bry(key);}
|
public Json_itm Get_as_itm_or_null(byte[] key) {if (subs_hash == null) subs_hash = subs_hash_init(); return (Json_itm)subs_hash.Get_by_bry(key);}
|
||||||
public Json_ary Get_as_ary(int idx) {return Json_ary.cast(Get_at(idx));}
|
public Json_ary Get_as_ary(int idx) {return Json_ary.cast(Get_at(idx));}
|
||||||
public Json_nde Get_as_nde(String key) {return Json_nde.cast(Get_as_itm_or_null(Bry_.new_u8(key)));}
|
public Json_nde Get_as_nde(String key) {return Json_nde.Cast(Get_as_itm_or_null(Bry_.new_u8(key)));}
|
||||||
public Json_nde Get_as_nde(int idx) {return Json_nde.cast(Get_at(idx));}
|
public Json_nde Get_as_nde(int idx) {return Json_nde.Cast(Get_at(idx));}
|
||||||
public Json_ary Get_as_ary(String key) {return Get_as_ary(Bry_.new_u8(key));}
|
public Json_ary Get_as_ary(String key) {return Get_as_ary(Bry_.new_u8(key));}
|
||||||
public Json_ary Get_as_ary(byte[] key) {
|
public Json_ary Get_as_ary(byte[] key) {
|
||||||
Json_itm rv = Get_as_itm_or_null(key); if (rv == null) throw Err_.new_("json", "key missing", "key", key);
|
Json_itm rv = Get_as_itm_or_null(key); if (rv == null) throw Err_.new_("json", "key missing", "key", key);
|
||||||
return Json_ary.cast(rv);
|
return Json_ary.cast(rv);
|
||||||
}
|
}
|
||||||
|
public Json_ary Get_as_ary_or_null(String key) {return Get_as_ary_or_null(Bry_.new_u8(key));}
|
||||||
|
public Json_ary Get_as_ary_or_null(byte[] key) {
|
||||||
|
Json_itm rv = Get_as_itm_or_null(key);
|
||||||
|
return rv == null
|
||||||
|
? null
|
||||||
|
: Json_ary.cast(rv);
|
||||||
|
}
|
||||||
public byte[] Get_as_bry(String key) {
|
public byte[] Get_as_bry(String key) {
|
||||||
byte[] rv = Get_as_bry_or(Bry_.new_u8(key), null); if (rv == null) throw Err_.new_("json", "key missing", "key", key);
|
byte[] rv = Get_as_bry_or(Bry_.new_u8(key), null); if (rv == null) throw Err_.new_("json", "key missing", "key", key);
|
||||||
return rv;
|
return rv;
|
||||||
@ -83,21 +113,25 @@ public class Json_nde extends Json_itm_base implements Json_grp {
|
|||||||
public boolean Has(byte[] key) {return Get_bry(key, null) != null;}
|
public boolean Has(byte[] key) {return Get_bry(key, null) != null;}
|
||||||
public Json_kv Get_at_as_kv(int i) {
|
public Json_kv Get_at_as_kv(int i) {
|
||||||
Json_itm rv_itm = Get_at(i);
|
Json_itm rv_itm = Get_at(i);
|
||||||
Json_kv rv = Json_kv.cast(rv_itm); if (rv == null) throw Err_.new_("json", "sub is not kv", "i", i, "src", Bry_.Mid(jdoc.Src(), this.Src_bgn(), src_end));
|
Json_kv rv = Json_kv.Cast(rv_itm);
|
||||||
|
if (rv == null) {
|
||||||
|
byte[] snip = jdoc == null ? Bry_.new_a7("no source") : Bry_.Mid(jdoc.Src(), src_bgn, src_end);
|
||||||
|
throw Err_.new_("json", "sub is not kv", "i", i, "src", snip);
|
||||||
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Json_kv Get_kv(byte[] key) {return Json_kv.cast(Get_itm(key));}
|
public Json_kv Get_kv(byte[] key) {return Json_kv.Cast(Get_itm(key));}
|
||||||
public Json_nde Get(String key) {return Get(Bry_.new_u8(key));}
|
public Json_nde Get(String key) {return Get(Bry_.new_u8(key));}
|
||||||
public Json_nde Get(byte[] key) {
|
public Json_nde Get(byte[] key) {
|
||||||
Json_kv kv = Json_kv.cast(this.Get_itm(key)); if (kv == null) throw Err_.new_("json", "kv not found", "key", key);
|
Json_kv kv = Json_kv.Cast(this.Get_itm(key)); if (kv == null) throw Err_.new_("json", "kv not found", "key", key);
|
||||||
Json_nde rv = Json_nde.cast(kv.Val()); if (rv == null) throw Err_.new_("json", "nde not found", "key", key);
|
Json_nde rv = Json_nde.Cast(kv.Val()); if (rv == null) throw Err_.new_("json", "nde not found", "key", key);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
public Json_itm Get_itm(byte[] key) {
|
public Json_itm Get_itm(byte[] key) {
|
||||||
for (int i = 0; i < subs_len; i++) {
|
for (int i = 0; i < subs_len; i++) {
|
||||||
Json_itm itm = subs[i];
|
Json_itm itm = subs[i];
|
||||||
if (itm.Tid() == Json_itm_.Tid__kv) {
|
if (itm != null && itm.Tid() == Json_itm_.Tid__kv) {
|
||||||
Json_kv itm_as_kv = (Json_kv)itm;
|
Json_kv itm_as_kv = (Json_kv)itm;
|
||||||
if (Bry_.Eq(key, itm_as_kv.Key().Data_bry()))
|
if (Bry_.Eq(key, itm_as_kv.Key().Data_bry()))
|
||||||
return itm;
|
return itm;
|
||||||
@ -122,6 +156,17 @@ public class Json_nde extends Json_itm_base implements Json_grp {
|
|||||||
Json_itm val = kv.Val();
|
Json_itm val = kv.Val();
|
||||||
return (val == null) ? or : val.Data_bry();
|
return (val == null) ? or : val.Data_bry();
|
||||||
}
|
}
|
||||||
|
public void AddKvBool(String key, boolean val) {AddKv(key, Json_itm_bool.Get(val));}
|
||||||
|
public void AddKvInt(String key, int val) {AddKv(key, Json_itm_int.NewByVal(val));}
|
||||||
|
public void AddKvDouble(String key, double val) {AddKv(key, Json_itm_decimal.NewByVal(Decimal_adp_.double_(val)));}
|
||||||
|
public void AddKvStr(String key, byte[] val) {AddKv(key, Json_itm_str.NewByVal(String_.new_u8(val)));}
|
||||||
|
public void AddKvStr(String key, String val) {AddKv(key, Json_itm_str.NewByVal(val));}
|
||||||
|
public void AddKvNde(String key, Json_nde val) {AddKv(key, val);}
|
||||||
|
public void AddKvAry(String key, Json_ary val) {AddKv(key, val);}
|
||||||
|
private void AddKv(String key, Json_itm val) {
|
||||||
|
Json_kv rv = new Json_kv(Json_itm_str.NewByVal(key), val);
|
||||||
|
Add(rv);
|
||||||
|
}
|
||||||
public Json_nde Add_many(Json_itm... ary) {
|
public Json_nde Add_many(Json_itm... ary) {
|
||||||
int len = ary.length;
|
int len = ary.length;
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++)
|
||||||
@ -165,5 +210,8 @@ public class Json_nde extends Json_itm_base implements Json_grp {
|
|||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
public static Json_nde cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__nde ? null : (Json_nde)v;}
|
|
||||||
|
public static Json_nde NewByDoc(Json_doc doc, int src_bgn) {return new Json_nde(doc, src_bgn);}
|
||||||
|
public static Json_nde NewByVal() {return new Json_nde(null, -1);}
|
||||||
|
public static Json_nde Cast(Json_itm v) {return v == null || v.Tid() != Json_itm_.Tid__nde ? null : (Json_nde)v;}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,16 +13,26 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
import gplx.core.primitives.*;
|
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Char_;
|
||||||
|
import gplx.Err;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.Int_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.primitives.Gfo_number_parser;
|
||||||
|
|
||||||
public class Json_parser {
|
public class Json_parser {
|
||||||
private byte[] src; private int src_len, pos; private final Gfo_number_parser num_parser = new Gfo_number_parser();
|
private byte[] src;
|
||||||
public Json_factory Factory() {return factory;} private final Json_factory factory = new Json_factory();
|
private int src_len, pos;
|
||||||
|
private final Gfo_number_parser num_parser = new Gfo_number_parser();
|
||||||
public Json_doc Parse_by_apos_ary(String... ary) {return Parse_by_apos(String_.Concat_lines_nl(ary));}
|
public Json_doc Parse_by_apos_ary(String... ary) {return Parse_by_apos(String_.Concat_lines_nl(ary));}
|
||||||
public Json_doc Parse_by_apos(String s) {return Parse(Bry_.Replace(Bry_.new_u8(s), Byte_ascii.Apos, Byte_ascii.Quote));}
|
public Json_doc Parse_by_apos(String s) {return Parse(Bry_.Replace(Bry_.new_u8(s), Byte_ascii.Apos, Byte_ascii.Quote));}
|
||||||
public Json_doc Parse(String src) {return Parse(Bry_.new_u8(src));}
|
public Json_doc Parse(String src) {return Parse(Bry_.new_u8(src));}
|
||||||
public Json_doc Parse(byte[] src) {
|
public Json_doc Parse(byte[] src) {
|
||||||
synchronized (factory) {
|
|
||||||
this.src = src; if (src == null) return null;
|
this.src = src; if (src == null) return null;
|
||||||
this.src_len = src.length; if (src_len == 0) return null;
|
this.src_len = src.length; if (src_len == 0) return null;
|
||||||
this.pos = 0;
|
this.pos = 0;
|
||||||
@ -43,10 +53,9 @@ public class Json_parser {
|
|||||||
doc.Ctor(src, root);
|
doc.Ctor(src, root);
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
private Json_nde Make_nde(Json_doc doc) {
|
private Json_nde Make_nde(Json_doc doc) {
|
||||||
++pos; // brack_bgn
|
++pos; // brack_bgn
|
||||||
Json_nde nde = new Json_nde(doc, pos);
|
Json_nde nde = Json_nde.NewByDoc(doc, pos);
|
||||||
while (pos < src_len) {
|
while (pos < src_len) {
|
||||||
Skip_ws();
|
Skip_ws();
|
||||||
if (src[pos] == Byte_ascii.Curly_end) {++pos; return nde;}
|
if (src[pos] == Byte_ascii.Curly_end) {++pos; return nde;}
|
||||||
@ -72,9 +81,9 @@ public class Json_parser {
|
|||||||
while (pos < src_len) {
|
while (pos < src_len) {
|
||||||
byte b = src[pos];
|
byte b = src[pos];
|
||||||
switch (b) {
|
switch (b) {
|
||||||
case Byte_ascii.Ltr_n: return Make_literal(Bry_null_ull , 3, factory.Null());
|
case Byte_ascii.Ltr_n: return Make_literal(Bry_null_ull , 3, Json_itm_null.Null);
|
||||||
case Byte_ascii.Ltr_f: return Make_literal(Bry_bool_alse , 4, factory.Bool_n());
|
case Byte_ascii.Ltr_f: return Make_literal(Bry_bool_alse , 4, Json_itm_bool.Bool_n);
|
||||||
case Byte_ascii.Ltr_t: return Make_literal(Bry_bool_rue , 3, factory.Bool_y());
|
case Byte_ascii.Ltr_t: return Make_literal(Bry_bool_rue , 3, Json_itm_bool.Bool_y);
|
||||||
case Byte_ascii.Quote: return Make_string(doc);
|
case Byte_ascii.Quote: return Make_string(doc);
|
||||||
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
||||||
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
|
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
|
||||||
@ -97,7 +106,7 @@ public class Json_parser {
|
|||||||
}
|
}
|
||||||
private Json_itm Make_string(Json_doc doc) {
|
private Json_itm Make_string(Json_doc doc) {
|
||||||
int bgn = pos++; // ++: quote_bgn
|
int bgn = pos++; // ++: quote_bgn
|
||||||
boolean exact = true;
|
boolean escaped = false;
|
||||||
while (pos < src_len) {
|
while (pos < src_len) {
|
||||||
switch (src[pos]) {
|
switch (src[pos]) {
|
||||||
case Byte_ascii.Backslash:
|
case Byte_ascii.Backslash:
|
||||||
@ -106,10 +115,10 @@ public class Json_parser {
|
|||||||
case Byte_ascii.Ltr_u: pos += 5; break; // \uFFFF 1 u + 4 hex-dec; ISSUE#:486; DATE:2019-06-02
|
case Byte_ascii.Ltr_u: pos += 5; break; // \uFFFF 1 u + 4 hex-dec; ISSUE#:486; DATE:2019-06-02
|
||||||
default: ++pos; break; // \? " \ / b f n r t
|
default: ++pos; break; // \? " \ / b f n r t
|
||||||
}
|
}
|
||||||
exact = false;
|
escaped = true;
|
||||||
break;
|
break;
|
||||||
case Byte_ascii.Quote:
|
case Byte_ascii.Quote:
|
||||||
return factory.Str(doc, bgn, ++pos, exact); // ++: quote_end
|
return Json_itm_str.NewByDoc(doc, bgn, ++pos, escaped); // ++: quote_end
|
||||||
default:
|
default:
|
||||||
++pos;
|
++pos;
|
||||||
break;
|
break;
|
||||||
@ -139,16 +148,16 @@ public class Json_parser {
|
|||||||
}
|
}
|
||||||
num_parser.Parse(src, num_bgn, pos);
|
num_parser.Parse(src, num_bgn, pos);
|
||||||
if (num_parser.Has_frac())
|
if (num_parser.Has_frac())
|
||||||
return factory.Decimal(doc, num_bgn, pos);
|
return Json_itm_decimal.NewByDoc(doc, num_bgn, pos);
|
||||||
else {
|
else {
|
||||||
if (num_parser.Is_int())
|
if (num_parser.Is_int())
|
||||||
return factory.Int(doc, num_bgn, pos);
|
return Json_itm_int.NewByDoc(doc, num_bgn, pos);
|
||||||
else
|
else
|
||||||
return factory.Long(doc, num_bgn, pos);
|
return Json_itm_long.NewByDoc(doc, num_bgn, pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private Json_ary Make_ary(Json_doc doc) {
|
private Json_ary Make_ary(Json_doc doc) {
|
||||||
Json_ary rv = factory.Ary(pos++, pos); // brack_bgn
|
Json_ary rv = Json_ary.NewByDoc(doc, pos++, pos); // brack_bgn
|
||||||
while (pos < src_len) {
|
while (pos < src_len) {
|
||||||
Skip_ws();
|
Skip_ws();
|
||||||
if (src[pos] == Byte_ascii.Brack_end) {++pos; return rv;}
|
if (src[pos] == Byte_ascii.Brack_end) {++pos; return rv;}
|
||||||
@ -181,4 +190,8 @@ public class Json_parser {
|
|||||||
return Err_.new_wo_type(msg);
|
return Err_.new_wo_type(msg);
|
||||||
}
|
}
|
||||||
private static final byte[] Bry_bool_rue = Bry_.new_a7("rue"), Bry_bool_alse = Bry_.new_a7("alse"), Bry_null_ull = Bry_.new_a7("ull");
|
private static final byte[] Bry_bool_rue = Bry_.new_a7("rue"), Bry_bool_alse = Bry_.new_a7("alse"), Bry_null_ull = Bry_.new_a7("ull");
|
||||||
|
public static Json_doc ParseToJdoc(String src) {
|
||||||
|
Json_parser parser = new Json_parser();
|
||||||
|
return parser.Parse(src);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,13 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
import gplx.core.primitives.*;
|
|
||||||
|
import gplx.Keyval_;
|
||||||
|
import gplx.Ordered_hash;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.primitives.Int_obj_val;
|
||||||
|
|
||||||
public class Json_parser__list_nde__base extends Json_parser__itm__base {
|
public class Json_parser__list_nde__base extends Json_parser__itm__base {
|
||||||
public void Parse_grp(String context, Json_grp grp) {
|
public void Parse_grp(String context, Json_grp grp) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
@ -22,11 +27,11 @@ public class Json_parser__list_nde__base extends Json_parser__itm__base {
|
|||||||
for (int i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
Json_nde sub = null;
|
Json_nde sub = null;
|
||||||
if (grp.Tid() == Json_itm_.Tid__nde) {
|
if (grp.Tid() == Json_itm_.Tid__nde) {
|
||||||
Json_kv kv = Json_nde.cast(grp).Get_at_as_kv(i);
|
Json_kv kv = Json_nde.Cast(grp).Get_at_as_kv(i);
|
||||||
sub = kv.Val_as_nde();
|
sub = kv.Val_as_nde();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sub = Json_nde.cast(grp.Get_at(i));
|
sub = Json_nde.Cast(grp.Get_at(i));
|
||||||
}
|
}
|
||||||
Parse_nde(context, sub);
|
Parse_nde(context, sub);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,83 +13,92 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.jsons; import gplx.*; import gplx.langs.*;
|
package gplx.langs.jsons;
|
||||||
import org.junit.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Decimal_adp;
|
||||||
|
import gplx.Decimal_adp_;
|
||||||
|
import gplx.Tfds;
|
||||||
|
import gplx.core.tests.Gftest;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class Json_parser_tst {
|
public class Json_parser_tst {
|
||||||
private final Json_parser_fxt fxt = new Json_parser_fxt();
|
private final Json_parser_fxt fxt = new Json_parser_fxt();
|
||||||
@Before public void init() {fxt.Clear();}
|
@Test public void Null() {fxt.Test_parse_obj("{'k0':null}" , null);}
|
||||||
@Test public void Null() {fxt.Test_parse_val0("{'k0':null}" , null);}
|
@Test public void Bool_n() {fxt.Test_parse_obj("{'k0':false}" , false);}
|
||||||
@Test public void Bool_n() {fxt.Test_parse_val0("{'k0':false}" , false);}
|
@Test public void Bool_y() {fxt.Test_parse_obj("{'k0':true}" , true);}
|
||||||
@Test public void Bool_y() {fxt.Test_parse_val0("{'k0':true}" , true);}
|
@Test public void Num() {fxt.Test_parse_obj("{'k0':123}" , 123);}
|
||||||
@Test public void Num() {fxt.Test_parse_val0("{'k0':123}" , 123);}
|
@Test public void Num_neg() {fxt.Test_parse_obj("{'k0':-123}" , -123);}
|
||||||
@Test public void Num_neg() {fxt.Test_parse_val0("{'k0':-123}" , -123);}
|
@Test public void Str() {fxt.Test_parse_obj("{'k0':'v0'}" , "v0");}
|
||||||
@Test public void Str() {fxt.Test_parse_val0("{'k0':'v0'}" , "v0");}
|
@Test public void Str_esc_quote() {fxt.Test_parse_obj("{'k0':'a\\\"b'}" , "a\"b");}
|
||||||
@Test public void Str_esc_quote() {fxt.Test_parse_val0("{'k0':'a\\\"b'}" , "a\"b");}
|
@Test public void Str_encoded_basic() {fxt.Test_parse_obj("{'k0':'a\\u0021b'}" , "a!b");}
|
||||||
@Test public void Str_encoded_basic() {fxt.Test_parse_val0("{'k0':'a\\u0021b'}" , "a!b");}
|
@Test public void Str_encoded_surrogate() {fxt.Test_parse_obj("{'k0':'a\\ud83c\\udf0eb'}", "a🌎b");} // check for UTF surrogate-pairs; symbol is earth globe americas (U+1F30E); ISSUE#:487; DATE:2019-06-02
|
||||||
@Test public void Str_encoded_surrogate() {fxt.Test_parse_val0("{'k0':'a\\ud83c\\udf0eb'}", "a🌎b");} // check for UTF surrogate-pairs; symbol is earth globe americas (U+1F30E); ISSUE#:487; DATE:2019-06-02
|
@Test public void Num_dec() {fxt.Test_parse_dec("{'k0':1.23}" , Decimal_adp_.parse("1.23"));}
|
||||||
@Test public void Num_dec() {fxt.Test_parse("{'k0':1.23}" , fxt.itm_nde_().Add_many(fxt.itm_kv_dec_("k0", "1.23")));}
|
@Test public void Num_exp() {fxt.Test_parse_obj("{'k0':1e+2}" , 100);}
|
||||||
@Test public void Num_exp() {fxt.Test_parse("{'k0':1e+2}" , fxt.itm_nde_().Add_many(fxt.itm_kv_dec_("k0", "1e+2")));}
|
@Test public void Num_mix() {fxt.Test_parse_dec("{'k0':-1.23e-1}" , Decimal_adp_.parse("-1.23e-1"));}
|
||||||
@Test public void Num_mix() {fxt.Test_parse("{'k0':-1.23e-1}" , fxt.itm_nde_().Add_many(fxt.itm_kv_dec_("k0", "-1.23e-1")));}
|
@Test public void Str_many() {fxt.Test_parse("{'k0':'v0','k1':'v1','k2':'v2'}" , fxt.Init_nde().Add_many(fxt.Init_kv("k0", "v0"), fxt.Init_kv("k1", "v1"), fxt.Init_kv("k2", "v2")));}
|
||||||
@Test public void Str_many() {fxt.Test_parse("{'k0':'v0','k1':'v1','k2':'v2'}", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", "v0"), fxt.itm_kv_("k1", "v1"), fxt.itm_kv_("k2", "v2")));}
|
@Test public void Ary_empty() {fxt.Test_parse("{'k0':[]}" , fxt.Init_nde().Add_many(fxt.Init_kv_ary_int("k0")));}
|
||||||
@Test public void Ary_empty() {fxt.Test_parse("{'k0':[]}", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_int_("k0")));}
|
@Test public void Ary_int() {fxt.Test_parse("{'k0':[1,2,3]}" , fxt.Init_nde().Add_many(fxt.Init_kv_ary_int("k0", 1, 2, 3)));}
|
||||||
@Test public void Ary_int() {fxt.Test_parse("{'k0':[1,2,3]}", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_int_("k0", 1, 2, 3)));}
|
@Test public void Ary_str() {fxt.Test_parse("{'k0':['a','b','c']}" , fxt.Init_nde().Add_many(fxt.Init_kvary_str_("k0", "a", "b", "c")));}
|
||||||
@Test public void Ary_str() {fxt.Test_parse("{'k0':['a','b','c']}", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_str_("k0", "a", "b", "c")));}
|
@Test public void Ary_ws() {fxt.Test_parse("{'k0': [ 1 , 2 , 3 ] }" , fxt.Init_nde().Add_many(fxt.Init_kv_ary_int("k0", 1, 2, 3)));}
|
||||||
@Test public void Ary_ws() {fxt.Test_parse("{'k0': [ 1 , 2 , 3 ] }", fxt.itm_nde_().Add_many(fxt.itm_kv_ary_int_("k0", 1, 2, 3)));}
|
@Test public void Subs_int() {fxt.Test_parse("{'k0':{'k00':1}}" , fxt.Init_nde().Add_many(fxt.Init_kv("k0", fxt.Init_nde().Add_many(fxt.Init_kv("k00", 1)))));}
|
||||||
@Test public void Subs_int() {fxt.Test_parse("{'k0':{'k00':1}}", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", fxt.itm_nde_().Add_many(fxt.itm_kv_("k00", 1)))));}
|
@Test public void Subs_empty() {fxt.Test_parse("{'k0':{}}" , fxt.Init_nde().Add_many(fxt.Init_kv("k0", fxt.Init_nde())));}
|
||||||
@Test public void Subs_empty() {fxt.Test_parse("{'k0':{}}", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", fxt.itm_nde_())));}
|
@Test public void Subs_ws() {fxt.Test_parse("{'k0': { 'k00' : 1 } }" , fxt.Init_nde().Add_many(fxt.Init_kv("k0", fxt.Init_nde().Add_many(fxt.Init_kv("k00", 1)))));}
|
||||||
@Test public void Subs_ws() {fxt.Test_parse("{'k0': { 'k00' : 1 } }", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", fxt.itm_nde_().Add_many(fxt.itm_kv_("k00", 1)))));}
|
@Test public void Ws() {fxt.Test_parse(" { 'k0' : 'v0' } " , fxt.Init_nde().Add_many(fxt.Init_kv("k0", "v0")));}
|
||||||
@Test public void Ws() {fxt.Test_parse(" { 'k0' : 'v0' } ", fxt.itm_nde_().Add_many(fxt.itm_kv_("k0", "v0")));}
|
@Test public void Root_is_ary() {fxt.Test_parse("[1,2,3]" , fxt.Init_ary().Add_many(fxt.Init_int(1), fxt.Init_int(2), fxt.Init_int(3)));}
|
||||||
@Test public void Root_is_ary() {fxt.Test_parse("[ 1 , 2 , 3 ]", fxt.itm_ary_().Add_many(fxt.itm_int_(1), fxt.itm_int_(2), fxt.itm_int_(3)));}
|
|
||||||
public static String Replace_apos_as_str(String v) {return String_.new_u8(Replace_apos(Bry_.new_u8(v)));}
|
|
||||||
public static byte[] Replace_apos(byte[] v) {return Bry_.Replace(v, Byte_ascii.Apos, Byte_ascii.Quote);}
|
|
||||||
}
|
}
|
||||||
class Json_parser_fxt {
|
class Json_parser_fxt {
|
||||||
public void Clear() {
|
private final Json_parser parser = new Json_parser();
|
||||||
if (parser == null) {
|
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
||||||
parser = new Json_parser();
|
public Json_itm Init_int(int v) {return Json_itm_int.NewByVal(v);}
|
||||||
factory = parser.Factory();
|
public Json_itm Init_str(String v) {return Json_itm_str.NewByVal(v);}
|
||||||
}
|
public Json_ary Init_ary() {return Json_ary.NewByVal();}
|
||||||
} Json_parser parser; Json_factory factory; Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
public Json_nde Init_nde() {return Json_nde.NewByVal();}
|
||||||
public Json_itm itm_int_(int v) {return Json_itm_tmp.new_int_(v);}
|
public Json_kv Init_kv_null(String k) {return new Json_kv(Init_str(k), Json_itm_null.Null);}
|
||||||
Json_itm itm_str_(String v) {return Json_itm_tmp.new_str_(v);}
|
public Json_kv Init_kv(String k, String v) {return new Json_kv(Init_str(k), Init_str(v));}
|
||||||
public Json_ary itm_ary_() {return factory.Ary(-1, -1);}
|
public Json_kv Init_kv(String k, int v) {return new Json_kv(Init_str(k), Init_int(v));}
|
||||||
public Json_nde itm_nde_() {return factory.Nde(null, -1);}
|
public Json_kv Init_kv(String k, boolean v) {return new Json_kv(Init_str(k), v ? Json_itm_bool.Bool_y : Json_itm_bool.Bool_n);}
|
||||||
public Json_kv itm_kv_null_(String k) {return factory.Kv(itm_str_(k), factory.Null());}
|
public Json_kv Init_kv(String k, Json_nde v) {return new Json_kv(Init_str(k), v);}
|
||||||
public Json_kv itm_kv_(String k, String v) {return factory.Kv(itm_str_(k), itm_str_(v));}
|
public Json_kv Init_kv_ary_int(String k, int... v) {
|
||||||
public Json_kv itm_kv_(String k, int v) {return factory.Kv(itm_str_(k), itm_int_(v));}
|
Json_ary ary = Json_ary.NewByVal();
|
||||||
public Json_kv itm_kv_(String k, boolean v) {return factory.Kv(itm_str_(k), v ? factory.Bool_y() : factory.Bool_n());}
|
|
||||||
public Json_kv itm_kv_dec_(String k, String v) {return factory.Kv(itm_str_(k), new Json_itm_tmp(Json_itm_.Tid__decimal, v));}
|
|
||||||
public Json_kv itm_kv_(String k, Json_nde v) {return factory.Kv(itm_str_(k), v);}
|
|
||||||
public Json_kv itm_kv_ary_int_(String k, int... v) {
|
|
||||||
Json_ary ary = factory.Ary(-1, -1);
|
|
||||||
int len = v.length;
|
int len = v.length;
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++)
|
||||||
ary.Add(itm_int_(v[i]));
|
ary.Add(Init_int(v[i]));
|
||||||
return factory.Kv(itm_str_(k), ary);
|
return new Json_kv(Init_str(k), ary);
|
||||||
}
|
}
|
||||||
public Json_kv itm_kv_ary_str_(String k, String... v) {
|
public Json_kv Init_kvary_str_(String k, String... v) {
|
||||||
Json_ary ary = factory.Ary(-1, -1);
|
Json_ary ary = Json_ary.NewByVal();
|
||||||
int len = v.length;
|
int len = v.length;
|
||||||
for (int i = 0; i < len; i++)
|
for (int i = 0; i < len; i++)
|
||||||
ary.Add(itm_str_(v[i]));
|
ary.Add(Init_str(v[i]));
|
||||||
return factory.Kv(itm_str_(k), ary);
|
return new Json_kv(Init_str(k), ary);
|
||||||
}
|
}
|
||||||
public void Test_parse(String raw_str, Json_itm... expd_ary) {
|
public void Test_parse(String raw_str, Json_itm... expd_ary) {
|
||||||
byte[] raw = Json_parser_tst.Replace_apos(Bry_.new_u8(raw_str));
|
byte[] raw = Bry_.new_u8(Json_doc.Make_str_by_apos(raw_str));
|
||||||
Json_doc doc = parser.Parse(raw);
|
Json_doc doc = parser.Parse(raw);
|
||||||
doc.Root_grp().Print_as_json(tmp_bfr, 0);
|
doc.Root_grp().Print_as_json(tmp_bfr, 0);
|
||||||
String actl = tmp_bfr.To_str_and_clear();
|
String actl = tmp_bfr.To_str_and_clear();
|
||||||
String expd = Xto_str(raw, doc, expd_ary, 0, expd_ary.length);
|
String expd = Xto_str(raw, doc, expd_ary, 0, expd_ary.length);
|
||||||
Tfds.Eq_str_lines(expd, actl, actl);
|
Tfds.Eq_str_lines(expd, actl, actl);
|
||||||
}
|
}
|
||||||
public void Test_parse_val0(String raw_str, Object expd) {
|
public void Test_parse_obj(String raw_str, Object expd) {
|
||||||
byte[] raw = Json_parser_tst.Replace_apos(Bry_.new_u8(raw_str));
|
Json_kv kv = Parse_and_get_kv0(raw_str);
|
||||||
Json_doc doc = parser.Parse(raw);
|
|
||||||
Json_kv kv = Json_kv.cast(doc.Root_nde().Get_at(0)); // assume root has kv as first sub; EX: {"a":"b"}
|
|
||||||
Object actl = kv.Val().Data(); // NOTE: Data_bry is escaped val; EX: a\"b has DataBry of a"b
|
Object actl = kv.Val().Data(); // NOTE: Data_bry is escaped val; EX: a\"b has DataBry of a"b
|
||||||
Tfds.Eq(expd, actl);
|
Gftest.Eq__obj_or_null(expd, actl);
|
||||||
}
|
}
|
||||||
String Xto_str(byte[] raw, Json_doc doc, Json_itm[] ary, int bgn, int end) {
|
public void Test_parse_dec(String raw_str, Decimal_adp expd) {
|
||||||
|
Json_kv kv = Parse_and_get_kv0(raw_str);
|
||||||
|
Json_itm_decimal decimal_itm = (Json_itm_decimal)kv.Val();
|
||||||
|
Gftest.Eq__bool(true, decimal_itm.Data_as_decimal().Eq(expd));
|
||||||
|
}
|
||||||
|
private Json_kv Parse_and_get_kv0(String raw_str) {
|
||||||
|
byte[] raw = Bry_.new_u8(Json_doc.Make_str_by_apos(raw_str));
|
||||||
|
Json_doc doc = parser.Parse(raw);
|
||||||
|
return Json_kv.Cast(doc.Root_nde().Get_at(0)); // assume root has kv as first sub; EX: {"a":"b"}
|
||||||
|
}
|
||||||
|
private String Xto_str(byte[] raw, Json_doc doc, Json_itm[] ary, int bgn, int end) {
|
||||||
for (int i = bgn; i < end; i++) {
|
for (int i = bgn; i < end; i++) {
|
||||||
Json_itm itm = ary[i];
|
Json_itm itm = ary[i];
|
||||||
itm.Print_as_json(tmp_bfr, 0);
|
itm.Print_as_json(tmp_bfr, 0);
|
||||||
|
112
400_xowa/src/gplx/langs/mustaches/JsonMustacheNde.java
Normal file
112
400_xowa/src/gplx/langs/mustaches/JsonMustacheNde.java
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.langs.mustaches;
|
||||||
|
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.langs.jsons.Json_ary;
|
||||||
|
import gplx.langs.jsons.Json_itm;
|
||||||
|
import gplx.langs.jsons.Json_itm_;
|
||||||
|
import gplx.langs.jsons.Json_kv;
|
||||||
|
import gplx.langs.jsons.Json_nde;
|
||||||
|
import gplx.objects.Object_;
|
||||||
|
|
||||||
|
public class JsonMustacheNde implements Mustache_doc_itm {
|
||||||
|
private final Json_nde nde;
|
||||||
|
public JsonMustacheNde(Json_nde nde) {this.nde = nde;}
|
||||||
|
public boolean Mustache__write(String key, Mustache_bfr bfr) {
|
||||||
|
Json_itm itm = nde.Get_itm(Bry_.new_u8(key));
|
||||||
|
if (itm == null) { // mustacheKey does not exist in current jsonNde
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else { // mustacheKey exists
|
||||||
|
switch (itm.Tid()) {
|
||||||
|
// array / bool node -> ignore; EX: `{{#person}}Never shown{{/person}}`
|
||||||
|
case Json_itm_.Tid__bool:
|
||||||
|
case Json_itm_.Tid__ary:
|
||||||
|
case Json_itm_.Tid__nde:
|
||||||
|
return false;
|
||||||
|
// item node -> render it; EX: `Hello {{name}}`
|
||||||
|
default:
|
||||||
|
bfr.Add_bry(Json_kv.Cast(itm).Val_as_bry());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Mustache_doc_itm[] Mustache__subs(String key) {
|
||||||
|
Json_itm itm = nde.Get_itm(Bry_.new_u8(key));
|
||||||
|
if (itm == null) { // mustacheKey does not exist in current jsonNde
|
||||||
|
return Mustache_doc_itm_.Ary__bool__n;
|
||||||
|
}
|
||||||
|
else { // mustacheKey exists
|
||||||
|
if (itm.Tid() == Json_itm_.Tid__kv) {
|
||||||
|
Json_kv kv = Json_kv.Cast(itm);
|
||||||
|
switch (kv.Val().Tid()) {
|
||||||
|
// bool node -> render; EX: `{{#person}}Never shown{{/person}}`
|
||||||
|
case Json_itm_.Tid__bool:
|
||||||
|
boolean dataVal = Bool_.Cast(kv.Val().Data());
|
||||||
|
return dataVal ? Mustache_doc_itm_.Ary__bool__y : Mustache_doc_itm_.Ary__bool__n;
|
||||||
|
// array node -> render; EX: `{{#repo}} <b>{{name}}</b>{{/repo}}`
|
||||||
|
case Json_itm_.Tid__ary:
|
||||||
|
return ToJsonMustachNdeAry(itm);
|
||||||
|
// item node -> render only if key matchers
|
||||||
|
default:
|
||||||
|
return new Mustache_doc_itm[] {new JsonMustacheVal(true, key, kv.Val().Data())};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return Mustache_doc_itm_.Ary__bool__n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static Mustache_doc_itm[] ToJsonMustachNdeAry(Json_itm itm) {
|
||||||
|
Json_ary dataAry = Json_ary.cast_or_null(Json_kv.Cast(itm).Val());
|
||||||
|
int subs_len = dataAry.Len();
|
||||||
|
Mustache_doc_itm[] rv = new Mustache_doc_itm[subs_len];
|
||||||
|
for (int i = 0; i < subs_len; i++) {
|
||||||
|
Json_itm sub = dataAry.Get_at(i);
|
||||||
|
if (sub.Tid() == Json_itm_.Tid__nde) {
|
||||||
|
rv[i] = new JsonMustacheNde((Json_nde)sub);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rv[i] = new JsonMustacheVal(false, Mustache_tkn_def.ItemString, sub.Data());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class JsonMustacheVal implements Mustache_doc_itm {
|
||||||
|
private final boolean fromArray;
|
||||||
|
private final String jsonKey;
|
||||||
|
private final Object jsonVal;
|
||||||
|
public JsonMustacheVal(boolean fromArray, String jsonKey, Object jsonVal) {
|
||||||
|
this.fromArray = fromArray;
|
||||||
|
this.jsonKey = jsonKey;
|
||||||
|
this.jsonVal = jsonVal;
|
||||||
|
}
|
||||||
|
public boolean Mustache__write(String mustacheKey, Mustache_bfr bfr) {
|
||||||
|
if ( (String_.Eq(mustacheKey, jsonKey)) // print if `{{match}}`; EX: `{{#prop}}{{prop}}{{/prop}}`
|
||||||
|
|| (String_.Eq(mustacheKey, Mustache_tkn_def.ItemString) && fromArray)) { // print if `{{.}}` and from array; EX: `{{#array}}{{.}}{{/array}}`
|
||||||
|
bfr.Add_bry(Bry_.new_u8(Object_.To_str(jsonVal)));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Mustache_doc_itm[] Mustache__subs(String key) {return Mustache_doc_itm_.Ary__empty;}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,8 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
|
package gplx.langs.mustaches;
|
||||||
import gplx.langs.jsons.*;
|
|
||||||
public interface Mustache_doc_itm {
|
public interface Mustache_doc_itm {
|
||||||
boolean Mustache__write(String key, Mustache_bfr bfr);
|
boolean Mustache__write(String key, Mustache_bfr bfr);
|
||||||
Mustache_doc_itm[] Mustache__subs(String key);
|
Mustache_doc_itm[] Mustache__subs(String key);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,18 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
|
package gplx.langs.mustaches;
|
||||||
import org.junit.*; import gplx.core.primitives.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Hash_adp;
|
||||||
|
import gplx.Hash_adp_;
|
||||||
|
import gplx.Tfds;
|
||||||
|
import gplx.core.primitives.Bool_obj_ref;
|
||||||
|
import gplx.langs.jsons.Json_doc;
|
||||||
|
import gplx.langs.jsons.Json_nde;
|
||||||
|
import gplx.langs.jsons.Json_parser;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class Mustache_itm_render_tst {
|
public class Mustache_itm_render_tst {
|
||||||
private final Mustache_itm_render_fxt fxt = new Mustache_itm_render_fxt();
|
private final Mustache_itm_render_fxt fxt = new Mustache_itm_render_fxt();
|
||||||
@Test public void Text() {
|
@Test public void Text() {
|
||||||
@ -121,6 +131,13 @@ public class Mustache_itm_render_tst {
|
|||||||
, "a1"
|
, "a1"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@Test public void Dot() {
|
||||||
|
fxt.Test__parse
|
||||||
|
( "{'subs':['a', 'b', 'c', 'd']}"
|
||||||
|
, "{{#subs}}{{.}},{{/subs}}"
|
||||||
|
, "a,b,c,d,"
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
class Mustache_itm_render_fxt {
|
class Mustache_itm_render_fxt {
|
||||||
private final Mustache_tkn_parser parser = new Mustache_tkn_parser();
|
private final Mustache_tkn_parser parser = new Mustache_tkn_parser();
|
||||||
@ -136,6 +153,16 @@ class Mustache_itm_render_fxt {
|
|||||||
actl_itm.Render(bfr, ctx);
|
actl_itm.Render(bfr, ctx);
|
||||||
Tfds.Eq_str_lines(expd, bfr.To_str_and_clear());
|
Tfds.Eq_str_lines(expd, bfr.To_str_and_clear());
|
||||||
}
|
}
|
||||||
|
public void Test__parse(String jdoc, String src_str, String expd) {
|
||||||
|
Json_nde jnde = Json_parser.ParseToJdoc(Json_doc.Make_str_by_apos(jdoc)).Root_nde();
|
||||||
|
JsonMustacheNde nde = new JsonMustacheNde(jnde);
|
||||||
|
|
||||||
|
byte[] src_bry = Bry_.new_a7(src_str);
|
||||||
|
Mustache_tkn_itm actl_itm = parser.Parse(src_bry, 0, src_bry.length);
|
||||||
|
ctx.Init(nde);
|
||||||
|
actl_itm.Render(bfr, ctx);
|
||||||
|
Tfds.Eq_str_lines(expd, bfr.To_str_and_clear());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
class Mustache_doc_itm__mock implements Mustache_doc_itm {
|
class Mustache_doc_itm__mock implements Mustache_doc_itm {
|
||||||
private final Hash_adp hash_prop = Hash_adp_.New(), hash_bool = Hash_adp_.New(), hash_subs = Hash_adp_.New();
|
private final Hash_adp hash_prop = Hash_adp_.New(), hash_bool = Hash_adp_.New(), hash_subs = Hash_adp_.New();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,15 +13,24 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
|
package gplx.langs.mustaches;
|
||||||
|
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
|
||||||
public class Mustache_render_ctx {
|
public class Mustache_render_ctx {
|
||||||
private final List_adp stack = List_adp_.New();
|
private final List_adp stack = List_adp_.New();
|
||||||
private Mustache_doc_itm cur;
|
private Mustache_doc_itm cur;
|
||||||
private Mustache_doc_itm[] subs; private int subs_idx, subs_len; private byte cur_is_bool;
|
private Mustache_doc_itm[] subs;
|
||||||
|
private int subs_idx, subs_len;
|
||||||
|
private byte cur_is_bool;
|
||||||
|
|
||||||
public Mustache_render_ctx Init(Mustache_doc_itm cur) {
|
public Mustache_render_ctx Init(Mustache_doc_itm cur) {
|
||||||
this.cur = cur;
|
this.cur = cur;
|
||||||
this.subs = null;
|
this.subs = null;
|
||||||
this.subs_idx = subs_len = 0; this.cur_is_bool = Bool_.__byte;
|
this.subs_idx = subs_len = 0;
|
||||||
|
this.cur_is_bool = Bool_.__byte;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
public boolean Render_variable(Mustache_bfr bfr, String key) {
|
public boolean Render_variable(Mustache_bfr bfr, String key) {
|
||||||
@ -30,10 +39,12 @@ public class Mustache_render_ctx {
|
|||||||
Mustache_doc_itm itm = cur;
|
Mustache_doc_itm itm = cur;
|
||||||
while (itm != Mustache_doc_itm_.Null_itm) {
|
while (itm != Mustache_doc_itm_.Null_itm) {
|
||||||
boolean resolved = itm.Mustache__write(key, bfr);
|
boolean resolved = itm.Mustache__write(key, bfr);
|
||||||
|
// current itm handles key -> exit
|
||||||
if (resolved) {
|
if (resolved) {
|
||||||
rv = true;
|
rv = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// current itm does not handle key -> go up stack
|
||||||
else {
|
else {
|
||||||
--stack_pos;
|
--stack_pos;
|
||||||
if (stack_pos == -1) // nothing else in stack
|
if (stack_pos == -1) // nothing else in stack
|
||||||
@ -47,12 +58,15 @@ public class Mustache_render_ctx {
|
|||||||
public void Section_bgn(String key) {
|
public void Section_bgn(String key) {
|
||||||
Mustache_stack_itm stack_itm = new Mustache_stack_itm(cur, subs, subs_idx, subs_len, cur_is_bool); // note that cur is "owner" since subs_idx == 0
|
Mustache_stack_itm stack_itm = new Mustache_stack_itm(cur, subs, subs_idx, subs_len, cur_is_bool); // note that cur is "owner" since subs_idx == 0
|
||||||
stack.Add(stack_itm);
|
stack.Add(stack_itm);
|
||||||
subs = cur.Mustache__subs(key); if (subs == null) subs = Mustache_doc_itm_.Ary__empty; // subs == null if property does not exist; EX: "folder{{#files}}file{{/files}}" and folder = new Folder(File[0]);
|
subs = cur.Mustache__subs(key);
|
||||||
|
if (subs == null) // subs == null if property does not exist; EX: "folder{{#files}}file{{/files}}" and folder = new Folder(File[0]);
|
||||||
|
subs = Mustache_doc_itm_.Ary__empty;
|
||||||
subs_len = subs.length;
|
subs_len = subs.length;
|
||||||
subs_idx = -1;
|
subs_idx = -1;
|
||||||
}
|
}
|
||||||
public boolean Section_do(boolean inverted) {
|
public boolean Section_do(boolean inverted) {
|
||||||
if (++subs_idx >= subs_len) return false;
|
if (++subs_idx >= subs_len)
|
||||||
|
return false;
|
||||||
Mustache_doc_itm sub = subs[subs_idx];
|
Mustache_doc_itm sub = subs[subs_idx];
|
||||||
if (subs_idx == 0) { // special logic to handle 1st item; note that there always be at least one item
|
if (subs_idx == 0) { // special logic to handle 1st item; note that there always be at least one item
|
||||||
if (sub == Mustache_doc_itm_.Itm__bool__n) {
|
if (sub == Mustache_doc_itm_.Itm__bool__n) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,7 +13,13 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
|
package gplx.langs.mustaches;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Byte_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.String_;
|
||||||
|
|
||||||
class Mustache_tkn_def {
|
class Mustache_tkn_def {
|
||||||
public byte[] Variable_lhs = Dflt_variable_lhs;
|
public byte[] Variable_lhs = Dflt_variable_lhs;
|
||||||
public byte[] Variable_rhs = Dflt_variable_rhs;
|
public byte[] Variable_rhs = Dflt_variable_rhs;
|
||||||
@ -31,9 +37,13 @@ class Mustache_tkn_def {
|
|||||||
, Grp_end = Byte_ascii.Slash // {{/section}}
|
, Grp_end = Byte_ascii.Slash // {{/section}}
|
||||||
, Inverted = Byte_ascii.Pow // {{^inverted}}
|
, Inverted = Byte_ascii.Pow // {{^inverted}}
|
||||||
, Comment = Byte_ascii.Bang // {{!comment}}
|
, Comment = Byte_ascii.Bang // {{!comment}}
|
||||||
, Partial = Byte_ascii.Angle_bgn // {{>partial}}
|
, Partial = Byte_ascii.Angle_end // {{>partial}}
|
||||||
, Delimiter_bgn = Byte_ascii.Eq // {{=<% %>=}}
|
, Delimiter_bgn = Byte_ascii.Eq // {{=<% %>=}}
|
||||||
, Delimiter_end = Byte_ascii.Curly_end // {{=<% %>=}}
|
, Delimiter_end = Byte_ascii.Curly_end // {{=<% %>=}}
|
||||||
|
, Item = Byte_ascii.Dot // {{.}}
|
||||||
|
;
|
||||||
|
public static final String
|
||||||
|
ItemString = String_.new_u8(Byte_.To_bry(Item))
|
||||||
;
|
;
|
||||||
public Mustache_tkn_def() {
|
public Mustache_tkn_def() {
|
||||||
Variable_lhs_len = Variable_lhs.length;
|
Variable_lhs_len = Variable_lhs.length;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,7 +13,15 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
|
package gplx.langs.mustaches;
|
||||||
|
|
||||||
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.String_;
|
||||||
|
|
||||||
public interface Mustache_tkn_itm {
|
public interface Mustache_tkn_itm {
|
||||||
int Tid();
|
int Tid();
|
||||||
String Key();
|
String Key();
|
||||||
@ -103,8 +111,16 @@ class Mustache_tkn_inverted extends Mustache_tkn_base { // EX: {{^section}}missi
|
|||||||
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {Mustache_tkn_section.Render_static(Bool_.Y, this, bfr, ctx);}
|
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {Mustache_tkn_section.Render_static(Bool_.Y, this, bfr, ctx);}
|
||||||
}
|
}
|
||||||
class Mustache_tkn_partial extends Mustache_tkn_base { // EX: {{>a}} -> abc (deferred eval)
|
class Mustache_tkn_partial extends Mustache_tkn_base { // EX: {{>a}} -> abc (deferred eval)
|
||||||
public Mustache_tkn_partial(byte[] key) {super(Mustache_tkn_itm_.Tid__partial, key);}
|
private Mustache_tkn_itm template_root;
|
||||||
|
public Mustache_tkn_partial(byte[] key, Io_url dir) {
|
||||||
|
super(Mustache_tkn_itm_.Tid__partial, key);
|
||||||
|
Mustache_tkn_parser parser = new Mustache_tkn_parser(dir);
|
||||||
|
template_root = parser.Parse(String_.new_a7(Bry_.Trim_bgn(key, Byte_ascii.Space, 0)));
|
||||||
|
}
|
||||||
|
@Override public void Render(Mustache_bfr bfr, Mustache_render_ctx ctx) {
|
||||||
|
template_root.Render(bfr, ctx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
class Mustache_tkn_delimiter extends Mustache_tkn_base {// EX: {{=<% %>=}} -> <% variable %>
|
class Mustache_tkn_delimiter extends Mustache_tkn_base { // EX: {{=<% %>=}} -> <% variable %>
|
||||||
public Mustache_tkn_delimiter(byte[] key) {super(Mustache_tkn_itm_.Tid__delimiter, key);}
|
public Mustache_tkn_delimiter(byte[] key) {super(Mustache_tkn_itm_.Tid__delimiter, key);}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,10 +13,32 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.langs.mustaches; import gplx.*; import gplx.langs.*;
|
package gplx.langs.mustaches;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_find_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Err;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
|
||||||
public class Mustache_tkn_parser {
|
public class Mustache_tkn_parser {
|
||||||
private byte[] src; private int src_end;
|
private byte[] src; private int src_end;
|
||||||
|
private Io_url template_root;
|
||||||
private final Mustache_tkn_def tkn_def = new Mustache_tkn_def();
|
private final Mustache_tkn_def tkn_def = new Mustache_tkn_def();
|
||||||
|
public Mustache_tkn_parser() {
|
||||||
|
}
|
||||||
|
public Mustache_tkn_parser(Io_url template_root) {
|
||||||
|
this.template_root = template_root;
|
||||||
|
}
|
||||||
|
public Mustache_tkn_itm Parse(String template) { return Parse(template, Bry_.Empty); }
|
||||||
|
public Mustache_tkn_itm Parse(String template, byte[] default_text) {
|
||||||
|
byte[] template_data = Io_mgr.Instance.LoadFilBryOr(template_root.GenSubFil_nest(template + ".mustache"), default_text);
|
||||||
|
return Parse(template_data, 0, template_data.length);
|
||||||
|
}
|
||||||
public Mustache_tkn_itm Parse(byte[] src) {return Parse(src, 0, src.length);}
|
public Mustache_tkn_itm Parse(byte[] src) {return Parse(src, 0, src.length);}
|
||||||
public Mustache_tkn_itm Parse(byte[] src, int src_bgn, int src_end) {
|
public Mustache_tkn_itm Parse(byte[] src, int src_bgn, int src_end) {
|
||||||
this.src = src; this.src_end = src_end;
|
this.src = src; this.src_end = src_end;
|
||||||
@ -80,7 +102,7 @@ public class Mustache_tkn_parser {
|
|||||||
default: throw Err_.new_unhandled(tkn_data.tid);
|
default: throw Err_.new_unhandled(tkn_data.tid);
|
||||||
case Mustache_tkn_def.Variable: tkn = new Mustache_tkn_variable(val_bry); break;
|
case Mustache_tkn_def.Variable: tkn = new Mustache_tkn_variable(val_bry); break;
|
||||||
case Mustache_tkn_def.Comment: tkn = new Mustache_tkn_comment(); break;
|
case Mustache_tkn_def.Comment: tkn = new Mustache_tkn_comment(); break;
|
||||||
case Mustache_tkn_def.Partial: tkn = new Mustache_tkn_partial(val_bry); break;
|
case Mustache_tkn_def.Partial: tkn = new Mustache_tkn_partial(val_bry, template_root); break;
|
||||||
case Mustache_tkn_def.Delimiter_bgn: tkn = new Mustache_tkn_delimiter(val_bry); break; // TODO_OLD: implement delimiter; EX: {{=<% %>=}}
|
case Mustache_tkn_def.Delimiter_bgn: tkn = new Mustache_tkn_delimiter(val_bry); break; // TODO_OLD: implement delimiter; EX: {{=<% %>=}}
|
||||||
case Mustache_tkn_def.Escape_bgn: tkn = new Mustache_tkn_escape(val_bry); break;
|
case Mustache_tkn_def.Escape_bgn: tkn = new Mustache_tkn_escape(val_bry); break;
|
||||||
case Mustache_tkn_def.Section: tkn = new Mustache_tkn_section(val_bry); break;
|
case Mustache_tkn_def.Section: tkn = new Mustache_tkn_section(val_bry); break;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2021 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,9 +13,19 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa; import gplx.*;
|
package gplx.xowa;
|
||||||
import gplx.core.log_msgs.*;
|
|
||||||
import gplx.xowa.guis.views.boots.*; import gplx.xowa.apps.boots.*;
|
import gplx.Err_;
|
||||||
|
import gplx.Gfo_usr_dlg;
|
||||||
|
import gplx.Gfo_usr_dlg__gui_;
|
||||||
|
import gplx.Gfo_usr_dlg__log_base;
|
||||||
|
import gplx.Gfo_usr_dlg_base;
|
||||||
|
import gplx.core.log_msgs.Gfo_msg_grp;
|
||||||
|
import gplx.core.log_msgs.Gfo_msg_grp_;
|
||||||
|
import gplx.xowa.apps.boots.Xoa_boot_mgr;
|
||||||
|
import gplx.xowa.apps.boots.Xoa_cmd_arg_mgr;
|
||||||
|
import gplx.xowa.guis.views.boots.Xog_error_win;
|
||||||
|
|
||||||
public class Xoa_app_ {
|
public class Xoa_app_ {
|
||||||
public static void Run(String... args) {
|
public static void Run(String... args) {
|
||||||
Xoa_cmd_arg_mgr arg_mgr = Xoa_cmd_arg_mgr.new_();
|
Xoa_cmd_arg_mgr arg_mgr = Xoa_cmd_arg_mgr.new_();
|
||||||
@ -30,12 +40,12 @@ public class Xoa_app_ {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static final String Name = "xowa";
|
public static final String Name = "xowa";
|
||||||
public static final int Version_id = 551;
|
public static final int Version_id = 560;
|
||||||
public static final String Version = "4.6.5.1911";
|
public static final String Version = "4.6.15.2101";
|
||||||
|
public static final String Build_date_fmt = "yyyy-MM-dd HH:mm:ss";
|
||||||
public static String Build_date = "2012-12-30 00:00:00";
|
public static String Build_date = "2012-12-30 00:00:00";
|
||||||
public static String Build_date_fmt = "yyyy-MM-dd HH:mm:ss";
|
|
||||||
public static String Op_sys_str;
|
|
||||||
public static String User_agent = "";
|
public static String User_agent = "";
|
||||||
|
public static String Op_sys_str;
|
||||||
|
|
||||||
public static Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public static void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v;} private static Gfo_usr_dlg usr_dlg;
|
public static Gfo_usr_dlg Usr_dlg() {return usr_dlg;} public static void Usr_dlg_(Gfo_usr_dlg v) {usr_dlg = v;} private static Gfo_usr_dlg usr_dlg;
|
||||||
public static Gfo_usr_dlg New__usr_dlg__console() {
|
public static Gfo_usr_dlg New__usr_dlg__console() {
|
||||||
|
@ -58,7 +58,6 @@ public class Xop_fxt {
|
|||||||
wiki.Html_mgr().Img_suppress_missing_src_(false);
|
wiki.Html_mgr().Img_suppress_missing_src_(false);
|
||||||
wiki.Xtn_mgr().Init_by_wiki(wiki);
|
wiki.Xtn_mgr().Init_by_wiki(wiki);
|
||||||
Page_ttl_(Ttl_str);
|
Page_ttl_(Ttl_str);
|
||||||
Xot_invk_tkn.Cache_enabled = false;// always disable cache for tests; can cause strange behavior when running entire suite and lnki_temp test turns on;
|
|
||||||
}
|
}
|
||||||
private Xofw_wiki_wkr_mock mock_wkr = new Xofw_wiki_wkr_mock();
|
private Xofw_wiki_wkr_mock mock_wkr = new Xofw_wiki_wkr_mock();
|
||||||
public Xoae_app App() {return app;} private Xoae_app app;
|
public Xoae_app App() {return app;} private Xoae_app app;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,20 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons; import gplx.*; import gplx.xowa.*;
|
package gplx.xowa.addons;
|
||||||
import gplx.xowa.addons.wikis.searchs.gui.urlbars.*; import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*; import gplx.xowa.addons.wikis.searchs.specials.*;
|
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
import gplx.Ordered_hash;
|
||||||
|
import gplx.Ordered_hash_;
|
||||||
|
import gplx.Type_;
|
||||||
|
import gplx.xowa.Xoa_app;
|
||||||
|
import gplx.xowa.Xoae_app;
|
||||||
|
import gplx.xowa.Xow_wiki;
|
||||||
|
import gplx.xowa.addons.wikis.searchs.gui.htmlbars.Srch_htmlbar_mgr;
|
||||||
|
import gplx.xowa.addons.wikis.searchs.gui.urlbars.Srch_urlbar_mgr;
|
||||||
|
import gplx.xowa.addons.wikis.searchs.specials.Srch_special_cfg;
|
||||||
|
|
||||||
public class Xoax_addon_mgr {
|
public class Xoax_addon_mgr {
|
||||||
private final Ordered_hash hash = Ordered_hash_.New(); // LOCK: must synchronized else two search tabs will fail on startup
|
private final Ordered_hash hash = Ordered_hash_.New(); // LOCK: must synchronized else two search tabs will fail on startup
|
||||||
public Xoax_addon_itm Itms__get_or_null(String key) {synchronized (hash) {return (Xoax_addon_itm)hash.Get_by(key);}}
|
public Xoax_addon_itm Itms__get_or_null(String key) {synchronized (hash) {return (Xoax_addon_itm)hash.Get_by(key);}}
|
||||||
@ -57,12 +69,16 @@ public class Xoax_addon_mgr {
|
|||||||
, new gplx.xowa.addons.wikis.ctgs.bldrs .Xoax_ctg_bldr_addon()
|
, new gplx.xowa.addons.wikis.ctgs.bldrs .Xoax_ctg_bldr_addon()
|
||||||
, new gplx.xowa.xtns.wbases.imports .Xowb_bldr_addon()
|
, new gplx.xowa.xtns.wbases.imports .Xowb_bldr_addon()
|
||||||
|
|
||||||
|
// app infrastructure
|
||||||
|
, new gplx.xowa.addons.apps.settings .SettingsAddon()
|
||||||
|
|
||||||
// xtns
|
// xtns
|
||||||
, new gplx.xowa.xtns.math .Xomath_addon()
|
, new gplx.xowa.xtns.math .Xomath_addon()
|
||||||
, new gplx.xowa.xtns.template_styles .Template_styles_addon()
|
, new gplx.xowa.xtns.template_styles .Template_styles_addon()
|
||||||
, new gplx.xowa.xtns.hieros .Hiero_addon()
|
, new gplx.xowa.xtns.hieros .Hiero_addon()
|
||||||
, new gplx.xowa.xtns.imaps .Imap_addon()
|
, new gplx.xowa.xtns.imaps .Imap_addon()
|
||||||
, new gplx.xowa.xtns.graphs .Graph_addon()
|
, new gplx.xowa.xtns.graphs .Graph_addon()
|
||||||
|
, new gplx.xowa.xtns.indicators .Indicator_addon()
|
||||||
|
|
||||||
// specials
|
// specials
|
||||||
, new gplx.xowa.addons.wikis.registrys .Wiki_registry_addon()
|
, new gplx.xowa.addons.wikis.registrys .Wiki_registry_addon()
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,11 +13,21 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.apps.cfgs.specials.edits.objs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
|
package gplx.xowa.addons.apps.cfgs.specials.edits.objs;
|
||||||
import gplx.langs.mustaches.*;
|
|
||||||
import gplx.core.gfobjs.*; import gplx.langs.jsons.*;
|
import gplx.Bool_;
|
||||||
import gplx.xowa.addons.apps.cfgs.mgrs.types.*; import gplx.xowa.addons.apps.cfgs.enums.*;
|
import gplx.Bry_;
|
||||||
import gplx.langs.htmls.*;
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.gfobjs.Gfobj_nde;
|
||||||
|
import gplx.langs.htmls.Gfh_utl;
|
||||||
|
import gplx.langs.mustaches.Mustache_bfr;
|
||||||
|
import gplx.langs.mustaches.Mustache_doc_itm;
|
||||||
|
import gplx.langs.mustaches.Mustache_doc_itm_;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.Xocfg_mgr;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.enums.Xoitm_type_enum;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.mgrs.types.Xocfg_type_mgr;
|
||||||
|
|
||||||
public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
|
public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
|
||||||
private boolean edited;
|
private boolean edited;
|
||||||
private String type, html_atrs, html_cls, lang, name, ctx, date;
|
private String type, html_atrs, html_cls, lang, name, ctx, date;
|
||||||
@ -36,7 +46,7 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
|
|||||||
public int Sort() {return sort;} private final int sort;
|
public int Sort() {return sort;} private final int sort;
|
||||||
public void Load_by_meta(Bry_bfr tmp_bfr, String type, String dflt_str, String html_atrs, String html_cls) {
|
public void Load_by_meta(Bry_bfr tmp_bfr, String type, String dflt_str, String html_atrs, String html_cls) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.dflt = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(dflt_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N);
|
this.dflt = Escape(tmp_bfr, type, dflt_str);
|
||||||
this.html_atrs = html_atrs;
|
this.html_atrs = html_atrs;
|
||||||
this.html_cls = html_cls;
|
this.html_cls = html_cls;
|
||||||
}
|
}
|
||||||
@ -47,7 +57,7 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
|
|||||||
}
|
}
|
||||||
public void Load_by_data(Bry_bfr tmp_bfr, String ctx, String val_str, String date) {
|
public void Load_by_data(Bry_bfr tmp_bfr, String ctx, String val_str, String date) {
|
||||||
this.ctx = ctx;
|
this.ctx = ctx;
|
||||||
this.val = Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(val_str), Bool_.N, Bool_.N, Bool_.N, Bool_.Y, Bool_.N);
|
this.val = Escape(tmp_bfr, type, val_str);
|
||||||
this.date = date;
|
this.date = date;
|
||||||
this.edited = true;
|
this.edited = true;
|
||||||
if ( String_.Has(html_cls, "read"+"only")
|
if ( String_.Has(html_cls, "read"+"only")
|
||||||
@ -98,4 +108,14 @@ public class Xoedit_itm implements Xoedit_nde, Mustache_doc_itm {
|
|||||||
if (String_.Eq(k, "edited")) return Mustache_doc_itm_.Ary__bool(edited);
|
if (String_.Eq(k, "edited")) return Mustache_doc_itm_.Ary__bool(edited);
|
||||||
return Mustache_doc_itm_.Ary__empty;
|
return Mustache_doc_itm_.Ary__empty;
|
||||||
}
|
}
|
||||||
|
private static byte[] Escape(Bry_bfr tmp_bfr, String type, String val_str) {
|
||||||
|
// NOTE: do not escape quotes for memo because it uses <textarea> which can use quotes;
|
||||||
|
// contrast with <input> which uses quotes for `value` property;
|
||||||
|
// EX: <input value="a"b"> vs <textarea>a"b</textarea>
|
||||||
|
boolean escapeQuotes = Xoitm_type_enum.To_uid(type) == Xoitm_type_enum.Tid__memo
|
||||||
|
? Bool_.N
|
||||||
|
: Bool_.Y;
|
||||||
|
|
||||||
|
return Gfh_utl.Escape_html_as_bry(tmp_bfr, Bry_.new_u8(val_str), Bool_.N, Bool_.N, Bool_.N, escapeQuotes, Bool_.N);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,11 +13,33 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.apps.cfgs.specials.edits.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
|
package gplx.xowa.addons.apps.cfgs.specials.edits.services;
|
||||||
import gplx.dbs.*;
|
|
||||||
import gplx.xowa.addons.apps.cfgs.dbs.*; import gplx.xowa.addons.apps.cfgs.dbs.tbls.*;
|
import gplx.Bry_bfr;
|
||||||
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.*;
|
import gplx.Bry_bfr_;
|
||||||
import gplx.xowa.addons.apps.cfgs.mgrs.*; import gplx.xowa.addons.apps.cfgs.mgrs.dflts.*; import gplx.xowa.addons.apps.cfgs.mgrs.types.*;
|
import gplx.Err_;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
import gplx.Ordered_hash;
|
||||||
|
import gplx.Ordered_hash_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.dbs.Db_rdr;
|
||||||
|
import gplx.dbs.Db_sql_;
|
||||||
|
import gplx.xowa.Xoa_app;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.dbs.Xocfg_db_app;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.dbs.Xocfg_db_usr;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.dbs.tbls.Xocfg_grp_row;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.mgrs.dflts.Xocfg_dflt_mgr;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.mgrs.types.Xocfg_type_mgr;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_grp;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_itm;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_nav_itm;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_nav_mgr;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_nde;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_nde_hash;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xoedit_root;
|
||||||
|
import gplx.xowa.addons.apps.cfgs.specials.edits.objs.Xogui_nde_iter;
|
||||||
|
|
||||||
public class Xocfg_edit_loader {
|
public class Xocfg_edit_loader {
|
||||||
private final Xocfg_db_app db_app;
|
private final Xocfg_db_app db_app;
|
||||||
private final Xocfg_db_usr db_usr;
|
private final Xocfg_db_usr db_usr;
|
||||||
|
25
400_xowa/src/gplx/xowa/addons/apps/settings/CfgResolver.java
Normal file
25
400_xowa/src/gplx/xowa/addons/apps/settings/CfgResolver.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.xowa.addons.apps.settings;
|
||||||
|
|
||||||
|
import gplx.langs.jsons.Json_doc;
|
||||||
|
import gplx.xowa.Xow_wiki;
|
||||||
|
|
||||||
|
public interface CfgResolver {
|
||||||
|
String Key();
|
||||||
|
void WhenCfgChanged(Json_doc jdoc);
|
||||||
|
void WhenWikiCreated(Xow_wiki wikii);
|
||||||
|
}
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
XOWA: the XOWA Offline Wiki Application
|
||||||
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
|
|
||||||
|
You may use XOWA according to either of these licenses as is most appropriate
|
||||||
|
for your project on a case-by-case basis.
|
||||||
|
|
||||||
|
The terms of each license can be found in the source code repository:
|
||||||
|
|
||||||
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
|
*/
|
||||||
|
package gplx.xowa.addons.apps.settings;
|
||||||
|
|
||||||
|
import gplx.GfoMsg;
|
||||||
|
import gplx.Gfo_invk;
|
||||||
|
import gplx.GfsCtx;
|
||||||
|
import gplx.Ordered_hash;
|
||||||
|
import gplx.Ordered_hash_;
|
||||||
|
import gplx.langs.jsons.Json_doc;
|
||||||
|
import gplx.langs.jsons.Json_parser;
|
||||||
|
import gplx.objects.errs.Err_;
|
||||||
|
import gplx.xowa.Xoa_app;
|
||||||
|
import gplx.xowa.Xow_wiki;
|
||||||
|
import gplx.xowa.addons.Xoax_addon_itm;
|
||||||
|
import gplx.xowa.addons.Xoax_addon_itm__init;
|
||||||
|
import gplx.xowa.xtns.scribunto.cfgs.ScribCfgResolverApp;
|
||||||
|
|
||||||
|
public class SettingsAddon implements Xoax_addon_itm, Xoax_addon_itm__init, Gfo_invk {
|
||||||
|
private final Ordered_hash hash = Ordered_hash_.New();
|
||||||
|
private Json_doc jdoc;
|
||||||
|
private boolean init = true;
|
||||||
|
public String Addon__key() {return ADDON_KEY;} public static final String ADDON_KEY = "xowa.app.settings";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Init_addon_by_app(Xoa_app app) {
|
||||||
|
// NOTE: should move to addon_mgr and create a new interface for settings
|
||||||
|
this.Add(new ScribCfgResolverApp(app));
|
||||||
|
}
|
||||||
|
private void Add(CfgResolver mgr) {
|
||||||
|
hash.Add(mgr.Key(), mgr);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void Init_addon_by_wiki(Xow_wiki wiki) {
|
||||||
|
if (init) { // NOTE: cannot `init` in `Init_addon_by_app` b/c `Bind_many` will try to load from db, and dbEngine is not set yet
|
||||||
|
Update(wiki.App().Cfg().Get_str_app_or(CFG_PUBLISH, null));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (jdoc == null) return;
|
||||||
|
for (int i = 0; i < hash.Len(); i++) {
|
||||||
|
CfgResolver resolver = (CfgResolver)hash.Get_at(i);
|
||||||
|
resolver.WhenWikiCreated(wiki);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void Update(String json) {
|
||||||
|
init = false;
|
||||||
|
if (json == null) return;
|
||||||
|
this.jdoc = Json_parser.ParseToJdoc(json);
|
||||||
|
if (jdoc == null) return;
|
||||||
|
for (int i = 0; i < hash.Len(); i++) {
|
||||||
|
CfgResolver resolver = (CfgResolver)hash.Get_at(i);
|
||||||
|
resolver.WhenCfgChanged(jdoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||||
|
switch (k) {
|
||||||
|
case CFG_PUBLISH:
|
||||||
|
Update(m.ReadStrOr("v", null));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw Err_.New_unhandled_default(k);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
private static final String CFG_PUBLISH = "xowa.app.settings.publish";
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,20 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.bldrs.mass_parses.parses.mgrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.mass_parses.*; import gplx.xowa.addons.bldrs.mass_parses.parses.*;
|
package gplx.xowa.addons.bldrs.mass_parses.parses.mgrs;
|
||||||
import gplx.core.ios.streams.*;
|
|
||||||
|
import gplx.Datetime_now;
|
||||||
|
import gplx.GfoMsg;
|
||||||
|
import gplx.Gfo_invk;
|
||||||
|
import gplx.Gfo_invk_;
|
||||||
|
import gplx.GfsCtx;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.core.ios.streams.Io_stream_tid_;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.parsers.logs.Xop_log_invoke_wkr;
|
||||||
|
import gplx.xowa.xtns.scribunto.Scrib_err_filter_mgr;
|
||||||
|
|
||||||
public class Xomp_parse_mgr_cfg implements Gfo_invk {
|
public class Xomp_parse_mgr_cfg implements Gfo_invk {
|
||||||
public int Num_wkrs() {return num_wkrs;} private int num_wkrs = -1;
|
public int Num_wkrs() {return num_wkrs;} private int num_wkrs = -1;
|
||||||
public int Num_pages_in_pool() {return num_pages_in_pool;} private int num_pages_in_pool = -1;
|
public int Num_pages_in_pool() {return num_pages_in_pool;} private int num_pages_in_pool = -1;
|
||||||
@ -80,9 +92,11 @@ public class Xomp_parse_mgr_cfg implements Gfo_invk {
|
|||||||
else if (ctx.Match(k, "wbase_cache_mru_compress_size_")) wbase_cache_mru_compress_size = m.ReadLong("v");
|
else if (ctx.Match(k, "wbase_cache_mru_compress_size_")) wbase_cache_mru_compress_size = m.ReadLong("v");
|
||||||
else if (ctx.Match(k, "page_cache_min_")) page_cache_min = gplx.core.ios.Io_size_.parse_or(m.ReadStr("v"), page_cache_min);
|
else if (ctx.Match(k, "page_cache_min_")) page_cache_min = gplx.core.ios.Io_size_.parse_or(m.ReadStr("v"), page_cache_min);
|
||||||
else if (ctx.Match(k, "page_cache_max_")) page_cache_max = gplx.core.ios.Io_size_.parse_or(m.ReadStr("v"), page_cache_max);
|
else if (ctx.Match(k, "page_cache_max_")) page_cache_max = gplx.core.ios.Io_size_.parse_or(m.ReadStr("v"), page_cache_max);
|
||||||
|
else if (ctx.Match(k, Invk__err_filter)) return Scrib_err_filter_mgr.INSTANCE;
|
||||||
else return Gfo_invk_.Rv_unhandled;
|
else return Gfo_invk_.Rv_unhandled;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
private Xop_log_invoke_wkr invoke_wkr;
|
||||||
private static final String
|
private static final String
|
||||||
Invk__num_wkrs_ = "num_wkrs_", Invk__num_pages_in_pool_ = "num_pages_in_pool_", Invk__num_pages_per_wkr_ = "num_pages_per_wkr_"
|
Invk__num_wkrs_ = "num_wkrs_", Invk__num_pages_in_pool_ = "num_pages_in_pool_", Invk__num_pages_per_wkr_ = "num_pages_per_wkr_"
|
||||||
, Invk__progress_interval_ = "progress_interval_", Invk__commit_interval_ = "commit_interval_", Invk__cleanup_interval_ = "cleanup_interval_"
|
, Invk__progress_interval_ = "progress_interval_", Invk__commit_interval_ = "commit_interval_", Invk__cleanup_interval_ = "cleanup_interval_"
|
||||||
@ -92,5 +106,6 @@ public class Xomp_parse_mgr_cfg implements Gfo_invk {
|
|||||||
, Invk__log_math_ = "log_math_"
|
, Invk__log_math_ = "log_math_"
|
||||||
, Invk__mgr_url_ = "mgr_url_", Invk__wkr_machine_name_ = "wkr_machine_name_"
|
, Invk__mgr_url_ = "mgr_url_", Invk__wkr_machine_name_ = "wkr_machine_name_"
|
||||||
, Invk__show_msg__fetched_pool_ = "show_msg__fetched_pool_"
|
, Invk__show_msg__fetched_pool_ = "show_msg__fetched_pool_"
|
||||||
|
, Invk__err_filter = "err_filter"
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,14 +13,43 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.bldrs.mass_parses.parses.wkrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.bldrs.*; import gplx.xowa.addons.bldrs.mass_parses.*; import gplx.xowa.addons.bldrs.mass_parses.parses.*;
|
package gplx.xowa.addons.bldrs.mass_parses.parses.wkrs;
|
||||||
import gplx.dbs.*; import gplx.xowa.addons.bldrs.mass_parses.dbs.*;
|
|
||||||
import gplx.xowa.files.origs.*;
|
import gplx.Bry_bfr;
|
||||||
import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.htmls.core.bldrs.*; import gplx.xowa.htmls.hxtns.pages.*; import gplx.xowa.htmls.core.hzips.*;
|
import gplx.Byte_ascii;
|
||||||
import gplx.xowa.wikis.pages.*;
|
import gplx.Err_;
|
||||||
import gplx.xowa.parsers.*; import gplx.xowa.parsers.logs.*;
|
import gplx.GfoMsg;
|
||||||
import gplx.xowa.addons.bldrs.mass_parses.parses.mgrs.*; import gplx.xowa.addons.bldrs.mass_parses.parses.utls.*; import gplx.xowa.addons.bldrs.mass_parses.parses.*; import gplx.xowa.addons.bldrs.mass_parses.parses.pools.*;
|
import gplx.Gfo_invk;
|
||||||
import gplx.xowa.addons.wikis.fulltexts.indexers.bldrs.*;
|
import gplx.Gfo_invk_;
|
||||||
|
import gplx.Gfo_usr_dlg_;
|
||||||
|
import gplx.GfsCtx;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
import gplx.xowa.Xoa_ttl;
|
||||||
|
import gplx.xowa.Xoae_page;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.dbs.Xomp_mgr_db;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.dbs.Xomp_stat_tbl;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.dbs.Xomp_wkr_db;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.dbs.Xomp_wkr_tbl;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.parses.mgrs.Xomp_parse_mgr;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.parses.mgrs.Xomp_parse_mgr_cfg;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.parses.mgrs.Xomp_prog_mgr;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.parses.pools.Xomp_page_itm;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.parses.pools.Xomp_page_pool;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.parses.utls.Xomp_lnki_temp_wkr;
|
||||||
|
import gplx.xowa.addons.bldrs.mass_parses.parses.utls.Xomp_ns_ord_mgr;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.indexers.bldrs.Xofulltext_indexer_wkr;
|
||||||
|
import gplx.xowa.files.origs.Xof_orig_wkr;
|
||||||
|
import gplx.xowa.htmls.core.bldrs.Xob_hdump_bldr;
|
||||||
|
import gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx;
|
||||||
|
import gplx.xowa.htmls.core.hzips.Xoh_hzip_dict_;
|
||||||
|
import gplx.xowa.htmls.hxtns.pages.Hxtn_page_mgr;
|
||||||
|
import gplx.xowa.parsers.Xop_ctx;
|
||||||
|
import gplx.xowa.parsers.Xow_parser_mgr;
|
||||||
|
import gplx.xowa.parsers.logs.Xop_log_wkr_factory;
|
||||||
|
import gplx.xowa.wikis.pages.Xopg_view_mode_;
|
||||||
|
|
||||||
public class Xomp_parse_wkr implements Gfo_invk {
|
public class Xomp_parse_wkr implements Gfo_invk {
|
||||||
// mgr vars
|
// mgr vars
|
||||||
private final Xomp_parse_mgr mgr;
|
private final Xomp_parse_mgr mgr;
|
||||||
@ -163,8 +192,6 @@ public class Xomp_parse_wkr implements Gfo_invk {
|
|||||||
|
|
||||||
// cleanup
|
// cleanup
|
||||||
// ctx.App().Utl__bfr_mkr().Clear_fail_check(); // make sure all bfrs are released
|
// ctx.App().Utl__bfr_mkr().Clear_fail_check(); // make sure all bfrs are released
|
||||||
if (wiki.Cache_mgr().Tmpl_result_cache().Count() > 50000)
|
|
||||||
wiki.Cache_mgr().Tmpl_result_cache().Clear();
|
|
||||||
if (done_count % cleanup_interval == 0) {
|
if (done_count % cleanup_interval == 0) {
|
||||||
wiki.Cache_mgr().Free_mem__page();
|
wiki.Cache_mgr().Free_mem__page();
|
||||||
wiki.Parser_mgr().Scrib().Core_term();
|
wiki.Parser_mgr().Scrib().Core_term();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -43,6 +43,8 @@ class Xobldr__fsdb_db__delete_small_files_ {
|
|||||||
Ext_max_(rv, 1000, Xof_ext_.Id_ogv);
|
Ext_max_(rv, 1000, Xof_ext_.Id_ogv);
|
||||||
Ext_max_(rv, 400, Xof_ext_.Id_pdf);
|
Ext_max_(rv, 400, Xof_ext_.Id_pdf);
|
||||||
Ext_max_(rv, 700, Xof_ext_.Id_djvu);
|
Ext_max_(rv, 700, Xof_ext_.Id_djvu);
|
||||||
|
Ext_max_(rv, 500, Xof_ext_.Id_stl);
|
||||||
|
Ext_max_(rv, 500, Xof_ext_.Id_webp);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
private static void Ext_max_(int[] ary, int max, int... exts) {for (int ext : exts) ary[ext] = max;}
|
private static void Ext_max_(int[] ary, int max, int... exts) {for (int ext : exts) ary[ext] = max;}
|
||||||
|
@ -0,0 +1,275 @@
|
|||||||
|
package gplx.xowa.addons.htmls.sidebars;
|
||||||
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.langs.jsons.Json_nde;
|
||||||
|
import gplx.langs.mustaches.JsonMustacheNde;
|
||||||
|
import gplx.langs.mustaches.Mustache_bfr;
|
||||||
|
import gplx.langs.mustaches.Mustache_render_ctx;
|
||||||
|
import gplx.langs.mustaches.Mustache_tkn_itm;
|
||||||
|
import gplx.langs.mustaches.Mustache_tkn_parser;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.langs.msgs.Xol_msg_mgr;
|
||||||
|
|
||||||
|
public class Db_Nav_template {
|
||||||
|
public Mustache_tkn_itm Navigation_root() {return navigation_root;} private Mustache_tkn_itm navigation_root;
|
||||||
|
private Xol_msg_mgr msg_mgr;
|
||||||
|
private Json_nde msgdata;
|
||||||
|
private Xowe_wiki wiki;
|
||||||
|
private static boolean once = true;
|
||||||
|
private static Mustache_tkn_itm menu_root;
|
||||||
|
|
||||||
|
public static void Build_Sidebar(Xowe_wiki wiki, Bry_bfr bfr, byte[] id, byte[] text, byte[] itms) {
|
||||||
|
if (once) {
|
||||||
|
once = false;
|
||||||
|
Io_url template_root = wiki.Appe().Fsys_mgr().Bin_any_dir().GenSubDir_nest("xowa", "xtns", "Skin-Vector", "templates");
|
||||||
|
Mustache_tkn_parser parser = new Mustache_tkn_parser(template_root);
|
||||||
|
menu_root = parser.Parse("Menu");
|
||||||
|
}
|
||||||
|
Json_nde data = s_getMenuData(wiki, text, itms, MENU_TYPE_PORTAL);
|
||||||
|
|
||||||
|
// Bry_bfr tmp_bfr = Bry_bfr_.New();
|
||||||
|
Mustache_render_ctx mctx = new Mustache_render_ctx().Init(new JsonMustacheNde(data));
|
||||||
|
Mustache_bfr mbfr = Mustache_bfr.New_bfr(bfr);
|
||||||
|
menu_root.Render(mbfr, mctx);
|
||||||
|
// byte[] result = mbfr.To_bry_and_clear();
|
||||||
|
// System.out.println(String_.new_u8(result));
|
||||||
|
}
|
||||||
|
public void Init(Xowe_wiki wiki) {
|
||||||
|
Io_url template_root = wiki.Appe().Fsys_mgr().Bin_any_dir().GenSubDir_nest("xowa", "xtns", "Skin-Vector", "templates");
|
||||||
|
Mustache_tkn_parser parser = new Mustache_tkn_parser(template_root);
|
||||||
|
navigation_root = parser.Parse("Navigation");
|
||||||
|
this.wiki = wiki;
|
||||||
|
|
||||||
|
msg_mgr = wiki.Lang().Msg_mgr();
|
||||||
|
build_msg();
|
||||||
|
|
||||||
|
Test();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String[] msgs = new String[] {
|
||||||
|
"vector-opt-out-tooltip",
|
||||||
|
"vector-opt-out",
|
||||||
|
"navigation-heading",
|
||||||
|
"vector-action-toggle-sidebar",
|
||||||
|
"vector-jumptonavigation",
|
||||||
|
"vector-jumptosearch",
|
||||||
|
"vector-jumptocontent",
|
||||||
|
"sitesubtitle",
|
||||||
|
"sitetitle",
|
||||||
|
"tagline"
|
||||||
|
};
|
||||||
|
|
||||||
|
//all thes messages should be preprocessed (per language) as $data["msg-{$message}"] = $this->msg( $message )->text();
|
||||||
|
private void build_msg() {
|
||||||
|
int msg_len = msgs.length;
|
||||||
|
msgdata = Json_nde.NewByVal();
|
||||||
|
for (int i = 0; i < msg_len; i++) {
|
||||||
|
String msg = msgs[i];
|
||||||
|
msgdata.AddKvStr("msg-" + msg, msg_mgr.Val_by_str_or_empty(msg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void Test() {
|
||||||
|
Json_nde jnde = Json_nde.NewByVal();
|
||||||
|
jnde.AddKvStr("class", "CLASS");
|
||||||
|
jnde.AddKvStr("text", "TEXT");
|
||||||
|
jnde.AddKvStr("href", "URL_str");
|
||||||
|
jnde.AddKvBool("exists", true);
|
||||||
|
jnde.AddKvBool("primary", true);
|
||||||
|
jnde.AddKvStr("link-class", String_.Empty);
|
||||||
|
jnde.AddKvStr("context", "subject");
|
||||||
|
|
||||||
|
Json_nde namespaces = Json_nde.NewByVal();
|
||||||
|
namespaces.AddKvNde("subject", jnde);
|
||||||
|
|
||||||
|
//Json_nde data_namespaces = new Json_nde(null, -1);
|
||||||
|
msgdata.AddKvNde("data-namespace-tabs",
|
||||||
|
getMenuData(
|
||||||
|
Bry_.new_a7("namespaces"),
|
||||||
|
namespaces,
|
||||||
|
MENU_TYPE_TABS
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Bry_bfr tmp_bfr = Bry_bfr_.New();
|
||||||
|
Mustache_render_ctx mctx = new Mustache_render_ctx().Init(new JsonMustacheNde(msgdata));
|
||||||
|
Mustache_bfr mbfr = Mustache_bfr.New_bfr(tmp_bfr);
|
||||||
|
navigation_root.Render(mbfr, mctx);
|
||||||
|
byte[] result = mbfr.To_bry_and_clear();
|
||||||
|
System.out.println(String_.new_u8(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Vector/SkinVector.php */
|
||||||
|
private static int MENU_TYPE_DROPDOWN = 0, MENU_TYPE_TABS = 1, MENU_TYPE_PORTAL = 2, MENU_TYPE_DEFAULT = 3;
|
||||||
|
private static byte[][] extraClasses = new byte[][] {
|
||||||
|
Bry_.new_a7("vector-menu vector-menu-dropdown vectorMenu"),
|
||||||
|
Bry_.new_a7("vector-menu vector-menu-tabs vectorTabs"),
|
||||||
|
Bry_.new_a7("vector-menu vector-menu-portal portal"),
|
||||||
|
Bry_.new_a7("vector-menu")
|
||||||
|
};
|
||||||
|
private Json_nde getMenuData(byte[] label, Json_nde urls, int type) { return getMenuData(label, urls, type, false); }
|
||||||
|
private Json_nde getMenuData(byte[] label_bry, Json_nde urls, int type, boolean setLabelToSelected) {
|
||||||
|
//private function getMenuData(
|
||||||
|
// string $label,
|
||||||
|
// array $urls = [],
|
||||||
|
// int $type = self::MENU_TYPE_DEFAULT,
|
||||||
|
// bool $setLabelToSelected = false
|
||||||
|
// ) : array {
|
||||||
|
// $skin = $this->getSkin();
|
||||||
|
// $extraClasses = [
|
||||||
|
// self::MENU_TYPE_DROPDOWN => 'vector-menu vector-menu-dropdown vectorMenu',
|
||||||
|
// self::MENU_TYPE_TABS => 'vector-menu vector-menu-tabs vectorTabs',
|
||||||
|
// self::MENU_TYPE_PORTAL => 'vector-menu vector-menu-portal portal',
|
||||||
|
// self::MENU_TYPE_DEFAULT => 'vector-menu',
|
||||||
|
// ];
|
||||||
|
// // A list of classes to apply the list element and override the default behavior.
|
||||||
|
// $listClasses = [
|
||||||
|
// // `.menu` is on the portal for historic reasons.
|
||||||
|
// // It should not be applied elsewhere per T253329.
|
||||||
|
// self::MENU_TYPE_DROPDOWN => 'menu vector-menu-content-list',
|
||||||
|
// ];
|
||||||
|
// $isPortal = $type === self::MENU_TYPE_PORTAL;
|
||||||
|
|
||||||
|
boolean isPortal = type == MENU_TYPE_PORTAL;
|
||||||
|
|
||||||
|
// // For some menu items, there is no language key corresponding with its menu key.
|
||||||
|
// // These inconsitencies are captured in MENU_LABEL_KEYS
|
||||||
|
// $msgObj = $skin->msg( self::MENU_LABEL_KEYS[ $label ] ?? $label );
|
||||||
|
//
|
||||||
|
// $props = [
|
||||||
|
// 'id' => "p-$label",
|
||||||
|
|
||||||
|
String label = String_.new_u8(label_bry);
|
||||||
|
String msg = label; // for now
|
||||||
|
String linkertooltip = String_.Empty;
|
||||||
|
String listClasses = type == MENU_TYPE_DROPDOWN
|
||||||
|
? "menu vector-menu-content-list"
|
||||||
|
: "vector-menu-content-list";
|
||||||
|
String plabel = "p-" + label;
|
||||||
|
|
||||||
|
Json_nde props = Json_nde.NewByVal();
|
||||||
|
props.AddKvStr("id", plabel);
|
||||||
|
|
||||||
|
// 'label-id' => "p-{$label}-label",
|
||||||
|
props.AddKvStr("label-id", plabel +"-label");
|
||||||
|
|
||||||
|
// If no message exists fallback to plain text (T252727)
|
||||||
|
// 'label' => $msgObj->exists() ? $msgObj->text() : $label,
|
||||||
|
props.AddKvStr("label", msg);
|
||||||
|
|
||||||
|
// 'list-classes' => $listClasses[$type] ?? 'vector-menu-content-list',
|
||||||
|
props.AddKvStr("list-classes", listClasses);
|
||||||
|
|
||||||
|
// 'html-items' => '',
|
||||||
|
|
||||||
|
// 'is-dropdown' => $type === self::MENU_TYPE_DROPDOWN,
|
||||||
|
props.AddKvBool("is-dropdown", type == MENU_TYPE_DROPDOWN);
|
||||||
|
props.AddKvStr("html-tooltip", wiki.Msg_mgr().Val_html_accesskey_and_title(plabel));
|
||||||
|
|
||||||
|
// 'html-tooltip' => Linker::tooltip( 'p-' . $label ),
|
||||||
|
props.AddKvStr("html-tooltip", linkertooltip);
|
||||||
|
|
||||||
|
// foreach ( $urls as $key => $item ) {
|
||||||
|
// $props['html-items'] .= $this->getSkin()->makeListItem( $key, $item );
|
||||||
|
// // Check the class of the item for a `selected` class and if so, propagate the items
|
||||||
|
// // label to the main label.
|
||||||
|
// if ( $setLabelToSelected ) {
|
||||||
|
// if ( isset( $item['class'] ) && stripos( $item['class'], 'selected' ) !== false ) {
|
||||||
|
// $props['label'] = $item['text'];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
props.AddKvStr("html-items", "<li id=\"ca-nstab-main\" class=\"selected\"><a href=\"/wiki/Main_Page\" title=\"View the content page [c]\" accesskey=\"c\">Main Page</a></li>");
|
||||||
|
|
||||||
|
// $afterPortal = '';
|
||||||
|
// if ( $isPortal ) {
|
||||||
|
// // The BaseTemplate::getAfterPortlet method ran the SkinAfterPortlet
|
||||||
|
// // hook and if content is added appends it to the html-after-portal method.
|
||||||
|
// // This replicates that historic behaviour.
|
||||||
|
// // This code should eventually be upstreamed to SkinMustache in core.
|
||||||
|
// // Currently in production this supports the Wikibase 'edit' link.
|
||||||
|
// $content = $this->getAfterPortlet( $label );
|
||||||
|
// if ( $content !== '' ) {
|
||||||
|
// $afterPortal = Html::rawElement(
|
||||||
|
// 'div',
|
||||||
|
// [ 'class' => [ 'after-portlet', 'after-portlet-' . $label ] ],
|
||||||
|
// $content
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// $props['html-after-portal'] = $afterPortal;
|
||||||
|
//
|
||||||
|
// // Mark the portal as empty if it has no content
|
||||||
|
// $class = ( count( $urls ) == 0 && !$props['html-after-portal'] )
|
||||||
|
// ? 'vector-menu-empty emptyPortlet' : '';
|
||||||
|
// $props['class'] = trim( "$class $extraClasses[$type]" );
|
||||||
|
// return $props;
|
||||||
|
|
||||||
|
props.AddKvStr("class", extraClasses[type]);
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Json_nde s_getMenuData(Xowe_wiki wiki, byte[] label, byte[] urls, int type) { return s_getMenuData(wiki, label, urls, type, false); }
|
||||||
|
private static Json_nde s_getMenuData(Xowe_wiki wiki, byte[] label_bry, byte[] urls, int type, boolean setLabelToSelected) {
|
||||||
|
boolean isPortal = type == MENU_TYPE_PORTAL;
|
||||||
|
|
||||||
|
String label = String_.new_u8(label_bry);
|
||||||
|
String msg = label; // for now
|
||||||
|
String linkertooltip = String_.Empty;
|
||||||
|
String listClasses = type == MENU_TYPE_DROPDOWN
|
||||||
|
? "menu vector-menu-content-list"
|
||||||
|
: "vector-menu-content-list";
|
||||||
|
String plabel = "p-" + label;
|
||||||
|
|
||||||
|
Json_nde props = Json_nde.NewByVal();
|
||||||
|
props.AddKvStr("id", plabel);
|
||||||
|
props.AddKvStr("label-id", plabel +"-label");
|
||||||
|
props.AddKvStr("label", msg);
|
||||||
|
props.AddKvStr("list-classes", listClasses);
|
||||||
|
props.AddKvBool("is-dropdown", type == MENU_TYPE_DROPDOWN);
|
||||||
|
props.AddKvStr("html-tooltip", wiki.Msg_mgr().Val_html_accesskey_and_title(plabel));
|
||||||
|
props.AddKvStr("html-tooltip", linkertooltip);
|
||||||
|
|
||||||
|
// foreach ( $urls as $key => $item ) {
|
||||||
|
// $props['html-items'] .= $this->getSkin()->makeListItem( $key, $item );
|
||||||
|
// // Check the class of the item for a `selected` class and if so, propagate the items
|
||||||
|
// // label to the main label.
|
||||||
|
// if ( $setLabelToSelected ) {
|
||||||
|
// if ( isset( $item['class'] ) && stripos( $item['class'], 'selected' ) !== false ) {
|
||||||
|
// $props['label'] = $item['text'];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
props.AddKvStr("html-items", urls);
|
||||||
|
|
||||||
|
// $afterPortal = '';
|
||||||
|
// if ( $isPortal ) {
|
||||||
|
// // The BaseTemplate::getAfterPortlet method ran the SkinAfterPortlet
|
||||||
|
// // hook and if content is added appends it to the html-after-portal method.
|
||||||
|
// // This replicates that historic behaviour.
|
||||||
|
// // This code should eventually be upstreamed to SkinMustache in core.
|
||||||
|
// // Currently in production this supports the Wikibase 'edit' link.
|
||||||
|
// $content = $this->getAfterPortlet( $label );
|
||||||
|
// if ( $content !== '' ) {
|
||||||
|
// $afterPortal = Html::rawElement(
|
||||||
|
// 'div',
|
||||||
|
// [ 'class' => [ 'after-portlet', 'after-portlet-' . $label ] ],
|
||||||
|
// $content
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// $props['html-after-portal'] = $afterPortal;
|
||||||
|
//
|
||||||
|
// // Mark the portal as empty if it has no content
|
||||||
|
// $class = ( count( $urls ) == 0 && !$props['html-after-portal'] )
|
||||||
|
// ? 'vector-menu-empty emptyPortlet' : '';
|
||||||
|
// $props['class'] = trim( "$class $extraClasses[$type]" );
|
||||||
|
// return $props;
|
||||||
|
props.AddKvStr("class", extraClasses[type]);
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,25 +13,41 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.htmls.sidebars; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.htmls.*;
|
package gplx.xowa.addons.htmls.sidebars;
|
||||||
import gplx.core.brys.*; import gplx.core.brys.fmts.*;
|
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Bry_fmt;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.core.brys.Bfr_arg;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
|
||||||
class Xoh_sidebar_htmlr {
|
class Xoh_sidebar_htmlr {
|
||||||
public static byte[] To_html(Bry_bfr bfr, Xowe_wiki wiki, List_adp grps) {
|
public static byte[] To_html(Bry_bfr bfr, Xowe_wiki wiki, List_adp grps) {
|
||||||
Xoh_sidebar_itms_fmtr itms_fmtr = new Xoh_sidebar_itms_fmtr();
|
Xoh_sidebar_itms_fmtr itms_fmtr = new Xoh_sidebar_itms_fmtr();
|
||||||
int len = grps.Count();
|
int len = grps.Count();
|
||||||
boolean popups_enabled = wiki.Html_mgr().Head_mgr().Popup_mgr().Enabled();
|
boolean popups_enabled = wiki.Html_mgr().Head_mgr().Popup_mgr().Enabled();
|
||||||
|
Bry_bfr tmp_bfr = Bry_bfr_.New();
|
||||||
for (int i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
Xoh_sidebar_itm grp = (Xoh_sidebar_itm)grps.Get_at(i);
|
Xoh_sidebar_itm grp = (Xoh_sidebar_itm)grps.Get_at(i);
|
||||||
itms_fmtr.Init_by_grp(popups_enabled, grp);
|
itms_fmtr.Init_by_grp(popups_enabled, grp);
|
||||||
fmt.Bld_many(bfr, grp.Id(), grp.Text(), itms_fmtr);
|
itms_fmtr.Bfr_arg__add(tmp_bfr);
|
||||||
|
Db_Nav_template.Build_Sidebar(wiki, bfr, grp.Id(), grp.Text(), tmp_bfr.To_bry_and_clear());
|
||||||
}
|
}
|
||||||
|
// dummy toolbox
|
||||||
|
// id="p-tb" used by some js
|
||||||
|
bfr.Add_str_a7("<div class=\"portal\" id=\"p-tb\"></div>");
|
||||||
return bfr.To_bry_and_clear();
|
return bfr.To_bry_and_clear();
|
||||||
}
|
}
|
||||||
private static final Bry_fmt fmt = Bry_fmt.Auto_nl_skip_last
|
private static final Bry_fmt fmt = Bry_fmt.Auto_nl_skip_last
|
||||||
( "<div class=\"portal\" id=\"~{grp_id}\">"
|
( "<div class=\"portal\" id=\"~{grp_id}\">"
|
||||||
, " <h3>~{grp_text}</h3>"
|
, " <h3 id=\"p-navigation-label\">"
|
||||||
, " <div class=\"body\">"
|
, " <span>~{grp_text}</span>"
|
||||||
, " <ul>~{itms}"
|
, " </h3>"
|
||||||
|
, " <!-- Please do not use the .body class, it is deprecated. -->"
|
||||||
|
, " <div class=\"body vector-menu-content\">"
|
||||||
|
, " <!-- Please do not use the .menu class, it is deprecated. -->"
|
||||||
|
, " <ul class=\"vector-menu-content-list\">~{itms}"
|
||||||
, " </ul>"
|
, " </ul>"
|
||||||
, " </div>"
|
, " </div>"
|
||||||
, "</div>"
|
, "</div>"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,11 +13,28 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.htmls.sidebars; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.htmls.*;
|
package gplx.xowa.addons.htmls.sidebars;
|
||||||
import org.junit.*;
|
|
||||||
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
|
import gplx.Bool_;
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.Tfds;
|
||||||
|
import gplx.xowa.Xoa_app_fxt;
|
||||||
|
import gplx.xowa.Xoae_app;
|
||||||
|
import gplx.xowa.Xop_fxt;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.langs.msgs.Xol_msg_itm;
|
||||||
|
import gplx.xowa.langs.msgs.Xol_msg_mgr;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
public class Xoh_sidebar_mgr_tst {
|
public class Xoh_sidebar_mgr_tst {
|
||||||
@Before public void init() {fxt.Clear();} private final Xoh_sidebar_mgr_fxt fxt = new Xoh_sidebar_mgr_fxt();
|
@Before public void init() {fxt.Clear();}
|
||||||
|
private final Xoh_sidebar_mgr_fxt fxt = new Xoh_sidebar_mgr_fxt();
|
||||||
@Test public void Grp() {
|
@Test public void Grp() {
|
||||||
fxt.Init__msg__grp("key", "text", "title");
|
fxt.Init__msg__grp("key", "text", "title");
|
||||||
fxt.Exec__make("* key");
|
fxt.Exec__make("* key");
|
||||||
@ -71,7 +88,39 @@ public class Xoh_sidebar_mgr_tst {
|
|||||||
fxt.Exec__make("** href_key<!--a-->|main_key<!--b-->");
|
fxt.Exec__make("** href_key<!--a-->|main_key<!--b-->");
|
||||||
fxt.Test__objs(fxt.Make__itm("text", "title", "accesskey", "/wiki/Href"));
|
fxt.Test__objs(fxt.Make__itm("text", "title", "accesskey", "/wiki/Href"));
|
||||||
}
|
}
|
||||||
@Test public void Smoke() {
|
@Test public void Itm_template_msg() {
|
||||||
|
fxt.Init__msg__itm("href", "main", null, null, null, "{{ns:Special}}:Random");
|
||||||
|
fxt.Exec__make("** href|main");
|
||||||
|
fxt.Test__objs(fxt.Make__itm("main", Null_str, Null_str, "/wiki/Special:Random"));
|
||||||
|
}
|
||||||
|
@Test public void Itm_template_key() {
|
||||||
|
fxt.Exec__make("** {{ns:Special}}:Random|main");
|
||||||
|
fxt.Test__objs(fxt.Make__itm("main", Null_str, Null_str, "/wiki/Special:Random"));
|
||||||
|
}
|
||||||
|
// @Test
|
||||||
|
public void Popups() {
|
||||||
|
fxt.Init__popups_enabled(true);
|
||||||
|
fxt.Exec__make
|
||||||
|
( "* navigation"
|
||||||
|
, "** mainpage|mainpage-description"
|
||||||
|
);
|
||||||
|
fxt.Test__objs
|
||||||
|
( fxt.Make__grp("navigation", "").Subs__add
|
||||||
|
( fxt.Make__itm("mainpage-description", Null_str, Null_str, "/wiki/Mainpage")
|
||||||
|
));
|
||||||
|
fxt.Test__html
|
||||||
|
( "<div class=\"portal\" id=\"n-navigation\">"
|
||||||
|
, " <h3>navigation</h3>"
|
||||||
|
, " <div class=\"body\">"
|
||||||
|
, " <ul>"
|
||||||
|
, " <li id=\"n-mainpage-description\"><a href=\"/wiki/Mainpage\" class='xowa-hover-off' title=\"\">mainpage-description</a></li>"
|
||||||
|
, " </ul>"
|
||||||
|
, " </div>"
|
||||||
|
, "</div>"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// @Test
|
||||||
|
public void Smoke() {
|
||||||
fxt.Init__msg__grp("navigation", "Grp_0_text", "Grp_0_title");
|
fxt.Init__msg__grp("navigation", "Grp_0_text", "Grp_0_title");
|
||||||
fxt.Init__msg__itm("mainpage", "mainpage-description", "Itm_0_text", "Itm_0_title [a]", "a", "Itm_0_href");
|
fxt.Init__msg__itm("mainpage", "mainpage-description", "Itm_0_text", "Itm_0_title [a]", "a", "Itm_0_href");
|
||||||
fxt.Init__msg__itm("Portal:Contents", "contents", "Itm_1_text", Null_str, Null_str, Null_str);
|
fxt.Init__msg__itm("Portal:Contents", "contents", "Itm_1_text", Null_str, Null_str, Null_str);
|
||||||
@ -114,36 +163,6 @@ public class Xoh_sidebar_mgr_tst {
|
|||||||
, "</div>"
|
, "</div>"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@Test public void Itm_template_msg() {
|
|
||||||
fxt.Init__msg__itm("href", "main", null, null, null, "{{ns:Special}}:Random");
|
|
||||||
fxt.Exec__make("** href|main");
|
|
||||||
fxt.Test__objs(fxt.Make__itm("main", Null_str, Null_str, "/wiki/Special:Random"));
|
|
||||||
}
|
|
||||||
@Test public void Itm_template_key() {
|
|
||||||
fxt.Exec__make("** {{ns:Special}}:Random|main");
|
|
||||||
fxt.Test__objs(fxt.Make__itm("main", Null_str, Null_str, "/wiki/Special:Random"));
|
|
||||||
}
|
|
||||||
@Test public void Popups() {
|
|
||||||
fxt.Init__popups_enabled(true);
|
|
||||||
fxt.Exec__make
|
|
||||||
( "* navigation"
|
|
||||||
, "** mainpage|mainpage-description"
|
|
||||||
);
|
|
||||||
fxt.Test__objs
|
|
||||||
( fxt.Make__grp("navigation", "").Subs__add
|
|
||||||
( fxt.Make__itm("mainpage-description", Null_str, Null_str, "/wiki/Mainpage")
|
|
||||||
));
|
|
||||||
fxt.Test__html
|
|
||||||
( "<div class=\"portal\" id=\"n-navigation\">"
|
|
||||||
, " <h3>navigation</h3>"
|
|
||||||
, " <div class=\"body\">"
|
|
||||||
, " <ul>"
|
|
||||||
, " <li id=\"n-mainpage-description\"><a href=\"/wiki/Mainpage\" class='xowa-hover-off' title=\"\">mainpage-description</a></li>"
|
|
||||||
, " </ul>"
|
|
||||||
, " </div>"
|
|
||||||
, "</div>"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
private static final String Null_str = "";
|
private static final String Null_str = "";
|
||||||
}
|
}
|
||||||
class Xoh_sidebar_mgr_fxt {
|
class Xoh_sidebar_mgr_fxt {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,10 +13,22 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.parsers.mediawikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.parsers.*;
|
package gplx.xowa.addons.parsers.mediawikis;
|
||||||
import gplx.xowa.wikis.*; import gplx.xowa.parsers.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.htmls.core.htmls.*;
|
|
||||||
import gplx.xowa.wikis.caches.*;
|
import gplx.Bry_;
|
||||||
import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.*;
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.xowa.Xoa_ttl;
|
||||||
|
import gplx.xowa.Xoae_page;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.Xoctg_pagebox_itm;
|
||||||
|
import gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx;
|
||||||
|
import gplx.xowa.parsers.Xop_ctx;
|
||||||
|
import gplx.xowa.parsers.Xow_parser_mgr;
|
||||||
|
import gplx.xowa.wikis.Xow_page_tid;
|
||||||
|
import gplx.xowa.wikis.pages.Xopg_view_mode_;
|
||||||
|
|
||||||
public class Xop_mediawiki_wkr {
|
public class Xop_mediawiki_wkr {
|
||||||
private final Xowe_wiki wiki;
|
private final Xowe_wiki wiki;
|
||||||
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
|
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
|
||||||
@ -26,7 +38,6 @@ public class Xop_mediawiki_wkr {
|
|||||||
wiki.Cache_mgr().Load_wkr_(new Xow_page_cache_wkr__embeddable(wiki, loader));
|
wiki.Cache_mgr().Load_wkr_(new Xow_page_cache_wkr__embeddable(wiki, loader));
|
||||||
}
|
}
|
||||||
public void Free_memory() {
|
public void Free_memory() {
|
||||||
wiki.Cache_mgr().Tmpl_result_cache().Clear();
|
|
||||||
wiki.Cache_mgr().Free_mem__page();
|
wiki.Cache_mgr().Free_mem__page();
|
||||||
wiki.Parser_mgr().Scrib().Core_term();
|
wiki.Parser_mgr().Scrib().Core_term();
|
||||||
wiki.Appe().Wiki_mgr().Wdata_mgr().Clear();
|
wiki.Appe().Wiki_mgr().Wdata_mgr().Clear();
|
||||||
@ -49,7 +60,7 @@ public class Xop_mediawiki_wkr {
|
|||||||
boolean is_wikitext = Xow_page_tid.Identify(wpg.Wiki().Domain_tid(), ttl.Ns().Id(), ttl.Page_db()) == Xow_page_tid.Tid_wikitext;
|
boolean is_wikitext = Xow_page_tid.Identify(wpg.Wiki().Domain_tid(), ttl.Ns().Id(), ttl.Page_db()) == Xow_page_tid.Tid_wikitext;
|
||||||
byte[] orig_bry = Bry_.Empty;
|
byte[] orig_bry = Bry_.Empty;
|
||||||
if (is_wikitext) {
|
if (is_wikitext) {
|
||||||
wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode_.Tid__read).Write_hdump(tmp_bfr, pctx, Xoh_wtr_ctx.Hdump, wpg);
|
wiki.Html_mgr().Page_wtr_mgr().Wkr(Xopg_view_mode_.Tid__read).Write_hdump(tmp_bfr, pctx, Xoh_wtr_ctx.Embeddable, wpg);
|
||||||
|
|
||||||
// write categories
|
// write categories
|
||||||
int ctgs_len = wpg.Wtxt().Ctgs__len();
|
int ctgs_len = wpg.Wtxt().Ctgs__len();
|
||||||
@ -59,7 +70,7 @@ public class Xop_mediawiki_wkr {
|
|||||||
for (int i = 0; i < ctgs_len; i++) {
|
for (int i = 0; i < ctgs_len; i++) {
|
||||||
pagebox_itms[i] = new Xoctg_pagebox_itm(wpg.Wtxt().Ctgs__get_at(i));
|
pagebox_itms[i] = new Xoctg_pagebox_itm(wpg.Wtxt().Ctgs__get_at(i));
|
||||||
}
|
}
|
||||||
wiki.Ctg__pagebox_wtr().Write_pagebox(tmp_bfr, wiki, wpg, pagebox_itms);
|
wiki.Ctg__pagebox_wtr().Write_pagebox(tmp_bfr, wpg, pagebox_itms);
|
||||||
}
|
}
|
||||||
|
|
||||||
orig_bry = tmp_bfr.To_bry_and_clear();
|
orig_bry = tmp_bfr.To_bry_and_clear();
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,22 +13,46 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.wikis.ctgs.htmls.pageboxs; 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.*;
|
package gplx.xowa.addons.wikis.ctgs.htmls.pageboxs;
|
||||||
import gplx.xowa.htmls.core.htmls.*;
|
|
||||||
import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.singles.*; import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.doubles.*;
|
import gplx.Bry_bfr;
|
||||||
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.data.tbls.*; import gplx.xowa.addons.wikis.ctgs.dbs.*;
|
import gplx.Err_;
|
||||||
|
import gplx.GfoMsg;
|
||||||
|
import gplx.Gfo_invk;
|
||||||
|
import gplx.Gfo_invk_;
|
||||||
|
import gplx.Gfo_usr_dlg_;
|
||||||
|
import gplx.GfsCtx;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.xowa.Xoa_page;
|
||||||
|
import gplx.xowa.Xow_wiki;
|
||||||
|
import gplx.xowa.addons.wikis.ctgs.dbs.Xodb_cat_db_;
|
||||||
|
import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.doubles.Xoctg_double_box;
|
||||||
|
import gplx.xowa.addons.wikis.ctgs.htmls.pageboxs.singles.Xoctg_single_box;
|
||||||
|
import gplx.xowa.wikis.data.Xow_db_file;
|
||||||
|
import gplx.xowa.wikis.data.tbls.Xowd_cat_core_tbl;
|
||||||
|
import gplx.xowa.wikis.data.tbls.Xowd_page_itm;
|
||||||
|
|
||||||
public class Xoctg_pagebox_wtr implements Gfo_invk {
|
public class Xoctg_pagebox_wtr implements Gfo_invk {
|
||||||
private final Xoctg_single_box single_box = new Xoctg_single_box();
|
private final Xoctg_single_box single_box = new Xoctg_single_box();
|
||||||
private final Xoctg_double_box double_box = new Xoctg_double_box();
|
private final Xoctg_double_box double_box = new Xoctg_double_box();
|
||||||
private final Xoctg_pagebox_hash hash = new Xoctg_pagebox_hash();
|
private Xow_wiki wiki;
|
||||||
private final Xowd_page_itm tmp_page_itm = new Xowd_page_itm();
|
private boolean grouping_enabled;
|
||||||
public boolean Grouping_enabled() {return grouping_enabled;} private boolean grouping_enabled;
|
|
||||||
public void Init_by_wiki(Xow_wiki wiki) {
|
public void Init_by_wiki(Xow_wiki wiki) {
|
||||||
|
this.wiki = wiki;
|
||||||
single_box.Init_by_wiki(wiki);
|
single_box.Init_by_wiki(wiki);
|
||||||
double_box.Init_by_wiki(wiki);
|
double_box.Init_by_wiki(wiki);
|
||||||
wiki.App().Cfg().Bind_many_wiki(this, wiki, Cfg__grouping_enabled);
|
wiki.App().Cfg().Bind_many_wiki(this, wiki, Cfg__grouping_enabled);
|
||||||
}
|
}
|
||||||
public void Write_pagebox(Bry_bfr bfr, Xow_wiki wiki, Xoa_page page, Xoctg_pagebox_itm[] pagebox_itms) {
|
|
||||||
|
public void Write_pagebox(Bry_bfr bfr, Xoa_page page) {
|
||||||
|
Xoctg_pagebox_itm[] itms = Get_catlinks_by_page(page);
|
||||||
|
if (itms.length > 0) {
|
||||||
|
this.Write_pagebox(bfr, page, itms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Write_pagebox(Bry_bfr bfr, Xoa_page page, Xoctg_pagebox_itm[] pagebox_itms) {
|
||||||
try {
|
try {
|
||||||
if (grouping_enabled)
|
if (grouping_enabled)
|
||||||
double_box.Write_pagebox(bfr, pagebox_itms);
|
double_box.Write_pagebox(bfr, pagebox_itms);
|
||||||
@ -38,20 +62,22 @@ public class Xoctg_pagebox_wtr implements Gfo_invk {
|
|||||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to write pagebox categories; page=~{0} err=~{1}", page.Url_bry_safe(), Err_.Message_gplx_log(e));
|
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to write pagebox categories; page=~{0} err=~{1}", page.Url_bry_safe(), Err_.Message_gplx_log(e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public Xoctg_pagebox_itm[] Get_catlinks_by_page(Xow_wiki wiki, Xoa_page page) {
|
|
||||||
|
private Xoctg_pagebox_itm[] Get_catlinks_by_page(Xoa_page page) {
|
||||||
// NOTE: db load is necessary b/c page.Wtxt().Ctgs__len() is insufficient
|
// NOTE: db load is necessary b/c page.Wtxt().Ctgs__len() is insufficient
|
||||||
// html_dbs will always be 0 since they do not parse ctgs;
|
// html_dbs will always be 0 since they do not parse ctgs;
|
||||||
// wtxt_dbs may have page.Wtxt().Ctgs__len() > 0 but these items don't have Id / Hidden
|
// wtxt_dbs may have page.Wtxt().Ctgs__len() > 0 but these items don't have Id / Hidden
|
||||||
|
Xoctg_pagebox_hash hash = new Xoctg_pagebox_hash();
|
||||||
Xoctg_pagebox_loader select_cbk = new Xoctg_pagebox_loader(hash, page.Url_bry_safe());
|
Xoctg_pagebox_loader select_cbk = new Xoctg_pagebox_loader(hash, page.Url_bry_safe());
|
||||||
|
|
||||||
// get cat_db_id from page
|
// get cat_db_id from page
|
||||||
tmp_page_itm.Clear();
|
Xowd_page_itm pageRow = new Xowd_page_itm();
|
||||||
boolean exists = wiki.Data__core_mgr().Tbl__page().Select_by_ttl(tmp_page_itm, page.Ttl().Ns(), page.Ttl().Page_db());
|
boolean exists = wiki.Data__core_mgr().Tbl__page().Select_by_ttl(pageRow, page.Ttl().Ns(), page.Ttl().Page_db());
|
||||||
int cat_db_id = tmp_page_itm.Cat_db_id();
|
int cat_db_id = pageRow.Cat_db_id();
|
||||||
if (exists && cat_db_id != -1) {// note that wtxt_dbs can have 0 ctgs but will have cat_db_id == -1
|
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);
|
Xow_db_file cat_link_db = wiki.Data__core_mgr().Dbs__get_by_id_or_null(cat_db_id);
|
||||||
if (cat_link_db != null && Io_mgr.Instance.ExistsFil(cat_link_db.Url())) { // make sure cat_db_id exists
|
if (cat_link_db != null && Io_mgr.Instance.ExistsFil(cat_link_db.Url())) { // make sure cat_db_id exists
|
||||||
select_cbk.Select_catlinks_by_page(wiki, cat_link_db.Conn(), hash, tmp_page_itm.Id());
|
select_cbk.Select_catlinks_by_page(wiki, cat_link_db.Conn(), hash, pageRow.Id());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,6 +89,7 @@ public class Xoctg_pagebox_wtr implements Gfo_invk {
|
|||||||
}
|
}
|
||||||
return hash.To_ary_and_clear();
|
return hash.To_ary_and_clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||||
if (ctx.Match(k, Cfg__grouping_enabled)) this.grouping_enabled = m.ReadYn("v");
|
if (ctx.Match(k, Cfg__grouping_enabled)) this.grouping_enabled = m.ReadYn("v");
|
||||||
else return Gfo_invk_.Rv_unhandled;
|
else return Gfo_invk_.Rv_unhandled;
|
||||||
|
@ -13,15 +13,28 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.gflucenes; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.fulltexts.*; import gplx.xowa.addons.wikis.fulltexts.searchers.*; import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.*;
|
package gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.gflucenes;
|
||||||
import gplx.gflucene.*;
|
|
||||||
import gplx.gflucene.core.*;
|
import gplx.Gfo_usr_dlg_;
|
||||||
import gplx.gflucene.indexers.*;
|
import gplx.Ordered_hash;
|
||||||
import gplx.gflucene.searchers.*;
|
import gplx.Ordered_hash_;
|
||||||
import gplx.gflucene.highlighters.*;
|
import gplx.String_;
|
||||||
import gplx.xowa.wikis.data.tbls.*;
|
import gplx.gflucene.core.Gflucene_analyzer_data;
|
||||||
import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.uis.*;
|
import gplx.gflucene.core.Gflucene_doc_data;
|
||||||
import gplx.xowa.addons.wikis.fulltexts.searchers.caches.*;
|
import gplx.gflucene.core.Gflucene_index_data;
|
||||||
|
import gplx.gflucene.searchers.Gflucene_searcher_mgr;
|
||||||
|
import gplx.gflucene.searchers.Gflucene_searcher_qry;
|
||||||
|
import gplx.xowa.Xoa_ttl;
|
||||||
|
import gplx.xowa.Xow_wiki;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.Xosearch_fulltext_addon;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.searchers.caches.Xofulltext_cache_qry;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.Xofulltext_args_qry;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.Xofulltext_args_wiki;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.Xofulltext_searcher;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.uis.Xofulltext_searcher_page;
|
||||||
|
import gplx.xowa.addons.wikis.fulltexts.searchers.mgrs.uis.Xofulltext_searcher_ui;
|
||||||
|
import gplx.xowa.wikis.data.tbls.Xowd_page_itm;
|
||||||
|
import gplx.xowa.wikis.data.tbls.Xowd_page_tbl;
|
||||||
public class Xofulltext_searcher__lucene implements Xofulltext_searcher {
|
public class Xofulltext_searcher__lucene implements Xofulltext_searcher {
|
||||||
private final Gflucene_searcher_mgr searcher = new Gflucene_searcher_mgr();
|
private final Gflucene_searcher_mgr searcher = new Gflucene_searcher_mgr();
|
||||||
public boolean Type_is_lucene() {return true;}
|
public boolean Type_is_lucene() {return true;}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,21 +13,54 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.addons.wikis.pages.randoms.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.pages.*; import gplx.xowa.addons.wikis.pages.randoms.*;
|
package gplx.xowa.addons.wikis.pages.randoms.specials;
|
||||||
import gplx.xowa.wikis.nss.*; import gplx.xowa.specials.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.xowa.Xoa_page;
|
||||||
|
import gplx.xowa.Xoa_ttl;
|
||||||
|
import gplx.xowa.Xoa_url;
|
||||||
|
import gplx.xowa.Xoae_page;
|
||||||
|
import gplx.xowa.Xow_wiki;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.specials.Xow_special_meta;
|
||||||
|
import gplx.xowa.specials.Xow_special_meta_;
|
||||||
|
import gplx.xowa.specials.Xow_special_page;
|
||||||
|
import gplx.xowa.wikis.data.tbls.Xowd_page_tbl;
|
||||||
|
import gplx.xowa.wikis.nss.Xow_ns;
|
||||||
|
|
||||||
public class Rndm_root_special implements Xow_special_page {
|
public class Rndm_root_special implements Xow_special_page {
|
||||||
public void Special__gen(Xow_wiki wikii, Xoa_page pagei, Xoa_url url, Xoa_ttl ttl) {
|
@Override public Xow_special_meta Special__meta() {return new Xow_special_meta(Xow_special_meta_.Src__mw, SPECIAL_KEY);}
|
||||||
|
@Override public Xow_special_page Special__clone() {return this;}
|
||||||
|
@Override public void Special__gen(Xow_wiki wikii, Xoa_page pagei, Xoa_url url, Xoa_ttl ttl) {
|
||||||
|
// get ns
|
||||||
Xowe_wiki wiki = (Xowe_wiki)wikii; Xoae_page page = (Xoae_page)pagei;
|
Xowe_wiki wiki = (Xowe_wiki)wikii; Xoae_page page = (Xoae_page)pagei;
|
||||||
Xow_ns ns = wiki.Ns_mgr().Names_get_or_main(ttl.Rest_txt());
|
Xow_ns ns = wiki.Ns_mgr().Names_get_or_main(ttl.Rest_txt());
|
||||||
// Rndm_addon.Get(wiki).Mgr().Regy().Get_rndm_page_by_ns(ns);
|
|
||||||
byte[] random_ttl_bry = wiki.Db_mgr().Load_mgr().Find_random_ttl(ns);
|
// get random ttl
|
||||||
byte[] root_bry = Xoa_ttl.Parse(wiki, random_ttl_bry).Root_txt();
|
String randomTitleString = selectRandomTitle(wiki, ns.Id());
|
||||||
wiki.Data_mgr().Redirect(page, ns.Gen_ttl(root_bry));
|
wiki.Data_mgr().RedirectWithoutLoading(page, ns.Gen_ttl(Bry_.new_u8(randomTitleString)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String selectRandomTitle(Xow_wiki wiki, int ns_id) {
|
||||||
|
// ISSUE#:719; find pages without "/" and not redirect
|
||||||
|
// REF.MW:https://github.com/wikimedia/mediawiki/blob/master/includes/specials/SpecialRandomrootpage.php
|
||||||
|
Xowd_page_tbl pageTbl = wiki.Data__core_mgr().Db__core().Tbl__page();
|
||||||
|
String where = String_.Format
|
||||||
|
("p.{0} = {1} AND p.{2} = {3} AND p.{4} NOT LIKE '%/%'"
|
||||||
|
, pageTbl.Fld_page_ns(), ns_id
|
||||||
|
, pageTbl.Fld_redirect_id(), Xowd_page_tbl.INVALID_PAGE_ID
|
||||||
|
, pageTbl.Fld_page_title()
|
||||||
|
);
|
||||||
|
|
||||||
|
return (String)pageTbl.Conn().WkrMgr().ExecRandomObj
|
||||||
|
( pageTbl.Fld_page_title()
|
||||||
|
, pageTbl.Tbl_name() + " p"
|
||||||
|
, where
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final String SPECIAL_KEY = "RandomRootPage";
|
public static final String SPECIAL_KEY = "RandomRootPage";
|
||||||
public static final byte[] Display_ttl = Bry_.new_a7("Random Root Page");
|
public static final byte[] Display_ttl = Bry_.new_a7("Random Root Page");
|
||||||
public Xow_special_meta Special__meta() {return new Xow_special_meta(Xow_special_meta_.Src__mw, SPECIAL_KEY);}
|
|
||||||
public static final Xow_special_page Prototype = new Rndm_root_special();
|
public static final Xow_special_page Prototype = new Rndm_root_special();
|
||||||
public Xow_special_page Special__clone() {return this;}
|
|
||||||
}
|
}
|
||||||
|
@ -1,54 +0,0 @@
|
|||||||
/*
|
|
||||||
XOWA: the XOWA Offline Wiki Application
|
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
|
||||||
|
|
||||||
You may use XOWA according to either of these licenses as is most appropriate
|
|
||||||
for your project on a case-by-case basis.
|
|
||||||
|
|
||||||
The terms of each license can be found in the source code repository:
|
|
||||||
|
|
||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|
||||||
*/
|
|
||||||
package gplx.xowa.addons.wikis.pages.randoms.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.pages.*; import gplx.xowa.addons.wikis.pages.randoms.*;
|
|
||||||
import org.junit.*; import gplx.xowa.specials.*;
|
|
||||||
public class Rndm_root_special_tst {
|
|
||||||
@Before public void init() {fxt.Clear();} private Rndm_root_special_fxt fxt = new Rndm_root_special_fxt();
|
|
||||||
@Test public void Ns_main() {
|
|
||||||
fxt.Init_create_page("A");
|
|
||||||
fxt.Init_create_page("A/B/C");
|
|
||||||
fxt.Test_open("Special:RandomRootPage/Main", "A"); // NOTE: result will always be "A"; "A" -> "A"; "A/B/C" -> "A"
|
|
||||||
}
|
|
||||||
@Test public void Ns_help() {
|
|
||||||
fxt.Init_create_page("Help:A");
|
|
||||||
fxt.Init_create_page("Help:A/B/C");
|
|
||||||
fxt.Test_open("Special:RandomRootPage/Help", "Help:A");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class Rndm_root_special_fxt {
|
|
||||||
private Xop_fxt parser_fxt; private Rndm_root_special special_page; private Xowe_wiki wiki;
|
|
||||||
public void Clear() {
|
|
||||||
parser_fxt = new Xop_fxt();
|
|
||||||
parser_fxt.Reset();
|
|
||||||
wiki = parser_fxt.Wiki();
|
|
||||||
special_page = new gplx.xowa.addons.wikis.pages.randoms.specials.Rndm_root_special();
|
|
||||||
}
|
|
||||||
public void Init_create_page(String page) {parser_fxt.Init_page_create(page, page);}
|
|
||||||
public void Test_open(String special_url, String expd) {
|
|
||||||
Xoae_page page = Test_special_open(wiki, special_page, special_url);
|
|
||||||
Tfds.Eq(expd, String_.new_a7(page.Url().Page_bry()));
|
|
||||||
Tfds.Eq(expd, String_.new_a7(page.Db().Text().Text_bry()));
|
|
||||||
}
|
|
||||||
public static Xoae_page Test_special_open(Xowe_wiki wiki, Xow_special_page special_page, String special_url) {
|
|
||||||
Xoae_page page = wiki.Parser_mgr().Ctx().Page();
|
|
||||||
Xoa_url url = wiki.Utl__url_parser().Parse(Bry_.new_u8(special_url));
|
|
||||||
page.Url_(url);
|
|
||||||
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, Bry_.new_a7(special_url));
|
|
||||||
page.Ttl_(ttl);
|
|
||||||
special_page.Special__gen(wiki, page, url, ttl);
|
|
||||||
return page;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,10 +13,24 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.apps.servers.http; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.xowa.apps.servers.*;
|
package gplx.xowa.apps.servers.http;
|
||||||
import gplx.core.envs.*;
|
|
||||||
import gplx.xowa.guis.views.*;
|
import gplx.Bry_;
|
||||||
import gplx.xowa.specials.*; import gplx.xowa.specials.xowa.errors.*;
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.envs.Runtime_;
|
||||||
|
import gplx.xowa.Xoa_ttl;
|
||||||
|
import gplx.xowa.Xoa_url;
|
||||||
|
import gplx.xowa.Xoae_app;
|
||||||
|
import gplx.xowa.Xoae_page;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.Xowe_wiki_;
|
||||||
|
import gplx.xowa.apps.servers.Gxw_html_server;
|
||||||
|
import gplx.xowa.guis.views.Xog_tab_itm;
|
||||||
|
import gplx.xowa.specials.Xow_special_meta_;
|
||||||
|
import gplx.xowa.specials.xowa.errors.Xoerror_special;
|
||||||
|
|
||||||
public class Http_server_page {
|
public class Http_server_page {
|
||||||
private final Xoae_app app;
|
private final Xoae_app app;
|
||||||
public Http_server_page(Xoae_app app) {
|
public Http_server_page(Xoae_app app) {
|
||||||
@ -97,26 +111,22 @@ public class Http_server_page {
|
|||||||
this.html = wiki.Html_mgr().Head_mgr().Popup_mgr().Show_init(popup_id, ttl_bry, ttl_bry);
|
this.html = wiki.Html_mgr().Head_mgr().Popup_mgr().Show_init(popup_id, ttl_bry, ttl_bry);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// NOTE: generates HTML, but substitutes xoimg tags for <img>; ISSUE#:686; DATE:2020-06-27
|
||||||
byte[] page_html = wiki.Html_mgr().Page_wtr_mgr().Gen(page, mode);
|
byte[] page_html = wiki.Html_mgr().Page_wtr_mgr().Gen(page, mode);
|
||||||
|
|
||||||
page_html = Bry_.Replace_many(page_html, app.Fsys_mgr().Root_dir().To_http_file_bry(), Http_server_wkr.Url__fsys);
|
page_html = Bry_.Replace_many(page_html, app.Fsys_mgr().Root_dir().To_http_file_bry(), Http_server_wkr.Url__fsys);
|
||||||
this.html = String_.new_u8(page_html); // NOTE: must generate HTML now in order for "wait" and "async_server" to work with text_dbs; DATE:2016-07-10
|
this.html = String_.new_u8(page_html); // NOTE: must generate HTML now in order for "wait" and "async_server" to work with text_dbs; DATE:2016-07-10
|
||||||
boolean rebuild_html = false;
|
|
||||||
switch (retrieve_mode) {
|
switch (retrieve_mode) {
|
||||||
case File_retrieve_mode.Mode_skip: // noop
|
case File_retrieve_mode.Mode_skip: // noop
|
||||||
break;
|
break;
|
||||||
case File_retrieve_mode.Mode_async_server:
|
case File_retrieve_mode.Mode_async_server:
|
||||||
rebuild_html = true;
|
|
||||||
app.Gui_mgr().Browser_win().Page__async__bgn(tab);
|
app.Gui_mgr().Browser_win().Page__async__bgn(tab);
|
||||||
break;
|
break;
|
||||||
case File_retrieve_mode.Mode_wait:
|
case File_retrieve_mode.Mode_wait:
|
||||||
rebuild_html = true;
|
|
||||||
gplx.xowa.guis.views.Xog_async_wkr.Async(page, tab.Html_itm());
|
gplx.xowa.guis.views.Xog_async_wkr.Async(page, tab.Html_itm());
|
||||||
this.page = wiki.Page_mgr().Load_page(url, ttl, tab); // HACK: fetch page again so that HTML will now include img data
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (rebuild_html)
|
// NOTE: substitutes xoimg tags for actual file; ISSUE#:686; DATE:2020-06-27
|
||||||
this.html = String_.new_u8(wiki.Html_mgr().Page_wtr_mgr().Gen(page, mode));
|
this.html = String_.new_u8(wiki.Html__hdump_mgr().Load_mgr().Parse(page_html, this.page));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,16 +13,32 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.apps.site_cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*;
|
package gplx.xowa.apps.site_cfgs;
|
||||||
import gplx.core.net.*; import gplx.langs.jsons.*; import gplx.xowa.apps.gfs.*;
|
|
||||||
import gplx.xowa.langs.*;
|
import gplx.Bry_;
|
||||||
import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.*;
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Bry_split_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.net.Gfo_url_parser;
|
||||||
|
import gplx.langs.jsons.Json_itm;
|
||||||
|
import gplx.langs.jsons.Json_nde;
|
||||||
|
import gplx.xowa.Xow_wiki;
|
||||||
|
import gplx.xowa.apps.gfs.Gfs_php_converter;
|
||||||
|
import gplx.xowa.wikis.domains.Xow_domain_itm_;
|
||||||
|
import gplx.xowa.wikis.domains.Xow_domain_tid_;
|
||||||
|
import gplx.xowa.wikis.xwikis.Xow_xwiki_mgr;
|
||||||
|
|
||||||
class Xoa_site_cfg_itm__interwikimap extends Xoa_site_cfg_itm__base {
|
class Xoa_site_cfg_itm__interwikimap extends Xoa_site_cfg_itm__base {
|
||||||
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
|
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
|
||||||
private final Gfo_url_parser url_parser = new Gfo_url_parser();
|
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);}
|
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) {
|
@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);
|
Json_nde nde = Json_nde.Cast(itm);
|
||||||
if (i != 0) bfr.Add_byte_nl();
|
if (i != 0) bfr.Add_byte_nl();
|
||||||
byte[] iw_key = nde.Get_bry_or_null("prefix"); if (iw_key == null) throw Err_.new_("site_meta", "invalid interwiki", "key", iw_key);
|
byte[] iw_key = nde.Get_bry_or_null("prefix"); if (iw_key == null) throw Err_.new_("site_meta", "invalid interwiki", "key", iw_key);
|
||||||
byte[] iw_url = nde.Get_bry_or_null("url"); if (iw_url == null) throw Err_.new_("site_meta", "invalid interwiki", "url", iw_key);
|
byte[] iw_url = nde.Get_bry_or_null("url"); if (iw_url == null) throw Err_.new_("site_meta", "invalid interwiki", "url", iw_key);
|
||||||
@ -123,4 +139,3 @@ class Xoa_site_cfg_itm__interwikimap extends Xoa_site_cfg_itm__base {
|
|||||||
, Arg0_wm = Bry_.new_a7("$1")
|
, Arg0_wm = Bry_.new_a7("$1")
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,14 +13,49 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.bldrs.cmds; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*;
|
package gplx.xowa.bldrs.cmds;
|
||||||
import gplx.core.envs.*;
|
|
||||||
import gplx.dbs.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.addons.bldrs.files.*; import gplx.xowa.files.origs.*;
|
import gplx.Bry_;
|
||||||
import gplx.xowa.bldrs.wkrs.*;
|
import gplx.Bry_bfr;
|
||||||
import gplx.xowa.wikis.nss.*;
|
import gplx.Bry_bfr_;
|
||||||
import gplx.xowa.wikis.data.*; import gplx.xowa.wikis.dbs.*; import gplx.xowa.wikis.data.tbls.*;
|
import gplx.Datetime_now;
|
||||||
import gplx.xowa.addons.bldrs.files.utls.*;
|
import gplx.Decimal_adp;
|
||||||
import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*;
|
import gplx.Decimal_adp_;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.GfoMsg;
|
||||||
|
import gplx.Gfo_invk;
|
||||||
|
import gplx.Gfo_invk_;
|
||||||
|
import gplx.Gfo_usr_dlg;
|
||||||
|
import gplx.GfsCtx;
|
||||||
|
import gplx.Int_;
|
||||||
|
import gplx.Io_mgr;
|
||||||
|
import gplx.Io_url;
|
||||||
|
import gplx.List_adp;
|
||||||
|
import gplx.List_adp_;
|
||||||
|
import gplx.Math_;
|
||||||
|
import gplx.String_;
|
||||||
|
import gplx.core.envs.System_;
|
||||||
|
import gplx.dbs.Db_conn;
|
||||||
|
import gplx.xowa.Xoae_app;
|
||||||
|
import gplx.xowa.Xowe_wiki;
|
||||||
|
import gplx.xowa.Xowe_wiki_;
|
||||||
|
import gplx.xowa.addons.bldrs.files.utls.Xobu_poll_mgr;
|
||||||
|
import gplx.xowa.bldrs.Xob_bldr;
|
||||||
|
import gplx.xowa.bldrs.wkrs.Xob_cmd;
|
||||||
|
import gplx.xowa.bldrs.wkrs.Xob_itm_basic_base;
|
||||||
|
import gplx.xowa.files.origs.Xof_orig_wkr_;
|
||||||
|
import gplx.xowa.parsers.Xop_ctx;
|
||||||
|
import gplx.xowa.parsers.Xop_parser;
|
||||||
|
import gplx.xowa.parsers.Xop_root_tkn;
|
||||||
|
import gplx.xowa.parsers.tmpls.Xot_defn_tmpl;
|
||||||
|
import gplx.xowa.wikis.caches.Xow_defn_cache;
|
||||||
|
import gplx.xowa.wikis.data.Xow_db_file;
|
||||||
|
import gplx.xowa.wikis.data.Xow_db_file_;
|
||||||
|
import gplx.xowa.wikis.data.Xow_db_mgr;
|
||||||
|
import gplx.xowa.wikis.data.tbls.Xowd_page_itm;
|
||||||
|
import gplx.xowa.wikis.nss.Xow_ns;
|
||||||
|
import gplx.xowa.wikis.nss.Xow_ns_;
|
||||||
|
|
||||||
public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xob_cmd, Gfo_invk {
|
public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xob_cmd, Gfo_invk {
|
||||||
private Xob_dump_src_id page_src;
|
private Xob_dump_src_id page_src;
|
||||||
private Xow_db_mgr db_fsys_mgr; protected Xop_parser parser; protected Xop_ctx ctx; protected Xop_root_tkn root;
|
private Xow_db_mgr db_fsys_mgr; protected Xop_parser parser; protected Xop_ctx ctx; protected Xop_root_tkn root;
|
||||||
@ -151,8 +186,6 @@ public abstract class Xob_dump_mgr_base extends Xob_itm_basic_base implements Xo
|
|||||||
if (page_src != null) // some pages have no text; ignore them else null ref; PAGE: it.d:miercuri DATE:2015-12-05
|
if (page_src != null) // some pages have no text; ignore them else null ref; PAGE: it.d:miercuri DATE:2015-12-05
|
||||||
Exec_pg_itm_hook(ns_ord, ns, page, page_src);
|
Exec_pg_itm_hook(ns_ord, ns, page, page_src);
|
||||||
ctx.Wiki().Utl__bfr_mkr().Clear_fail_check(); // make sure all bfrs are released
|
ctx.Wiki().Utl__bfr_mkr().Clear_fail_check(); // make sure all bfrs are released
|
||||||
if (ctx.Wiki().Cache_mgr().Tmpl_result_cache().Count() > 50000)
|
|
||||||
ctx.Wiki().Cache_mgr().Tmpl_result_cache().Clear();
|
|
||||||
++exec_count;
|
++exec_count;
|
||||||
rate_mgr.Increment();
|
rate_mgr.Increment();
|
||||||
if ((exec_count % poll_interval) == 0)
|
if ((exec_count % poll_interval) == 0)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,8 +13,19 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.bldrs.wms.revs; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.wms.*;
|
package gplx.xowa.bldrs.wms.revs;
|
||||||
import gplx.langs.jsons.*; import gplx.core.net.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_bfr;
|
||||||
|
import gplx.Bry_bfr_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Ordered_hash;
|
||||||
|
import gplx.core.net.Gfo_inet_conn;
|
||||||
|
import gplx.langs.jsons.Json_doc;
|
||||||
|
import gplx.langs.jsons.Json_nde;
|
||||||
|
import gplx.langs.jsons.Json_parser;
|
||||||
|
import gplx.xowa.bldrs.wms.Xowm_api_mgr;
|
||||||
|
|
||||||
class Xowm_rev_wkr__meta__wm implements Xowm_rev_wkr__meta {
|
class Xowm_rev_wkr__meta__wm implements Xowm_rev_wkr__meta {
|
||||||
private final Json_parser json_parser = new Json_parser();
|
private final Json_parser json_parser = new Json_parser();
|
||||||
private final Xowm_json_parser__page json_page_parser = new Xowm_json_parser__page();
|
private final Xowm_json_parser__page json_page_parser = new Xowm_json_parser__page();
|
||||||
@ -35,7 +46,7 @@ class Xowm_rev_wkr__meta__wm implements Xowm_rev_wkr__meta {
|
|||||||
}
|
}
|
||||||
private void Parse_doc(Ordered_hash hash, byte[] json) {
|
private void Parse_doc(Ordered_hash hash, byte[] json) {
|
||||||
Json_doc jdoc = json_parser.Parse(json);
|
Json_doc jdoc = json_parser.Parse(json);
|
||||||
Json_nde pages_nde = Json_nde.cast(jdoc.Get_grp_many(Jpath__query_pages));
|
Json_nde pages_nde = Json_nde.Cast(jdoc.Get_grp_many(Jpath__query_pages));
|
||||||
int len = pages_nde.Len();
|
int len = pages_nde.Len();
|
||||||
for (int i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
Parse_page(hash, pages_nde.Get_at_as_kv(i).Val_as_nde());
|
Parse_page(hash, pages_nde.Get_at_as_kv(i).Val_as_nde());
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -13,15 +13,25 @@ The terms of each license can be found in the source code repository:
|
|||||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||||
*/
|
*/
|
||||||
package gplx.xowa.files; import gplx.*; import gplx.xowa.*;
|
package gplx.xowa.files;
|
||||||
import gplx.core.primitives.*;
|
|
||||||
|
import gplx.Bry_;
|
||||||
|
import gplx.Bry_find_;
|
||||||
|
import gplx.Byte_ascii;
|
||||||
|
import gplx.Err_;
|
||||||
|
import gplx.Hash_adp;
|
||||||
|
import gplx.Hash_adp_bry;
|
||||||
|
import gplx.core.primitives.Int_obj_val;
|
||||||
|
|
||||||
public class Xof_ext_ {
|
public class Xof_ext_ {
|
||||||
public static final int Id_unknown = 0 // SERIALIZED; ids are saved to fsdb;
|
public static final int Id_unknown = 0 // SERIALIZED; ids are saved to fsdb;
|
||||||
, Id_png = 1, Id_jpg = 2, Id_jpeg = 3, Id_gif = 4, Id_tif = 5, Id_tiff = 6
|
, Id_png = 1, Id_jpg = 2, Id_jpeg = 3, Id_gif = 4, Id_tif = 5, Id_tiff = 6
|
||||||
, Id_svg = 7, Id_djvu = 8, Id_pdf = 9
|
, Id_svg = 7, Id_djvu = 8, Id_pdf = 9
|
||||||
, Id_mid = 10, Id_ogg = 11, Id_oga = 12, Id_ogv = 13, Id_webm = 14
|
, Id_mid = 10, Id_ogg = 11, Id_oga = 12, Id_ogv = 13, Id_webm = 14
|
||||||
, Id_flac = 15, Id_bmp = 16, Id_xcf = 17, Id_wav = 18, Id_opus = 19;
|
, Id_flac = 15, Id_bmp = 16, Id_xcf = 17, Id_wav = 18, Id_opus = 19
|
||||||
public static final int Id__max = 20;
|
, Id_stl = 20, Id_webp = 21;
|
||||||
|
;
|
||||||
|
public static final int Id__max = 22;
|
||||||
public static final byte[]
|
public static final byte[]
|
||||||
Bry_png = Bry_.new_a7("png"), Bry_jpg = Bry_.new_a7("jpg"), Bry_jpeg = Bry_.new_a7("jpeg")
|
Bry_png = Bry_.new_a7("png"), Bry_jpg = Bry_.new_a7("jpg"), Bry_jpeg = Bry_.new_a7("jpeg")
|
||||||
, Bry_gif = Bry_.new_a7("gif"), Bry_tif = Bry_.new_a7("tif"), Bry_tiff = Bry_.new_a7("tiff")
|
, Bry_gif = Bry_.new_a7("gif"), Bry_tif = Bry_.new_a7("tif"), Bry_tiff = Bry_.new_a7("tiff")
|
||||||
@ -29,6 +39,7 @@ public class Xof_ext_ {
|
|||||||
, Bry_mid = Bry_.new_a7("mid"), Bry_ogg = Bry_.new_a7("ogg"), Bry_oga = Bry_.new_a7("oga")
|
, Bry_mid = Bry_.new_a7("mid"), Bry_ogg = Bry_.new_a7("ogg"), Bry_oga = Bry_.new_a7("oga")
|
||||||
, Bry_ogv = Bry_.new_a7("ogv"), Bry_webm = Bry_.new_a7("webm"), Bry_flac = Bry_.new_a7("flac")
|
, Bry_ogv = Bry_.new_a7("ogv"), Bry_webm = Bry_.new_a7("webm"), Bry_flac = Bry_.new_a7("flac")
|
||||||
, Bry_bmp = Bry_.new_a7("bmp"), Bry_xcf = Bry_.new_a7("xcf"), Bry_wav = Bry_.new_a7("wav"), Bry_opus = Bry_.new_a7("opus")
|
, Bry_bmp = Bry_.new_a7("bmp"), Bry_xcf = Bry_.new_a7("xcf"), Bry_wav = Bry_.new_a7("wav"), Bry_opus = Bry_.new_a7("opus")
|
||||||
|
, Bry_stl = Bry_.new_a7("stl"), Bry_webp = Bry_.new_a7("webp")
|
||||||
;
|
;
|
||||||
public static final byte[][] Bry__ary = new byte[][]
|
public static final byte[][] Bry__ary = new byte[][]
|
||||||
{ Bry_.Empty, Bry_png, Bry_jpg, Bry_jpeg
|
{ Bry_.Empty, Bry_png, Bry_jpg, Bry_jpeg
|
||||||
@ -37,6 +48,7 @@ public class Xof_ext_ {
|
|||||||
, Bry_mid, Bry_ogg, Bry_oga
|
, Bry_mid, Bry_ogg, Bry_oga
|
||||||
, Bry_ogv, Bry_webm, Bry_flac
|
, Bry_ogv, Bry_webm, Bry_flac
|
||||||
, Bry_bmp, Bry_xcf, Bry_wav, Bry_opus
|
, Bry_bmp, Bry_xcf, Bry_wav, Bry_opus
|
||||||
|
, Bry_stl, Bry_webp
|
||||||
};
|
};
|
||||||
public static final byte[][] Mime_type__ary = new byte[][]
|
public static final byte[][] Mime_type__ary = new byte[][]
|
||||||
{ Bry_.new_a7("application/octet-stream"), Bry_.new_a7("image/png"), Bry_.new_a7("image/jpg"), Bry_.new_a7("image/jpeg")
|
{ Bry_.new_a7("application/octet-stream"), Bry_.new_a7("image/png"), Bry_.new_a7("image/jpg"), Bry_.new_a7("image/jpeg")
|
||||||
@ -44,7 +56,10 @@ public class Xof_ext_ {
|
|||||||
, Bry_.new_a7("image/svg+xml"), Bry_.new_a7("image/x.djvu"), Bry_.new_a7("application/pdf")
|
, Bry_.new_a7("image/svg+xml"), Bry_.new_a7("image/x.djvu"), Bry_.new_a7("application/pdf")
|
||||||
, Bry_.new_a7("application/x-midi"), Bry_.new_a7("video/ogg"), Bry_.new_a7("audio/oga")
|
, Bry_.new_a7("application/x-midi"), Bry_.new_a7("video/ogg"), Bry_.new_a7("audio/oga")
|
||||||
, Bry_.new_a7("video/ogg"), Bry_.new_a7("video/webm"), Bry_.new_a7("audio/flac")
|
, Bry_.new_a7("video/ogg"), Bry_.new_a7("video/webm"), Bry_.new_a7("audio/flac")
|
||||||
, Bry_.new_a7("image/bmp"), Bry_.new_a7("image/xcf"), Bry_.new_a7("audio/x-wav"), Bry_.new_a7("audio/opus")
|
, Bry_.new_a7("image/bmp")
|
||||||
|
, Bry_.new_a7("image/x-xcf") // changed from "/xcf"; DATE:2020-04-21
|
||||||
|
, Bry_.new_a7("audio/x-wav"), Bry_.new_a7("audio/opus")
|
||||||
|
, Bry_.new_a7("model/stl"), Bry_.new_a7("video/webp")
|
||||||
};
|
};
|
||||||
private static final Hash_adp id_hash = id_hash_new_();
|
private static final Hash_adp id_hash = id_hash_new_();
|
||||||
private static Hash_adp id_hash_new_() {
|
private static Hash_adp id_hash_new_() {
|
||||||
@ -55,7 +70,7 @@ public class Xof_ext_ {
|
|||||||
id_hash_new_(rv, Bry_mid, Id_mid); id_hash_new_(rv, Bry_ogg, Id_ogg); id_hash_new_(rv, Bry_oga, Id_oga);
|
id_hash_new_(rv, Bry_mid, Id_mid); id_hash_new_(rv, Bry_ogg, Id_ogg); id_hash_new_(rv, Bry_oga, Id_oga);
|
||||||
id_hash_new_(rv, Bry_ogv, Id_ogv); id_hash_new_(rv, Bry_webm, Id_webm); id_hash_new_(rv, Bry_flac, Id_flac);
|
id_hash_new_(rv, Bry_ogv, Id_ogv); id_hash_new_(rv, Bry_webm, Id_webm); id_hash_new_(rv, Bry_flac, Id_flac);
|
||||||
id_hash_new_(rv, Bry_bmp, Id_bmp); id_hash_new_(rv, Bry_xcf, Id_xcf); id_hash_new_(rv, Bry_wav, Id_wav);
|
id_hash_new_(rv, Bry_bmp, Id_bmp); id_hash_new_(rv, Bry_xcf, Id_xcf); id_hash_new_(rv, Bry_wav, Id_wav);
|
||||||
id_hash_new_(rv, Bry_opus, Id_opus);
|
id_hash_new_(rv, Bry_opus, Id_opus); id_hash_new_(rv, Bry_stl, Id_stl); id_hash_new_(rv, Bry_webp, Id_webp);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
private static void id_hash_new_(Hash_adp hash, byte[] key, int val) {hash.Add(key, new Int_obj_val(val));}
|
private static void id_hash_new_(Hash_adp hash, byte[] key, int val) {hash.Add(key, new Int_obj_val(val));}
|
||||||
@ -67,7 +82,7 @@ public class Xof_ext_ {
|
|||||||
.Add_bry_bry(Bry_mid).Add_bry_bry(Bry_ogg).Add_bry_bry(Bry_oga)
|
.Add_bry_bry(Bry_mid).Add_bry_bry(Bry_ogg).Add_bry_bry(Bry_oga)
|
||||||
.Add_bry_bry(Bry_ogv).Add_bry_bry(Bry_webm).Add_bry_bry(Bry_flac)
|
.Add_bry_bry(Bry_ogv).Add_bry_bry(Bry_webm).Add_bry_bry(Bry_flac)
|
||||||
.Add_bry_bry(Bry_bmp).Add_bry_bry(Bry_xcf).Add_bry_bry(Bry_wav)
|
.Add_bry_bry(Bry_bmp).Add_bry_bry(Bry_xcf).Add_bry_bry(Bry_wav)
|
||||||
.Add_bry_bry(Bry_opus)
|
.Add_bry_bry(Bry_opus).Add_bry_bry(Bry_stl).Add_bry_bry(Bry_webp)
|
||||||
;
|
;
|
||||||
private static final Xof_ext[] Ary = new Xof_ext[Id__max];
|
private static final Xof_ext[] Ary = new Xof_ext[Id__max];
|
||||||
|
|
||||||
@ -111,9 +126,14 @@ public class Xof_ext_ {
|
|||||||
}
|
}
|
||||||
public static boolean Orig_file_is_img(int v) { // identifies if orig_file can be used for <img src>; EX: png is valid, but svg, ogv, pdf is not
|
public static boolean Orig_file_is_img(int v) { // identifies if orig_file can be used for <img src>; EX: png is valid, but svg, ogv, pdf is not
|
||||||
switch (v) {
|
switch (v) {
|
||||||
case Id_png: case Id_jpg: case Id_jpeg:
|
case Id_png:
|
||||||
case Id_gif: case Id_tif: case Id_tiff: return true;
|
case Id_jpg: case Id_jpeg:
|
||||||
default: return false;
|
case Id_gif:
|
||||||
|
return true;
|
||||||
|
// 2020-08-25|ISSUE#:788|tif files cannot be rendered natively by Firefox / Chrome
|
||||||
|
case Id_tif: case Id_tiff:
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static boolean Id_supports_page(int v) { // identifies if tid supports page in lnki; EX: [[File:A.pdf|page=1]]; REF: https://en.wikipedia.org/wiki/Wikipedia:Picture_tutorial; DATE:2014-01-18
|
public static boolean Id_supports_page(int v) { // identifies if tid supports page in lnki; EX: [[File:A.pdf|page=1]]; REF: https://en.wikipedia.org/wiki/Wikipedia:Picture_tutorial; DATE:2014-01-18
|
||||||
@ -134,6 +154,7 @@ public class Xof_ext_ {
|
|||||||
case Xof_ext_.Id_gif: case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff:
|
case Xof_ext_.Id_gif: case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff:
|
||||||
case Xof_ext_.Id_svg:
|
case Xof_ext_.Id_svg:
|
||||||
case Xof_ext_.Id_bmp: case Xof_ext_.Id_xcf:
|
case Xof_ext_.Id_bmp: case Xof_ext_.Id_xcf:
|
||||||
|
case Xof_ext_.Id_stl: case Xof_ext_.Id_webp:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@ -144,6 +165,7 @@ public class Xof_ext_ {
|
|||||||
case Xof_ext_.Id_png: case Xof_ext_.Id_jpg: case Xof_ext_.Id_jpeg:
|
case Xof_ext_.Id_png: case Xof_ext_.Id_jpg: case Xof_ext_.Id_jpeg:
|
||||||
case Xof_ext_.Id_gif: case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff:
|
case Xof_ext_.Id_gif: case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff:
|
||||||
case Xof_ext_.Id_bmp: case Xof_ext_.Id_xcf:
|
case Xof_ext_.Id_bmp: case Xof_ext_.Id_xcf:
|
||||||
|
case Xof_ext_.Id_stl: case Xof_ext_.Id_webp:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@ -155,6 +177,7 @@ public class Xof_ext_ {
|
|||||||
case Xof_ext_.Id_gif: case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff:
|
case Xof_ext_.Id_gif: case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff:
|
||||||
case Xof_ext_.Id_svg: case Xof_ext_.Id_djvu: case Xof_ext_.Id_pdf:
|
case Xof_ext_.Id_svg: case Xof_ext_.Id_djvu: case Xof_ext_.Id_pdf:
|
||||||
case Xof_ext_.Id_bmp: case Xof_ext_.Id_xcf:
|
case Xof_ext_.Id_bmp: case Xof_ext_.Id_xcf:
|
||||||
|
case Xof_ext_.Id_stl: case Xof_ext_.Id_webp:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@ -196,10 +219,23 @@ public class Xof_ext_ {
|
|||||||
}
|
}
|
||||||
public static int Id_view(int id) {
|
public static int Id_view(int id) {
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case Xof_ext_.Id_svg: case Xof_ext_.Id_bmp: case Xof_ext_.Id_xcf: return Xof_ext_.Id_png;
|
// example image is rendered as .png; see wiki articles
|
||||||
case Xof_ext_.Id_tif: case Xof_ext_.Id_tiff: case Xof_ext_.Id_djvu: case Xof_ext_.Id_pdf:
|
case Xof_ext_.Id_svg:
|
||||||
case Xof_ext_.Id_ogg: case Xof_ext_.Id_ogv: case Xof_ext_.Id_webm: return Xof_ext_.Id_jpg;
|
case Xof_ext_.Id_bmp:
|
||||||
default: return id;
|
case Xof_ext_.Id_xcf:
|
||||||
|
case Xof_ext_.Id_stl: // https://en.wikipedia.org/wiki/STL_(file_format)
|
||||||
|
case Xof_ext_.Id_webp:// https://en.wikipedia.org/wiki/WebP
|
||||||
|
return Xof_ext_.Id_png;
|
||||||
|
case Xof_ext_.Id_tif:
|
||||||
|
case Xof_ext_.Id_tiff:
|
||||||
|
case Xof_ext_.Id_djvu:
|
||||||
|
case Xof_ext_.Id_pdf:
|
||||||
|
case Xof_ext_.Id_ogg:
|
||||||
|
case Xof_ext_.Id_ogv:
|
||||||
|
case Xof_ext_.Id_webm:
|
||||||
|
return Xof_ext_.Id_jpg;
|
||||||
|
default:
|
||||||
|
return id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
XOWA: the XOWA Offline Wiki Application
|
XOWA: the XOWA Offline Wiki Application
|
||||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
Copyright (C) 2012-2020 gnosygnu@gmail.com
|
||||||
|
|
||||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||||
or alternatively under the terms of the Apache License Version 2.0.
|
or alternatively under the terms of the Apache License Version 2.0.
|
||||||
@ -48,6 +48,8 @@ public class Xof_mime_minor_ {
|
|||||||
mime_hash_itm_(rv, Mime_xcf , Xof_ext_.Id_xcf);
|
mime_hash_itm_(rv, Mime_xcf , Xof_ext_.Id_xcf);
|
||||||
mime_hash_itm_(rv, Xof_ext_.Bry_wav , Xof_ext_.Id_wav);
|
mime_hash_itm_(rv, Xof_ext_.Bry_wav , Xof_ext_.Id_wav);
|
||||||
mime_hash_itm_(rv, Xof_ext_.Bry_opus , Xof_ext_.Id_opus);
|
mime_hash_itm_(rv, Xof_ext_.Bry_opus , Xof_ext_.Id_opus);
|
||||||
|
mime_hash_itm_(rv, Xof_ext_.Bry_stl , Xof_ext_.Id_stl);
|
||||||
|
mime_hash_itm_(rv, Xof_ext_.Bry_webp , Xof_ext_.Id_webp);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
private static void mime_hash_itm_(Hash_adp hash, byte[] key, int val) {hash.Add(key, new Int_obj_val(val));}
|
private static void mime_hash_itm_(Hash_adp hash, byte[] key, int val) {hash.Add(key, new Int_obj_val(val));}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user