diff --git a/400_xowa/src/gplx/xowa/Xop_fxt.java b/400_xowa/src/gplx/xowa/Xop_fxt.java index c9499dcb9..9f54f599a 100644 --- a/400_xowa/src/gplx/xowa/Xop_fxt.java +++ b/400_xowa/src/gplx/xowa/Xop_fxt.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java index d8e9dcb44..e7e6d560d 100644 --- a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xoh_file_mgr.java @@ -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; diff --git a/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xow_find_file_mgr.java b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xow_find_file_mgr.java new file mode 100644 index 000000000..f9eeedcb7 --- /dev/null +++ b/400_xowa/src/gplx/xowa/htmls/core/wkrs/lnkis/htmls/Xow_find_file_mgr.java @@ -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; + } +} diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java index 1266d26ec..38c039be9 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java @@ -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); diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java index 87d221a42..01f953efe 100644 --- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func_tst.java @@ -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 - ( "