mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
v2.6.5.1
This commit is contained in:
parent
bf44bcf3c6
commit
d858b74d64
@ -42,7 +42,7 @@ public class Bry_rdr {
|
||||
public int Read_int_to_semic() {return Read_int_to(Byte_ascii.Semic);}
|
||||
public int Read_int_to_comma() {return Read_int_to(Byte_ascii.Comma);}
|
||||
public int Read_int_to_pipe() {return Read_int_to(Byte_ascii.Pipe);}
|
||||
public int Read_int_to_nl() {return Read_int_to(Byte_ascii.NewLine);}
|
||||
public int Read_int_to_nl() {return Read_int_to(Byte_ascii.Nl);}
|
||||
public int Read_int_to_quote() {return Read_int_to(Byte_ascii.Quote);}
|
||||
public int Read_int_to_non_num(){return Read_int_to(Byte_ascii.Nil);}
|
||||
public int Read_int_to(byte to_char) {
|
||||
@ -74,7 +74,7 @@ public class Bry_rdr {
|
||||
}
|
||||
return bgn == pos ? or_int : rv * negative;
|
||||
}
|
||||
public byte[] Read_bry_to_nl() {return Read_bry_to(Byte_ascii.NewLine);}
|
||||
public byte[] Read_bry_to_nl() {return Read_bry_to(Byte_ascii.Nl);}
|
||||
public byte[] Read_bry_to_semic() {return Read_bry_to(Byte_ascii.Semic);}
|
||||
public byte[] Read_bry_to_pipe() {return Read_bry_to(Byte_ascii.Pipe);}
|
||||
public byte[] Read_bry_to_quote() {return Read_bry_to(Byte_ascii.Quote);}
|
||||
@ -104,7 +104,7 @@ public class Bry_rdr {
|
||||
@gplx.Virtual public Bry_rdr Skip_ws() {
|
||||
while (pos < src_len) {
|
||||
switch (src[pos]) {
|
||||
case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: case Byte_ascii.Space:
|
||||
case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space:
|
||||
++pos;
|
||||
break;
|
||||
default:
|
||||
|
107
100_core/src/gplx/core/js/Js_wtr.java
Normal file
107
100_core/src/gplx/core/js/Js_wtr.java
Normal file
@ -0,0 +1,107 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.core.js; import gplx.*; import gplx.core.*;
|
||||
public class Js_wtr {
|
||||
private final Bry_bfr bfr = Bry_bfr.reset_(255);
|
||||
private int arg_idx = 0, ary_idx = 0;
|
||||
public byte Quote_char() {return quote_char;} public Js_wtr Quote_char_(byte v) {quote_char = v; return this;} private byte quote_char = Byte_ascii.Quote;
|
||||
public void Clear() {bfr.Clear();}
|
||||
public String To_str() {return bfr.Xto_str();}
|
||||
public String To_str_and_clear() {return bfr.Xto_str_and_clear();}
|
||||
public Js_wtr Func_init(String name) {return Func_init(Bry_.new_u8(name));}
|
||||
public Js_wtr Func_init(byte[] name) {
|
||||
bfr.Add(name).Add_byte(Byte_ascii.Paren_bgn);
|
||||
arg_idx = 0;
|
||||
return this;
|
||||
}
|
||||
public Js_wtr Func_term() {
|
||||
bfr.Add_byte(Byte_ascii.Paren_end).Add_byte_semic();
|
||||
return this;
|
||||
}
|
||||
public Js_wtr Prm_bry(byte[] bry) {
|
||||
Prm_spr();
|
||||
Write_val(bry);
|
||||
return this;
|
||||
}
|
||||
public Js_wtr Prm_obj_ary(Object[] ary) {
|
||||
int ary_len = ary.length;
|
||||
for (int i = 0; i < ary_len; ++i) {
|
||||
Object itm = ary[i];
|
||||
if (i != 0) bfr.Add_byte(Byte_ascii.Comma);
|
||||
boolean val_needs_quotes = true;
|
||||
if ( ClassAdp_.Eq_typeSafe(itm, Bool_.Cls_ref_type)
|
||||
|| ClassAdp_.Eq_typeSafe(itm, Int_.Cls_ref_type)
|
||||
|| ClassAdp_.Eq_typeSafe(itm, Long_.Cls_ref_type)
|
||||
) {
|
||||
val_needs_quotes = false;
|
||||
}
|
||||
if (val_needs_quotes)
|
||||
Write_val(Bry_.new_u8(Object_.Xto_str_strict_or_null_mark(itm)));
|
||||
else
|
||||
bfr.Add_obj_strict(itm);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
public Js_wtr Ary_init() {
|
||||
ary_idx = 0;
|
||||
bfr.Add_byte(Byte_ascii.Brack_bgn);
|
||||
return this;
|
||||
}
|
||||
public Js_wtr Ary_term() {
|
||||
bfr.Add_byte(Byte_ascii.Brack_end);
|
||||
return this;
|
||||
}
|
||||
public void Prm_spr() {
|
||||
if (arg_idx != 0) bfr.Add_byte(Byte_ascii.Comma);
|
||||
++arg_idx;
|
||||
}
|
||||
private void Ary_spr() {
|
||||
if (ary_idx != 0) bfr.Add_byte(Byte_ascii.Comma);
|
||||
++ary_idx;
|
||||
}
|
||||
public Js_wtr Ary_bry(byte[] bry) {
|
||||
Ary_spr();
|
||||
Write_val(bry);
|
||||
return this;
|
||||
}
|
||||
private Js_wtr Write_keyword_return() {bfr.Add(Keyword_return); return this;}
|
||||
public Js_wtr Write_statement_return_func(String func, Object... args) {
|
||||
this.Write_keyword_return();
|
||||
this.Func_init(func);
|
||||
this.Prm_obj_ary(args);
|
||||
this.Func_term();
|
||||
return this;
|
||||
}
|
||||
public void Write_val(byte[] bry) {
|
||||
bfr.Add_byte(quote_char);
|
||||
int len = bry.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte b = bry[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Backslash: // "\" -> "\\"; needed else js will usurp \ as escape; EX: "\&" -> "&"; DATE:2014-06-24
|
||||
case Byte_ascii.Quote:
|
||||
case Byte_ascii.Apos: bfr.Add_byte(Byte_ascii.Backslash).Add_byte(b); break;
|
||||
case Byte_ascii.Nl: bfr.Add_byte(Byte_ascii.Backslash).Add_byte(Byte_ascii.Ltr_n); break; // "\n" -> "\\n"
|
||||
case Byte_ascii.Cr: break;// skip
|
||||
default: bfr.Add_byte(b); break;
|
||||
}
|
||||
}
|
||||
bfr.Add_byte(quote_char);
|
||||
}
|
||||
private static final byte[] Keyword_return = Bry_.new_a7("return ");
|
||||
}
|
@ -15,13 +15,14 @@ GNU Affero General Public License for more details.
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.web.js; import gplx.*; import gplx.web.*;
|
||||
package gplx.core.js; import gplx.*; import gplx.core.*;
|
||||
import org.junit.*;
|
||||
public class Js_wtr_tst {
|
||||
@Before public void Init() {fxt.Clear();} private Js_wtr_fxt fxt = new Js_wtr_fxt();
|
||||
@Test public void Basic() {
|
||||
fxt.Test_write_val_html("abc" , "'abc'");
|
||||
fxt.Test_write_val_html("a'b" , "'a\\'b'");
|
||||
fxt.Test_write_val_html("a\"b" , "'a\\\"b'");
|
||||
fxt.Test_write_val_html("a\nb" , "'a\\nb'");
|
||||
fxt.Test_write_val_html("a\rb" , "'ab'");
|
||||
fxt.Test_write_val_html("a\\&b" , "'a\\\\&b'"); // PURPOSE: backslashes need to be escaped; need for MathJax and "\&"; PAGE:Electromagnetic_field_tensor; DATE:2014-06-24
|
||||
@ -34,7 +35,7 @@ class Js_wtr_fxt {
|
||||
wtr.Quote_char_(Byte_ascii.Apos);
|
||||
}
|
||||
public void Test_write_val_html(String raw, String expd) {
|
||||
wtr.Add_str_quote_html(Bry_.new_u8(raw));
|
||||
Tfds.Eq(expd, wtr.Xto_str_and_clear());
|
||||
wtr.Write_val(Bry_.new_u8(raw));
|
||||
Tfds.Eq(expd, wtr.To_str_and_clear());
|
||||
}
|
||||
}
|
@ -364,7 +364,7 @@ public class Bry_ {
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public static final byte[] Trim_ary_ws = mask_(256, Byte_ascii.Tab, Byte_ascii.NewLine, Byte_ascii.CarriageReturn, Byte_ascii.Space);
|
||||
public static final byte[] Trim_ary_ws = mask_(256, Byte_ascii.Tab, Byte_ascii.Nl, Byte_ascii.Cr, Byte_ascii.Space);
|
||||
public static byte[] Trim(byte[] src) {return Trim(src, 0, src.length, true, true, Trim_ary_ws);}
|
||||
public static byte[] Trim(byte[] src, int bgn, int end) {return Trim(src, bgn, end, true, true, Trim_ary_ws);}
|
||||
public static byte[] Trim(byte[] src, int bgn, int end, boolean trim_bgn, boolean trim_end, byte[] trim_ary) {
|
||||
@ -456,7 +456,7 @@ public class Bry_ {
|
||||
for (int i = src_bgn; i < src_len; i++) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
break;
|
||||
default:
|
||||
return i;
|
||||
@ -468,7 +468,7 @@ public class Bry_ {
|
||||
for (int i = src_bgn; i > -1; i--) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
break;
|
||||
default:
|
||||
return i;
|
||||
@ -676,7 +676,7 @@ public class Bry_ {
|
||||
break;
|
||||
case Byte_ascii.Dash:
|
||||
return i == bgn ? rv * -1 : or;
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
if (numbers_seen)
|
||||
ws_seen = true;
|
||||
break;
|
||||
@ -930,7 +930,7 @@ public class Bry_ {
|
||||
public static int Trim_end_pos(byte[] src, int end) {
|
||||
for (int i = end - 1; i > -1; i--) {
|
||||
switch (src[i]) {
|
||||
case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: case Byte_ascii.Space:
|
||||
case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space:
|
||||
break;
|
||||
default:
|
||||
return i + 1;
|
||||
@ -960,13 +960,13 @@ public class Bry_ {
|
||||
List_adp rv = List_adp_.new_();
|
||||
while (true) {
|
||||
boolean last = src_pos == src_len;
|
||||
byte b = last ? Byte_ascii.NewLine : src[src_pos];
|
||||
byte b = last ? Byte_ascii.Nl : src[src_pos];
|
||||
int nxt_bgn = src_pos + 1;
|
||||
switch (b) {
|
||||
case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.NewLine:
|
||||
if ( b == Byte_ascii.CarriageReturn // check for crlf
|
||||
&& nxt_bgn < src_len && src[nxt_bgn] == Byte_ascii.NewLine) {
|
||||
case Byte_ascii.Cr:
|
||||
case Byte_ascii.Nl:
|
||||
if ( b == Byte_ascii.Cr // check for crlf
|
||||
&& nxt_bgn < src_len && src[nxt_bgn] == Byte_ascii.Nl) {
|
||||
++nxt_bgn;
|
||||
}
|
||||
if (last && (src_pos - fld_bgn == 0)) {} // ignore trailing itms
|
||||
|
@ -159,7 +159,7 @@ public class Bry_bfr {
|
||||
public Bry_bfr Add_byte_backslash() {return Add_byte(Byte_ascii.Backslash);}
|
||||
public Bry_bfr Add_byte_quote() {return Add_byte(Byte_ascii.Quote);}
|
||||
public Bry_bfr Add_byte_space() {return Add_byte(Byte_ascii.Space);}
|
||||
public Bry_bfr Add_byte_nl() {return Add_byte(Byte_ascii.NewLine);}
|
||||
public Bry_bfr Add_byte_nl() {return Add_byte(Byte_ascii.Nl);}
|
||||
public Bry_bfr Add_byte_dot() {return Add_byte(Byte_ascii.Dot);}
|
||||
public Bry_bfr Add_byte(byte val) {
|
||||
int new_pos = bfr_len + 1;
|
||||
@ -362,7 +362,7 @@ public class Bry_bfr {
|
||||
for (int i = bgn; i < end; i++) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.NewLine: bfr[bfr_len] = Byte_ascii.Backslash; bfr[bfr_len + 1] = Byte_ascii.Ltr_n; bfr_len += 2; break;
|
||||
case Byte_ascii.Nl: bfr[bfr_len] = Byte_ascii.Backslash; bfr[bfr_len + 1] = Byte_ascii.Ltr_n; bfr_len += 2; break;
|
||||
case Byte_ascii.Tab: bfr[bfr_len] = Byte_ascii.Backslash; bfr[bfr_len + 1] = Byte_ascii.Ltr_t; bfr_len += 2; break;
|
||||
case Byte_ascii.Backslash: bfr[bfr_len] = Byte_ascii.Backslash; bfr[bfr_len + 1] = Byte_ascii.Backslash; bfr_len += 2; break;
|
||||
default: bfr[bfr_len] = b; ++bfr_len; break;
|
||||
@ -399,6 +399,23 @@ public class Bry_bfr {
|
||||
else ((Bry_fmtr_arg)o).XferAry(this, 0);
|
||||
return this;
|
||||
}
|
||||
public Bry_bfr Add_obj_strict(Object o) {
|
||||
if (o == null) return this; // treat null as empty String;
|
||||
Class<?> o_type = o.getClass();
|
||||
if (o_type == byte[].class) Add((byte[])o);
|
||||
else if (o_type == Integer.class) Add_int_variable(Int_.cast_(o));
|
||||
else if (o_type == Byte.class) Add_byte(Byte_.cast_(o));
|
||||
else if (o_type == Long.class) Add_long_variable(Long_.cast_(o));
|
||||
else if (o_type == String.class) Add_str((String)o);
|
||||
else if (o_type == Bry_bfr.class) Add_bfr_and_preserve((Bry_bfr)o);
|
||||
else if (o_type == DateAdp.class) Add_dte((DateAdp)o);
|
||||
else if (o_type == Io_url.class) Add(((Io_url)o).RawBry());
|
||||
else if (o_type == Boolean.class) Add_bool(Bool_.cast_(o));
|
||||
else if (o_type == Double.class) Add_double(Double_.cast_(o));
|
||||
else if (o_type == Float.class) Add_float(Float_.cast_(o));
|
||||
else ((Bry_fmtr_arg)o).XferAry(this, 0);
|
||||
return this;
|
||||
}
|
||||
public Bry_bfr Add_yn(boolean v) {Add_byte(v ? Byte_ascii.Ltr_y : Byte_ascii.Ltr_n); return this;}
|
||||
public Bry_bfr Add_base85_len_5(int v) {return Add_base85(v, 5);}
|
||||
public Bry_bfr Add_base85(int v, int pad) {
|
||||
@ -409,7 +426,7 @@ public class Bry_bfr {
|
||||
return this;
|
||||
}
|
||||
public boolean Match_end_byt(byte b) {return bfr_len == 0 ? false : bfr[bfr_len - 1] == b;}
|
||||
public boolean Match_end_byt_nl_or_bos() {return bfr_len == 0 ? true : bfr[bfr_len - 1] == Byte_ascii.NewLine;}
|
||||
public boolean Match_end_byt_nl_or_bos() {return bfr_len == 0 ? true : bfr[bfr_len - 1] == Byte_ascii.Nl;}
|
||||
public boolean Match_end_ary(byte[] ary) {return Bry_.Match(bfr, bfr_len - ary.length, bfr_len, ary);}
|
||||
public Bry_bfr Insert_at(int add_pos, byte[] add_bry) {return Insert_at(add_pos, add_bry, 0, add_bry.length);}
|
||||
public Bry_bfr Insert_at(int add_pos, byte[] add_bry, int add_bgn, int add_end) {
|
||||
|
@ -98,7 +98,7 @@ public class Bry_finder {
|
||||
for (int i = cur; i > -1; i--) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
rv = i;
|
||||
break;
|
||||
default:
|
||||
@ -112,7 +112,7 @@ public class Bry_finder {
|
||||
for (int i = cur; i > -1; --i) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
return i;
|
||||
}
|
||||
}
|
||||
@ -125,7 +125,7 @@ public class Bry_finder {
|
||||
for (int i = cur; i < end; i++) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
rv = i;
|
||||
break;
|
||||
default:
|
||||
@ -140,7 +140,7 @@ public class Bry_finder {
|
||||
for (int i = cur; i >= end; i--) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
break;
|
||||
default:
|
||||
return i;
|
||||
@ -153,7 +153,7 @@ public class Bry_finder {
|
||||
for (int i = cur; i >= end; i--) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
break;
|
||||
default:
|
||||
return i;
|
||||
@ -199,7 +199,7 @@ public class Bry_finder {
|
||||
while (true) {
|
||||
if (cur == end) return Bry_finder.Not_found;
|
||||
switch (src[cur]) {
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
return cur;
|
||||
default:
|
||||
++cur;
|
||||
@ -240,7 +240,7 @@ public class Bry_finder {
|
||||
if (cur == end) return cur;
|
||||
try {
|
||||
switch (src[cur]) {
|
||||
case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: ++cur; break;
|
||||
default: return cur;
|
||||
}
|
||||
@ -282,9 +282,9 @@ public class Bry_finder {
|
||||
if (cur == end) return cur;
|
||||
switch (src[cur]) {
|
||||
case Byte_ascii.Space:
|
||||
case Byte_ascii.NewLine:
|
||||
case Byte_ascii.Nl:
|
||||
case Byte_ascii.Tab:
|
||||
case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Cr:
|
||||
++cur;
|
||||
break;
|
||||
default:
|
||||
|
@ -193,7 +193,7 @@ public class Bry_fmtr {
|
||||
}
|
||||
else { // ~{0}; ~~ -> ~; ~n -> newLine; ~t -> tab
|
||||
if (nxt_byte == char_escape) tmp_byte = char_escape;
|
||||
else if (nxt_byte == char_escape_nl) tmp_byte = Byte_ascii.NewLine;
|
||||
else if (nxt_byte == char_escape_nl) tmp_byte = Byte_ascii.Nl;
|
||||
else if (nxt_byte == char_escape_tab) tmp_byte = Byte_ascii.Tab;
|
||||
else {
|
||||
if (fail_when_invalid_escapes) throw Err_.new_("unknown escape code").Add("code", Char_.XbyInt(nxt_byte)).Add("fmt_pos", fmt_pos + 1);
|
||||
|
@ -19,10 +19,10 @@ package gplx;
|
||||
public class Byte_ascii {
|
||||
public static final byte
|
||||
Nil = 0 , Backfeed = 8, Tab = 9
|
||||
, NewLine = 10, Formfeed = 12, CarriageReturn = 13
|
||||
, Nl = 10, Formfeed = 12, Cr = 13
|
||||
, Space = 32, Bang = 33, Quote = 34
|
||||
, Hash = 35, Dollar = 36, Percent = 37, Amp = 38, Apos = 39
|
||||
, Paren_bgn = 40, Paren_end = 41, Asterisk = 42, Plus = 43, Comma = 44
|
||||
, Paren_bgn = 40, Paren_end = 41, Star = 42, Plus = 43, Comma = 44
|
||||
, Dash = 45, Dot = 46, Slash = 47, Num_0 = 48, Num_1 = 49
|
||||
, Num_2 = 50, Num_3 = 51, Num_4 = 52, Num_5 = 53, Num_6 = 54
|
||||
, Num_7 = 55, Num_8 = 56, Num_9 = 57, Colon = 58, Semic = 59
|
||||
@ -49,7 +49,7 @@ public class Byte_ascii {
|
||||
switch (b) {
|
||||
case Byte_ascii.Bang: case Byte_ascii.Quote:
|
||||
case Byte_ascii.Hash: case Byte_ascii.Dollar: case Byte_ascii.Percent: case Byte_ascii.Amp: case Byte_ascii.Apos:
|
||||
case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Asterisk: case Byte_ascii.Plus: case Byte_ascii.Comma:
|
||||
case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Star: case Byte_ascii.Plus: case Byte_ascii.Comma:
|
||||
case Byte_ascii.Dash: case Byte_ascii.Dot: case Byte_ascii.Slash:
|
||||
case Byte_ascii.Colon: case Byte_ascii.Semic:
|
||||
case Byte_ascii.Lt: case Byte_ascii.Eq: case Byte_ascii.Gt: case Byte_ascii.Question: case Byte_ascii.At:
|
||||
@ -68,7 +68,7 @@ public class Byte_ascii {
|
||||
}
|
||||
public static boolean Is_ws(byte b) {
|
||||
switch (b) {
|
||||
case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: case Byte_ascii.Space: return true;
|
||||
case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space: return true;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
@ -79,19 +79,17 @@ public class Byte_ascii {
|
||||
public static byte Case_upper(byte b) {
|
||||
return b > 96 && b < 123
|
||||
? (byte)(b - 32)
|
||||
: b
|
||||
;
|
||||
: b;
|
||||
}
|
||||
public static byte Case_lower(byte b) {
|
||||
return b > 64 && b < 91
|
||||
? (byte)(b + 32)
|
||||
: b
|
||||
;
|
||||
: b;
|
||||
}
|
||||
public static final byte[] Space_len2 = new byte[] {Space, Space}, Space_len4 = new byte[] {Space, Space, Space, Space};
|
||||
public static final byte[]
|
||||
Tab_bry = new byte[] {Byte_ascii.Tab}
|
||||
, NewLine_bry = new byte[] {Byte_ascii.NewLine}
|
||||
, Nl_bry = new byte[] {Byte_ascii.Nl}
|
||||
, Bang_bry = new byte[] {Byte_ascii.Bang}
|
||||
, Dot_bry = new byte[] {Byte_ascii.Dot}
|
||||
, Comma_bry = new byte[] {Byte_ascii.Comma}
|
||||
@ -106,7 +104,7 @@ public class Byte_ascii {
|
||||
, Pipe_bry = new byte[] {Byte_ascii.Pipe}
|
||||
, Underline_bry = new byte[] {Byte_ascii.Underline}
|
||||
, Slash_bry = new byte[] {Byte_ascii.Slash}
|
||||
, Asterisk_bry = new byte[] {Byte_ascii.Asterisk}
|
||||
, Asterisk_bry = new byte[] {Byte_ascii.Star}
|
||||
, Dash_bry = new byte[] {Byte_ascii.Dash}
|
||||
, Space_bry = new byte[] {Byte_ascii.Space}
|
||||
;
|
||||
|
@ -225,7 +225,7 @@ public class Int_ implements GfoInvkAble {
|
||||
cur_val += (b - Byte_ascii.Num_0) * cur_mult;
|
||||
cur_mult *= 10;
|
||||
break;
|
||||
case Byte_ascii.Space: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: case Byte_ascii.Tab:
|
||||
case Byte_ascii.Space: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Tab:
|
||||
break;
|
||||
case Byte_ascii.Comma:
|
||||
if (cur_idx < 0) return or;
|
||||
|
@ -67,7 +67,7 @@ public class Int_ary_ {
|
||||
num_bgn = pos;
|
||||
num_end = pos + 1; // num_end is always after pos; EX: "9": num_end = 1; "98,7": num_end=2
|
||||
break;
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: // NOTE: parseNumList replaces ws with '', so "1 1" will become "11"
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: // NOTE: parseNumList replaces ws with '', so "1 1" will become "11"
|
||||
break;
|
||||
case Byte_ascii.Comma:
|
||||
if (pos == raw_len -1) return or; // eos; EX: "1,"
|
||||
|
@ -71,7 +71,7 @@ public class TimeSpanAdp_ {
|
||||
if (i == 0 && unit_val > 0) // only if first char && unit_val > 0
|
||||
sign = -1;
|
||||
break;
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
if (fail_if_ws) return parse_null;
|
||||
break;
|
||||
default:
|
||||
|
@ -26,7 +26,7 @@ public class Op_sys_ {
|
||||
case Byte_ascii.Colon:
|
||||
case Byte_ascii.Pipe:
|
||||
case Byte_ascii.Question:
|
||||
case Byte_ascii.Asterisk:
|
||||
case Byte_ascii.Star:
|
||||
case Byte_ascii.Quote: return true;
|
||||
default: return false;
|
||||
}
|
||||
|
@ -44,7 +44,8 @@ public class Db_conn {
|
||||
public void Ddl_create_idx(Gfo_usr_dlg usr_dlg, Db_meta_idx... idxs) {engine.Ddl_create_idx(usr_dlg, idxs);}
|
||||
public void Ddl_append_fld(String tbl, Db_meta_fld fld) {engine.Ddl_append_fld(tbl, fld);}
|
||||
public void Ddl_delete_tbl(String tbl) {engine.Ddl_delete_tbl(tbl);}
|
||||
public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);}
|
||||
public boolean Meta_tbl_exists(String tbl) {return engine.Meta_tbl_exists(tbl);}
|
||||
public boolean Meta_fld_exists(String tbl, String fld) {return engine.Meta_fld_exists(tbl, fld);}
|
||||
public void Rls_reg(RlsAble rls) {rls_list.Add(rls);}
|
||||
public void Rls_conn() {
|
||||
int len = rls_list.Count();
|
||||
@ -56,7 +57,7 @@ public class Db_conn {
|
||||
Db_conn_pool.I.Del(engine.Conn_info());
|
||||
}
|
||||
public int Exec_sql(String sql) {return this.Exec_qry(Db_qry_sql.dml_(sql));}
|
||||
public Db_rdr Exec_sql_as_rdr2(String sql) {return this.Stmt_new(Db_qry_sql.dml_(sql)).Exec_select__rls_auto();}
|
||||
public Db_rdr Exec_sql_as_rdr_v2(String sql) {return this.Stmt_new(Db_qry_sql.dml_(sql)).Exec_select__rls_auto();}
|
||||
public int Exec_sql_plog_ntx(String msg, String sql) {return Exec_sql_plog(Bool_.N, msg, sql);}
|
||||
public int Exec_sql_plog_txn(String msg, String sql) {return Exec_sql_plog(Bool_.Y, msg, sql);}
|
||||
public int Exec_sql_plog(boolean txn, String msg, String sql) {
|
||||
|
@ -17,20 +17,31 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs; import gplx.*;
|
||||
public class Db_meta_fld {
|
||||
public Db_meta_fld(String name, int tid, int len, boolean nullable, boolean primary, boolean autonum, Object default_value) {
|
||||
public Db_meta_fld(String name, int tid, int len) {
|
||||
this.name = name; this.tid = tid; this.len = len;
|
||||
this.nullable = nullable; this.primary = primary; this.autonum = autonum; this.default_value = default_value;
|
||||
this.nullable = false; this.primary = false; this.autonum = false; this.default_val = Default_value_null;
|
||||
}
|
||||
public int Tid() {return tid;} private final int tid;
|
||||
public String Name() {return name;} private final String name;
|
||||
public int Len() {return len;} private final int len;
|
||||
public boolean Nullable() {return nullable;} private final boolean nullable;
|
||||
public boolean Primary() {return primary;} private final boolean primary;
|
||||
public boolean Autonum() {return autonum;} private final boolean autonum;
|
||||
public Object Default_value() {return default_value;} private final Object default_value;
|
||||
public boolean Nullable() {return nullable;} public Db_meta_fld Nullable_y_() {nullable = true; return this;} private boolean nullable;
|
||||
public boolean Primary() {return primary;} public Db_meta_fld Primary_y_() {primary = true; return this;} private boolean primary;
|
||||
public boolean Autonum() {return autonum;} public Db_meta_fld Autonum_y_() {autonum = true; return this;} private boolean autonum;
|
||||
public Object Default() {return default_val;} public Db_meta_fld Default_(Object v) {default_val = v; return this;} private Object default_val;
|
||||
|
||||
public static final int Tid_bool = 0, Tid_byte = 1, Tid_short = 2, Tid_int = 3, Tid_long = 4, Tid_float = 5, Tid_double = 6, Tid_str = 7, Tid_text = 8, Tid_bry = 9, Tid_decimal = 10, Tid_date = 11;
|
||||
public static final String Key_null = null;
|
||||
public static final int Len_null = -1;
|
||||
public static final String[] Ary_empy = String_.Ary_empty;
|
||||
public static final Object Default_value_null = null;
|
||||
public static final String[] Ary_empty = String_.Ary_empty;
|
||||
public static Db_meta_fld new_bool(String name) {return new Db_meta_fld(name, Tid_bool , Len_null);}
|
||||
public static Db_meta_fld new_byte(String name) {return new Db_meta_fld(name, Tid_byte , Len_null);}
|
||||
public static Db_meta_fld new_short(String name) {return new Db_meta_fld(name, Tid_short , Len_null);}
|
||||
public static Db_meta_fld new_int(String name) {return new Db_meta_fld(name, Tid_int , Len_null);}
|
||||
public static Db_meta_fld new_long(String name) {return new Db_meta_fld(name, Tid_long , Len_null);}
|
||||
public static Db_meta_fld new_float(String name) {return new Db_meta_fld(name, Tid_float , Len_null);}
|
||||
public static Db_meta_fld new_double(String name) {return new Db_meta_fld(name, Tid_double, Len_null);}
|
||||
public static Db_meta_fld new_text(String name) {return new Db_meta_fld(name, Tid_text , Len_null);}
|
||||
public static Db_meta_fld new_bry(String name) {return new Db_meta_fld(name, Tid_bry , Len_null);}
|
||||
public static Db_meta_fld new_str(String name, int len) {return new Db_meta_fld(name, Tid_str , len);}
|
||||
}
|
||||
|
@ -20,7 +20,8 @@ public class Db_meta_fld_list {
|
||||
private final Ordered_hash flds = Ordered_hash_.new_();
|
||||
private final List_adp keys = List_adp_.new_();
|
||||
public void Clear() {flds.Clear(); keys.Clear();}
|
||||
public Db_meta_fld Get_by(String name) {return (Db_meta_fld)flds.Get_by(name);}
|
||||
public Db_meta_fld Get_by(String name) {return (Db_meta_fld)flds.Get_by(name);}
|
||||
public Db_meta_fld Get_at(int idx) {return (Db_meta_fld)flds.Get_at(idx);}
|
||||
public String[] To_str_ary() {if (str_ary == null) str_ary = (String[])keys.To_ary(String.class); return str_ary;} private String[] str_ary;
|
||||
public Db_meta_fld[] To_fld_ary() {if (fld_ary == null) fld_ary = (Db_meta_fld[])flds.To_ary(Db_meta_fld.class); return fld_ary;} private Db_meta_fld[] fld_ary;
|
||||
public String[] To_str_ary_wo_autonum() {
|
||||
@ -51,34 +52,29 @@ public class Db_meta_fld_list {
|
||||
return rv.To_str_ary();
|
||||
}
|
||||
public boolean Has(String key) {return flds.Has(key);}
|
||||
public String Add_bool(String name) {return Add(name, Db_meta_fld.Tid_bool, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_byte(String name) {return Add(name, Db_meta_fld.Tid_byte, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_short(String name) {return Add(name, Db_meta_fld.Tid_short, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_pkey(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_pkey_autonum(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.Y, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_autonum(String name) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_int_dflt(String name, int dflt) {return Add(name, Db_meta_fld.Tid_int, Len_null, Bool_.N, Bool_.N, Bool_.N, dflt);}
|
||||
public String Add_long(String name) {return Add(name, Db_meta_fld.Tid_long, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_float(String name) {return Add(name, Db_meta_fld.Tid_float, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_double(String name) {return Add(name, Db_meta_fld.Tid_double, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_str(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_str_pkey(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.Y, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_str_null(String name, int len) {return Add(name, Db_meta_fld.Tid_str, len, Bool_.Y, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_bool(String name) {return Add(Db_meta_fld.new_bool(name));}
|
||||
public String Add_byte(String name) {return Add(Db_meta_fld.new_byte(name));}
|
||||
public String Add_short(String name) {return Add(Db_meta_fld.new_short(name));}
|
||||
public String Add_int(String name) {return Add(Db_meta_fld.new_int(name));}
|
||||
public String Add_int_pkey(String name) {return Add(Db_meta_fld.new_int(name).Primary_y_());}
|
||||
public String Add_int_pkey_autonum(String name) {return Add(Db_meta_fld.new_int(name).Primary_y_().Autonum_y_());}
|
||||
public String Add_int_autonum(String name) {return Add(Db_meta_fld.new_int(name).Autonum_y_());}
|
||||
public String Add_int_dflt(String name, int dflt) {return Add(Db_meta_fld.new_int(name).Default_(dflt));}
|
||||
public String Add_long(String name) {return Add(Db_meta_fld.new_long(name));}
|
||||
public String Add_float(String name) {return Add(Db_meta_fld.new_float(name));}
|
||||
public String Add_double(String name) {return Add(Db_meta_fld.new_double(name));}
|
||||
public String Add_text(String name) {return Add(Db_meta_fld.new_text(name));}
|
||||
public String Add_bry(String name) {return Add(Db_meta_fld.new_bry(name));}
|
||||
public String Add_str(String name, int len) {return Add(Db_meta_fld.new_str(name, len));}
|
||||
public String Add_str_pkey(String name, int len) {return Add(Db_meta_fld.new_str(name, len).Primary_y_());}
|
||||
public String Add_str_null(String name, int len) {return Add(Db_meta_fld.new_str(name, len).Nullable_y_());}
|
||||
public String Add_str_dflt(String name, int len, String dflt)
|
||||
{return Add(name, Db_meta_fld.Tid_str, len, Bool_.N, Bool_.N, Bool_.N, dflt);}
|
||||
public String Add_text(String name) {return Add(name, Db_meta_fld.Tid_text, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add_bry(String name) {return Add(name, Db_meta_fld.Tid_bry, Len_null, Bool_.N, Bool_.N, Bool_.N, Db_meta_fld.Default_value_null);}
|
||||
public String Add(String name, int tid, int len, boolean nullable, boolean primary, boolean autoincrement, Object default_value) {
|
||||
Db_meta_fld fld = new Db_meta_fld(name, tid, len, nullable, primary, autoincrement, default_value);
|
||||
Add_itm(fld);
|
||||
return name;
|
||||
}
|
||||
public void Add_itm(Db_meta_fld fld) {
|
||||
{return Add(Db_meta_fld.new_str(name, len).Default_(dflt));}
|
||||
public String Add(Db_meta_fld fld) {
|
||||
String name = fld.Name();
|
||||
flds.Add(name, fld);
|
||||
keys.Add(name);
|
||||
return name;
|
||||
}
|
||||
private static final int Len_null = Db_meta_fld.Len_null;
|
||||
public static Db_meta_fld_list new_() {return new Db_meta_fld_list();}
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ package gplx.dbs; import gplx.*;
|
||||
public interface Db_rdr {
|
||||
boolean Move_next();
|
||||
byte[] Read_bry(String k);
|
||||
byte[] Read_bry_in_parts(String tbl, String fld, String crt_key, Object crt_val);
|
||||
void Save_bry_in_parts(Io_url url, String tbl, String fld, String crt_key, Object crt_val);
|
||||
byte[] Read_bry_by_str(String k);
|
||||
String Read_str(String k);
|
||||
byte Read_byte(String k);
|
||||
|
@ -23,7 +23,7 @@ class Db_rdr__empty implements Db_rdr {
|
||||
public boolean Move_next() {return false;}
|
||||
public byte[] Read_bry(String k) {return Bry_.Empty;}
|
||||
public byte[] Read_bry_by_str(String k) {return Bry_.Empty;}
|
||||
public byte[] Read_bry_in_parts(String tbl, String fld, String crt_key, Object crt_val) {return Bry_.Empty;}
|
||||
public void Save_bry_in_parts(Io_url url, String tbl, String fld, String crt_key, Object crt_val) {}
|
||||
public byte Read_byte(String k) {return Byte_.Max_value_127;}
|
||||
public String Read_str(String k) {return String_.Empty;}
|
||||
public DateAdp Read_date_by_str(String k) {return DateAdp_.MinValue;}
|
||||
|
@ -28,7 +28,7 @@ public class Db_rdr__basic implements Db_rdr {
|
||||
}
|
||||
@gplx.Virtual public byte[] Read_bry(String k) {try {return (byte[])rdr.getObject(k);} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Bry_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
@gplx.Virtual public byte[] Read_bry_by_str(String k) {try {return Bry_.new_u8((String)rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, String_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
@gplx.Virtual public byte[] Read_bry_in_parts(String tbl, String fld, String crt_key, Object crt_val) {throw Err_.not_implemented_();}
|
||||
@gplx.Virtual public void Save_bry_in_parts(Io_url url, String tbl, String fld, String crt_key, Object crt_val) {throw Err_.not_implemented_();}
|
||||
@gplx.Virtual public String Read_str(String k) {try {return (String)rdr.getObject(k);} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, String_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
@gplx.Virtual public DateAdp Read_date_by_str(String k) {return DateAdp_.parse_iso8561(Read_str(k));}
|
||||
@gplx.Virtual public int Read_int(String k) {try {return Int_.cast_(rdr.getObject(k));} catch (Exception e) {throw Err_.new_("read failed: k={0} type={1} err={2}", k, Int_.Cls_val_name, Err_.Message_lang(e));}}
|
||||
|
@ -17,9 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Db_rdr__mem implements Db_rdr {
|
||||
private final Mem_itm[] rows; private int row_idx = -1; private final int rows_len;
|
||||
private Mem_itm row;
|
||||
public Db_rdr__mem(String[] cols, Mem_itm[] rows) {
|
||||
private final Mem_row[] rows; private int row_idx = -1; private final int rows_len;
|
||||
private Mem_row row;
|
||||
public Db_rdr__mem(String[] cols, Mem_row[] rows) {
|
||||
this.rows = rows; this.rows_len = rows.length;
|
||||
}
|
||||
public boolean Move_next() {
|
||||
@ -31,7 +31,7 @@ public class Db_rdr__mem implements Db_rdr {
|
||||
public byte[] Read_bry(String k) {return (byte[])row.Get_by(k);}
|
||||
public String Read_str(String k) {return (String)row.Get_by(k);}
|
||||
public byte[] Read_bry_by_str(String k) {return Bry_.new_u8_safe((String)row.Get_by(k));} // NOTE: null b/c db can have NULL
|
||||
@gplx.Virtual public byte[] Read_bry_in_parts(String tbl, String fld, String crt_key, Object crt_val) {throw Err_.not_implemented_();}
|
||||
@gplx.Virtual public void Save_bry_in_parts(Io_url url, String tbl, String fld, String crt_key, Object crt_val) {throw Err_.not_implemented_();}
|
||||
public DateAdp Read_date_by_str(String k) {return DateAdp_.parse_iso8561((String)row.Get_by(k));}
|
||||
public byte Read_byte(String k) {return Byte_.cast_(row.Get_by(k));}
|
||||
public int Read_int(String k) {return Int_.cast_(row.Get_by(k));}
|
||||
|
24
140_dbs/src/gplx/dbs/engines/mems/Mem_qry_set.java
Normal file
24
140_dbs/src/gplx/dbs/engines/mems/Mem_qry_set.java
Normal file
@ -0,0 +1,24 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Mem_qry_set {
|
||||
private final List_adp rows = List_adp_.new_();
|
||||
public int Len() {return rows.Count();}
|
||||
public Mem_row Get_at(int i) {return (Mem_row)rows.Get_at(i);}
|
||||
public void Add(Mem_row row) {rows.Add(row);}
|
||||
}
|
@ -16,11 +16,12 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.dbs.engines.mems; import gplx.*; import gplx.dbs.*; import gplx.dbs.engines.*;
|
||||
public class Mem_itm implements GfoInvkAble {
|
||||
public class Mem_row implements GfoInvkAble {
|
||||
private final Ordered_hash hash = Ordered_hash_.new_();
|
||||
public Object Get_by(String key) {return hash.Get_by(key);}
|
||||
public Object Get_at(int i) {return hash.Get_at(i);}
|
||||
public void Set_by(String key, Object val) {hash.Add_if_dupe_use_nth(key, val);}
|
||||
public void Set_by(String key, Object val) {hash.Add_if_dupe_use_nth(key, val);}
|
||||
public void Add(String key, Object val) {hash.Add(key, val);}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
Object rv = Get_by(k);
|
||||
if (rv == null) return GfoInvkAble_.Rv_unhandled;
|
@ -23,7 +23,7 @@ public class Mem_tbl {
|
||||
public Mem_tbl(Db_meta_tbl meta) {this.meta = meta;}
|
||||
public Db_meta_tbl Meta() {return meta;} private final Db_meta_tbl meta;
|
||||
public int Insert(Db_stmt__mem stmt) {
|
||||
Mem_itm itm = new Mem_itm();
|
||||
Mem_row itm = new Mem_row();
|
||||
Db_meta_fld[] flds = meta.Flds();
|
||||
int len = flds.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
@ -50,7 +50,7 @@ public class Mem_tbl {
|
||||
int where_rows_len = where_rows.Count();
|
||||
String[] update_cols = qry.Cols_for_update(); int update_cols_len = update_cols.length;
|
||||
for (int i = 0; i < where_rows_len; ++i) {
|
||||
Mem_itm itm = (Mem_itm)where_rows.Get_at(i);
|
||||
Mem_row itm = (Mem_row)where_rows.Get_at(i);
|
||||
for (int j = 0; j < update_cols_len; ++j)
|
||||
itm.Set_by(update_cols[j], stmt.Args_get_at(j));
|
||||
}
|
||||
@ -62,7 +62,7 @@ public class Mem_tbl {
|
||||
Select_rows_where(where_rows, stmt, qry.Where());
|
||||
int where_rows_len = where_rows.Count();
|
||||
for (int i = 0; i < where_rows_len; ++i) {
|
||||
Mem_itm itm = (Mem_itm)where_rows.Get_at(i);
|
||||
Mem_row itm = (Mem_row)where_rows.Get_at(i);
|
||||
rows.Del(itm);
|
||||
}
|
||||
return where_rows_len;
|
||||
@ -81,13 +81,13 @@ public class Mem_tbl {
|
||||
}
|
||||
where.Val_from_args(stmt.Crts());
|
||||
Select_rows_where(where_rows, stmt, where);
|
||||
return new Db_rdr__mem(select, (Mem_itm[])where_rows.To_ary_and_clear(Mem_itm.class));
|
||||
return new Db_rdr__mem(select, (Mem_row[])where_rows.To_ary_and_clear(Mem_row.class));
|
||||
}
|
||||
private void Select_rows_where(List_adp rv, Db_stmt__mem stmt, Criteria crt) {
|
||||
rv.Clear();
|
||||
int rows_len = rows.Count();
|
||||
for (int i = 0; i < rows_len; ++i) {
|
||||
Mem_itm itm = (Mem_itm)rows.Get_at(i);
|
||||
Mem_row itm = (Mem_row)rows.Get_at(i);
|
||||
if (crt.Matches(itm))
|
||||
rv.Add(itm);
|
||||
}
|
||||
|
@ -39,8 +39,8 @@ public class Sql_bry_rdr extends Bry_rdr { public byte[] Read_sql_identifier()
|
||||
byte[] end_bry = null;
|
||||
switch (b_0) {
|
||||
case Byte_ascii.Dash: bgn_1 = Byte_ascii.Dash; end_bry = Comm_end_line; break;
|
||||
case Byte_ascii.Slash: bgn_1 = Byte_ascii.Asterisk; end_bry = Comm_end_multi; break;
|
||||
case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: case Byte_ascii.Space:
|
||||
case Byte_ascii.Slash: bgn_1 = Byte_ascii.Star; end_bry = Comm_end_multi; break;
|
||||
case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space:
|
||||
++pos;
|
||||
return super.Skip_ws();
|
||||
default:
|
||||
@ -53,5 +53,5 @@ public class Sql_bry_rdr extends Bry_rdr { public byte[] Read_sql_identifier()
|
||||
pos = end_pos + end_bry.length;
|
||||
return this.Skip_ws();
|
||||
}
|
||||
private static final byte[] Comm_end_line = Byte_ascii.NewLine_bry, Comm_end_multi = Bry_.new_a7("*/");
|
||||
private static final byte[] Comm_end_line = Byte_ascii.Nl_bry, Comm_end_multi = Bry_.new_a7("*/");
|
||||
}
|
||||
|
@ -65,14 +65,14 @@ public class Db_sqlbldr__sqlite implements Db_sqlbldr {
|
||||
tmp_bfr.Add_str_a7(fld.Name()).Add_byte_space();
|
||||
Tid_to_sql(tmp_bfr, fld.Tid(), fld.Len()); tmp_bfr.Add_byte_space();
|
||||
tmp_bfr.Add_str_a7(fld.Nullable() ? "NULL " : "NOT NULL ");
|
||||
if (fld.Default_value() != Db_meta_fld.Default_value_null) {
|
||||
if (fld.Default() != Db_meta_fld.Default_value_null) {
|
||||
tmp_bfr.Add_str_a7("DEFAULT ");
|
||||
boolean quote = Bool_.N;
|
||||
switch (fld.Tid()) {
|
||||
case Db_meta_fld.Tid_str: case Db_meta_fld.Tid_text: quote = Bool_.Y; break;
|
||||
}
|
||||
if (quote) tmp_bfr.Add_byte_apos();
|
||||
tmp_bfr.Add_str_u8(Object_.Xto_str_strict_or_null(fld.Default_value()));
|
||||
tmp_bfr.Add_str_u8(Object_.Xto_str_strict_or_null(fld.Default()));
|
||||
if (quote) tmp_bfr.Add_byte_apos();
|
||||
tmp_bfr.Add_byte_space();
|
||||
}
|
||||
|
Binary file not shown.
@ -17,36 +17,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
public interface Gxw_html extends GxwElem {
|
||||
String Html_doc_html();
|
||||
void Html_doc_html_load_by_mem(String html);
|
||||
void Html_doc_html_load_by_url(String path, String html);
|
||||
byte Html_doc_html_load_tid(); void Html_doc_html_load_tid_(byte v);
|
||||
String Html_doc_selected_get_text_or_href();
|
||||
String Html_doc_selected_get_href_or_text();
|
||||
String Html_doc_selected_get_src_or_empty();
|
||||
String Html_doc_selected_get_active_or_selection(); // gets selected anchor or highlighted text for opening a new page
|
||||
boolean Html_doc_find(String id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight);
|
||||
void Html_doc_body_focus();
|
||||
void Html_doc_selection_focus_toggle();
|
||||
String Html_elem_atr_get_str (String id, String atr_key);
|
||||
boolean Html_elem_atr_get_bool (String id, String atr_key);
|
||||
boolean Html_elem_atr_set (String id, String atr_key, String val);
|
||||
boolean Html_elem_atr_set_append(String id, String atr_key, String append);
|
||||
boolean Html_elem_delete(String id);
|
||||
boolean Html_elem_replace_html(String id, String html);
|
||||
boolean Html_elem_append_above(String id, String html);
|
||||
boolean Html_gallery_packed_exec();
|
||||
boolean Html_elem_focus(String id);
|
||||
boolean Html_elem_scroll_into_view(String id);
|
||||
boolean Html_elem_img_update(String id, String src, int w, int h);
|
||||
String Html_window_vpos();
|
||||
boolean Html_window_vpos_(String v);
|
||||
boolean Html_window_print_preview();
|
||||
String Html_active_atr_get_str(String atr_key, String or);
|
||||
void Html_js_enabled_(boolean v);
|
||||
void Html_js_eval_proc(String name, String... args);
|
||||
String Html_js_eval_script(String script);
|
||||
void Html_js_cbks_add(String js_func_name, GfoInvkAble invk);
|
||||
String Html_js_eval_proc_as_str (String name, Object... args);
|
||||
boolean Html_js_eval_proc_as_bool (String name, Object... args);
|
||||
String Html_js_eval_script (String script);
|
||||
void Html_js_cbks_add (String js_func_name, GfoInvkAble invk);
|
||||
void Html_invk_src_(GfoEvObj v);
|
||||
void Html_dispose();
|
||||
}
|
||||
|
@ -18,35 +18,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.gfui; import gplx.*;
|
||||
public class Gfui_html extends GfuiElemBase {
|
||||
public void Under_html_(Gxw_html v) {under = v;} private Gxw_html under;
|
||||
public String Html_doc_html() {return under.Html_doc_html();}
|
||||
public void Html_doc_html_load_by_mem(String html) {under.Html_doc_html_load_by_mem(html);}
|
||||
public void Html_doc_html_load_by_url(String path, String html) {under.Html_doc_html_load_by_url(path, html);}
|
||||
public byte Html_doc_html_load_tid() {return under.Html_doc_html_load_tid();}
|
||||
public void Html_doc_html_load_tid_(byte v) {under.Html_doc_html_load_tid_(v);}
|
||||
public String Html_doc_selected_get_text_or_href() {return under.Html_doc_selected_get_text_or_href();}
|
||||
public String Html_doc_selected_get_href_or_text() {return under.Html_doc_selected_get_href_or_text();}
|
||||
public String Html_doc_selected_get_src_or_empty() {return under.Html_doc_selected_get_src_or_empty();}
|
||||
public String Html_doc_selected_get_active_or_selection() {return under.Html_doc_selected_get_active_or_selection();}
|
||||
public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) {return under.Html_doc_find(elem_id, find, dir_fwd, case_match, wrap_find, highlight_matches);}
|
||||
public void Html_doc_body_focus() {under.Html_doc_body_focus();}
|
||||
public void Html_doc_selection_focus_toggle() {under.Html_doc_selection_focus_toggle();}
|
||||
@gplx.Virtual public String Html_elem_atr_get_str(String elem_id, String atr_key) {return under.Html_elem_atr_get_str(elem_id, atr_key);}
|
||||
@gplx.Virtual public boolean Html_elem_atr_get_bool(String elem_id, String atr_key) {return under.Html_elem_atr_get_bool(elem_id, atr_key);}
|
||||
public boolean Html_elem_atr_set(String elem_id, String atr_key, String v) {return under.Html_elem_atr_set(elem_id, atr_key, v);}
|
||||
public boolean Html_elem_atr_set_append(String elem_id, String atr_key, String append) {return under.Html_elem_atr_set_append(elem_id, atr_key, append);}
|
||||
public boolean Html_elem_delete(String elem_id) {return under.Html_elem_delete(elem_id);}
|
||||
public boolean Html_elem_replace_html(String id, String html) {return under.Html_elem_replace_html(id, html);}
|
||||
public boolean Html_elem_append_above(String id, String html) {return under.Html_elem_append_above(id, html);}
|
||||
public boolean Html_gallery_packed_exec() {return under.Html_gallery_packed_exec();}
|
||||
public void Html_elem_focus(String elem_id) {under.Html_elem_focus(elem_id);}
|
||||
public boolean Html_elem_scroll_into_view(String elem_id) {return under.Html_elem_scroll_into_view(elem_id);}
|
||||
public boolean Html_elem_img_update(String elem_id, String elem_src, int elem_width, int elem_height) {return under.Html_elem_img_update(elem_id, elem_src, elem_width, elem_height);}
|
||||
public String Html_window_vpos() {return under.Html_window_vpos();}
|
||||
public void Html_window_vpos_(String v) {under.Html_window_vpos_(v);}
|
||||
public boolean Html_window_print_preview() {return under.Html_window_print_preview();}
|
||||
public String Html_active_atr_get_str(String atrKey, String or) {return under.Html_active_atr_get_str(atrKey, or);}
|
||||
public void Html_js_enabled_(boolean v) {under.Html_js_enabled_(v);}
|
||||
public void Html_js_eval_proc(String name, String... args) {under.Html_js_eval_proc(name, args);}
|
||||
@gplx.Virtual public String Html_js_eval_proc_as_str(String name, Object... args) {return under.Html_js_eval_proc_as_str(name, args);}
|
||||
@gplx.Virtual public boolean Html_js_eval_proc_as_bool(String name, Object... args) {return under.Html_js_eval_proc_as_bool(name, args);}
|
||||
public String Html_js_eval_script(String script) {return under.Html_js_eval_script(script);}
|
||||
public void Html_js_cbks_add(String js_func_name, GfoInvkAble invk) {under.Html_js_cbks_add(js_func_name, invk);}
|
||||
public void Html_invk_src_(GfoEvObj v) {under.Html_invk_src_(v);}
|
||||
|
@ -1,116 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
import gplx.core.primitives.*;
|
||||
public class Gfui_html_cfg implements GfoInvkAble {
|
||||
public String Doc_html() {return Exec_fmt(fmtr_doc_html);} private Bry_fmtr fmtr_doc_html = Bry_fmtr.new_();
|
||||
public String Doc_body_focus() {return Exec_fmt(fmtr_doc_body_focus);} private Bry_fmtr fmtr_doc_body_focus = Bry_fmtr.new_();
|
||||
public String Doc_selection_focus_toggle() {return Exec_fmt(fmtr_doc_selection_focus_toggle);} private Bry_fmtr fmtr_doc_selection_focus_toggle = Bry_fmtr.new_();
|
||||
public String Doc_selected_get_text_or_href() {return Exec_fmt(fmtr_doc_selected_get_text_or_href);} private Bry_fmtr fmtr_doc_selected_get_text_or_href = Bry_fmtr.keys_();
|
||||
public String Doc_selected_get_href_or_text() {return Exec_fmt(fmtr_doc_selected_get_href_or_text);} private Bry_fmtr fmtr_doc_selected_get_href_or_text = Bry_fmtr.keys_();
|
||||
public String Doc_selected_get_src_or_empty() {return Exec_fmt(fmtr_doc_selected_get_src_or_empty);} private Bry_fmtr fmtr_doc_selected_get_src_or_empty = Bry_fmtr.keys_();
|
||||
public String Doc_selected_get_active_or_selection() {return Exec_fmt(fmtr_doc_selected_get_active_or_selection);} private Bry_fmtr fmtr_doc_selected_get_active_or_selection = Bry_fmtr.keys_();
|
||||
public String Doc_find_html(String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) {
|
||||
return Exec_fmt(fmtr_doc_find_html, find, Bool_.Xto_str_lower(dir_fwd), Bool_.Xto_str_lower(case_match), Bool_.Xto_str_lower(wrap_find), Bool_.Xto_str_lower(highlight_matches));
|
||||
} private Bry_fmtr fmtr_doc_find_html = Bry_fmtr.keys_("find_text", "dir_fwd", "case_match", "wrap_find", "highlight_matches");
|
||||
public String Doc_find_edit(String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean search_text_is_diff, int prv_find_bgn) {
|
||||
return Exec_fmt(fmtr_doc_find_edit, find, Bool_.Xto_str_lower(dir_fwd), Bool_.Xto_str_lower(case_match), Bool_.Xto_str_lower(wrap_find), Bool_.Xto_str_lower(search_text_is_diff), Int_.Xto_str(prv_find_bgn));
|
||||
} private Bry_fmtr fmtr_doc_find_edit = Bry_fmtr.keys_("find_text", "dir_fwd", "case_match", "wrap_find", "find_text_is_diff", "prv_find_bgn");
|
||||
public String Elem_atr_get(String elem_id, String atr_key) {return Exec_fmt(fmtr_elem_atr_get, elem_id, atr_key);} private Bry_fmtr fmtr_elem_atr_get = Bry_fmtr.keys_("elem_id", "atr_key");
|
||||
public String Elem_atr_get_toString(String elem_id, String atr_key) {return Exec_fmt(fmtr_elem_atr_get_toString, elem_id, atr_key);} private Bry_fmtr fmtr_elem_atr_get_toString = Bry_fmtr.keys_("elem_id", "atr_key");
|
||||
public String Elem_atr_set(String elem_id, String atr_key, String atr_val) {return Exec_fmt(fmtr_elem_atr_set, elem_id, atr_key, atr_val);} private Bry_fmtr fmtr_elem_atr_set = Bry_fmtr.keys_("elem_id", "atr_key", "atr_val");
|
||||
public String Elem_atr_set_append(String elem_id, String atr_key, String atr_val) {
|
||||
return Exec_fmt(fmtr_elem_atr_set_append, elem_id, atr_key, atr_val);
|
||||
} private Bry_fmtr fmtr_elem_atr_set_append = Bry_fmtr.keys_("elem_id", "atr_key", "atr_val");
|
||||
public String Elem_delete(String elem_id) {return Exec_fmt(fmtr_elem_delete, elem_id);} private Bry_fmtr fmtr_elem_delete = Bry_fmtr.keys_("elem_id");
|
||||
public String Elem_replace_html(String id, String html) {return Exec_fmt(fmtr_elem_replace_html, id, Escape_quote(html));} private Bry_fmtr fmtr_elem_replace_html = Bry_fmtr.keys_("id", "html");
|
||||
public String Elem_append_above(String id, String html) {return Exec_fmt(fmtr_elem_append_above, id, Escape_quote(html));} private Bry_fmtr fmtr_elem_append_above = Bry_fmtr.keys_("id", "html");
|
||||
public String Gallery_packed_exec() {return Exec_fmt(fmtr_gallery_packed_exec);} private Bry_fmtr fmtr_gallery_packed_exec = Bry_fmtr.keys_();
|
||||
public String Elem_focus(String elem_id) {return Exec_fmt(fmtr_elem_focus, elem_id);} private Bry_fmtr fmtr_elem_focus = Bry_fmtr.keys_("elem_id");
|
||||
public String Elem_scroll_into_view(String elem_id) {return Exec_fmt(fmtr_elem_scroll_into_view, elem_id);} private Bry_fmtr fmtr_elem_scroll_into_view = Bry_fmtr.keys_("elem_id");
|
||||
public String Elem_img_update(String id, String src, int w, int h) {return Exec_fmt(fmtr_elem_img_update, id, src, Int_.Xto_str(w), Int_.Xto_str(h));} Bry_fmtr fmtr_elem_img_update = Bry_fmtr.keys_("elem_id", "elem_src", "elem_width", "elem_height");
|
||||
public String Window_vpos() {return Exec_fmt(fmtr_window_vpos);} private Bry_fmtr fmtr_window_vpos = Bry_fmtr.new_();
|
||||
public String Window_vpos_(String node_path, String scroll_top) {return Exec_fmt(fmtr_window_vpos_, node_path, scroll_top);} private Bry_fmtr fmtr_window_vpos_ = Bry_fmtr.keys_("node_path", "scroll_top");
|
||||
public String Window_print_preview() {return Exec_fmt(fmtr_window_print_preview);} private Bry_fmtr fmtr_window_print_preview = Bry_fmtr.keys_();
|
||||
public String Active_atr_get_str(String atr_key) {return Exec_fmt(fmtr_active_atr_get, atr_key);} private Bry_fmtr fmtr_active_atr_get = Bry_fmtr.keys_("atr_key");
|
||||
public Bry_fmtr Js_scripts_get(String name) {return (Bry_fmtr)js_scripts.Get_by(name);}
|
||||
private void Js_scripts_add(String name, String text) {
|
||||
Bry_fmtr fmtr = Bry_fmtr.new_(text);
|
||||
js_scripts.Add_if_dupe_use_nth(name, fmtr);
|
||||
} private Ordered_hash js_scripts = Ordered_hash_.new_();
|
||||
private String Exec_fmt(Bry_fmtr fmtr, String... vals) {
|
||||
if (debug_file != null) GfsCore._.ExecFile(debug_file);
|
||||
return fmtr.Bld_str_many(vals);
|
||||
} private Io_url debug_file = null;
|
||||
private static String Escape_quote(String v) {
|
||||
String rv = v;
|
||||
rv = String_.Replace(rv, "'", "\\'");
|
||||
rv = String_.Replace(rv, "\"", "\\\"");
|
||||
rv = String_.Replace(rv, "\n", "\\n");
|
||||
return rv;
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_doc_html_)) fmtr_doc_html.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_body_focus_)) fmtr_doc_body_focus.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_selection_focus_toggle_)) fmtr_doc_selection_focus_toggle.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_selected_get_text_or_href_)) fmtr_doc_selected_get_text_or_href.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_selected_get_href_or_text_)) fmtr_doc_selected_get_href_or_text.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_selected_get_src_or_empty_)) fmtr_doc_selected_get_src_or_empty.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_selected_get_active_or_selection_)) fmtr_doc_selected_get_active_or_selection.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_find_html_)) fmtr_doc_find_html.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_find_edit_)) fmtr_doc_find_edit.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_atr_get_)) fmtr_elem_atr_get.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_atr_get_toString_)) fmtr_elem_atr_get_toString.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_atr_set_)) fmtr_elem_atr_set.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_atr_set_append_)) fmtr_elem_atr_set_append.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_delete_)) fmtr_elem_delete.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_replace_html_)) fmtr_elem_replace_html.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_append_above_)) fmtr_elem_append_above.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_gallery_packed_exec_)) fmtr_gallery_packed_exec.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_focus_)) fmtr_elem_focus.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_scroll_into_view_)) fmtr_elem_scroll_into_view.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_img_update_)) fmtr_elem_img_update.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_path_get_)) fmtr_window_vpos.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_win_print_preview_)) fmtr_window_print_preview.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_elem_path_set_)) fmtr_window_vpos_.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_doc_active_atr_get_)) fmtr_active_atr_get.Fmt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_js_scripts_add)) Js_scripts_add(m.ReadStr("name"), m.ReadStr("text"));
|
||||
else if (ctx.Match(k, Invk_debug_file_)) debug_file = m.ReadIoUrl("v");
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static void Html_window_vpos_parse(String v, String_obj_ref scroll_top, String_obj_ref node_path) {
|
||||
int pipe_pos = String_.FindFwd(v, "|"); if (pipe_pos == String_.Find_none) return; // if elem_get_path returns invalid value, don't fail; DATE:2014-04-05
|
||||
scroll_top.Val_(String_.Mid(v, 0, pipe_pos));
|
||||
String node_path_val = String_.Mid(v, pipe_pos + 1, String_.Len(v));
|
||||
node_path_val = "'" + String_.Replace(node_path_val, ",", "','") + "'";
|
||||
node_path.Val_(node_path_val);
|
||||
}
|
||||
public static final String Invk_debug_file_ = "debug_file_"
|
||||
, Invk_doc_html_ = "doc_html_", Invk_doc_body_focus_ = "doc_body_focus_", Invk_doc_selection_focus_toggle_ = "doc_selection_focus_toggle_"
|
||||
, Invk_doc_active_atr_get_ = "doc_active_atr_get_", Invk_doc_find_html_ = "doc_find_html_", Invk_doc_find_edit_ = "doc_find_edit_"
|
||||
, Invk_doc_selected_get_text_or_href_ = "doc_selected_get_text_or_href_", Invk_doc_selected_get_href_or_text_ = "doc_selected_get_href_or_text_", Invk_doc_selected_get_src_or_empty_ = "doc_selected_get_src_or_empty_", Invk_doc_selected_get_active_or_selection_ = "doc_selected_get_active_or_selection_"
|
||||
, Invk_win_print_preview_ = "win_print_preview_"
|
||||
, Invk_elem_atr_get_ = "elem_atr_get_", Invk_elem_atr_get_toString_ = "elem_atr_get_toString_", Invk_elem_atr_set_ = "elem_atr_set_", Invk_elem_atr_set_append_ = "elem_atr_set_append_"
|
||||
, Invk_elem_path_get_ = "elem_path_get_", Invk_elem_path_set_ = "elem_path_set_"
|
||||
, Invk_elem_focus_ = "elem_focus_", Invk_elem_scroll_into_view_ = "elem_scroll_into_view_"
|
||||
, Invk_elem_img_update_ = "elem_img_update_", Invk_elem_delete_ = "elem_delete_", Invk_elem_replace_html_ = "elem_replace_html_", Invk_elem_append_above_ = "elem_append_above_", Invk_gallery_packed_exec_ = "gallery_packed_exec_"
|
||||
, Invk_js_scripts_add = "js_scripts_add"
|
||||
, Invk_javascript_enabled_ = "javascript_enabled_"
|
||||
;
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
import org.junit.*; import gplx.core.primitives.*;
|
||||
public class Gfui_html_cfg_tst {
|
||||
private Gfui_html_cfg_fxt fxt = new Gfui_html_cfg_fxt();
|
||||
@Before public void init() {fxt.Reset();}
|
||||
@Test public void Html_window_vpos_parse() {
|
||||
fxt.Test_Html_window_vpos_parse("0|0,1,2", "0", "'0','1','2'");
|
||||
fxt.Test_Html_window_vpos_parse("org.eclipse.swt.SWTException: Permission denied for <file://> to get property Selection.rangeCount", null, null); // check that invalid path doesn't fail; DATE:2014-04-05
|
||||
}
|
||||
}
|
||||
class Gfui_html_cfg_fxt {
|
||||
private String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_();
|
||||
public void Reset() {}
|
||||
public void Test_Html_window_vpos_parse(String raw, String expd_scroll_top, String expd_node_path) {
|
||||
scroll_top.Val_null_(); node_path.Val_null_();
|
||||
Gfui_html_cfg.Html_window_vpos_parse(raw, scroll_top, node_path);
|
||||
Tfds.Eq(expd_scroll_top, scroll_top.Val(), expd_scroll_top);
|
||||
Tfds.Eq(expd_node_path, node_path.Val(), expd_node_path);
|
||||
}
|
||||
}
|
@ -16,39 +16,7 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.gfui; import gplx.*;
|
||||
class Mem_html extends GxwTextMemo_lang implements Gxw_html { public String Html_doc_html() {
|
||||
return String_.Replace(this.TextVal(), "\r\n", "\n");
|
||||
}
|
||||
public String Html_doc_selected_get_sub_atr(String tag, String sub_tag, int sub_idx, String sub_atr) {return "";}
|
||||
public String Html_doc_selected_get(String host, String page) {return "";}
|
||||
public String Html_doc_selected_get_text_or_href() {return "";}
|
||||
public String Html_doc_selected_get_href_or_text() {return "";}
|
||||
public String Html_doc_selected_get_src_or_empty() {return "";}
|
||||
public String Html_doc_selected_get_active_or_selection() {return "";}
|
||||
public boolean Html_window_print_preview() {return false;}
|
||||
public void Html_invk_src_(GfoEvObj v) {}
|
||||
public String Html_elem_atr_get_str(String elem_id, String atr_key) {
|
||||
if (String_.Eq(atr_key, Gfui_html.Atr_value)) return String_.Replace(this.TextVal(), "\r\n", "\n");
|
||||
else throw Err_.unhandled(atr_key);
|
||||
}
|
||||
public Object Html_elem_atr_get_obj(String elem_id, String atr_key) {
|
||||
if (String_.Eq(atr_key, Gfui_html.Atr_value)) return String_.Replace(this.TextVal(), "\r\n", "\n");
|
||||
else throw Err_.unhandled(atr_key);
|
||||
}
|
||||
public boolean Html_elem_atr_get_bool(String elem_id, String atr_key) {
|
||||
if (String_.Eq(atr_key, Gfui_html.Atr_value)) return Bool_.parse_(String_.Replace(this.TextVal(), "\r\n", "\n"));
|
||||
else throw Err_.unhandled(atr_key);
|
||||
}
|
||||
public boolean Html_elem_atr_set(String elem_id, String atr_key, String v) {
|
||||
if (String_.Eq(atr_key, Gfui_html.Atr_value)) this.TextVal_set(v);
|
||||
else throw Err_.unhandled(atr_key);
|
||||
return true;
|
||||
}
|
||||
public boolean Html_elem_atr_set_append(String elem_id, String atr_key, String append) {
|
||||
if (String_.Eq(atr_key, Gfui_html.Atr_value)) this.TextVal_set(this.TextVal() + append);
|
||||
else throw Err_.unhandled(atr_key);
|
||||
return true;
|
||||
}
|
||||
class Mem_html extends GxwTextMemo_lang implements Gxw_html { public void Html_invk_src_(GfoEvObj v) {}
|
||||
public void Html_doc_html_load_by_mem(String s) {
|
||||
// this.Core().ForeColor_set(plainText ? ColorAdp_.Black : ColorAdp_.Gray);
|
||||
s = String_.Replace(s, "\r", "");
|
||||
@ -62,22 +30,6 @@ class Mem_html extends GxwTextMemo_lang implements Gxw_html { public String Htm
|
||||
}
|
||||
public byte Html_doc_html_load_tid() {return html_doc_html_load_tid;} private byte html_doc_html_load_tid;
|
||||
public void Html_doc_html_load_tid_(byte v) {html_doc_html_load_tid = v;}
|
||||
public String Html_active_atr_get_str(String atrKey, String or) { // NOTE: fuzzy way of finding current href; EX: <a href="a">b</a>
|
||||
String txt = this.TextVal();
|
||||
int pos = this.SelBgn();
|
||||
String rv = ExtractAtr(atrKey, txt, pos);
|
||||
return rv == null ? or : rv;
|
||||
}
|
||||
public void Html_doc_body_focus() {}
|
||||
public void Html_doc_selection_focus_toggle() {}
|
||||
public String Html_window_vpos() {return "";}
|
||||
public boolean Html_window_vpos_(String v) {return true;}
|
||||
public boolean Html_elem_focus(String v) {return true;}
|
||||
public boolean Html_elem_img_update(String elem_id, String elem_src, int elem_width, int elem_height) {return true;}
|
||||
public boolean Html_elem_delete(String elem_id) {return true;}
|
||||
public boolean Html_elem_replace_html(String id, String html) {return true;}
|
||||
public boolean Html_elem_append_above(String id, String html) {return true;}
|
||||
public boolean Html_gallery_packed_exec() {return true;}
|
||||
public String Html_js_eval_script(String script) {return "";}
|
||||
String ExtractAtr(String key, String txt, int pos) {
|
||||
int key_pos = String_.FindBwd(txt, key, pos); if (key_pos == String_.Find_none) return null;
|
||||
@ -86,45 +38,11 @@ class Mem_html extends GxwTextMemo_lang implements Gxw_html { public String Htm
|
||||
if (!Int_.Between(pos, q0, q1)) return null; // current pos is not between nearest quotes
|
||||
return String_.Mid(txt, q0 + 1, q1);
|
||||
}
|
||||
public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) {
|
||||
// String txt = this.TextVal();
|
||||
// int pos = this.SelBgn();
|
||||
// int bgn = String_.FindFwd(txt, find, pos); if (bgn == String_.Find_none) return false;
|
||||
// if (bgn == pos) {
|
||||
// bgn = String_.FindFwd(txt, find, pos + 1);
|
||||
// if (bgn == String_.Find_none) {
|
||||
// bgn = String_.FindFwd(txt, find, 0);
|
||||
// if (bgn == String_.Find_none) return false;
|
||||
// }
|
||||
// }
|
||||
// this.SelBgn_set(bgn);
|
||||
// this.SelLen_set(String_.Len(find));
|
||||
// this.ScrollTillSelectionStartIsFirstLine();
|
||||
txtFindMgr.Text_(this.TextVal());
|
||||
int cur = this.SelBgn();
|
||||
int[] ary = txtFindMgr.FindByUi(find, this.SelBgn(), this.SelLen(), false);
|
||||
if (ary[0] != cur) {
|
||||
this.SelBgn_set(ary[0]);
|
||||
this.SelLen_set(ary[1]);
|
||||
this.ScrollTillCaretIsVisible();
|
||||
}
|
||||
else {
|
||||
ary = txtFindMgr.FindByUi(find, this.SelBgn() + 1, 0, false);
|
||||
if (ary[0] != 0) {
|
||||
this.SelBgn_set(ary[0]);
|
||||
this.SelLen_set(ary[1]);
|
||||
this.ScrollTillCaretIsVisible();
|
||||
// this.ScrollTillSelectionStartIsFirstLine();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public boolean Html_elem_scroll_into_view(String id) {return false;}
|
||||
public void Html_js_enabled_(boolean v) {}
|
||||
public void Html_js_eval_proc(String proc, String... args) {}
|
||||
public String Html_js_eval_proc_as_str(String proc, Object... args) {return "not implemented by mem_html";}
|
||||
public boolean Html_js_eval_proc_as_bool(String proc, Object... args) {return false;}
|
||||
public void Html_js_cbks_add(String js_func_name, GfoInvkAble invk) {}
|
||||
public void Html_dispose() {}
|
||||
private TxtFindMgr txtFindMgr = new TxtFindMgr();
|
||||
public Mem_html() {
|
||||
this.ctor_MsTextBoxMultiline_();
|
||||
}
|
||||
|
@ -64,7 +64,6 @@ public class Swt_kit implements Gfui_kit {
|
||||
public void Kit_sync_cmd_add(Swt_gui_cmd cmd) {synchronized (thread_lock) {sync_cmd_list.Add(cmd);}}
|
||||
public void Kit_sync_cmd_del(Swt_gui_cmd cmd) {synchronized (thread_lock) {sync_cmd_list.Del(cmd);}}
|
||||
public GfoInvkAbleCmd Kit_term_cbk() {return term_cbk;} public void Kit_term_cbk_(GfoInvkAbleCmd v) {this.term_cbk = v;} private GfoInvkAbleCmd term_cbk = GfoInvkAbleCmd.Null;
|
||||
public Gfui_html_cfg Html_cfg() {return html_cfg;} private final Gfui_html_cfg html_cfg = new Gfui_html_cfg();
|
||||
public void Kit_init(Gfo_usr_dlg gui_wtr) {
|
||||
this.gui_wtr = gui_wtr;
|
||||
this.msg_wkr_stop = new Swt_msg_wkr_stop(this, gui_wtr);
|
||||
@ -231,12 +230,11 @@ public class Swt_kit implements Gfui_kit {
|
||||
Cfg_set(type, Swt_kit.Cfg_Html_BrowserType, Cfg_Html_BrowserType_parse(val));
|
||||
}
|
||||
}
|
||||
else if (String_.Eq(k, Invk_HtmlBox)) {return html_cfg;}
|
||||
else if (String_.Eq(k, Invk_ask_file)) return this.New_dlg_file(Gfui_kit_.File_dlg_type_open, m.Args_getAt(0).Val_to_str_or_empty()).Ask();
|
||||
else if (String_.Eq(k, Invk_shell_close)) shell.close();
|
||||
return this;
|
||||
}
|
||||
public static final String Invk_Cfg_add = "Cfg_add", Invk_HtmlBox = "HtmlBox", Invk_ask_file = "ask_file"; // private or public?
|
||||
public static final String Invk_Cfg_add = "Cfg_add", Invk_ask_file = "ask_file"; // private or public?
|
||||
public static final String Invk_shell_close = "shell_close"; // public
|
||||
public static final Swt_kit _ = new Swt_kit(); private Swt_kit() {} // singleton b/c of following line "In particular, some platforms which SWT supports will not allow more than one active display" (http://help.eclipse.org/indigo/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/widgets/Display.html)
|
||||
public static final String Cfg_Html_BrowserType = "BrowserType";
|
||||
|
@ -74,7 +74,7 @@ class Swt_lnr_key implements KeyListener {
|
||||
IptEvtDataKey XtoKeyData(KeyEvent ev) {
|
||||
int val = ev.keyCode;
|
||||
switch (val) {
|
||||
case Byte_ascii.CarriageReturn: val = 10; break; // enter key is 13 whereas .net/swing is 10
|
||||
case Byte_ascii.Cr: val = 10; break; // enter key is 13 whereas .net/swing is 10
|
||||
case Byte_ascii.Ltr_a: case Byte_ascii.Ltr_b: case Byte_ascii.Ltr_c: case Byte_ascii.Ltr_d: case Byte_ascii.Ltr_e:
|
||||
case Byte_ascii.Ltr_f: case Byte_ascii.Ltr_g: case Byte_ascii.Ltr_h: case Byte_ascii.Ltr_i: case Byte_ascii.Ltr_j:
|
||||
case Byte_ascii.Ltr_k: case Byte_ascii.Ltr_l: case Byte_ascii.Ltr_m: case Byte_ascii.Ltr_n: case Byte_ascii.Ltr_o:
|
||||
|
@ -28,7 +28,6 @@ import org.eclipse.swt.graphics.*;
|
||||
import org.eclipse.swt.widgets.*;
|
||||
import java.security.acl.Owner;
|
||||
|
||||
import gplx.*;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.browser.*;
|
||||
import org.eclipse.swt.events.*;
|
||||
@ -58,7 +57,6 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener {
|
||||
@Override public Composite Under_composite() {return null;}
|
||||
@Override public Control Under_menu_control() {return browser;}
|
||||
public int Browser_tid() {return browser_tid;} private final int browser_tid;
|
||||
public String Html_doc_html() {return Eval_script_as_str(kit.Html_cfg().Doc_html());}
|
||||
public void Html_doc_html_load_by_mem(String html) {
|
||||
html_doc_html_load_tid = Gxw_html_load_tid_.Tid_mem;
|
||||
browser.setText(html); // DBG: Io_mgr.I.SaveFilStr(Io_url_.new_fil_("C:\\temp.txt"), s)
|
||||
@ -70,63 +68,41 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener {
|
||||
}
|
||||
public byte Html_doc_html_load_tid() {return html_doc_html_load_tid;} private byte html_doc_html_load_tid;
|
||||
public void Html_doc_html_load_tid_(byte v) {html_doc_html_load_tid = v;}
|
||||
public String Html_doc_selected_get_text_or_href() {return Eval_script_as_str(kit.Html_cfg().Doc_selected_get_text_or_href());}
|
||||
public String Html_doc_selected_get_href_or_text() {return Eval_script_as_str(kit.Html_cfg().Doc_selected_get_href_or_text());}
|
||||
public String Html_doc_selected_get_src_or_empty() {return Eval_script_as_str(kit.Html_cfg().Doc_selected_get_src_or_empty());}
|
||||
public String Html_doc_selected_get_active_or_selection() {return Eval_script_as_str(kit.Html_cfg().Doc_selected_get_active_or_selection());}
|
||||
public void Html_doc_body_focus() {Eval_script_as_exec(kit.Html_cfg().Doc_body_focus());}
|
||||
public void Html_doc_selection_focus_toggle() {Eval_script_as_exec(kit.Html_cfg().Doc_selection_focus_toggle());}
|
||||
public String Html_elem_atr_get_str(String elem_id, String atr_key) {return Eval_script_as_str(kit.Html_cfg().Elem_atr_get(elem_id, atr_key));}
|
||||
public boolean Html_elem_atr_get_bool(String elem_id, String atr_key) {return Bool_.parse_((String)Eval_script(kit.Html_cfg().Elem_atr_get_toString(elem_id, atr_key)));}
|
||||
public Object Html_elem_atr_get_obj(String elem_id, String atr_key) {return Eval_script(kit.Html_cfg().Elem_atr_get(elem_id, atr_key));}
|
||||
public boolean Html_elem_atr_set(String elem_id, String atr_key, String atr_val){return Eval_script_as_exec(kit.Html_cfg().Elem_atr_set(elem_id, atr_key, Escape_quotes(atr_val)));}
|
||||
public boolean Html_elem_atr_set_append(String elem_id, String atr_key, String atr_val)
|
||||
{return Eval_script_as_exec(kit.Html_cfg().Elem_atr_set_append(elem_id, atr_key, Escape_quotes(atr_val)));}
|
||||
public boolean Html_elem_delete(String elem_id) {return Eval_script_as_exec(kit.Html_cfg().Elem_delete(elem_id));}
|
||||
public boolean Html_elem_replace_html(String id, String html) {return Eval_script_as_exec(kit.Html_cfg().Elem_replace_html(id, html));}
|
||||
public boolean Html_elem_append_above(String id, String html) {return Eval_script_as_exec(kit.Html_cfg().Elem_append_above(id, html));}
|
||||
public boolean Html_gallery_packed_exec() {return Eval_script_as_exec(kit.Html_cfg().Gallery_packed_exec());}
|
||||
public boolean Html_elem_focus(String elem_id) {return Eval_script_as_exec(kit.Html_cfg().Elem_focus(elem_id));}
|
||||
public boolean Html_elem_scroll_into_view(String id) {return Eval_script_as_bool(kit.Html_cfg().Elem_scroll_into_view(Escape_quotes(id)));}
|
||||
public String Html_window_vpos() {return Eval_script_as_str(kit.Html_cfg().Window_vpos());}
|
||||
public boolean Html_window_print_preview() {return Eval_script_as_bool(kit.Html_cfg().Window_print_preview());}
|
||||
public void Html_js_enabled_(boolean v) {browser.setJavascriptEnabled(v);}
|
||||
public void Html_js_cbks_add(String func_name, GfoInvkAble invk) {new Swt_html_func(browser, func_name, invk);}
|
||||
public String Html_js_eval_script(String script) {return Eval_script_as_str(script);}
|
||||
public boolean Html_elem_img_update(String elem_id, String elem_src, int elem_width, int elem_height) {
|
||||
elem_src = Escape_quotes(elem_src);
|
||||
int count = 0;
|
||||
while (count < 5) {
|
||||
boolean rv = Eval_script_as_bool(kit.Html_cfg().Elem_img_update(elem_id, elem_src, elem_width, elem_height));
|
||||
if (rv) return rv;
|
||||
Thread_adp_.Sleep(100);
|
||||
count++;
|
||||
public boolean Html_js_eval_proc_as_bool(String proc, Object... args) {return Bool_.cast_(Html_js_eval_proc_as_obj(proc, args));}
|
||||
public String Html_js_eval_proc_as_str(String proc, Object... args) {return Object_.Xto_str_strict_or_null(Html_js_eval_proc_as_obj(proc, args));}
|
||||
private Object Html_js_eval_proc_as_obj(String proc, Object... args) {
|
||||
Bry_bfr bfr = Bry_bfr.new_();
|
||||
bfr.Add_str_a7("return ").Add_str_u8(proc).Add_byte(Byte_ascii.Paren_bgn);
|
||||
int args_len = args.length;
|
||||
for (int i = 0; i < args_len; ++i) {
|
||||
Object arg = args[i];
|
||||
if (i != 0) bfr.Add_byte(Byte_ascii.Comma);
|
||||
boolean quote_val = true;
|
||||
if ( ClassAdp_.Eq_typeSafe(arg, Bool_.Cls_ref_type)
|
||||
|| ClassAdp_.Eq_typeSafe(arg, Int_.Cls_ref_type)
|
||||
|| ClassAdp_.Eq_typeSafe(arg, Long_.Cls_ref_type)
|
||||
) {
|
||||
quote_val = false;
|
||||
}
|
||||
if (quote_val) bfr.Add_byte(Byte_ascii.Apos);
|
||||
if (quote_val)
|
||||
bfr.Add_str_u8(Escape_quote(Object_.Xto_str_strict_or_null_mark(arg)));
|
||||
else
|
||||
bfr.Add_obj_strict(arg);
|
||||
if (quote_val) bfr.Add_byte(Byte_ascii.Apos);
|
||||
}
|
||||
return false;
|
||||
bfr.Add_byte(Byte_ascii.Paren_end).Add_byte(Byte_ascii.Semic);
|
||||
return Eval_script(bfr.Xto_str_and_clear());
|
||||
}
|
||||
public String Html_active_atr_get_str(String atr_key, String or) {
|
||||
Object rv_obj = Eval_script(kit.Html_cfg().Active_atr_get_str(atr_key));
|
||||
String rv = (String)rv_obj;
|
||||
return rv == null || !eval_rslt.Result_pass() ? or : rv;
|
||||
}
|
||||
public void Html_js_eval_proc(String proc, String... args) {
|
||||
Bry_fmtr fmtr = kit.Html_cfg().Js_scripts_get(proc);
|
||||
String script = fmtr.Bld_str_many(args);
|
||||
Eval_script(script);
|
||||
}
|
||||
public boolean Html_window_vpos_(String v) {
|
||||
Gfui_html_cfg.Html_window_vpos_parse(v, scroll_top, node_path);
|
||||
return Eval_script_as_exec(kit.Html_cfg().Window_vpos_(node_path.Val(), scroll_top.Val()));
|
||||
} private String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_();
|
||||
public boolean Html_doc_find(String elem_id, String find, boolean dir_fwd, boolean case_match, boolean wrap_find, boolean highlight_matches) {
|
||||
// if (String_.Eq(find, String_.Empty)) return false;
|
||||
find = String_.Replace(find, "\\", "\\\\"); // escape \ -> \\
|
||||
find = String_.Replace(find, "'", "\\'"); // escape ' -> \'; NOTE: \\' instead of \'
|
||||
String script = String_.Eq(elem_id, Gfui_html.Elem_id_body)
|
||||
? kit.Html_cfg().Doc_find_html(find, dir_fwd, case_match, wrap_find, highlight_matches)
|
||||
: kit.Html_cfg().Doc_find_edit(find, dir_fwd, case_match, wrap_find, false, -1);
|
||||
Eval_script(script);
|
||||
return true;
|
||||
private static String Escape_quote(String v) {
|
||||
String rv = v;
|
||||
rv = String_.Replace(rv, "'", "\\'");
|
||||
rv = String_.Replace(rv, "\"", "\\\"");
|
||||
rv = String_.Replace(rv, "\n", "\\n");
|
||||
return rv;
|
||||
}
|
||||
public void Html_invk_src_(GfoEvObj invk) {lnr_location.Host_set(invk); lnr_status.Host_set(invk);}
|
||||
public void Html_dispose() {
|
||||
@ -136,18 +112,12 @@ class Swt_html implements Gxw_html, Swt_control, FocusListener {
|
||||
}
|
||||
private GfuiElem delete_owner, delete_cur;
|
||||
public void Delete_elems_(GfuiElem delete_owner, GfuiElem delete_cur) {this.delete_owner = delete_owner; this.delete_cur = delete_cur;} // HACK: set owner / cur so delete can work;
|
||||
private String Escape_quotes(String v) {return String_.Replace(String_.Replace(v, "'", "\\'"), "\"", "\\\"");}
|
||||
@Override public GxwCore_base Core() {return core;} private GxwCore_base core;
|
||||
@Override public GxwCbkHost Host() {return host;} @Override public void Host_set(GxwCbkHost host) {this.host = host;} GxwCbkHost host;
|
||||
@Override public String TextVal() {return browser.getText();}
|
||||
@Override public void TextVal_set(String v) {browser.setText(v);}
|
||||
@Override public void EnableDoubleBuffering() {}
|
||||
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {return GfoInvkAble_.Rv_unhandled;}
|
||||
private boolean Eval_script_as_bool(String script) {
|
||||
Object result_obj = Eval_script(script);
|
||||
return eval_rslt.Result_pass() && Bool_.cast_or_(result_obj, false);
|
||||
}
|
||||
private boolean Eval_script_as_exec(String script) {Eval_script(script); return eval_rslt.Result_pass();}
|
||||
private String Eval_script_as_str(String script) {return (String)Eval_script(script);}
|
||||
public Object Eval_script(String script) {
|
||||
eval_rslt.Clear();
|
||||
|
@ -20,7 +20,7 @@ public class Bry_bldr {
|
||||
public byte[] Val() {return val;} private byte[] val;
|
||||
public Bry_bldr New_256() {return New(256);}
|
||||
public Bry_bldr New(int len) {val = new byte[len]; return this;}
|
||||
public Bry_bldr Set_rng_ws(byte v) {return Set_many(v, Byte_ascii.Space, Byte_ascii.Tab, Byte_ascii.NewLine, Byte_ascii.CarriageReturn);}
|
||||
public Bry_bldr Set_rng_ws(byte v) {return Set_many(v, Byte_ascii.Space, Byte_ascii.Tab, Byte_ascii.Nl, Byte_ascii.Cr);}
|
||||
public Bry_bldr Set_rng_xml_identifier(byte v) {return Set_rng_alpha_lc(v).Set_rng_alpha_uc(v).Set_rng_num(v).Set_many(v, Byte_ascii.Underline, Byte_ascii.Dash);}
|
||||
public Bry_bldr Set_rng_alpha(byte v) {return Set_rng_alpha_lc(v).Set_rng_alpha_uc(v);}
|
||||
public Bry_bldr Set_rng_alpha_lc(byte v) {return Set_rng(v, Byte_ascii.Ltr_a, Byte_ascii.Ltr_z);}
|
||||
|
@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.core.flds; import gplx.*; import gplx.core.*;
|
||||
public class Gfo_fld_base {
|
||||
public byte Row_dlm() {return row_dlm;} public Gfo_fld_base Row_dlm_(byte v) {row_dlm = v; return this;} protected byte row_dlm = Byte_ascii.NewLine;
|
||||
public byte Row_dlm() {return row_dlm;} public Gfo_fld_base Row_dlm_(byte v) {row_dlm = v; return this;} protected byte row_dlm = Byte_ascii.Nl;
|
||||
public byte Fld_dlm() {return fld_dlm;} public Gfo_fld_base Fld_dlm_(byte v) {fld_dlm = v; return this;} protected byte fld_dlm = Byte_ascii.Pipe;
|
||||
public byte Escape_dlm() {return escape_dlm;} public Gfo_fld_base Escape_dlm_(byte v) {escape_dlm = v; return this;} protected byte escape_dlm = Byte_ascii.Tilde;
|
||||
public byte Quote_dlm() {return quote_dlm;} public Gfo_fld_base Quote_dlm_(byte v) {quote_dlm = v; return this;} protected byte quote_dlm = Byte_ascii.Nil;
|
||||
@ -32,12 +32,12 @@ public class Gfo_fld_base {
|
||||
return this;
|
||||
}
|
||||
Gfo_fld_base Ini_common() {
|
||||
return Escape_reg(Byte_ascii.NewLine, Byte_ascii.Ltr_n).Escape_reg(Byte_ascii.Tab, Byte_ascii.Ltr_t).Escape_reg(Byte_ascii.CarriageReturn, Byte_ascii.Ltr_r)
|
||||
return Escape_reg(Byte_ascii.Nl, Byte_ascii.Ltr_n).Escape_reg(Byte_ascii.Tab, Byte_ascii.Ltr_t).Escape_reg(Byte_ascii.Cr, Byte_ascii.Ltr_r)
|
||||
.Escape_reg(Byte_ascii.Backfeed, Byte_ascii.Ltr_b); // .Escape_reg(Byte_ascii.Nil, Byte_ascii.Num_0)
|
||||
}
|
||||
protected Gfo_fld_base Ctor_xdat_base() {
|
||||
return Escape_clear().Ini_common()
|
||||
.Fld_dlm_(Byte_ascii.Pipe).Row_dlm_(Byte_ascii.NewLine).Escape_dlm_(Byte_ascii.Tilde).Quote_dlm_(Byte_ascii.Nil)
|
||||
.Fld_dlm_(Byte_ascii.Pipe).Row_dlm_(Byte_ascii.Nl).Escape_dlm_(Byte_ascii.Tilde).Quote_dlm_(Byte_ascii.Nil)
|
||||
.Escape_reg(Byte_ascii.Pipe, Byte_ascii.Ltr_p).Escape_reg(Byte_ascii.Tilde);
|
||||
}
|
||||
protected Gfo_fld_base Ctor_sql_base() {
|
||||
|
@ -31,7 +31,7 @@ public class Gfo_pattern_itm_ {
|
||||
case Byte_ascii.Nil:
|
||||
if (itm != null) {itm.Compile(raw, itm_bgn, pos); itm = null; itm_bgn = -1;}
|
||||
break;
|
||||
case Byte_ascii.Asterisk:
|
||||
case Byte_ascii.Star:
|
||||
if (itm != null) {itm.Compile(raw, itm_bgn, pos); itm = null; itm_bgn = -1;}
|
||||
rv.Add(Gfo_pattern_itm_wild._);
|
||||
break;
|
||||
|
@ -32,7 +32,7 @@ public class Db_attach_rdr {
|
||||
}
|
||||
public Db_rdr Exec_as_rdr(String sql) {
|
||||
sql = String_.Replace(sql, "<attach_db>", diff_db ? attach_name + "." : ""); // replace <attach> with either "attach_db." or "";
|
||||
return conn.Exec_sql_as_rdr2(sql);
|
||||
return conn.Exec_sql_as_rdr_v2(sql);
|
||||
}
|
||||
public void Detach() {
|
||||
if (diff_db) conn.Env_db_detach(attach_name);
|
||||
|
@ -37,7 +37,7 @@ public class Db_cfg_tbl implements RlsAble {
|
||||
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds, Db_meta_idx.new_unique_by_tbl(tbl_name, "main", fld_grp, fld_key, fld_val)));}
|
||||
public void Delete_val(String grp, String key) {conn.Stmt_delete(tbl_name, fld_grp, fld_key).Crt_str(fld_grp, grp).Crt_str(fld_key, key).Exec_delete();}
|
||||
public void Delete_grp(String grp) {conn.Stmt_delete(tbl_name, fld_grp).Crt_str(fld_grp, grp).Exec_delete();}
|
||||
public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empy).Exec_delete();}
|
||||
public void Delete_all() {conn.Stmt_delete(tbl_name, Db_meta_fld.Ary_empty).Exec_delete();}
|
||||
public void Insert_yn (String grp, String key, boolean val) {Insert_str(grp, key, val ? "y" : "n");}
|
||||
public void Insert_byte (String grp, String key, byte val) {Insert_str(grp, key, Byte_.Xto_str(val));}
|
||||
public void Insert_int (String grp, String key, int val) {Insert_str(grp, key, Int_.Xto_str(val));}
|
||||
|
@ -23,10 +23,11 @@ public class Fsdb_db_mgr_ {
|
||||
Io_url url = file_dir.GenSubFil(Fsdb_db_mgr__v1.Mnt_name); // EX: /xowa/file/en.wikipedia.org/wiki.mnt.sqlite3
|
||||
if (Db_conn_bldr.I.Exists(url)) { // NOTE: check v1 before v2; note that as of v2.5.4, v2 files are automatically created on new import; DATE:2015-06-09
|
||||
usr_dlg.Log_many("", "", "fsdb.db_core.v1: url=~{0}", url.Raw());
|
||||
usr_dlg.Log_many("", "", "fsdb.db_core.v1 exists: orig=~{0} abc=~{1} atr=~{2}"
|
||||
usr_dlg.Log_many("", "", "fsdb.db_core.v1 exists: orig=~{0} abc=~{1} atr_a=~{2}, atr_b=~{3}"
|
||||
, Db_conn_bldr.I.Exists(file_dir.GenSubFil(Fsdb_db_mgr__v1.Orig_name))
|
||||
, Db_conn_bldr.I.Exists(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Fsdb_db_mgr__v1.Abc_name))
|
||||
, Db_conn_bldr.I.Exists(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Fsdb_db_mgr__v1.Atr_name))
|
||||
, Db_conn_bldr.I.Exists(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Fsdb_db_mgr__v1.Atr_name_v1a))
|
||||
, Db_conn_bldr.I.Exists(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Fsdb_db_mgr__v1.Atr_name_v1b))
|
||||
);
|
||||
return new Fsdb_db_mgr__v1(file_dir);
|
||||
}
|
||||
|
@ -21,16 +21,17 @@ public class Fsdb_db_mgr__v1 implements Fsdb_db_mgr {
|
||||
private final Io_url file_dir;
|
||||
private final Fsdb_db_file orig_file, mnt_file, abc_file__main, abc_file__user, atr_file__main, atr_file__user;
|
||||
private final Xof_orig_tbl[] orig_tbl_ary;
|
||||
private String bin_prefix__main = "fsdb.bin.", bin_prefix__user = "fsdb.bin.";
|
||||
public Fsdb_db_mgr__v1(Io_url file_dir) {
|
||||
this.file_dir = file_dir;
|
||||
this.orig_file = get_db(file_dir.GenSubFil(Orig_name)); // EX: /xowa/enwiki/wiki.orig#00.sqlite3
|
||||
this.mnt_file = get_db(file_dir.GenSubFil(Mnt_name)); // EX: /xowa/enwiki/wiki.mnt.sqlite3
|
||||
this.abc_file__main = get_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Abc_name)); // EX: /xowa/enwiki/fsdb.main/fsdb.abc.sqlite3
|
||||
this.atr_file__main = get_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Atr_name)); // EX: /xowa/enwiki/fsdb.main/fsdb.atr.00.sqlite3
|
||||
if (Db_conn_bldr.I.Get(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_user, Abc_name)) == null) // user doesn't exist; create; DATE:2015-04-20
|
||||
this.orig_file = get_db(file_dir.GenSubFil(Orig_name)); // EX: /xowa/enwiki/wiki.orig#00.sqlite3
|
||||
this.mnt_file = get_db(file_dir.GenSubFil(Mnt_name)); // EX: /xowa/enwiki/wiki.mnt.sqlite3
|
||||
this.abc_file__main = get_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_main, Abc_name)); // EX: /xowa/enwiki/fsdb.main/fsdb.abc.sqlite3
|
||||
this.atr_file__main = get_db(Get_atr_db_url(Bool_.Y, file_dir, Fsm_mnt_tbl.Mnt_name_main)); // EX: /xowa/enwiki/fsdb.main/fsdb.atr.00.sqlite3
|
||||
if (Db_conn_bldr.I.Get(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_user, Abc_name)) == null) // user doesn't exist; create; DATE:2015-04-20
|
||||
Fsdb_db_mgr__v1_bldr.I.Make_core_dir(file_dir, Fsm_mnt_mgr.Mnt_idx_user, Fsm_mnt_tbl.Mnt_name_user);
|
||||
this.abc_file__user = get_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_user, Abc_name)); // EX: /xowa/enwiki/fsdb.user/fsdb.abc.sqlite3
|
||||
this.atr_file__user = get_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_user, Atr_name)); // EX: /xowa/enwiki/fsdb.user/fsdb.atr.00.sqlite3
|
||||
this.abc_file__user = get_db(file_dir.GenSubFil_nest(Fsm_mnt_tbl.Mnt_name_user, Abc_name)); // EX: /xowa/enwiki/fsdb.user/fsdb.abc.sqlite3
|
||||
this.atr_file__user = get_db(Get_atr_db_url(Bool_.N, file_dir, Fsm_mnt_tbl.Mnt_name_user)); // EX: /xowa/enwiki/fsdb.user/fsdb.atr.00.sqlite3
|
||||
this.orig_tbl_ary = new Xof_orig_tbl[] {new Xof_orig_tbl(orig_file.Conn(), this.File__schema_is_1())};
|
||||
}
|
||||
public boolean File__schema_is_1() {return Bool_.Y;}
|
||||
@ -41,8 +42,9 @@ public class Fsdb_db_mgr__v1 implements Fsdb_db_mgr {
|
||||
public Fsdb_db_file File__abc_file__at(int mnt_id) {return mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? abc_file__main : abc_file__user;}
|
||||
public Fsdb_db_file File__atr_file__at(int mnt_id) {return mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? atr_file__main : atr_file__user;}
|
||||
public Fsdb_db_file File__bin_file__at(int mnt_id, int bin_id, String file_name) {
|
||||
String bin_name = "fsdb.bin." + Int_.Xto_str_pad_bgn_zero(bin_id, 4) + ".sqlite3";
|
||||
String mnt_name = mnt_id == Fsm_mnt_mgr.Mnt_idx_main ? Fsm_mnt_tbl.Mnt_name_main : Fsm_mnt_tbl.Mnt_name_user;
|
||||
boolean mnt_is_main = mnt_id == Fsm_mnt_mgr.Mnt_idx_main;
|
||||
String bin_name = (mnt_is_main ? bin_prefix__main : bin_prefix__user) + Int_.Xto_str_pad_bgn_zero(bin_id, 4) + ".sqlite3";
|
||||
String mnt_name = mnt_is_main ? Fsm_mnt_tbl.Mnt_name_main : Fsm_mnt_tbl.Mnt_name_user;
|
||||
Io_url url = file_dir.GenSubFil_nest(mnt_name, bin_name); // EX: /xowa/enwiki/fsdb.main/fsdb.bin.0000.sqlite3
|
||||
return new Fsdb_db_file(url, Db_conn_bldr.I.Get(url));
|
||||
}
|
||||
@ -53,7 +55,21 @@ public class Fsdb_db_mgr__v1 implements Fsdb_db_mgr {
|
||||
Fsd_bin_tbl bin_tbl = new Fsd_bin_tbl(conn, Bool_.Y); bin_tbl.Create_tbl();
|
||||
return new Fsdb_db_file(url, conn);
|
||||
}
|
||||
public static final String Orig_name = "wiki.orig#00.sqlite3", Mnt_name = "wiki.mnt.sqlite3", Abc_name = "fsdb.abc.sqlite3", Atr_name= "fsdb.atr.00.sqlite3";
|
||||
private Io_url Get_atr_db_url(boolean main, Io_url file_dir, String mnt_name) {
|
||||
Io_url rv = null;
|
||||
rv = file_dir.GenSubFil_nest(mnt_name, Atr_name_v1a);
|
||||
if (Io_mgr.I.ExistsFil(rv)) {
|
||||
if (main)
|
||||
bin_prefix__main = "fsdb.bin#";
|
||||
else
|
||||
bin_prefix__user = "fsdb.bin#";
|
||||
return rv;
|
||||
}
|
||||
rv = file_dir.GenSubFil_nest(mnt_name, Atr_name_v1b); if (Io_mgr.I.ExistsFil(rv)) return rv;
|
||||
throw Err_.new_("could not find atr file: dir={0} mnt={1}", file_dir.Raw(), mnt_name);
|
||||
}
|
||||
public static final String Orig_name = "wiki.orig#00.sqlite3", Mnt_name = "wiki.mnt.sqlite3", Abc_name = "fsdb.abc.sqlite3"
|
||||
, Atr_name_v1a = "fsdb.atr#00.sqlite3", Atr_name_v1b = "fsdb.atr.00.sqlite3";
|
||||
private static Fsdb_db_file get_db(Io_url file) {
|
||||
Db_conn conn = Db_conn_bldr.I.Get(file);
|
||||
if (conn == null) conn = Db_conn_.Noop;
|
||||
@ -73,7 +89,7 @@ class Fsdb_db_mgr__v1_bldr {
|
||||
Fsm_bin_tbl dbb_tbl = new Fsm_bin_tbl(db_abc.Conn(), schema_is_1, mnt_id); dbb_tbl.Create_tbl();
|
||||
dbb_tbl.Insert(0, "fsdb.bin.0000.sqlite3");
|
||||
// make atr_fil
|
||||
Fsdb_db_file db_atr = new_db(mnt_dir.GenSubFil(Fsdb_db_mgr__v1.Atr_name));
|
||||
Fsdb_db_file db_atr = new_db(mnt_dir.GenSubFil(Fsdb_db_mgr__v1.Atr_name_v1b)); // create atr database in v1b style; "fsdb.atr.00.sqlite3" not "fsdb.atr#00.sqlite3"
|
||||
Fsd_dir_tbl dir_tbl = new Fsd_dir_tbl(db_atr.Conn(), schema_is_1); dir_tbl.Create_tbl();
|
||||
Fsd_fil_tbl fil_tbl = new Fsd_fil_tbl(db_atr.Conn(), schema_is_1, mnt_id); fil_tbl.Create_tbl();
|
||||
Fsd_thm_tbl thm_tbl = new Fsd_thm_tbl(db_atr.Conn(), schema_is_1, mnt_id, Bool_.Y); thm_tbl.Create_tbl();
|
||||
|
@ -16,12 +16,14 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.fsdb.data; import gplx.*; import gplx.fsdb.*;
|
||||
import gplx.core.primitives.*;
|
||||
import gplx.dbs.*; import gplx.ios.*;
|
||||
import gplx.dbs.engines.sqlite.*;
|
||||
public class Fsd_bin_tbl implements RlsAble {
|
||||
private final String tbl_name = "fsdb_bin"; private final Db_meta_fld_list flds = Db_meta_fld_list.new_();
|
||||
private final String fld_owner_id, fld_owner_tid, fld_part_id, fld_data_url, fld_data;
|
||||
private Db_conn conn; private Db_stmt stmt_insert, stmt_select; private final Bry_bfr tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_kb);
|
||||
private final String fld_owner_id, fld_owner_tid, fld_part_id, fld_data_url, fld_data;
|
||||
private Db_conn conn; private Db_stmt stmt_insert, stmt_select; private Bry_bfr tmp_bfr;
|
||||
private final Bool_obj_ref saved_in_parts = Bool_obj_ref.n_();
|
||||
public Fsd_bin_tbl(Db_conn conn, boolean schema_is_1) {
|
||||
this.conn = conn;
|
||||
fld_owner_id = flds.Add_int_pkey ("bin_owner_id");
|
||||
@ -40,9 +42,12 @@ public class Fsd_bin_tbl implements RlsAble {
|
||||
public void Insert_commit() {conn.Txn_sav();}
|
||||
public void Insert_end() {conn.Txn_end(); stmt_insert = Db_stmt_.Rls(stmt_insert);}
|
||||
public void Insert_rdr(int id, byte tid, long bin_len, Io_stream_rdr bin_rdr) {
|
||||
if (stmt_insert == null) stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
if (stmt_insert == null) {
|
||||
stmt_insert = conn.Stmt_insert(tbl_name, flds);
|
||||
tmp_bfr = Bry_bfr.reset_(Io_mgr.Len_kb);
|
||||
}
|
||||
byte[] bin_ary = null;
|
||||
synchronized (tmp_bfr) {bin_ary = Io_stream_rdr_.Load_all_as_bry(tmp_bfr, bin_rdr);}
|
||||
bin_ary = Io_stream_rdr_.Load_all_as_bry(tmp_bfr, bin_rdr);
|
||||
stmt_insert.Clear()
|
||||
.Val_int(fld_owner_id, id)
|
||||
.Val_byte(fld_owner_tid, tid)
|
||||
@ -52,18 +57,20 @@ public class Fsd_bin_tbl implements RlsAble {
|
||||
.Exec_insert();
|
||||
}
|
||||
public Io_stream_rdr Select_as_rdr(int owner_id) {
|
||||
byte[] rv = Select(owner_id);
|
||||
byte[] rv = Select(owner_id, null);
|
||||
return rv == null
|
||||
? Io_stream_rdr_.Noop
|
||||
: Io_stream_rdr_.mem_(rv);
|
||||
}
|
||||
public boolean Select_to_url(int owner_id, Io_url url) {
|
||||
byte[] rv = Select(owner_id);
|
||||
saved_in_parts.Val_n();
|
||||
byte[] rv = Select(owner_id, url);
|
||||
if (rv == null) return false;
|
||||
if (saved_in_parts.Val_y()) return true;
|
||||
Io_mgr.I.SaveFilBry(url, rv);
|
||||
return true;
|
||||
}
|
||||
private byte[] Select(int owner_id) {
|
||||
private byte[] Select(int owner_id, Io_url url) {
|
||||
if (stmt_select == null) stmt_select = conn.Stmt_select(tbl_name, String_.Ary(fld_data), fld_owner_id);
|
||||
Db_rdr rdr = stmt_select.Clear().Crt_int(fld_owner_id, owner_id).Exec_select__rls_manual();
|
||||
try {
|
||||
@ -71,8 +78,12 @@ public class Fsd_bin_tbl implements RlsAble {
|
||||
byte[] rv = null;
|
||||
try {rv = rdr.Read_bry(fld_data);}
|
||||
catch (Exception e) {
|
||||
if (Op_sys.Cur().Tid_is_drd() && String_.Has(Err_.Message_lang(e), "get field slot from row")) { // get field slot from row 0 col 0 failed
|
||||
rv = rdr.Read_bry_in_parts(tbl_name, fld_data, fld_owner_id, owner_id);
|
||||
if ( Op_sys.Cur().Tid_is_drd()
|
||||
&& url != null // called by Select_to_url
|
||||
&& String_.Has(Err_.Message_lang(e), "get field slot from row") // get field slot from row 0 col 0 failed
|
||||
) {
|
||||
rdr.Save_bry_in_parts(url, tbl_name, fld_data, fld_owner_id, owner_id);
|
||||
saved_in_parts.Val_y_();
|
||||
}
|
||||
}
|
||||
return rv == null ? Bry_.Empty : rv; // NOTE: bug in v0.10.1 where .ogg would save as null; return Bry_.Empty instead, else java.io.ByteArrayInputStream would fail on null
|
||||
|
@ -89,7 +89,7 @@ public class Fsd_fil_tbl implements RlsAble {
|
||||
finally {rdr.Rls();}
|
||||
}
|
||||
public void Select_all(Bry_bfr key_bfr, gplx.cache.Gfo_cache_mgr_bry cache) {
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto();
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
Fsd_fil_itm fil = new_(mnt_id, rdr);
|
||||
|
@ -31,7 +31,7 @@ public class Fsm_atr_tbl {
|
||||
}
|
||||
public void Create_tbl() {conn.Ddl_create_tbl(Db_meta_tbl.new_(tbl_name, flds));}
|
||||
public Fsm_atr_fil Select_1st_or_fail(Fsm_mnt_itm mnt_itm, Fsdb_db_mgr core_mgr, int mnt_id, boolean schema_thm_page) {
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto();
|
||||
boolean schema_is_1 = core_mgr.File__schema_is_1();
|
||||
try {
|
||||
if (rdr.Move_next()) {
|
||||
|
@ -43,7 +43,7 @@ public class Fsm_bin_tbl {
|
||||
}
|
||||
public Fsm_bin_fil[] Select_all(Fsdb_db_mgr db_conn_mgr) {
|
||||
List_adp rv = List_adp_.new_();
|
||||
Db_rdr rdr = conn.Stmt_select_order(tbl_name, flds, Db_meta_fld.Ary_empy, fld_uid).Clear().Exec_select__rls_auto();
|
||||
Db_rdr rdr = conn.Stmt_select_order(tbl_name, flds, Db_meta_fld.Ary_empty, fld_uid).Clear().Exec_select__rls_auto();
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
int bin_id = rdr.Read_int(fld_uid);
|
||||
|
@ -45,7 +45,7 @@ public class Fsm_mnt_tbl implements RlsAble {
|
||||
}
|
||||
public Fsm_mnt_itm[] Select_all() {
|
||||
List_adp list = List_adp_.new_();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Clear().Exec_select__rls_auto();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Clear().Exec_select__rls_auto();
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
Fsm_mnt_itm itm = new Fsm_mnt_itm(rdr.Read_int(fld_id), rdr.Read_str(fld_name), rdr.Read_str(fld_url));
|
||||
|
@ -72,13 +72,13 @@ class Gfs_parser_ {
|
||||
trie_add_rng(rv, word_lxr, Byte_ascii.Ltr_A, Byte_ascii.Ltr_Z);
|
||||
trie_add_rng(rv, word_lxr, Byte_ascii.Num_0, Byte_ascii.Num_9);
|
||||
rv.Add(Byte_ascii.Underline, word_lxr);
|
||||
trie_add_many(rv, Gfs_lxr_whitespace._, Byte_ascii.Space, Byte_ascii.NewLine, Byte_ascii.CarriageReturn, Byte_ascii.Tab);
|
||||
trie_add_many(rv, Gfs_lxr_whitespace._, Byte_ascii.Space, Byte_ascii.Nl, Byte_ascii.Cr, Byte_ascii.Tab);
|
||||
trie_add_quote(rv, new byte[] {Byte_ascii.Apos});
|
||||
trie_add_quote(rv, new byte[] {Byte_ascii.Quote});
|
||||
trie_add_quote(rv, Bry_.new_a7("<:[\"\n"), Bry_.new_a7("\n\"]:>"));
|
||||
trie_add_quote(rv, Bry_.new_a7("<:['\n"), Bry_.new_a7("\n']:>"));
|
||||
trie_add_comment(rv, new byte[] {Byte_ascii.Slash, Byte_ascii.Slash}, new byte[] {Byte_ascii.NewLine});
|
||||
trie_add_comment(rv, new byte[] {Byte_ascii.Slash, Byte_ascii.Asterisk}, new byte[] {Byte_ascii.Asterisk, Byte_ascii.Slash});
|
||||
trie_add_comment(rv, new byte[] {Byte_ascii.Slash, Byte_ascii.Slash}, new byte[] {Byte_ascii.Nl});
|
||||
trie_add_comment(rv, new byte[] {Byte_ascii.Slash, Byte_ascii.Star}, new byte[] {Byte_ascii.Star, Byte_ascii.Slash});
|
||||
rv.Add(Byte_ascii.Semic, Gfs_lxr_semic._);
|
||||
rv.Add(Byte_ascii.Paren_bgn, Gfs_lxr_paren_bgn._);
|
||||
rv.Add(Byte_ascii.Paren_end, Gfs_lxr_paren_end._);
|
||||
|
@ -117,8 +117,8 @@ class Gfs_err_mgr {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Tab: bfr.Add(Esc_tab); break;
|
||||
case Byte_ascii.NewLine: bfr.Add(Esc_nl); break;
|
||||
case Byte_ascii.CarriageReturn: bfr.Add(Esc_cr); break;
|
||||
case Byte_ascii.Nl: bfr.Add(Esc_nl); break;
|
||||
case Byte_ascii.Cr: bfr.Add(Esc_cr); break;
|
||||
default: bfr.Add_byte(b); break;
|
||||
}
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ public class Gfui_bnd_parser {
|
||||
tkns.Clear(); mod_val = Mod_val_null;
|
||||
int pos = 0; int itm_bgn = -1, itm_end = -1; boolean is_numeric = false;
|
||||
while (pos <= src_len) { // loop over bytes and break up tkns by symbols
|
||||
byte b = pos == src_len ? Byte_ascii.NewLine: src[pos]; // treat eos as "\n" for purpose of separating tokens
|
||||
byte b = pos == src_len ? Byte_ascii.Nl: src[pos]; // treat eos as "\n" for purpose of separating tokens
|
||||
Gfui_bnd_tkn sym_tkn = null;
|
||||
switch (b) {
|
||||
case Byte_ascii.Plus: // simultaneous; EX: Ctrl + S
|
||||
@ -60,7 +60,7 @@ public class Gfui_bnd_parser {
|
||||
case Byte_ascii.Comma: // chorded; EX: Ctrl + S, Ctrl + T
|
||||
sym_tkn = Itm_sym_comma;
|
||||
break;
|
||||
case Byte_ascii.NewLine: // eos: process anything in bfr
|
||||
case Byte_ascii.Nl: // eos: process anything in bfr
|
||||
sym_tkn = Itm_sym_eos;
|
||||
break;
|
||||
case Byte_ascii.Space:
|
||||
|
@ -126,7 +126,7 @@ public class Html_parser {
|
||||
private void Skip_ws() {
|
||||
while (pos < end) {
|
||||
switch (src[pos]) {
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
++pos;
|
||||
break;
|
||||
default:
|
||||
|
@ -25,7 +25,7 @@ public interface Json_grp extends Json_itm {
|
||||
class Json_grp_ {
|
||||
public static final Json_grp[] Ary_empty = new Json_grp[0];
|
||||
public static void Print_nl(Bry_bfr bfr) { // \n\n can be caused by nested groups (EX: "[[]]"); only print 1
|
||||
if (bfr.Bfr()[bfr.Len() - 1] != Byte_ascii.NewLine)
|
||||
if (bfr.Bfr()[bfr.Len() - 1] != Byte_ascii.Nl)
|
||||
bfr.Add_byte_nl();
|
||||
}
|
||||
public static void Print_indent(Bry_bfr bfr, int depth) {
|
||||
|
@ -90,8 +90,8 @@ class Json_itm_str extends Json_itm_base {
|
||||
b = src[++i];
|
||||
switch (b) { // NOTE: must properly unescape chars; EX:wd.q:2; DATE:2014-04-23
|
||||
case Byte_ascii.Ltr_t: bfr.Add_byte(Byte_ascii.Tab); break;
|
||||
case Byte_ascii.Ltr_n: bfr.Add_byte(Byte_ascii.NewLine); break;
|
||||
case Byte_ascii.Ltr_r: bfr.Add_byte(Byte_ascii.CarriageReturn); break;
|
||||
case Byte_ascii.Ltr_n: bfr.Add_byte(Byte_ascii.Nl); break;
|
||||
case Byte_ascii.Ltr_r: bfr.Add_byte(Byte_ascii.Cr); break;
|
||||
case Byte_ascii.Ltr_b: bfr.Add_byte(Byte_ascii.Backfeed); break;
|
||||
case Byte_ascii.Ltr_f: bfr.Add_byte(Byte_ascii.Formfeed); break;
|
||||
case Byte_ascii.Ltr_u:
|
||||
|
@ -148,7 +148,7 @@ public class Json_parser {
|
||||
private void Skip_ws() {
|
||||
while (pos < src_len) {
|
||||
switch (src[pos]) {
|
||||
case Byte_ascii.Space: case Byte_ascii.NewLine: case Byte_ascii.Tab: case Byte_ascii.CarriageReturn: ++pos; break;
|
||||
case Byte_ascii.Space: case Byte_ascii.Nl: case Byte_ascii.Tab: case Byte_ascii.Cr: ++pos; break;
|
||||
default: return;
|
||||
}
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ class Php_lxr_declaration extends Php_lxr_base {
|
||||
if (cur == src_len) break;
|
||||
byte b = src[cur];
|
||||
switch (b) {
|
||||
case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
ws_found = true;
|
||||
++cur;
|
||||
break;
|
||||
@ -84,7 +84,7 @@ class Php_lxr_ws extends Php_lxr_base {
|
||||
if (cur == src_len) break;
|
||||
byte b = src[cur];
|
||||
switch (b) {
|
||||
case Byte_ascii.Space: case Byte_ascii.NewLine: case Byte_ascii.Tab: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Nl: case Byte_ascii.Tab: case Byte_ascii.Cr:
|
||||
++cur;
|
||||
break;
|
||||
default:
|
||||
@ -238,11 +238,11 @@ class Php_lxr_keyword extends Php_lxr_base {
|
||||
if (cur < src_len) {
|
||||
byte next_byte = src[cur];
|
||||
switch (next_byte) { // valid characters for end of word; EX: 'null '; 'null='; etc..
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn:
|
||||
case Byte_ascii.Space: case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr:
|
||||
case Byte_ascii.Hash: case Byte_ascii.Slash:
|
||||
case Byte_ascii.Quote: case Byte_ascii.Apos:
|
||||
case Byte_ascii.Bang: case Byte_ascii.Dollar: case Byte_ascii.Percent: case Byte_ascii.Amp:
|
||||
case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Asterisk: case Byte_ascii.Plus:
|
||||
case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Star: case Byte_ascii.Plus:
|
||||
case Byte_ascii.Comma: case Byte_ascii.Dash: case Byte_ascii.Dot: case Byte_ascii.Semic:
|
||||
case Byte_ascii.Lt: case Byte_ascii.Eq: case Byte_ascii.Gt: case Byte_ascii.Question: case Byte_ascii.At:
|
||||
case Byte_ascii.Brack_bgn: case Byte_ascii.Backslash: case Byte_ascii.Brack_end: case Byte_ascii.Pow: case Byte_ascii.Tick:
|
||||
|
@ -67,11 +67,11 @@ public class Php_text_itm_parser {
|
||||
case Byte_ascii.Backslash: next_char = Byte_ascii.Backslash; break;
|
||||
case Byte_ascii.Quote: next_char = Byte_ascii.Quote; break;
|
||||
case Byte_ascii.Ltr_N:
|
||||
case Byte_ascii.Ltr_n: next_char = Byte_ascii.NewLine; break;
|
||||
case Byte_ascii.Ltr_n: next_char = Byte_ascii.Nl; break;
|
||||
case Byte_ascii.Ltr_T:
|
||||
case Byte_ascii.Ltr_t: next_char = Byte_ascii.Tab; break;
|
||||
case Byte_ascii.Ltr_R:
|
||||
case Byte_ascii.Ltr_r: next_char = Byte_ascii.CarriageReturn; break;
|
||||
case Byte_ascii.Ltr_r: next_char = Byte_ascii.Cr; break;
|
||||
case Byte_ascii.Ltr_U:
|
||||
case Byte_ascii.Ltr_u: { // EX: "\u007C"
|
||||
rslt_val = Rslt_dirty;
|
||||
|
@ -25,7 +25,7 @@ public class Dsv_fld_parser_ {
|
||||
}
|
||||
}
|
||||
class Dsv_fld_parser_line implements Dsv_fld_parser {
|
||||
private byte row_dlm = Byte_ascii.NewLine; private final byte comment_dlm;
|
||||
private byte row_dlm = Byte_ascii.Nl; private final byte comment_dlm;
|
||||
public Dsv_fld_parser_line(byte comment_dlm) {this.comment_dlm = comment_dlm;}
|
||||
public void Init(byte fld_dlm, byte row_dlm) {
|
||||
this.row_dlm = row_dlm;
|
||||
@ -53,7 +53,7 @@ class Dsv_fld_parser_line implements Dsv_fld_parser {
|
||||
}
|
||||
}
|
||||
class Dsv_fld_parser_bry implements Dsv_fld_parser {
|
||||
private byte fld_dlm = Byte_ascii.Pipe, row_dlm = Byte_ascii.NewLine;
|
||||
private byte fld_dlm = Byte_ascii.Pipe, row_dlm = Byte_ascii.Nl;
|
||||
public void Init(byte fld_dlm, byte row_dlm) {
|
||||
this.fld_dlm = fld_dlm; this.row_dlm = row_dlm;
|
||||
}
|
||||
@ -83,7 +83,7 @@ class Dsv_fld_parser_bry implements Dsv_fld_parser {
|
||||
public static final Dsv_fld_parser_bry _ = new Dsv_fld_parser_bry(); Dsv_fld_parser_bry() {}
|
||||
}
|
||||
class Dsv_fld_parser_int implements Dsv_fld_parser {
|
||||
private byte fld_dlm = Byte_ascii.Pipe, row_dlm = Byte_ascii.NewLine;
|
||||
private byte fld_dlm = Byte_ascii.Pipe, row_dlm = Byte_ascii.Nl;
|
||||
public void Init(byte fld_dlm, byte row_dlm) {
|
||||
this.fld_dlm = fld_dlm; this.row_dlm = row_dlm;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ public class Dsv_tbl_parser implements GfoInvkAble, RlsAble {
|
||||
public int Row_idx() {return row_idx;} private int row_idx = 0;
|
||||
public boolean Skip_blank_lines() {return skip_blank_lines;} public Dsv_tbl_parser Skip_blank_lines_(boolean v) {skip_blank_lines = v; return this;} private boolean skip_blank_lines = true;
|
||||
public byte Fld_dlm() {return fld_dlm;} public Dsv_tbl_parser Fld_dlm_(byte v) {fld_dlm = v; return this;} private byte fld_dlm = Byte_ascii.Pipe;
|
||||
public byte Row_dlm() {return row_dlm;} public Dsv_tbl_parser Row_dlm_(byte v) {row_dlm = v; return this;} private byte row_dlm = Byte_ascii.NewLine;
|
||||
public byte Row_dlm() {return row_dlm;} public Dsv_tbl_parser Row_dlm_(byte v) {row_dlm = v; return this;} private byte row_dlm = Byte_ascii.Nl;
|
||||
public void Init(Dsv_wkr_base mgr, Dsv_fld_parser... fld_parsers) {
|
||||
this.mgr = mgr;
|
||||
this.fld_parsers = fld_parsers;
|
||||
|
@ -1,70 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.web.js; import gplx.*; import gplx.web.*;
|
||||
public class Js_wtr {
|
||||
private Bry_bfr bfr = Bry_bfr.reset_(255);
|
||||
public byte Quote_char() {return quote_char;} public Js_wtr Quote_char_(byte v) {quote_char = v; return this;} private byte quote_char = Byte_ascii.Quote;
|
||||
public void Clear() {bfr.Clear();}
|
||||
public String Xto_str() {return bfr.Xto_str();}
|
||||
public String Xto_str_and_clear() {return bfr.Xto_str_and_clear();}
|
||||
public Js_wtr Add_comma() {bfr.Add_byte(Byte_ascii.Comma); return this;}
|
||||
public Js_wtr Add_paren_bgn() {bfr.Add_byte(Byte_ascii.Paren_bgn); return this;}
|
||||
public Js_wtr Add_paren_end() {bfr.Add_byte(Byte_ascii.Paren_end); return this;}
|
||||
public Js_wtr Add_brack_bgn() {bfr.Add_byte(Byte_ascii.Brack_bgn); return this;}
|
||||
public Js_wtr Add_brack_end() {bfr.Add_byte(Byte_ascii.Brack_end); return this;}
|
||||
public Js_wtr Add_str(byte[] v) {bfr.Add(v); return this;}
|
||||
public Js_wtr Add_str(String v) {bfr.Add_str(v); return this;}
|
||||
public Js_wtr Add_paren_end_semic() {bfr.Add_byte(Byte_ascii.Paren_end); bfr.Add_byte(Byte_ascii.Semic); return this;}
|
||||
public Js_wtr Add_str_arg(int i, byte[] bry){
|
||||
if (i != 0) bfr.Add_byte(Byte_ascii.Comma);
|
||||
Add_str_quote(bry);
|
||||
return this;
|
||||
}
|
||||
public Js_wtr Add_str_quote(byte[] bry) {
|
||||
bfr.Add_byte(quote_char);
|
||||
int len = bry.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte b = bry[i];
|
||||
if (b == quote_char) bfr.Add_byte(Byte_ascii.Backslash);
|
||||
bfr.Add_byte(b);
|
||||
}
|
||||
bfr.Add_byte(quote_char);
|
||||
return this;
|
||||
}
|
||||
public Js_wtr Add_str_quote_html(byte[] bry) {
|
||||
bfr.Add_byte(quote_char);
|
||||
int len = bry.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte b = bry[i];
|
||||
if (b == quote_char) { // double up quotes
|
||||
bfr.Add_byte(Byte_ascii.Backslash);
|
||||
bfr.Add_byte(b);
|
||||
}
|
||||
else {
|
||||
switch (b) {
|
||||
case Byte_ascii.Backslash: bfr.Add_byte_repeat(Byte_ascii.Backslash, 2); break; // "\" -> "\\"; needed else js will usurp \ as escape; EX: "\&" -> "&"; DATE:2014-06-24
|
||||
case Byte_ascii.NewLine: bfr.Add_byte(Byte_ascii.Backslash).Add_byte(Byte_ascii.Ltr_n); break; // "\n" -> "\\n"
|
||||
case Byte_ascii.CarriageReturn: break;// skip
|
||||
default: bfr.Add_byte(b); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
bfr.Add_byte(quote_char);
|
||||
return this;
|
||||
}
|
||||
}
|
@ -26,7 +26,7 @@ public class Xoa_app_ {
|
||||
boot_mgr.Run(args);
|
||||
}
|
||||
public static final String Name = "xowa";
|
||||
public static final String Version = "2.6.4.1";
|
||||
public static final String Version = "2.6.5.1";
|
||||
public static String Build_date = "2012-12-30 00:00:00";
|
||||
public static String Op_sys;
|
||||
public static String User_agent = "";
|
||||
|
@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.xowa; import gplx.*;
|
||||
public class Xoa_consts {
|
||||
public static final byte[]
|
||||
Nl_bry = new byte[] {Byte_ascii.NewLine}
|
||||
Nl_bry = new byte[] {Byte_ascii.Nl}
|
||||
, Slash_bry = new byte[] {Byte_ascii.Slash}
|
||||
, Pipe_bry = new byte[] {Byte_ascii.Pipe}
|
||||
, Invk_bgn = new byte[] {Byte_ascii.Curly_bgn, Byte_ascii.Curly_bgn} // "{{"
|
||||
|
@ -71,11 +71,11 @@ class Xog_find_box {
|
||||
}
|
||||
private void Exec_find(String find, boolean highlight_matches) {
|
||||
Xog_tab_itm tab = win.Tab_mgr().Active_tab(); if (tab == Xog_tab_itm_.Null) return;
|
||||
String elem_id = tab.View_mode() == Xopg_view_mode.Tid_read
|
||||
? Gfui_html.Elem_id_body
|
||||
: Xog_html_itm.Elem_id__xowa_edit_data_box
|
||||
;
|
||||
tab.Html_box().Html_doc_find(elem_id, find, dir_fwd, case_match, wrap_search, highlight_matches);
|
||||
boolean find_in_hdoc = tab.View_mode() == Xopg_view_mode.Tid_read;
|
||||
if (find_in_hdoc)
|
||||
tab.Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__find_in_hdoc , find, dir_fwd, case_match, wrap_search, highlight_matches);
|
||||
else
|
||||
tab.Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__find_in_textarea , find, dir_fwd, case_match, wrap_search);
|
||||
win.Usr_dlg().Prog_direct("");
|
||||
}
|
||||
public void Case_toggle() {
|
||||
|
@ -30,12 +30,12 @@ public class Xoapi_html_box implements GfoInvkAble, GfoEvMgrOwner {
|
||||
Gfui_html html_box = tab.Html_itm().Html_box();
|
||||
html_box.Focus();
|
||||
if (tab.View_mode() != Xopg_view_mode.Tid_read) // if edit / html, place focus in edit box
|
||||
html_box.Html_elem_focus(Xog_html_itm.Elem_id__xowa_edit_data_box);
|
||||
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__elem_focus, Xog_html_itm.Elem_id__xowa_edit_data_box);
|
||||
}
|
||||
public void Selection_focus() {
|
||||
Xog_tab_itm tab = win.Active_tab(); if (tab == Xog_tab_itm_.Null) return;
|
||||
Gfui_html html_box = tab.Html_itm().Html_box();
|
||||
html_box.Html_doc_selection_focus_toggle();
|
||||
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__toggle_focus_for_anchor);
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_focus)) this.Focus();
|
||||
|
@ -31,7 +31,7 @@ public class Xoapi_view implements GfoInvkAble {
|
||||
public void Refresh() {if (Active_tab_is_null()) return; win.Page__refresh();}
|
||||
public void Print() {
|
||||
if (this.Active_tab_is_null()) return;
|
||||
win.Active_html_box().Html_window_print_preview();
|
||||
win.Active_html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__print_preview);
|
||||
}
|
||||
public void Save_as() {
|
||||
if (this.Active_tab_is_null()) return;
|
||||
|
@ -41,6 +41,7 @@ public class Xob_cmd_keys {
|
||||
, Key_file_xfer_regy = "file.xfer_regy"
|
||||
, Key_file_xfer_regy_update = "file.xfer_regy_update"
|
||||
, Key_file_fsdb_make = "file.fsdb_make"
|
||||
, Key_file_fsdb_reduce = "file.fsdb_reduce"
|
||||
, Key_file_orig_reg = "file.orig_reg"
|
||||
, Key_file_xfer_update = "file.xfer_update"
|
||||
, Key_html_redlinks = "html.redlinks"
|
||||
|
@ -46,7 +46,7 @@ public class Xob_ns_file_itm_parser extends Dsv_wkr_base {
|
||||
return;
|
||||
}
|
||||
int[] ns_ids = null;
|
||||
if (ns_ids_bry.length == 1 && ns_ids_bry[0] == Byte_ascii.Asterisk) { // "*"
|
||||
if (ns_ids_bry.length == 1 && ns_ids_bry[0] == Byte_ascii.Star) { // "*"
|
||||
int len = ns_mgr.Ords_len();
|
||||
ns_ids = new int[len];
|
||||
for (int i = 0; i < len; ++i)
|
||||
|
@ -36,7 +36,7 @@ public abstract class Xob_categorylinks_base extends Xob_sql_dump_base implement
|
||||
? 0 : Bit_.Xto_int_date_short(cur_modified_on);
|
||||
}
|
||||
else if (Bry_.Eq(fld_key, Fld_cl_sortkey)) {
|
||||
int nl_pos = Bry_finder.Find_fwd(src, Byte_ascii.NewLine, fld_bgn, fld_end);
|
||||
int nl_pos = Bry_finder.Find_fwd(src, Byte_ascii.Nl, fld_bgn, fld_end);
|
||||
if (nl_pos != Bry_.NotFound) // sortkey sometimes has format of "sortkey\ntitle"; EX: "WALES, JIMMY\nJIMMY WALES"; discard 2nd to conserve hard-disk space
|
||||
fld_end = nl_pos;
|
||||
cur_sortkey = Bry_.Mid(src, fld_bgn, fld_end);
|
||||
|
@ -108,7 +108,7 @@ class Xoctg_make_link_mgr {
|
||||
}
|
||||
public void Write_bgn() {
|
||||
make_cmd.Sort_bgn();
|
||||
make_cmd.Line_dlm_(Byte_ascii.NewLine);
|
||||
make_cmd.Line_dlm_(Byte_ascii.Nl);
|
||||
}
|
||||
public void Flush() {
|
||||
make_cmd.Sort_end();
|
||||
@ -177,7 +177,7 @@ class Xoctg_make_main_mgr {
|
||||
}
|
||||
public void Write_bgn() {
|
||||
make_cmd.Sort_bgn();
|
||||
make_cmd.Line_dlm_(Byte_ascii.NewLine);
|
||||
make_cmd.Line_dlm_(Byte_ascii.Nl);
|
||||
}
|
||||
public void Flush() {
|
||||
make_cmd.Sort_end();
|
||||
|
@ -0,0 +1,62 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
|
||||
import gplx.dbs.*; import gplx.dbs.engines.sqlite.*; import gplx.fsdb.meta.*;
|
||||
public class Xob_fsdb_reduce_cmd extends Xob_itm_basic_base implements Xob_cmd {
|
||||
public Xob_fsdb_reduce_cmd(Xob_bldr bldr, Xowe_wiki wiki) {this.Cmd_ctor(bldr, wiki);}
|
||||
public String Cmd_key() {return Xob_cmd_keys.Key_file_fsdb_reduce;}
|
||||
public void Cmd_init(Xob_bldr bldr) {}
|
||||
public void Cmd_bgn(Xob_bldr bldr) {}
|
||||
public void Cmd_run() {Exec_main();}
|
||||
public void Cmd_end() {}
|
||||
public void Cmd_term() {}
|
||||
private void Exec_main() {
|
||||
/*
|
||||
Open_bin_dir
|
||||
Iterate_files
|
||||
Convert_bin
|
||||
Mark_meta_record
|
||||
*/
|
||||
}
|
||||
@Override public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
class Fsdb_reduce_wkr {
|
||||
private final ProcessAdp convert_process;
|
||||
private final Io_url src_url, trg_url;
|
||||
private final int dpi, quality;
|
||||
public Fsdb_reduce_wkr(ProcessAdp convert_process, Io_url tmp_dir, int dpi, int quality) {
|
||||
this.convert_process = convert_process;
|
||||
this.src_url = tmp_dir.GenSubFil("fsdb_reduce.src.bin");
|
||||
this.trg_url = tmp_dir.GenSubFil("fsdb_reduce.trg.bin");
|
||||
this.dpi = dpi;
|
||||
this.quality = quality;
|
||||
}
|
||||
public byte[] Reduce(byte[] orig_bry) {
|
||||
Io_mgr.I.SaveFilBry(src_url, orig_bry);
|
||||
convert_process.Run(src_url, trg_url, dpi, quality); // -strip -quality 50% -density 72 -resample 72
|
||||
if (!convert_process.Exit_code_pass()) {
|
||||
// throw err with convert_process.Rslt_out();
|
||||
}
|
||||
byte[] rv = Io_mgr.I.LoadFilBry(trg_url);
|
||||
// fail if 0; fail if greater than;
|
||||
// warn if not between 50% - 70% of size
|
||||
return rv;
|
||||
}
|
||||
}
|
@ -49,7 +49,7 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_
|
||||
byte[] word = words[i];
|
||||
wtr.Bfr() .Add(word) .Add_byte(Byte_ascii.Pipe)
|
||||
.Add_base85_len_5(page.Id()) .Add_byte(Byte_ascii.Semic)
|
||||
.Add_base85_len_5(page.Text().length) .Add_byte(Byte_ascii.NewLine);
|
||||
.Add_base85_len_5(page.Text().length) .Add_byte(Byte_ascii.Nl);
|
||||
}
|
||||
} catch (Exception e) {bldr.Usr_dlg().Warn_many("", "", "search_index:fatal error: err=~{0}", Err_.Message_gplx_brief(e));} // never let single page crash entire import
|
||||
}
|
||||
@ -81,12 +81,12 @@ public abstract class Xob_search_base extends Xob_itm_dump_base implements Xobd_
|
||||
switch (b) {
|
||||
case Byte_ascii.Underline: // underline is word-breaking; EX: A_B -> A, B
|
||||
case Byte_ascii.Space: // should not occur, but just in case (only underscores)
|
||||
case Byte_ascii.Tab: case Byte_ascii.NewLine: case Byte_ascii.CarriageReturn: // should not occur in titles, but just in case
|
||||
case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: // should not occur in titles, but just in case
|
||||
|
||||
case Byte_ascii.Dash: // treat hypenated words separately
|
||||
case Byte_ascii.Dot: // treat abbreviations as separate words; EX: A.B.C.
|
||||
case Byte_ascii.Bang: case Byte_ascii.Hash: case Byte_ascii.Dollar: case Byte_ascii.Percent:
|
||||
case Byte_ascii.Amp: case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Asterisk:
|
||||
case Byte_ascii.Amp: case Byte_ascii.Paren_bgn: case Byte_ascii.Paren_end: case Byte_ascii.Star:
|
||||
case Byte_ascii.Comma: case Byte_ascii.Slash:
|
||||
case Byte_ascii.Colon: case Byte_ascii.Semic: case Byte_ascii.Gt:
|
||||
case Byte_ascii.Question: case Byte_ascii.At: case Byte_ascii.Brack_bgn: case Byte_ascii.Brack_end:
|
||||
|
@ -42,7 +42,7 @@ public class Xob_page_txt extends Xob_itm_dump_base implements Xobd_wkr, GfoInvk
|
||||
Xob_xdat_file_wtr page_wtr = Page_wtr_get(ns);
|
||||
if (page_wtr.FlushNeeded(Xotdb_page_itm_.Txt_page_len__fixed + ttl_len + text_len)) page_wtr.Flush(bldr.Usr_dlg());
|
||||
Xotdb_page_itm_.Txt_page_save(page_wtr.Bfr(), id, page.Modified_on(), ttl_wo_ns, text, false);
|
||||
page_wtr.Add_idx(Byte_ascii.NewLine);
|
||||
page_wtr.Add_idx(Byte_ascii.Nl);
|
||||
|
||||
// idx: EX: 00100|aB64|Ttl;
|
||||
Xob_tmp_wtr ttl_wtr = ttl_wtr_mgr.Get_or_new(ns);
|
||||
|
@ -168,7 +168,7 @@ public class Xoa_css_img_downloader {
|
||||
byte b = raw_bry[i];
|
||||
switch (b) {
|
||||
//case Byte_ascii.Slash:
|
||||
case Byte_ascii.Backslash: case Byte_ascii.Colon: case Byte_ascii.Asterisk: case Byte_ascii.Question:
|
||||
case Byte_ascii.Backslash: case Byte_ascii.Colon: case Byte_ascii.Star: case Byte_ascii.Question:
|
||||
case Byte_ascii.Quote: case Byte_ascii.Lt: case Byte_ascii.Gt: case Byte_ascii.Pipe:
|
||||
raw_bry[i] = Byte_ascii.Underline;
|
||||
break;
|
||||
|
@ -84,7 +84,7 @@ class Xob_css_tkn__url extends Xob_css_tkn__base {
|
||||
case Byte_ascii.Slash:
|
||||
case Byte_ascii.Backslash:
|
||||
break;
|
||||
case Byte_ascii.Lt: case Byte_ascii.Gt: case Byte_ascii.Colon: case Byte_ascii.Pipe: case Byte_ascii.Question: case Byte_ascii.Asterisk: case Byte_ascii.Quote:
|
||||
case Byte_ascii.Lt: case Byte_ascii.Gt: case Byte_ascii.Colon: case Byte_ascii.Pipe: case Byte_ascii.Question: case Byte_ascii.Star: case Byte_ascii.Quote:
|
||||
src[i] = Byte_ascii.Underline;
|
||||
break;
|
||||
default:
|
||||
|
@ -39,7 +39,7 @@ class Dg_parser {
|
||||
int file_id = ++next_id;
|
||||
while (line_bgn < src_len) {
|
||||
++line_idx;
|
||||
int line_end = Bry_finder.Find_fwd(src, Byte_ascii.NewLine, line_bgn); if (line_end == Bry_finder.Not_found) line_end = src_len;
|
||||
int line_end = Bry_finder.Find_fwd(src, Byte_ascii.Nl, line_bgn); if (line_end == Bry_finder.Not_found) line_end = src_len;
|
||||
Dg_rule line = Parse_line(rel_path, file_id, line_idx, src, line_bgn, line_end);
|
||||
if (line.Tid() != Dg_rule.Tid_invalid)
|
||||
lines.Add(line);
|
||||
|
@ -117,14 +117,14 @@ public class Xobc_utl_make_lang_kwds implements GfoInvkAble, Xol_lang_transform
|
||||
List_adp rv = List_adp_.new_(); int fld_idx = 0;
|
||||
while (true) {
|
||||
boolean last = pos == src_len; // NOTE: logic occurs b/c of \n}~-> dlm which gobbles up last \n
|
||||
byte b = last ? Byte_ascii.NewLine : src[pos];
|
||||
byte b = last ? Byte_ascii.Nl : src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
cur_key = csv_parser.Load(src, fld_bgn, pos);
|
||||
fld_bgn = pos + 1;
|
||||
++fld_idx;
|
||||
break;
|
||||
case Byte_ascii.NewLine:
|
||||
case Byte_ascii.Nl:
|
||||
if (pos - fld_bgn > 0 || fld_idx == 1) {
|
||||
byte[] cur_val = csv_parser.Load(src, fld_bgn, pos);
|
||||
Xobcl_kwd_row row = new Xobcl_kwd_row(cur_key, Bry_.Split(cur_val, Byte_ascii.Tilde));
|
||||
|
@ -26,7 +26,7 @@ public class Xob_xml_parser_ {
|
||||
trie_add(rv, Bry_timestamp_bgn, Id_timestamp_bgn); trie_add(rv, Bry_timestamp_bgn_frag, Id_timestamp_bgn_frag); trie_add(rv, Bry_timestamp_end, Id_timestamp_end);
|
||||
trie_add(rv, Bry_text_bgn, Id_text_bgn); trie_add(rv, Bry_text_bgn_frag, Id_text_bgn_frag); trie_add(rv, Bry_text_end, Id_text_end);
|
||||
trie_add(rv, Bry_amp, Id_amp, Byte_ascii.Amp); trie_add(rv, Bry_quot, Id_quot, Byte_ascii.Quote); trie_add(rv, Bry_gt, Id_gt, Byte_ascii.Gt); trie_add(rv, Bry_lt, Id_lt, Byte_ascii.Lt);
|
||||
trie_add(rv, Bry_tab, Id_tab, Bry_tab_ent); trie_add(rv, Bry_cr_nl, Id_cr_nl, Byte_ascii.NewLine); trie_add(rv, Bry_cr, Id_cr, Byte_ascii.NewLine);
|
||||
trie_add(rv, Bry_tab, Id_tab, Bry_tab_ent); trie_add(rv, Bry_cr_nl, Id_cr_nl, Byte_ascii.Nl); trie_add(rv, Bry_cr, Id_cr, Byte_ascii.Nl);
|
||||
return rv;
|
||||
}
|
||||
public static final byte[]
|
||||
|
@ -71,7 +71,7 @@ public class Xodb_load_mgr_txt implements Xodb_load_mgr {
|
||||
Xow_ns ns = wiki.Ns_mgr().Ns_main();
|
||||
int search_len = search.length;
|
||||
byte match_tid = Xows_page__search.Match_tid_all;
|
||||
if (search_len > 0 && search[search_len - 1] == Byte_ascii.Asterisk) {
|
||||
if (search_len > 0 && search[search_len - 1] == Byte_ascii.Star) {
|
||||
search = Bry_.Mid(search, 0, search_len - 1);
|
||||
match_tid = Xows_page__search.Match_tid_bgn;
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ public class Xodb_save_mgr_sql implements Xodb_save_mgr {
|
||||
int page_id = db_file.Tbl__cfg().Select_int_or("db", "page.id_next", -1);
|
||||
if (page_id == -1) { // HACK: changed for tests; was dbs.qrys.Db_qry_sql.rdr_("SELECT (Max(page_id) + 1) AS max_page_id FROM page;")
|
||||
// Db_rdr rdr = db_mgr.Core_data_mgr().Tbl__page().Conn().Stmt_new(Db_qry_sql.rdr_("SELECT (Max(page_id) + 1) AS max_page_id FROM page;")).Exec_select__rls_manual();
|
||||
Db_rdr rdr = db_mgr.Core_data_mgr().Tbl__page().Conn().Stmt_select(db_file.Tbl__page().Tbl_name(), String_.Ary(db_file.Tbl__page().Fld_page_id()), Db_meta_fld.Ary_empy).Exec_select__rls_auto();
|
||||
Db_rdr rdr = db_mgr.Core_data_mgr().Tbl__page().Conn().Stmt_select(db_file.Tbl__page().Tbl_name(), String_.Ary(db_file.Tbl__page().Fld_page_id()), Db_meta_fld.Ary_empty).Exec_select__rls_auto();
|
||||
try {
|
||||
int max_page_id = -1;
|
||||
while (rdr.Move_next()) {
|
||||
|
@ -124,9 +124,7 @@ public class Xof_fsdb_itm implements Xof_file_itm {
|
||||
public void Html_orig_url_(Io_url v) {html_orig_url = v;}
|
||||
public void Html_img_wkr_(Js_img_wkr v) {html_img_wkr = v;}
|
||||
public void Html_gallery_mgr_h_(int v) {html_gallery_mgr_h = v;}
|
||||
public void File_size_(long v) {
|
||||
this.file_size = v;
|
||||
}
|
||||
public void File_size_(long v) {this.file_size = v;}
|
||||
private void Orig_ttl_(byte[] v) {
|
||||
this.orig_ttl = v;
|
||||
this.orig_ttl_md5 = Xof_file_wkr_.Md5_fast(v);
|
||||
|
@ -26,6 +26,7 @@ public class Xof_bin_mgr {
|
||||
private Xof_bin_wkr[] wkrs = Xof_bin_wkr_.Ary_empty; private int wkrs_len;
|
||||
private final String_obj_ref resize_warning = String_obj_ref.null_(); private final Xof_img_size tmp_size = new Xof_img_size();
|
||||
private final Io_download_fmt download_fmt;
|
||||
private final Io_stream_rdr_wrapper rdr_wrapper = new Io_stream_rdr_wrapper();
|
||||
public Xof_bin_mgr(Fsm_mnt_mgr mnt_mgr, Xow_repo_mgr repo_mgr, Xof_img_wkr_resize_img resize_wkr, Io_download_fmt download_fmt) {
|
||||
this.mnt_mgr = mnt_mgr; this.repo_mgr = repo_mgr; this.download_fmt = download_fmt;
|
||||
this.usr_dlg = Gfo_usr_dlg_.I;
|
||||
@ -53,17 +54,23 @@ public class Xof_bin_mgr {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public boolean Find_to_url_as_bool(int exec_tid, Xof_fsdb_itm fsdb) {return Find_to_url(exec_tid, fsdb) != Io_url_.Empty;}
|
||||
private Io_url Find_to_url(int exec_tid, Xof_fsdb_itm fsdb) {
|
||||
Io_stream_rdr rdr = Find_as_rdr(exec_tid, fsdb);
|
||||
if (rdr == Io_stream_rdr_.Noop) return Io_url_.Empty;
|
||||
Io_url trg = fsdb.Html_view_url();
|
||||
fsdb.File_size_(rdr.Len());
|
||||
if (fsdb.File_resized()) return trg; // rdr is opened directly from trg; return its url; occurs when url goes through imageMagick / inkscape, or when thumb is already on disk;
|
||||
Io_stream_wtr_.Save_rdr(trg, rdr, download_fmt); // rdr is stream; either from http_wmf or fsdb; save to trg and return;
|
||||
return trg;
|
||||
}
|
||||
public boolean Find_to_url_as_bool(int exec_tid, Xof_fsdb_itm fsdb) {return Find_as(Bool_.Y, rdr_wrapper, exec_tid, fsdb);}
|
||||
// public boolean Find_to_url_as_bool3(int exec_tid, Xof_fsdb_itm fsdb) {return Find_to_url(exec_tid, fsdb) != Io_url_.Empty;}
|
||||
// private Io_url Find_to_url(int exec_tid, Xof_fsdb_itm fsdb) {
|
||||
// Io_stream_rdr rdr = Find_as_rdr(exec_tid, fsdb);
|
||||
// if (rdr == Io_stream_rdr_.Noop) return Io_url_.Empty;
|
||||
// Io_url trg = fsdb.Html_view_url();
|
||||
// fsdb.File_size_(rdr.Len());
|
||||
// if (fsdb.File_resized()) return trg; // rdr is opened directly from trg; return its url; occurs when url goes through imageMagick / inkscape, or when thumb is already on disk;
|
||||
// Io_stream_wtr_.Save_rdr(trg, rdr, download_fmt); // rdr is stream; either from http_wmf or fsdb; save to trg and return;
|
||||
// return trg;
|
||||
// }
|
||||
public Io_stream_rdr Find_as_rdr(int exec_tid, Xof_fsdb_itm fsdb) {
|
||||
rdr_wrapper.Rdr_(Io_stream_rdr_.Noop);
|
||||
Find_as(Bool_.N, rdr_wrapper, exec_tid, fsdb);
|
||||
return rdr_wrapper.Rdr();
|
||||
}
|
||||
public Io_stream_rdr Find_as_rdr3(int exec_tid, Xof_fsdb_itm fsdb) {
|
||||
Io_stream_rdr rv = Io_stream_rdr_.Noop;
|
||||
Xof_repo_itm repo = repo_mgr.Repos_get_by_wiki(fsdb.Orig_repo_name()).Trg();
|
||||
boolean file_is_orig = fsdb.File_is_orig();
|
||||
@ -107,6 +114,72 @@ public class Xof_bin_mgr {
|
||||
}
|
||||
return Io_stream_rdr_.Noop;
|
||||
}
|
||||
private boolean Find_as(boolean save_to_fsys, Io_stream_rdr_wrapper rdr_wrapper, int exec_tid, Xof_fsdb_itm fsdb) {
|
||||
Xof_repo_itm repo = repo_mgr.Repos_get_by_wiki(fsdb.Orig_repo_name()).Trg();
|
||||
boolean file_is_orig = fsdb.File_is_orig();
|
||||
if (file_is_orig || exec_tid == Xof_exec_tid.Tid_viewer_app) { // orig or viewer_app; note that viewer_app always return orig
|
||||
Io_url trg = url_bldr.To_url_trg(repo, fsdb, Bool_.Y);
|
||||
fsdb.Html_view_url_(trg);
|
||||
for (int i = 0; i < wkrs_len; i++) {
|
||||
Xof_bin_wkr wkr = wkrs[i];
|
||||
boolean found = Get_bin(Bool_.N, fsdb.Html_w(), trg, save_to_fsys, rdr_wrapper, fsdb, wkr);
|
||||
if (found) // orig found; return it;
|
||||
return Set_found(save_to_fsys, fsdb, trg, rdr_wrapper);
|
||||
}
|
||||
}
|
||||
else { // thumb
|
||||
Io_url trg = url_bldr.To_url_trg(repo, fsdb, Bool_.N);
|
||||
fsdb.Html_view_url_(trg);
|
||||
for (int i = 0; i < wkrs_len; i++) {
|
||||
Xof_bin_wkr wkr = wkrs[i];
|
||||
boolean found = Get_bin(Bool_.Y, fsdb.Html_w(), trg, save_to_fsys, rdr_wrapper, fsdb, wkr);
|
||||
if (found) // thumb found; return it;
|
||||
return Set_found(save_to_fsys, fsdb, trg, rdr_wrapper);
|
||||
if (fsdb.Orig_ext().Id_is_video()) continue; // item is video; don't download orig as imageMagick can't thumbnail it; DATE:2015-06-16
|
||||
if (!wkr.Resize_allowed()) continue; // resize code below; exit early if wkr doesn't allow resize
|
||||
Io_url orig = url_bldr.To_url_trg(repo, fsdb, Bool_.Y); // get orig url
|
||||
found = Get_bin(Bool_.N, fsdb.Orig_w(), orig, Bool_.Y, rdr_wrapper, fsdb, wkr); // get orig; note: save_to_fsys set to true b/c imageMagick will need actual file to convert
|
||||
if (!found) {
|
||||
usr_dlg.Log_direct(String_.Format("bin_mgr:thumb not found; wkr={0} ttl={1} w={2}", wkr.Key(), fsdb.Orig_ttl(), fsdb.Lnki_w()));
|
||||
continue; // orig not found; skip rest since resize can't happen;
|
||||
}
|
||||
boolean resized = Resize(exec_tid, fsdb, file_is_orig, orig, trg);
|
||||
if (!resized) continue;
|
||||
if (save_to_fsys) { // noop; already saved to trg
|
||||
}
|
||||
else {
|
||||
Io_stream_rdr rdr = Io_stream_rdr_.file_(trg); // return stream of resized url; (result of imageMagick / inkscape)
|
||||
rdr.Open();
|
||||
rdr_wrapper.Rdr_(rdr);
|
||||
}
|
||||
return Set_found(save_to_fsys, fsdb, trg, rdr_wrapper);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
private boolean Get_bin(boolean is_thumb, int w, Io_url trg_url, boolean save_to_fsys, Io_stream_rdr_wrapper rdr_wrapper, Xof_fsdb_itm fsdb, Xof_bin_wkr wkr) {
|
||||
boolean found = false;
|
||||
if (save_to_fsys)
|
||||
found = wkr.Get_to_fsys(fsdb, is_thumb, w, trg_url);
|
||||
else {
|
||||
Io_stream_rdr rdr = wkr.Get_as_rdr(fsdb, is_thumb, w);
|
||||
if (rdr != Io_stream_rdr_.Noop) {
|
||||
found = true;
|
||||
rdr_wrapper.Rdr_(rdr);
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
private boolean Set_found(boolean save_to_fsys, Xof_fsdb_itm fsdb, Io_url fsys_url, Io_stream_rdr_wrapper rdr_wrapper) {
|
||||
long fsdb_len = -1;
|
||||
if (save_to_fsys)
|
||||
fsdb_len = Io_mgr.I.QueryFil(fsys_url).Size();
|
||||
else
|
||||
fsdb_len = rdr_wrapper.Rdr().Len();
|
||||
fsdb.File_size_(fsdb_len);
|
||||
fsdb.File_exists_y_();
|
||||
return true;
|
||||
}
|
||||
private boolean Resize(int exec_tid, Xof_fsdb_itm itm, boolean file_is_orig, Io_url src, Io_url trg) {
|
||||
tmp_size.Html_size_calc(exec_tid, itm.Lnki_w(), itm.Lnki_h(), itm.Lnki_type(), mnt_mgr.Patch_upright(), itm.Lnki_upright(), itm.Orig_ext().Id(), itm.Orig_w(), itm.Orig_h(), Xof_img_size.Thumb_width_img);
|
||||
boolean rv = resizer.Resize_exec(src, trg, tmp_size.Html_w(), tmp_size.Html_h(), itm.Orig_ext().Id(), resize_warning);
|
||||
@ -114,3 +187,6 @@ public class Xof_bin_mgr {
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
class Io_stream_rdr_wrapper {
|
||||
public Io_stream_rdr Rdr() {return rdr;} public void Rdr_(Io_stream_rdr v) {rdr = v;} private Io_stream_rdr rdr;
|
||||
}
|
||||
|
@ -73,7 +73,7 @@ class Xofc_dir_tbl implements RlsAble {
|
||||
}
|
||||
public void Select_all(List_adp list) {
|
||||
list.Clear();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto();
|
||||
try {
|
||||
while (rdr.Move_next())
|
||||
list.Add(new_itm(rdr));
|
||||
|
@ -122,7 +122,7 @@ class Xofc_fil_tbl implements RlsAble {
|
||||
}
|
||||
public void Select_all(Bry_bfr fil_key_bldr, Ordered_hash hash) {
|
||||
hash.Clear();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto();
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
Xofc_fil_itm fil_itm = new_itm(rdr);
|
||||
|
@ -158,7 +158,7 @@ public class Xou_cache_mgr {
|
||||
}
|
||||
private Io_url Calc_url(Xou_cache_itm cache) {
|
||||
byte[] wiki_domain = Xow_domain_abrv_xo_.To_itm(cache.Lnki_wiki_abrv()).Domain_bry();
|
||||
Xow_wiki wiki = wiki_mgr.Get_by_key_or_make_2(wiki_domain); if (wiki == null) return Io_url_.Empty; // wiki is not available; should only happen in read-only mode; DATE:2015-05-23
|
||||
Xow_wiki wiki = wiki_mgr.Get_by_key_or_make_init_y(wiki_domain); if (wiki == null) return Io_url_.Empty; // wiki is not available; should only happen in read-only mode; DATE:2015-05-23
|
||||
Xof_repo_itm trg_repo = wiki.File__repo_mgr().Get_trg_by_id_or_null(cache.Orig_repo_id(), cache.Lnki_ttl(), Bry_.Empty);
|
||||
if (trg_repo == null) return Io_url_.Empty;
|
||||
byte[] orig_ttl = cache.Orig_ttl();
|
||||
|
@ -90,7 +90,7 @@ public class Xou_cache_tbl implements RlsAble {
|
||||
}
|
||||
public void Select_all(Bry_bfr fil_key_bldr, Ordered_hash hash) {
|
||||
hash.Clear();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_auto();
|
||||
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_auto();
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
Xou_cache_itm itm = new_itm(rdr);
|
||||
@ -112,7 +112,7 @@ public class Xou_cache_tbl implements RlsAble {
|
||||
itm.Db_state_(Db_cmd_mode.Tid_ignore);
|
||||
} catch (Exception e) {stmt_bldr.Rls(); throw Err_.err_(e, Err_.Message_gplx(e));}
|
||||
}
|
||||
@gplx.Internal protected Db_rdr Select_all_for_test() {return conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empy).Exec_select__rls_manual();}
|
||||
@gplx.Internal protected Db_rdr Select_all_for_test() {return conn.Stmt_select(tbl_name, flds, Db_meta_fld.Ary_empty).Exec_select__rls_manual();}
|
||||
private void Db_save_crt(Db_stmt stmt, Xou_cache_itm itm, boolean insert) {
|
||||
if (insert) {
|
||||
stmt.Val_bry_as_str (fld_lnki_wiki_abrv , itm.Lnki_wiki_abrv())
|
||||
|
@ -41,4 +41,16 @@ public class Xof_orig_itm {
|
||||
public static final byte Repo_comm = 0, Repo_wiki = 1, Repo_null = Byte_.Max_value_127; // SERIALIZED: "wiki_orig.orig_repo"
|
||||
public static final Xof_orig_itm Null = null;
|
||||
public static final int File_len_null = -1; // file_len used for filters (EX: don't download ogg > 1 MB)
|
||||
public static String dump(Xof_orig_itm itm) {
|
||||
if (itm == null)
|
||||
return "NULL";
|
||||
Bry_bfr bfr = Bry_bfr.new_(255);
|
||||
bfr.Add_str_a7("repo").Add_byte_eq().Add_int_variable((int)itm.repo).Add_byte_semic();
|
||||
bfr.Add_str_a7("ttl").Add_byte_eq().Add(itm.ttl).Add_byte_semic();
|
||||
bfr.Add_str_a7("ext_id").Add_byte_eq().Add_int_variable(itm.ext_id).Add_byte_semic();
|
||||
bfr.Add_str_a7("w").Add_byte_eq().Add_int_variable(itm.w).Add_byte_semic();
|
||||
bfr.Add_str_a7("h").Add_byte_eq().Add_int_variable(itm.h).Add_byte_semic();
|
||||
bfr.Add_str_a7("redirect").Add_byte_eq().Add(itm.redirect).Add_byte_semic();
|
||||
return bfr.Xto_str_and_clear();
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ class Xog_menu_mgr_src {
|
||||
. Add_btn(Xog_cmd_itm_.Key_gui_browser_tabs_close_cur)
|
||||
. Add_spr()
|
||||
. Add_btn(Xog_cmd_itm_.Key_gui_page_view_save_as)
|
||||
// . Add_btn(Xog_cmd_itm_.Key_gui_page_view_print)
|
||||
. Add_btn(Xog_cmd_itm_.Key_gui_page_view_print)
|
||||
. Add_btn(Xog_cmd_itm_.Key_app_exit)
|
||||
. Add_grp_end()
|
||||
. Add_grp_bgn(Xog_cmd_itm_.Key_gui_menus_group_edit)
|
||||
|
@ -75,8 +75,8 @@ public class Xog_url_wkr {
|
||||
Io_url href_url = Io_url_.http_any_(String_.new_u8(Xoa_app_.Utl__encoder_mgr().Http_url().Decode(href_bry)), Op_sys.Cur().Tid_is_wnt());
|
||||
gplx.gfui.Gfui_html html_box = win.Active_html_box();
|
||||
String xowa_ttl = wiki.Gui_mgr().Cfg_browser().Content_editable()
|
||||
? html_box.Html_active_atr_get_str(gplx.xowa.html.Xoh_consts.Atr_xowa_title_str, null)
|
||||
: Xoh_dom_.Title_by_href(href_bry, Bry_.new_u8(html_box.Html_doc_html()));
|
||||
? html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, gplx.xowa.html.Xoh_consts.Atr_xowa_title_str, null)
|
||||
: Xoh_dom_.Title_by_href(href_bry, Bry_.new_u8(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__root_html_get)));
|
||||
byte[] lnki_ttl = Xoa_app_.Utl__encoder_mgr().Http_url().Decode(Xoa_ttl.Replace_spaces(Bry_.new_u8(xowa_ttl)));
|
||||
Xof_fsdb_itm fsdb = Xof_orig_file_downloader.Make_fsdb(wiki, lnki_ttl, img_size, url_bldr);
|
||||
if (!Io_mgr.I.ExistsFil(href_url)) {
|
||||
|
@ -21,6 +21,8 @@ import gplx.gfui.*; import gplx.xowa.gui.menus.*; import gplx.xowa.gui.menus.dom
|
||||
import gplx.html.*; import gplx.xowa.html.modules.*; import gplx.xowa.pages.*;
|
||||
public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
private Xoae_app app; private final Object thread_lock = new Object();
|
||||
private final String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_();
|
||||
protected Xog_html_itm() {} // TEST: for prefs_mgr
|
||||
public Xog_html_itm(Xog_tab_itm owner_tab) {
|
||||
this.owner_tab = owner_tab;
|
||||
app = owner_tab.Tab_mgr().Win().App();
|
||||
@ -45,10 +47,10 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
this.html_box = html_box;
|
||||
html_box.Html_js_cbks_add("xowa_exec", js_cbk);
|
||||
}
|
||||
public String Html_selected_get_src_or_empty() {return html_box.Html_doc_selected_get_src_or_empty();}
|
||||
public String Html_selected_get_href_or_text() {return Html_extract_text(html_box.Html_doc_selected_get_href_or_text());}
|
||||
public String Html_selected_get_text_or_href() {return Html_extract_text(html_box.Html_doc_selected_get_text_or_href());}
|
||||
public String Html_selected_get_active_or_selection() {return Html_extract_text(html_box.Html_doc_selected_get_active_or_selection());}
|
||||
public String Html_selected_get_src_or_empty() {return html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_src_or_empty);}
|
||||
public String Html_selected_get_href_or_text() {return Html_extract_text(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_href_or_text));}
|
||||
public String Html_selected_get_text_or_href() {return Html_extract_text(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_text_or_href));}
|
||||
public String Html_selected_get_active_or_selection() {return Html_extract_text(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_or_selection));}
|
||||
private String Html_extract_text(String v) {
|
||||
Xoae_page page = owner_tab.Page();
|
||||
String site = owner_tab.Wiki().Domain_str();
|
||||
@ -59,8 +61,8 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
byte view_mode = owner_tab.View_mode();
|
||||
byte[] html_src = page.Wikie().Html_mgr().Page_wtr_mgr().Gen(page, view_mode); // NOTE: must use wiki of page, not of owner tab; DATE:2015-03-05
|
||||
Html_src_(page, html_src);
|
||||
if (view_mode == Xopg_view_mode.Tid_read){ // used only for Xosrh test; DATE:2014-01-29
|
||||
html_box.Html_doc_body_focus(); // NOTE: only focus if read so up / down will scroll box; edit / html should focus edit-box; DATE:2014-06-05
|
||||
if (view_mode == Xopg_view_mode.Tid_read){ // used only for Xosrh test; DATE:2014-01-29
|
||||
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__focus_body); // NOTE: only focus if read so up / down will scroll box; edit / html should focus edit-box; DATE:2014-06-05
|
||||
page.Root().Data_htm_(html_src);
|
||||
}
|
||||
}
|
||||
@ -89,8 +91,8 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
trg_itm.js_cbk = src_js_cbk;
|
||||
}
|
||||
public byte[] Get_elem_value_for_edit_box_as_bry() {return Bry_.new_u8(this.Get_elem_value_for_edit_box());}
|
||||
public String Get_elem_value_for_edit_box() {return html_box.Html_elem_atr_get_str(Elem_id__xowa_edit_data_box, Gfui_html.Atr_value);}
|
||||
public String Get_elem_value(String elem_id) {return html_box.Html_elem_atr_get_str(elem_id, Gfui_html.Atr_value);}
|
||||
public String Get_elem_value_for_edit_box() {return Html_elem_atr_get_str(Elem_id__xowa_edit_data_box, Gfui_html.Atr_value);}
|
||||
public String Get_elem_value(String elem_id) {return Html_elem_atr_get_str(elem_id, Gfui_html.Atr_value);}
|
||||
public void Html_img_update(String elem_id, String elem_src, int elem_width, int elem_height) {
|
||||
GfoMsg m = GfoMsg_.new_cast_(Invk_html_img_update).Add("elem_id", elem_id).Add("elem_src", elem_src).Add("elem_width", elem_width).Add("elem_height", elem_height);
|
||||
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_img_update, m);
|
||||
@ -99,16 +101,20 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_delete).Add("elem_id", elem_id);
|
||||
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_delete, m);
|
||||
}
|
||||
@gplx.Virtual public String Html_elem_atr_get_str(String id, String atr_key) {return html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__atr_get_as_obj, id, atr_key);}
|
||||
@gplx.Virtual public boolean Html_elem_atr_get_bool(String id, String atr_key) {return Bool_.parse_(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__atr_get_to_str, id, atr_key));}
|
||||
|
||||
|
||||
public void Html_atr_set(String elem_id, String atr_key, String atr_val) {
|
||||
synchronized (thread_lock) { // needed for Special:Search and async cancel; DATE:2015-05-02
|
||||
GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_atr_set).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val);
|
||||
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_atr_set, m);
|
||||
}
|
||||
}
|
||||
public void Html_redlink(String html_uid) {Html_elem_atr_set_append(html_uid, "class", gplx.xowa.html.lnkis.Xoh_redlink_utl.New_str);}
|
||||
public void Html_elem_atr_set_append(String elem_id, String atr_key, String atr_val) {
|
||||
GfoMsg m = GfoMsg_.new_cast_(Invk_html_elem_atr_set_append).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val);
|
||||
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_elem_atr_set_append, m);
|
||||
public void Html_redlink(String html_uid) {Html_doc_atr_append_or_set(html_uid, "class", gplx.xowa.html.lnkis.Xoh_redlink_utl.New_str);}
|
||||
private void Html_doc_atr_append_or_set(String elem_id, String atr_key, String atr_val) {
|
||||
GfoMsg m = GfoMsg_.new_cast_(Invk_html_doc_atr_append_or_set).Add("elem_id", elem_id).Add("atr_key", atr_key).Add("atr_val", atr_val);
|
||||
GfoInvkAble_.InvkCmd_msg(cmd_sync, Invk_html_doc_atr_append_or_set, m);
|
||||
}
|
||||
public void Html_elem_replace_html(String id, String html) {
|
||||
synchronized (thread_lock) { // needed for Special:Search and async; DATE:2015-04-23
|
||||
@ -148,22 +154,24 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
String html_doc_pos = owner_tab.Page().Html_data().Bmk_pos();
|
||||
if (html_doc_pos == null) {
|
||||
String auto_focus_id = app.Gui_mgr().Html_mgr().Auto_focus_id();
|
||||
if (String_.Len_eq_0(auto_focus_id)) return; // don't focus anything
|
||||
if (String_.Eq(auto_focus_id, " first_anchor")) // NOTE: HTML 4/5 do not allow space as id; XOWA using space here to create a unique_key that will never collide with any id
|
||||
html_box.Html_doc_body_focus(); // NOTE: will focus body if content-editable, or first_anchor otherwise
|
||||
if (String_.Len_eq_0(auto_focus_id)) return; // don't focus anything
|
||||
if (String_.Eq(auto_focus_id, " first_anchor")) // NOTE: HTML 4/5 do not allow space as id; XOWA using space here to create a unique_key that will never collide with any id
|
||||
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__focus_body); // NOTE: will focus body if content-editable, else first_anchor
|
||||
else
|
||||
html_box.Html_elem_focus(auto_focus_id);
|
||||
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__elem_focus, auto_focus_id);
|
||||
}
|
||||
else if (String_.Eq(html_doc_pos, gplx.xowa.gui.history.Xog_history_itm.Html_doc_pos_toc)) // NOTE: special case to handle TOC clicks; DATE:2013-07-17
|
||||
Scroll_page_by_id("toc");
|
||||
else
|
||||
html_box.Html_window_vpos_(html_doc_pos);
|
||||
else {
|
||||
Html_window_vpos_parse(html_doc_pos, scroll_top, node_path);
|
||||
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_set, node_path.Val(), scroll_top.Val());
|
||||
}
|
||||
}
|
||||
public void Scroll_page_by_id_gui(String id) {GfoInvkAble_.InvkCmd_val(cmd_async, Invk_scroll_page_by_id, id);}
|
||||
private boolean Scroll_page_by_id(String id) {
|
||||
return (id == null)
|
||||
? false
|
||||
: html_box.Html_elem_scroll_into_view(Xoa_app_.Utl__encoder_mgr().Id().Encode_str(id));
|
||||
: html_box.Html_js_eval_proc_as_bool(Xog_js_procs.Win__scroll_elem_into_view, Xoa_app_.Utl__encoder_mgr().Id().Encode_str(id));
|
||||
}
|
||||
public void Js_enabled_(boolean v) {
|
||||
html_box.Html_js_enabled_(v);
|
||||
@ -179,17 +187,17 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
kit.Set_mnu_popup(html_box, popup_mnu.Under_mnu());
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_html_img_update)) html_box.Html_elem_img_update(m.ReadStr("elem_id"), m.ReadStr("elem_src"), m.ReadInt("elem_width"), m.ReadInt("elem_height"));
|
||||
else if (ctx.Match(k, Invk_html_elem_atr_set)) html_box.Html_elem_atr_set(m.ReadStr("elem_id"), m.ReadStr("atr_key"), m.ReadStr("atr_val"));
|
||||
else if (ctx.Match(k, Invk_html_elem_atr_set_append)) html_box.Html_elem_atr_set_append(m.ReadStr("elem_id"), m.ReadStr("atr_key"), m.ReadStr("atr_val"));
|
||||
else if (ctx.Match(k, Invk_html_elem_delete)) html_box.Html_elem_delete(m.ReadStr("elem_id"));
|
||||
else if (ctx.Match(k, Invk_html_elem_replace_html)) html_box.Html_elem_replace_html(m.ReadStr("id"), m.ReadStr("html"));
|
||||
else if (ctx.Match(k, Invk_html_elem_append_above)) html_box.Html_elem_append_above(m.ReadStr("id"), m.ReadStr("html"));
|
||||
else if (ctx.Match(k, Invk_html_gallery_packed_exec)) html_box.Html_gallery_packed_exec();
|
||||
if (ctx.Match(k, Invk_html_img_update)) html_box.Html_js_eval_proc_as_bool (Xog_js_procs.Doc__elem_img_update , m.ReadStr("elem_id"), m.ReadStr("elem_src"), m.ReadInt("elem_width"), m.ReadInt("elem_height"));
|
||||
else if (ctx.Match(k, Invk_html_elem_atr_set)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__atr_set , m.ReadStr("elem_id"), m.ReadStr("atr_key"), m.ReadStr("atr_val"));
|
||||
else if (ctx.Match(k, Invk_html_doc_atr_append_or_set)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__atr_append_or_set , m.ReadStr("elem_id"), m.ReadStr("atr_key"), m.ReadStr("atr_val"));
|
||||
else if (ctx.Match(k, Invk_html_elem_delete)) html_box.Html_js_eval_proc_as_bool (Xog_js_procs.Doc__elem_delete , m.ReadStr("elem_id"));
|
||||
else if (ctx.Match(k, Invk_html_elem_replace_html)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__elem_replace_html , m.ReadStr("id"), m.ReadStr("html"));
|
||||
else if (ctx.Match(k, Invk_html_elem_append_above)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Doc__elem_append_above , m.ReadStr("id"), m.ReadStr("html"));
|
||||
else if (ctx.Match(k, Invk_html_gallery_packed_exec)) html_box.Html_js_eval_proc_as_str (Xog_js_procs.Xtn__gallery_packed_exec);
|
||||
else if (ctx.Match(k, Invk_html_popups_bind_hover_to_doc)) html_box.Html_js_eval_script("xowa_popups_bind_doc();");
|
||||
else if (ctx.Match(k, Invk_scroll_page_by_bmk)) Scroll_page_by_bmk();
|
||||
else if (ctx.Match(k, Invk_scroll_page_by_id)) Scroll_page_by_id(m.ReadStr("v"));
|
||||
else if (ctx.Match(k, Invk_html_elem_focus)) html_box.Html_elem_focus(m.ReadStr("v"));
|
||||
else if (ctx.Match(k, Invk_html_elem_focus)) html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__elem_focus, m.ReadStr("v"));
|
||||
else if (ctx.Match(k, GfuiElemKeys.Evt_menu_detected)) When_menu_detected();
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
return this;
|
||||
@ -197,7 +205,7 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
private static final String
|
||||
Invk_html_gallery_packed_exec = "html_gallery_packed_exec", Invk_html_popups_bind_hover_to_doc = "html_popups_bind_hover_to_doc"
|
||||
, Invk_html_img_update = "html_img_update", Invk_html_elem_atr_set = "html_elem_atr_set"
|
||||
, Invk_html_elem_atr_set_append = "html_elem_atr_set_append", Invk_html_elem_delete = "html_elem_delete", Invk_html_elem_replace_html = "html_elem_replace_html", Invk_html_elem_append_above = "html_elem_append_above"
|
||||
, Invk_html_doc_atr_append_or_set = "html_doc_atr_append_or_set", Invk_html_elem_delete = "html_elem_delete", Invk_html_elem_replace_html = "html_elem_replace_html", Invk_html_elem_append_above = "html_elem_append_above"
|
||||
, Invk_scroll_page_by_bmk = "scroll_page_by_bmk", Invk_scroll_page_by_id = "scroll_page_by_id"
|
||||
;
|
||||
public static final String
|
||||
@ -206,6 +214,13 @@ public class Xog_html_itm implements Xog_js_wkr, GfoInvkAble, GfoEvObj {
|
||||
, Elem_id__first_heading = "firstHeading"
|
||||
, Invk_html_elem_focus = "html_elem_focus"
|
||||
;
|
||||
public static void Html_window_vpos_parse(String v, String_obj_ref scroll_top, String_obj_ref node_path) {
|
||||
int pipe_pos = String_.FindFwd(v, "|"); if (pipe_pos == String_.Find_none) return; // if elem_get_path returns invalid value, don't fail; DATE:2014-04-05
|
||||
scroll_top.Val_(String_.Mid(v, 0, pipe_pos));
|
||||
String node_path_val = String_.Mid(v, pipe_pos + 1, String_.Len(v));
|
||||
node_path_val = "'" + String_.Replace(node_path_val, ",", "','") + "'";
|
||||
node_path.Val_(node_path_val);
|
||||
}
|
||||
}
|
||||
class Xog_html_itm__href_extractor {
|
||||
private static final byte Text_tid_none = 0, Text_tid_text = 1, Text_tid_href = 2;
|
||||
|
@ -17,6 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*;
|
||||
import org.junit.*;
|
||||
import gplx.core.primitives.*;
|
||||
public class Xog_html_itm_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xog_html_itm_fxt fxt = new Xog_html_itm_fxt();
|
||||
@Test public void Extract_href__text() {
|
||||
@ -34,6 +35,10 @@ public class Xog_html_itm_tst {
|
||||
fxt.Test_extract_href("2|/wiki/Page_2" , "en.wikipedia.org/wiki/Page_2");
|
||||
fxt.Test_extract_href("2|#anchor" , "en.wikipedia.org/wiki/Page_0#anchor");
|
||||
}
|
||||
@Test public void Html_window_vpos_parse() {
|
||||
fxt.Test_Html_window_vpos_parse("0|0,1,2", "0", "'0','1','2'");
|
||||
fxt.Test_Html_window_vpos_parse("org.eclipse.swt.SWTException: Permission denied for <file://> to get property Selection.rangeCount", null, null); // check that invalid path doesn't fail; DATE:2014-04-05
|
||||
}
|
||||
}
|
||||
class Xog_html_itm_fxt {
|
||||
public void Clear() {
|
||||
@ -45,4 +50,11 @@ class Xog_html_itm_fxt {
|
||||
public void Test_extract_href(String text_str, String expd) {
|
||||
Tfds.Eq(expd, Xog_html_itm__href_extractor.Html_extract_text(cur_wiki, cur_page, text_str));
|
||||
}
|
||||
private String_obj_ref scroll_top = String_obj_ref.null_(), node_path = String_obj_ref.null_();
|
||||
public void Test_Html_window_vpos_parse(String raw, String expd_scroll_top, String expd_node_path) {
|
||||
scroll_top.Val_null_(); node_path.Val_null_();
|
||||
Xog_html_itm.Html_window_vpos_parse(raw, scroll_top, node_path);
|
||||
Tfds.Eq(expd_scroll_top, scroll_top.Val(), expd_scroll_top);
|
||||
Tfds.Eq(expd_node_path, node_path.Val(), expd_node_path);
|
||||
}
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ public class Xog_html_js_cbk implements GfoInvkAble {
|
||||
private String[][] Get_titles_meta(GfoMsg m) {
|
||||
Xowe_wiki wiki = html_itm.Owner_tab().Wiki();
|
||||
try {
|
||||
byte[][] ttls = Bry_.Split(Bry_.new_u8((String)m.ReadValAt(0)), Byte_ascii.NewLine);
|
||||
byte[][] ttls = Bry_.Split(Bry_.new_u8((String)m.ReadValAt(0)), Byte_ascii.Nl);
|
||||
int ttls_len = ttls.length;
|
||||
String[][] rv = new String[ttls_len][];
|
||||
for (int i = 0; i < ttls_len; i++) {
|
||||
|
46
400_xowa/src/gplx/xowa/gui/views/Xog_js_procs.java
Normal file
46
400_xowa/src/gplx/xowa/gui/views/Xog_js_procs.java
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.gui.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.gui.*;
|
||||
public class Xog_js_procs {
|
||||
public static final String
|
||||
Win__focus_body = "xowa.js.win.focus_body"
|
||||
, Win__vpos_get = "xowa.js.win.vpos_get"
|
||||
, Win__vpos_set = "xowa.js.win.vpos_set"
|
||||
, Win__find_in_hdoc = "xowa.js.win.find_in_hdoc"
|
||||
, Win__find_in_textarea = "xowa.js.win.find_in_textarea"
|
||||
, Win__scroll_elem_into_view = "xowa.js.win.scroll_elem_into_view"
|
||||
, Win__print_preview = "xowa.js.win.print_preview"
|
||||
, Doc__root_html_get = "xowa.js.doc.root_html_get"
|
||||
, Doc__atr_get_as_obj = "xowa.js.doc.atr_get_as_obj"
|
||||
, Doc__atr_get_to_str = "xowa.js.doc.atr_get_to_str"
|
||||
, Doc__atr_set = "xowa.js.doc.atr_set"
|
||||
, Doc__atr_append_or_set = "xowa.js.doc.atr_append_or_set"
|
||||
, Doc__elem_focus = "xowa.js.doc.elem_focus"
|
||||
, Doc__elem_delete = "xowa.js.doc.elem_delete"
|
||||
, Doc__elem_append_above = "xowa.js.doc.elem_append_above"
|
||||
, Doc__elem_replace_html = "xowa.js.doc.elem_replace_html"
|
||||
, Doc__elem_img_update = "xowa.js.doc.elem_img_update"
|
||||
, Selection__get_text_or_href = "xowa.js.selection.get_text_or_href"
|
||||
, Selection__get_href_or_text = "xowa.js.selection.get_href_or_text"
|
||||
, Selection__get_active_or_selection = "xowa.js.selection.get_active_or_selection"
|
||||
, Selection__get_src_or_empty = "xowa.js.selection.get_src_or_empty"
|
||||
, Selection__get_active_for_editable_mode = "xowa.js.selection.get_active_for_editable_mode"
|
||||
, Selection__toggle_focus_for_anchor = "xowa.js.selection.toggle_focus_for_anchor"
|
||||
, Xtn__gallery_packed_exec = "xowa.js.xtn.gallery_packed_exec"
|
||||
;
|
||||
}
|
@ -93,7 +93,7 @@ public class Xog_tab_itm_edit_mgr {
|
||||
public static void Focus(Xog_win_itm win, String elem_focus_id) {
|
||||
Gfui_html html_box = win.Active_html_box();
|
||||
html_box.Focus();
|
||||
html_box.Html_elem_focus(elem_focus_id);
|
||||
html_box.Html_js_eval_proc_as_str(Xog_js_procs.Doc__elem_focus, elem_focus_id);
|
||||
}
|
||||
public static void Debug(Xog_win_itm win, byte view_tid) {
|
||||
Xog_tab_itm tab = win.Tab_mgr().Active_tab(); Xoae_page page = tab.Page();
|
||||
|
@ -28,7 +28,7 @@ public class Xog_tab_itm_read_mgr {
|
||||
Xoae_page cur_page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm(); Gfui_html html_box = html_itm.Html_box();
|
||||
Xog_win_itm win = tab.Tab_mgr().Win();
|
||||
if (cur_page != null && !new_page_is_same) { // if new_page_is_same, don't update DocPos; will "lose" current position
|
||||
cur_page.Html_data().Bmk_pos_(html_box.Html_window_vpos());
|
||||
cur_page.Html_data().Bmk_pos_(html_box.Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_get));
|
||||
tab.History_mgr().Update_html_doc_pos(cur_page, history_nav_type); // HACK: old_page is already in stack, but need to update its hdoc_pos
|
||||
}
|
||||
win.Usr_dlg().Prog_none("", "", "locating images");
|
||||
|
@ -111,7 +111,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
|
||||
private void Win__link_click() { // NOTE: only applies when content_editable=y; if n, then link_click will be handled by SwtBrowser location changed (Win__link_clicked)
|
||||
Xog_tab_itm tab = tab_mgr.Active_tab(); Xowe_wiki wiki = tab.Wiki();
|
||||
if (wiki.Gui_mgr().Cfg_browser().Content_editable()) {
|
||||
String href = tab.Html_itm().Html_box().Html_active_atr_get_str(Gfui_html.Atr_href, null);
|
||||
String href = tab.Html_itm().Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, Gfui_html.Atr_href, null);
|
||||
if (String_.Len_eq_0(href)) return; // NOTE: href can be null for images; EX: [[File:Loudspeaker.svg|11px|link=|alt=play]]; link= basically means don't link to image
|
||||
Page__navigate_by_internal_href(href, tab);
|
||||
}
|
||||
@ -136,7 +136,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
|
||||
kit.Kit_term(); // NOTE: Kit_term calls shell.close() which in turn is hooked up to app.Term_cbk() event; DATE:2014-09-09
|
||||
}
|
||||
private void App__eval(String s) {
|
||||
String snippet = this.Active_html_box().Html_elem_atr_get_str(s, Gfui_html.Atr_innerHTML);
|
||||
String snippet = this.Active_html_itm().Html_elem_atr_get_str(s, Gfui_html.Atr_innerHTML);
|
||||
app.Gfs_mgr().Run_str(snippet);
|
||||
}
|
||||
private static String Parse_evt_location_changing(String v) { // EX: about:blank#anchor -> anchor
|
||||
@ -196,7 +196,7 @@ public class Xog_win_itm implements GfoInvkAble, GfoEvObj {
|
||||
}
|
||||
public void Page__refresh() {
|
||||
Xog_tab_itm tab = tab_mgr.Active_tab(); Xoae_page page = tab.Page(); Xog_html_itm html_itm = tab.Html_itm();
|
||||
page.Html_data().Bmk_pos_(html_itm.Html_box().Html_window_vpos());
|
||||
page.Html_data().Bmk_pos_(html_itm.Html_box().Html_js_eval_proc_as_str(Xog_js_procs.Win__vpos_get));
|
||||
html_itm.Show(page);
|
||||
if (page.Url().Anchor_str() == null)
|
||||
html_itm.Scroll_page_by_bmk_gui();
|
||||
|
@ -21,7 +21,7 @@ public class Xog_win_itm__prog_href_mgr {
|
||||
private static Xoh_href tmp_href = new Xoh_href();
|
||||
private static Bry_bfr tmp_bfr = Bry_bfr.reset_(512);
|
||||
public static void Print(Xog_win_itm win) { // PURPOSE: print href in prog box when in content editable mode
|
||||
String href = win.Active_html_box().Html_active_atr_get_str(Gfui_html.Atr_href, "");// get selected href from html_box
|
||||
String href = win.Active_html_box().Html_js_eval_proc_as_str(Xog_js_procs.Selection__get_active_for_editable_mode, Gfui_html.Atr_href, "");// get selected href from html_box
|
||||
href = Xoa_app_.Utl__encoder_mgr().Href().Decode_str(href); // remove url encodings
|
||||
if (!String_.Eq(href, win.Prog_box().Text()))
|
||||
win.Usr_dlg().Prog_direct(href);
|
||||
|
@ -30,7 +30,7 @@ public class Xoh_html_wtr {
|
||||
lnke_wtr = new Xoh_lnke_wtr(wiki);
|
||||
}
|
||||
public void Init_by_wiki(Xowe_wiki wiki) {
|
||||
cfg.Toc_show_(true).Lnki_title_(true).Lnki_visited_(true).Lnki_id_(true); // NOTE: set during Init_by_wiki, b/c all tests assume these are false
|
||||
cfg.Toc__show_(Bool_.Y).Lnki__title_(true).Lnki_visited_y_().Lnki__id_y_(); // NOTE: set during Init_by_wiki, b/c all tests assume these are false
|
||||
ref_wtr.Init_by_wiki(wiki);
|
||||
}
|
||||
public Xow_html_mgr Html_mgr() {return html_mgr;} private Xow_html_mgr html_mgr;
|
||||
@ -46,6 +46,8 @@ public class Xoh_html_wtr {
|
||||
page.Slink_list().Clear(); // HACK: always clear langs; necessary for reload
|
||||
lnki_wtr.Init_by_page(ctx, hctx, src, ctx.Cur_page());
|
||||
Write_tkn(bfr, ctx, hctx, src, null, -1, root);
|
||||
if (cfg.Hdr__div_wrapper())
|
||||
bfr.Add(Tag_hdr__div_wrapper_end);
|
||||
}
|
||||
finally {
|
||||
page.Category_list_(page.Html_data().Ctgs_to_ary());
|
||||
@ -107,14 +109,19 @@ public class Xoh_html_wtr {
|
||||
private static final byte[] Bry_hdr_bgn = Bry_.new_a7("<span class='mw-headline' id='"), Bry_hdr_end = Bry_.new_a7("</span>");
|
||||
@gplx.Virtual public void Hr(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_hr_tkn tkn) {bfr.Add(Tag_hr);}
|
||||
@gplx.Virtual public void Hdr(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_hdr_tkn hdr) {
|
||||
if (hdr.Hdr_html_first() && cfg.Toc_show() && !page.Hdr_mgr().Toc_manual()) { // __TOC__ not specified; place at top; NOTE: if __TOC__ was specified, then it would be placed wherever __TOC__ appears
|
||||
boolean hdr_is_1st = hdr.Hdr_html_first();
|
||||
if (hdr_is_1st && cfg.Toc__show() && !page.Hdr_mgr().Toc_manual()) { // __TOC__ not specified; place at top; NOTE: if __TOC__ was specified, then it would be placed wherever __TOC__ appears
|
||||
wiki.Html_mgr().Toc_mgr().Html(ctx.Cur_page(), hctx, src, bfr);
|
||||
}
|
||||
int hdr_len = hdr.Hdr_len();
|
||||
if (hdr_len > 0) { // NOTE: need to check hdr_len b/c it could be dangling
|
||||
Para_assert_tag_starts_on_nl(bfr, hdr.Src_bgn());
|
||||
if ( cfg.Hdr__div_wrapper() // div_wrapper enabled
|
||||
&& !hdr_is_1st // not 1st <h#>; 2nd and up will close previous <#>
|
||||
)
|
||||
bfr.Add(Tag_hdr__div_wrapper_end); // add </div>
|
||||
bfr.Add(Tag_hdr_bgn).Add_int(hdr_len, 1, 1);
|
||||
if (cfg.Toc_show()) {
|
||||
if (cfg.Toc__show()) {
|
||||
bfr.Add_byte(Tag__end);
|
||||
bfr.Add(Bry_hdr_bgn);
|
||||
bfr.Add(hdr.Hdr_html_id());
|
||||
@ -128,12 +135,14 @@ public class Xoh_html_wtr {
|
||||
Write_tkn(bfr, ctx, hctx, src, hdr, i, hdr.Subs_get(i));
|
||||
if (hdr_len > 0) { // NOTE: need to check hdr_len b/c it could be dangling
|
||||
if (hdr.Hdr_end_manual() > 0) bfr.Add_byte_repeat(Byte_ascii.Eq, hdr.Hdr_end_manual());
|
||||
if (cfg.Toc_show()) {
|
||||
if (cfg.Toc__show()) {
|
||||
if (hctx.Mode_is_hdump())
|
||||
bfr.Add(Xow_hzip_itm__header.Hdr_end);
|
||||
bfr.Add(Bry_hdr_end);
|
||||
}
|
||||
bfr.Add(Tag_hdr_end).Add_int(hdr_len, 1, 1).Add_byte(Tag__end).Add_byte_nl();// NOTE: do not need to check hdr_len b/c it is impossible for end to occur without bgn
|
||||
if ( cfg.Hdr__div_wrapper()) // div_wrapper enabled
|
||||
bfr.Add(Tag_hdr__div_wrapper_bgn); // add <div>
|
||||
}
|
||||
}
|
||||
public void Apos(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_apos_tkn apos) {
|
||||
@ -231,7 +240,7 @@ public class Xoh_html_wtr {
|
||||
case Xop_list_tkn_.List_itmTyp_dd: tag = Tag_list_itm_dd_end; break;
|
||||
default: throw Err_.unhandled(type);
|
||||
}
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.NewLine);
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
|
||||
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
|
||||
bfr.Add(tag);
|
||||
}
|
||||
@ -240,7 +249,7 @@ public class Xoh_html_wtr {
|
||||
bfr.Add_byte_space();
|
||||
else {
|
||||
if (tkn.Nl_tid() == Xop_nl_tkn.Tid_char) {
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.NewLine);
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -252,7 +261,7 @@ public class Xoh_html_wtr {
|
||||
if (hctx.Mode_is_alt())
|
||||
bfr.Add_byte_space();
|
||||
else
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.NewLine);
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
|
||||
}
|
||||
switch (para.Para_end()) {
|
||||
case Xop_para_tkn.Tid_none: break;
|
||||
@ -353,7 +362,7 @@ public class Xoh_html_wtr {
|
||||
case Xop_xnde_tag_.Tid_li: {
|
||||
byte[] name = tag.Name_bry();
|
||||
int bfr_len = bfr.Len();
|
||||
if (bfr_len > 0 && bfr.Bfr()[bfr_len - 1] != Byte_ascii.NewLine) bfr.Add_byte_nl(); // NOTE: always add nl before li else some lists will merge and force long horizontal bar; EX:w:Music
|
||||
if (bfr_len > 0 && bfr.Bfr()[bfr_len - 1] != Byte_ascii.Nl) bfr.Add_byte_nl(); // NOTE: always add nl before li else some lists will merge and force long horizontal bar; EX:w:Music
|
||||
if (xnde.Tag_visible()) {
|
||||
bfr.Add_byte(Tag__bgn).Add(name);
|
||||
if (xnde.Atrs_bgn() > Xop_tblw_wkr.Atrs_ignore_check) Xnde_atrs(tag_id, hctx, src, xnde.Atrs_bgn(), xnde.Atrs_end(), xnde.Atrs_ary(), bfr);
|
||||
@ -567,7 +576,7 @@ public class Xoh_html_wtr {
|
||||
if (hctx.Mode_is_alt()) // add \s for each \n
|
||||
bfr.Add_byte_space();
|
||||
else {
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.NewLine);
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
|
||||
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
|
||||
// boolean para_mode = tblw_bgn && tbl_para && depth == 1; // DELETE: old code; adding <p> to handle strange mozilla key down behavior on linux; DATE:2013-03-30
|
||||
// if (para_mode) {bfr.Add(Xoh_consts.P_bgn);}
|
||||
@ -587,11 +596,11 @@ public class Xoh_html_wtr {
|
||||
}
|
||||
else {
|
||||
--indent_level;
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.NewLine);
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
|
||||
if (indent_level > 0) bfr.Add_byte_repeat(Byte_ascii.Space, indent_level * 2);
|
||||
bfr.Add(end);
|
||||
// if (para_mode) {bfr.Add(Xoh_consts.P_end);} // DELETE: old code; adding <p> to handle strange mozilla key down behavior on linux; DATE:2013-03-30
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.NewLine);
|
||||
bfr.Add_byte_if_not_last(Byte_ascii.Nl);
|
||||
// bfr.Add_byte_nl();
|
||||
}
|
||||
}
|
||||
@ -613,6 +622,7 @@ public class Xoh_html_wtr {
|
||||
, Tag_para_bgn = Bry_.new_a7("<p>"), Tag_para_end = Bry_.new_a7("</p>"), Tag_para_mid = Bry_.new_a7("</p>\n\n<p>")
|
||||
, Tag_pre_bgn = Bry_.new_a7("<pre>"), Tag_pre_end = Bry_.new_a7("</pre>")
|
||||
;
|
||||
private static final byte[] Tag_hdr__div_wrapper_bgn = Bry_.new_a7("<div>\n"), Tag_hdr__div_wrapper_end = Bry_.new_a7("</div>\n");
|
||||
public static final byte Tag__bgn = Byte_ascii.Lt, Tag__end = Byte_ascii.Gt;
|
||||
public static final byte Dir_spr_http = Byte_ascii.Slash;
|
||||
private int indent_level = 0;
|
||||
|
@ -17,8 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.html; import gplx.*; import gplx.xowa.*;
|
||||
public class Xoh_html_wtr_cfg {
|
||||
public boolean Toc_show() {return toc_show;} public Xoh_html_wtr_cfg Toc_show_(boolean v) {toc_show = v; return this;} private boolean toc_show;
|
||||
public boolean Lnki_id() {return lnki_id;} public Xoh_html_wtr_cfg Lnki_id_(boolean v) {lnki_id = v; return this;} private boolean lnki_id;
|
||||
public boolean Lnki_title() {return lnki_title;} public Xoh_html_wtr_cfg Lnki_title_(boolean v) {lnki_title = v; return this;} private boolean lnki_title;
|
||||
public boolean Lnki_visited() {return lnki_visited;} public Xoh_html_wtr_cfg Lnki_visited_(boolean v) {lnki_visited = v; return this;} private boolean lnki_visited;
|
||||
public boolean Toc__show() {return toc__show;} public Xoh_html_wtr_cfg Toc__show_(boolean v) {toc__show = v; return this;} private boolean toc__show;
|
||||
public boolean Lnki__id() {return lnki__id;} public Xoh_html_wtr_cfg Lnki__id_y_() {lnki__id = Bool_.Y; return this;} private boolean lnki__id;
|
||||
public boolean Lnki__title() {return lnki__title;} public Xoh_html_wtr_cfg Lnki__title_(boolean v) {lnki__title = v; return this;} private boolean lnki__title;
|
||||
public boolean Lnki__visited() {return lnki__visited;} public Xoh_html_wtr_cfg Lnki_visited_y_() {lnki__visited = true; return this;} private boolean lnki__visited;
|
||||
public boolean Hdr__div_wrapper() {return hdr__div_wrapper;} public Xoh_html_wtr_cfg Hdr__div_wrapper_(boolean v) {hdr__div_wrapper = v; return this;} private boolean hdr__div_wrapper;
|
||||
}
|
||||
|
@ -28,14 +28,14 @@ public class Xoh_html_wtr_tst {
|
||||
@Test public void Lnki_tail_trg() {fxt.Test_parse_page_wiki_str("[[a]]b" , "<a href=\"/wiki/A\">ab</a>");}
|
||||
@Test public void Lnki_tail_caption() {fxt.Test_parse_page_wiki_str("[[a|b]]c" , "<a href=\"/wiki/A\">bc</a>");}
|
||||
@Test public void Lnki_title() {
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_wiki_str("[[a|b]]", "<a href=\"/wiki/A\" title=\"A\">b</a>");
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Lnki_title_page_text() {
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_wiki_str("[[a_b]]", "<a href=\"/wiki/A_b\" title=\"A b\">a_b</a>");
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Lnki_category() {fxt.Test_parse_page_wiki_str("[[Category:A]]" , "");} // NOTE: Category does not get written in main page bfr
|
||||
@Test public void Lnki_category_force() {fxt.Test_parse_page_wiki_str("[[:Category:A]]" , "<a href=\"/wiki/Category:A\">Category:A</a>");}
|
||||
|
@ -36,7 +36,7 @@ public class Xob_redlink_mkr_cmd extends Xob_itm_basic_base implements Xob_cmd {
|
||||
try {
|
||||
while (rdr.Move_next()) {
|
||||
// switch html_db if needed
|
||||
int html_db_id = rdr.Read_int(page_tbl.Fld_html_db_id().Name());
|
||||
int html_db_id = rdr.Read_int(page_tbl.Fld_html_db_id());
|
||||
if (html_db_id != cur_html_db_id) {
|
||||
if (html_dump_tbl != null) html_dump_tbl.Conn().Txn_end();
|
||||
html_dump_tbl = wiki.Data__core_mgr().Dbs__get_at(html_db_id).Tbl__html();
|
||||
|
@ -52,7 +52,7 @@ class Xow_hzip_mgr_fxt {
|
||||
parser.Parse_page_all_clear(root, ctx, tkn_mkr, html_bry);
|
||||
Xoh_wtr_ctx hctx = Xoh_wtr_ctx.Hdump;
|
||||
Xoh_html_wtr html_wtr = wiki.Html_mgr().Html_wtr();
|
||||
html_wtr.Cfg().Toc_show_(Bool_.Y); // needed for hdr to show <span class='mw-headline' id='A'>
|
||||
html_wtr.Cfg().Toc__show_(Bool_.Y); // needed for hdr to show <span class='mw-headline' id='A'>
|
||||
html_wtr.Write_all(bfr, ctx, hctx, html_bry, root);
|
||||
Tfds.Eq(expd, bfr.Xto_str_and_clear());
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ public class Xoh_file_wtr__basic {
|
||||
, byte[] lnki_ttl, Xof_ext orig_ext, byte[] lnki_href, byte[] img_view_src, byte[] img_orig_src, byte[] alt) {
|
||||
if (lnki_halign == Xop_lnki_align_h.Center) bfr.Add(Div_center_bgn);
|
||||
Bry_bfr tmp_bfr = bfr_mkr.Get_k004();
|
||||
byte[] anchor_title = html_wtr.Cfg().Lnki_title()
|
||||
byte[] anchor_title = html_wtr.Cfg().Lnki__title()
|
||||
? Arg_anchor_title(tmp_bfr, src, lnki, lnki_ttl, anchor_title_wkr) // NOTE: Arg_anchor_title should only be called if there is no caption, else refs may not show; DATE:2014-03-05
|
||||
: Bry_.Empty;
|
||||
Xoh_file_img_wkr lnki_file_wkr = lnki.Lnki_file_wkr(); if (lnki_file_wkr == null) lnki_file_wkr = html_fmtr;
|
||||
|
@ -21,13 +21,13 @@ public class Xoh_file_wtr_basic_tst {
|
||||
private Xop_fxt fxt = new Xop_fxt();
|
||||
@Before public void init() {fxt.Reset();}
|
||||
@Test public void Img_full() { // PURPOSE: full with title was outputting invalid html; DATE:2013-12-31
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_wiki_str
|
||||
( "[[File:A.png]]"
|
||||
, String_.Concat_lines_nl_skip_last
|
||||
( "<a href=\"/wiki/File:A.png\" class=\"image\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a>" // NOTE: used to output class=\"image\"A.png
|
||||
));
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Img_embed() {
|
||||
fxt.Test_parse_page_wiki_str("[[File:A.png|9x8px|alt=abc]]", Xop_fxt.html_img_none("File:A.png", "abc", "file:///mem/wiki/repo/trg/thumb/7/0/A.png/9px.png", "A.png"));
|
||||
@ -185,65 +185,65 @@ public class Xoh_file_wtr_basic_tst {
|
||||
fxt.Init_para_n_();
|
||||
}
|
||||
@Test public void Img_title() {
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
Tst_img_title("[[File:A.png|frameless|a b]]", "a b");
|
||||
Tst_img_title("[[File:A.png|thumb|a b]]", "Enlarge"); // caption should not replace text
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Title_escape() { // PURPOSE: escape quotes in title; PAGE:none; DATE:2014-10-27
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_wiki_str("[[A\"B]]", "<a href=\"/wiki/A%22B\" title=\"A"B\">A\"B</a>");
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Img_title__caption_has_lnki() { // PURPOSE: caption with lnki should show in title; PAGE:en.w:Earth; DATE:2014-08-06
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
Tst_img_title("[[File:A.png|frameless|[[A]]]]" , "A"); // ttl only
|
||||
Tst_img_title("[[File:A.png|frameless|[[A|B]]]]" , "B"); // caption
|
||||
Tst_img_title("[[File:A.png|frameless|[[A]]b]]" , "Ab"); // tail
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Lnki_alt_is_text() { // PURPOSE: (a) alt should default to caption; (b) alt should not show html chars (like <a src=")
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_all_str
|
||||
( "[[File:A.png|a[[b]]c]]"
|
||||
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"aBc\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"abc\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a>"
|
||||
);
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Alt_ignore_apos() {// PURPOSE: alt should ignore apos; EX: [[File:A.png|''A'']] should have alt of A; DATE:2013-10-25
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_all_str
|
||||
( "[[File:A.png|''b'']]"
|
||||
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"b\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"b\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a>"
|
||||
);
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Alt_ignore_lnke() {// PURPOSE: alt should ignore lnke
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_all_str
|
||||
( "[[File:A.png|b[http://c.org d] e]]"
|
||||
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"bd e\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"bd e\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a>"
|
||||
);
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Alt_ignore_list() {// PURPOSE: alt should ignore list
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_all_str
|
||||
( "[[File:A.png|b\n*c]]"
|
||||
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"bc\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"b*c\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a>"
|
||||
);
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Alt_ignore_tblw() {// PURPOSE: alt should ignore tblw
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_all_str
|
||||
( "[[File:A.png|\n{|\n|-\n|b\n|}\n]]"
|
||||
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"b \" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\" b \" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a>"
|
||||
);
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Alt_ignore_para() {// PURPOSE: alt should ignore para
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Init_para_y_();
|
||||
fxt.Test_parse_page_all_str
|
||||
( "[[File:A.png|b\nc]]"
|
||||
@ -252,15 +252,15 @@ public class Xoh_file_wtr_basic_tst {
|
||||
, "</p>"
|
||||
));
|
||||
fxt.Init_para_n_();
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Lnki_empty_alt_is_omitted() {// PURPOSE: empty alt should be ignored; DATE:2013-07-30
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_all_str
|
||||
( "[[File:A.png|a|alt=]]"
|
||||
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"a\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a>"
|
||||
);
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
@Test public void Href_anchor_leading_space() { // PURPOSE: space before anchor should be preserved, not " " -> "#"
|
||||
fxt.Test_parse_page_all_str("[[A #b]]", "<a href=\"/wiki/A#b\">A #b</a>");
|
||||
@ -275,13 +275,13 @@ public class Xoh_file_wtr_basic_tst {
|
||||
fxt.Test_parse_page_all_str("[[Help:a #b]]", "<a href=\"/wiki/Help:A#b\">Help:A #b</a>");
|
||||
}
|
||||
@Test public void Lnki_caption_nested_file() { // PURPOSE: nested lnki in caption breaks alt with html chars; EX:de.w:Wien; DATE:2013-12-16
|
||||
fxt.Wtr_cfg().Lnki_title_(true);
|
||||
fxt.Wtr_cfg().Lnki__title_(true);
|
||||
fxt.Test_parse_page_wiki_str("[[File:A.png|none|[[File:B.png|20px|d]] c]]", String_.Concat_lines_nl_skip_last
|
||||
( "<div class=\"floatnone\">"
|
||||
, "<a href=\"/wiki/File:A.png\" class=\"image\" title=\"d c\" xowa_title=\"A.png\"><img id=\"xowa_file_img_0\" alt=\"d c\" src=\"file:///mem/wiki/repo/trg/orig/7/0/A.png\" width=\"0\" height=\"0\" /></a></div>"
|
||||
, ""
|
||||
));
|
||||
fxt.Wtr_cfg().Lnki_title_(false);
|
||||
fxt.Wtr_cfg().Lnki__title_(false);
|
||||
}
|
||||
private void Tst_img_title(String raw, String expd_ttl) {
|
||||
String actl = fxt.Exec_parse_page_wiki_as_str(raw);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user