1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-09-28 14:30:51 +00:00

Hzip: Compress and decompress recent xowa_alt_text

This commit is contained in:
gnosygnu 2017-09-04 10:05:54 -04:00
parent b101b356ad
commit 4705592259
6 changed files with 45 additions and 15 deletions

View File

@ -100,12 +100,13 @@ public class Xoh_file_fmtr__basic implements Xoh_file_fmtr {
public Bry_fmt Fmt_thumb_part_alt() {return fmt__thumb_part_alt;} private final Bry_fmt fmt__thumb_part_alt = Bry_fmt.Auto
(String_.Concat_lines_nl_skip_last
( ""
, " <div class=\"xowa_alt_text\">"
, " <div class=\"" + String_.new_a7(Bry__xowa_alt_text) + "\">"
, " <hr/>"
, " <div class=\"thumbcaption\">~{html}"
, " </div>"
, " </div>"
));
public static final byte[] Bry__xowa_alt_text = Bry_.new_a7("xowa_alt_text");
public byte[] Bld_thumb_part_magnify(byte[] a_href, byte[] a_title) {
return fmtr_thumb_part_magnify.Bld_many_to_bry(tmp_bfr, a_href, a_title);

View File

@ -31,6 +31,7 @@ public class Xoh_thm_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
}
Xoh_thm_caption_data capt_data = data.Capt_data();
int div_1_width = data.Div_1_width();
flag_bldr.Set_as_bool(Flag__xowa_alt_text_exists , capt_data.Xowa_alt_text_exists());
boolean capt_3_exists = flag_bldr.Set_as_bool(Flag__capt_3_exists , capt_data.Capt_3_exists());
flag_bldr.Set_as_bool(Flag__capt_2_is_tidy , capt_data.Capt_2_exists() && capt_data.Capt_2_is_tidy());
boolean capt_2_exists = flag_bldr.Set_as_bool(Flag__capt_2_exists , capt_data.Capt_2_exists());
@ -48,6 +49,7 @@ public class Xoh_thm_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
}
public void Decode1(Bry_bfr bfr, Xoh_hdoc_wkr hdoc_wkr, Xoh_hdoc_ctx hctx, Xoh_page hpg, Bry_rdr rdr, byte[] src, int src_bgn, int src_end, Xoh_data_itm data_itm) {
int flag = rdr.Read_hzip_int(1); flag_bldr.Decode(flag);
boolean xowa_alt_text_exists = flag_bldr.Get_as_bool(Flag__xowa_alt_text_exists);
boolean capt_3_exists = flag_bldr.Get_as_bool(Flag__capt_3_exists);
boolean capt_2_is_tidy = flag_bldr.Get_as_bool(Flag__capt_2_is_tidy);
boolean capt_2_exists = flag_bldr.Get_as_bool(Flag__capt_2_exists);
@ -65,17 +67,18 @@ public class Xoh_thm_hzip implements Xoh_hzip_wkr, Gfo_poolable_itm {
int fsdb_w = img_hzip.Wtr().Fsdb_itm().Html_w();
if (fsdb_w > 0) // fsdb_w has value; this occurs when itm is found in user's file_cache; NOTE: do not do !div_1_width_exists b/c all thms have div_1_w; PAGE:en.w:Paris; DATE:2016-06-18
div_1_width = fsdb_w; // override div_1_width, else widths will default to wrong value and not be auto-corrected by post-processing; DATE:2016-06-18
wtr.Write(bfr, hpg, hctx, src, img_data.Img_is_vid(), div_0_align, div_1_width, img_hzip.Wtr(), img_hzip.Anch_href_bry(), capt_1, capt_2_exists, capt_2_is_tidy, capt_2_bry, capt_3_exists, capt_3_bry);
wtr.Write(bfr, hpg, hctx, src, img_data.Img_is_vid(), div_0_align, div_1_width, img_hzip.Wtr(), img_hzip.Anch_href_bry(), capt_1, capt_2_exists, capt_2_is_tidy, capt_2_bry, capt_3_exists, capt_3_bry, xowa_alt_text_exists);
img_data.Pool__rls();
}
public void Pool__rls () {pool_mgr.Rls_fast(pool_idx);} private Gfo_poolable_mgr pool_mgr; private int pool_idx;
public Gfo_poolable_itm Pool__make (Gfo_poolable_mgr mgr, int idx, Object[] args) {Xoh_thm_hzip rv = new Xoh_thm_hzip(); rv.pool_mgr = mgr; rv.pool_idx = idx; rv.hook = (byte[])args[0]; return rv;}
private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_(1, 1, 1, 1, 3);
private final Int_flag_bldr flag_bldr = new Int_flag_bldr().Pow_ary_bld_(1, 1 , 1, 1, 1, 3);
private static final int // SERIALIZED
Flag__capt_3_exists = 0
, Flag__capt_2_is_tidy = 1
, Flag__capt_2_exists = 2
, Flag__div_1_width_exists = 3
, Flag__div_0_align = 4 // "", "tnone", "tleft", "tcenter", "tright"
Flag__xowa_alt_text_exists = 0
, Flag__capt_3_exists = 1
, Flag__capt_2_is_tidy = 2
, Flag__capt_2_exists = 3
, Flag__div_1_width_exists = 4
, Flag__div_0_align = 5 // "", "tnone", "tleft", "tcenter", "tright"
;
}

