diff --git a/100_core/src_110_primitive/gplx/Int_.java b/100_core/src_110_primitive/gplx/Int_.java index fe54fc711..0d2db1ca9 100644 --- a/100_core/src_110_primitive/gplx/Int_.java +++ b/100_core/src_110_primitive/gplx/Int_.java @@ -36,6 +36,10 @@ public class Int_ implements GfoInvkAble { rv[i] = ary[i]; return rv; } + public static void Ary_copy_to(int[] src, int src_len, int[] trg) { + for (int i = 0; i < src_len; ++i) + trg[i] = src[i]; + } public static int[] AryRng(int bgn, int end) { int len = end - bgn + 1; int[] rv = new int[len]; diff --git a/100_core/src_120_basicDataType/gplx/Io_url.java b/100_core/src_120_basicDataType/gplx/Io_url.java index 08d3e46b2..f1294bba5 100644 --- a/100_core/src_120_basicDataType/gplx/Io_url.java +++ b/100_core/src_120_basicDataType/gplx/Io_url.java @@ -26,8 +26,10 @@ public class Io_url implements CompareAble, EqAble, ParseAble, GfoInvkAble { //_ // catch (Exception e) {throw Err_.err_(e, "Http_file_bry");} // } public String To_http_file_str() {return Http_file_str + Http_file_str_encoder.Encode_str(raw);} - public byte[] To_http_file_bry() {return Bry_.Add(Http_file_bry, Http_file_str_encoder.Encode_bry(raw));} - public static Url_encoder_interface Http_file_str_encoder; + public byte[] To_http_file_bry() { + return Bry_.Add(Http_file_bry, Http_file_str_encoder.Encode_bry(raw)); + } + public static Url_encoder_interface Http_file_str_encoder = Url_encoder_interface_same._; public static final String Http_file_str = "file:///"; public static final int Http_file_len = String_.Len(Http_file_str); diff --git a/100_core/src_120_basicDataType/gplx/Url_encoder_interface.java b/100_core/src_120_basicDataType/gplx/Url_encoder_interface.java index 10e4013b0..a5bcc8d93 100644 --- a/100_core/src_120_basicDataType/gplx/Url_encoder_interface.java +++ b/100_core/src_120_basicDataType/gplx/Url_encoder_interface.java @@ -20,3 +20,8 @@ public interface Url_encoder_interface { String Encode_str(String v); byte[] Encode_bry(String v); } +class Url_encoder_interface_same implements Url_encoder_interface { + public String Encode_str(String v) {return v;} + public byte[] Encode_bry(String v) {return Bry_.new_utf8_(v);} + public static final Url_encoder_interface_same _ = new Url_encoder_interface_same(); Url_encoder_interface_same() {} +} diff --git a/100_core/src_120_basicDataType/gplx/Yn.java b/100_core/src_120_basicDataType/gplx/Yn.java index 6b00138d9..08ca4de48 100644 --- a/100_core/src_120_basicDataType/gplx/Yn.java +++ b/100_core/src_120_basicDataType/gplx/Yn.java @@ -40,6 +40,25 @@ public class Yn { return v_int == Bool_.Y_int; } public static String Xto_str(boolean v) {return v ? "y" : "n";} + public static String Xto_nullable_str(byte v) { + switch (v) { + case Bool_.Y_byte: return "y"; + case Bool_.N_byte: return "n"; + case Bool_.__byte: return "?"; + default: throw Err_.unhandled(v); + } + } + public static byte Xto_nullable_byte(String v) { + if (v != null && String_.Len(v) == 1) { + char c = String_.CharAt(v, 0); + switch (c) { + case 'y': return Bool_.Y_byte; + case 'n': return Bool_.N_byte; + case '?': return Bool_.__byte; + } + } + throw Err_.unhandled(v); + } public static boolean store_bool_or(SrlMgr mgr, String key, boolean or) { String v = mgr.SrlStrOr(key, ""); return mgr.Type_rdr() ? parse_or_(v, or) : or; diff --git a/100_core/src_150_text/gplx/intl/Utf8_.java b/100_core/src_150_text/gplx/intl/Utf8_.java index dfc0acfb2..b12347adf 100644 --- a/100_core/src_150_text/gplx/intl/Utf8_.java +++ b/100_core/src_150_text/gplx/intl/Utf8_.java @@ -17,6 +17,17 @@ along with this program. If not, see . */ package gplx.intl; import gplx.*; public class Utf8_ { + public static int Len_of_bry(byte[] ary) { + if (ary == null) return 0; + int rv = 0; + int pos = 0, len = ary.length; + while (pos < len) { + int char_len = Len_of_char_by_1st_byte(ary[pos]); + ++rv; + pos += char_len; + } + return rv; + } public static int Len_of_char_by_1st_byte(byte b) {// SEE:w:UTF-8 int i = b & 0xff; // PATCH.JAVA:need to convert to unsigned byte switch (i) { diff --git a/400_xowa/src/gplx/core/brys/Bry_rdr.java b/400_xowa/src/gplx/core/brys/Bry_rdr.java index ea4dc2ebf..e92505135 100644 --- a/400_xowa/src/gplx/core/brys/Bry_rdr.java +++ b/400_xowa/src/gplx/core/brys/Bry_rdr.java @@ -21,12 +21,23 @@ public class Bry_rdr { public Bry_rdr Src_(byte[] src, int src_len) {this.src = src; this.src_len = src_len; pos = 0; return this;} public Bry_rdr Src_(byte[] src) {return Src_(src, src.length);} public int Pos() {return pos;} public Bry_rdr Pos_(int v) {this.pos = v; return this;} private int pos; public boolean Pos_is_eos() {return pos == src_len;} + public void Pos_add_one() {++pos;} public int Or_int() {return or_int;} public void Or_int_(int v) {or_int = v;} private int or_int = Int_.MinValue; public byte[] Or_bry() {return or_bry;} public void Or_bry_(byte[] v) {or_bry = v;} private byte[] or_bry; + public int Find_fwd__pos_at_lhs(byte[] find_bry) {return Find_fwd__pos_at(find_bry, Bool_.N);} + public int Find_fwd__pos_at_rhs(byte[] find_bry) {return Find_fwd__pos_at(find_bry, Bool_.Y);} + public int Find_fwd__pos_at(byte[] find_bry, boolean pos_at_rhs) { + int find_pos = Bry_finder.Find_fwd(src, find_bry, pos, src_len); + if (pos_at_rhs) find_pos += find_bry.length; + if (find_pos != Bry_finder.Not_found) pos = find_pos; + return find_pos; + } 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(byte to_char) { int bgn = pos; int rv = 0; + int negative = 1; while (pos < src_len) { byte b = src[pos++]; switch (b) { @@ -34,11 +45,17 @@ public class Bry_rdr { case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: rv = (rv * 10) + (b - Byte_ascii.Num_0); break; + case Byte_ascii.Dash: + if (negative == -1) // 2nd negative + return or_int; // return or_int + else // 1st negative + negative = -1; // flag negative + break; default: - return b == to_char ? rv : or_int; + return b == to_char ? rv * negative : or_int; } } - return bgn == pos ? or_int : rv; + 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_pipe() {return Read_bry_to(Byte_ascii.Pipe);} diff --git a/400_xowa/src/gplx/core/brys/Bry_rdr_tst.java b/400_xowa/src/gplx/core/brys/Bry_rdr_tst.java index 7851aa962..ce1f727bc 100644 --- a/400_xowa/src/gplx/core/brys/Bry_rdr_tst.java +++ b/400_xowa/src/gplx/core/brys/Bry_rdr_tst.java @@ -26,6 +26,11 @@ public class Bry_rdr_tst { fxt.Test_read_int(789); fxt.Test_read_int(Int_.MinValue); } + @Test public void Int_negative() { + fxt.Init_src("-1|-2"); + fxt.Test_read_int(-1); + fxt.Test_read_int(-2); + } @Test public void Bry() { fxt.Init_src("abc|d||ef"); fxt.Test_read_bry("abc"); diff --git a/400_xowa/src/gplx/html/Html_wtr.java b/400_xowa/src/gplx/html/Html_wtr.java index 120b4ec56..bbe1d26c2 100644 --- a/400_xowa/src/gplx/html/Html_wtr.java +++ b/400_xowa/src/gplx/html/Html_wtr.java @@ -63,7 +63,7 @@ public class Html_wtr { return this; } public Html_wtr Atr(byte[] key, byte[] val) { - Write_atr(bfr, atr_quote, key, val); + Write_atr_bry(bfr, Bool_.Y, atr_quote, key, val); return this; } public Html_wtr Nde_end_inline() { @@ -85,14 +85,23 @@ public class Html_wtr { public byte[] Xto_bry_and_clear() {return bfr.XtoAryAndClear();} public byte[] Xto_bry() {return bfr.XtoAry();} public String Xto_str() {return bfr.XtoStr();} - public static void Write_atr(Bry_bfr bfr, byte[] key, byte[] val) {Write_atr(bfr, Byte_ascii.Quote, key, val);} - public static void Write_atr(Bry_bfr bfr, byte atr_quote, byte[] key, byte[] val) { + public static void Write_atr_bry(Bry_bfr bfr, byte[] key, byte[] val) {Write_atr_bry(bfr, Bool_.Y, Byte_ascii.Quote, key, val);} + public static void Write_atr_bry(Bry_bfr bfr, boolean write_space, byte atr_quote, byte[] key, byte[] val) { if (Bry_.Len_eq_0(val)) return; // don't write empty - bfr.Add_byte_space(); + if (write_space) bfr.Add_byte_space(); bfr.Add(key); bfr.Add_byte(Byte_ascii.Eq); bfr.Add_byte(atr_quote); Html_utl.Escape_html_to_bfr(bfr, val, 0, val.length, false, false, false, true, true); bfr.Add_byte(atr_quote); } + public static void Write_atr_int(Bry_bfr bfr, byte[] key, int val) {Write_atr_int(bfr, Bool_.Y, Byte_ascii.Quote, key, val);} + public static void Write_atr_int(Bry_bfr bfr, boolean write_space, byte atr_quote, byte[] key, int val) { + if (write_space) bfr.Add_byte_space(); + bfr.Add(key); + bfr.Add_byte(Byte_ascii.Eq); + bfr.Add_byte(atr_quote); + bfr.Add_int_variable(val); + bfr.Add_byte(atr_quote); + } } diff --git a/400_xowa/src/gplx/intl/String_surrogate_utl.java b/400_xowa/src/gplx/intl/String_surrogate_utl.java new file mode 100644 index 000000000..568ed9321 --- /dev/null +++ b/400_xowa/src/gplx/intl/String_surrogate_utl.java @@ -0,0 +1,35 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.intl; import gplx.*; +public class String_surrogate_utl { + public int Byte_pos() {return byte_pos;} int byte_pos; + public int Count_surrogates__char_idx(byte[] src, int src_len, int byte_bgn, int char_idx) {return Count_surrogates(src, src_len, byte_bgn, Bool_.Y, char_idx);} + public int Count_surrogates__codepoint_idx1(byte[] src, int src_len, int byte_bgn, int codepoint_idx) {return Count_surrogates(src, src_len, byte_bgn, Bool_.N, codepoint_idx);} + private int Count_surrogates(byte[] src, int src_len, int byte_bgn, boolean stop_idx_is_char, int stop_idx) { + int char_count = 0, codepoint_count = 0; + byte_pos = byte_bgn; + while (true) { + if (stop_idx == (stop_idx_is_char ? char_count : codepoint_count)) return codepoint_count - char_count; + if (byte_pos >= src_len) throw Err_.new_("codepoint_idx is not in string; stop_idx={0} stop_idx_is_char={1} byte_bgn={2} string={3}", stop_idx, stop_idx_is_char, byte_bgn, String_.new_utf8_(src)); + int char_len_in_bytes = gplx.intl.Utf8_.Len_of_char_by_1st_byte(src[byte_pos]); + ++char_count; // char_count always incremented by 1 + codepoint_count += (char_len_in_bytes == 4) ? 2 : 1; // codepoint_count incremented by 2 if surrogate pair; else 1 + byte_pos += char_len_in_bytes; + } + } +} diff --git a/400_xowa/src/gplx/intl/String_surrogate_utl_tst.java b/400_xowa/src/gplx/intl/String_surrogate_utl_tst.java new file mode 100644 index 000000000..c8e7d333e --- /dev/null +++ b/400_xowa/src/gplx/intl/String_surrogate_utl_tst.java @@ -0,0 +1,56 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.intl; import gplx.*; +import org.junit.*; +public class String_surrogate_utl_tst { + @Before public void init() {fxt.Clear();} private String_surrogate_utl_fxt fxt = new String_surrogate_utl_fxt(); + @Test public void Char_idx() { + String test_str = "aé𡼾bî𡼾"; + fxt.Test_count_surrogates__char_idx (test_str, 0, 1, 0, 1); // a + fxt.Test_count_surrogates__char_idx (test_str, 0, 2, 0, 3); // aé + fxt.Test_count_surrogates__char_idx (test_str, 0, 3, 1, 7); // aé𡼾 + fxt.Test_count_surrogates__char_idx (test_str, 7, 1, 0, 8); // b + fxt.Test_count_surrogates__char_idx (test_str, 7, 2, 0, 10); // bî + fxt.Test_count_surrogates__char_idx (test_str, 7, 3, 1, 14); // bî𡼾 + fxt.Test_count_surrogates__char_idx (test_str, 0, 6, 2, 14); // aé𡼾bî𡼾 + } + @Test public void Codepoint_idx() { + String test_str = "aé𡼾bî𡼾"; + fxt.Test_count_surrogates__codepoint_idx (test_str, 0, 1, 0, 1); // a + fxt.Test_count_surrogates__codepoint_idx (test_str, 0, 2, 0, 3); // aé + fxt.Test_count_surrogates__codepoint_idx (test_str, 0, 4, 1, 7); // aé𡼾 + fxt.Test_count_surrogates__codepoint_idx (test_str, 7, 1, 0, 8); // b + fxt.Test_count_surrogates__codepoint_idx (test_str, 7, 2, 0, 10); // bî + fxt.Test_count_surrogates__codepoint_idx (test_str, 7, 4, 1, 14); // bî𡼾 + fxt.Test_count_surrogates__codepoint_idx (test_str, 0, 8, 2, 14); // aé𡼾bî𡼾 + } +} +class String_surrogate_utl_fxt { + private String_surrogate_utl codepoint_utl = new String_surrogate_utl(); + public void Clear() {} + public void Test_count_surrogates__char_idx(String src_str, int bgn_byte, int char_idx, int expd_count, int expd_pos) { + byte[] src_bry = Bry_.new_utf8_(src_str); int src_len = src_bry.length; + Tfds.Eq(expd_count , codepoint_utl.Count_surrogates__char_idx(src_bry, src_len, bgn_byte, char_idx)); + Tfds.Eq(expd_pos , codepoint_utl.Byte_pos()); + } + public void Test_count_surrogates__codepoint_idx(String src_str, int bgn_byte, int char_idx, int expd_count, int expd_pos) { + byte[] src_bry = Bry_.new_utf8_(src_str); int src_len = src_bry.length; + Tfds.Eq(expd_count , codepoint_utl.Count_surrogates__codepoint_idx1(src_bry, src_len, bgn_byte, char_idx), "count"); + Tfds.Eq(expd_pos , codepoint_utl.Byte_pos(), "pos"); + } +} diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java index 635d233e5..7990544e3 100644 --- a/400_xowa/src/gplx/xowa/Xoa_app_.java +++ b/400_xowa/src/gplx/xowa/Xoa_app_.java @@ -23,7 +23,7 @@ public class Xoa_app_ { boot_mgr.Run(args); } public static final String Name = "xowa"; - public static final String Version = "1.8.4.1"; + public static final String Version = "1.9.1.1"; public static String Build_date = "2012-12-30 00:00:00"; public static String Op_sys; public static String User_agent = ""; diff --git a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java index 6e7bf6cc4..453dab33c 100644 --- a/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java +++ b/400_xowa/src/gplx/xowa/apps/fsys/Xoa_fsys_mgr.java @@ -23,21 +23,23 @@ public class Xoa_fsys_mgr implements GfoInvkAble { bin_plat_dir = root_dir.GenSubDir("bin").GenSubDir(bin_dir_name); bin_extensions_dir = bin_any_dir.GenSubDir_nest("xowa", "xtns"); file_dir = root_dir.GenSubDir("file"); + file_dir_bry_len = file_dir.To_http_file_bry().length; wiki_dir = root_dir.GenSubDir("wiki"); cfg_lang_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "lang", "core"); cfg_wiki_core_dir = bin_any_dir.GenSubDir_nest("xowa", "cfg", "wiki", "core"); temp_dir = root_dir.GenSubDir("tmp"); app_mgr = new Launcher_app_mgr(app); } - public Io_url Root_dir() {return root_dir;} private Io_url root_dir; - public Io_url File_dir() {return file_dir;} private Io_url file_dir; + public Io_url Root_dir() {return root_dir;} private final Io_url root_dir; + public Io_url File_dir() {return file_dir;} private final Io_url file_dir; + public int File_dir_bry_len() {return file_dir_bry_len;} private final int file_dir_bry_len; public Io_url Wiki_dir() {return wiki_dir;} public Xoa_fsys_mgr Wiki_dir_(Io_url v) {wiki_dir = v; return this;} private Io_url wiki_dir; - public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private Io_url cfg_lang_core_dir; - public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private Io_url cfg_wiki_core_dir; + public Io_url Cfg_lang_core_dir() {return cfg_lang_core_dir;} private final Io_url cfg_lang_core_dir; + public Io_url Cfg_wiki_core_dir() {return cfg_wiki_core_dir;} private final Io_url cfg_wiki_core_dir; public Io_url Temp_dir() {return temp_dir;} public Xoa_fsys_mgr Temp_dir_(Io_url v) {temp_dir = v; return this;} private Io_url temp_dir; // set to /xowa/user//temp - public Io_url Bin_any_dir() {return bin_any_dir;} private Io_url bin_any_dir; - public Io_url Bin_extensions_dir() {return bin_extensions_dir;} private Io_url bin_extensions_dir; - public Io_url Bin_plat_dir() {return bin_plat_dir;} private Io_url bin_plat_dir; + public Io_url Bin_any_dir() {return bin_any_dir;} private final Io_url bin_any_dir; + public Io_url Bin_extensions_dir() {return bin_extensions_dir;} private final Io_url bin_extensions_dir; + public Io_url Bin_plat_dir() {return bin_plat_dir;} private final Io_url bin_plat_dir; public Io_url Bin_db_dir() {return bin_any_dir.GenSubDir_nest("sql", "xowa");} public Io_url Bin_data_os_cfg_fil() {return bin_plat_dir.GenSubFil_nest("xowa", "cfg", Xoa_gfs_mgr.Cfg_os);} public Launcher_app_mgr App_mgr() {return app_mgr;} Launcher_app_mgr app_mgr; diff --git a/400_xowa/src/gplx/xowa/files/Xof_html_elem.java b/400_xowa/src/gplx/xowa/files/Xof_html_elem.java index b9155581d..2875423cc 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_html_elem.java +++ b/400_xowa/src/gplx/xowa/files/Xof_html_elem.java @@ -18,4 +18,10 @@ along with this program. If not, see . package gplx.xowa.files; import gplx.*; import gplx.xowa.*; public class Xof_html_elem { public static final byte Tid_none = 0, Tid_img = 1, Tid_vid = 2, Tid_gallery = 3, Tid_gallery_v2 = 4, Tid_imap = 5; + public static boolean Tid_is_file(byte tid) { + switch (tid) { + case Tid_img: case Tid_vid: return true; + default: return false; + } + } } diff --git a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java index e2d593351..c90a2a8f7 100644 --- a/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java +++ b/400_xowa/src/gplx/xowa/files/Xof_xfer_itm.java @@ -53,7 +53,6 @@ public class Xof_xfer_itm implements Xof_file_itm { } private Xof_repo_itm trg_repo; public int Trg_repo_idx() {return trg_repo_idx;} public Xof_xfer_itm Trg_repo_idx_(int trg_repo_idx) {this.trg_repo_idx = trg_repo_idx; return this;} private int trg_repo_idx = Xof_meta_itm.Repo_unknown; public byte[] Trg_repo_root() {return trg_repo_root;} private byte[] trg_repo_root = Bry_.Empty; // HACK: needed for hdump - public byte[] Html_view_src_rel() {return html_view_src_rel;} public void Html_view_src_rel_(byte[] v) {html_view_src_rel = v;} private byte[] html_view_src_rel; private byte[] Trg_html(byte mode_id, int width) {return url_bldr.Set_trg_html_(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_bry();} public Io_url Trg_file(byte mode_id, int width) {return url_bldr.Set_trg_file_(mode_id, trg_repo, lnki_ttl, lnki_md5, lnki_ext, width, lnki_thumbtime, lnki_page).Xto_url();} public Xof_url_bldr Url_bldr(){ return url_bldr;} @@ -65,7 +64,7 @@ public class Xof_xfer_itm implements Xof_file_itm { img_is_thumbable = false; orig_file_len = 0; // NOTE: cannot be -1, or else will always download orig; see ext rule chk and (orig_file_len < 0) lnki_redirect = null; lnki_ttl = null; lnki_md5 = null; lnki_ext = null; - html_orig_src = html_view_src = html_view_src_rel = Bry_.Empty; + html_orig_src = html_view_src = Bry_.Empty; trg_repo_idx = Int_.Neg1; meta_itm = null; html_uid = Int_.Neg1; html_elem_tid = Xof_html_elem.Tid_none; return this; @@ -76,7 +75,7 @@ public class Xof_xfer_itm implements Xof_file_itm { rv.img_is_thumbable = img_is_thumbable; rv.orig_w = orig_w; rv.orig_h = orig_h; rv.orig_file_len = orig_file_len; rv.lnki_redirect = lnki_redirect; rv.lnki_ttl = lnki_ttl; rv.lnki_md5 = lnki_md5; rv.lnki_ext = lnki_ext; - rv.html_w = html_w; rv.html_h = html_h; rv.html_view_src = html_view_src; rv.html_orig_src = html_orig_src; rv.html_view_src_rel = html_view_src_rel; + rv.html_w = html_w; rv.html_h = html_h; rv.html_view_src = html_view_src; rv.html_orig_src = html_orig_src; rv.file_w = file_w; rv.trg_repo_idx = trg_repo_idx; rv.trg_repo_root = trg_repo_root; @@ -104,7 +103,6 @@ public class Xof_xfer_itm implements Xof_file_itm { this.html_pass = true; this.file_found = true; } - public Xof_xfer_itm Init_for_test__hdump(int uid, int img_w, int img_h, byte[] lnki_ttl, byte[] html_view_src_rel) {this.html_uid = uid; this.html_w = img_w; this.html_h = img_h; this.lnki_ttl = lnki_ttl; this.html_view_src_rel = html_view_src_rel; return this;} public void Init_for_test__img(int html_w, int html_h, byte[] html_view_src, byte[] html_orig_src) {this.html_w = html_w; this.html_h = html_h; this.html_view_src = html_view_src; this.html_orig_src = html_orig_src;} public Xof_xfer_itm Set__ttl(byte[] ttl, byte[] redirect) { this.lnki_redirect = redirect; diff --git a/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java b/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java index 244aaf4c7..19d2f4a23 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java +++ b/400_xowa/src/gplx/xowa/files/gui/Js_img_mgr.java @@ -20,20 +20,20 @@ import gplx.xowa.xtns.gallery.*; import gplx.xowa.files.fsdb.*; import gplx.xowa.gui.views.*; public class Js_img_mgr { public static void Update_img(Xoa_page page, Xof_xfer_itm itm) { - Js_img_mgr.Update_img(page, itm.Html_uid(), itm.Lnki_type(), itm.Html_elem_tid(), itm.Html_w(), itm.Html_h(), String_.new_utf8_(itm.Html_view_src()), itm.Orig_w(), itm.Orig_h(), String_.new_utf8_(itm.Html_orig_src()), itm.Gallery_mgr_h(), itm.Html_img_wkr()); + Js_img_mgr.Update_img(page, itm.Html_uid(), itm.Lnki_type(), itm.Html_elem_tid(), itm.Html_w(), itm.Html_h(), String_.new_utf8_(itm.Html_view_src()), itm.Orig_w(), itm.Orig_h(), String_.new_utf8_(itm.Html_orig_src()), itm.Lnki_ttl(), itm.Gallery_mgr_h(), itm.Html_img_wkr()); } public static void Update_img(Xoa_page page, Xof_fsdb_itm itm) { - Js_img_mgr.Update_img(page, itm.Html_uid(), itm.Lnki_type(), itm.Html_elem_tid(), itm.Html_w(), itm.Html_h(), itm.Html_url().To_http_file_str(), itm.Orig_w(), itm.Orig_h(), itm.Html_orig_url().To_http_file_str(), itm.Gallery_mgr_h(), itm.Html_img_wkr()); + Js_img_mgr.Update_img(page, itm.Html_uid(), itm.Lnki_type(), itm.Html_elem_tid(), itm.Html_w(), itm.Html_h(), itm.Html_url().To_http_file_str(), itm.Orig_w(), itm.Orig_h(), itm.Html_orig_url().To_http_file_str(), itm.Lnki_ttl(), itm.Gallery_mgr_h(), itm.Html_img_wkr()); } public static void Update_link_missing(Xog_html_itm html_itm, String html_id) { html_itm.Html_elem_atr_set_append(html_id, "class", " new"); } - private static void Update_img(Xoa_page page, int uid, byte lnki_type, byte elem_tid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src, int gallery_mgr_h, Js_img_wkr img_wkr) { + private static void Update_img(Xoa_page page, int uid, byte lnki_type, byte elem_tid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src, byte[] lnki_ttl, int gallery_mgr_h, Js_img_wkr img_wkr) { if (Env_.Mode_testing()) return; Xog_html_itm html_itm = page.Tab().Html_itm(); switch (elem_tid) { case Xof_html_elem.Tid_gallery_v2: - img_wkr.Html_update(page, html_itm, uid, html_w, html_h, html_src, orig_w, orig_h, orig_src); + img_wkr.Html_update(page, html_itm, uid, html_w, html_h, html_src, orig_w, orig_h, orig_src, lnki_ttl); return; } String html_id = "xowa_file_img_" + uid; @@ -47,7 +47,7 @@ public class Js_img_mgr { html_itm.Html_atr_set("xowa_gallery_div3_" + uid, "style", "margin:" + Gallery_html_wtr_utl.Calc_vpad(gallery_mgr_h, html_h) + "px auto;"); break; case Xof_html_elem.Tid_imap: - img_wkr.Html_update(page, html_itm, uid, html_w, html_h, html_src, orig_w, orig_h, orig_src); + img_wkr.Html_update(page, html_itm, uid, html_w, html_h, html_src, orig_w, orig_h, orig_src, lnki_ttl); break; case Xof_html_elem.Tid_vid: String html_id_vid = "xowa_file_play_" + uid; diff --git a/400_xowa/src/gplx/xowa/files/gui/Js_img_wkr.java b/400_xowa/src/gplx/xowa/files/gui/Js_img_wkr.java index 4cece7359..8f898c913 100644 --- a/400_xowa/src/gplx/xowa/files/gui/Js_img_wkr.java +++ b/400_xowa/src/gplx/xowa/files/gui/Js_img_wkr.java @@ -18,5 +18,5 @@ along with this program. If not, see . package gplx.xowa.files.gui; import gplx.*; import gplx.xowa.*; import gplx.xowa.files.*; import gplx.xowa.gui.views.*; public interface Js_img_wkr { - void Html_update(Xoa_page page, Xog_html_itm html_itm, int html_uid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src); + void Html_update(Xoa_page page, Xog_html_itm html_itm, int html_uid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src, byte[] lnki_ttl); } diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java index 1e1531889..521db703f 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr.java @@ -19,17 +19,18 @@ package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; import gplx.dbs.*; import gplx.xowa.dbs.*; import gplx.xowa.html.*; import gplx.xowa.gui.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.loads.*; import gplx.xowa.hdumps.htmls.*; import gplx.xowa.hdumps.dbs.*; public class Xodb_hdump_mgr { - private Xodb_file hdump_db_file; private Hdump_html_mgr html_mgr = new Hdump_html_mgr(); + private Xodb_file hdump_db_file; public Xodb_hdump_mgr(Xow_wiki wiki) { this.wiki = wiki; load_mgr = new Hdump_load_mgr(this); Tbl_(new Hdump_text_tbl()); Xoa_app app = wiki.App(); - html_mgr.Init_by_app(app.Usr_dlg(), app.Fsys_mgr().File_dir().To_http_file_bry()); + html_mgr.Init_by_app(app); } public Xow_wiki Wiki() {return wiki;} private final Xow_wiki wiki; @gplx.Internal protected Hdump_load_mgr Load_mgr() {return load_mgr;} private Hdump_load_mgr load_mgr; @gplx.Internal protected Hdump_save_mgr Save_mgr() {return save_mgr;} private Hdump_save_mgr save_mgr = new Hdump_save_mgr(); + public Hdump_html_mgr Html_mgr() {return html_mgr;} private Hdump_html_mgr html_mgr = new Hdump_html_mgr(); public Hdump_text_tbl Text_tbl() {return text_tbl;} private Hdump_text_tbl text_tbl; public boolean Enabled() {return enabled;} public void Enabled_(boolean v) {enabled = v;} private boolean enabled; @gplx.Internal protected void Tbl_mem_() {Tbl_(new Hdump_text_tbl_mem());} @@ -59,17 +60,25 @@ public class Xodb_hdump_mgr { public void Load(Xow_wiki wiki, Xoa_page page) { if (!Enabled_chk()) return; page.Root_(new Xop_root_tkn()); - Hdump_page_itm hdump_page = new Hdump_page_itm(); - load_mgr.Load(hdump_page, page.Revision_data().Id(), page.Url()); + Hdump_page hpg = new Hdump_page(); + load_mgr.Load(hpg, page.Revision_data().Id(), page.Url()); + Load_page(wiki, page, hpg); + } + private void Load_page(Xow_wiki wiki, Xoa_page page, Hdump_page hpg) { Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_m001(); - html_mgr.Write(tmp_bfr, wiki, hdump_page); + html_mgr.Write(tmp_bfr, wiki, hpg); page.Hdump_data().Body_(tmp_bfr.XtoAryAndClear()); + Xopg_html_data html_data = page.Html_data(); + html_data.Display_ttl_(hpg.Display_ttl()); + html_data.Content_sub_(hpg.Content_sub()); + html_data.Xtn_skin_mgr().Add(new Xopg_xtn_skin_itm_mock(hpg.Sidebar_div())); + Hdump_page_body_srl.Load_html_modules(html_data.Module_mgr(), hpg); tmp_bfr.Mkr_rls(); } private void Tbl_(Hdump_text_tbl v) { text_tbl = v; save_mgr.Tbl_(text_tbl); - load_mgr.Tbl_(text_tbl); +// load_mgr.Tbl_(text_tbl); } private boolean Enabled_chk() { if (enabled && hdump_db_file == null) hdump_db_file = Xodb_hdump_mgr_setup.Hdump_db_file_init(this); diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java index a9f535133..af1d1104e 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__save_tst.java @@ -16,15 +16,16 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; -import org.junit.*; import gplx.dbs.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.saves.*; +import org.junit.*; import gplx.dbs.*; import gplx.xowa.files.*; +import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.hdumps.loads.*; import gplx.xowa.hdumps.pages.*; public class Xodb_hdump_mgr__save_tst { @Before public void init() {fxt.Clear();} private Xodb_hdump_mgr__save_fxt fxt = new Xodb_hdump_mgr__save_fxt(); @Test public void Body() { - fxt.Test_save("abc", fxt.Make_row_body("abc")); + fxt.Test_save("abc", fxt.Make_row_body(0, "abc")); } @Test public void Img() { fxt.Test_save("a[[File:A.png|test_caption]]b[[File:B.png|test_caption]]" - , fxt.Make_row_body("a\"test_caption\"b\"test_caption\"") + , fxt.Make_row_body(2, "a\"test_caption\"b\"test_caption\"") , fxt.Make_row_img ( fxt.Make_img(0, 0, 0, "A.png", "trg/orig/7/0/A.png") , fxt.Make_img(1, 0, 0, "B.png", "trg/orig/5/7/B.png") @@ -32,14 +33,26 @@ public class Xodb_hdump_mgr__save_tst { ); } @Test public void Display_title() { - fxt.Test_save("{{DISPLAYTITLE:A}}bcd", fxt.Make_row_body("bcd"), fxt.Make_row_display_title("A")); + fxt.Test_write("{{DISPLAYTITLE:A}}bcd", String_.Concat_lines_nl_skip_last + ( "0|0" + , "n|n|n|n|" + , "A" + , "bcd" + )); } @Test public void Content_sub() { - fxt.Test_save("{{#isin:A}}bcd", fxt.Make_row_body("bcd"), fxt.Make_row_content_sub("A")); + fxt.Test_write("{{#isin:A}}bcd", String_.Concat_lines_nl_skip_last + ( "0|0" + , "n|n|n|n|" + , "A" + , "bcd" + )); } @Test public void Sidebar_div() { - fxt.Test_save("{{#related:A}}bcd", fxt.Make_row_body("bcd"), fxt.Make_row_sidebar_div(String_.Concat_lines_nl_skip_last - ( "
" + fxt.Test_write("{{#related:A}}bcd", String_.Concat_lines_nl_skip_last + ( "0|0" + , "n|n|n|n|" + , "
" , "

" , "
" , "
    " @@ -47,7 +60,8 @@ public class Xodb_hdump_mgr__save_tst { , "
" , "
" , "
" - ))); + , "bcd" + )); } } class Xodb_hdump_mgr__save_fxt extends Xodb_hdump_mgr__base_fxt { @@ -58,17 +72,25 @@ class Xodb_hdump_mgr__save_fxt extends Xodb_hdump_mgr__base_fxt { hdump_mgr.Tbl_mem_(); hdump_mgr.Text_tbl().Provider_(Hdump_text_tbl_mem.Null_provider); } - public Hdump_text_row Make_row_body(String v) {return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, Bry_.new_utf8_(v));} - public Xof_xfer_itm Make_img(int uid, int img_w, int img_h, String lnki_ttl, String img_src_rel) {return new Xof_xfer_itm().Init_for_test__hdump(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src_rel));} - public Hdump_text_row Make_row_img(Xof_xfer_itm... itms) { + public Hdump_text_row Make_row_body(int imgs_count, String body) { + page.Hdump_data().Body_(Bry_.new_utf8_(body)); + for (int i = 0; i < imgs_count; ++i) + page.Hdump_data().Imgs().Add(null); + Hdump_page_body_srl.Save(tmp_bfr, page); + return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, tmp_bfr.XtoAryAndClear()); + } + public Hdump_data_img__base Make_img(int uid, int img_w, int img_h, String lnki_ttl, String img_src_rel) {return new Hdump_data_img__basic().Init_by_base(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src_rel));} + public Hdump_text_row Make_row_img(Hdump_data_img__base... itms) { ListAdp tmp_list = ListAdp_.new_(); tmp_list.AddMany((Object[])itms); byte[] imgs_bry = Hdump_save_mgr.Write_imgs(tmp_bfr, tmp_list); - return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_img, imgs_bry); + return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_data, imgs_bry); + } + public void Test_write(String raw, String expd) { + this.Exec_write(raw); + Hdump_page_body_srl.Save(tmp_bfr, page); + Tfds.Eq(expd, tmp_bfr.XtoStrAndClear()); } - public Hdump_text_row Make_row_display_title(String v) {return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_display_ttl, Bry_.new_utf8_(v));} - public Hdump_text_row Make_row_content_sub(String v) {return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_content_sub, Bry_.new_utf8_(v));} - public Hdump_text_row Make_row_sidebar_div(String v) {return new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_sidebar_div, Bry_.new_utf8_(v));} public void Test_save(String raw, Hdump_text_row... expd) { this.Exec_write(raw); hdump_mgr.Save_mgr().Update(page); diff --git a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java index 2e1ce174a..cc9b2dc43 100644 --- a/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/Xodb_hdump_mgr__write_tst.java @@ -16,18 +16,19 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.hdumps; import gplx.*; import gplx.xowa.*; -import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; +import org.junit.*; import gplx.xowa.files.*; +import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.xtns.hieros.*; public class Xodb_hdump_mgr__write_tst { @Before public void init() {fxt.Clear();} private Xodb_hdump_mgr__write_fxt fxt = new Xodb_hdump_mgr__write_fxt(); @Test public void Image_full() { fxt.Expd_itms_xfers(fxt.Make_xfer(0, 0, 0, "A.png", "trg/orig/7/0/A.png")); - fxt.Test_write + fxt.Test_write_all ( "[[File:A.png|test_caption]]" , "\"test_caption\""); } @Test public void Image_thumb() { fxt.Expd_itms_xfers(fxt.Make_xfer(0, 0, 0, "A.png", "trg/thumb/7/0/A.png/220px.png")); - fxt.Test_write + fxt.Test_write_all ( "[[File:A.png|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
" , "
" @@ -41,7 +42,7 @@ public class Xodb_hdump_mgr__write_tst { } @Test public void Audio_thumb() { fxt.Expd_itms_xfers(fxt.Make_xfer(0, 220, -1, "A.oga", "")); - fxt.Test_write + fxt.Test_write_all ( "[[File:A.oga|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
" , "
" @@ -56,7 +57,7 @@ public class Xodb_hdump_mgr__write_tst { } @Test public void Video_thumb() { fxt.Expd_itms_xfers(fxt.Make_xfer(0, 0, 0, "A.ogv", "")); - fxt.Test_write + fxt.Test_write_all ( "[[File:A.ogv|thumb|test_caption]]", String_.Concat_lines_nl_skip_last ( "
" , "
" @@ -74,12 +75,34 @@ public class Xodb_hdump_mgr__write_tst { , "
" )); } + @Test public void Hiero() { + Hiero_html_mgr_fxt hiero_fxt = new Hiero_html_mgr_fxt(fxt.Fxt()); + hiero_fxt.Reset(); + hiero_fxt.Init_hiero_A1_B1(); + fxt.Test_write_frag("A1", "src='~{xowa_hiero_dir}hiero_A1.png'"); + } + @Test public void Gallery() { + fxt.Test_write_all + ( "File:A.png|A1", String_.Concat_lines_nl_skip_last + ( "" + )); + } } class Xodb_hdump_mgr__base_fxt { protected Xodb_hdump_mgr hdump_mgr; protected Bry_bfr bfr = Bry_bfr.reset_(255); protected Xow_wiki wiki; protected Xoa_page page; - public Xop_fxt Fxt() {return fxt;} protected Xop_fxt fxt; + public Xop_fxt Fxt() {return fxt;} protected Xop_fxt fxt; public void Clear() { if (fxt == null) { fxt = new Xop_fxt(); @@ -101,23 +124,25 @@ class Xodb_hdump_mgr__base_fxt { class Xodb_hdump_mgr__write_fxt extends Xodb_hdump_mgr__base_fxt { private ListAdp expd_itms_xfers = ListAdp_.new_(); @Override public void Clear_end() {expd_itms_xfers.Clear();} - public Xof_xfer_itm Make_xfer(int uid, int img_w, int img_h, String lnki_ttl, String img_src) { - Xof_xfer_itm rv = new Xof_xfer_itm(); - rv.Init_for_test__hdump(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src)); - return rv; - } - public void Expd_itms_xfers(Xof_xfer_itm... itms) {expd_itms_xfers.AddMany((Object[])itms);} - public void Test_write(String raw, String expd_html) { + public Hdump_data_img__base Make_xfer(int uid, int img_w, int img_h, String lnki_ttl, String img_src) {return new Hdump_data_img__basic().Init_by_base(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src));} + public void Expd_itms_xfers(Hdump_data_img__base... itms) {expd_itms_xfers.AddMany((Object[])itms);} + public void Test_write_all (String raw, String expd_html) {Test_write(Bool_.N, raw, expd_html);} + public void Test_write_frag(String raw, String expd_frag) {Test_write(Bool_.Y, raw, expd_frag);} + public void Test_write(boolean frag, String raw, String expd_html) { this.Exec_write(raw); - Tfds.Eq_str_lines(expd_html, String_.new_utf8_(page.Hdump_data().Body())); + String actl_html = String_.new_utf8_(page.Hdump_data().Body()); + if (frag) + Tfds.Eq_true(String_.Has(actl_html, expd_html), actl_html); + else + Tfds.Eq_str_lines(expd_html, actl_html); if (expd_itms_xfers.Count() > 0) Tfds.Eq_ary_str(Xfer_to_str_ary(expd_itms_xfers), Xfer_to_str_ary(page.Hdump_data().Imgs())); } private static String[] Xfer_to_str_ary(ListAdp list) { int len = list.Count(); String[] rv = new String[len]; for (int i = 0; i < len; ++i) { - Xof_xfer_itm itm = (Xof_xfer_itm)list.FetchAt(i); - rv[i] = String_.Concat_with_str("|", Int_.XtoStr(itm.Html_uid()), Int_.XtoStr(itm.Html_w()), Int_.XtoStr(itm.Html_h()), String_.new_utf8_(itm.Html_view_src_rel())); + Hdump_data_img__base itm = (Hdump_data_img__base)list.FetchAt(i); + rv[i] = itm.XtoStr(); } return rv; } diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_img_itm.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__base.java similarity index 50% rename from 400_xowa/src/gplx/xowa/hdumps/core/Hdump_img_itm.java rename to 400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__base.java index 2cfd6e3c6..e6db07333 100644 --- a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_img_itm.java +++ b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__base.java @@ -16,21 +16,38 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; -public class Hdump_img_itm { - public Hdump_img_itm(int idx, int view_w, int view_h, byte[] lnki_ttl, byte[] view_src) { - this.idx = idx; +import gplx.xowa.hdumps.dbs.*; +public abstract class Hdump_data_img__base implements XtoStrAble { + public Hdump_data_img__base Init_by_base(int uid, int view_w, int view_h, byte[] lnki_ttl, byte[] view_src) { + this.uid = uid; this.view_w = view_w; this.view_h = view_h; this.lnki_ttl = lnki_ttl; this.view_src = view_src; + return this; } - public int Idx() {return idx;} private int idx; - public byte[] Lnki_ttl() {return lnki_ttl;} private byte[] lnki_ttl; + public abstract int Tid(); + public int Uid() {return uid;} private int uid; public int View_w() {return view_w;} private int view_w; public int View_h() {return view_h;} private int view_h; + public byte[] Lnki_ttl() {return lnki_ttl;} private byte[] lnki_ttl; public byte[] View_src() {return view_src;} private byte[] view_src; - @Override public String toString() { - return String_.Concat_with_str("|", Int_.XtoStr(idx), Int_.XtoStr(view_w), Int_.XtoStr(view_h), String_.new_utf8_(lnki_ttl), String_.new_utf8_(view_src)); + public String XtoStr() { + return String_.Concat_with_str("|", Int_.XtoStr(this.Tid()), Int_.XtoStr(uid), Int_.XtoStr(view_w), Int_.XtoStr(view_h), String_.new_utf8_(lnki_ttl), String_.new_utf8_(view_src)); } - public static final Hdump_img_itm[] Ary_empty = new Hdump_img_itm[0]; + public void Write(Bry_bfr bfr) { + bfr .Add_int_variable(Hdump_data_tid.Tid_img).Add_byte_pipe() + .Add_int_variable(this.Tid()).Add_byte_pipe() + .Add_int_variable(uid).Add_byte_pipe() + .Add_int_variable(view_w).Add_byte_pipe() + .Add_int_variable(view_h).Add_byte_pipe() + .Add(lnki_ttl).Add_byte_pipe() + .Add(view_src).Add_byte_pipe() + ; + Write_hook(bfr); + bfr.Add_byte_nl(); + } + @gplx.Virtual public void Write_hook(Bry_bfr bfr) {} + public static final Hdump_data_img__base[] Ary_empty = new Hdump_data_img__base[0]; + public static final int Tid_basic = 0, Tid_gallery = 1; } diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__basic.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__basic.java new file mode 100644 index 000000000..38253991e --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__basic.java @@ -0,0 +1,21 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +public class Hdump_data_img__basic extends Hdump_data_img__base { + @Override public int Tid() {return Hdump_data_img__base.Tid_basic;} +} diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__gallery.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__gallery.java new file mode 100644 index 000000000..7d52f80cd --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_data_img__gallery.java @@ -0,0 +1,39 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +public class Hdump_data_img__gallery extends Hdump_data_img__base { + @Override public int Tid() {return Hdump_data_img__base.Tid_gallery;} + public Hdump_data_img__base Init_by_gallery(int box_max, int box_w, int img_w, int img_pad) { + this.box_max = box_max; + this.box_w = box_w; + this.img_w = img_w; + this.img_pad = img_pad; + return this; + } + public int Box_max() {return box_max;} private int box_max; + public int Box_w() {return box_w;} private int box_w; + public int Img_w() {return img_w;} private int img_w; + public int Img_pad() {return img_pad;} private int img_pad; + @Override public void Write_hook(Bry_bfr bfr) { + bfr .Add_int_variable(box_max).Add_byte_pipe() + .Add_int_variable(box_w).Add_byte_pipe() + .Add_int_variable(img_w).Add_byte_pipe() + .Add_int_variable(img_pad).Add_byte_pipe() + ; + } +} diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_file_itm.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_file_itm.java deleted file mode 100644 index 3f5d61c59..000000000 --- a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_file_itm.java +++ /dev/null @@ -1,59 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; -class Hdump_file_itm { - public byte[] Lnki_ttl() {return lnki_ttl;} private byte[] lnki_ttl; - public byte Lnki_tid() {return lnki_tid;} private byte lnki_tid; - public int Lnki_w() {return lnki_w;} private int lnki_w; - public int Lnki_h() {return lnki_h;} private int lnki_h; - public byte Lnki_align_x() {return lnki_align_x;} private byte lnki_align_x; - public byte Lnki_align_y() {return lnki_align_y;} private byte lnki_align_y; - public byte Lnki_border() {return lnki_border;} private byte lnki_border; - public double Lnki_upright() {return lnki_upright;} private double lnki_upright; - public double Lnki_time() {return lnki_time;} private double lnki_time; - public int Lnki_page() {return lnki_page;} private int lnki_page; - public boolean Lnki_media_icon() {return lnki_media_icon;} private boolean lnki_media_icon; - public byte[] Lnki_alt() {return lnki_alt;} private byte[] lnki_alt; - public byte[] Lnki_caption() {return lnki_caption;} private byte[] lnki_caption; - public void Parse(byte[] src) { - int len = src.length; - int pos = 0; - int fld_idx = 0, fld_bgn = 0; - while (pos < len) { - byte b = src[pos]; - if (b == Byte_ascii.Pipe) { - switch (fld_idx) { - case 0: lnki_ttl = Bry_.Mid(src, fld_bgn, pos); break; - case 2: lnki_tid = Bry_.Xto_byte_by_int(src, fld_bgn, pos, Byte_.MaxValue_127); break; - case 3: lnki_w = Bry_.Xto_int_or(src, fld_bgn, pos, -1); break; - case 4: lnki_h = Bry_.Xto_int_or(src, fld_bgn, pos, -1); break; - case 5: lnki_align_x = Bry_.Xto_byte_by_int(src, fld_bgn, pos, Byte_.MaxValue_127); break; - case 6: lnki_align_y = Bry_.Xto_byte_by_int(src, fld_bgn, pos, Byte_.MaxValue_127); break; - case 7: lnki_border = Bry_.Xto_byte_by_int(src, fld_bgn, pos, Byte_.MaxValue_127); break; - case 8: lnki_upright = Bry_.XtoDoubleByPos(src, fld_bgn, pos); break; - case 9: lnki_time = Bry_.XtoDoubleByPos(src, fld_bgn, pos); break; - case 10: lnki_page = Bry_.Xto_int_or(src, fld_bgn, pos, -1); break; - case 11: lnki_media_icon = src[pos] == Byte_ascii.Ltr_y; break; - case 12: lnki_alt = Bry_.Mid(src, fld_bgn, pos); break; - case 13: lnki_caption = Bry_.Mid(src, fld_bgn, pos); break; - } - ++fld_idx; - } - } - } -} diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_module_mgr.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_module_mgr.java new file mode 100644 index 000000000..fef97a5aa --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_module_mgr.java @@ -0,0 +1,27 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +public class Hdump_module_mgr { + public boolean Math_exists() {return math_exists;} public void Math_exists_(boolean v) {math_exists = v;} private boolean math_exists; + public boolean Imap_exists() {return imap_exists;} public void Imap_exists_(boolean v) {imap_exists = v;} private boolean imap_exists; + public boolean Gallery_packed_exists() {return gallery_packed_exists;} public void Gallery_packed_exists_(boolean v) {gallery_packed_exists = v;} private boolean gallery_packed_exists; + public boolean Hiero_exists() {return hiero_exists;} public void Hiero_exists_(boolean v) {hiero_exists = v;} private boolean hiero_exists; + public void Clear() { + math_exists = imap_exists = gallery_packed_exists = hiero_exists = false; + } +} diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_page.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_page.java new file mode 100644 index 000000000..27e7b3d55 --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_page.java @@ -0,0 +1,41 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +public class Hdump_page { + public int Page_id() {return page_id;} private int page_id; + public Xoa_url Page_url() {return page_url;} private Xoa_url page_url; + public int Version_id() {return version_id;} public void Version_id_(int v) {version_id = v;} private int version_id; + public int Img_count() {return img_count;} public void Img_count_(int v) {img_count = v;} private int img_count; + public Hdump_module_mgr Module_mgr() {return module_mgr;} private Hdump_module_mgr module_mgr = new Hdump_module_mgr(); + public byte[] Page_body() {return page_body;} public void Page_body_(byte[] v) {this.page_body = v;} private byte[] page_body; + public byte[] Display_ttl() {return display_ttl;} public void Display_ttl_(byte[] v) {this.display_ttl = v;} private byte[] display_ttl; + public byte[] Content_sub() {return content_sub;} public void Content_sub_(byte[] v) {this.content_sub = v;} private byte[] content_sub; + public byte[] Sidebar_div() {return sidebar_div;} public void Sidebar_div_(byte[] v) {this.sidebar_div = v;} private byte[] sidebar_div; + public int[] Redlink_uids() {return redlink_uids;} public void Redlink_uids_(int[] v) {redlink_uids = v;} private int[] redlink_uids; + public Hdump_data_img__base[] Img_itms() {return img_itms;} public void Img_itms_(Hdump_data_img__base[] v) {this.img_itms = v;} private Hdump_data_img__base[] img_itms; + public OrderedHash Gly_itms() {return gly_itms;} private OrderedHash gly_itms = OrderedHash_.new_(); + public void Init(int page_id, Xoa_url page_url) { + this.page_id = page_id; + this.page_url = page_url; + content_sub = sidebar_div = Bry_.Empty; + display_ttl = null; + img_itms = Hdump_data_img__base.Ary_empty; + module_mgr.Clear(); + gly_itms.Clear(); + } +} diff --git a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_page_itm.java b/400_xowa/src/gplx/xowa/hdumps/core/Hdump_page_itm.java deleted file mode 100644 index f2f6e65d1..000000000 --- a/400_xowa/src/gplx/xowa/hdumps/core/Hdump_page_itm.java +++ /dev/null @@ -1,38 +0,0 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012 gnosygnu@gmail.com - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as -published by the Free Software Foundation, either version 3 of the -License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see . -*/ -package gplx.xowa.hdumps.core; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; -public class Hdump_page_itm { - public int Page_id() {return page_id;} private int page_id; - public Xoa_url Page_url() {return page_url;} private Xoa_url page_url; - public int Version_id() {return version_id;} public void Version_id_(int v) {version_id = v;} private int version_id; - public byte[] Page_body() {return page_body;} public void Page_body_(byte[] v) {this.page_body = v;} private byte[] page_body = Bry_.Empty; - public byte[] Display_ttl() {return display_ttl;} private byte[] display_ttl = Bry_.Empty; - public byte[] Content_sub() {return content_sub;} private byte[] content_sub = Bry_.Empty; - public byte[][] Sidebar_divs() {return sidebar_divs;} private byte[][] sidebar_divs = Bry_.Ary_empty; - public Hdump_img_itm[] Img_itms() {return img_itms;} public void Img_itms_(Hdump_img_itm[] v) {this.img_itms = v;} private Hdump_img_itm[] img_itms = Hdump_img_itm.Ary_empty; - public void Init(int page_id, Xoa_url page_url, int version_id, byte[] display_ttl, byte[] content_sub, byte[] page_body, byte[][] sidebar_divs, Hdump_img_itm[] img_itms) { - this.page_id = page_id; - this.page_url = page_url; - this.version_id = version_id; - this.display_ttl = display_ttl; - this.content_sub = content_sub; - this.page_body = page_body; - this.sidebar_divs = sidebar_divs; - this.img_itms = img_itms; - } -} diff --git a/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_data_tid.java b/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_data_tid.java new file mode 100644 index 000000000..7ce219178 --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_data_tid.java @@ -0,0 +1,21 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.hdumps.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +public class Hdump_data_tid { // SERIALIZED + public static final int Tid_img = 1, Tid_redlink = 2, Tid_gallery = 3, Tid_imap = 4; +} diff --git a/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_row_tid.java b/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_row_tid.java index af12051cc..618029ba8 100644 --- a/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_row_tid.java +++ b/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_row_tid.java @@ -17,5 +17,5 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.dbs; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; public class Hdump_text_row_tid { // NOTE: SERIALIZED - public static final int Tid_body = 0, Tid_img = 1, Tid_gallery = 2, Tid_imap = 3, Tid_display_ttl = 4, Tid_content_sub = 5, Tid_sidebar_div = 6; + public static final int Tid_body = 0, Tid_data = 1; } diff --git a/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_tbl.java b/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_tbl.java index f1205fcb9..561db3667 100644 --- a/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_tbl.java +++ b/400_xowa/src/gplx/xowa/hdumps/dbs/Hdump_text_tbl.java @@ -19,7 +19,7 @@ package gplx.xowa.hdumps.dbs; import gplx.*; import gplx.xowa.*; import gplx.xow import gplx.dbs.*; public class Hdump_text_tbl { private Db_stmt stmt_select, stmt_insert, stmt_delete; - public Db_provider Provider() {return provider;} public void Provider_(Db_provider v) {this.Rls_all(); provider = v;} private Db_provider provider; + public Db_provider Provider() {return provider;} public Hdump_text_tbl Provider_(Db_provider v) {this.Rls_all(); provider = v; return this;} private Db_provider provider; @gplx.Virtual public void Delete_by_page(int page_id) { if (stmt_delete == null) stmt_delete = Db_stmt_.new_delete_(provider, Tbl_name, Fld_page_id); try {stmt_delete.Clear().Val_int_(page_id).Exec_delete();} diff --git a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_consts.java b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_consts.java new file mode 100644 index 000000000..a9dbb496a --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_consts.java @@ -0,0 +1,63 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.hdumps.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +import gplx.core.btries.*; +public class Hdump_html_consts { + public static final byte[] + A_href_bgn = Bry_.new_ascii_("/wiki/File:") + , Bry_img_style_bgn = Bry_.new_ascii_("style='width:") + , Bry_img_style_end = Bry_.new_ascii_("px;'") + ; + public static final byte + Tid_dir = 1, Tid_img = 2, Tid_img_style = 3, Tid_file_play = 4, Tid_file_info = 5, Tid_file_mgnf = 6 + , Tid_hiero_dir = 7, Tid_gallery_box_max = 8, Tid_gallery_box_w = 9, Tid_gallery_img_w = 10, Tid_gallery_img_pad = 11 + ; + public static final byte[] + Key_dir = Bry_.new_ascii_("~{xowa_dir}") + , Key_img = Bry_.new_ascii_("xowa_img='") + , Key_img_style = Bry_.new_ascii_("xowa_img_style='") + , Key_file_play = Bry_.new_ascii_(". */ package gplx.xowa.hdumps.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; -import gplx.core.brys.*; import gplx.core.btries.*; import gplx.xowa.html.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.hdumps.core.*; +import gplx.core.brys.*; import gplx.core.btries.*; import gplx.html.*; import gplx.xowa.html.*; +import gplx.xowa.hdumps.core.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.xtns.gallery.*; public class Hdump_html_fmtr__body implements Bry_fmtr_arg { private Bry_rdr bry_rdr = new Bry_rdr(); - private Xow_wiki wiki; private Hdump_page_itm page; - private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; private byte[] file_dir; - public void Init_by_app(Gfo_usr_dlg usr_dlg, byte [] file_dir) {this.usr_dlg = usr_dlg; this.file_dir = file_dir;} - public void Init_by_page(Xow_wiki wiki, Hdump_page_itm page) {this.wiki = wiki; this.page = page;} + private Xow_wiki wiki; private Hdump_page page; + private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_._; private byte[] root_dir, file_dir, hiero_img_dir; private Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + public void Init_by_app(Xoa_app app) { + this.usr_dlg = app.Usr_dlg(); + this.root_dir = app.Fsys_mgr().Root_dir().To_http_file_bry(); + this.file_dir = app.Fsys_mgr().File_dir().To_http_file_bry(); + this.hiero_img_dir = gplx.xowa.xtns.hieros.Hiero_xtn_mgr.Hiero_root_dir(app).GenSubDir("img").To_http_file_bry(); + } + public void Init_by_page(Xow_wiki wiki, Hdump_page page) {this.wiki = wiki; this.page = page;} public void XferAry(Bry_bfr bfr, int idx) { byte[] src = page.Page_body(); int len = src.length; - Hdump_img_itm[] imgs = page.Img_itms(); int imgs_len = page.Img_itms().length; + Hdump_data_img__base[] imgs = page.Img_itms(); int imgs_len = page.Img_itms().length; bry_rdr.Src_(src); int pos = 0; int rng_bgn = -1; Xow_html_mgr html_mgr = wiki.Html_mgr(); @@ -44,71 +50,79 @@ public class Hdump_html_fmtr__body implements Bry_fmtr_arg { } pos = trie.Match_pos(); // position after match; EX: "xowa_img='" positions after "'" Hdump_html_fmtr_itm itm = (Hdump_html_fmtr_itm)o; - pos = Write_img(bfr, html_mgr, html_fmtr, page, src, imgs, imgs_len, pos, itm); // note no +1; Write_img return pos after } + pos = Write_data(bfr, html_mgr, html_fmtr, page, src, imgs, imgs_len, pos, itm); // note no +1; Write_data return pos after } } } if (rng_bgn != -1) bfr.Add_mid(src, rng_bgn, len); } - private int Write_img(Bry_bfr bfr, Xow_html_mgr html_mgr, Xoh_file_html_fmtr__base fmtr, Hdump_page_itm page, byte[] src, Hdump_img_itm[] imgs, int imgs_len, int uid_bgn, Hdump_html_fmtr_itm itm) { + private int Write_data(Bry_bfr bfr, Xow_html_mgr html_mgr, Xoh_file_html_fmtr__base fmtr, Hdump_page hpg, byte[] src, Hdump_data_img__base[] imgs, int imgs_len, int uid_bgn, Hdump_html_fmtr_itm itm) { bry_rdr.Pos_(uid_bgn); - int uid = bry_rdr.Read_int_to(Byte_ascii.Apos); - int uid_end = bry_rdr.Pos(); // set uid_end after "'" + int uid = itm.Subst_end_byte() == Byte_ascii.Nil ? -1 : bry_rdr.Read_int_to(itm.Subst_end_byte()); + int uid_end = bry_rdr.Pos(); // set uid_end after subst_end int rv = uid_end; - if (itm.Elem_is_xnde()) rv += 2; // if xnde, skip "/>" - if (uid == bry_rdr.Or_int()) {usr_dlg.Warn_many("", "", "index is not a valid int; page=~{0} text=~{1}", page.Page_url().Xto_full_str_safe(), Bry_.Mid_safe(src, uid_bgn, uid_end)); return uid_end;} - if (!Int_.Between(uid, 0, imgs_len)) {usr_dlg.Warn_many("", "", "index is out of range; page=~{0} idx=~{1} len=~{2}", page.Page_url().Xto_full_str_safe(), uid, imgs_len); return uid_end;} - Hdump_img_itm img = imgs[uid]; - int img_view_w = img.View_w(); byte tid = itm.Tid(); - if (tid == Tid_img_style) { - bfr.Add(Bry_img_style_bgn); - bfr.Add_int_variable(img_view_w); - bfr.Add(Bry_img_style_end); - return rv; + switch (tid) { + case Hdump_html_consts.Tid_dir: bfr.Add(root_dir); return rv; + case Hdump_html_consts.Tid_hiero_dir: bfr.Add(hiero_img_dir); return rv; + } + if (itm.Elem_is_xnde()) rv += 2; // if xnde, skip "/>" + if (uid == bry_rdr.Or_int()) {usr_dlg.Warn_many("", "", "index is not a valid int; page=~{0} text=~{1}", hpg.Page_url().Xto_full_str_safe(), Bry_.Mid_safe(src, uid_bgn, uid_end)); return uid_end;} + if (!Int_.Between(uid, 0, imgs_len)) {usr_dlg.Warn_many("", "", "index is out of range; page=~{0} idx=~{1} len=~{2}", hpg.Page_url().Xto_full_str_safe(), uid, imgs_len); return uid_end;} + Hdump_data_img__base img = imgs[uid]; + int img_view_w = img.View_w(); + switch (tid) { + case Hdump_html_consts.Tid_img_style: + bfr.Add(Hdump_html_consts.Bry_img_style_bgn); + bfr.Add_int_variable(img_view_w); + bfr.Add(Hdump_html_consts.Bry_img_style_end); + return rv; } byte[] a_title = img.Lnki_ttl(); - byte[] a_href = Bry_.Add(A_href_bgn, a_title); + byte[] a_href = Bry_.Add(Hdump_html_consts.A_href_bgn, a_title); switch (tid) { - case Tid_file_info: fmtr.Html_thumb_part_info (bfr, uid, a_href, html_mgr.Img_media_info_btn()); return rv; - case Tid_file_mgnf: fmtr.Html_thumb_part_magnify(bfr, uid, a_href, a_title, html_mgr.Img_thumb_magnify()); return rv; - case Tid_file_play: fmtr.Html_thumb_part_play (bfr, uid, img_view_w, Xoh_file_wtr__basic.Play_btn_max_width, a_href, a_title, html_mgr.Img_media_play_btn()); return rv; + case Hdump_html_consts.Tid_file_info: fmtr.Html_thumb_part_info (bfr, uid, a_href, html_mgr.Img_media_info_btn()); return rv; + case Hdump_html_consts.Tid_file_mgnf: fmtr.Html_thumb_part_magnify(bfr, uid, a_href, a_title, html_mgr.Img_thumb_magnify()); return rv; + case Hdump_html_consts.Tid_file_play: fmtr.Html_thumb_part_play (bfr, uid, img_view_w, Xoh_file_wtr__basic.Play_btn_max_width, a_href, a_title, html_mgr.Img_media_play_btn()); return rv; + case Hdump_html_consts.Tid_gallery_box_max: { + Hdump_data_img__gallery gly = (Hdump_data_img__gallery)img; + if (gly.Box_max() > 0) { // -1 means no box_max + byte[] style = Gallery_mgr_base.box_style_max_width_fmtr.Bld_bry_many(tmp_bfr, gly.Box_max()); + Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style); + } + return rv; + } + case Hdump_html_consts.Tid_gallery_box_w: { + Hdump_data_img__gallery gly = (Hdump_data_img__gallery)img; + byte[] style = Gallery_mgr_base.hdump_box_w_fmtr.Bld_bry_many(tmp_bfr, gly.Box_w()); + Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style); + return rv; + } + case Hdump_html_consts.Tid_gallery_img_w: { + Hdump_data_img__gallery gly = (Hdump_data_img__gallery)img; + byte[] style = Gallery_mgr_base.hdump_box_w_fmtr.Bld_bry_many(tmp_bfr, gly.Img_w()); + Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style); + return rv; + } + case Hdump_html_consts.Tid_gallery_img_pad: { + Hdump_data_img__gallery gly = (Hdump_data_img__gallery)img; + byte[] style = Gallery_mgr_base.hdump_img_pad_fmtr.Bld_bry_many(tmp_bfr, gly.Img_pad()); + Html_wtr.Write_atr_bry(bfr, Bool_.N, Byte_ascii.Quote, Html_atr_.Style_bry, style); + return rv; + } } byte[] img_src = Bry_.Add(file_dir, img.View_src()); - if (tid == Tid_img) { - fmtr_img.Bld_bfr_many(bfr, img_src, img_view_w, img.View_h()); + if (tid == Hdump_html_consts.Tid_img) { + fmtr_img.Bld_bfr_many(bfr, img_src, img_view_w, img.View_h()); } return rv; } - private static final Bry_fmtr fmtr_img = Bry_fmtr.new_("src='~{src}' width='~{w}' height='~{h}'", "src", "w", "h"); - private static final byte[] A_href_bgn = Bry_.new_ascii_("/wiki/File:"), Bry_img_style_bgn = Bry_.new_ascii_("style='width:"), Bry_img_style_end = Bry_.new_ascii_("px;'"); - public static final byte[] - Key_img = Bry_.new_ascii_("xowa_img='") - , Key_img_style = Bry_.new_ascii_("xowa_img_style='") - , Key_file_play = Bry_.new_ascii_(". */ package gplx.xowa.hdumps.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; - import gplx.xowa.hdumps.core.*; +import gplx.xowa.hdumps.core.*; public class Hdump_html_mgr { - private Hdump_html_fmtr__sidebars sidebars_fmtr = new Hdump_html_fmtr__sidebars(); private Hdump_html_fmtr__body body_fmtr = new Hdump_html_fmtr__body(); - public Hdump_html_mgr Init_by_app(Gfo_usr_dlg usr_dlg, byte[] file_dir) {body_fmtr.Init_by_app(usr_dlg, file_dir); return this;} - public Bry_fmtr Skin_fmtr() {return skin_fmtr;} private Bry_fmtr skin_fmtr = Bry_fmtr.new_("~{display_ttl}~{content_sub}~{sidebar_divs}~{body_html}", "display_ttl", "content_sub", "sidebar_divs", "body_html"); - public void Write(Bry_bfr bfr, Xow_wiki wiki, Hdump_page_itm page) { + public Hdump_html_mgr Init_by_app(Xoa_app app) {body_fmtr.Init_by_app(app); return this;} + public void Write(Bry_bfr bfr, Xow_wiki wiki, Hdump_page page) { body_fmtr.Init_by_page(wiki, page); - sidebars_fmtr.Init_by_page(page); - skin_fmtr.Bld_bfr_many(bfr, page.Display_ttl(), page.Content_sub(), sidebars_fmtr, body_fmtr); + body_fmtr.XferAry(bfr, 0); } } diff --git a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java index d4ddbf5e7..eb264d3a9 100644 --- a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_mgr_tst.java @@ -16,8 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.hdumps.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; - import gplx.xowa.hdumps.core.*; -import org.junit.*; +import org.junit.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; public class Hdump_html_mgr_tst { @Before public void init() { fxt.Clear(); @@ -64,23 +63,47 @@ public class Hdump_html_mgr_tst { , "
" )); } + @Test public void Hiero_dir() { + fxt .Init_body("") + .Test_html(""); + } + @Test public void Gallery() { + fxt.Clear_imgs(); + fxt .Init_gly(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png", 800, 155, 150, 15); + fxt .Init_body(String_.Concat_lines_nl_skip_last + ( "
    " + , "
  • " + , "
    " + , "
    " + , "
    " + )) + .Test_html(String_.Concat_lines_nl_skip_last + ( "
      " + , "
    • " + , "
      " + , "
      " + , "
      " + )); + } } class Hdump_html_mgr_fxt { - private Hdump_html_mgr html_mgr = new Hdump_html_mgr(); - private Hdump_page_itm page = new Hdump_page_itm(); + private Hdump_html_mgr html_mgr; private Bry_bfr bfr = Bry_bfr.reset_(255); private ListAdp img_list = ListAdp_.new_(); private Xow_wiki wiki; + public Hdump_page Hpg() {return hpg;} private Hdump_page hpg = new Hdump_page(); public void Clear() { - html_mgr.Init_by_app(Gfo_usr_dlg_.Null, Bry_.new_ascii_("file:///mem/xowa/file/")); Xoa_app app = Xoa_app_fxt.app_(); wiki = Xoa_app_fxt.wiki_tst_(app); + html_mgr = wiki.Db_mgr().Hdump_mgr().Html_mgr(); } - public Hdump_html_mgr_fxt Init_body(String body) {page.Page_body_(Bry_.new_utf8_(body)); return this;} - public Hdump_html_mgr_fxt Init_img(int id, int w, int h, String ttl, String src) {img_list.Add(new Hdump_img_itm(id, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;} + public void Clear_imgs() {img_list.Clear();} + public Hdump_html_mgr_fxt Init_body(String body) {hpg.Page_body_(Bry_.new_utf8_(body)); return this;} + public Hdump_html_mgr_fxt Init_img(int id, int w, int h, String ttl, String src) {img_list.Add(new Hdump_data_img__basic().Init_by_base(id, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;} + public Hdump_html_mgr_fxt Init_gly(int id, int w, int h, String ttl, String src, int box_max, int box_w, int img_w, int img_pad) {img_list.Add(new Hdump_data_img__gallery().Init_by_gallery(box_max, box_w, img_w, img_pad).Init_by_base(id, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;} public Hdump_html_mgr_fxt Test_html(String expd) { - if (img_list.Count() > 0) page.Img_itms_((Hdump_img_itm[])img_list.XtoAryAndClear(Hdump_img_itm.class)); - html_mgr.Write(bfr, wiki, page); + if (img_list.Count() > 0) hpg.Img_itms_((Hdump_data_img__base[])img_list.XtoAryAndClear(Hdump_data_img__base.class)); + html_mgr.Write(bfr, wiki, hpg); Tfds.Eq_str_lines(expd, bfr.XtoStrAndClear()); return this; } diff --git a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java index e34e59513..19adb1107 100644 --- a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr.java @@ -16,60 +16,63 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; -import gplx.core.brys.*; import gplx.core.btries.*; import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; +import gplx.core.brys.*; import gplx.core.btries.*; import gplx.dbs.*; import gplx.ios.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.pages.*; +import gplx.xowa.pages.skins.*; public class Hdump_load_mgr { - private Xodb_hdump_mgr hdump_mgr; - private Io_stream_zip_mgr zip_mgr = new Io_stream_zip_mgr(); - private byte[] page_text, display_ttl, content_sub; - private ListAdp sidebar_divs = ListAdp_.new_(), img_itms = ListAdp_.new_(); - private Hdump_text_tbl text_tbl = new Hdump_text_tbl(); private ListAdp tmp_text_itms = ListAdp_.new_(); - private Bry_rdr bry_rdr = new Bry_rdr(); + private Xodb_hdump_mgr hdump_mgr; private Hdump_text_tbl text_tbl = new Hdump_text_tbl(); private Bry_rdr rdr = new Bry_rdr(); // private Io_stream_zip_mgr zip_mgr = new Io_stream_zip_mgr(); + private ListAdp tmp_rows = ListAdp_.new_(), img_itms = ListAdp_.new_(); public Hdump_load_mgr(Xodb_hdump_mgr hdump_mgr) {this.hdump_mgr = hdump_mgr;} public byte Zip_tid() {return zip_tid;} public void Zip_tid_(byte v) {zip_tid = v;} private byte zip_tid = gplx.ios.Io_stream_.Tid_file; - public void Tbl_(Hdump_text_tbl v) {text_tbl = v;} - public void Clear() { - page_text = display_ttl = content_sub = null; - sidebar_divs.Clear(); - img_itms.Clear(); - } - public void Load(Hdump_page_itm page, int page_id, Xoa_url page_url) { + public void Load(Hdump_page hpg, int page_id, Xoa_url page_url) { Db_provider provider = hdump_mgr.Db_provider_by_page(page_id); - text_tbl.Provider_(provider); - text_tbl.Select_by_page(tmp_text_itms, page_id); - Load_itm(page, page_id, page_url, tmp_text_itms); + text_tbl.Provider_(provider).Select_by_page(tmp_rows, page_id); + Load_rows(hpg, page_id, page_url, tmp_rows); } - public void Load_itm(Hdump_page_itm page, int page_id, Xoa_url page_url, ListAdp itms) { - this.Clear(); - int len = itms.Count(); + public void Load_rows(Hdump_page hpg, int page_id, Xoa_url page_url, ListAdp rows) { + hpg.Init(page_id, page_url); + img_itms.Clear(); + int len = rows.Count(); for (int i = 0; i < len; ++i) { - Hdump_text_row itm = (Hdump_text_row)itms.FetchAt(i); - switch (itm.Tid()) { - case Hdump_text_row_tid.Tid_body: Load_itm_body(itm); break; - case Hdump_text_row_tid.Tid_img: Load_itm_img(itm); break; - case Hdump_text_row_tid.Tid_sidebar_div: sidebar_divs.Add(zip_mgr.Unzip(zip_tid, itm.Data())); break; - case Hdump_text_row_tid.Tid_display_ttl: display_ttl = zip_mgr.Unzip(zip_tid, itm.Data()); break; - case Hdump_text_row_tid.Tid_content_sub: content_sub = zip_mgr.Unzip(zip_tid, itm.Data()); break; + Hdump_text_row row = (Hdump_text_row)rows.FetchAt(i); + switch (row.Tid()) { + case Hdump_text_row_tid.Tid_body: Hdump_page_body_srl.Load(hpg, rdr, row.Data()); break; + case Hdump_text_row_tid.Tid_data: Load_data(hpg, row); break; } } - page.Init(page_id, page_url, 0, display_ttl, content_sub, page_text - , (byte[][])sidebar_divs.XtoAryAndClear(byte[].class) - , (Hdump_img_itm[])img_itms.XtoAryAndClear(Hdump_img_itm.class) - ); - itms.Clear(); + rows.Clear(); } - public void Load_itm_body(Hdump_text_row itm) { - page_text = zip_mgr.Unzip(zip_tid, itm.Data()); - } - public void Load_itm_img(Hdump_text_row itm) { - bry_rdr.Src_(itm.Data()); - while (!bry_rdr.Pos_is_eos()) { - int uid = bry_rdr.Read_int_to_pipe(); - int w = bry_rdr.Read_int_to_pipe(); - int h = bry_rdr.Read_int_to_pipe(); - byte[] ttl = bry_rdr.Read_bry_to_pipe(); - byte[] src = bry_rdr.Read_bry_to_nl(); - Hdump_img_itm img_itm = new Hdump_img_itm(uid, w, h, ttl, src); - img_itms.Add(img_itm); + public void Load_data(Hdump_page hpg, Hdump_text_row row) { + rdr.Src_(row.Data()); + while (!rdr.Pos_is_eos()) { + int tid = rdr.Read_int_to_pipe(); + switch (tid) { + case Hdump_data_tid.Tid_img : + case Hdump_data_tid.Tid_gallery : Load_data_img(); break; // 1|0|220|110|A.png|commons/7/0/orig/A.png + case Hdump_data_tid.Tid_redlink : Load_data_redlink(hpg); break; // 2|2|0|1 + } } + if (img_itms.Count() > 0) hpg.Img_itms_((Hdump_data_img__base[])img_itms.XtoAryAndClear(Hdump_data_img__base.class)); + } + private void Load_data_img() { + int tid = rdr.Read_int_to_pipe(); + int uid = rdr.Read_int_to_pipe(); + int w = rdr.Read_int_to_pipe(); + int h = rdr.Read_int_to_pipe(); + byte[] ttl = rdr.Read_bry_to_pipe(); + byte[] src = rdr.Read_bry_to_pipe(); + Hdump_data_img__base img_itm = null; + switch (tid) { + case Hdump_data_img__base.Tid_basic : img_itm = new Hdump_data_img__basic().Init_by_base(uid, w, h, ttl, src); break; + case Hdump_data_img__base.Tid_gallery : img_itm = new Hdump_data_img__gallery().Init_by_gallery(rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe(), rdr.Read_int_to_pipe()).Init_by_base(uid, w, h, ttl, src); break; + } + rdr.Pos_add_one(); + img_itms.Add(img_itm); + } + public void Load_data_redlink(Hdump_page hpg) { + int len = rdr.Read_int_to_pipe(); + int[] redlink_uids = new int[len]; + for (int i = 0; i < len; ++i) + redlink_uids[i] = rdr.Read_int_to_pipe(); + hpg.Redlink_uids_(redlink_uids); } } diff --git a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java index ff79c5405..7daa56f8e 100644 --- a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java +++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_load_mgr_tst.java @@ -16,14 +16,22 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; -import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*; +import org.junit.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.saves.*; import gplx.xowa.hdumps.pages.*; public class Hdump_load_mgr_tst { @Before public void init() {fxt.Clear();} private Hdump_load_mgr_fxt fxt = new Hdump_load_mgr_fxt(); @Test public void Body() { - fxt.Init_row_body(""); + fxt.Init_row_body("", null, null, null); fxt.Expd_body(""); fxt.Test_load(0); } + @Test public void Body_all() { + fxt.Init_row_body("", "test_display_ttl", "test_content_sub", "test_sidebar_div"); + fxt.Expd_body(""); + fxt.Expd_display_ttl("test_display_ttl"); + fxt.Expd_content_sub("test_content_sub"); + fxt.Expd_sidebar_div("test_sidebar_div"); + fxt.Test_load(0); + } @Test public void Img() { fxt.Init_row_img ( fxt.Make_img(0, 220, 110, "A.png", "commons.wikimedia.org/thumb/7/0/A.png/220.png") @@ -36,35 +44,53 @@ public class Hdump_load_mgr_tst { } class Hdump_load_mgr_fxt { private Hdump_load_mgr load_mgr; - private Hdump_page_itm page = new Hdump_page_itm(); + private Hdump_page hpg = new Hdump_page(); private ListAdp init_rows = ListAdp_.new_(); - private String expd_body; + private String expd_body, expd_display_ttl, expd_content_sub, expd_sidebar_div; private ListAdp expd_imgs = ListAdp_.new_(); private int page_id = 0; private Xoa_url page_url; public void Clear() { load_mgr = new Hdump_load_mgr(null); load_mgr.Zip_tid_(gplx.ios.Io_stream_.Tid_file); init_rows.Clear(); - expd_body = null; + expd_body = expd_display_ttl = expd_content_sub = expd_sidebar_div = null; expd_imgs.Clear(); page_url = Xoa_url.new_(Bry_.new_ascii_("enwiki"), Bry_.new_ascii_("Page_1")); } - public Xof_xfer_itm Make_img(int uid, int img_w, int img_h, String lnki_ttl, String img_src_rel) {return new Xof_xfer_itm().Init_for_test__hdump(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src_rel));} - public void Init_row_img(Xof_xfer_itm... itms) { + public Hdump_data_img__base Make_img(int uid, int img_w, int img_h, String lnki_ttl, String img_src_rel) {return new Hdump_data_img__basic().Init_by_base(uid, img_w, img_h, Bry_.new_utf8_(lnki_ttl), Bry_.new_utf8_(img_src_rel));} + public void Init_row_img(Hdump_data_img__base... itms) { ListAdp tmp_list = ListAdp_.new_(); Bry_bfr bfr = Bry_bfr.new_(255); tmp_list.AddMany((Object[])itms); byte[] imgs_bry = Hdump_save_mgr.Write_imgs(bfr, tmp_list); - init_rows.Add(new Hdump_text_row(0, Hdump_text_row_tid.Tid_img, imgs_bry)); + init_rows.Add(new Hdump_text_row(0, Hdump_text_row_tid.Tid_data, imgs_bry)); } - public Hdump_load_mgr_fxt Init_row_body(String data) {init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, Bry_.new_utf8_(data))); return this;} - public Hdump_load_mgr_fxt Init_row_img (String data) {init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_img , Bry_.new_utf8_(data))); return this;} + public Hdump_load_mgr_fxt Init_row_body(String body, String display_ttl, String content_sub, String sidebar_div) { + Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + Xoa_app app = Xoa_app_fxt.app_(); + Xow_wiki wiki = Xoa_app_fxt.wiki_tst_(app); + Xoa_page page = Xoa_page.new_(wiki, Xoa_ttl.parse_(wiki, Bry_.new_ascii_("Page_1"))); + if (display_ttl != null) page.Html_data().Display_ttl_(Bry_.new_utf8_(display_ttl)); + if (content_sub != null) page.Html_data().Content_sub_(Bry_.new_utf8_(content_sub)); + if (sidebar_div != null) page.Html_data().Xtn_skin_mgr().Add(new Xopg_xtn_skin_itm_mock(Bry_.new_utf8_(sidebar_div))); + page.Hdump_data().Body_(Bry_.new_utf8_(body)); + Hdump_page_body_srl.Save(tmp_bfr, page); + init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_body, tmp_bfr.XtoAryAndClear())); + return this; + } + public Hdump_load_mgr_fxt Init_row_img (String data) {init_rows.Add(new Hdump_text_row(page_id, Hdump_text_row_tid.Tid_data, Bry_.new_utf8_(data))); return this;} public Hdump_load_mgr_fxt Expd_body(String v) {this.expd_body = v; return this;} - public Hdump_load_mgr_fxt Expd_img(int idx, int w, int h, String ttl, String src) {expd_imgs.Add(new Hdump_img_itm(idx, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;} + public Hdump_load_mgr_fxt Expd_display_ttl(String v) {this.expd_display_ttl = v; return this;} + public Hdump_load_mgr_fxt Expd_content_sub(String v) {this.expd_content_sub = v; return this;} + public Hdump_load_mgr_fxt Expd_sidebar_div(String v) {this.expd_sidebar_div = v; return this;} + public Hdump_load_mgr_fxt Expd_img(int idx, int w, int h, String ttl, String src) {expd_imgs.Add(new Hdump_data_img__basic().Init_by_base(idx, w, h, Bry_.new_utf8_(ttl), Bry_.new_utf8_(src))); return this;} public Hdump_load_mgr_fxt Test_load(int page_id) { - load_mgr.Load_itm(page, page_id, page_url, init_rows); - if (expd_body != null) Tfds.Eq(expd_body, String_.new_utf8_(page.Page_body())); - if (expd_imgs.Count() != 0) Tfds.Eq_ary_str((Hdump_img_itm[])expd_imgs.XtoAryAndClear(Hdump_img_itm.class), page.Img_itms()); + load_mgr.Load_rows(hpg, page_id, page_url, init_rows); + if (expd_body != null) Tfds.Eq(expd_body, String_.new_utf8_(hpg.Page_body())); + if (expd_display_ttl != null) Tfds.Eq(expd_display_ttl, String_.new_utf8_(hpg.Display_ttl())); + if (expd_content_sub != null) Tfds.Eq(expd_content_sub, String_.new_utf8_(hpg.Content_sub())); + if (expd_sidebar_div != null) Tfds.Eq(expd_sidebar_div, String_.new_utf8_(hpg.Sidebar_div())); + if (expd_imgs.Count() != 0) Tfds.Eq_ary_str((Hdump_data_img__base[])expd_imgs.XtoAryAndClear(Hdump_data_img__base.class), hpg.Img_itms()); return this; } } diff --git a/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_page_body_srl.java b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_page_body_srl.java new file mode 100644 index 000000000..597ac5977 --- /dev/null +++ b/400_xowa/src/gplx/xowa/hdumps/loads/Hdump_page_body_srl.java @@ -0,0 +1,116 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +import gplx.core.brys.*; import gplx.xowa.pages.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.skins.*; +import gplx.xowa.html.modules.*; +public class Hdump_page_body_srl { + private static final Bry_bfr tmp_bfr = Bry_bfr.reset_(255); + public static void Save(Bry_bfr bfr, Xoa_page page) { + bfr.Add_int_fixed(0, 1).Add_byte_pipe(); // version + Xopg_hdump_data hdump_data = page.Hdump_data(); + bfr.Add_int_variable(hdump_data.Imgs().Count()); // imgs_count + Xopg_html_data html_data = page.Html_data(); + Save_html_modules(bfr, html_data); + Save_data(bfr, Tid_display_ttl , html_data.Display_ttl()); + Save_data(bfr, Tid_content_sub , html_data.Content_sub()); + Save_sidebars(bfr, page, html_data); + Save_data(bfr, Tid_body , hdump_data.Body()); + } + private static void Save_html_modules(Bry_bfr bfr, Xopg_html_data html_data) { + Xoh_module_mgr module_mgr = html_data.Module_mgr(); + Save_html_modules__itm(tmp_bfr, module_mgr.Itm_mathjax().Enabled()); + Save_html_modules__itm(tmp_bfr, module_mgr.Itm_popups().Bind_hover_area()); + Save_html_modules__itm(tmp_bfr, module_mgr.Itm_gallery().Enabled()); + Save_html_modules__itm(tmp_bfr, module_mgr.Itm_hiero().Enabled()); + Save_data(bfr, Tid_html_module, tmp_bfr.XtoAryAndClear()); + } + public static void Load_html_modules(Hdump_page hpg, byte[] src, int bgn, int end) { + Hdump_module_mgr module_mgr = hpg.Module_mgr(); + module_mgr.Math_exists_ (src[bgn + 0] == Byte_ascii.Ltr_y); + module_mgr.Imap_exists_ (src[bgn + 2] == Byte_ascii.Ltr_y); + module_mgr.Gallery_packed_exists_ (src[bgn + 4] == Byte_ascii.Ltr_y); + module_mgr.Hiero_exists_ (src[bgn + 6] == Byte_ascii.Ltr_y); + } + public static void Load_html_modules(Xoh_module_mgr page_module_mgr, Hdump_page hpg) { + Hdump_module_mgr dump_module_mgr = hpg.Module_mgr(); + page_module_mgr.Itm_mathjax().Enabled_ (dump_module_mgr.Math_exists()); + page_module_mgr.Itm_popups().Bind_hover_area_ (dump_module_mgr.Imap_exists()); + page_module_mgr.Itm_gallery().Enabled_ (dump_module_mgr.Gallery_packed_exists()); + page_module_mgr.Itm_hiero().Enabled_ (dump_module_mgr.Hiero_exists()); + } + private static void Save_html_modules__itm(Bry_bfr tmp_bfr, boolean v) { + tmp_bfr.Add_yn(v); + tmp_bfr.Add_byte_pipe(); + } + private static void Save_sidebars(Bry_bfr bfr, Xoa_page page, Xopg_html_data html_data) { + Xopg_xtn_skin_mgr mgr = html_data.Xtn_skin_mgr(); + int len = mgr.Count(); + boolean sidebar_exists = false; + for (int i = 0; i < len; ++i) { + Xopg_xtn_skin_itm itm = mgr.Get_at(i); + if (itm.Tid() == Xopg_xtn_skin_itm_tid.Tid_sidebar) { + sidebar_exists = true; + itm.Write(tmp_bfr, page); + } + } + if (sidebar_exists) + Save_data(bfr, Tid_sidebar_div, tmp_bfr.XtoAryAndClear()); + } + private static void Save_data(Bry_bfr bfr, int tid, byte[] data) { + if (data != null) { + bfr.Add_byte_nl(); + bfr.Add(Sect_lhs); + bfr.Add_int_variable(tid); + bfr.Add(Sect_rhs); + bfr.Add(data); + } + } + public static void Load(Hdump_page hpg, Bry_rdr rdr, byte[] src) { + rdr.Src_(src); + Load_body_meta(hpg, rdr); + while (!rdr.Pos_is_eos()) { + int idx_pos = rdr.Find_fwd__pos_at_rhs(Sect_lhs); + int idx = Byte_ascii.Xto_digit(src[idx_pos]); + int lhs_pos = idx_pos + 3; // 2=skip "#/>" + if (idx == Tid_body) { + hpg.Page_body_(Bry_.Mid(src, lhs_pos, src.length)); + return; + } + else { + int rhs_pos = rdr.Find_fwd__pos_at_lhs(Sect_lhs) - 1; // -1 to ignore \n + switch (idx) { + case Tid_html_module: Load_html_modules(hpg, src, lhs_pos, rhs_pos); break; + case Tid_display_ttl: hpg.Display_ttl_(Bry_.Mid(src, lhs_pos, rhs_pos)); break; + case Tid_content_sub: hpg.Content_sub_(Bry_.Mid(src, lhs_pos, rhs_pos)); break; + case Tid_sidebar_div: hpg.Sidebar_div_(Bry_.Mid(src, lhs_pos, rhs_pos)); break; + } + } + } + } private static final byte[] Sect_lhs = Bry_.new_ascii_(""); + private static void Load_body_meta(Hdump_page hpg, Bry_rdr rdr) { + hpg.Version_id_(rdr.Read_int_to_pipe()); + hpg.Img_count_(rdr.Read_int_to_nl()); + } + private static final int + Tid_html_module = 1 + , Tid_display_ttl = 2 + , Tid_content_sub = 3 + , Tid_sidebar_div = 4 + , Tid_body = 5 + ; +} diff --git a/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_img_itm.java b/400_xowa/src/gplx/xowa/hdumps/loads/Xopg_xtn_skin_itm_mock.java similarity index 52% rename from 400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_img_itm.java rename to 400_xowa/src/gplx/xowa/hdumps/loads/Xopg_xtn_skin_itm_mock.java index 613c180d5..bbb931595 100644 --- a/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_img_itm.java +++ b/400_xowa/src/gplx/xowa/hdumps/loads/Xopg_xtn_skin_itm_mock.java @@ -15,16 +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 . */ -package gplx.xowa.hdumps.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; -public class Xopg_hdump_img_itm { - public Xopg_hdump_img_itm(int uid, int img_w, int img_h, byte[] img_src) { - this.uid = uid; this.img_w = img_w; this.img_h = img_h; this.img_src = img_src; - } - public int Uid() {return uid;} private final int uid; - public int Img_w() {return img_w;} private final int img_w; - public int Img_h() {return img_h;} private final int img_h; - public byte[] Img_src() {return img_src;} private final byte[] img_src; - @Override public String toString() { - return String_.Concat_with_str("|", Int_.XtoStr(uid), Int_.XtoStr(img_w), Int_.XtoStr(img_h), String_.new_utf8_(img_src)); +package gplx.xowa.hdumps.loads; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +import gplx.xowa.pages.skins.*; +public class Xopg_xtn_skin_itm_mock implements Xopg_xtn_skin_itm { + private byte[] val; + public Xopg_xtn_skin_itm_mock(byte[] val) {this.val = val;} + public byte Tid() {return Xopg_xtn_skin_itm_tid.Tid_sidebar;} + public byte[] Key() {return Bry_.Empty;} + public void Write(Bry_bfr bfr, Xoa_page page) { + bfr.Add(val); } } diff --git a/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_data.java b/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_data.java index 14bfaf6fb..f2f491b99 100644 --- a/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_data.java +++ b/400_xowa/src/gplx/xowa/hdumps/pages/Xopg_hdump_data.java @@ -16,8 +16,17 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.hdumps.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; +import gplx.xowa.hdumps.core.*; import gplx.xowa.files.*; public class Xopg_hdump_data { + private final int file_dir_bry_len; + public Xopg_hdump_data(Xoa_app app) {file_dir_bry_len = app.Fsys_mgr().File_dir_bry_len();} public ListAdp Imgs() {return imgs;} private final ListAdp imgs = ListAdp_.new_(); + public void Imgs_add(Hdump_data_img__base img, Xof_xfer_itm xfer_itm, int tid) { + byte[] img_src = xfer_itm.Html_view_src(); + img_src = Bry_.Len_eq_0(img_src) ? Bry_.Empty : Bry_.Mid(img_src, file_dir_bry_len); + img.Init_by_base(xfer_itm.Html_uid(), xfer_itm.Html_w(), xfer_itm.Html_h(), xfer_itm.Lnki_ttl(), img_src); + imgs.Add(img); + } public byte[] Body() {return body;} public void Body_(byte[] v) {body = v;} private byte[] body; public void Clear() { imgs.Clear(); diff --git a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java index 94bd2a395..faa41b9ad 100644 --- a/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java +++ b/400_xowa/src/gplx/xowa/hdumps/saves/Hdump_save_mgr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.hdumps.saves; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; import gplx.dbs.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.dbs.*; -import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; +import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.pages.*; import gplx.xowa.pages.*; import gplx.xowa.pages.skins.*; import gplx.xowa.hdumps.loads.*; public class Hdump_save_mgr { private Bry_bfr tmp_bfr = Bry_bfr.reset_(10 * Io_mgr.Len_mb); private Hdump_text_tbl text_tbl; @@ -28,57 +28,28 @@ public class Hdump_save_mgr { this.Insert(page); } public void Insert(Xoa_page page) { - tmp_bfr.Clear(); + Hdump_page_body_srl.Save(tmp_bfr, page); int page_id = page.Revision_data().Id(); - Xopg_html_data html_data = page.Html_data(); - Xopg_hdump_data hdump_data = page.Hdump_data(); - text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_body, hdump_data.Body()); - Insert_files(page_id, hdump_data.Imgs()); - Insert_if_exists(page_id, Hdump_text_row_tid.Tid_display_ttl, html_data.Display_ttl()); - Insert_if_exists(page_id, Hdump_text_row_tid.Tid_content_sub, html_data.Content_sub()); - Insert_sidebars(page_id, page, html_data.Xtn_skin_mgr()); - } - private void Insert_files(int page_id, ListAdp imgs) { - byte[] imgs_bry = Write_imgs(tmp_bfr, imgs); - if (imgs_bry != null) - text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_img, imgs_bry); - } - private void Insert_if_exists(int page_id, int tid, byte[] val) { - if (Bry_.Len_gt_0(val)) - text_tbl.Insert(page_id, tid, val); - } - private void Insert_sidebars(int page_id, Xoa_page page, Xopg_xtn_skin_mgr xtn_skin_mgr) { - int len = xtn_skin_mgr.Count(); - for (int i = 0; i < len; ++i) { - Xopg_xtn_skin_itm itm = xtn_skin_mgr.Get_at(i); - if (itm.Tid() == Xopg_xtn_skin_itm_tid.Tid_sidebar) { - itm.Write(tmp_bfr, page); - text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_sidebar_div, tmp_bfr.XtoAryAndClear()); - } - } + text_tbl.Insert(page_id, Hdump_text_row_tid.Tid_body, tmp_bfr.XtoAryAndClear()); + byte[] redlinks_bry = Write_redlinks(tmp_bfr, page.Html_data().Redlink_mgr()); + if (redlinks_bry != null) text_tbl.Insert(page_id, Hdump_data_tid.Tid_redlink, redlinks_bry); + byte[] imgs_bry = Write_imgs(tmp_bfr, page.Hdump_data().Imgs()); + if (imgs_bry != null) text_tbl.Insert(page_id, Hdump_data_tid.Tid_img, imgs_bry); } public static byte[] Write_imgs(Bry_bfr bfr, ListAdp imgs) { int len = imgs.Count(); if (len == 0) return null; // no images; exit early, else will write blank String for (int i = 0; i < len; ++i) { - Xof_xfer_itm img = (Xof_xfer_itm)imgs.FetchAt(i); - Write_img(bfr, img.Html_uid(), img.Html_w(), img.Html_h(), img.Lnki_ttl(), img.Html_view_src_rel()); + Hdump_data_img__base img = (Hdump_data_img__base)imgs.FetchAt(i); + img.Write(bfr); } return bfr.XtoAryAndClear(); } - private static void Write_img(Bry_bfr bfr, int uid, int img_w, int img_h, byte[] lnki_ttl, byte[] img_src_rel) { - bfr .Add_int_variable(uid) - .Add_byte_pipe().Add_int_variable(img_w) - .Add_byte_pipe().Add_int_variable(img_h) - .Add_byte_pipe().Add(lnki_ttl) - .Add_byte_pipe().Add(img_src_rel) - .Add_byte_nl() - ; + private static byte[] Write_redlinks(Bry_bfr bfr, Int_list redlink_mgr) { + int len = redlink_mgr.Len(); if (len == 0) return null; + bfr.Add_int_variable(len); + for (int i = 0; i < len; ++i) { + bfr.Add_byte_pipe().Add_int_variable(redlink_mgr.Get_at(i)); + } + return bfr.XtoAryAndClear(); } } -/* -<0/>|0|metadata -<1/>|title -<2/>|content_sub -<3/>|sidebar -<4/>|body -*/ \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java index 58d1c8607..4437724e2 100644 --- a/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java +++ b/400_xowa/src/gplx/xowa/html/Xoh_html_wtr.java @@ -283,7 +283,7 @@ public class Xoh_html_wtr { bfr.Add(bry.Val()); } @gplx.Virtual public void Vnt(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_vnt_tkn vnt) { - Xop_vnt_html_wtr.Write(this, ctx, hctx, bfr, src, vnt); // NOTE: using wiki, b/c getting nullPointer with ctx during mass parse + Xop_vnt_html_wtr.Write(bfr, this, ctx, hctx, page, src, vnt); // NOTE: using wiki, b/c getting nullPointer with ctx during mass parse } @gplx.Virtual public void Under(Xop_ctx ctx, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Xop_under_tkn under) { if (hctx.Mode_is_alt()) return; @@ -405,7 +405,7 @@ public class Xoh_html_wtr { case Xop_xnde_tag_.Tid_math: case Xop_xnde_tag_.Tid_xowa_html: Xox_xnde xtn = xnde.Xnde_xtn(); - xtn.Xtn_write(app, this, hctx, ctx, bfr, src, xnde); + xtn.Xtn_write(bfr, app, ctx, this, hctx, xnde, src); break; case Xop_xnde_tag_.Tid_xowa_tag_bgn: case Xop_xnde_tag_.Tid_xowa_tag_end: diff --git a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module__top_icon.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core.java similarity index 77% rename from 400_xowa/src/gplx/xowa/wikis/modules/Xow_module__top_icon.java rename to 400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core.java index cfa6c544a..2815f6431 100644 --- a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module__top_icon.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core.java @@ -15,6 +15,7 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.wikis.modules; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; -public class Xow_module__top_icon extends Xow_module_base { +package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +public interface Xoh_arg_img_core extends Bry_fmtr_arg { + Xoh_arg_img_core Init(int uid, byte[] src, int w, int h); } diff --git a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_fmtr__sidebars.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core__basic.java similarity index 60% rename from 400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_fmtr__sidebars.java rename to 400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core__basic.java index 296cc5f17..7af044d8a 100644 --- a/400_xowa/src/gplx/xowa/hdumps/htmls/Hdump_html_fmtr__sidebars.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core__basic.java @@ -15,17 +15,12 @@ GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package gplx.xowa.hdumps.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.hdumps.*; - import gplx.xowa.hdumps.core.*; -class Hdump_html_fmtr__sidebars implements Bry_fmtr_arg { - private Hdump_page_itm page; - public void Init_by_page(Hdump_page_itm page) {this.page = page;} +package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +public class Xoh_arg_img_core__basic implements Xoh_arg_img_core { + private byte[] src; private int w, h; + public Xoh_arg_img_core Init(int uid, byte[] src, int w, int h) {this.src = src; this.w = w; this.h = h; return this;} public void XferAry(Bry_bfr bfr, int idx) { - byte[][] sidebar_divs = page.Sidebar_divs(); - int sidebar_divs_len = sidebar_divs.length; - for (int i = 0; i < sidebar_divs_len; ++i) { - byte[] sidebar_div = sidebar_divs[i]; - bfr.Add(sidebar_div); - } + fmtr_img_atrs.Bld_bfr_many(bfr, src, w, h); } + private Bry_fmtr fmtr_img_atrs = Bry_fmtr.new_(" src=\"~{img_src}\" width=\"~{img_w}\" height=\"~{img_h}\"", "img_src", "img_w", "img_h"); } diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core__hdump.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core__hdump.java new file mode 100644 index 000000000..9c231a2b5 --- /dev/null +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_arg_img_core__hdump.java @@ -0,0 +1,31 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; +public class Xoh_arg_img_core__hdump implements Xoh_arg_img_core { + private int uid; + public Xoh_arg_img_core Init(int uid, byte[] img_src, int img_w, int img_h) { + this.uid = uid; + return this; + } + public void XferAry(Bry_bfr bfr, int idx) { + bfr.Add_byte_space(); + bfr.Add(gplx.xowa.hdumps.htmls.Hdump_html_consts.Key_img); + bfr.Add_int_variable(uid); + bfr.Add_byte_apos(); + } +} diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java index e855d3e8e..cadf18f9a 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_html_fmtr__base.java @@ -17,26 +17,6 @@ along with this program. If not, see . */ package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.htmls.*; -class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base { - private Bry_bfr tmp_bfr = Bry_bfr.reset_(128); - @gplx.Internal @Override protected Xoh_arg_img_core New_arg_img_core() {return new Xoh_arg_img_core__hdump();} - @Override public void Html_thumb_core(Bry_bfr bfr, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) { - tmp_bfr.Add(Hdump_html_fmtr__body.Key_img_style); - tmp_bfr.Add_int_variable(uid); - tmp_bfr.Add_byte_apos(); - byte[] div2_width_repl = tmp_bfr.XtoAryAndClear(); - fmtr_thumb_core.Bld_bfr_many(bfr, uid, div1_halign, div2_width_repl, div2_content); - } - @Override public void Html_thumb_part_magnify(Bry_bfr bfr, int uid, byte[] a_href, byte[] a_title, byte[] img_src) {Write_xnde(bfr, Hdump_html_fmtr__body.Key_file_mgnf, uid);} - @Override public void Html_thumb_part_info(Bry_bfr bfr, int uid, byte[] a_href, byte[] img_src) {Write_xnde(bfr, Hdump_html_fmtr__body.Key_file_info, uid);} - @Override public void Html_thumb_part_play(Bry_bfr bfr, int uid, int a_width, int a_max_width, byte[] a_href, byte[] a_xowa_title, byte[] img_src) {Write_xnde(bfr, Hdump_html_fmtr__body.Key_file_play, uid);} - public static void Write_xnde(Bry_bfr bfr, byte[] key, int uid) { - bfr.Add(key); - bfr.Add_int_variable(uid); - bfr.Add(Bry_xnde_end); - } private static final byte[] Bry_xnde_end = Bry_.new_ascii_("'/>"); - public static final Xoh_file_html_fmtr__hdump Hdump = new Xoh_file_html_fmtr__hdump(); Xoh_file_html_fmtr__hdump() {} -} public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { private final Xoh_arg_img_core arg_img_core; private Bry_bfr scratch_bfr = Bry_bfr.reset_(128); @@ -50,7 +30,7 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { , "" ), "a_href", "a_xowa_title", "html" ); - public void Html_full_img(Bry_bfr tmp_bfr, Xoa_page page, Xof_xfer_itm xfer_itm, int uid, byte[] a_href, byte[] a_class, byte[] a_rel, byte[] a_title, byte[] a_xowa_title, int img_w, int img_h, byte[] img_src, byte[] img_alt, byte[] img_class) { + public void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoa_page page, Xof_xfer_itm xfer_itm, int uid, byte[] a_href, byte[] a_class, byte[] a_rel, byte[] a_title, byte[] a_xowa_title, int img_w, int img_h, byte[] img_src, byte[] img_alt, byte[] img_class) { fmtr_full_img.Bld_bfr_many(tmp_bfr, uid, a_href, a_class, a_rel, a_title, a_xowa_title, arg_img_core.Init(uid, img_src, img_w, img_h), img_alt, img_class); } private Bry_fmtr fmtr_full_img = Bry_fmtr.new_ @@ -159,27 +139,23 @@ public class Xoh_file_html_fmtr__base implements Xoh_file_img_wkr { public static final Xoh_file_html_fmtr__base Base = new Xoh_file_html_fmtr__base(); } -interface Xoh_arg_img_core extends Bry_fmtr_arg { - Xoh_arg_img_core Init(int uid, byte[] src, int w, int h); -} -class Xoh_arg_img_core__hdump implements Xoh_arg_img_core { - private int uid; - public Xoh_arg_img_core Init(int uid, byte[] img_src, int img_w, int img_h) { - this.uid = uid; - return this; +class Xoh_file_html_fmtr__hdump extends Xoh_file_html_fmtr__base { + private Bry_bfr tmp_bfr = Bry_bfr.reset_(128); + @gplx.Internal @Override protected Xoh_arg_img_core New_arg_img_core() {return new Xoh_arg_img_core__hdump();} + @Override public void Html_thumb_core(Bry_bfr bfr, int uid, byte[] div1_halign, int div2_width, byte[] div2_content) { + tmp_bfr.Add(Hdump_html_consts.Key_img_style); + tmp_bfr.Add_int_variable(uid); + tmp_bfr.Add_byte_apos(); + byte[] div2_width_repl = tmp_bfr.XtoAryAndClear(); + fmtr_thumb_core.Bld_bfr_many(bfr, uid, div1_halign, div2_width_repl, div2_content); } - public void XferAry(Bry_bfr bfr, int idx) { - bfr.Add_str(" xowa_img='"); + @Override public void Html_thumb_part_magnify(Bry_bfr bfr, int uid, byte[] a_href, byte[] a_title, byte[] img_src) {Write_xnde(bfr, Hdump_html_consts.Key_file_mgnf, uid);} + @Override public void Html_thumb_part_info(Bry_bfr bfr, int uid, byte[] a_href, byte[] img_src) {Write_xnde(bfr, Hdump_html_consts.Key_file_info, uid);} + @Override public void Html_thumb_part_play(Bry_bfr bfr, int uid, int a_width, int a_max_width, byte[] a_href, byte[] a_xowa_title, byte[] img_src) {Write_xnde(bfr, Hdump_html_consts.Key_file_play, uid);} + public static void Write_xnde(Bry_bfr bfr, byte[] key, int uid) { + bfr.Add(key); bfr.Add_int_variable(uid); - bfr.Add_str("'"); -// Xoh_file_html_fmtr__hdump.Write_fmt(bfr, Hdump_html_fmtr__body.Key_img, uid); - } -} -class Xoh_arg_img_core__basic implements Xoh_arg_img_core { - private byte[] src; private int w, h; - public Xoh_arg_img_core Init(int uid, byte[] src, int w, int h) {this.src = src; this.w = w; this.h = h; return this;} - public void XferAry(Bry_bfr bfr, int idx) { - fmtr_img_atrs.Bld_bfr_many(bfr, src, w, h); - } - private Bry_fmtr fmtr_img_atrs = Bry_fmtr.new_(" src=\"~{img_src}\" width=\"~{img_w}\" height=\"~{img_h}\"", "img_src", "img_w", "img_h"); -} + bfr.Add(Bry_xnde_end); + } private static final byte[] Bry_xnde_end = Bry_.new_ascii_("'/>"); + public static final Xoh_file_html_fmtr__hdump Hdump = new Xoh_file_html_fmtr__hdump(); Xoh_file_html_fmtr__hdump() {} +} \ No newline at end of file diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_img_wkr.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_img_wkr.java index 9cf32e211..42d62abaf 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_img_wkr.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_img_wkr.java @@ -18,5 +18,5 @@ along with this program. If not, see . package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; import gplx.xowa.files.*; public interface Xoh_file_img_wkr { - void Html_full_img(Bry_bfr tmp_bfr, Xoa_page page, Xof_xfer_itm xfer_itm, int uid, byte[] a_href, byte[] a_class, byte[] a_rel, byte[] a_title, byte[] a_xowa_title, int img_w, int img_h, byte[] img_src, byte[] img_alt, byte[] img_class); + void Html_full_img(Bry_bfr tmp_bfr, Xoh_wtr_ctx hctx, Xoa_page page, Xof_xfer_itm xfer_itm, int uid, byte[] a_href, byte[] a_class, byte[] a_rel, byte[] a_title, byte[] a_xowa_title, int img_w, int img_h, byte[] img_src, byte[] img_alt, byte[] img_class); } diff --git a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java index 9a83ee651..68dabd1a1 100644 --- a/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java +++ b/400_xowa/src/gplx/xowa/html/lnkis/Xoh_file_wtr__basic.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.html.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; -import gplx.html.*; import gplx.xowa.files.*; +import gplx.html.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.core.*; public class Xoh_file_wtr__basic { private final Xow_wiki wiki; private final Xow_html_mgr html_mgr; private final Xoh_html_wtr html_wtr; private final Bry_bfr_mkr bfr_mkr; private final Bry_bfr scratch_bfr = Bry_bfr.reset_(Io_mgr.Len_kb); private final Xoh_lnki_text_fmtr media_alt_fmtr, caption_fmtr; @@ -76,10 +76,8 @@ public class Xoh_file_wtr__basic { else // image this.Write_file_image(bfr, ctx, hctx, src, lnki, xfer_itm, uid, div_width, lnki_halign, lnki_halign_bry, lnki_ttl, lnki_ext, lnki_href, img_view_src, img_orig_src, img_alt); } - if (hctx.Mode_is_hdump()) { - byte[] rel_src = Bry_.Len_eq_0(img_view_src) ? Bry_.Empty : Bry_.Mid(img_view_src, wiki.App().Fsys_mgr().File_dir().To_http_file_bry().length); - xfer_itm.Html_view_src_rel_(rel_src); - page.Hdump_data().Imgs().Add(xfer_itm.Clone()); + if (hctx.Mode_is_hdump() && Xof_html_elem.Tid_is_file(xfer_itm.Html_elem_tid())) { + page.Hdump_data().Imgs_add(new Hdump_data_img__basic(), xfer_itm, Hdump_data_img__gallery.Tid_basic); } } private void Write_file_ns_media(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src) { @@ -130,7 +128,7 @@ public class Xoh_file_wtr__basic { } Arg_nde_tkn lnki_link_tkn = lnki.Link_tkn(); if (lnki_link_tkn == Arg_nde_tkn.Null) // full - lnki_file_wkr.Html_full_img(bfr, page, xfer_itm, uid, lnki_href, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(lnki)); + lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, lnki_href, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(lnki)); else { // thumb Arg_itm_tkn link_tkn = lnki_link_tkn.Val_tkn(); byte[] link_ref = link_tkn.Dat_to_bry(src); @@ -138,7 +136,7 @@ public class Xoh_file_wtr__basic { link_ref = link_ref_new == null ? lnki_href: link_ref_new; // if parse fails, then assign to lnki_href; EX:link={{{1}}} link_ref = ctx.App().Encoder_mgr().Href_quotes().Encode(link_ref); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16 lnki_ttl = Bry_.Coalesce(lnki_ttl, tmp_link_parser.Html_xowa_ttl()); - lnki_file_wkr.Html_full_img(bfr, page, xfer_itm, uid, link_ref, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(lnki)); + lnki_file_wkr.Html_full_img(bfr, hctx, page, xfer_itm, uid, link_ref, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, Arg_img_cls(lnki)); } if (div_align_exists) bfr.Add(Html_tag_.Div_rhs); // close div from above } @@ -149,7 +147,7 @@ public class Xoh_file_wtr__basic { byte[] lnki_alt_html = wiki.Html_mgr().Imgs_mgr().Alt_in_caption().Val() ? Arg_alt_html(ctx, src, lnki) : Bry_.Empty; byte[] lnki_cls = xfer_itm.Html_pass() ? Xow_html_mgr.Bry_img_cls_thumbimage : Xow_html_mgr.Bry_img_cls_none; Bry_bfr tmp_bfr = bfr_mkr.Get_k004(); - lnki_file_wkr.Html_full_img(tmp_bfr, page, xfer_itm, uid, lnki_href, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), view_src, lnki_alt_text, lnki_cls); + lnki_file_wkr.Html_full_img(tmp_bfr, hctx, page, xfer_itm, uid, lnki_href, Xow_html_mgr.Bry_anchor_class_image, Xow_html_mgr.Bry_anchor_rel_blank, anchor_title, lnki_ttl, xfer_itm.Html_w(), xfer_itm.Html_h(), view_src, lnki_alt_text, lnki_cls); byte[] thumb = tmp_bfr.XtoAryAndClear(); html_fmtr.Html_thumb_file_image(tmp_bfr, thumb, Arg_caption_div(ctx, src, lnki, uid, img_orig_src, lnki_href), lnki_alt_html); return tmp_bfr.Mkr_rls().XtoAryAndClear(); diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__navframe.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__navframe.java index 9bc680740..a3e82206d 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__navframe.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_itm__navframe.java @@ -28,7 +28,7 @@ public class Xoh_module_itm__navframe implements Xoh_module_itm { public void Write_js_head_global(Xoa_app app, Xow_wiki wiki, Xoa_page page, Xoh_module_wtr wtr) { if (!enabled) return; wtr.Write_js_global_ini_atr_val(Key_enabled , true); - wtr.Write_js_global_ini_atr_val(Key_collapsed , app.Api_root().Html().Modules().Navframe().Collapsed()); + wtr.Write_js_global_ini_atr_val(Key_collapsed , app.Api_root().Html().Modules().Navframe().Collapsed() || wiki.Html_mgr().Module_mgr().Itm_navframe().Enabled_n()); wtr.Write_js_global_ini_atr_msg(wiki , Key_show); wtr.Write_js_global_ini_atr_msg(wiki , Key_hide); } diff --git a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr.java b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr.java index 6f2c10d43..cd84eb96d 100644 --- a/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr.java +++ b/400_xowa/src/gplx/xowa/html/modules/Xoh_module_mgr.java @@ -37,8 +37,8 @@ public class Xoh_module_mgr implements Bry_fmtr_arg { return this; } public Xoh_module_mgr Init_dflts() { - if (page.Hdr_mgr().Toc_enabled()) itm_toc.Enabled_y_(); - if (wiki.Html_mgr().Module_mgr().Itm_top_icon().Enabled()) itm_top_icon.Enabled_y_(); + if (page.Hdr_mgr().Toc_enabled()) itm_toc.Enabled_y_(); + if (wiki.Html_mgr().Module_mgr().Itm_top_icon().Enabled_y()) itm_top_icon.Enabled_y_(); itm_css.Enabled_y_(); itm_globals.Enabled_y_(); // for now, always mark this and rest as exists; DATE:2014-06-09 itm_collapsible.Enabled_y_(); diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_html_wtr.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_html_wtr.java index 9ac756af9..fe3000704 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_html_wtr.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_html_wtr.java @@ -18,7 +18,7 @@ along with this program. If not, see . package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.html.*; public class Xop_vnt_html_wtr { - public static void Write(Xoh_html_wtr html_wtr, Xop_ctx ctx, Xoh_wtr_ctx opts, Bry_bfr bfr, byte[] src, Xop_vnt_tkn vnt) { + public static void Write(Bry_bfr bfr, Xoh_html_wtr html_wtr, Xop_ctx ctx, Xoh_wtr_ctx hctx, Xoa_page page, byte[] src, Xop_vnt_tkn vnt) { byte[] cur_lang_vnt = ctx.Wiki().Lang().Vnt_mgr().Cur_vnt(); Xop_vnt_rule[] rules = vnt.Vnt_rules(); if (rules == null) return; // shouldn't happen, but guard anyway int rules_len = rules.length; @@ -28,19 +28,15 @@ public class Xop_vnt_html_wtr { bfr.Add_mid(src, vnt.Src_bgn(), vnt.Src_end()); break; case Xop_vnt_html_wtr.Cmd_literal: { // val only; "A" - Xop_vnt_rule rule_0 = rules[0]; // Cmd_calc guarantees there will always be 1 item - html_wtr.Write_tkn_ary(bfr, ctx, opts, src, rule_0.Rule_subs()); + Xop_vnt_rule rule_0 = rules[0]; // Cmd_calc guarantees there will always be 1 item + html_wtr.Write_tkn_ary(bfr, ctx, hctx, src, rule_0.Rule_subs()); break; } - case Xop_vnt_html_wtr.Cmd_bidi: // matching rule: "A" if zh-hans; -{zh-hans:A}- - for (int i = 0; i < rules_len; i++) { - Xop_vnt_rule rule = rules[i]; - if (Bry_.Eq(rule.Rule_lang(), cur_lang_vnt)) { - html_wtr.Write_tkn_ary(bfr, ctx, opts, src, rule.Rule_subs()); - break; - } - } + case Xop_vnt_html_wtr.Cmd_bidi: { // matching rule: "A" if zh-hans; -{zh-hans:A}- + Xop_vnt_rule rule = Get_rule_by_key(rules, rules_len, cur_lang_vnt); + if (rule != null) html_wtr.Write_tkn_ary(bfr, ctx, hctx, src, rule.Rule_subs()); break; + } case Xop_vnt_html_wtr.Cmd_lang: { // matching lang: "A" if zh-hans; -{zh-hans|A}- Xop_vnt_rule rule_0 = rules[0]; // Cmd_calc guarantees there will always be 1 rule Xop_vnt_flag flag_0 = vnt.Vnt_flags()[0]; // parse guarantees there will always be 1 flag @@ -49,7 +45,7 @@ public class Xop_vnt_html_wtr { for (int i = 0; i < flags_len; i++) { byte[] lang = langs[i]; if (Bry_.Eq(lang, cur_lang_vnt)) { - html_wtr.Write_tkn_ary(bfr, ctx, opts, src, rule_0.Rule_subs()); + html_wtr.Write_tkn_ary(bfr, ctx, hctx, src, rule_0.Rule_subs()); break; } } @@ -63,8 +59,16 @@ public class Xop_vnt_html_wtr { // bfr.Add_mid(src, vnt.Vnt_pipe_idx_last(), vnt.Src_end() - 2); break; } + case Xop_vnt_html_wtr.Cmd_title: break; // title: ignore; already handled during parse; DATE:2014-08-29 } } + public static Xop_vnt_rule Get_rule_by_key(Xop_vnt_rule[] rules, int rules_len, byte[] cur_lang_vnt) { + for (int i = 0; i < rules_len; i++) { + Xop_vnt_rule rule = rules[i]; + if (Bry_.Eq(rule.Rule_lang(), cur_lang_vnt)) return rule; + } + return null; + } public static final byte Cmd_error = 0 // eror -> output literal; EX: "-{some_unknown_error}-" -> "-{some_unknown_error}-" , Cmd_empty = 1 // empty -> output nothing; EX: "-{}-" -> "" @@ -73,5 +77,6 @@ public class Xop_vnt_html_wtr { , Cmd_lang = 4 // lang EX: "-{zh-hans|A}-" -> "A" if zh-hans; "" if zh-hant , Cmd_raw = 5 // raw; text in -{}- EX: "-{R|zh-hans:A;zh-hant:B}- -> "zh-hans:A;zh-hant:B" , Cmd_descrip = 6 // describe; output rules EX: "-{D|zh-hans:A;zh-hant:B}- -> "简体:A;繁體:B;" + , Cmd_title = 7 // title; change title EX: "-{T|zh-hans:A;zh-hant:B}- -> "A" as display title ; } diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_.java index 4f9d374c5..2d1f185f4 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_lxr_.java @@ -67,6 +67,7 @@ class Xop_vnt_lxr_end implements Xop_lxr { int stack_pos = ctx.Stack_idx_typ(Xop_tkn_itm_.Tid_vnt); if (stack_pos == Xop_ctx.Stack_not_found) return ctx.Lxr_make_txt_(cur_pos); // "}-" found but no "-{" in stack; Xop_vnt_tkn vnt_tkn = (Xop_vnt_tkn)ctx.Stack_pop_til(root, src, stack_pos, false, bgn_pos, cur_pos, Xop_tkn_itm_.Tid_vnt); + Xow_wiki wiki = ctx.Wiki(); try { vnt_tkn.Src_end_(cur_pos); vnt_tkn.Subs_move(root); @@ -74,7 +75,7 @@ class Xop_vnt_lxr_end implements Xop_lxr { int rule_subs_bgn = 0; int pipe_tkn_count = vnt_tkn.Vnt_pipe_tkn_count(); if (pipe_tkn_count > 0) { - flag_parser.Parse(ctx.Wiki(), vnt_tkn, pipe_tkn_count, src); + flag_parser.Parse(wiki, vnt_tkn, pipe_tkn_count, src); vnt_flag_ary = flag_parser.Rslt_flags(); rule_subs_bgn = flag_parser.Rslt_tkn_pos(); vnt_tkn.Vnt_pipe_idx_last_(flag_parser.Rslt_pipe_last()); @@ -82,7 +83,7 @@ class Xop_vnt_lxr_end implements Xop_lxr { vnt_tkn.Vnt_flags_(vnt_flag_ary); Xop_vnt_rule[] rules = rule_parser.Parse(ctx, vnt_tkn, src, rule_subs_bgn); vnt_tkn.Vnt_rules_(rules); - vnt_tkn.Vnt_cmd_calc(); + vnt_tkn.Vnt_cmd_calc(wiki, ctx.Cur_page(), ctx, src); } catch (Exception e) { ctx.App().Usr_dlg().Warn_many("", "", "vnt.parse failed: page=~{0} src=~{1} err=~{2}", String_.new_utf8_(ctx.Cur_page().Ttl().Raw()), String_.new_utf8_(src, bgn_pos, cur_pos), Err_.Message_gplx_brief(e)); diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_parser_tst.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_parser_tst.java index 97cc00c44..ce74fd2b6 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_parser_tst.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_parser_tst.java @@ -58,8 +58,12 @@ public class Xop_vnt_parser_tst { // uses zh-hant as cur_vnt @Test public void Macro_ignore() { // PURPOSE: ignore macro (implement later); EX:zh.v:西安; Template:pagebanner; DATE:2014-05-03 fxt.Test_parse("-{H|zh-cn:亚琛; zh-tw:阿亨;}-", ""); } + @Test public void Title() { // PURPOSE: implement title; PAGE:zh.w:Help:進階字詞轉換處理 DATE:2014-08-29 + fxt.Test_parse("-{T|zh-hant:A;zh-hans:B}-", ""); + Tfds.Eq("A", String_.new_utf8_(fxt.Parser_fxt().Page().Html_data().Display_ttl_vnt())); + } } -class Xop_vnt_parser_fxt { +class Xop_vnt_parser_fxt { public Xop_fxt Parser_fxt() {return fxt;} private Xop_fxt fxt; public Xop_vnt_parser_fxt Clear() { Xoa_app app = Xoa_app_fxt.app_(); diff --git a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java index d44feef15..8ee7d094d 100644 --- a/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java +++ b/400_xowa/src/gplx/xowa/langs/vnts/Xop_vnt_tkn.java @@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; +import gplx.xowa.html.*; public class Xop_vnt_tkn extends Xop_tkn_itm_base { public Xop_vnt_tkn(int bgn, int end) { this.Tkn_ini_pos(false, bgn, end); @@ -28,7 +29,7 @@ public class Xop_vnt_tkn extends Xop_tkn_itm_base { public Xop_vnt_flag[] Vnt_flags() {return vnt_flags;} public Xop_vnt_tkn Vnt_flags_(Xop_vnt_flag[] v) {vnt_flags = v; return this;} private Xop_vnt_flag[] vnt_flags; public Xop_vnt_rule[] Vnt_rules() {return vnt_rules;} public Xop_vnt_tkn Vnt_rules_(Xop_vnt_rule[] v) {vnt_rules = v; return this;} private Xop_vnt_rule[] vnt_rules; public byte Vnt_cmd() {return vnt_cmd;} private byte vnt_cmd; - public void Vnt_cmd_calc() { + public void Vnt_cmd_calc(Xow_wiki wiki, Xoa_page page, Xop_ctx ctx, byte[] src) { int flags_len = vnt_flags.length; int rules_len = vnt_rules.length; if (flags_len == 0) { // no flags; either literal ("-{A}-") or bidi ("-{zh-hans:A;zh-hant:B}-"); @@ -51,6 +52,18 @@ public class Xop_vnt_tkn extends Xop_tkn_itm_base { case Xop_vnt_flag_.Tid_descrip : vnt_cmd = Xop_vnt_html_wtr.Cmd_descrip; break; case Xop_vnt_flag_.Tid_unknown : vnt_cmd = Xop_vnt_html_wtr.Cmd_literal; break; // flag is unknown; output text as literal; EX: "-{|a}-"; "-{X|a}-" case Xop_vnt_flag_.Tid_macro : vnt_cmd = Xop_vnt_html_wtr.Cmd_empty; break; // TODO: implement macro; ignore for now; DATE:2014-05-03 + case Xop_vnt_flag_.Tid_title: { // title; same as {{DISPLAYTITLE}} but variant aware; PAGE:zh.w:Help:進階字詞轉換處理 DATE:2014-08-29 + vnt_cmd = Xop_vnt_html_wtr.Cmd_title; + byte[] cur_lang_vnt = wiki.Lang().Vnt_mgr().Cur_vnt(); + Xop_vnt_rule rule = Xop_vnt_html_wtr.Get_rule_by_key(vnt_rules, vnt_rules.length, cur_lang_vnt); + if (rule != null) { + Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_b512(); + wiki.Html_mgr().Html_wtr().Write_tkn_ary(tmp_bfr, ctx, Xoh_wtr_ctx.Alt, src, rule.Rule_subs()); + byte[] display_ttl = tmp_bfr.Mkr_rls().XtoAryAndClear(); + page.Html_data().Display_ttl_vnt_(display_ttl); + } + break; + } } } } diff --git a/400_xowa/src/gplx/xowa/pages/Xopg_html_data.java b/400_xowa/src/gplx/xowa/pages/Xopg_html_data.java index 962c2dad8..9e4ae0b8d 100644 --- a/400_xowa/src/gplx/xowa/pages/Xopg_html_data.java +++ b/400_xowa/src/gplx/xowa/pages/Xopg_html_data.java @@ -21,19 +21,34 @@ public class Xopg_html_data { private OrderedHash ctg_hash; public boolean Html_restricted() {return html_restricted;} private boolean html_restricted = true; public void Html_restricted_(boolean v) {html_restricted = v;} public void Html_restricted_n_() {Html_restricted_(Bool_.N);} public void Html_restricted_y_() {Html_restricted_(Bool_.Y);} - public byte[] Display_ttl() {return display_ttl;} public Xopg_html_data Display_ttl_(byte[] v) {display_ttl = v; return this;} private byte[] display_ttl; + public byte[] Display_ttl() { + return ( display_ttl_vnt != null // -{T}- was in document + && display_ttl == null // {{DISPLAYTITLE}} does not exist + && lang_convert_content // __NOCONVERTCONTENT__ exists + && lang_convert_title // __NOCONVERTTITLE__ exists + ) + ? display_ttl_vnt // return variant title; DATE:2014-08-29 + : display_ttl // return normal title + ; + } + public Xopg_html_data Display_ttl_(byte[] v) {display_ttl = v; return this;} private byte[] display_ttl; + public byte[] Display_ttl_vnt() {return display_ttl_vnt;} public void Display_ttl_vnt_(byte[] v) {display_ttl_vnt = v;} private byte[] display_ttl_vnt; public byte[] Content_sub() {return content_sub;} public void Content_sub_(byte[] v) {content_sub = v;} private byte[] content_sub; public String Bmk_pos() {return html_bmk_pos;} public void Bmk_pos_(String v) {html_bmk_pos = v;} private String html_bmk_pos; public Bry_bfr Portal_div_xtn() {return portal_div_xtn;} private Bry_bfr portal_div_xtn = Bry_bfr.reset_(255); public byte[] Edit_preview_w_dbg() {return Bry_.Add(xtn_scribunto_dbg, edit_preview);} public void Edit_preview_(byte[] v) {edit_preview = v;} private byte[] edit_preview = Bry_.Empty; public int Lnke_autonumber_next() {return lnke_autonumber++;} private int lnke_autonumber = 1; + public boolean Lang_convert_content() {return lang_convert_content;} public void Lang_convert_content_(boolean v) {lang_convert_content = v;} private boolean lang_convert_content = true; + public boolean Lang_convert_title() {return lang_convert_title;} public void Lang_convert_title_(boolean v) {lang_convert_title = v;} private boolean lang_convert_title = true; public Xopg_xtn_skin_mgr Xtn_skin_mgr() {return xtn_skin_mgr;} private Xopg_xtn_skin_mgr xtn_skin_mgr = new Xopg_xtn_skin_mgr(); + public int Xtn_gallery_next_id() {return ++xtn_gallery_next_id;} private int xtn_gallery_next_id = -1; public boolean Xtn_gallery_packed_exists() {return xtn_gallery_packed_exists;} public void Xtn_gallery_packed_exists_y_() {xtn_gallery_packed_exists = true;} private boolean xtn_gallery_packed_exists; public boolean Xtn_imap_exists() {return xtn_imap_exists;} public void Xtn_imap_exists_y_() {xtn_imap_exists = true;} private boolean xtn_imap_exists; public int Xtn_imap_next_id() {return ++xtn_imap_next_id;} private int xtn_imap_next_id; // NOTE: must keep separate imap_id b/c html_elem_id is not always set; public byte[] Xtn_search_text() {return xtn_search_txt;} public void Xtn_search_text_(byte[] v) {xtn_search_txt = v;} private byte[] xtn_search_txt = Bry_.Empty; public byte[] Xtn_scribunto_dbg() {return xtn_scribunto_dbg;} public void Xtn_scribunto_dbg_(byte[] v) {xtn_scribunto_dbg = Bry_.Add(xtn_scribunto_dbg, v);} private byte[] xtn_scribunto_dbg = Bry_.Empty; public Xoh_module_mgr Module_mgr() {return module_mgr;} private Xoh_module_mgr module_mgr = new Xoh_module_mgr(); + public Int_list Redlink_mgr() {return redlink_mgr;} private Int_list redlink_mgr = new Int_list(); public byte[] Custom_html() {return custom_html;} public Xopg_html_data Custom_html_(byte[] v) {custom_html = v; return this;} private byte[] custom_html; public byte[] Custom_name() {return custom_name;} public Xopg_html_data Custom_name_(byte[] v) {custom_name = v; return this;} private byte[] custom_name; public byte[] Custom_head_end() {return custom_head_end;} @@ -52,16 +67,17 @@ public class Xopg_html_data { } private byte[] custom_html_end; public void Clear() { html_restricted = true; - display_ttl = null; - content_sub = Bry_.Empty; + display_ttl = content_sub = display_ttl_vnt = null; + lang_convert_content = lang_convert_title = true; lnke_autonumber = 1; xtn_skin_mgr.Clear(); xtn_gallery_packed_exists = false; - xtn_imap_next_id = 0; + xtn_imap_next_id = 0; xtn_gallery_next_id = -1; xtn_imap_exists = false; xtn_search_txt = Bry_.Empty; xtn_scribunto_dbg = Bry_.Empty; module_mgr.Clear(); + redlink_mgr.Clear(); custom_html = custom_html_end = custom_head_end = custom_name = null; if (ctg_hash != null) ctg_hash.Clear(); } diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xop_lnki_logger_redlinks_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xop_lnki_logger_redlinks_wkr.java index 62974bd7f..f950d868a 100644 --- a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xop_lnki_logger_redlinks_wkr.java +++ b/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xop_lnki_logger_redlinks_wkr.java @@ -17,7 +17,7 @@ along with this program. If not, see . */ package gplx.xowa.parsers.lnkis.redlinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.dbs.tbls.*; -import gplx.xowa.langs.vnts.*; import gplx.xowa.gui.views.*; +import gplx.xowa.langs.vnts.*; import gplx.xowa.gui.views.*; import gplx.xowa.pages.*; public class Xop_lnki_logger_redlinks_wkr implements GfoInvkAble { private Xow_wiki wiki; private Xog_win_itm win; private Xoa_page page; private ListAdp lnki_list; private boolean log_enabled; private Gfo_usr_dlg usr_dlg; @@ -71,6 +71,7 @@ public class Xop_lnki_logger_redlinks_wkr implements GfoInvkAble { Bry_bfr bfr = null; boolean variants_enabled = wiki.Lang().Vnt_mgr().Enabled(); Xol_vnt_mgr vnt_mgr = wiki.Lang().Vnt_mgr(); + Int_list redlink_mgr = page.Html_data().Redlink_mgr(); for (int j = 0; j < len; j++) { Xop_lnki_tkn lnki = (Xop_lnki_tkn)work_list.FetchAt(j); byte[] full_db = lnki.Ttl().Full_db(); @@ -94,7 +95,9 @@ public class Xop_lnki_logger_redlinks_wkr implements GfoInvkAble { } if (win.Usr_dlg().Canceled()) return; if (redlinks_mgr.Request_idx() != request_idx) return; - gplx.xowa.files.gui.Js_img_mgr.Update_link_missing(html_itm, Xop_lnki_logger_redlinks_mgr.Lnki_id_prefix + Int_.XtoStr(lnki.Html_id())); + int uid = lnki.Html_id(); + gplx.xowa.files.gui.Js_img_mgr.Update_link_missing(html_itm, Xop_lnki_logger_redlinks_mgr.Lnki_id_prefix + Int_.XtoStr(uid)); + redlink_mgr.Add(uid); ++redlink_count; } } diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java index 948459277..70c490802 100644 --- a/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java +++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Nowiki_escape_itm.java @@ -18,11 +18,10 @@ along with this program. If not, see . package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.core.btries.*; import gplx.html.*; public class Nowiki_escape_itm { - public Nowiki_escape_itm(boolean tid_space, byte[] src, byte[] trg) {this.tid_space = tid_space; this.src = src; this.trg = trg;} + public Nowiki_escape_itm(byte[] src, byte[] trg) {this.src = src; this.trg = trg; this.src_adj = src.length - 1;} + private int src_adj; public byte[] Src() {return src;} private byte[] src; public byte[] Trg() {return trg;} private byte[] trg; - public boolean Tid_space() {return tid_space;} private boolean tid_space; - public static boolean Escape(Bry_bfr tmp_bfr, byte[] src, int bgn, int end) {// works by escaping all wtxt symbols so that wtxt parser does not hook into any of them boolean dirty = false; for (int i = bgn; i < end; i++) { @@ -38,33 +37,31 @@ public class Nowiki_escape_itm { dirty = true; } Nowiki_escape_itm itm = (Nowiki_escape_itm)o; - if (itm.Tid_space()) { // NOTE: if space, check if preceding char is \n; else "\n\s" -> "\n " which will break prew; PAGE:ru.b:Rubyn DATE:2014-07-03 - if (i > 0 && src[i - 1] == Byte_ascii.NewLine) { // bounds check && is_preceding_char_nl - tmp_bfr.Add_byte_space(); // don't escape space - continue; - } - } tmp_bfr.Add(itm.Trg()); + i += itm.src_adj; } } return dirty; } + private static final byte[] Pre_bry = new byte[] {Byte_ascii.NewLine, Byte_ascii.Space}; // NOTE: must go before trie_new private static final Btrie_slim_mgr trie = trie_new(); private static Btrie_slim_mgr trie_new() { Btrie_slim_mgr rv = Btrie_slim_mgr.cs_(); - trie_new_itm(rv, Bool_.N, Byte_ascii.Lt_bry , Html_entity_.Lt_bry); - trie_new_itm(rv, Bool_.N, Byte_ascii.Brack_bgn_bry , Html_entity_.Brack_bgn_bry); - trie_new_itm(rv, Bool_.N, Byte_ascii.Brack_end_bry , Html_entity_.Brack_end_bry); // PAGE:en.w: Tall_poppy_syndrome DATE:2014-07-23 - trie_new_itm(rv, Bool_.N, Byte_ascii.Pipe_bry , Html_entity_.Pipe_bry); - trie_new_itm(rv, Bool_.N, Byte_ascii.Apos_bry , Html_entity_.Apos_key_bry); // NOTE: for backward compatibility, use ' note that amp_wkr will turn ' -> ' but ' -> '; DATE:2014-07-03 - trie_new_itm(rv, Bool_.N, Byte_ascii.Colon_bry , Html_entity_.Colon_bry); - trie_new_itm(rv, Bool_.N, Byte_ascii.Underline_bry , Html_entity_.Underline_bry); - trie_new_itm(rv, Bool_.N, Byte_ascii.Asterisk_bry , Html_entity_.Asterisk_bry); - trie_new_itm(rv, Bool_.Y, Byte_ascii.Space_bry , Html_entity_.Space_bry); + trie_new_itm(rv, Byte_ascii.Lt_bry , Html_entity_.Lt_bry); + trie_new_itm(rv, Byte_ascii.Brack_bgn_bry , Html_entity_.Brack_bgn_bry); + trie_new_itm(rv, Byte_ascii.Brack_end_bry , Html_entity_.Brack_end_bry); // PAGE:en.w: Tall_poppy_syndrome DATE:2014-07-23 + trie_new_itm(rv, Byte_ascii.Pipe_bry , Html_entity_.Pipe_bry); + trie_new_itm(rv, Byte_ascii.Apos_bry , Html_entity_.Apos_key_bry); // NOTE: for backward compatibility, use ' note that amp_wkr will turn ' -> ' but ' -> '; DATE:2014-07-03 + trie_new_itm(rv, Byte_ascii.Colon_bry , Html_entity_.Colon_bry); + trie_new_itm(rv, Byte_ascii.Underline_bry , Html_entity_.Underline_bry); + trie_new_itm(rv, Byte_ascii.Asterisk_bry , Html_entity_.Asterisk_bry); + trie_new_itm(rv, Byte_ascii.Space_bry , Html_entity_.Space_bry); + trie_new_itm(rv, Byte_ascii.NewLine_bry , Html_entity_.Nl_bry); + trie_new_itm(rv, Pre_bry , Pre_bry); return rv; } - private static void trie_new_itm(Btrie_slim_mgr rv, boolean tid_space, byte[] src, byte[] trg) { - Nowiki_escape_itm itm = new Nowiki_escape_itm(tid_space, src, trg); + private static void trie_new_itm(Btrie_slim_mgr rv, byte[] src, byte[] trg) { + Nowiki_escape_itm itm = new Nowiki_escape_itm(src, trg); rv.Add_obj(src, itm); } } diff --git a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_base.java b/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_base.java index 5c934f86d..a24b665b9 100644 --- a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_base.java +++ b/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_base.java @@ -17,10 +17,12 @@ along with this program. If not, see . */ package gplx.xowa.wikis.modules; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; public class Xow_module_base implements GfoInvkAble { - public boolean Enabled() {return enabled;} private boolean enabled; + public byte Enabled() {return enabled;} private byte enabled = Bool_.__byte; + public boolean Enabled_y() {return enabled == Bool_.Y_byte;} + public boolean Enabled_n() {return enabled == Bool_.N_byte;} @gplx.Virtual public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { - if (ctx.Match(k, Invk_enabled)) return Yn.Xto_str(enabled); - else if (ctx.Match(k, Invk_enabled_)) enabled = m.ReadYn("v"); + if (ctx.Match(k, Invk_enabled)) return Yn.Xto_nullable_str(enabled); + else if (ctx.Match(k, Invk_enabled_)) enabled = Yn.Xto_nullable_byte(m.ReadStr("v")); else return GfoInvkAble_.Rv_unhandled; return this; } diff --git a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java b/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java index 9bfef47bf..84f230450 100644 --- a/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java +++ b/400_xowa/src/gplx/xowa/wikis/modules/Xow_module_mgr.java @@ -21,12 +21,14 @@ public class Xow_module_mgr implements GfoInvkAble { private Hash_adp_bry regy = Hash_adp_bry.cs_(); public Xow_module_mgr(Xow_wiki wiki) { this.popup_mgr = new Xow_popup_mgr(wiki); - regy.Add_str_obj("top_icon", itm_top_icon); + regy.Add_str_obj("top_icon" , itm_top_icon); + regy.Add_str_obj("navframe" , itm_navframe); } public void Init_by_wiki(Xow_wiki wiki) { popup_mgr.Init_by_wiki(wiki); } - public Xow_module__top_icon Itm_top_icon() {return itm_top_icon;} private Xow_module__top_icon itm_top_icon = new Xow_module__top_icon(); + public Xow_module_base Itm_top_icon() {return itm_top_icon;} private Xow_module_base itm_top_icon = new Xow_module_base(); + public Xow_module_base Itm_navframe() {return itm_navframe;} private Xow_module_base itm_navframe = new Xow_module_base(); public Xow_popup_mgr Popup_mgr() {return popup_mgr;} private Xow_popup_mgr popup_mgr; public Xow_module_base Get(byte[] key) {return (Xow_module_base)regy.Get_by_bry(key);} public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { diff --git a/400_xowa/src/gplx/xowa/xtns/Xox_xnde.java b/400_xowa/src/gplx/xowa/xtns/Xox_xnde.java index 72a20162f..8310e92f5 100644 --- a/400_xowa/src/gplx/xowa/xtns/Xox_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/Xox_xnde.java @@ -19,5 +19,5 @@ package gplx.xowa.xtns; import gplx.*; import gplx.xowa.*; import gplx.xowa.html.*; public interface Xox_xnde { void Xtn_parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde); - void Xtn_write(Xoa_app app, Xoh_html_wtr html_wtr, Xoh_wtr_ctx opts, Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde); + void Xtn_write(Bry_bfr bfr, Xoa_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src); } diff --git a/400_xowa/src/gplx/xowa/xtns/categoryList/Xtn_categorylist_nde.java b/400_xowa/src/gplx/xowa/xtns/categoryList/Xtn_categorylist_nde.java index 40db7c10f..39e7a2880 100644 --- a/400_xowa/src/gplx/xowa/xtns/categoryList/Xtn_categorylist_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/categoryList/Xtn_categorylist_nde.java @@ -20,5 +20,5 @@ import gplx.xowa.html.*; public class Xtn_categorylist_nde implements Xox_xnde, Xop_xnde_atr_parser { public void Xtn_parse(Xow_wiki wiki, Xop_ctx ctx, Xop_root_tkn root, byte[] src, Xop_xnde_tkn xnde) {} public void Xatr_parse(Xow_wiki wiki, byte[] src, Xop_xatr_itm xatr, Object xatr_key_obj) {} - public void Xtn_write(Xoa_app app, Xoh_html_wtr html_wtr, Xoh_wtr_ctx opts, Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) {} + public void Xtn_write(Bry_bfr bfr, Xoa_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) {} } diff --git a/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java b/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java index 39c609565..423272771 100644 --- a/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/cite/Ref_nde.java @@ -54,8 +54,8 @@ public class Ref_nde implements Xox_xnde, Xop_xnde_atr_parser { ctx.Cur_page().Ref_mgr().Grps_add(group, name, follow, this); this.xnde = xnde; } - public void Xtn_write(Xoa_app app, Xoh_html_wtr html_wtr, Xoh_wtr_ctx opts, Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) { - html_wtr.Ref_wtr().Xnde_ref(opts, bfr, src, xnde); + public void Xtn_write(Bry_bfr bfr, Xoa_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) { + html_wtr.Ref_wtr().Xnde_ref(hctx, bfr, src, xnde); } private static final Ref_nde[] Ary_empty = new Ref_nde[0]; public Ref_nde[] Related() {return related;} Ref_nde[] related = Ary_empty; diff --git a/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java b/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java index 508f18abc..2b21ab7ce 100644 --- a/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java +++ b/400_xowa/src/gplx/xowa/xtns/cite/References_nde.java @@ -47,8 +47,8 @@ public class References_nde implements Xox_xnde, Xop_xnde_atr_parser { } list_idx = ref_mgr.Grps_get(group).Grp_seal(); // NOTE: needs to be sealed at end; else inner refs will end up in new group; EX: don't seal prematurely } - public void Xtn_write(Xoa_app app, Xoh_html_wtr html_wtr, Xoh_wtr_ctx opts, Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) { - html_wtr.Ref_wtr().Xnde_references(html_wtr, ctx, opts, bfr, src, xnde); + public void Xtn_write(Bry_bfr bfr, Xoa_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) { + html_wtr.Ref_wtr().Xnde_references(html_wtr, ctx, hctx, bfr, src, xnde); } public static final byte Xatr_id_group = 0; public static boolean Enabled = true; diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java index 3f59da25d..4956dd48b 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde.java @@ -27,7 +27,7 @@ public class Dpl_xnde implements Xox_xnde, Xop_xnde_atr_parser { if (itm.Sort_ascending() != Bool_.__byte) pages.SortBy(new Dpl_page_sorter(itm)); } - public void Xtn_write(Xoa_app app, Xoh_html_wtr html_wtr, Xoh_wtr_ctx opts, Xop_ctx ctx, Bry_bfr bfr, byte[] src, Xop_xnde_tkn xnde) { + public void Xtn_write(Bry_bfr bfr, Xoa_app app, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, Xop_xnde_tkn xnde, byte[] src) { Xow_wiki wiki = ctx.Wiki(); Dpl_html_data html_mode = Dpl_html_data.new_(Dpl_itm_keys.Key_unordered); int itms_len = pages.Count(); diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_box_w_fmtr_arg.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_box_w_fmtr_arg.java new file mode 100644 index 000000000..19bf959f8 --- /dev/null +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_box_w_fmtr_arg.java @@ -0,0 +1,63 @@ +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012 gnosygnu@gmail.com + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . +*/ +package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; +import gplx.html.*; import gplx.xowa.hdumps.htmls.*; +public interface Gallery_box_w_fmtr_arg extends Bry_fmtr_arg { + Gallery_box_w_fmtr_arg Init(int uid, int width); +} +class Gallery_box_w_fmtr_arg__basic implements Gallery_box_w_fmtr_arg { + private int width; + public Gallery_box_w_fmtr_arg Init(int uid, int width) {this.width = width; return this;} + public void XferAry(Bry_bfr bfr, int idx) { + bfr.Add(Style_bgn); + bfr.Add_int_variable(width); + bfr.Add(Style_end); + } + private static final byte[] Style_bgn = Bry_.new_ascii_("style=\"width: "), Style_end = Bry_.new_ascii_("px\""); +} +class Gallery_box_w_fmtr_arg__hdump implements Gallery_box_w_fmtr_arg { + private int uid; + public Gallery_box_w_fmtr_arg Init(int uid, int width) {this.uid = uid; return this;} + public void XferAry(Bry_bfr bfr, int idx) { + bfr.Add(Hdump_html_consts.Key_gallery_box_w); + bfr.Add_int_variable(uid); + bfr.Add_byte_apos(); + } +} +interface Gallery_img_pad_fmtr_arg extends Bry_fmtr_arg { + Gallery_img_pad_fmtr_arg Init(int uid, int vpad); +} +class Gallery_img_pad_fmtr_arg__basic implements Gallery_img_pad_fmtr_arg { + private int vpad; + public Gallery_img_pad_fmtr_arg Init(int uid, int vpad) {this.vpad = vpad; return this;} + public void XferAry(Bry_bfr bfr, int idx) { + bfr.Add(Style_bgn); + bfr.Add_int_variable(vpad); + bfr.Add(Style_end); + } + private static final byte[] Style_bgn = Bry_.new_ascii_("style=\"margin:"), Style_end = Bry_.new_ascii_("px auto;\""); +} +class Gallery_img_pad_fmtr_arg__hdump implements Gallery_img_pad_fmtr_arg { + private int uid; + public Gallery_img_pad_fmtr_arg Init(int uid, int width) {this.uid = uid; return this;} + public void XferAry(Bry_bfr bfr, int idx) { + bfr.Add(Hdump_html_consts.Key_gallery_img_pad); + bfr.Add_int_variable(uid); + bfr.Add_byte_apos(); + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java index 18ea1828c..2cd4cd55e 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_html_wtr.java @@ -16,51 +16,44 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.xowa.files.*; -import gplx.xowa.html.*; +import gplx.xowa.files.*; import gplx.xowa.html.*; import gplx.xowa.html.lnkis.*; import gplx.xowa.hdumps.core.*; import gplx.xowa.hdumps.pages.*; public class Gallery_html_wtr { - private int itms_per_row, itms_len; private boolean mode_is_packed; - public int Itm_div_w() {return itm_div_w;} private int itm_div_w; - public int Itm_div_h() {return itm_div_h;} private int itm_div_h; - public int Itm_box_w() {return itm_box_w;} private int itm_box_w; - public int Mgr_box_width_row() {return mgr_box_width_row;} private int mgr_box_width_row; - public int Mgr_box_width_all() {return mgr_box_width_all;} private int mgr_box_width_all; - public byte[] Mgr_box_cls() {return mgr_box_cls;} private byte[] mgr_box_cls; - public Bry_fmtr Mgr_box_style() {return mgr_box_style;} private Bry_fmtr mgr_box_style; - public int Gallery_multiplier() {return gallery_multiplier;} private int gallery_multiplier; - public void Write_html(Xoa_app app, Xow_wiki wiki, Xop_ctx ctx, Xoa_page page, Xoh_html_wtr wtr, Xoh_wtr_ctx hctx, Bry_bfr bfr, byte[] src, Gallery_xnde mgr) { - itms_per_row = mgr.Itms_per_row(); + private final Xoh_arg_img_core img_core_fmtr_basic = new Xoh_arg_img_core__basic(), img_core_fmtr_hdump = new Xoh_arg_img_core__hdump(); + public void Write_html(Bry_bfr bfr, Xoa_app app, Xow_wiki wiki, Xop_ctx ctx, Xoh_html_wtr wtr, Xoh_wtr_ctx hctx, Xoa_page page, Gallery_xnde mgr, byte[] src) { + int itm_div_w = Gallery_html_wtr_utl.Calc_itm_div_len(mgr.Itm_w_or_default()); + int itm_div_h = Gallery_html_wtr_utl.Calc_itm_div_len(mgr.Itm_h_or_default()); + int itm_box_w = Gallery_html_wtr_utl.Calc_itm_box_w(itm_div_w); + int itms_len = mgr.Itms_len(); + int itms_per_row = mgr.Itms_per_row(); if (itms_per_row == Gallery_xnde.Null) itms_per_row = wiki.Cfg_gallery().Imgs_per_row(); - itms_len = mgr.Itms_len(); - itm_div_w = Gallery_html_wtr_utl.Calc_itm_div_len(mgr.Itm_w_or_default()); - itm_div_h = Gallery_html_wtr_utl.Calc_itm_div_len(mgr.Itm_h_or_default()); - itm_box_w = Gallery_html_wtr_utl.Calc_itm_box_w(itm_div_w); + int mgr_box_width_row = Gallery_html_wtr_utl.Calc_itm_pad_w(itm_box_w) * itms_per_row; + int row_multiplier; Bry_fmtr mgr_box_style; if (itms_per_row == Gallery_xnde.Null) { // no "perrow" defined; default to total # of items; - gallery_multiplier = itms_len; - mgr_box_style = fmtr_mgr_box_style_none; + row_multiplier = itms_len; + mgr_box_style = Gallery_html_wtr_.Mgr_box_style_none; } else { - gallery_multiplier = itms_per_row; - mgr_box_style = fmtr_mgr_box_style_per_row; + row_multiplier = itms_per_row; + mgr_box_style = Gallery_html_wtr_.Mgr_box_style_max; } - mode_is_packed = Gallery_mgr_base_.Mode_is_packed(mgr.Mode()); - int gallery_w_count = 0; + boolean mode_is_packed = Gallery_mgr_base_.Mode_is_packed(mgr.Mode()); + byte[] mgr_box_cls; int mgr_box_width_all; if (mode_is_packed) { - mgr_box_cls = Gallery_box_cls_packed; + mgr_box_cls = Gallery_html_wtr_.Cls_packed; mgr_box_width_all = 0; } else { mgr_box_cls = Bry_.Empty; - mgr_box_width_all = Gallery_html_wtr_utl.Calc_itm_pad_w(itm_box_w) * gallery_multiplier; // 8=Gallery Box borders; REF.MW:ImageGallery.php|GB_BORDERS; + mgr_box_width_all = Gallery_html_wtr_utl.Calc_itm_pad_w(itm_box_w) * row_multiplier; // 8=Gallery Box borders; REF.MW:ImageGallery.php|GB_BORDERS; } - mgr_box_width_row = Gallery_html_wtr_utl.Calc_itm_pad_w(itm_box_w) * itms_per_row; - int itm_box_w_tmp = itm_box_w; - Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(); - Bry_bfr itm_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(); - int mgr_elem_id = -1; + Bry_bfr itm_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(), tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(); + int mgr_elem_id = -1; int gallery_w_count = 0; + boolean hctx_is_hdump = hctx.Mode_is_hdump(); + Xoh_arg_img_core img_core_fmtr = hctx_is_hdump ? img_core_fmtr_hdump : img_core_fmtr_basic; + Xopg_hdump_data hdump_imgs = page.Hdump_data(); for (int i = 0; i < itms_len; i++) { Gallery_itm itm = mgr.Itms_get_at(i); - byte[] itm_caption = Bld_caption(wiki, wtr, ctx, hctx, itm); + byte[] itm_caption = Gallery_html_wtr_.Bld_caption(wiki, ctx, wtr, hctx, itm); Xoa_ttl itm_ttl = itm.Ttl(); if ( itm_ttl != null // ttl does not have invalid characters && itm_ttl.Ns().Id_file() // ttl is in file ns; @@ -72,12 +65,12 @@ public class Gallery_html_wtr { ; if (mode_is_packed) { if (gallery_w_count < itms_per_row) { - mgr_box_width_all += Gallery_html_wtr_utl.Calc_itm_pad_w(itm_box_w_tmp); + mgr_box_width_all += Gallery_html_wtr_utl.Calc_itm_pad_w(itm_box_w); ++gallery_w_count; } if (xfer_itm.Html_w() > 0) { itm_div_w = Gallery_html_wtr_utl.Calc_itm_div_len(xfer_itm.Html_w()); - itm_box_w_tmp = Gallery_html_wtr_utl.Calc_itm_box_w(itm_div_w); + itm_box_w = Gallery_html_wtr_utl.Calc_itm_box_w(itm_div_w); // NOTE: redefine itm_box_w for rest of loop } if (xfer_itm.Html_h() > 0) itm_div_h = Gallery_html_wtr_utl.Calc_itm_div_len(xfer_itm.Html_h()); @@ -92,7 +85,6 @@ public class Gallery_html_wtr { html_w = mgr.Itm_w_or_default(); html_h = mgr.Itm_h_or_default(); } - int v_pad = Gallery_html_wtr_utl.Calc_vpad(mgr.Itm_h(), html_h); byte[] lnki_ttl = lnki.Ttl().Page_txt(); Xoa_ttl lnki_link_ttl = itm_ttl; // default href to ttl if ( itm.Link_bgn() != Bry_.NotFound // link is not -1; EX: "A.png" has no link specified @@ -101,21 +93,23 @@ public class Gallery_html_wtr { lnki_link_ttl = Xoa_ttl.parse_(wiki, Bry_.Mid(src, itm.Link_bgn(), itm.Link_end())); byte[] lnki_href = app.Href_parser().Build_to_bry(wiki, lnki_link_ttl); byte[] lnki_alt = itm.Alt_bgn() == Bry_.NotFound ? lnki_ttl : Xoh_html_wtr_escaper.Escape(app, tmp_bfr, Bry_.Mid(src, itm.Alt_bgn(), itm.Alt_end())); - fmtr_gallery_itm_img.Bld_bfr_many(itm_bfr - , itm_box_w_tmp, itm_div_w - , v_pad + img_core_fmtr.Init(itm_elem_id, html_src, html_w, html_h); + int itm_margin = Gallery_html_wtr_utl.Calc_vpad(mgr.Itm_h(), html_h); + Gallery_html_wtr_.Itm_img_fmtr.Bld_bfr_many(itm_bfr + , itm_box_w, itm_div_w, itm_margin , itm_elem_id , lnki_ttl , lnki_href - , html_src - , html_w, html_h + , img_core_fmtr , itm_caption , lnki_alt ); + if (hctx_is_hdump) + hdump_imgs.Imgs_add(new Hdump_data_img__gallery().Init_by_gallery(-1, itm_div_w, itm_box_w, itm_margin), xfer_itm, Hdump_data_img__gallery.Tid_gallery); } else { - fmtr_gallery_itm_txt.Bld_bfr_many(itm_bfr - , itm_box_w_tmp, itm_div_h + Gallery_html_wtr_.Itm_txt_fmtr.Bld_bfr_many(itm_bfr + , itm_box_w, itm_div_h , Bry_.Mid(src, itm.Ttl_bgn(), itm.Ttl_end()) , itm_caption ); @@ -124,9 +118,50 @@ public class Gallery_html_wtr { itm_bfr.Mkr_rls(); tmp_bfr.Mkr_rls(); int mgr_box_width_max = mgr_box_width_all < mgr_box_width_row ? mgr_box_width_row : mgr_box_width_all; - fmtr_mgr_box.Bld_bfr_many(bfr, mgr_elem_id, mgr_box_cls, Bry_fmtr_arg_.fmtr_(mgr_box_style, Bry_fmtr_arg_.int_(mgr_box_width_max)), itm_bfr); + Gallery_html_wtr_.Mgr_all_fmtr.Bld_bfr_many(bfr, mgr_elem_id, mgr_box_cls, Bry_fmtr_arg_.fmtr_(mgr_box_style, Bry_fmtr_arg_.int_(mgr_box_width_max)), itm_bfr); } - private static byte[] Bld_caption(Xow_wiki wiki, Xoh_html_wtr wtr, Xop_ctx ctx, Xoh_wtr_ctx hctx, Gallery_itm itm) { +} +class Gallery_html_wtr_ { + public static final byte[] Cls_packed = Bry_.new_utf8_(" mw-gallery-packed"); + public static final Bry_fmtr + Mgr_all_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + ), "gallery_id", "gallery_cls", "gallery_style", "itm_list" + ) + , Mgr_box_style_none = Bry_fmtr.new_() + , Mgr_box_style_max = Bry_fmtr.new_("max-width:~{gallery_width}px; _width:~{gallery_width}px;", "gallery_width") + , Itm_img_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , "
    • " + ), "itm_box_width", "itm_div_width", "itm_margin", "img_id", "img_ttl", "img_href", "img_core", "itm_caption", "img_alt" + ) + , Itm_txt_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last + ( "" + , " " + ), "itm_box_width", "itm_div_height", "itm_text", "itm_caption" + ); + public static byte[] Bld_caption(Xow_wiki wiki, Xop_ctx ctx, Xoh_html_wtr wtr, Xoh_wtr_ctx hctx, Gallery_itm itm) { byte[] rv = itm.Caption_bry(); if (Bry_.Len_gt_0(rv)) { Bry_bfr caption_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(); @@ -136,44 +171,4 @@ public class Gallery_html_wtr { } return rv; } - private static final byte[] Gallery_box_cls_packed = Bry_.new_utf8_(" mw-gallery-packed"); - private Bry_fmtr - fmtr_mgr_box = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - ), "gallery_id", "gallery_cls", "gallery_style", "itm_list" - ) - , fmtr_gallery_itm_img = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , " " - ), "itm_box_width", "itm_div_width", "itm_margin", "img_id", "img_ttl", "img_href", "html_src", "img_width", "img_height", "itm_caption", "img_alt" - ) - , fmtr_gallery_itm_txt = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last - ( "" - , " " - ), "itm_box_width", "itm_div_height", "itm_text", "itm_caption" - ) - , fmtr_mgr_box_style_none = Bry_fmtr.new_() - , fmtr_mgr_box_style_per_row = Bry_fmtr.new_("max-width:~{gallery_width}px; _width:~{gallery_width}px;", "gallery_width") - ; } diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java index cecc80fcf..89cd067f7 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm.java @@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.xowa.files.*; import gplx.xowa.files.gui.*; import gplx.xowa.gui.views.*; +import gplx.xowa.files.*; import gplx.xowa.files.gui.*; import gplx.xowa.gui.views.*; import gplx.xowa.html.*; public class Gallery_itm implements Js_img_wkr { public Xoa_ttl Ttl() {return ttl;} public Gallery_itm Ttl_(Xoa_ttl v) {ttl = v; return this;} private Xoa_ttl ttl; public int Ttl_bgn() {return ttl_bgn;} public Gallery_itm Ttl_bgn_(int v) {ttl_bgn = v; return this;} private int ttl_bgn; @@ -43,12 +43,12 @@ public class Gallery_itm implements Js_img_wkr { this.xnde = xnde; this.xfer_itm = xfer_itm;; this.wiki = wiki; this.ctx = ctx; this.src = src; this.gallery_li_id_bry = gallery_li_id_bry; this.gallery_itm_idx = gallery_itm_idx; } private Gallery_xnde xnde; private Xof_xfer_itm xfer_itm; private Xow_wiki wiki; private Xop_ctx ctx; private byte[] src; private byte[] gallery_li_id_bry; private int gallery_itm_idx; - public void Html_update(Xoa_page page, Xog_html_itm html_itm, int html_uid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src) { + public void Html_update(Xoa_page page, Xog_html_itm html_itm, int html_uid, int html_w, int html_h, String html_src, int orig_w, int orig_h, String orig_src, byte[] lnki_ttl) { Gallery_mgr_base gallery_mgr = xnde.Gallery_mgr(); Bry_bfr bfr = wiki.Utl_bry_bfr_mkr().Get_k004(), tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_k004(); try { xfer_itm.Init_for_gallery_update(html_w, html_h, html_src, orig_src); - gallery_mgr.Write_html_itm(bfr, tmp_bfr, wiki.App(), wiki, ctx.Cur_page(), ctx, wiki.Html_mgr().Html_wtr(), src, xnde, Bry_.Empty, gallery_itm_idx, xfer_itm); + gallery_mgr.Write_html_itm(bfr, tmp_bfr, wiki.App(), wiki, ctx.Cur_page(), ctx, wiki.Html_mgr().Html_wtr(), Xoh_wtr_ctx.Basic, src, xnde, Bry_.Empty, gallery_itm_idx, xfer_itm, false, -1); String itm_html = bfr.XtoStrAndClear(); html_itm.Html_elem_replace_html(String_.new_utf8_(gallery_li_id_bry), itm_html); if (gallery_itm_idx == xnde.Itms_len() - 1 && Gallery_mgr_base_.Mode_is_packed(xnde.Mode())) diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base.java index eecc4c48e..e6e5dbbde 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base.java @@ -16,9 +16,10 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; -import gplx.html.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; -import gplx.xowa.files.*; +import gplx.html.*; import gplx.xowa.html.*; import gplx.xowa.html.modules.*; import gplx.xowa.files.*; import gplx.xowa.hdumps.htmls.*; import gplx.xowa.hdumps.core.*; public abstract class Gallery_mgr_base { + private Gallery_box_w_fmtr_arg__basic box_w_fmtr__basic = new Gallery_box_w_fmtr_arg__basic(); private Gallery_box_w_fmtr_arg__hdump box_w_fmtr__hdump = new Gallery_box_w_fmtr_arg__hdump(); + private Gallery_img_pad_fmtr_arg__basic img_pad_fmtr__basic = new Gallery_img_pad_fmtr_arg__basic(); private Gallery_img_pad_fmtr_arg__hdump img_pad_fmtr__hdump = new Gallery_img_pad_fmtr_arg__hdump(); public abstract byte Tid(); public abstract byte[] Tid_bry(); @gplx.Virtual public boolean Tid_is_packed() {return false;} @@ -50,29 +51,32 @@ public abstract class Gallery_mgr_base { .Add(Wrap_gallery_text_end) ; } - public void Write_html(Bry_bfr bfr, Xow_wiki wiki, Xoa_page page, Xop_ctx ctx, byte[] src, Gallery_xnde xnde) { + public void Write_html(Bry_bfr bfr, Xow_wiki wiki, Xoa_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Gallery_xnde xnde) { + boolean hctx_is_hdump = hctx.Mode_is_hdump(); Bry_bfr tmp_bfr = wiki.Utl_bry_bfr_mkr().Get_b512(); byte[] box_style = xnde.Atr_style(); + int max_width = -1; if (itms_per_row > 0) { - int max_width = itms_per_row * (itm_default_w + this.Get_all_padding()); + max_width = itms_per_row * (itm_default_w + this.Get_all_padding()); box_style = Fmt_and_add(tmp_bfr, box_style_max_width_fmtr, box_style, max_width); } byte[] box_cls = Fmt_and_add(tmp_bfr, box_cls_fmtr, xnde.Atr_cls(), this.Tid_bry()); - byte[] gallery_ul_id = tmp_bfr.Add(box_id_prefix_bry).Add_int_variable(page.File_queue().Elem_id().Val_add()).XtoAryAndClear(); - Box_hdr_write(bfr, wiki.App().Html_mgr().Whitelist_mgr(), src, gallery_ul_id, box_cls, box_style, xnde.Atrs_other()); + int gallery_uid = page.Html_data().Xtn_gallery_next_id(); + byte[] gallery_ul_id = tmp_bfr.Add(box_id_prefix_bry).Add_int_variable(gallery_uid).XtoAryAndClear(); + Box_hdr_write(bfr, wiki.App().Html_mgr().Whitelist_mgr(), src, gallery_ul_id, box_cls, box_style, xnde.Atrs_other(), hctx_is_hdump, gallery_uid); byte[] box_caption = xnde.Atr_caption(); if (Bry_.Len_gt_0(box_caption)) box_caption_fmtr.Bld_bfr_many(bfr, box_caption); Xoa_app app = wiki.App(); Xoh_html_wtr html_wtr = wiki.Html_mgr().Html_wtr(); int itm_len = xnde.Itms_len(); for (int i = 0; i < itm_len; i++) { - Write_html_itm(bfr, tmp_bfr, app, wiki, page, ctx, html_wtr, src, xnde, gallery_ul_id, i, null) ; + Write_html_itm(bfr, tmp_bfr, app, wiki, page, ctx, html_wtr, hctx, src, xnde, gallery_ul_id, i, null, hctx_is_hdump, max_width); } bfr.Add(box_html_end_bry); tmp_bfr.Mkr_rls(); } private static final byte[] box_id_prefix_bry = Bry_.new_ascii_("xowa_gallery_ul_"), itm_id_prefix_bry = Bry_.new_ascii_("xowa_gallery_li_"); public static byte File_found_mode = Bool_.__byte; - public void Write_html_itm(Bry_bfr bfr, Bry_bfr tmp_bfr, Xoa_app app, Xow_wiki wiki, Xoa_page page, Xop_ctx ctx, Xoh_html_wtr html_wtr, byte[] src, Gallery_xnde xnde, byte[] gallery_ul_id, int i, Xof_xfer_itm xfer_itm) { + public void Write_html_itm(Bry_bfr bfr, Bry_bfr tmp_bfr, Xoa_app app, Xow_wiki wiki, Xoa_page page, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx, byte[] src, Gallery_xnde xnde, byte[] gallery_ul_id, int i, Xof_xfer_itm xfer_itm, boolean hctx_is_hdump, int max_width) { Gallery_itm itm = (Gallery_itm)xnde.Itms_get_at(i); Xoa_ttl ttl = itm.Ttl(); byte[] itm_caption = itm.Caption_bry(); if (itm_caption == null) itm_caption = Bry_.Empty; @@ -86,13 +90,15 @@ public abstract class Gallery_mgr_base { .Html_elem_tid_(Xof_html_elem.Tid_gallery_v2) ; } - byte[] gallery_li_id = tmp_bfr.Add(itm_id_prefix_bry).Add_int_variable(xfer_itm.Html_uid()).XtoAryAndClear(); + int img_uid = xfer_itm.Html_uid(); + byte[] gallery_li_id = tmp_bfr.Add(itm_id_prefix_bry).Add_int_variable(img_uid).XtoAryAndClear(); byte[] itm_html = Bry_.Empty; int html_w_expand = xfer_itm.Html_w(); int html_h_expand = xfer_itm.Html_h(); boolean file_found = xfer_itm.File_found(); if (File_found_mode != Bool_.__byte) file_found = File_found_mode == Bool_.Y_byte; + int vpad = -1, img_div_w = -1; if ( !ttl.Ns().Id_file() || !file_found ) { // itm is not a file, or is not found; write text @@ -116,9 +122,12 @@ public abstract class Gallery_mgr_base { int html_w_normal = xfer_itm.Html_w(); int html_h_normal = xfer_itm.Html_h(); xfer_itm.Init_for_gallery(html_w_normal, html_h_normal, html_w_expand);// NOTE: file_w should be set to expanded width so js can resize if gallery - itm_div0_fmtr.Bld_bfr_many(tmp_bfr, this.Get_thumb_div_width(html_w_expand)); - itm_div1_fmtr.Bld_bfr_many(tmp_bfr, this.Get_vpad(itm_default_h, html_h_expand)); //
      - wiki.Html_mgr().Html_wtr().Lnki_wtr().Write_file(tmp_bfr, ctx, Xoh_wtr_ctx.Basic, src, lnki, xfer_itm, alt); + img_div_w = this.Get_thumb_div_width(html_w_expand); + itm_div0_fmtr.Bld_bfr_many(tmp_bfr, img_div_w); + Gallery_img_pad_fmtr_arg vpad_fmtr = hctx_is_hdump ? (Gallery_img_pad_fmtr_arg)img_pad_fmtr__hdump : (Gallery_img_pad_fmtr_arg)img_pad_fmtr__basic; + vpad = this.Get_vpad(itm_default_h, html_h_expand); + itm_div1_fmtr.Bld_bfr_many(tmp_bfr, vpad_fmtr.Init(img_uid, vpad)); //
      + wiki.Html_mgr().Html_wtr().Lnki_wtr().Write_file(tmp_bfr, ctx, hctx, src, lnki, xfer_itm, alt); tmp_bfr.Add(itm_divs_end_bry); itm_html = tmp_bfr.XtoAryAndClear(); } @@ -127,21 +136,24 @@ public abstract class Gallery_mgr_base { if (xnde.Show_filename()) { wiki.Html_mgr().Html_wtr().Lnki_wtr().Write_plain_by_bry ( tmp_bfr, src, lnki - , Bry_.Limit(ttl.Page_txt(), 25) // 25 is defined by captionLength in DefaultSettings.php + , Bry_.Limit(ttl.Page_txt(), 25) // 25 is defined by captionLength in DefaultSettings.php ); // MW:passes know,noclasses which isn't relevant to XO } int itm_div_width = this.Get_gb_width(html_w_expand, html_h_expand); - itm_li_bgn_fmtr.Bld_bfr_many(bfr, gallery_li_id, itm_div_width); + Gallery_box_w_fmtr_arg box_w_fmtr_arg = hctx_is_hdump ? (Gallery_box_w_fmtr_arg)box_w_fmtr__hdump : (Gallery_box_w_fmtr_arg)box_w_fmtr__basic; + itm_li_bgn_fmtr.Bld_bfr_many(bfr, gallery_li_id, box_w_fmtr_arg.Init(img_uid, itm_div_width)); bfr.Add(itm_html); wiki.Parser().Parse_text_to_html(tmp_bfr, page, true, itm_caption); itm_caption = tmp_bfr.XtoAryAndClear(); itm_caption = tmp_bfr.Add(show_filenames_link).Add(itm_caption).XtoAryAndClear(); Wrap_gallery_text(bfr, itm_caption, html_w_expand, html_h_expand); bfr.Add(itm_li_end_bry); + if (hctx_is_hdump) + page.Hdump_data().Imgs_add(new Hdump_data_img__gallery().Init_by_gallery(max_width, itm_div_width, img_div_w, vpad), xfer_itm, Hdump_data_img__gallery.Tid_gallery); } private static final byte[] Wrap_gallery_text_bgn = Bry_.new_ascii_("\n
      ") // NOTE: The newline after
      is needed to accommodate htmltidy - , Wrap_gallery_text_end = Bry_.new_ascii_("\n
      ") + , Wrap_gallery_text_end = Bry_.new_ascii_("\n
      ") // NOTE: prepend "\n"; will cause extra \n when caption exists, but needed when caption doesn't exists; EX: "
      "; \n puts ; @gplx.Virtual public void Get_thumb_size(Xop_lnki_tkn lnki, Xof_ext ext) { // REF.MW: getThumbParams; Get the transform parameters for a thumbnail. lnki.Lnki_w_(itm_default_w); @@ -149,15 +161,18 @@ public abstract class Gallery_mgr_base { } @gplx.Virtual public void Adjust_image_parameters(Xof_xfer_itm xfer_itm) { // REF.MW: Adjust the image parameters for a thumbnail. Used by a subclass to insert extra high resolution images. } - private static final Bry_fmtr + + public static final Bry_fmtr box_style_max_width_fmtr = Bry_fmtr.new_( "max-width:~{max_width}px;_width:~{max_width}px;", "max_width") // id=xowa_gallery_ul_1 , box_cls_fmtr = Bry_fmtr.new_( "gallery mw-gallery-~{mode}", "mode") , box_caption_fmtr = Bry_fmtr.new_( "\n
    • ~{caption}
    • ", "caption") - , itm_li_bgn_fmtr = Bry_fmtr.new_( "\n
    • " // id=xowa_gallery_li_1 - + "\n
      ", "id", "width") + , itm_li_bgn_fmtr = Bry_fmtr.new_( "\n
    • " // id=xowa_gallery_li_1 + + "\n
      ", "id", "itm_box_w") , itm_div0_fmtr = Bry_fmtr.new_( "\n
      ", "width") , itm_missing_fmtr = Bry_fmtr.new_( "\n
      ~{ttl_text}
      ", "height", "ttl_text") - , itm_div1_fmtr = Bry_fmtr.new_( "\n
      \n ", "vpad") + , itm_div1_fmtr = Bry_fmtr.new_( "\n
      \n ", "vpad") + , hdump_box_w_fmtr = Bry_fmtr.new_( "width:~{width}px;", "width") + , hdump_img_pad_fmtr = Bry_fmtr.new_( "margin:~{width}px auto;", "width") ; private static final byte[] @@ -174,11 +189,18 @@ public abstract class Gallery_mgr_base { } return tmp_bfr.XtoAryAndClear(); } - private static void Box_hdr_write(Bry_bfr bfr, Xop_xatr_whitelist_mgr whitelist_mgr, byte[] src, byte[] gallery_ul_uid, byte[] cls, byte[] style, ListAdp xatr_list) { + private static void Box_hdr_write(Bry_bfr bfr, Xop_xatr_whitelist_mgr whitelist_mgr, byte[] src, byte[] gallery_ul_uid, byte[] cls, byte[] style, ListAdp xatr_list, boolean hctx_is_hdump, int uid) { bfr.Add_byte(Byte_ascii.Lt).Add(Html_tag_.Ul_name_bry); - Html_wtr.Write_atr(bfr, Html_atr_.Id_bry, gallery_ul_uid); - Html_wtr.Write_atr(bfr, Html_atr_.Cls_bry, cls); - Html_wtr.Write_atr(bfr, Html_atr_.Style_bry, style); + Html_wtr.Write_atr_bry(bfr, Html_atr_.Id_bry, gallery_ul_uid); + Html_wtr.Write_atr_bry(bfr, Html_atr_.Cls_bry, cls); + if (hctx_is_hdump) { + bfr.Add_byte_space(); + bfr.Add(Hdump_html_consts.Key_gallery_box_max); + bfr.Add_int_variable(uid); + bfr.Add_byte_apos(); + } + else + Html_wtr.Write_atr_bry(bfr, Html_atr_.Style_bry, style); if (xatr_list != null) { int len = xatr_list.Count(); for (int i = 0; i < len; i++) { @@ -186,7 +208,7 @@ public abstract class Gallery_mgr_base { if (!whitelist_mgr.Chk(Xop_xnde_tag_.Tid_ul, src, xatr)) continue; byte[] key = xatr.Key_bry(); byte[] val = xatr.Val_as_bry(src); - Html_wtr.Write_atr(bfr, key, val); + Html_wtr.Write_atr_bry(bfr, key, val); } } bfr.Add_byte(Byte_ascii.Gt); diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java index 63b30685d..0c4aaef7a 100644 --- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_mgr_base_basic_tst.java @@ -29,11 +29,11 @@ public class Gallery_mgr_base_basic_tst { , "" ), String_.Concat_lines_nl_skip_last ( "