/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0.
You may use XOWA according to either of these licenses as is most appropriate
for your project on a case-by-case basis.
The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/
package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.core.brys.fmtrs.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.lnkis.*;
import gplx.langs.htmls.*; import gplx.xowa.htmls.core.htmls.*; import gplx.xowa.parsers.htmls.*;
import gplx.xowa.files.*;
public class Gallery_mgr_wtr {
public static void Write_mgr(Bry_bfr bfr, Gallery_mgr_base mgr, Xowe_wiki wiki, Xoae_page page, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src, Gallery_xnde xnde) {
// init
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
boolean hctx_is_hdump = hctx.Mode_is_hdump();
int itm_default_w = mgr.Itm_default_w();
int itms_per_row = mgr.Itms_per_row();
// write <ul> lhs
int ul_uid = page.Html_data().Xtn_gallery_next_id();
byte[] ul_id = tmp_bfr.Add(Gallery_mgr_wtr_.Id__ul).Add_int_variable(ul_uid).To_bry_and_clear();
byte[] ul_style = xnde.Atr_style();
if (itms_per_row > 0) { // "perrow" specified; add "_maxwidth" to div1 style
int max_width = itms_per_row * (itm_default_w + mgr.Get_all_padding());
ul_style = Fmt_and_add(tmp_bfr, Gallery_mgr_wtr_.Fmtr__ul__style, ul_style, max_width);
}
byte[] ul_cls = Fmt_and_add(tmp_bfr, Gallery_mgr_wtr_.Fmtr__ul__cls, xnde.Atr_cls(), Gallery_mgr_base_.To_bry(mgr.Tid()));
Write_ul_lhs(bfr, tmp_bfr, hctx_is_hdump, wiki.Html_mgr().Whitelist_mgr(), src, xnde, ul_id, ul_cls, ul_style, xnde.Atrs_other());
// write gallery_caption; EX: <li class='gallerycaption'>caption</li>
byte[] mgr_caption = xnde.Mgr_caption();
if (Bry_.Len_gt_0(mgr_caption)) Gallery_mgr_wtr_.Fmtr__mgr_caption.Bld_bfr_many(bfr, mgr_caption);
// write <li> items
Xoae_app app = wiki.Appe(); 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_itm(bfr, tmp_bfr, app, wiki, page, ctx, html_wtr, hctx, src, mgr, xnde, i, null);
bfr.Add_byte_nl().Add(Gfh_tag_.Ul_rhs); // "\n</ul>"
tmp_bfr.Mkr_rls();
}
public static void Write_itm(Bry_bfr bfr, Bry_bfr tmp_bfr, Xoae_app app, Xowe_wiki wiki, Xoae_page page, Xop_ctx ctx, Xoh_html_wtr html_wtr, Xoh_wtr_ctx hctx
, byte[] src, Gallery_mgr_base mgr, Gallery_xnde xnde, int i, Xof_file_itm xfer_itm) {
boolean hctx_is_hdump = hctx.Mode_is_hdump();
// get itm ttl / caption
Gallery_itm itm = (Gallery_itm)xnde.Itms_get_at(i);
Xoa_ttl itm_ttl = itm.Ttl(); if (Bry_.Len_eq_0(itm_ttl.Page_db())) return; // if file ttl is invalid, do not write; EX:File:#A.png; DATE:2016-01-12
byte[] itm_caption = itm.Caption_bry(); if (itm_caption == null) itm_caption = Bry_.Empty;
// get lnki, xfer, html_w_expand, html_h_expand
Xop_lnki_tkn lnki = itm.Lnki_tkn();
int lnki_w_orig = lnki.W(), lnki_h_orig = lnki.H(); // capture orig lnki_w / lnki_h for later
mgr.Get_thumb_size(lnki, itm.Ext()); // noop if traditional; expand by 1.5 if packed
if (xfer_itm == null) { // will be null on 1st pass
xfer_itm = html_wtr.Lnki_wtr().File_wtr().Lnki_eval(Xof_exec_tid.Tid_wiki_page, ctx, page, lnki);
xfer_itm.Html_gallery_mgr_h_(xnde.Itm_h_actl());
xfer_itm.Html_elem_tid_(Xof_html_elem.Tid_gallery_v2);
}
int html_w_expand = xfer_itm.Html_w();
int html_h_expand = xfer_itm.Html_h();
// get id
int img_uid = xfer_itm.Html_uid();
byte[] li_id = Gallery_mgr_wtr_.Bld_id(tmp_bfr, Gallery_mgr_wtr_.Id__li, img_uid);
byte[] li_id_atr = Gallery_mgr_wtr_.Bld_id_atr(tmp_bfr, hctx_is_hdump, li_id);
// get file_found
boolean file_found = xfer_itm.File_exists();
if (File_found_mode != Bool_.__byte) file_found = File_found_mode == Bool_.Y_byte; // TEST: override File_found
// make itm_html; 1st clause is for "missing" itms; 2nd clause is for "found" itms
byte[] itm_html = Bry_.Empty;
int div_2_w = -1, div_3_margin = -1;
if ( !hctx_is_hdump // not hdump; hdump should always write img regardless of whether or not img is missing; DATE:2015-04-27
&& ( !itm_ttl.Ns().Id_is_file() // not a file
|| !file_found // file is missing
)
) { // write text
itm_html = Gallery_mgr_wtr_.Fmtr__div1__missing.Bld_bry_many(tmp_bfr, mgr.Get_thumb_padding() + mgr.Itm_default_h(), itm_ttl.Page_txt());
itm.Html_prepare(wiki, ctx, src, xnde, xfer_itm, li_id, i);
xfer_itm.Html_img_wkr_(itm);
lnki.W_(lnki_w_orig).H_(lnki_h_orig);
html_w_expand = lnki_w_orig; // reset lnki_w_orig / lnki_h_orig else large captions
html_h_expand = lnki_h_orig;
}
else {
// get alt
byte[] alt = itm.Alt_bgn() == Bry_find_.Not_found && Bry_.Len_eq_0(itm_caption) // if ( $alt == '' && $text == '' ) $imageParameters['alt'] = $nt->getText();
? itm.Ttl().Page_txt()
: Bry_.Mid(src, itm.Alt_bgn(), itm.Alt_end());
alt = Xoh_html_wtr_escaper.Escape(app.Parser_amp_mgr(), tmp_bfr, alt); // NOTE: need to handle situations wherein alt has quotes; EX:File:A"b.png; PAGE:en.w:Alexandria,_Romania DATE:2015-12-27
// get href_ttl
Xoa_ttl href_ttl = itm.Link_bgn() == Bry_find_.Not_found
? itm_ttl
: Xoa_ttl.Parse(wiki, Bry_.Mid(src, itm.Link_bgn(), itm.Link_end()));
if (href_ttl == null) href_ttl = itm_ttl; // occurs when link is invalid; EX: A.png|link=<invalid>
// get w, h
mgr.Adjust_image_parameters(xfer_itm); // noop if traditional; reduce by 1.5 if packed
int html_w_normal = xfer_itm.Html_w();
int html_h_normal = xfer_itm.Html_h();
xfer_itm.Init_at_gallery_bgn(html_w_normal, html_h_normal, html_w_expand);// NOTE: file_w should be set to expanded width so js can resize if gallery
// write div_2
div_2_w = mgr.Get_thumb_div_width(html_w_expand);
Gallery_mgr_wtr_.Fmtr__div1__img.Bld_bfr_many(tmp_bfr, div_2_w);
// write div_3
div_3_margin = mgr.Get_vpad(mgr.Itm_default_h(), html_h_expand);
Gallery_mgr_wtr_.Fmtr__div1__vpad.Bld_bfr_many(tmp_bfr, new Gallery_img_pad_fmtr_arg(div_3_margin)); // <div style="margin:~{vpad}px auto;">
// write <img>
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.To_bry_and_clear();
}
// write <li>
int div_1_w = mgr.Get_gb_width(html_w_expand, html_h_expand);
Gallery_mgr_wtr_.Fmtr__li__lhs.Bld_bfr_many(bfr, li_id_atr, new Gallery_box_w_fmtr_arg(div_1_w));
bfr.Add(itm_html);
// get show_filenames_link
byte[] show_filenames_link = Bry_.Empty;
if (xnde.Show_filename()) {
wiki.Html_mgr().Html_wtr().Lnki_wtr().Write_plain_by_bry
( tmp_bfr, src, lnki
, Bry_.Limit(itm_ttl.Page_txt(), 25) // 25 is defined by captionLength in DefaultSettings.php
); // MW:passes know,noclasses which isn't relevant to XO
}
// write caption
wiki.Parser_mgr().Main().Parse_text_to_html(tmp_bfr, ctx, page, hctx, true, itm_caption);
itm_caption = tmp_bfr.To_bry_and_clear();
itm_caption = tmp_bfr.Add(show_filenames_link).Add(itm_caption).To_bry_and_clear();
mgr.Wrap_gallery_text(bfr, itm_caption, html_w_expand, html_h_expand);
bfr.Add(itm_li_end_bry);
}
public static byte File_found_mode = Bool_.__byte;
private static byte[] Fmt_and_add(Bry_bfr tmp_bfr, Bry_fmtr fmtr, byte[] trailer, Object... fmtr_args) {
fmtr.Bld_bfr_many(tmp_bfr, fmtr_args);
if (Bry_.Len_gt_0(trailer)) {
tmp_bfr.Add_byte_space();
tmp_bfr.Add(trailer);
}
return tmp_bfr.To_bry_and_clear();
}
private static void Write_ul_lhs(Bry_bfr bfr, Bry_bfr tmp_bfr, boolean hctx_is_hdump, Xop_xatr_whitelist_mgr whitelist_mgr, byte[] src, Gallery_xnde xnde, byte[] ul_id, byte[] ul_cls, byte[] ul_style, List_adp xatr_list) {
bfr.Add_byte(Byte_ascii.Lt).Add(Gfh_tag_.Bry__ul);
if (hctx_is_hdump) { // if hdump, write extra data;
tmp_bfr.Add_int_variable(xnde.Itm_w_orig()).Add_byte_pipe();
tmp_bfr.Add_int_variable(xnde.Itm_h_orig()).Add_byte_pipe();
tmp_bfr.Add_int_variable(xnde.Itms_per_row());
Gfh_wtr.Write_atr_bry(bfr, Bry__data_xogly, tmp_bfr.To_bry_and_clear());
}
else // not hdump; write id attribute
Gfh_wtr.Write_atr_bry(bfr, Gfh_atr_.Bry__id, ul_id);
Gfh_wtr.Write_atr_bry(bfr, Gfh_atr_.Bry__class, ul_cls);
Gfh_wtr.Write_atr_bry(bfr, Gfh_atr_.Bry__style, ul_style);
if (xatr_list != null) {
int len = xatr_list.Count();
for (int i = 0; i < len; i++) {
Mwh_atr_itm xatr = (Mwh_atr_itm)xatr_list.Get_at(i);
if (!whitelist_mgr.Chk(Xop_xnde_tag_.Tid__ul, src, xatr)) continue;
byte[] key = xatr.Key_bry();
byte[] val = xatr.Val_as_bry();
Gfh_wtr.Write_atr_bry(bfr, key, val);
}
}
bfr.Add_byte(Byte_ascii.Gt);
}
private static final byte[]
itm_li_end_bry = Bry_.new_a7 ( "\n </div>"
+ "\n </li>")
, itm_divs_end_bry = Bry_.new_a7 ( "\n </div>\n </div>");
public static final byte[] Bry__data_xogly = Bry_.new_a7 ("data-xogly");
}