Pagebanner: Disable toc if pagebanner html exists; also, sync PageBanner css [#610]

pull/620/head
gnosygnu 5 years ago
parent 8653e665cc
commit 9483b56121

@ -19,8 +19,8 @@ import gplx.xowa.apps.cfgs.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.msgs.*;
import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.apos.*; import gplx.xowa.parsers.hdrs.*; import gplx.xowa.parsers.lists.*; import gplx.xowa.parsers.paras.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.parsers.miscs.*; import gplx.xowa.parsers.tblws.*; import gplx.xowa.parsers.lnkes.*; import gplx.xowa.parsers.lnkis.*;
import gplx.xowa.files.exts.*; import gplx.xowa.files.repos.*;
import gplx.xowa.wikis.nss.*;
import gplx.xowa.files.exts.*; import gplx.xowa.files.repos.*; import gplx.xowa.htmls.core.wkrs.lnkis.htmls.*;
import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.domains.*;
import gplx.xowa.wikis.tdbs.hives.*;
import gplx.xowa.wikis.pages.*;
public class Xop_fxt {
@ -170,6 +170,16 @@ public class Xop_fxt {
rv.Find_tkn_(tkn_arg_itm_(find));
return rv;
}
public void Init__file_find_mgr() {
Xowe_wiki commons_wiki = this.app.Wiki_mgr().Get_by_or_make(Xow_domain_itm_.Bry__commons);
Xof_repo_itm repo_itm = app.File_mgr().Repo_mgr().Get_at(0);
commons_wiki.Html_mgr().Html_wtr().Lnki_wtr().File_wtr().Find_file_mgr_(new Xow_find_file_mgr(repo_itm, commons_wiki.Domain_str()));
this.wiki.Html_mgr().Html_wtr().Lnki_wtr().File_wtr().Find_file_mgr_(new Xow_find_file_mgr(repo_itm, this.wiki.Domain_str()));
}
public void Init__orig(boolean wiki_is_commons, String orig_ttl, int orig_w, int orig_h) {
Xowe_wiki orig_wiki = wiki_is_commons ? (Xowe_wiki)this.wiki : (Xowe_wiki)app.Wiki_mgr().Get_by_or_null(gplx.xowa.wikis.domains.Xow_domain_itm_.Bry__commons);
orig_wiki.Html_mgr().Html_wtr().Lnki_wtr().File_wtr().Find_file_mgr().Init_file(orig_ttl, orig_w, orig_h);
}
public void Init__msg(String key, String val) {
Xol_msg_itm msg_itm = wiki.Msg_mgr().Get_or_make(Bry_.new_u8(key));
msg_itm.Atrs_set(Bry_.new_u8(val), false, false);

@ -27,6 +27,7 @@ public class Xoh_file_mgr {
this.wiki = wiki; this.file_wtr = new Xoh_file_wtr__basic(wiki, html_mgr, html_wtr);
}
public Xoh_file_wtr__basic File_wtr() {return file_wtr;} private final Xoh_file_wtr__basic file_wtr;
public Xow_find_file_mgr Find_file_mgr() {return find_file_mgr;} public void Find_file_mgr_(Xow_find_file_mgr v) {this.find_file_mgr = v;} private Xow_find_file_mgr find_file_mgr;
public void Init_by_wiki(Xowe_wiki wiki) {
file_wtr.Init_by_wiki(wiki);
}
@ -76,8 +77,14 @@ public class Xoh_file_mgr {
return false;
if (source_wiki.File_mgr().Version() == Xow_file_mgr.Version_2)
return ctx.App().User().User_db_mgr().File__xfer_itm_finder().Find(source_wiki, xfer.Lnki_exec_tid(), xfer, ctx.Page().Url_bry_safe());
else
else {
if (find_file_mgr != null) {
boolean rv = find_file_mgr.Find_file(xfer);
if (rv)
return rv;
}
return source_wiki.File_mgr().Find_meta(xfer);
}
}
private static boolean File_queue_add(Xowe_wiki wiki, Xof_xfer_itm xfer, boolean lnki_is_media_ns, boolean found) {
if (!wiki.File_mgr().Cfg_download().Enabled()) return false;

@ -0,0 +1,58 @@
/*
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.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.xowa.wikis.domains.*;
import gplx.xowa.files.*; import gplx.xowa.files.repos.*;
import gplx.xowa.htmls.core.wkrs.imgs.atrs.*;
public class Xow_find_file_mgr {
private final Xof_repo_itm repo_itm;
private final Xof_url_bldr url_bldr = new Xof_url_bldr();
private final byte[] wiki_domain;
private final Hash_adp_bry hash = Hash_adp_bry.cs();
public Xow_find_file_mgr(Xof_repo_itm repo_itm, String wiki_domain_str) {
this.repo_itm = repo_itm;
this.wiki_domain = Bry_.new_u8(wiki_domain_str);
}
public void Init_file(String orig_ttl_str, int orig_w, int orig_h) {this.Init_file(true, orig_ttl_str, orig_w, orig_h);}
public void Init_file(boolean repo_is_remote, String orig_ttl_str, int orig_w, int orig_h) {
byte orig_repo_id = repo_is_remote ? Xof_repo_tid_.Tid__remote : Xof_repo_tid_.Tid__local;
byte[] orig_repo_name = repo_is_remote ? Xow_domain_itm_.Bry__commons : wiki_domain;
byte[] orig_ttl_bry = Bry_.new_u8(orig_ttl_str);
Xof_ext orig_ext = Xof_ext_.new_by_ttl_(orig_ttl_bry);
byte[] orig_redirect = null;
this.Init_file(orig_repo_id, orig_repo_name, orig_ttl_bry, orig_ext, orig_w, orig_h, orig_redirect);
}
public void Init_file(byte orig_repo_id, byte[] orig_repo_name, byte[] orig_ttl_bry, Xof_ext orig_ext, int orig_w, int orig_h, byte[] orig_redirect) {
Xof_xfer_itm orig = new Xof_xfer_itm();
orig.Init_at_orig(orig_repo_id, orig_repo_name, orig_ttl_bry, orig_ext, orig_w, orig_h, orig_redirect);
hash.Add_bry_obj(orig_ttl_bry, orig);
}
public boolean Find_file(Xof_xfer_itm xfer) {
// find orig
Xof_xfer_itm orig = (Xof_xfer_itm)hash.Get_by_bry(xfer.Lnki_ttl());
// exit if not found
if (orig == null)
return false;
// orig found; calc xfer.html based on orig; note, this seems early to generate html, but need to generate a correct html_url as well as other props
Xof_img_size img_size = new Xof_img_size();
img_size.Html_size_calc(Xof_exec_tid.Tid_wiki_page, xfer.Lnki_w(), xfer.Lnki_h(), xfer.Lnki_type(), Xof_patch_upright_tid_.Tid_all, xfer.Lnki_upright(), orig.Orig_ext().Id(), orig.Orig_w(), orig.Orig_h(), Xof_img_size.Thumb_width_img);
xfer.Init_at_orig(orig.Orig_repo_id(), orig.Orig_repo_name(), orig.Orig_ttl(), orig.Orig_ext(), orig.Orig_w(), orig.Orig_h(), orig.Orig_redirect());
xfer.Init_at_html(Xof_exec_tid.Tid_wiki_page, img_size, repo_itm, url_bldr);
return true;
}
}

@ -18,6 +18,8 @@ import gplx.core.btries.*; import gplx.langs.mustaches.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.tmpls.*; import gplx.xowa.xtns.pfuncs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.parsers.utils.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*;
import gplx.xowa.files.*;
import gplx.xowa.htmls.core.htmls.*; import gplx.langs.htmls.encoders.*;
// REF.MW:https://github.com/wikimedia/mediawiki-extensions-WikidataPageBanner/blob/master/includes/WikidataPageBannerFunctions.php
// TODO.DATE:2019-11-11: calculate enableToc and hasPosition;
public class Pgbnr_func extends Pf_func_base {
@Override public int Id() {return Xol_kwd_grp_.Id_pagebanner;}
@Override public Pf_func New(int id, byte[] name) {return new Pgbnr_func().Name_(name);}
@ -130,8 +132,10 @@ public class Pgbnr_func extends Pf_func_base {
itm.Init_hdump(hctx.Mode_is_hdump());
banner_html = Get_banner_html(wiki, ctx, hctx, cfg, banner_ttl, itm);
}
if (banner_html != null)
if (banner_html != null) {
bfr.Add(banner_html);
wiki.Html_mgr().Html_wtr().Cfg().Toc__show_(false); // disable toc, else it will show twice (once in page banner; once in html); DATE:2019-11-11
}
}
public static byte[] Get_banner_html(Xowe_wiki wiki, Xop_ctx ctx, Xoh_wtr_ctx hctx, Pgbnr_cfg cfg, Xoa_ttl banner_ttl, Pgbnr_itm itm) {
byte[][] urls = Get_standard_size_urls(wiki, cfg, banner_ttl); if (urls == null) return null;
@ -144,8 +148,11 @@ public class Pgbnr_func extends Pf_func_base {
tmp_bfr.Add(urls[i]).Add_byte_space().Add_int_variable(size).Add_byte(Byte_ascii.Ltr_w); // REF.MW: $srcset[] = "$url {$size}w";
}
byte[] srcset = tmp_bfr.To_bry_and_clear();
byte[] banner_url = itm.banner_img_src != null ? itm.banner_img_src : urls.length == 0 ? Bry_.Empty : urls[urls_len - 1]; // gets largest url
int max_width = itm.banner_file_itm.Orig_w(); // $file = wfFindFile( banner_file ); $options['max_width'] = $file->getWidth();
byte[] banner_url = itm.banner_img_src != null ? itm.banner_img_src : urls.length == 0 ? Bry_.Empty : urls[urls_len - 1]; // gets largest url
Xof_file_itm banner_file_itm = itm.banner_file_itm;
int max_width = banner_file_itm.Orig_w(); // $file = wfFindFile( banner_file ); $options['max_width'] = $file->getWidth();
// Provide information to the logic-less template about whether it is a panorama or not.
boolean isPanorama = banner_file_itm.Orig_w() > (banner_file_itm.Orig_h() * 2);
byte[] banner_file = null; // $bannerfile->getLocalUrl();
byte[] toc_html = null;
@ -159,7 +166,7 @@ public class Pgbnr_func extends Pf_func_base {
ctx.Page().Html_data().Toc_mgr().To_html(tmp_bfr, Xoh_wtr_ctx.Basic, true);
toc_html = tmp_bfr.To_bry_and_clear();
}
itm.Init_from_html(max_width, banner_file, banner_url, srcset, cfg.enable_heading_override, toc_html);
itm.Init_from_html(max_width, banner_file, banner_url, srcset, cfg.enable_heading_override, toc_html, isPanorama);
Mustache_render_ctx mctx = new Mustache_render_ctx().Init(itm);
Mustache_bfr mbfr = Mustache_bfr.New_bfr(tmp_bfr);

@ -18,12 +18,14 @@ import org.junit.*; import gplx.core.brys.*; import gplx.xowa.wikis.pages.skins.
import gplx.xowa.htmls.core.htmls.*;
public class Pgbnr_func_tst {
private final Pgbnr_func_fxt fxt = new Pgbnr_func_fxt();
@Test public void Basic() {
@Before public void init() {fxt.Clear();}
@Test public void Basic() {
fxt.Init__orig(true, "A.png", 500, 200); // 500 > 200 * 2 for pageBanner;
fxt.Test__parse(Bool_.N, "{{PAGEBANNER:A.png|icon-star=Star_article}}", String_.Concat_lines_nl_apos_skip_last
( "<div class='ext-wpb-pagebanner noprint pre-content'>"
, " <div class='wpb-banner-image-panorama wpb-topbanner wpb-positioned-banner'>"
( "<div class='ext-wpb-pagebanner pre-content'>"
, " <div class='wpb-banner-image-panorama wpb-topbanner'>"
, " <h1 class='wpb-name'>Test page</h1>"
, " <a href='' class='image' title='Test page' xowa_title='A.png'><img id='xoimg_0' src='file:///mem/wiki/repo/trg/orig/7/0/A.png' width='0' height='0' class='wpb-banner-image ' alt='' srcset='' data-pos-x='0' data-pos-y='0' style='max-width:0px'></a>"
, " <a href='' class='image' title='Test page' xowa_title='A.png'><img id='xoimg_0' src='file:///mem/wiki/repo/src/orig/7/0/A.png' width='0' height='0' class='wpb-banner-image ' alt='' srcset='' data-pos-x='0' data-pos-y='0' style='max-width:500px'></a>"
, " <div class='wpb-iconbox'>"
, " <a href='/wiki/Star_article'><span aria-disabled='false' title='Star article' class='oo-ui-widget oo-ui-widget-enabled oo-ui-iconElement-icon oo-ui-icon-star oo-ui-iconElement oo-ui-iconWidget'></span></a>"
, " </div>"
@ -39,8 +41,8 @@ public class Pgbnr_func_tst {
}
@Test public void Hdump__basic() {
fxt.Test__parse(Bool_.Y, "{{PAGEBANNER:A.png|icon-star=Star_article}}", String_.Concat_lines_nl_apos_skip_last
( "<div class='ext-wpb-pagebanner noprint pre-content'>"
, " <div class='wpb-banner-image-panorama wpb-topbanner wpb-positioned-banner'>"
( "<div class='ext-wpb-pagebanner pre-content'>"
, " <div class='wpb-topbanner'>"
, " <h1 class='wpb-name'>Test page</h1>"
, " <a href='/wiki/File:A.png' class='image' title='Test page' xowa_title='A.png'><img data-xowa-title=\"A.png\" data-xoimg=\"1|-1|-1|-1|-1|-1\" src='' width='0' height='0' class='wpb-banner-image ' alt='' srcset='' data-pos-x='0' data-pos-y='0' style='max-width:0px'></a>"
, " <div class='wpb-iconbox'>"
@ -53,8 +55,8 @@ public class Pgbnr_func_tst {
}
@Test public void Hdump__quote() { // PAGE:en.v:Europe; DATE:2016-07-12
fxt.Test__parse(Bool_.Y, "{{PAGEBANNER:A\"b.png|icon-star=Star_article}}", String_.Concat_lines_nl_apos_skip_last
( "<div class='ext-wpb-pagebanner noprint pre-content'>"
, " <div class='wpb-banner-image-panorama wpb-topbanner wpb-positioned-banner'>"
( "<div class='ext-wpb-pagebanner pre-content'>"
, " <div class='wpb-topbanner'>"
, " <h1 class='wpb-name'>Test page</h1>"
, " <a href='/wiki/File:A%22b.png' class='image' title='Test page' xowa_title='A%22b.png'><img data-xowa-title=\"A%22b.png\" data-xoimg=\"1|-1|-1|-1|-1|-1\" src='' width='0' height='0' class='wpb-banner-image ' alt='' srcset='' data-pos-x='0' data-pos-y='0' style='max-width:0px'></a>"
, " <div class='wpb-iconbox'>"
@ -67,11 +69,15 @@ public class Pgbnr_func_tst {
}
}
class Pgbnr_func_fxt {
private final Xop_fxt fxt;
public Pgbnr_func_fxt() {
private Xop_fxt fxt;
public void Clear() {
Xoae_app app = Xoa_app_fxt.Make__app__edit();
Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app, "en.wikivoyage.org");
fxt = new Xop_fxt(app, wiki);
fxt.Init__file_find_mgr();
}
public void Init__orig(boolean wiki_is_commons, String orig_ttl, int orig_w, int orig_h) {
fxt.Init__orig(wiki_is_commons, orig_ttl, orig_w, orig_h);
}
public void Test__parse(boolean hdump, String raw, String expd) {
fxt.Exec_parse_page_all_as_str(raw);

@ -29,6 +29,9 @@ public class Pgbnr_itm implements Mustache_doc_itm {
private byte[] file_ttl;
private Pgbnr_icon[] icons;
private byte[] img_id_atr, img_xottl_atr, img_xoimg_atr;
private boolean isPanorama;
private boolean enable_toc = true;
private boolean hasPosition = false;
// NOTE: used by hdump
public boolean Exists() {return exists;} private boolean exists;
@ -65,13 +68,14 @@ public class Pgbnr_itm implements Mustache_doc_itm {
this.banner_img_src = banner_file_itm.Html_view_url().To_http_file_bry();
this.file_ttl = Gfo_url_encoder_.Href_quotes.Encode(banner_file_itm.Lnki_ttl()); // NOTE: Encode(Lnki_ttl) not Orig_ttl; else "%27s" instead of "'s" PAGE:en.v:'s-Hertogenbosch; DATE:2016-07-12
}
public void Init_from_html(int max_width, byte[] banner_anch_href, byte[] banner_img_src, byte[] srcset, boolean isHeadingOverrideEnabled, byte[] toc) {
public void Init_from_html(int max_width, byte[] banner_anch_href, byte[] banner_img_src, byte[] srcset, boolean isHeadingOverrideEnabled, byte[] toc, boolean isPanorama) {
this.max_width = max_width;
this.banner_anch_href = banner_anch_href;
this.banner_img_src = banner_img_src;
this.srcset = srcset;
this.isHeadingOverrideEnabled = isHeadingOverrideEnabled;
this.toc = toc;
this.isPanorama = isPanorama;
}
public void Init_hdump(boolean mode_is_hdump) {
Bry_bfr tmp_bfr = Bry_bfr_.New();
@ -109,6 +113,9 @@ public class Pgbnr_itm implements Mustache_doc_itm {
else if (String_.Eq(key, "hasIcons")) return Mustache_doc_itm_.Ary__bool(icons.length > 0);
else if (String_.Eq(key, "bottomtoc")) return Mustache_doc_itm_.Ary__bool(bottomtoc);
else if (String_.Eq(key, "isHeadingOverrideEnabled")) return Mustache_doc_itm_.Ary__bool(isHeadingOverrideEnabled);
else if (String_.Eq(key, "isPanorama")) return Mustache_doc_itm_.Ary__bool(isPanorama);
else if (String_.Eq(key, "enable-toc")) return Mustache_doc_itm_.Ary__bool(enable_toc);
else if (String_.Eq(key, "hasPosition")) return Mustache_doc_itm_.Ary__bool(hasPosition);
return Mustache_doc_itm_.Ary__empty;
}
private static final byte[] Bry__anch_atr_id = Bry_.new_a7(" id=\"xoimg_");

@ -83,8 +83,8 @@ public class Pgbnr_xtn_mgr extends Xox_mgr_base implements Bfr_arg {
public static final byte[] Bry__cls__wpb_banner_image = Bry_.new_a7("wpb-banner-image");
private static final byte[] Template_dflt = Bry_.New_u8_nl_apos
( "<div class='ext-wpb-pagebanner noprint pre-content'>"
, " <div class='wpb-banner-image-panorama wpb-topbanner wpb-positioned-banner'>"
( "<div class='ext-wpb-pagebanner pre-content'>"
, " <div class=\"{{#isPanorama}}wpb-banner-image-panorama {{/isPanorama}}wpb-topbanner{{extraClass}}\">"
, " {{#isHeadingOverrideEnabled}}<h1 class='wpb-name'>{{title}}</h1>{{/isHeadingOverrideEnabled}}"
, " <a href='{{bannerfile}}' class='image' title='{{tooltip}}' xowa_title='{{file_ttl}}'><img{{{img_id_atr}}}{{{img_xottl}}}{{{img_xoimg}}} src='{{banner}}' width='0' height='0' class='wpb-banner-image {{originx}}' alt='' srcset='{{srcset}}' data-pos-x='{{data-pos-x}}' data-pos-y='{{data-pos-y}}' style='max-width:{{maxWidth}}px'></a>"
, " {{#hasIcons}}"

@ -1,7 +1,7 @@
<div class="ext-wpb-pagebanner pre-content">
<div class="wpb-topbanner{{extraClass}}">
<div class="{{#isPanorama}}wpb-banner-image-panorama {{/isPanorama}}wpb-topbanner{{extraClass}}">
{{#isHeadingOverrideEnabled}}<h1 class="wpb-name">{{title}}</h1>{{/isHeadingOverrideEnabled}}
<a href="{{bannerfile}}" class="image" title="{{tooltip}}" xowa_title="{{file_ttl}}"><img{{{img_id_atr}}}{{{img_xottl}}}{{{img_xoimg}}} src="{{banner}}" width="0" height="0" class="wpb-banner-image {{originx}}" alt="" srcset="{{srcset}}" data-pos-x="{{data-pos-x}}" data-pos-y="{{data-pos-y}}" style="max-width:{{maxWidth}}px"></a>
<a class="image" dir="ltr" title="{{tooltip}}" href="{{bannerfile}}" xowa_title="{{file_ttl}}"><img{{{img_id_atr}}}{{{img_xottl}}}{{{img_xoimg}}} src="{{banner}}" srcset="{{srcset}}" class="wpb-banner-image"{{#hasPosition}} data-pos-x="{{data-pos-x}}" data-pos-y="{{data-pos-y}}" {{/hasPosition}}style="max-width:{{maxWidth}}px"></a>
{{#hasIcons}}
<div class="wpb-iconbox">
{{#icons}}
@ -10,5 +10,5 @@
</div>
{{/hasIcons}}
</div>
<div class="wpb-topbanner-toc {{#bottomtoc}}wpb-bottomtoc{{/bottomtoc}}"><div class="wpb-banner-toc">{{{toc}}}</div></div>
<div class="wpb-topbanner-toc {{#bottomtoc}}wpb-bottomtoc{{/bottomtoc}}"><div class="wpb-banner-toc">{{#enable-toc}}{{{toc}}}{{/enable-toc}}</div></div>
</div>

Loading…
Cancel
Save