"
@@ -74,7 +74,7 @@ public class Xoh_file_wtr__audio__tst {
fxt.Test_parse_page_wiki_str
( "[[File:A.oga|thumb|noicon|a|alt=b]]", String_.Concat_lines_nl_skip_last
( "
"
, "
a"
, "
"
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java
index a3489cb40..609a0edc8 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__basic.java
@@ -21,48 +21,55 @@ import gplx.langs.htmls.*; import gplx.langs.htmls.encoders.*; import gplx.xowa.
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
import gplx.xowa.wikis.nss.*; import gplx.xowa.files.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*;
-public class Xoh_file_wtr__basic {
- private final Xowe_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;
- private final Xop_link_parser tmp_link_parser = new Xop_link_parser(); private Xoa_url tmp_url = Xoa_url.blank(); private final Xoh_lnki_title_fmtr anchor_title_wkr = new Xoh_lnki_title_fmtr();
- private Xoae_page page; private boolean cfg_alt_defaults_to_caption;
- private Xoh_file_html_fmtr__base html_fmtr;
- private final Xoh_file_html_fmtr__hdump fmtr__hdump = new Xoh_file_html_fmtr__hdump();
- private final Xoh_file_html_fmtr__base fmtr__base = new Xoh_file_html_fmtr__base();
+public class Xoh_file_wtr__basic {
+ private final Xowe_wiki wiki; private final Xow_html_mgr html_mgr; private final Xoh_html_wtr html_wtr;
+ private final Xoh_file_fmtr__basic fmtr__basic = new Xoh_file_fmtr__basic(), fmtr__hdump = new Xoh_file_fmtr__hdump();
+ private final Xoh_lnki_text_fmtr alt_fmtr, caption_fmtr;
+ private final Xop_link_parser tmp_link_parser = new Xop_link_parser(); private Xoa_url tmp_url = Xoa_url.blank();
+ private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(32);
+ private Xoae_page page; private boolean cfg_alt_defaults_to_caption; private byte[] msg_file_enlarge;
+ private Xoh_file_fmtr__basic html_fmtr;
public Xoh_file_wtr__basic(Xowe_wiki wiki, Xow_html_mgr html_mgr, Xoh_html_wtr html_wtr) {
- this.wiki = wiki; this.html_mgr = html_mgr; this.html_wtr = html_wtr; this.bfr_mkr = wiki.Utl__bfr_mkr();
- this.media_alt_fmtr = new Xoh_lnki_text_fmtr(bfr_mkr, html_wtr);
- this.caption_fmtr = new Xoh_lnki_text_fmtr(bfr_mkr, html_wtr);
- this.html_fmtr = fmtr__base;
+ this.wiki = wiki; this.html_mgr = html_mgr; this.html_wtr = html_wtr;
+ this.alt_fmtr = new Xoh_lnki_text_fmtr(wiki.Utl__bfr_mkr(), html_wtr);
+ this.caption_fmtr = new Xoh_lnki_text_fmtr(wiki.Utl__bfr_mkr(), html_wtr);
+ this.html_fmtr = fmtr__basic;
}
- public Xoh_file_html_fmtr__base Html_fmtr() {return html_fmtr;}
public void Init_by_page(Xoh_wtr_ctx hctx, Xoae_page page) {
this.page = page;
this.cfg_alt_defaults_to_caption = wiki.Appe().Usere().Wiki().Html_mgr().Imgs_mgr().Alt_defaults_to_caption().Val();
- html_fmtr = hctx.Mode_is_hdump() ? fmtr__hdump : fmtr__base;
+ this.html_fmtr = hctx.Mode_is_hdump() ? fmtr__hdump : fmtr__basic;
+ if (msg_file_enlarge == null) this.msg_file_enlarge = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_file_enlarge);
}
public void Write_file(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, byte[] img_alt) {
+ // init
int uid = xfer_itm.Html_uid();
+ byte[] lnki_ttl = lnki.Ttl().Page_txt();
+ Xof_ext orig_ext = xfer_itm.Orig_ext();
+ byte[] lnki_href = wiki.Html__href_wtr().Build_to_bry(wiki, lnki.Ttl());
+
+ // get div_width
int div_width = xfer_itm.Html_w();
if (div_width < 1 && wiki.File_mgr().Version_2_y()) // NOTE: html_w is -1 for v2 and missing files; use lnki_w if available; primarily affects audio files with specified width; [[File:A.oga|30px]]; DATE:2014-05-03
div_width = xfer_itm.Lnki_w();
if (div_width < 1) // && hctx.Mode_is_hdump() // TODO: should manually insert?
div_width = wiki.Html_mgr().Img_thumb_width();
- int lnki_halign = lnki.Align_h();
- if (lnki_halign == Xop_lnki_align_h_.Null)
- lnki_halign = wiki.Lang().Img_thumb_halign_default(); // if halign is not supplied, then default to align for language
- byte[] lnki_halign_bry = Xop_lnki_align_h_.Html_names[lnki_halign];
- byte[] lnki_href = wiki.Html__href_wtr().Build_to_bry(wiki, lnki.Ttl());
- byte[] img_view_src = xfer_itm.Html_view_url().To_http_file_bry();
- byte[] img_orig_src = xfer_itm.Html_orig_url().To_http_file_bry();
- byte[] lnki_ttl = lnki.Ttl().Page_txt();
- Xof_ext orig_ext = xfer_itm.Orig_ext();
boolean lnki_is_thumbable = Xop_lnki_type.Id_is_thumbable(lnki.Lnki_type());
if ( lnki_is_thumbable
&& ( !xfer_itm.File_exists() // "non-found" thumbs should default to 220; otherwise large "non-found" thumbs will create large boxes; PAGE:en.w:Wikipedia:Featured_picture_candidates/September_Morn "|1000000x260px"; DATE:2014-09-24
&& !hctx.Mode_is_hdump()) // ignore for hdump mode b/c all images are "non-found"; DATE:2016-05-30
)
div_width = Xof_img_size.Thumb_width_img;
+
+ // get halign
+ int lnki_halign = lnki.Align_h();
+ if (lnki_halign == Xop_lnki_align_h_.Null)
+ lnki_halign = wiki.Lang().Img_thumb_halign_default(); // if halign is not supplied, then default to align for language
+ byte[] lnki_halign_bry = Xop_lnki_align_h_.Html_names[lnki_halign];
+
+ // img_view_src, img_orig_src
+ byte[] img_view_src = xfer_itm.Html_view_url().To_http_file_bry();
+ byte[] img_orig_src = xfer_itm.Html_orig_url().To_http_file_bry();
if ( html_mgr.Img_suppress_missing_src() // option to suppress src when file is missing
&& !xfer_itm.File_exists() // file is missing; wipe values and wait for "correct" info before regenerating; mostly to handle unknown redirects
&& !orig_ext.Id_is_media() // file is media; never suppress; src needs to be available for "click" on play; note that most media will be missing (not downloaded)
@@ -70,78 +77,138 @@ public class Xoh_file_wtr__basic {
) {
img_orig_src = img_view_src = Bry_.Empty; // null out src
}
+
+ // main html build
if (lnki.Ns_id() == Xow_ns_.Tid__media) // NOTE: regardless of ext (ogg vs jpeg) and literal status (Media vs :Media), [[Media]] links are always rendered the same way; REF.MW:Linker.php|makeMediaLinkObj; PAGE:en.w:Beethoven; EX: [[:Media:De-Ludwig_van_Beethoven.ogg|listen]]); [[File:Beethoven 3.jpg|The [[Media:BeethovenWithLyreGuitar( W. J. Mahler - 1804).jpg|complete painting]]...]]
- this.Write_file_ns_media(bfr, ctx, hctx, src, lnki, img_orig_src);
+ html_fmtr.Add_media(bfr, hctx.Mode_is_hdump(), img_orig_src, lnki_ttl, Bld_caption(ctx, Xoh_wtr_ctx.Basic, src, lnki)); // NOTE: use orig_src not view_src; DATE:2014-01-19
else {
- if ( Xof_ext_.Id_is_video_strict(orig_ext.Id()) // id is .ogv or .webm
- || ( orig_ext.Id_is_ogg() // id is ogg
- && wiki.File_mgr().Version_1_y() // version is v1 (v2 always marks ogg as aud); DATE:2014-02-01
+ // identify if video; note that this is complicated b/c .ogg is used for both audio and video files
+ boolean orig_is_video = Xof_ext_.Id_is_video_strict(orig_ext.Id());
+ if (orig_ext.Id_is_ogg()) {
+ if ( wiki.File_mgr().Version_1_y() // version is v1 (v2 always marks ogg as aud if from fsdb); DATE:2014-02-01
&& ( xfer_itm.File_exists() // NOTE: xfer_itm.Html_pass() checks for video .ogg files (ext = .ogg and thumb is available); EX: WWI;
|| xfer_itm.Dbmeta_is_new() // NOTE: State_new() will always assume that ogg is video; needed for 1st load and dynamic updates
)
- )
- ) {
+ )
+ orig_is_video = true;
+ else if ( wiki.File_mgr().Version_2_y() // version is v2
+ && ( lnki.Lnki_type() != Xop_lnki_type.Id_null // any one of w, h, time, upright, type is present
+ || lnki.W() > 0
+ || lnki.H() > 0
+ || lnki.Time() != Xof_lnki_time.Null
+ || lnki.Upright() != Xop_lnki_tkn.Upright_null
+ )) {
+ orig_is_video = true; // ASSUME: .ogg is video b/c of supplied values; DATE:2016-08-05
+ }
+ }
+ if (orig_is_video) {
xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid);
- this.Write_file_video(bfr, ctx, hctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_ttl, lnki_href, img_view_src, img_orig_src, img_alt, xfer_itm);
+ int vid_lnki_w = lnki.W(); if (vid_lnki_w == -1) vid_lnki_w = 0; if (vid_lnki_w == 0 && xfer_itm.Html_w() != 0) vid_lnki_w = xfer_itm.Html_w();
+ int vid_lnki_h = lnki.H(); if (vid_lnki_h == -1) vid_lnki_h = 0; if (vid_lnki_h == 0 && xfer_itm.Html_h() != 0) vid_lnki_h = xfer_itm.Html_h();
+ xfer_itm.Init_at_gallery_bgn(vid_lnki_w, vid_lnki_h, vid_lnki_w); // HACK: force html_w to be lnki_w; needed b/c play_btn uses html_w; DATE:2016-08-05
+ this.Write_file_video(bfr, ctx, hctx, src, lnki, img_orig_src, uid, div_width, lnki_halign_bry, lnki_href, img_alt, lnki_ttl, img_view_src, xfer_itm);
}
else if (orig_ext.Id_is_audio()) // audio
- this.Write_file_audio(bfr, ctx, hctx, src, lnki, uid, div_width, lnki_halign_bry, lnki_href, img_orig_src, img_alt);
+ this.Write_file_audio(bfr, ctx, hctx, src, lnki, img_orig_src, uid, div_width, lnki_halign_bry, lnki_href, img_alt, lnki_ttl);
else // image
- this.Write_file_image(bfr, ctx, hctx, src, lnki, xfer_itm, uid, lnki_is_thumbable, div_width, lnki_halign, lnki_halign_bry, lnki_ttl, orig_ext, lnki_href, img_view_src, img_orig_src, img_alt);
+ this.Write_file_image(bfr, ctx, hctx, src, lnki, img_orig_src, uid, div_width, lnki_halign_bry, lnki_href, img_alt, lnki_ttl, img_view_src, xfer_itm, lnki_is_thumbable, lnki_halign, orig_ext);
}
}
- private void Write_file_ns_media(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src) {
- html_fmtr.Html_full_media(bfr, hctx.Mode_is_hdump(), img_orig_src, lnki.Ttl().Page_txt(), Arg_caption(ctx, src, Xoh_wtr_ctx.Basic, lnki)); // NOTE: use orig_src not view_src; DATE:2014-01-19
- }
- private void Write_file_audio(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] img_orig_src, byte[] alt) {
- byte[] content = Arg_content_audio(lnki, ctx, hctx, src, uid, lnki_href, img_orig_src, alt);
+ private void Write_file_audio(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] alt, byte[] lnki_ttl) {
+ // init
+ int play_btn_width = Get_play_btn_width(lnki.W());
+ byte[] info_btn = lnki.Media_icon() ? html_fmtr.Bld_thumb_part_info(lnki_href) : Bry_.Empty;
+
+ // bld audio_div
+ byte[] audio_div = html_fmtr.Bld_thumb_file_audio
+ ( Bld_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href)
+ , Bld_alt(Bool_.Y, ctx, hctx, src, lnki)
+ , Bld_play_btn(hctx, uid, img_orig_src, lnki_ttl, play_btn_width, play_btn_width) // NOTE: changed max_width from 1024: DATE:2016-08-05
+ , info_btn);
+
+ // if "media" flag, add as thumb; else, add directly
if (lnki.Media_icon())
- html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content);
+ html_fmtr.Add_thumb_core(bfr, hctx.Mode_is_hdump(), lnki_halign_bry, uid, div_width, audio_div);
else
- bfr.Add(content);
+ bfr.Add(audio_div);
}
- private void Write_file_video(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_ttl, byte[] lnki_href, byte[] img_view_src, byte[] img_orig_src, byte[] alt, Xof_file_itm xfer_itm) {
- xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid);
+ private void Write_file_video(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] alt, byte[] lnki_ttl, byte[] img_view_src, Xof_file_itm xfer_itm) {
+ // init
+ int play_btn_width = Get_play_btn_width(xfer_itm.Html_w());
boolean video_is_thumb = Xop_lnki_type.Id_defaults_to_thumb(lnki.Lnki_type());
- byte[] content = Arg_content_video(ctx, hctx, src, lnki, xfer_itm, uid, video_is_thumb, lnki_ttl, lnki_href, img_view_src, img_orig_src, alt);
+ xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_vid);
+
+ // bld caption / alt
+ byte[] caption_html = Bry_.Empty, alt_html = Bry_.Empty;
+ if (video_is_thumb) {
+ caption_html = Bld_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href);
+ alt_html = Bld_alt(Bool_.Y, ctx, hctx, src, lnki);
+ }
+
+ // bld video_div
+ byte[] video_div = html_fmtr.Bld_thumb_file_video(caption_html, alt_html
+ , Bld_play_btn(hctx, uid, img_orig_src, lnki_ttl, play_btn_width, play_btn_width)
+ , html_fmtr.Bld_thumb_part_img(hctx, page, src, xfer_itm, uid, lnki_ttl, lnki_href, img_view_src, alt));
+
+ // if "thumbable", add as thumb; else, add directly
if (video_is_thumb)
- html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content);
+ html_fmtr.Add_thumb_core(bfr, hctx.Mode_is_hdump(), lnki_halign_bry, uid, div_width, video_div);
else
- bfr.Add(content);
+ bfr.Add(video_div);
}
- private void Write_file_image(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, int uid, boolean lnki_is_thumbable, int div_width, int lnki_halign, byte[] lnki_halign_bry
- , byte[] lnki_ttl, Xof_ext orig_ext, byte[] lnki_href, byte[] img_view_src, byte[] img_orig_src, byte[] alt) {
+ private void Write_file_image(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, byte[] img_orig_src, int uid, int div_width, byte[] lnki_halign_bry, byte[] lnki_href, byte[] alt, byte[] lnki_ttl, byte[] img_view_src, Xof_file_itm xfer_itm
+ , boolean lnki_is_thumbable, int lnki_halign, Xof_ext orig_ext) {
+ // if centered, add
; applies to both thumb and full
if (lnki_halign == Xop_lnki_align_h_.Center) bfr.Add(Div_center_bgn);
- Bry_bfr tmp_bfr = bfr_mkr.Get_k004();
- byte[] anchor_title = html_wtr.Cfg().Lnki__title()
- ? Arg_anchor_title(tmp_bfr, src, lnki, lnki_ttl, anchor_title_wkr) // NOTE: Arg_anchor_title should only be called if there is no caption, else refs may not show; DATE:2014-03-05
- : Bry_.Empty;
- Xoh_file_img_wkr lnki_file_wkr = lnki.Lnki_file_wkr(); if (lnki_file_wkr == null) lnki_file_wkr = html_fmtr;
+
+ // bld anch_ttl; EX: title="A.png"
+ byte[] anch_ttl = html_wtr.Cfg().Lnki__title()
+ ? Bld_anch_title(tmp_bfr, src, lnki, lnki_ttl) // NOTE: Bld_anch_title should only be called if there is no caption, else refs may not show; DATE:2014-03-05
+ : Bry_.Empty;
+
+ // get fmtr; note conditional is for imap, which has its own img_fmtr to put in 'imagemap=""'
+ Xoh_file_fmtr img_fmtr = lnki.Lnki_file_wkr(); if (img_fmtr == null) img_fmtr = html_fmtr;
+
+ // main image build
if (lnki_is_thumbable) { // is "thumb"
if (bfr.Len() > 0) bfr.Add_byte_nl();
- byte[] content = Arg_content_thumb(lnki_file_wkr, ctx, hctx, src, lnki, xfer_itm, uid, lnki_href, img_view_src, img_orig_src, alt, lnki_ttl, anchor_title);
- html_fmtr.Html_thumb_core(bfr, hctx.Mode_is_hdump(), uid, lnki_halign_bry, div_width, content);
+
+ // write image_div
+ byte[] alt_html = wiki.Html_mgr().Imgs_mgr().Alt_in_caption().Val() ? Bld_alt(Bool_.Y, ctx, hctx, src, lnki) : Bry_.Empty;
+ img_fmtr.Add_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anch_ttl
+ , Xoh_file_fmtr__basic.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt
+ , xfer_itm.File_exists() ? Xoh_img_cls_.Tid__thumbimage : Xoh_img_cls_.Tid__none
+ , Xoh_img_cls_.Bry__none);
+ byte[] thumb = tmp_bfr.To_bry_and_clear();
+ html_fmtr.Add_thumb_core(bfr, hctx.Mode_is_hdump(), lnki_halign_bry, uid, div_width
+ , html_fmtr.Bld_thumb_file_image(thumb, Bld_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href), alt_html)
+ );
}
- else {
+ else { // is full
if ( cfg_alt_defaults_to_caption
- && Bry_.Len_eq_0(alt) // NOTE: if no alt, always use caption; DATE:2013-07-22
+ && Bry_.Len_eq_0(alt) // NOTE: if no alt, always use caption for alt; DATE:2013-07-22
&& !lnki.Alt_exists() // unless blank alt exists; EX: [[File:A.png|a|alt=]] should have alt of "", not "a"
) {
- Arg_caption(ctx, src, Xoh_wtr_ctx.Alt, lnki).Bfr_arg__add(tmp_bfr);
- alt = tmp_bfr.To_bry_and_clear();
+ alt = Bld_caption(ctx, Xoh_wtr_ctx.Alt, src, lnki);
}
+
+ // open "
"
boolean div_align_exists = false;
switch (lnki.Align_h()) {
case Xop_lnki_align_h_.Left: bfr.Add(Div_float_left) .Add_byte_nl(); div_align_exists = true; break;
case Xop_lnki_align_h_.Right: bfr.Add(Div_float_right).Add_byte_nl(); div_align_exists = true; break;
case Xop_lnki_align_h_.None: bfr.Add(Div_float_none) .Add_byte_nl(); div_align_exists = true; break;
}
+
+ // init vars
byte img_cls_tid = lnki.Border() == Bool_.Y_byte ? Xoh_img_cls_.Tid__thumbborder : Xoh_img_cls_.Tid__none;
byte[] img_cls_other = lnki.Lnki_cls(); // PAGE:en.s:Page:Notes_on_Osteology_of_Baptanodon._With_a_Description_of_a_New_Species.pdf/3; DATE:2014-09-06
+
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, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other);
- else { // thumb
+ if (lnki_link_tkn == Arg_nde_tkn.Null) // link absent; just write it
+ img_fmtr.Add_full_img(bfr, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anch_ttl, Xoh_file_fmtr__basic.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other);
+ else { // link exists; more logic; EX: [[File:A.png|thumb|link=B]]
+ // over-ride other vars based on link arg; below should be cleaned up
Arg_itm_tkn link_tkn = lnki_link_tkn.Val_tkn();
byte[] link_arg = Xoa_ttl.Replace_spaces(link_tkn.Dat_to_bry(src)); // replace spaces with unders, else "/wiki/File:A b.ogg" instead of "A_b.ogg"; DATE:2015-11-27
if (Bry_.Has_at_bgn(link_arg, Xop_tkn_.Anchor_byte)) link_arg = Bry_.Add(ctx.Page().Ttl().Page_db(), link_arg);
@@ -152,93 +219,55 @@ public class Xoh_file_wtr__basic {
link_arg = link_arg_html == null ? lnki_href : link_arg_html; // if parse fails, then assign to lnki_href; EX:link={{{1}}}
link_arg = Gfo_url_encoder_.Href_qarg.Encode(link_arg); // must encode quotes; PAGE:en.w:List_of_cultural_heritage_sites_in_Punjab,_Pakistan; DATE:2014-07-16
// if (Bry_.Len_gt_0(tmp_link_parser.Html_xowa_ttl())) lnki_ttl = tmp_link_parser.Html_xowa_ttl(); // DELETE: not sure why this is here; breaks test; DATE:2015-11-28
- lnki_file_wkr.Html_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, a_href_is_file, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(xowa_title_bry), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other);
+ img_fmtr.Add_full_img(bfr, hctx, page, src, xfer_itm, uid, link_arg, a_href_is_file, tmp_link_parser.Html_anchor_cls(), tmp_link_parser.Html_anchor_rel(), anch_ttl, Xoh_file_fmtr__basic.Escape_xowa_title(xowa_title_bry), xfer_itm.Html_w(), xfer_itm.Html_h(), img_view_src, alt, img_cls_tid, img_cls_other);
}
- if (div_align_exists) bfr.Add(Gfh_tag_.Div_rhs); // close div from above
+
+ // close "
"
+ if (div_align_exists) bfr.Add(Gfh_tag_.Div_rhs);
}
+
+ // close
if (lnki_halign == Xop_lnki_align_h_.Center) bfr.Add(Gfh_tag_.Div_rhs);
- tmp_bfr.Mkr_rls();
}
- private byte[] Arg_content_thumb(Xoh_file_img_wkr lnki_file_wkr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, int uid, byte[] lnki_href, byte[] view_src, byte[] img_orig_src, byte[] lnki_alt_text, byte[] lnki_ttl, byte[] anchor_title) {
- byte[] lnki_alt_html = wiki.Html_mgr().Imgs_mgr().Alt_in_caption().Val() ? Arg_alt_html(ctx, hctx, src, lnki) : Bry_.Empty;
- byte img_cls_tid = xfer_itm.File_exists() ? Xoh_img_cls_.Tid__thumbimage : Xoh_img_cls_.Tid__none;
- Bry_bfr tmp_bfr = bfr_mkr.Get_k004();
- lnki_file_wkr.Html_full_img(tmp_bfr, hctx, page, src, xfer_itm, uid, lnki_href, Bool_.N, Xoh_lnki_consts.Tid_a_cls_image, Xoh_lnki_consts.Tid_a_rel_none, anchor_title, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki_ttl), xfer_itm.Html_w(), xfer_itm.Html_h(), view_src, lnki_alt_text, img_cls_tid, Xoh_img_cls_.Bry__none);
- byte[] thumb = tmp_bfr.To_bry_and_clear();
- html_fmtr.Html_thumb_file_image(tmp_bfr, thumb, Arg_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href), lnki_alt_html);
- return tmp_bfr.To_bry_and_rls();
+ private byte[] Bld_caption_div(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, byte[] img_orig_src, byte[] lnki_href) {
+ byte[] caption = Bld_caption(ctx, hctx, src, lnki);
+ byte[] magnify_btn = lnki.Media_icon() ? html_fmtr.Bld_thumb_part_magnify(lnki_href, msg_file_enlarge) : Bry_.Empty;
+ return html_fmtr.Bld_thumb_part_caption(magnify_btn, caption);
}
- private byte[] Arg_content_audio(Xop_lnki_tkn lnki, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, int uid, byte[] lnki_href, byte[] img_orig_src, byte[] alt) {
- byte[] info_btn = Bry_.Empty;
- if (lnki.Media_icon()) {
- html_fmtr.Html_thumb_part_info(scratch_bfr, uid, hctx.Mode_is_hdump(), lnki_href, html_mgr.Img_media_info_btn());
- info_btn = scratch_bfr.To_bry_and_clear();
- }
- int play_btn_width = lnki.W(); if (play_btn_width < 1) play_btn_width = html_mgr.Img_thumb_width(); // if no width set width to default img width
- html_fmtr.Html_thumb_file_audio(scratch_bfr, Arg_caption_div(ctx, hctx, src, lnki, uid, img_orig_src, lnki_href), Arg_alt_html(ctx, hctx, src, lnki), Arg_play_btn(hctx.Mode_is_hdump(), uid, play_btn_width, Play_btn_max_width, img_orig_src, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki.Ttl().Page_txt())), info_btn);
- return scratch_bfr.To_bry_and_clear();
+ private byte[] Bld_caption(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) {
+ return lnki.Caption_exists()
+ ? caption_fmtr.To_bry(ctx, hctx, src, lnki.Caption_val_tkn(), Bool_.N, Xoh_lnki_text_fmtr.Null__fmt)
+ : Bry_.Empty;
}
- private byte[] Arg_content_video(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, Xof_file_itm xfer_itm, int uid, boolean lnki_thumb, byte[] lnki_ttl, byte[] a_href, byte[] view_src, byte[] orig_src, byte[] img_alt) {
- int thumb_w = xfer_itm.Html_w();
- int play_btn_width = thumb_w; if (play_btn_width < 1) play_btn_width = wiki.Html_mgr().Img_thumb_width();
- byte[] caption_html = Bry_.Empty, alt_html = Bry_.Empty;
- if (lnki_thumb) {
- caption_html = Arg_caption_div(ctx, hctx, src, lnki, uid, orig_src, a_href);
- alt_html = Arg_alt_html(ctx, hctx, src, lnki);
- }
- html_fmtr.Html_thumb_file_video(scratch_bfr
- , Arg_play_btn(hctx.Mode_is_hdump(), uid, play_btn_width, play_btn_width, orig_src, Xoh_file_html_fmtr__base.Escape_xowa_title(lnki.Ttl().Page_txt()))
- , html_fmtr.Html_thumb_part_img(scratch_bfr, hctx, page, src, xfer_itm, uid, lnki_ttl, a_href, view_src, img_alt)
- , caption_html, alt_html);
- return scratch_bfr.To_bry_and_clear();
- }
- private byte[] Arg_caption_div(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki, int uid, byte[] img_orig_src, byte[] lnki_href) {
- Bfr_arg caption = Arg_caption(ctx, src, hctx, lnki);
- byte[] magnify_btn = Bry_.Empty;
- if (lnki.Media_icon()) {
- if (msg_file_enlarge == null) msg_file_enlarge = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_file_enlarge);
- html_fmtr.Html_thumb_part_magnify(scratch_bfr, uid, lnki_href, msg_file_enlarge, html_mgr.Img_thumb_magnify());
- magnify_btn = scratch_bfr.To_bry_and_clear();
- }
- html_fmtr.Html_thumb_part_caption(scratch_bfr, magnify_btn, caption);
- return scratch_bfr.To_bry_and_clear();
- } private byte[] msg_file_enlarge;
- private Bfr_arg Arg_caption(Xop_ctx ctx, byte[] src, Xoh_wtr_ctx hctx_for_caption, Xop_lnki_tkn lnki) {
- return lnki.Caption_exists() ? caption_fmtr.Set(ctx, hctx_for_caption, src, lnki.Caption_val_tkn(), Xoh_lnki_text_fmtr.Null_fmtr, Bool_.N) : Bfr_arg_.Noop;
- }
- public byte[] Arg_alt_text(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki) {
- if (!lnki.Alt_exists()) return Bry_.Empty;
- media_alt_fmtr.Set(ctx, Xoh_wtr_ctx.Alt, src, lnki.Alt_tkn().Val_tkn(), Xoh_lnki_text_fmtr.Null_fmtr, Bool_.N);
- Bry_bfr tmp_bfr = bfr_mkr.Get_k004();
- media_alt_fmtr.Bfr_arg__add(tmp_bfr);
- return tmp_bfr.To_bry_and_rls();
- }
- private byte[] Arg_alt_html(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] alt_src, Xop_lnki_tkn lnki) {
- if (!lnki.Alt_exists()) return Bry_.Empty;
- media_alt_fmtr.Set(ctx, hctx, alt_src, lnki.Alt_tkn().Val_tkn(), html_fmtr.Html_thumb_part_alt_fmtr(), Bool_.Y);
- Bry_bfr tmp_bfr = bfr_mkr.Get_k004();
- media_alt_fmtr.Bfr_arg__add(tmp_bfr);
- return tmp_bfr.To_bry_and_rls();
- }
- private byte[] Arg_play_btn(boolean mode_is_hdump, int uid, int width, int max_width, byte[] a_href, byte[] a_xowa_title) {
- html_fmtr.Html_thumb_part_play(scratch_bfr, uid, mode_is_hdump, width - 2, max_width, a_href, a_xowa_title, html_mgr.Img_media_play_btn()); // NOTE: -2 is fudge factor else play btn will jut out over video thumb; see Earth and ISS video
- return scratch_bfr.To_bry_and_clear();
- }
- private static byte[] Arg_anchor_title(Bry_bfr tmp_bfr, byte[] src, Xop_lnki_tkn lnki, byte[] lnki_ttl, Xoh_lnki_title_fmtr anchor_title_wkr) {
+ private byte[] Bld_anch_title(Bry_bfr bfr, byte[] src, Xop_lnki_tkn lnki, byte[] lnki_ttl) {
if ( Bitmask_.Has_int(lnki.Lnki_type(), Xop_lnki_type.Id_thumb)
|| Bitmask_.Has_int(lnki.Lnki_type(), Xop_lnki_type.Id_frame) // If the image is a thumb, do not add a title / alt, even if a caption is available
)
- return Bry_.Empty;
+ return Bry_.Empty;
else if ( Bitmask_.Has_int(lnki.Lnki_type(), Xop_lnki_type.Id_frameless)) { // If the image is frameless, add the caption as a title / alt. If no caption is available, do not add a title / alt
}
- Xop_tkn_itm anchor_title_tkn = lnki.Caption_tkn();
- if (anchor_title_tkn == Xop_tkn_null.Null_tkn) return Bry_.Empty; // no caption; return empty; (do not use lnki); DATE:2013-12-31
- tmp_bfr.Add(Atr_title);
- anchor_title_wkr.Set(src, anchor_title_tkn).Bfr_arg__add(tmp_bfr);
- tmp_bfr.Add_byte(Byte_ascii.Quote);
- return tmp_bfr.To_bry_and_clear();
+ Xop_tkn_itm capt_tkn = lnki.Caption_tkn();
+ if (capt_tkn == Xop_tkn_null.Null_tkn) return Bry_.Empty; // no caption; return empty; NOTE: do not use lnki as caption; DATE:2013-12-31
+
+ // build title="text"
+ bfr.Add(Atr_title);
+ Xoh_lnki_title_bldr.Add(bfr, src, capt_tkn);
+ bfr.Add_byte(Byte_ascii.Quote);
+ return bfr.To_bry_and_clear();
}
- public static final int Play_btn_max_width = 1024;
+ public byte[] Bld_alt(boolean html, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_lnki_tkn lnki) {
+ if (!lnki.Alt_exists()) return Bry_.Empty;
+ return html
+ ? alt_fmtr.To_bry(ctx, hctx, src, lnki.Alt_tkn().Val_tkn(), Bool_.Y, html_fmtr.Fmt_thumb_part_alt())
+ : alt_fmtr.To_bry(ctx, hctx, src, lnki.Alt_tkn().Val_tkn(), Bool_.N, Xoh_lnki_text_fmtr.Null__fmt);
+ }
+ private byte[] Bld_play_btn(Xoh_wtr_ctx hctx, int uid, byte[] a_href, byte[] lnki_href, int width, int max_width) {
+ return html_fmtr.Bld_thumb_part_play(hctx.Mode_is_hdump(), uid, a_href, Xoh_file_fmtr__basic.Escape_xowa_title(lnki_href)
+ , width - 2, max_width); // NOTE: -2 is fudge factor else play btn will jut out over video thumb; see Earth and ISS video
+ }
+ private int Get_play_btn_width(int w) {return w > 0 ? w : html_mgr.Img_thumb_width();} // if no width set width to default img width
+
+ // private static final int Play_btn_max_width = 1024;
private static final byte[]
Div_center_bgn = Bry_.new_a7("
")
, Div_float_none = Bry_.new_a7("
")
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java
index b39b4d62c..361f2fdc4 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__image__tst.java
@@ -18,7 +18,7 @@ along with this program. If not, see
.
package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*;
import org.junit.*;
public class Xoh_file_wtr__image__tst {
- private final Xop_fxt fxt = new Xop_fxt();
+ private final Xop_fxt fxt = new Xop_fxt();
@Before public void init() {fxt.Reset();}
@Test public void Img__full() { // PURPOSE: full with title was outputting invalid html; DATE:2013-12-31
fxt.Wtr_cfg().Lnki__title_(true);
@@ -39,6 +39,22 @@ public class Xoh_file_wtr__image__tst {
@Test public void Img__embed() {
fxt.Test_parse_page_wiki_str("[[File:A.png|9x8px|alt=abc]]", Xop_fxt.html_img_none("File:A.png", "abc", "file:///mem/wiki/repo/trg/thumb/7/0/A.png/9px.png", "A.png"));
}
+ @Test public void Embed_audio() {
+ fxt.Test_parse_page_wiki_str("[[File:A.jpg|thumb|b[[File:C.ogg|right|140x140px]]d]]", String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "

"
+ , "
"
+ , "
"
+ , "
"
+ ));
+ }
@Test public void Img__none() { // NOTE: floatnone is WP behavior; MW omits div tag
fxt.Test_parse_page_wiki_str
( "[[File:A.png|none|20x30px|b]]"
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java
index 7cee22c77..1e15f1461 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_wtr__video__tst.java
@@ -18,30 +18,64 @@ along with this program. If not, see
.
package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*;
import org.junit.*; import gplx.xowa.files.*;
public class Xoh_file_wtr__video__tst {
- @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt();
- @Test public void Video__full() {
+ @Before public void init() {fxt.Reset();} private final Xop_fxt fxt = new Xop_fxt();
+ @Test public void Video__full__ogv__width_y() {// EX: [[File:A.ogv|320px|bcd|alt=efg]]; DATE:2016-08-05
fxt.Test_parse_page_wiki_str
- ( "[[File:A.ogv|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last
+ ( "[[File:A.ogv|320px|bcd|alt=efg]]", String_.Concat_lines_nl_skip_last
( "
"
));
}
- @Test public void Video__full_ogg() {// PURPOSE: ogg should default to video on first load; otherwise dynamic-update won't be able to put in thumb; DATE:2015-05-21
- Xof_file_fxt file_fxt = Xof_file_fxt.new_all(fxt.Wiki());
- file_fxt.Exec_orig_add(Bool_.Y, "A.ogg", Xof_ext_.Id_ogv, 400, 400, "");
+ @Test public void Video__full__ogv__width_n() {// EX: [[File:A.ogv]]; DATE:2016-08-05
fxt.Test_parse_page_wiki_str
- ( "[[File:A.ogg|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last
+ ( "[[File:A.ogv]]", String_.Concat_lines_nl_skip_last
+ ( "
"
+ ));
+ }
+ @Test public void Video__full_ogg() {// PURPOSE: ogg w/ width should default to video; otherwise dynamic-update won't be able to convert audio-button to thumb; DATE:2016-08-05
+ // NOTE: simulates app w/ fsdb
+ Xof_file_fxt file_fxt = Xof_file_fxt.new_all(fxt.Wiki());
+ file_fxt.Exec_orig_add(Bool_.Y, "A.ogg", Xof_ext_.Id_ogv, 320, 300, "");
+
+ fxt.Test_parse_page_wiki_str
+ ( "[[File:A.ogg|320px|bcd|alt=efg]]", String_.Concat_lines_nl_skip_last
+ ( "
"
+ ));
+ }
+ @Test public void Video__thumb_ogg() { // PURPOSE: w/ width should default to video; DATE:2016-08-05
+ // NOTE: simulates hdump w/ no fsdb
+ fxt.Wiki().File_mgr().Version_2_y_();
+ fxt.Wiki().File__fsdb_mode().Tid__v2__bld__y_();
+ fxt.Hctx_(gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Hdump);
+
+ fxt.Test_parse_page_wiki_str
+ ( "[[File:A.ogg|thumb|320px|a|alt=b]]", String_.Concat_lines_nl_skip_last
( "
"
- , "
"
+ , "
" // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24
, "
"
, "
"
, "
a"
@@ -51,26 +85,30 @@ public class Xoh_file_wtr__video__tst {
, "
"
, "
"
, "
"
+ , ""
));
+
+ fxt.Wiki().File_mgr().Version_1_y_();
+ fxt.Hctx_(gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Basic);
}
@Test public void Video__thumb() {
fxt.Test_parse_page_wiki_str
- ( "[[File:A.ogv|thumb|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last
+ ( "[[File:A.ogv|thumb|320px|bcd|alt=efg]]", String_.Concat_lines_nl_skip_last
( "
"
, "
" // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24
, "
"
, "
"
, "
"
- , "
"
, "
"
@@ -79,16 +117,16 @@ public class Xoh_file_wtr__video__tst {
}
@Test public void Video__thumb_webm() { // PURPOSE: webm thumb wasn't being shown; DATE:2014-01-25
fxt.Test_parse_page_wiki_str
- ( "[[File:A.webm|thumb|400px|a|alt=b]]", String_.Concat_lines_nl_skip_last
+ ( "[[File:A.webm|thumb|320px|a|alt=b]]", String_.Concat_lines_nl_skip_last
( "
"
, "
" // NOTE:220px is default w for "non-found" thumb; DATE:2014-09-24
, "
"
, "
"
, "
a"
@@ -99,6 +137,6 @@ public class Xoh_file_wtr__video__tst {
, "
"
, "
"
, ""
- ));
+ ));
}
}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java
index 56c96903f..3af127be4 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_text_fmtr.java
@@ -19,27 +19,27 @@ package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*
import gplx.core.brys.*; import gplx.core.brys.fmtrs.*;
import gplx.xowa.parsers.*;
import gplx.xowa.htmls.core.htmls.*;
-public class Xoh_lnki_text_fmtr implements gplx.core.brys.Bfr_arg { // formats alt or caption
- private final Bry_bfr_mkr bfr_mkr; private final Xoh_html_wtr html_wtr;
- private Xop_ctx ctx; private Xoh_wtr_ctx hctx; private byte[] src; private Xop_tkn_itm text_tkn; private Bry_fmtr fmtr;
- private boolean called_by_alt_as_caption;
- public Xoh_lnki_text_fmtr(Bry_bfr_mkr bfr_mkr, Xoh_html_wtr html_wtr) {this.bfr_mkr = bfr_mkr; this.html_wtr = html_wtr;}
- public Xoh_lnki_text_fmtr Set(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_itm text_tkn, Bry_fmtr fmtr, boolean called_by_alt_as_caption) {
- this.ctx = ctx; this.hctx = hctx; this.src = src; this.text_tkn = text_tkn; this.fmtr = fmtr; this.called_by_alt_as_caption = called_by_alt_as_caption;
- return this;
+public class Xoh_lnki_text_fmtr { // formats alt or caption
+ private final Bry_bfr_mkr bfr_mkr; private final Xoh_html_wtr html_wtr;
+ private final Bry_bfr fmt_bfr = Bry_bfr_.Reset(32);
+ public Xoh_lnki_text_fmtr(Bry_bfr_mkr bfr_mkr, Xoh_html_wtr html_wtr) {
+ this.bfr_mkr = bfr_mkr; this.html_wtr = html_wtr;
}
- public void Bfr_arg__add(Bry_bfr bfr) {
- Bry_bfr tmp_bfr = bfr_mkr.Get_k004();
- html_wtr.Write_tkn_to_html(tmp_bfr, ctx, hctx, src, null, Xoh_html_wtr.Sub_idx_null, text_tkn);
- tmp_bfr.Mkr_rls();
- byte[] bry = called_by_alt_as_caption
- ? tmp_bfr.To_bry_and_clear_and_trim() // NOTE: Trim to handle ws-only alt; EX:[[File:A.png|thumb|alt= ]]; en.w:Bird; DATE:2015-12-28
- : tmp_bfr.To_bry();
- if (bry.length == 0) return;
- if (fmtr == Null_fmtr)
- bfr.Add(bry);
- else
- fmtr.Bld_bfr_many(bfr, bry);
+
+ public byte[] To_bry(Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Xop_tkn_itm text_tkn, boolean called_by_alt_as_caption, Bry_fmt fmt) {
+ // write lnki_text using tkn and html_wtr
+ Bry_bfr html_bfr = bfr_mkr.Get_k004(); // NOTE: do not make bfr member-variable; possible for captions to be nested, especially during call to Write_tkn_to_html
+ html_wtr.Write_tkn_to_html(html_bfr, ctx, hctx, src, null, Xoh_html_wtr.Sub_idx_null, text_tkn);
+ byte[] rv = called_by_alt_as_caption
+ ? html_bfr.To_bry_and_clear_and_trim() // NOTE: Trim to handle ws-only alt; EX:[[File:A.png|thumb|alt= ]]; en.w:Bird; DATE:2015-12-28
+ : html_bfr.To_bry_and_clear();
+ html_bfr.Mkr_rls();
+ if (rv.length == 0) return Bry_.Empty; // NOTE: if no text, exit now; else, empty text will generate empty thumb div
+
+ // return value; fmt if necessary
+ return fmt == Null__fmt
+ ? rv
+ : fmt.Bld_many_to_bry(fmt_bfr, rv);
}
- public static final Bry_fmtr Null_fmtr = null;
+ public static final Bry_fmt Null__fmt = null;
}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr.java
similarity index 68%
rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java
rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr.java
index 7ebcc1462..e4bf7be35 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr.java
@@ -16,26 +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.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*;
-import gplx.langs.htmls.*;
-import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*;
-public class Xoh_lnki_title_fmtr implements gplx.core.brys.Bfr_arg {
- public Xoh_lnki_title_fmtr Set(byte[] src, Xop_tkn_itm tkn) {this.src = src; this.tkn = tkn; return this;}
- public void Bfr_arg__add(Bry_bfr bfr) {
- Bld_recurse(bfr, tkn);
- }
- public void Bld_recurse(Bry_bfr bfr, Xop_tkn_itm tkn) {
- switch (tkn.Tkn_tid()) {
- case Xop_tkn_itm_.Tid_newLine: case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_txt: // leaf tkns which will have no subs
+import gplx.langs.htmls.entitys.*;
+import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.xtns.cites.*;
+public class Xoh_lnki_title_bldr {
+ public static void Add(Bry_bfr bfr, byte[] src, Xop_tkn_itm tkn) {Add_recurse(bfr, src, tkn);}
+ private static void Add_recurse(Bry_bfr bfr, byte[] src, Xop_tkn_itm tkn) {
+ switch (tkn.Tkn_tid()) {
+ case Xop_tkn_itm_.Tid_newLine: case Xop_tkn_itm_.Tid_space: case Xop_tkn_itm_.Tid_txt: // leaf tkns have no subs
Write_atr_text(bfr, src, tkn.Src_bgn(), tkn.Src_end());
- break;
- case Xop_tkn_itm_.Tid_arg_nde: // caption tkns have no subs; just a key and a val; recurse val
- Arg_nde_tkn arg_nde = (Arg_nde_tkn)tkn;
- Bld_recurse(bfr, arg_nde.Val_tkn());
+ break;
+ case Xop_tkn_itm_.Tid_arg_nde: // caption tkns have no subs; just a key and a val; recurse val
+ Add_recurse(bfr, src, ((Arg_nde_tkn)tkn).Val_tkn());
break;
case Xop_tkn_itm_.Tid_lnki:
Xop_lnki_tkn tkn_as_lnki = (Xop_lnki_tkn)tkn;
if (tkn_as_lnki.Caption_exists())
- Bld_recurse(bfr, tkn_as_lnki.Caption_tkn());
+ Add_recurse(bfr, src, tkn_as_lnki.Caption_tkn());
else {
if (tkn_as_lnki.Ttl() != null) { // guard against invalid ttls
byte[] ttl_bry = tkn_as_lnki.Ttl().Page_txt();
@@ -44,24 +40,22 @@ public class Xoh_lnki_title_fmtr implements gplx.core.brys.Bfr_arg {
}
if (tkn_as_lnki.Tail_bgn() != -1)
bfr.Add_mid(src, tkn_as_lnki.Tail_bgn(), tkn_as_lnki.Tail_end());
- break;
- default: // all other tkns, just iterate over subs for txt tkns
+ break;
+ default: // all other tkns, just iterate over subs for txt tkns
if (tkn.Tkn_tid() == Xop_tkn_itm_.Tid_xnde) {
Xop_xnde_tkn xnde = (Xop_xnde_tkn)tkn;
if (xnde.Tag().Id() == Xop_xnde_tag_.Tid__ref) { // if ref, disable tkn
- gplx.xowa.xtns.cites.Ref_nde ref_xnde = (gplx.xowa.xtns.cites.Ref_nde)xnde.Xnde_xtn();
+ Ref_nde ref_xnde = (Ref_nde)xnde.Xnde_xtn();
ref_xnde.Exists_in_lnki_title_(true); // ref found during html_title_wkr's generation; mark ref; will be ignored by references_html_wtr later; DATE:2014-03-05
}
}
int len = tkn.Subs_len();
- for (int i = 0; i < len; i++) {
- Xop_tkn_itm sub = tkn.Subs_get(i);
- Bld_recurse(bfr, sub);
- }
+ for (int i = 0; i < len; i++)
+ Add_recurse(bfr, src, tkn.Subs_get(i));
break;
}
}
- public static void Write_atr_text(Bry_bfr bfr, byte[] src, int bgn, int end) {
+ private static void Write_atr_text(Bry_bfr bfr, byte[] src, int bgn, int end) {
for (int i = bgn; i < end; i++) {
byte b = src[i];
switch (b) {
@@ -76,6 +70,4 @@ public class Xoh_lnki_title_fmtr implements gplx.core.brys.Bfr_arg {
}
}
}
- byte[] src; Xop_tkn_itm tkn;
- public static final byte[] Escape_bgn = Bry_.new_a7("");
}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr_tst.java
similarity index 66%
rename from 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java
rename to 400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr_tst.java
index f479b3fd4..d40d3104e 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_fmtr_tst.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_lnki_title_bldr_tst.java
@@ -17,29 +17,27 @@ along with this program. If not, see
.
*/
package gplx.xowa.htmls.core.wkrs.lnkis.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*; import gplx.xowa.htmls.core.wkrs.lnkis.*;
import org.junit.*; import gplx.xowa.parsers.*;
-public class Xoh_lnki_title_fmtr_tst {
- @Before public void init() {fxt.Clear();} private Xoh_lnki_title_fmtr_fxt fxt = new Xoh_lnki_title_fmtr_fxt();
+public class Xoh_lnki_title_bldr_tst {
+ private final Xoh_lnki_title_bldr_fxt fxt = new Xoh_lnki_title_bldr_fxt();
@Test public void Basic() {
- fxt.Test_parse("a b c", "a b c");
- fxt.Test_parse("a ''b'' c", "a b c");
- fxt.Test_parse("a
b c", "a b c");
- fxt.Test_parse("a\nb", "a b");
- fxt.Test_parse("a\"b", "a"b");
+ fxt.Test__parse("a b c", "a b c");
+ fxt.Test__parse("a ''b'' c", "a b c");
+ fxt.Test__parse("a
b c", "a b c");
+ fxt.Test__parse("a\nb", "a b");
+ fxt.Test__parse("a\"b", "a"b");
}
@Test public void Lnki__quotes() { // PURPOSE: handle titles with quotes; PAGE:s.w:Styx_(band) DATE:2015-11-29
- fxt.Test_parse("[[A\"B]]", "A"B");
+ fxt.Test__parse("[[A\"B]]", "A"B");
}
}
-class Xoh_lnki_title_fmtr_fxt {
+class Xoh_lnki_title_bldr_fxt {
private final Xop_fxt fxt = new Xop_fxt();
- Bry_bfr bfr = Bry_bfr_.New();
- Xoh_lnki_title_fmtr title_wkr = new Xoh_lnki_title_fmtr();
- public Xoh_lnki_title_fmtr_fxt Clear() {return this;}
- public void Test_parse(String raw, String expd) {
+ private final Bry_bfr bfr = Bry_bfr_.New();
+ public void Test__parse(String raw, String expd) {
byte[] raw_bry = Bry_.new_u8(raw);
Xop_root_tkn root = fxt.Ctx().Tkn_mkr().Root(raw_bry);
fxt.Parser().Parse_page_all_clear(root, fxt.Ctx(), fxt.Ctx().Tkn_mkr(), raw_bry);
- title_wkr.Set(raw_bry, root).Bld_recurse(bfr, root);
+ Xoh_lnki_title_bldr.Add(bfr, raw_bry, root);
Tfds.Eq(expd, bfr.To_str_and_clear());
}
}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java
index db2d042f8..540a0bb47 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/tags/Xoh_tag_parser.java
@@ -76,6 +76,7 @@ public class Xoh_tag_parser implements Gfh_doc_wkr {
if (wkr__thm.Parse1(hdoc_wkr, hctx, src, tag_rdr, cur)) return wkr__thm.Src_end();
}
else if (cur.Atrs__cls_has(Xoh_thm_data.Atr__id__xowa_media_div))
+ // rv = Parse_by_data(hdoc_wkr, hctx, tag_rdr, src, cur, null, Xoh_hzip_dict_.Tid__media);
rv = Parse_by_data(hdoc_wkr, hctx, tag_rdr, src, cur, null, Xoh_hzip_dict_.Tid__img);
else if (cur.Atrs__cls_has(Xoh_toc_wtr.Atr__class__toc))
rv = Parse_by_data(hdoc_wkr, hctx, tag_rdr, src, cur, null, Xoh_hzip_dict_.Tid__toc);
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java
index cd9a5df23..db1f2be8c 100644
--- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_html_tst.java
@@ -18,7 +18,7 @@ along with this program. If not, see
.
package gplx.xowa.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
import org.junit.*; import gplx.xowa.htmls.core.makes.tests.*;
public class Xoh_thm_html_tst {
- private final Xoh_make_fxt fxt = new Xoh_make_fxt();
+ private final Xoh_make_fxt fxt = new Xoh_make_fxt();
@Test public void Image() {
fxt.Test__html("[[File:A.png|thumb|test_caption]]", String_.Concat_lines_nl_skip_last
( "
"
@@ -36,7 +36,7 @@ public class Xoh_thm_html_tst {
( "
"
, "
"
, "
"
, "
"
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__avo__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__avo__tst.java
new file mode 100644
index 000000000..9990bb551
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__avo__tst.java
@@ -0,0 +1,66 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see
.
+*/
+package gplx.xowa.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
+import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*;
+import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*;
+public class Xoh_thm_hzip__avo__tst {
+ private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
+ @Before public void setup() {fxt.Clear();}
+ @Test public void Video() {
+ fxt.Test__bicode("~&%test_caption~|E9eA.ogv~%A.ogv~~", Gfh_utl.Replace_apos(String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "
"
+ , "
"
+ , "test_caption
"
+ , "
"
+ , "
"
+ )));
+ }
+ @Test public void Audio() {
+ fxt.Test__bicode(Gfh_utl.Replace_apos(String_.Concat_lines_nl
+ ( "
"
+ , "
"
+ , "
"
+ , "
"
+ , "
~$|%%,)~A.oga~Enlarge~
b"
+ , "
"
+ , "
"
+ , "
"
+ )), String_.Concat_lines_nl_skip_last
+ ( "
"
+ ));
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__basic__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__basic__tst.java
new file mode 100644
index 000000000..c33b7469a
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__basic__tst.java
@@ -0,0 +1,109 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see
.
+*/
+package gplx.xowa.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
+import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*;
+import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*;
+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() {
+ fxt.Test__bicode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
![abc]()
"
+ , "
"
+ , "
"
+ , "
abc
"
+ , "
"
+ , "
"
+ ));
+ }
+ @Test public void Capt_is_missing() { // [[File:A.png|thumb]]
+ fxt.Test__bicode("~~!%A.png~)#S~", String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
![]()
"
+ , "
"
+ , "
"
+ , "
"
+ ));
+ }
+ @Test public void Fix__omitted_table_tail() { // PURPOSE.hdiff: handle omitted ; PAGE:en.w:Alphabet; DATE:2016-01-06
+ fxt.Test__bicode(String_.Concat_lines_nl_skip_last
+ ( "~&]&D~"
+ , "
"
+ , ""
+ , ""
+ , "abc"
+ , " | "
+ , "
"
+ , "
"
+ , "~!5A.png~-&D"
+ ), String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
![]()
"
+ , "
"
+ , "
"
+ , ""
+ , ""
+ , "abc"
+ , " | "
+ , "
"
+ , "
"
+ , "
"
+ , "
"
+ ));
+ }
+ @Test public void Div_width_uses_img_width() {
+ Xof_fsdb_itm itm = new Xof_fsdb_itm();
+ itm.Init_at_lnki(Xof_exec_tid.Tid_wiki_page, Bry_.new_a7("en.w"), Bry_.new_a7("A.png"), Xop_lnki_type.Id_null, -1, 220, -1, -1, -1, 0);
+ itm.Init_at_cache(true, 400, 440, Io_url_.mem_fil_("mem/A.png"));
+ Xou_cache_finder_mem finder = fxt.Init_file_mgr__mem();
+ finder.Add(itm);
+
+ fxt.Test__decode("~&3abc~abc~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "

"
+ , "
"
+ , "
"
+ , "
abc
"
+ , "
"
+ , "
"
+ ));
+
+ fxt.Init_file_mgr__noop();
+ }
+// @Test public void Dump() {
+// Xowe_wiki en_d = fxt.Init_wiki_alias("wikt", "en.wiktionary.org");
+// gplx.xowa.wikis.nss.Xow_ns_mgr ns_mgr = en_d.Ns_mgr();
+// ns_mgr.Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all);
+//
+// fxt.Wiki().Ns_mgr().Aliases_add(gplx.xowa.wikis.nss.Xow_ns_.Tid__portal, "WP");
+// fxt.Wiki().Ns_mgr().Init();
+//
+// fxt.Init_mode_is_b256_(Bool_.N);
+// fxt.Exec_write_to_fsys(Io_url_.new_dir_("C:\\xowa\\debug\\html\\"), "hzip.html");
+// fxt.Init_mode_is_b256_(Bool_.N);
+// }
+}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__pseudo__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__pseudo__tst.java
new file mode 100644
index 000000000..bc6e5a8d0
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__pseudo__tst.java
@@ -0,0 +1,143 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see
.
+*/
+package gplx.xowa.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
+import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*;
+import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*;
+public class Xoh_thm_hzip__pseudo__tst {
+ private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
+ @Before public void setup() {fxt.Clear();}
+ @Test public void Fake__div_1__next_nde() { // PURPOSE: handle fake-thumbs with pseudo thumbimage class; PAGE:s.w:Mars
+ fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "
~%-eA.jpg~Image~)#?A.jpg~abc~
"
+ , "
abc
"
+ , "
"
+ , "
"
+ , "
"
+ ), "'", "\""), String_.Concat_lines_nl_skip_last
+ ( "
"
+ ));
+ }
+ @Test public void Fake__div_1__style() { // PURPOSE.hdiff: handle fake-thumbs with bad style; PAGE:en.w:Carlisle_United_F.C.
+ fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "~%-eA.jpg~Image~)#?A.jpg~abc~
"
+ , "
"
+ , "
~${#7)A.jpg~
"
+ , "abc"
+ , "
"
+ , "
"
+ , "
"
+ ), "'", "\""), String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "
![abc]()
"
+ , "
"
+ , "
"
+ , "
"
+ ));
+ }
+ @Test public void Fake__div_1__width_w_space() { // PURPOSE.hdiff: handle fake-thumbs with style of "width "; PAGE:en.w:Abraham_Lincoln
+ fxt.Test__bicode(String_.Replace(String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "~%-eA.jpg~Image~)#?A.jpg~abc~
"
+ , "
"
+ , "
~${#7)A.jpg~
"
+ , "abc"
+ , "
"
+ , "
"
+ , "
"
+ ), "'", "\""), String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "
![abc]()
"
+ , "
"
+ , "
"
+ , "
"
+ ));
+ }
+ @Test public void Fake__div_1__thumbimage() { // PURPOSE.hdiff: handle fake-thumbs with image-map style; PAGE:en.w:UK
+ String html = String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "
"
+ , ""
+ , ""
+ , "
"
+ , "
def
"
+ , "
"
+ , "
"
+ );
+ fxt.Test__bicode(String_.Replace(String_.Format(html, "
~%!!A.svg~)#q~
"), "'", "\""), String_.Format(html, "
"));
+ }
+ @Test public void Fake__div_1__extra_attribs() {// PURPOSE.hdiff: handle fake thumbs with extra attribs; PAGE:en.w:Wikipedia:New_CSS_framework; DATE:2016-01-11
+ String html = String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
{0}" // "color:blue;" is invalid attribs
+ , "
abc"
+ , "abc
"
+ , "
"
+ , "
"
+ );
+ fxt.Test__bicode(String_.Replace(String_.Format(html, "~%!!A.png~)#g~"), "'", "\""), String_.Format(html, "
![]()
"));
+ }
+ @Test public void Fake__div_2__not_media() { // PURPOSE.hdiff: handle fake-thumbs created through en.w:Template:Image_label_begin; PAGE:en.w:Blackburnshire; DATE:2016-01-04
+ String html = String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
"
+ , "
"
+ , "{0}"
+ , "
abc"
+ , "
"
+ , "
"
+ , "
"
+ , "{1}"
+ , "bcd
"
+ , "
"
+ , "
"
+ );
+ fxt.Test__bicode(String_.Replace(String_.Format(html, "
~%!!A.png~)#g~
", "
~$a)A.png~
"), "'", "\""), String_.Format(html, "
", "
"));
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__tidy__tst.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__tidy__tst.java
new file mode 100644
index 000000000..ae904a8e1
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/thms/Xoh_thm_hzip__tidy__tst.java
@@ -0,0 +1,93 @@
+/*
+XOWA: the XOWA Offline Wiki Application
+Copyright (C) 2012 gnosygnu@gmail.com
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see
.
+*/
+package gplx.xowa.htmls.core.wkrs.thms; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.*; import gplx.xowa.htmls.core.wkrs.*;
+import org.junit.*; import gplx.langs.htmls.*; import gplx.xowa.htmls.core.hzips.*;
+import gplx.xowa.files.*; import gplx.xowa.files.caches.*; import gplx.xowa.parsers.lnkis.*;
+public class Xoh_thm_hzip__tidy__tst {
+ private final Xoh_hzip_fxt fxt = new Xoh_hzip_fxt().Init_mode_diff_y_();
+ @Before public void setup() {fxt.Clear();}
+ @Test public void Tidy__moved_capt() {
+ fxt.Test__bicode("~&S~abc\n~!uA.png~)#Sabc~", String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
![abc]()
"
+ , "
abc"
+ , "
"
+ , "
"
+ ));
+ }
+ @Test public void Tidy__extra_closing_div() {// handle extra closing div in caption; PAGE:en.w:Damask; DATE:2016-01-05
+ fxt.Test__bicode(String_.Concat_lines_nl_skip_last
+ ( "~&U
A
"
+ , "B~"
+ , "C~!1A.png~-\"b"), String_.Concat_lines_nl_skip_last
+ ( "
"
+ , "
![]()
"
+ , "
"
+ , "C
"
+ , "
"
+ ));
+ }
+ @Test public void Tidy__ul() { // tidy will move
on to different lines depending on