View File

@ -19,7 +19,7 @@ import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.pars
public class Xoh_thm_hzip__basic__tst {
private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
@Before public void setup() {fxt.Clear();}
@Test public void Image() {
@Test public void Image_wo_alt_text() {
fxt.Test__bicode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last
( "<div class='thumb tleft'>"
, "<div class='thumbinner' style='width:220px;'><a href='/wiki/File:A.png' class='image' xowa_title='A.png'><img data-xowa-title='A.png' data-xoimg='0|220|-1|-1|-1|-1' src='' width='0' height='0' class='thumbimage' alt='abc'></a> "
@ -32,6 +32,21 @@ public class Xoh_thm_hzip__basic__tst {
, "</div>"
));
}
@Test public void Image_w_alt_text() {
fxt.Test__bicode("~&{\"^abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last
( "<div class='thumb tleft'>"
, "<div class='thumbinner' style='width:220px;'><a href='/wiki/File:A.png' class='image' xowa_title='A.png'><img data-xowa-title='A.png' data-xoimg='0|220|-1|-1|-1|-1' src='' width='0' height='0' class='thumbimage' alt='abc'></a> "
, "<div class='thumbcaption'>"
, "<div class='magnify'><a href='/wiki/File:A.png' class='internal' title='Enlarge'></a></div>"
, "abc</div>"
, "<div class=\"xowa_alt_text\">"
, "<hr>"
, "<div class='thumbcaption'>abc</div>"
, "</div>"
, "</div>"
, "</div>"
));
}
@Test public void Capt_is_missing() { // [[File:A.png|thumb]]
fxt.Test__bicode("~&#~!%A.png~)#S~", String_.Concat_lines_nl_skip_last
( "<div class='thumb tleft'>"

View File

@ -36,7 +36,7 @@ public class Xoh_thm_wtr implements gplx.core.brys.Bfr_arg {
return this;
}
public void Write(Bry_bfr bfr, Xoh_page hpg, Xoh_hdoc_ctx hctx, byte[] src, boolean img_is_vid, int div_0_align, int div_1_w, Xoh_img_wtr img_wtr, byte[] div_2_href
, Bfr_arg capt_1, boolean capt_2_exists, boolean capt_2_is_tidy, byte[] capt_2_bry, boolean capt_3_exists, byte[] capt_3_bry) {
, Bfr_arg capt_1, boolean capt_2_exists, boolean capt_2_is_tidy, byte[] capt_2_bry, boolean capt_3_exists, byte[] capt_3_bry, boolean xowa_alt_text_exists) {
this.Clear();
this.img_is_vid_nl = img_is_vid ? Byte_ascii.Nl_bry : Bry_.Empty;
this.trailing_space = img_is_vid ? Bry_.Empty : Byte_ascii.Space_bry;
@ -57,7 +57,9 @@ public class Xoh_thm_wtr implements gplx.core.brys.Bfr_arg {
if (capt_2_is_tidy)
capt_2.Set_by_val(capt_2_bry);
else {
alt_fmtr.Bld_bfr_many(tmp_bfr, capt_2_bry);
String xowa_alt_text_bgn = xowa_alt_text_exists ? "<div class=\"xowa_alt_text\">\n" : String_.Empty;
String xowa_alt_text_end = xowa_alt_text_exists ? "\n</div>" : String_.Empty;
alt_fmtr.Bld_bfr_many(tmp_bfr, xowa_alt_text_bgn, capt_2_bry, xowa_alt_text_end);
capt_2.Set_by_val(tmp_bfr.To_bry_and_clear());
}
}
@ -82,9 +84,9 @@ public class Xoh_thm_wtr implements gplx.core.brys.Bfr_arg {
), "div_0_align", "div_1_id", "div_1_width", "img_is_vid_nl", "div_1_img", "trailing_space", "div_2_href", "div_2_magnify", "enlarge", "capt_1", "capt_2", "capt_3");
private static final Bry_fmtr alt_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( ""
, "<hr>"
, "<div class=\"thumbcaption\">~{alt}</div>"
, "~{xowa_alt_text_bgn}<hr>"
, "<div class=\"thumbcaption\">~{alt}</div>~{xowa_alt_text_end}"
, ""
), "alt");
), "xowa_alt_text_bgn", "alt", "xowa_alt_text_end");
private static final byte[] bry_div_2_magnify = Bry_.new_a7("bin/any/xowa/file/mediawiki.file/magnify-clip.png");
}

View File

@ -28,9 +28,10 @@ public class Xoh_thm_caption_data {
public int Capt_3_bgn() {return capt_3_bgn;} private int capt_3_bgn;
public int Capt_3_end() {return capt_3_end;} private int capt_3_end;
public boolean Capt_3_exists() {return capt_3_end > capt_3_bgn;}
public boolean Xowa_alt_text_exists() {return xowa_alt_text_exists;} private boolean xowa_alt_text_exists;
public Xoh_thm_magnify_data Magnify_data() {return magnify_data;} private final Xoh_thm_magnify_data magnify_data = new Xoh_thm_magnify_data();
public void Clear() {
this.capt_2_is_tidy = false;
this.capt_2_is_tidy = this.xowa_alt_text_exists = false;
this.src_bgn = src_end = capt_1_bgn = capt_1_end = capt_2_bgn = capt_2_end = capt_3_bgn = capt_3_end = -1;
magnify_data.Clear();
}
@ -49,6 +50,11 @@ public class Xoh_thm_caption_data {
return true;
}
private void Capt_2_chk(Gfh_tag_rdr tag_rdr, Gfh_tag capt_tail, byte[] src) {
Gfh_tag nxt_div_head = tag_rdr.Tag__peek_fwd_head(Gfh_tag_.Id__div);
if (nxt_div_head.Atrs__cls_has(gplx.xowa.htmls.core.wkrs.lnkis.htmls.Xoh_file_fmtr__basic.Bry__xowa_alt_text)) {
tag_rdr.Tag__move_fwd_head();
xowa_alt_text_exists = true;
}
int capt_tail_end = capt_tail.Src_end();
Gfh_tag nxt_div_tail = tag_rdr.Tag__peek_fwd_tail(Gfh_tag_.Id__div);
int nxt_div_tail_bgn = nxt_div_tail.Src_bgn();
@ -59,6 +65,8 @@ public class Xoh_thm_caption_data {
capt_2_bgn = nxt_tag.Src_end(); // NOTE: do not try to trim ws; PAGE:en.w:Chimney_sweep; DATE:2016-01-05
nxt_tag = tag_rdr.Tag__move_fwd_tail(Gfh_tag_.Id__div); // </div>
capt_2_end = nxt_tag.Src_bgn(); // NOTE: do not try to trim ws; PAGE:en.w:Chimney_sweep; DATE:2016-01-05
if (xowa_alt_text_exists)
tag_rdr.Tag__move_fwd_tail(Gfh_tag_.Id__div);
}
else {
if (!Bry_.Match(src, capt_tail_end, capt_tail_end + 7, Bry__div_1_tail_bgn)) { // next chars should be "\n</div>"

View File

@ -53,6 +53,7 @@ public class Pfunc_ifexist_mgr {
// rarely true, but check local wiki's [[File:]] table anyway
Xow_ns file_ns = wiki.Ns_mgr().Ns_file();
Xoa_ttl file_ttl = wiki.Ttl_parse(file_ns.Id(), page_db);
if (file_ttl == null) return false; // NOTE: must check for NPE: PAGE:es.w:Elecciones_presidenciales_de_Venezuela_de_1998 DATE:2017-09-04
byte exists = wiki.Cache_mgr().Ifexist_cache().Get_by_mem(file_ttl);
if (exists == Bool_.Y_byte) return true;