"
+ ( "
"
, "
"
, "
~{contents_title}
"
, " "
, "~{toc_list}
"
, ""
)
- , "contents_title", "toc_list"
+ , "toc", "contents_title", "toc_list"
)
, bfmtr_line = Bry_fmtr.new_
( "
~{heading} ~{text}\n"
diff --git a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java
index daccbd1d5..95885a30f 100644
--- a/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java
+++ b/400_xowa/src/gplx/xowa/htmls/tocs/Xow_toc_mgr_tst.java
@@ -514,7 +514,7 @@ class Xow_toc_mgr_fxt {
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);
- toc_mgr.Html(fxt.Page(), Xoh_wtr_ctx.Basic, raw_bry, tmp);
+ toc_mgr.Html(fxt.Page(), Xoh_wtr_ctx.Basic, raw_bry, tmp, true);
Tfds.Eq_ary(String_.SplitLines_nl(expd), String_.SplitLines_nl(tmp.To_str_and_clear()), raw);
}
public void Test_html_all(String raw, String expd) {
diff --git a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java
index c7f23ee72..640f3dba8 100644
--- a/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java
+++ b/400_xowa/src/gplx/xowa/parsers/Xop_ctx.java
@@ -325,9 +325,9 @@ public class Xop_ctx {
return rv;
}
private static void new_copy(Xop_ctx src, Xop_ctx trg) {
- trg.Lnki().File_wkr_(src.Lnki().File_wkr()); // always share file_wkr between sub contexts
- trg.tmpl_output = src.tmpl_output; // share bfr for optimization purposes
- trg.ref_ignore = src.ref_ignore; // copy ref_ignore; needed for refs inside poem else duplicate refs; it.s:La_Secchia_rapita/Canto_primo; DATE:2015-12-03
+ trg.Lnki().File_logger_(src.Lnki().File_logger()); // always share lnki_logger between sub contexts
+ trg.tmpl_output = src.tmpl_output; // share bfr for optimization purposes
+ trg.ref_ignore = src.ref_ignore; // copy ref_ignore; needed for refs inside poem else duplicate refs; it.s:La_Secchia_rapita/Canto_primo; DATE:2015-12-03
trg.references_group = src.references_group;
trg.cur_page.Ref_mgr_(src.cur_page.Ref_mgr());
}
diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java
index 47e1d5dc5..6ea7369f4 100644
--- a/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java
+++ b/400_xowa/src/gplx/xowa/parsers/lnkis/Xop_lnki_wkr.java
@@ -18,7 +18,7 @@ along with this program. If not, see .
package gplx.xowa.parsers.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
import gplx.core.btries.*; import gplx.core.primitives.*;
import gplx.xowa.wikis.nss.*;
-import gplx.xowa.wikis.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.relatedSites.*;
+import gplx.xowa.wikis.*; import gplx.xowa.parsers.lnkis.files.*; import gplx.xowa.xtns.pfuncs.ttls.*; import gplx.xowa.xtns.relatedSites.*;
import gplx.xowa.parsers.tmpls.*; import gplx.xowa.parsers.miscs.*;
public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
private Arg_bldr arg_bldr = Arg_bldr.Instance;
@@ -29,7 +29,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
sites_regy_mgr = ctx.Wiki().Xtn_mgr().Xtn_sites().Regy_mgr(); if (!sites_regy_mgr.Xtn_mgr().Enabled()) sites_regy_mgr = null; // sets sites_xtn_mgr status for page; see below
}
public void Page_end(Xop_ctx ctx, Xop_root_tkn root, byte[] src, int src_len) {}
- public Xopg_redlink_logger File_wkr() {return file_wkr;} public Xop_lnki_wkr File_wkr_(Xopg_redlink_logger v) {file_wkr = v; return this;} private Xopg_redlink_logger file_wkr;
+ public Xop_file_logger File_logger() {return lnki_logger;} public Xop_lnki_wkr File_logger_(Xop_file_logger v) {lnki_logger = v; return this;} private Xop_file_logger lnki_logger = Xop_file_logger_.Noop;
public void Auto_close(Xop_ctx ctx, Xop_tkn_mkr tkn_mkr, Xop_root_tkn root, byte[] src, int src_len, int bgn_pos, int cur_pos, Xop_tkn_itm tkn) {
Xop_lnki_tkn lnki = (Xop_lnki_tkn)tkn;
lnki.Tkn_tid_to_txt();
@@ -72,7 +72,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
}
if (lnki_is_file) {
ctx.Page().Lnki_list().Add(lnki);
- if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_file);
+ lnki_logger.Log_file(ctx, lnki, Xop_file_logger_.Tid__file);
}
Xoa_ttl lnki_ttl = lnki.Ttl();
if ( lnki_ttl.Wik_bgn() != -1 // lnki is xwiki
diff --git a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_logger.java b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger.java
similarity index 65%
rename from 400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_logger.java
rename to 400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger.java
index 7f0ae8b5d..be8aa7e43 100644
--- a/400_xowa/src/gplx/xowa/parsers/lnkis/redlinks/Xopg_redlink_logger.java
+++ b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger.java
@@ -15,7 +15,10 @@ 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.parsers.lnkis.redlinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*;
-public interface Xopg_redlink_logger {
- void Wkr_exec(Xop_ctx ctx, byte[] src, Xop_lnki_tkn lnki, byte lnki_src_tid);
+package gplx.xowa.parsers.lnkis.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*;
+public interface Xop_file_logger {
+ void Log_file(Xop_ctx ctx, Xop_lnki_tkn lnki, byte caller_tid);
+}
+class Xop_file_logger__noop implements Xop_file_logger {
+ public void Log_file(Xop_ctx ctx, Xop_lnki_tkn lnki, byte caller_tid) {}
}
diff --git a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger_.java
similarity index 66%
rename from 400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java
rename to 400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger_.java
index d5c5348fe..56cbf5c48 100644
--- a/400_xowa/src/gplx/xowa/bldrs/cmds/files/Xob_lnki_src_tid.java
+++ b/400_xowa/src/gplx/xowa/parsers/lnkis/files/Xop_file_logger_.java
@@ -15,7 +15,8 @@ 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.bldrs.cmds.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.bldrs.*; import gplx.xowa.bldrs.cmds.*;
-public class Xob_lnki_src_tid {
- public static final byte Tid_file = 0, Tid_media = 1, Tid_gallery = 2, Tid_imageMap = 3;
+package gplx.xowa.parsers.lnkis.files; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*;
+public class Xop_file_logger_ {
+ public static final Xop_file_logger Noop = new Xop_file_logger__noop();
+ public static final byte Tid__file = 0, Tid__media = 1, Tid__gallery = 2, Tid__imap = 3, Tid__pgbnr_main = 4;
}
diff --git a/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.java b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.java
new file mode 100644
index 000000000..b4f986f72
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/parsers/tmpls/Xop_func_arg_itm.java
@@ -0,0 +1,50 @@
+/*
+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.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
+import gplx.xowa.xtns.pfuncs.*;
+public class Xop_func_arg_itm {
+ public byte[] key;
+ public byte[] val;
+ public void Set(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Arg_nde_tkn arg) {
+ Pf_func_.Eval_arg_or(bfr, ctx, src, caller, self, arg, null);
+ key = val = Bry_.Empty;
+ int len = bfr.Len(); byte[] bry = bfr.Bfr();
+ int bgn = -1, end = -1; boolean mode_is_key = true;
+ for (int i = 0; i < len; ++i) {
+ byte b = bry[i];
+ switch (b) {
+ case Byte_ascii.Eq:
+ if (mode_is_key) {
+ mode_is_key = false;
+ key = Bry_.Mid(bry, bgn, end);
+ bgn = end = -1;
+ }
+ break;
+ case Byte_ascii.Tab: case Byte_ascii.Nl: case Byte_ascii.Cr: case Byte_ascii.Space:
+ break;
+ default:
+ if (bgn == -1) bgn = i;
+ end = i + 1;
+ break;
+ }
+ if (bgn != -1) // guard against 'key='
+ val = Bry_.Mid(bry, bgn, end);
+ }
+ bfr.Clear();
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java
index d8ae415f1..65a1e3e2a 100644
--- a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java
+++ b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_html_data.java
@@ -20,7 +20,7 @@ import gplx.langs.htmls.*; import gplx.xowa.htmls.heads.*; import gplx.xowa.wiki
import gplx.xowa.xtns.pagebanners.*;
public class Xopg_html_data {
private Ordered_hash ctg_hash;
- public boolean Html_restricted() {return html_restricted;} private boolean html_restricted = true;
+ public boolean Html_restricted() {return html_restricted;} private boolean html_restricted = true;
public void Html_restricted_(boolean v) {html_restricted = v;} public void Html_restricted_n_() {Html_restricted_(Bool_.N);} public void Html_restricted_y_() {Html_restricted_(Bool_.Y);}
public byte[] Display_ttl() {
return ( display_ttl_vnt != null // -{T}- was in document
@@ -33,25 +33,26 @@ public class Xopg_html_data {
;
}
public Xopg_html_data Display_ttl_(byte[] v) {display_ttl = v; return this;} private byte[] display_ttl;
- public boolean Mode_wtxt_shown() {synchronized (this) {return mode_wtxt_shown;}} public void Mode_wtxt_shown_y_() {synchronized (this) {this.mode_wtxt_shown = true;}} private boolean mode_wtxt_shown;
+ public boolean Mode_wtxt_shown() {synchronized (this) {return mode_wtxt_shown;}} public void Mode_wtxt_shown_y_() {synchronized (this) {this.mode_wtxt_shown = true;}} private boolean mode_wtxt_shown;
public byte[] Display_ttl_vnt() {return display_ttl_vnt;} public void Display_ttl_vnt_(byte[] v) {display_ttl_vnt = v;} private byte[] display_ttl_vnt;
public byte[] Content_sub() {return content_sub;} public void Content_sub_(byte[] v) {content_sub = v;} private byte[] content_sub;
+ public Xopg_page_heading Page_heading() {return page_heading;} private final Xopg_page_heading page_heading = new Xopg_page_heading();
public String Bmk_pos() {return html_bmk_pos;} public void Bmk_pos_(String v) {html_bmk_pos = v;} private String html_bmk_pos;
public Bry_bfr Portal_div_xtn() {return portal_div_xtn;} private Bry_bfr portal_div_xtn = Bry_bfr.reset_(255);
public byte[] Edit_preview_w_dbg() {return Bry_.Add(xtn_scribunto_dbg, edit_preview);} public void Edit_preview_(byte[] v) {edit_preview = v;} private byte[] edit_preview = Bry_.Empty;
public int Lnke_autonumber_next() {return lnke_autonumber++;} private int lnke_autonumber = 1;
public int Sect_uid() {return sect_uid;} private int sect_uid = -1; public int Sect_uid_next() {return ++sect_uid;}
- public boolean Lang_convert_content() {return lang_convert_content;} public void Lang_convert_content_(boolean v) {lang_convert_content = v;} private boolean lang_convert_content = true;
- public boolean Lang_convert_title() {return lang_convert_title;} public void Lang_convert_title_(boolean v) {lang_convert_title = v;} private boolean lang_convert_title = true;
+ public boolean Lang_convert_content() {return lang_convert_content;} public void Lang_convert_content_(boolean v) {lang_convert_content = v;} private boolean lang_convert_content = true;
+ public boolean Lang_convert_title() {return lang_convert_title;} public void Lang_convert_title_(boolean v) {lang_convert_title = v;} private boolean lang_convert_title = true;
public Xopg_xtn_skin_mgr Xtn_skin_mgr() {return xtn_skin_mgr;} private Xopg_xtn_skin_mgr xtn_skin_mgr = new Xopg_xtn_skin_mgr();
public Indicator_html_bldr Indicators() {return indicators;} private final Indicator_html_bldr indicators = new Indicator_html_bldr();
public int Xtn_gallery_next_id() {return ++xtn_gallery_next_id;} private int xtn_gallery_next_id = -1;
- public boolean Xtn_gallery_packed_exists() {return xtn_gallery_packed_exists;} public void Xtn_gallery_packed_exists_y_() {xtn_gallery_packed_exists = true;} private boolean xtn_gallery_packed_exists;
- public boolean Xtn_imap_exists() {return xtn_imap_exists;} public void Xtn_imap_exists_y_() {xtn_imap_exists = true;} private boolean xtn_imap_exists;
+ public boolean Xtn_gallery_packed_exists() {return xtn_gallery_packed_exists;} public void Xtn_gallery_packed_exists_y_() {xtn_gallery_packed_exists = true;} private boolean xtn_gallery_packed_exists;
+ public boolean Xtn_imap_exists() {return xtn_imap_exists;} public void Xtn_imap_exists_y_() {xtn_imap_exists = true;} private boolean xtn_imap_exists;
public int Xtn_imap_next_id() {return ++xtn_imap_next_id;} private int xtn_imap_next_id; // NOTE: must keep separate imap_id b/c html_elem_id is not always set;
public byte[] Xtn_search_text() {return xtn_search_txt;} public void Xtn_search_text_(byte[] v) {xtn_search_txt = v;} private byte[] xtn_search_txt = Bry_.Empty;
public byte[] Xtn_scribunto_dbg() {return xtn_scribunto_dbg;} public void Xtn_scribunto_dbg_(byte[] v) {xtn_scribunto_dbg = Bry_.Add(xtn_scribunto_dbg, v);} private byte[] xtn_scribunto_dbg = Bry_.Empty;
- public Pgbnr_itm Xtn__pgbnr() {return xtn__pgbnr;} public void Xtn__pgbnr_(Pgbnr_itm v) {xtn__pgbnr = v;} private Pgbnr_itm xtn__pgbnr;
+ public Pgbnr_itm Xtn_pgbnr() {return xtn_pgbnr;} public void Xtn_pgbnr_(Pgbnr_itm v) {xtn_pgbnr = v;} private Pgbnr_itm xtn_pgbnr;
public Xoh_head_mgr Head_mgr() {return module_mgr;} private Xoh_head_mgr module_mgr = new Xoh_head_mgr();
public byte[] Custom_html() {return custom_html;} public Xopg_html_data Custom_html_(byte[] v) {custom_html = v; return this;} private byte[] custom_html;
public byte[] Custom_tab_name() {return custom_tab_name;} public Xopg_html_data Custom_tab_name_(byte[] v) {custom_tab_name = v; return this;} private byte[] custom_tab_name;
@@ -81,7 +82,7 @@ public class Xopg_html_data {
xtn_imap_exists = false;
xtn_search_txt = Bry_.Empty;
xtn_scribunto_dbg = Bry_.Empty;
- xtn__pgbnr = null;
+ xtn_pgbnr = null;
module_mgr.Clear();
custom_html = custom_html_end = custom_head_end = custom_tab_name = null;
if (ctg_hash != null) ctg_hash.Clear();
diff --git a/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java
new file mode 100644
index 000000000..d4eda1c0b
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/wikis/pages/Xopg_page_heading.java
@@ -0,0 +1,33 @@
+/*
+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.wikis.pages; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
+import gplx.core.brys.*; import gplx.core.brys.fmtrs.*;
+public class Xopg_page_heading implements Bfr_arg {
+ private Xopg_html_data html_data;
+ private Xoa_ttl page_ttl;
+ public Xopg_page_heading Init(Xoae_page page) {
+ this.html_data = page.Html_data();
+ this.page_ttl = page.Ttl();
+ return this;
+ }
+ public void Bfr_arg__add(Bry_bfr bfr) {
+ if (html_data.Xtn_pgbnr() != null) return; // pgbnr exists; don't add title
+ fmtr.Bld_bfr_many(bfr, page_ttl.Page_txt());
+ }
+ private final Bry_fmt fmtr = Bry_fmt.New(Bry_.New_u8_nl_apos("~{page_title}
"), "page_title");
+}
diff --git a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java
index 43f4aadab..9c429f8fa 100644
--- a/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java
+++ b/400_xowa/src/gplx/xowa/xtns/gallery/Gallery_itm_parser.java
@@ -19,7 +19,7 @@ package gplx.xowa.xtns.gallery; import gplx.*; import gplx.xowa.*; import gplx.x
import gplx.core.primitives.*; import gplx.core.btries.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*;
import gplx.xowa.wikis.nss.*;
-import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.tmpls.*;
+import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*; import gplx.xowa.parsers.tmpls.*;
import gplx.xowa.files.*;
public class Gallery_itm_parser {
private Xowe_wiki wiki; private Btrie_slim_mgr trie = Btrie_slim_mgr.ci_u8();
@@ -77,11 +77,10 @@ public class Gallery_itm_parser {
Xop_root_tkn caption_tkn = wiki.Parser_mgr().Main().Parse_text_to_wdom_old_ctx(ctx, lnki_caption, true);
cur_itm.Caption_tkn_(caption_tkn);
}
- Xopg_redlink_logger file_wkr = ctx.Lnki().File_wkr(); // NOTE: do not set file_wkr ref early (as member var); parse_all sets late
ctx.Page().Lnki_list().Add(lnki_tkn);
mgr.Get_thumb_size(lnki_tkn, cur_itm.Ext()); // NOTE: set thumb size, so that lnki.temp parse picks it up
- if (file_wkr != null) file_wkr.Wkr_exec(ctx, src, lnki_tkn, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_gallery);
- lnki_tkn.W_(-1).H_(-1); // NOTE: reset lnki back to defaults, else itm will show as large missing caption
+ ctx.Lnki().File_logger().Log_file(ctx, lnki_tkn, Xop_file_logger_.Tid__gallery); // NOTE: do not set file_wkr ref early (as member var); parse_all sets late
+ lnki_tkn.W_(-1).H_(-1); // NOTE: reset lnki back to defaults, else itm will show as large missing caption
}
private byte Parse_itm() {
int fld_count = 0;
diff --git a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java
index 6d1dae326..cbd10b65c 100644
--- a/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java
+++ b/400_xowa/src/gplx/xowa/xtns/imaps/Imap_parser.java
@@ -17,7 +17,7 @@ along with this program. If not, see .
*/
package gplx.xowa.xtns.imaps; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.core.btries.*; import gplx.core.primitives.*;
-import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.redlinks.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*;
+import gplx.xowa.parsers.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.lnkis.files.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.tmpls.*;
class Imap_parser {
private Imap_xtn_mgr xtn_mgr; private Xoa_url page_url; private Gfo_usr_dlg usr_dlg = Gfo_usr_dlg_.Instance;
private byte[] imap_img_src;
@@ -188,7 +188,6 @@ class Imap_parser {
imap_img_src = Bry_.Add(Xop_tkn_.Lnki_bgn, Bry_.Mid(src, img_bgn, img_end), Xop_tkn_.Lnki_end);
Xop_tkn_itm tkn_itm = Parse_link(imap_img_src); // NOTE: need to parse before imap_root.Data_mid() below
imap_img_src = imap_root.Data_mid(); // need to re-set src to pick up templates; EX: File:A.png|thumb|{{Test_template}}\n; PAGE:en.w:Kilauea; DATE:2014-07-27
- Xopg_redlink_logger file_wkr = wiki_ctx.Lnki().File_wkr(); // NOTE: do not do imap_ctx.Lnki(); imap_ctx is brand new
if ( tkn_itm == null // no lnki or lnke
|| tkn_itm.Tkn_tid() != Xop_tkn_itm_.Tid_lnki // no lnki; occurs with badly constructed maps; PAGE:en.w:Demography_of_the_United_Kingdom DATE:2015-01-22
)
@@ -198,7 +197,7 @@ class Imap_parser {
imap_img = new Imap_itm_img(lnki_tkn);
lnki_tkn.Lnki_file_wkr_(imap);
wiki_ctx.Page().Lnki_list().Add(lnki_tkn);
- if (file_wkr != null) file_wkr.Wkr_exec(wiki_ctx, src, lnki_tkn, gplx.xowa.bldrs.cmds.files.Xob_lnki_src_tid.Tid_imageMap);
+ wiki_ctx.Lnki().File_logger().Log_file(wiki_ctx, lnki_tkn, Xop_file_logger_.Tid__imap); // NOTE: do not do imap_ctx.Lnki(); imap_ctx is brand new
}
return img_end;
}
diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java
index b3f50dbc8..14a218766 100644
--- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java
+++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func.java
@@ -29,12 +29,14 @@ public class Map_dd2dms_func extends Pf_func_base {
Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b128();
byte[] plus = Bry_.Empty, minus = Bry_.Empty;
int prec = 4;
+ Xop_func_arg_itm func_arg = new Xop_func_arg_itm();
for (int i = 0; i < args_len; i++) {
- Arg_nde_tkn arg = self.Args_get_by_idx(i);
- byte[] key = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Key_tkn());
+ Arg_nde_tkn arg = self.Args_get_by_idx(i);
+ func_arg.Set(tmp_bfr, ctx, src, caller, self, arg);
+ byte[] key = func_arg.key;
Object key_tid_obj = Key_hash.Get_by(key);
if (key_tid_obj != null) {
- byte[] val = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Val_tkn());
+ byte[] val = func_arg.val;
switch (((Byte_obj_val)key_tid_obj).Val()) {
case Key_tid_plus: plus = val; break;
case Key_tid_minus: minus = val; break;
diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java
index 75391ebd7..221dbe26e 100644
--- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java
+++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_dd2dms_func_tst.java
@@ -22,4 +22,5 @@ public class Map_dd2dms_func_tst {
@Test public void Example() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58|precision=4}}" , "{{test}}" , "14° 34' 48"");}
@Test public void Plus() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58|precision=4|plus=pos}}" , "{{test}}" , "14° 34' 48" pos");}
@Test public void Ws() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58| precision = 4 | plus = pos }}" , "{{test}}" , "14° 34' 48" pos");}
+ @Test public void Nested_pfunc() {fxt.Test_parse_tmpl_str_test("{{#dd2dms: 14.58|{{#if:2|precision=2}}}}" , "{{test|3}}" , "14° 34'");} // handle "{{#if:2|precision=2}}" -> "precision=2"
}
diff --git a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java
index 081594d85..e995c4e49 100644
--- a/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java
+++ b/400_xowa/src/gplx/xowa/xtns/mapSources/Map_geolink_func.java
@@ -29,13 +29,15 @@ public class Map_geolink_func extends Pf_func_base {
int args_len = self.Args_len();
Bry_bfr tmp_bfr = ctx.Wiki().Utl__bfr_mkr().Get_b128();
try {
+ Xop_func_arg_itm func_arg = new Xop_func_arg_itm();
byte[] pattern = Eval_argx(ctx, src, caller, self);
for (int i = 0; i < args_len; i++) {
Arg_nde_tkn arg = self.Args_get_by_idx(i);
- byte[] key = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Key_tkn());
+ func_arg.Set(tmp_bfr, ctx, src, caller, self, arg);;
+ byte[] key = func_arg.key;
Object key_tid_obj = Key_hash.Get_by(key);
if (key_tid_obj != null) {
- byte[] val = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Val_tkn());
+ byte[] val = func_arg.val;
switch (((Byte_obj_val)key_tid_obj).Val()) {
case Key_tid_lat_val: mer_x_val = val; break;
case Key_tid_long_val: mer_y_val = val; break;
diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java
index 0ef92e7e7..25b15ee46 100644
--- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java
+++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_cfg.java
@@ -16,16 +16,25 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
+import gplx.core.primitives.*;
public class Pgbnr_cfg {
- private static final int[] wpb_standard_sizes = new int[] {640, 1280, 2560};
- public byte[] Default_file() {return null;}
- public boolean Enabled_in_ns(int ns_id) {return false;}
- public boolean Get__wpb_enable_default_banner() {return false;}
- public boolean Get__wpb_enable_heading_override() {return false;}
- public byte[] Get__wpb_image() {return null;}
- public int[] Get__wpb_standard_sizes() {return wpb_standard_sizes;}
+ private final Hash_adp ns_hash = Hash_adp_.new_(); private final Int_obj_ref tmp_ns_key = Int_obj_ref.neg1_();
+ public Pgbnr_cfg(boolean enabled, boolean enable_heading_override, boolean enable_default_banner, int[] ns_ary, int dflt_img_wdata_prop, byte[] dflt_img_title, int[] standard_sizes) {
+ this.enabled = enabled; this.enable_heading_override = enable_heading_override; this.enable_default_banner = enable_default_banner;
+ this.standard_sizes = standard_sizes;
+ this.dflt_img_wdata_prop = dflt_img_wdata_prop; this.dflt_img_title = dflt_img_title;
+ for (int ns : ns_ary)
+ this.ns_hash.Add_as_key_and_val(Int_obj_ref.new_(ns));
+ }
+ public final boolean enabled;
+ public final boolean enable_heading_override;
+ public final boolean enable_default_banner;
+ public final int dflt_img_wdata_prop;
+ public final byte[] dflt_img_title;
+ public final int[] standard_sizes;
public boolean Chk_pgbnr_allowed(Xoa_ttl ttl, Xowe_wiki wiki) {
- return this.Enabled_in_ns(ttl.Ns().Id()) // chk if ns allows banner
+ boolean enabled_in_ns = ns_hash.Has(tmp_ns_key.Val_(ttl.Ns().Id()));
+ return enabled_in_ns // chk if ns allows banner
&& !Bry_.Eq(ttl.Page_db(), wiki.Props().Main_page()); // never show on main page
}
}
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 3e9e47564..0783dc55b 100644
--- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java
+++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_func.java
@@ -17,16 +17,16 @@ along with this program. If not, see .
*/
package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
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.*; 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.*;
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);}
@Override public void Func_evaluate(Bry_bfr bfr, Xop_ctx ctx, Xot_invk caller, Xot_invk self, byte[] src) { // {{PAGEBANNER}} appears on page; WikidataPageBanner.hooks.php|addCustomBanner
- Xowe_wiki wiki = ctx.Wiki();
+ Xowe_wiki wiki = ctx.Wiki(); Xoae_page page = ctx.Page();
Pgbnr_xtn_mgr xtn_mgr = wiki.Xtn_mgr().Xtn_pgbnr();
Pgbnr_cfg cfg = xtn_mgr.Cfg();
- Xoa_ttl ttl = ctx.Page().Ttl();
+ Xoa_ttl ttl = page.Ttl();
if (!cfg.Chk_pgbnr_allowed(ttl, wiki)) return;
byte[] tooltip = ttl.Page_txt(), title = ttl.Page_txt(), toc = Bry_.Empty, origin_x = Bry_.Empty;
boolean bottomtoc = false;;
@@ -34,10 +34,13 @@ public class Pgbnr_func extends Pf_func_base {
List_adp icons_list = null;
Bry_bfr tmp_bfr = Bry_bfr.new_();
int args_len = self.Args_len();
+ Xop_func_arg_itm func_arg = new Xop_func_arg_itm();
for (int i = 0; i < args_len; ++i) {
Arg_nde_tkn arg = self.Args_get_by_idx(i);
- byte[] key = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Key_tkn());
- byte[] val = Pf_func_.Eval_tkn(tmp_bfr, ctx, src, caller, arg.Val_tkn());
+ func_arg.Set(tmp_bfr, ctx, src, caller, self, arg);
+ byte[] key = func_arg.key;
+ byte[] val = func_arg.val;
+ if (key == Bry_.Empty) continue; // ignore blank args; EX:{{PAGEBANNER:A.png|\n|toc=yes}}
int tid = arg_hash.Get_as_int_or(key, -1);
if (tid == Arg__pgname)
tooltip = title = val;
@@ -47,9 +50,9 @@ public class Pgbnr_func extends Pf_func_base {
bottomtoc = true;
if (tid == Arg__toc && Bry_.Eq(val, Bry__yes)) // REF.MW:addToc
toc = Bry_.Empty; // note that "" will be overwritten later by actual toc html
- if ( tid == -1 // handle "icon-*";
+ if ( tid == -1 // note that "icon-*" won't have a tid
&& Bry_.Has_at_bgn(key, Bry__icon) // if (substr($key, 0, 5) === 'icon-')
- && Bry_.Len(Bry__icon) > 5 // if ( !isset( $iconname) )
+ && Bry_.Len(key) > 5 // if ( !isset( $iconname) )
&& Bry_.Len_gt_0(val) // if ( !isset( $$value ) )
) { // REF.MW:addIcons
tid = Arg__icon;
@@ -57,16 +60,13 @@ public class Pgbnr_func extends Pf_func_base {
byte[] icon_key = Bry_.Mid(key, 5);
byte[] icon_name = Xop_sanitizer.Escape_cls(icon_key);
byte[] icon_title = icon_name;
- Xoa_ttl icon_url_ttl = wiki.Ttl_parse(val);
-// TODO: get icon_url
- byte[] icon_url_bry = Bry_.Empty;
- if (icon_url_ttl == null)
- icon_url_bry = Bry__url_dflt; // $iconUrl = Title::newFromText( $value ); if ( $iconUrl )
- else {
- icon_url_bry = Bry_.Empty; // $iconUrl->getLocalUrl();
- icon_title = ttl.Page_txt();
+ Xoa_ttl icon_ttl = wiki.Ttl_parse(val);
+ byte[] icon_href = Bry__icon_href_dflt;
+ if (icon_ttl != null) {
+ icon_href = Bry_.Add(gplx.xowa.htmls.hrefs.Xoh_href_.Bry__wiki, icon_ttl.Page_db());
+ icon_title = icon_ttl.Page_txt();
}
- icons_list.Add(new Pgbnr_icon(icon_name, icon_title, icon_url_bry));
+ icons_list.Add(new Pgbnr_icon(tmp_bfr, icon_name, icon_title, icon_href));
}
if (tid == Arg__origin) { // REF.MW:addFocus
double tmp_data_pos_x = Double_.NaN, tmp_data_pos_y = Double_.NaN;
@@ -85,86 +85,82 @@ public class Pgbnr_func extends Pf_func_base {
}
}
}
- if (tid == -1) Gfo_usr_dlg_.Instance.Warn_many("", "", "unknown arg type; page=~{0} key=~{1} val=~{2}", "page", ctx.Page().Url_bry_safe(), key, val);
+ if (tid == -1) Gfo_usr_dlg_.Instance.Warn_many("", "", "unknown arg type; page=~{0} key=~{1} val=~{2}", page.Url_bry_safe(), key, val);
}
- byte[] name = Eval_argx(ctx, src, caller, self);
- // Xoa_ttl file_ttl = wiki.Ttl_parse(name); SKIP?: MW creates title to auto-register page and image in imagelinks
+
+ byte[] banner_name = Eval_argx(ctx, src, caller, self);
+ Xoa_ttl banner_ttl = wiki.Ttl_parse(banner_name); // NOTE: MW also creates title to auto-register page and image in imagelinks
+ Xof_file_itm banner_file_itm = File__make_tkn(ctx, Xop_file_logger_.Tid__pgbnr_main, banner_ttl, Xop_lnki_tkn.Width_null, Xop_lnki_tkn.Height_null);
+
Pgbnr_itm itm = new Pgbnr_itm();
- ctx.Page().Html_data().Xtn__pgbnr_(itm);
- itm.Init_from_wtxt(name, tooltip, title, bottomtoc, toc, data_pos_x, data_pos_y, origin_x, icons_list == null ? Pgbnr_icon.Ary_empty : (Pgbnr_icon[])icons_list.To_ary_and_clear(Pgbnr_icon.class));
+ itm.Init_from_wtxt(banner_ttl, banner_file_itm, tooltip, title, bottomtoc, toc, data_pos_x, data_pos_y, origin_x, icons_list == null ? Pgbnr_icon.Ary_empty : (Pgbnr_icon[])icons_list.To_ary_and_clear(Pgbnr_icon.class));
+ page.Html_data().Xtn_pgbnr_(itm);
+ page.Html_data().Head_mgr().Itm__pgbnr().Enabled_y_(); // register css / js during parse stage
}
- public static void Add_banner(Bry_bfr bfr, Xop_ctx ctx) {
- Xowe_wiki wiki = ctx.Wiki();
- Pgbnr_cfg cfg = wiki.Xtn_mgr().Xtn_pgbnr().Cfg();
- Xoa_ttl ttl = ctx.Page().Ttl();
- Pgbnr_itm itm = ctx.Page().Html_data().Xtn__pgbnr();
- byte[] banner_name = null, banner_html = null;
- if (itm != null) { // {{PAGEBANNER}} exists in wikitext
- banner_name = itm.name;
- banner_html = Get_banner_html(wiki, cfg, banner_name, itm);
- if (banner_html == null) { // no banner; try again using title from wikidata;
- banner_name = Get_wikidata_banner(ttl);
- banner_html = Get_banner_html(wiki, cfg, banner_name, itm);
- }
- if (banner_html != null) { // only add banner and styling if valid banner generated
- if (itm.toc != null) {
- // $out->addModuleStyles( 'ext.WikidataPageBanner.toc.styles' );
- }
- bfr.Add(banner_html);
+ public static void Add_banner(Bry_bfr bfr, Xop_ctx ctx, Xoh_wtr_ctx hctx, byte[] src) {
+ Xowe_wiki wiki = ctx.Wiki(); Xoae_app app = wiki.Appe();
+ Pgbnr_cfg cfg = wiki.Xtn_mgr().Xtn_pgbnr().Cfg(); if (!cfg.enabled) return;
+ Xoae_page page = ctx.Page(); Xoa_ttl ttl = page.Ttl();
+ Pgbnr_itm itm = page.Html_data().Xtn_pgbnr();
+ Xoa_ttl banner_ttl = null; byte[] banner_html = null;
+ if (itm != null) { // {{PAGEBANNER}} exists in wikitext
+ banner_ttl = itm.banner_ttl;
+ banner_html = Get_banner_html(wiki, ctx, src, cfg, banner_ttl, itm);
+ if (banner_html == null) { // no banner; try again using title from wikidata; note that this should only happen if no banner_ttl or banner_ttl is invalid; EX:{{PAGEBANNER:|toc=yes}}
+ banner_ttl = Get_wikidata_banner(app, wiki, cfg, ttl);
+ banner_html = Get_banner_html(wiki, ctx, src, cfg, banner_ttl, itm);
}
}
- else if ( ttl.Ns().Id_is_main() // if the page uses no 'PAGEBANNER' invocation and if article page, insert default banner
- && cfg.Get__wpb_enable_default_banner()
+ else if ( ttl.Ns().Id_is_main() // {{PAGEBANNER}} missing, but wiki is marked as enable_default_banner
+ && cfg.enable_default_banner
+ && cfg.Chk_pgbnr_allowed(ttl, wiki)
) {
- if (cfg.Chk_pgbnr_allowed(ttl, wiki)) {
- banner_name = Get_wikidata_banner(ttl);
- if (banner_name == null) {
- banner_name = cfg.Get__wpb_image();
- }
- itm = new Pgbnr_itm();
- itm.name = banner_name;
- banner_html = Get_banner_html(wiki, cfg, banner_name, itm);
- if (banner_html != null) { // NOTE: same as above
- bfr.Add(banner_html);
- }
- }
+ banner_ttl = Get_wikidata_banner(app, wiki, cfg, ttl);
+ if (banner_ttl == null)
+ banner_ttl = wiki.Ttl_parse(cfg.dflt_img_title);
+ Xof_file_itm banner_file_itm = File__make_tkn(ctx, Xop_file_logger_.Tid__pgbnr_main, banner_ttl, Xop_lnki_tkn.Width_null, Xop_lnki_tkn.Height_null);
+ itm = new Pgbnr_itm();
+ itm.Init_from_wtxt(banner_ttl, banner_file_itm, Bry_.Empty, Bry_.Empty, false, Bry_.Empty, 0, 0, Bry_.Empty, Pgbnr_icon.Ary_empty);
+ banner_html = Get_banner_html(wiki, ctx, src, cfg, banner_ttl, itm);
}
+ if (banner_html != null)
+ bfr.Add(banner_html);
}
- public static byte[] Get_banner_html(Xowe_wiki wiki, Pgbnr_cfg cfg, byte[] banner_name, Pgbnr_itm itm) {
- byte[][] urls = Get_standard_size_urls(wiki, cfg, banner_name);
- if (urls == null) return null;
+ public static byte[] Get_banner_html(Xowe_wiki wiki, Xop_ctx ctx, byte[] src, 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;
Bry_bfr tmp_bfr = Bry_bfr.new_();
int urls_len = urls.length;
- int[] sizes = cfg.Get__wpb_standard_sizes();
+ int[] sizes = cfg.standard_sizes;
for (int i = 0; i < urls_len; ++i) {
int size = sizes[i];
if (i != 0) tmp_bfr.Add_byte_comma();
- tmp_bfr.Add(urls[i]).Add_byte_space().Add_int_variable(size).Add_byte(Byte_ascii.Ltr_w); // $srcset[] = "$url {$size}w";
+ 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 = urls.length == 0 ? Bry_.Empty : urls[urls_len - 1]; // gets largest url
- // Xoa_ttl banner_file = wiki.Ttl_parse(tmp_bfr.Add(wiki.Ns_mgr().Ns_file().Name_db_w_colon()).Add(banner_name).To_bry_and_clear());
- int maxWidth = 1; // $file = wfFindFile( banner_file ); $options['maxWidth'] = $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
+ int max_width = itm.banner_file_itm.Orig_w(); // $file = wfFindFile( banner_file ); $options['max_width'] = $file->getWidth();
byte[] banner_file = null; // $bannerfile->getLocalUrl();
- itm.Init_from_html(maxWidth, banner_file, banner_url, srcset, cfg.Get__wpb_enable_heading_override());
+
+ wiki.Html_mgr().Toc_mgr().Html(ctx.Page(), gplx.xowa.htmls.core.htmls.Xoh_wtr_ctx.Basic, src, tmp_bfr, false);
+ byte[] 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);
Mustache_render_ctx mctx = new Mustache_render_ctx().Init(itm);
wiki.Xtn_mgr().Xtn_pgbnr().Template_root().Render(tmp_bfr, mctx);
return tmp_bfr.To_bry_and_clear();
}
- private static byte[][] Get_standard_size_urls(Xow_wiki wiki, Pgbnr_cfg cfg, byte[] file_name) {
+ private static byte[][] Get_standard_size_urls(Xow_wiki wiki, Pgbnr_cfg cfg, Xoa_ttl banner_ttl) {
Ordered_hash hash = Ordered_hash_.New_bry();
- int[] sizes = cfg.Get__wpb_standard_sizes();
+ int[] sizes = cfg.standard_sizes;
int sizes_len = sizes.length;
for (int i = 0; i < sizes_len; ++i) {
- byte[] url = Get_image_url(wiki, file_name, sizes[i]);
+ byte[] url = Get_image_url(wiki, banner_ttl, sizes[i]);
if (url != null)
hash.Add_if_dupe_use_1st(url, url);
}
return (byte[][])hash.To_ary_and_clear(byte[].class);
}
- private static byte[] Get_image_url(Xow_wiki wiki, byte[] file_name, int width) {
- // Xoa_ttl file_ttl = wiki.Ttl_parse(file_name);
+ private static byte[] Get_image_url(Xow_wiki wiki, Xoa_ttl banner_ttl, int width) {
// Object file = new Object(); // $file = wfFindFile( file_ttl );
// if (file == null) return null;
if (width >= 0 && width <= 3000) {
@@ -175,10 +171,19 @@ public class Pgbnr_func extends Pf_func_base {
else
return new byte[0]; // $file->getFullUrl();
}
- private static byte[] Get_wikidata_banner(Xoa_ttl ttl) {
- return null;
+ private static Xoa_ttl Get_wikidata_banner(Xoae_app app, Xow_wiki wiki, Pgbnr_cfg cfg, Xoa_ttl ttl) {
+ byte[] rv = app.Wiki_mgr().Wdata_mgr().Get_claim_or(wiki.Domain_itm(), ttl, cfg.dflt_img_wdata_prop, null); // don't log misses; wikivoyage pages will default to show pagebanner, and many pages may not have wikidata definitions
+ if (rv == null) return null;
+ return wiki.Ttl_parse(rv);
+ }
+ private static Xof_file_itm File__make_tkn(Xop_ctx ctx, byte tid, Xoa_ttl file_ttl, int file_w, int file_h) {
+ Xop_lnki_tkn lnki = ctx.Tkn_mkr().Lnki(file_w, file_h).Ttl_(file_ttl);
+ ctx.Page().Lnki_list().Add(lnki);
+ ctx.Lnki().File_logger().Log_file(ctx, lnki, tid); // NOTE: do not set file_wkr ref early (as member var); parse_all sets late
+ Xof_file_itm file_itm = ctx.Wiki().Html_mgr().Html_wtr().Lnki_wtr().File_wtr().Lnki_eval(Xof_exec_tid.Tid_wiki_page, ctx, ctx.Page(), lnki);
+ return file_itm;
}
- private static final byte[] Bry__yes = Bry_.new_a7("yes"), Bry__icon = Bry_.new_a7("icon-"), Bry__url_dflt = Bry_.new_a7("#"), Bry__origin_x__left = Bry_.new_a7("wpb-left"), Bry__origin_x__right = Bry_.new_a7("wpb-right");
+ private static final byte[] Bry__yes = Bry_.new_a7("yes"), Bry__icon = Bry_.new_a7("icon-"), Bry__icon_href_dflt = Bry_.new_a7("#"), Bry__origin_x__left = Bry_.new_a7("wpb-left"), Bry__origin_x__right = Bry_.new_a7("wpb-right");
private static final int Arg__pgname = 0, Arg__tooltip = 1, Arg__bottomtoc = 2, Arg__toc = 3, Arg__icon = 4, Arg__origin = 5;
private static final Hash_adp_bry arg_hash = Hash_adp_bry.cs().Add_str_int("pgname", Arg__pgname)
.Add_str_int("tooltip", Arg__tooltip).Add_str_int("bottomtoc", Arg__bottomtoc).Add_str_int("toc", Arg__toc).Add_str_int("origin", Arg__origin);
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 62e65f606..24b732955 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,24 +18,32 @@ along with this program. If not, see .
package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import org.junit.*; import gplx.core.brys.*; import gplx.xowa.wikis.pages.skins.*;
public class Pgbnr_func_tst {
-// private final Pgbnr_func_fxt fxt = new Pgbnr_func_fxt();
+ private final Pgbnr_func_fxt fxt = new Pgbnr_func_fxt();
@Test public void Basic() {
-// fxt.Test__parse__eq("{{PAGEBANNER:A.png}}", String_.Concat_lines_nl_apos_skip_last
-// ( ""
-// , "
"
-// , "
Test page
"
-// , "
"
-// , "
"
-// , "
"
-// , "
"
-// ));
+ fxt.Test__parse__eq("{{PAGEBANNER:A.png|icon-star=Star_article}}", String_.Concat_lines_nl_apos_skip_last
+ ( ""
+ , "
"
+ , "
Test page
"
+ , "
"
+ , "
"
+ , "
"
+ , "
"
+ , "
"
+ ));
}
}
class Pgbnr_func_fxt {
- private final Xop_fxt fxt = new Xop_fxt();
+ private final Xop_fxt fxt;
+ public Pgbnr_func_fxt() {
+ Xoae_app app = Xoa_app_fxt.app_();
+ Xowe_wiki wiki = Xoa_app_fxt.wiki_(app, "en.wikivoyage.org");
+ fxt = new Xop_fxt(app, wiki);
+ }
public void Test__parse__eq(String raw, String expd) {
- fxt.Exec_parse_page_all_as_str("{{PAGEBANNER:A.png}}");
- Bfr_arg arg = fxt.Wiki().Xtn_mgr().Xtn_pgbnr().Write_html(fxt.Ctx(), fxt.Page());
+ fxt.Exec_parse_page_all_as_str(raw);
+ Bfr_arg arg = fxt.Wiki().Xtn_mgr().Xtn_pgbnr().Write_html(fxt.Ctx(), fxt.Page(), null, null);
Bry_bfr bfr = Bry_bfr.new_();
arg.Bfr_arg__add(bfr);
Tfds.Eq_str_lines(expd, bfr.To_str_and_clear());
diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java
index b381e66f9..323326440 100644
--- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java
+++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_icon.java
@@ -16,19 +16,26 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
+import gplx.core.brys.fmtrs.*;
import gplx.langs.mustaches.*;
public class Pgbnr_icon implements Mustache_doc_itm {
- public byte[] name;
- public byte[] title;
- public byte[] url;
- public Pgbnr_icon(byte[] name, byte[] title, byte[] url) {this.name = name; this.title = title; this.url = url;}
+ private final byte[] name, title, href, html;
+ public Pgbnr_icon(Bry_bfr tmp_bfr, byte[] name, byte[] title, byte[] href) {
+ this.name = name; this.title = title; this.href = href;
+ fmt.Bld_bfr_many(tmp_bfr, name, title);
+ this.html = tmp_bfr.To_bry_and_clear();
+ }
public byte[] Get_prop(String key) {
if (String_.Eq(key, "name")) return name;
else if (String_.Eq(key, "title")) return title;
- else if (String_.Eq(key, "url")) return url;
- else if (String_.Eq(key, "html")) return Mustache_doc_itm_.Null_val;
+ else if (String_.Eq(key, "url")) return href;
+ else if (String_.Eq(key, "html")) return html;
return Mustache_doc_itm_.Null_val;
}
public Mustache_doc_itm[] Get_subs(String key) {return Mustache_doc_itm_.Ary__empty;}
public static final Pgbnr_icon[] Ary_empty = new Pgbnr_icon[0];
+ public static final Bry_fmt fmt = Bry_fmt.New
+ ( Bry_.New_u8_nl_apos("")
+ , "name", "title"
+ );
}
diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java
index 68191157b..47d9f52ba 100644
--- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java
+++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_itm.java
@@ -16,32 +16,41 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
-import gplx.langs.mustaches.*;
+import gplx.langs.mustaches.*; import gplx.xowa.parsers.lnkis.*;
+import gplx.xowa.files.*;
public class Pgbnr_itm implements Mustache_doc_itm {
- public byte[] name, toc;
- private byte[] tooltip, title, originx, bannerfile, banner, srcset;
+ public Xoa_ttl banner_ttl;
+ public byte[] banner_img_src;
+ private int html_uid;
+ public byte[] toc;
+ public Xof_file_itm banner_file_itm;
+ private byte[] banner_anch_title, banner_hdr_text, originx, banner_anch_href, srcset;
private double data_pos_x, data_pos_y;
private int maxWidth;
private boolean bottomtoc, isHeadingOverrideEnabled;
private Pgbnr_icon[] icons;
- public void Init_from_wtxt(byte[] name, byte[] tooltip, byte[] title, boolean bottomtoc, byte[] toc, double data_pos_x, double data_pos_y, byte[] originx, Pgbnr_icon[] icons) {
- this.name = name;
- this.tooltip = tooltip; this.title = title; this.bottomtoc = bottomtoc; this.toc = toc; this.icons = icons;
+ public void Init_from_wtxt(Xoa_ttl banner_ttl, Xof_file_itm banner_file_itm, byte[] banner_anch_title, byte[] banner_hdr_text, boolean bottomtoc, byte[] toc, double data_pos_x, double data_pos_y, byte[] originx, Pgbnr_icon[] icons) {
+ this.banner_ttl = banner_ttl; this.banner_file_itm = banner_file_itm;
+ this.banner_anch_title = banner_anch_title; this.banner_hdr_text = banner_hdr_text; this.bottomtoc = bottomtoc; this.toc = toc; this.icons = icons;
this.data_pos_x = data_pos_x; this.data_pos_y = data_pos_y; this.originx = originx;
+ this.html_uid = banner_file_itm.Html_uid();
+ this.banner_img_src = banner_file_itm.Html_view_url().To_http_file_bry();
}
- public void Init_from_html(int maxWidth, byte[] bannerfile, byte[] banner, byte[] srcset, boolean isHeadingOverrideEnabled) {
+ public void Init_from_html(int maxWidth, byte[] banner_anch_href, byte[] banner_img_src, byte[] srcset, boolean isHeadingOverrideEnabled, byte[] toc) {
this.maxWidth = maxWidth;
- this.bannerfile = bannerfile;
- this.banner = banner;
+ this.banner_anch_href = banner_anch_href;
+ this.banner_img_src = banner_img_src;
this.srcset = srcset;
this.isHeadingOverrideEnabled = isHeadingOverrideEnabled;
+ this.toc = toc;
}
public byte[] Get_prop(String key) {
- if (String_.Eq(key, "title")) return title;
- else if (String_.Eq(key, "tooltip")) return tooltip;
- else if (String_.Eq(key, "bannerfile")) return bannerfile;
- else if (String_.Eq(key, "banner")) return banner;
- else if (String_.Eq(key, "srcset")) return srcset;
+ if (String_.Eq(key, "title")) return banner_hdr_text;
+ else if (String_.Eq(key, "tooltip")) return banner_anch_title;
+ else if (String_.Eq(key, "bannerfile")) return banner_anch_href;
+ else if (String_.Eq(key, "banner")) return banner_img_src;
+ else if (String_.Eq(key, "html_uid")) return Bry_.new_u8(gplx.xowa.htmls.Xoh_img_mgr.Str__html_uid + Int_.To_str(html_uid));
+ else if (String_.Eq(key, "srcset")) return srcset == null ? Bry_.Empty : Bry_.Empty;
else if (String_.Eq(key, "originx")) return originx;
else if (String_.Eq(key, "data-pos-x")) return Bry_.new_a7(Double_.To_str(data_pos_x));
else if (String_.Eq(key, "data-pos-y")) return Bry_.new_a7(Double_.To_str(data_pos_y));
diff --git a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java
index 9889126d0..9ba4f83b9 100644
--- a/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java
+++ b/400_xowa/src/gplx/xowa/xtns/pagebanners/Pgbnr_xtn_mgr.java
@@ -17,33 +17,77 @@ along with this program. If not, see .
*/
package gplx.xowa.xtns.pagebanners; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
import gplx.core.brys.*; import gplx.langs.mustaches.*; import gplx.xowa.parsers.*;
+import gplx.xowa.langs.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.nss.*;
+import gplx.xowa.htmls.core.htmls.*;
public class Pgbnr_xtn_mgr extends Xox_mgr_base implements Bfr_arg {
@Override public byte[] Xtn_key() {return Xtn_key_static;} public static final byte[] Xtn_key_static = Bry_.new_a7("pagebanner");
@Override public Xox_mgr Clone_new() {return new Pgbnr_xtn_mgr();}
- public Pgbnr_cfg Cfg() {return cfg;} private final Pgbnr_cfg cfg = new Pgbnr_cfg();
- public Mustache_tkn_itm Template_root() {
- if (template_root == null) {
- Mustache_tkn_parser parser = new Mustache_tkn_parser();
- template_root = parser.Parse(Template_dflt, 0, Template_dflt.length);
+ public Pgbnr_cfg Cfg() {return cfg;} private Pgbnr_cfg cfg;
+ public Mustache_tkn_itm Template_root() {return template_root;} private Mustache_tkn_itm template_root;
+ @Override public void Xtn_init_by_app(Xoae_app app) {}
+ @Override public void Xtn_init_by_wiki(Xowe_wiki wiki) {
+ // load config; TODO: load by file
+ boolean enabled = false, enable_heading_override = true, enable_default_banner = false;
+ int[] ns_ary = Int_.Ary(Xow_ns_.Tid__main, Xow_ns_.Tid__user);
+ int[] standard_sizes = new int[] {640, 1280, 2560};
+ int dflt_img_wdata_prop = 948; byte[] dflt_img_title = Bry_.new_a7("Pagebanner_default.jpg"); // www.wikidata.org/wiki/Property:P948
+ switch (wiki.Domain_tid()) {
+ case Xow_domain_tid_.Int__home:
+ enabled = true;
+ ns_ary = Int_.Ary(Xow_ns_.Tid__help);
+ break;
+ case Xow_domain_tid_.Int__wikivoyage:
+ switch (wiki.Lang().Lang_id()) {
+ case Xol_lang_stub_.Id_en:
+ case Xol_lang_stub_.Id_fr:
+ case Xol_lang_stub_.Id_zh:
+ enabled = true;
+ break;
+ case Xol_lang_stub_.Id_ru:
+ ns_ary = Int_.Ary(0, 1, 10, 11, 12, 13, 14, 15, 2, 2300, 2301, 2302, 2303, 2600, 3, 4, 5, 6, 7, 8, 828, 829, 9);
+ enabled = true;
+ break;
+ case Xol_lang_stub_.Id_uk:
+ ns_ary = Int_.Ary(Xow_ns_.Tid__main, Xow_ns_.Tid__user, Xow_ns_.Tid__project);
+ enabled = true;
+ break;
+ }
+ break;
+ case Xow_domain_tid_.Int__wikipedia:
+ switch (wiki.Lang().Lang_id()) {
+ case Xol_lang_stub_.Id_ca:
+ // enabled = enable_default_banner = true;
+ ns_ary = Int_.Ary(102, Xow_ns_.Tid__user);
+ break;
+ case Xol_lang_stub_.Id_en:
+ // enabled = enable_default_banner = true;
+ enable_heading_override = false;
+ break;
+ }
+ break;
}
- return template_root;
- } private Mustache_tkn_itm template_root;
- @Override public void Xtn_init_by_app(Xoae_app app) {
+ cfg = new Pgbnr_cfg(enabled, enable_heading_override, enable_default_banner, ns_ary, dflt_img_wdata_prop, dflt_img_title, standard_sizes);
+
+ if (!enabled) return;
+ // load template file;
+ byte[] template_data = Io_mgr.Instance.LoadFilBryOr(wiki.Appe().Fsys_mgr().Bin_any_dir().GenSubDir_nest("xowa", "xtns", "WikidataPageBanner", "templates", "banner.mustache"), Template_dflt);
+ Mustache_tkn_parser parser = new Mustache_tkn_parser();
+ template_root = parser.Parse(template_data, 0, template_data.length);
}
- public Bfr_arg Write_html(Xop_ctx pctx, Xoae_page page) {
- this.pctx = pctx; this.page = page;
+ public Bfr_arg Write_html(Xop_ctx pctx, Xoae_page page, Xoh_wtr_ctx hctx, byte[] src) {
+ this.pctx = pctx; this.page = page; this.hctx = hctx; this.src = src;
return this;
- } private Xop_ctx pctx; private Xoae_page page;
+ } private Xop_ctx pctx; private Xoae_page page; private Xoh_wtr_ctx hctx; private byte[] src;
public void Bfr_arg__add(Bry_bfr bfr) {
- Pgbnr_itm itm = page.Html_data().Xtn__pgbnr();
+ Pgbnr_itm itm = page.Html_data().Xtn_pgbnr();
if (itm == null) return;
- Pgbnr_func.Add_banner(bfr, pctx);
+ Pgbnr_func.Add_banner(bfr, pctx, hctx, src);
}
private static final byte[] Template_dflt = Bry_.New_u8_nl_apos
( ""
, "
"
, " {{#isHeadingOverrideEnabled}}
{{title}}
{{/isHeadingOverrideEnabled}}"
- , "
"
+ , "
"
, " {{#hasIcons}}"
, "
"
, " {{#icons}}"
diff --git a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java
index 4f2f99037..617512f99 100644
--- a/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java
+++ b/400_xowa/src/gplx/xowa/xtns/pfuncs/Pf_func_.java
@@ -25,12 +25,15 @@ public class Pf_func_ {
public static final byte Name_dlm = Byte_ascii.Colon;
public static byte[] Eval_arg_or(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, int self_args_len, int i, byte[] or) {
if (i >= self_args_len) return or;
- Bry_bfr bfr = Bry_bfr.new_();
Arg_nde_tkn nde = self.Args_get_by_idx(i);
+ Bry_bfr bfr = Bry_bfr.new_();
+ Eval_arg_or(bfr, ctx, src, caller, self, nde, or);
+ return bfr.To_bry_and_clear_and_trim();
+ }
+ public static void Eval_arg_or(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Arg_nde_tkn nde, byte[] or) {
nde.Key_tkn().Tmpl_evaluate(ctx, src, caller, bfr); // NOTE: must add key b/c parser functions do not have keys and some usages pass in xml_tkns; EX: {{#if|
= self_args_len) return or;
@@ -39,10 +42,6 @@ public class Pf_func_ {
nde.Val_tkn().Tmpl_evaluate(ctx, src, caller, bfr);
return bfr.To_bry_and_clear_and_trim();
}
- public static byte[] Eval_tkn(Bry_bfr bfr, Xop_ctx ctx, byte[] src, Xot_invk caller, Xop_tkn_itm tkn) {
- tkn.Tmpl_evaluate(ctx, src, caller, bfr);
- return bfr.To_bry_and_clear();
- }
private static final Number_parser lhs_parser = new Number_parser().Hex_enabled_(true), rhs_parser = new Number_parser().Hex_enabled_(true);
public static boolean Eq_(byte[] lhs, byte[] rhs) { // PATCH.PHP: php allows "003" == "3.0"; ASSUME: numbers are either int or int-like decimal; long, float, decimal not supported
int lhs_len = lhs.length, rhs_len = rhs.length;
diff --git a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java
index 0f66e3923..0f71859ee 100644
--- a/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java
+++ b/400_xowa/src/gplx/xowa/xtns/proofreadPage/Pp_pages_nde.java
@@ -22,6 +22,7 @@ import gplx.xowa.htmls.*; import gplx.xowa.htmls.core.htmls.*;
import gplx.xowa.wikis.nss.*;
import gplx.xowa.xtns.lst.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.xowa.parsers.*; import gplx.xowa.parsers.amps.*; import gplx.xowa.parsers.xndes.*; import gplx.xowa.parsers.htmls.*; import gplx.xowa.parsers.lnkis.*; import gplx.xowa.parsers.tmpls.*;
+import gplx.xowa.parsers.lnkis.files.*;
public class Pp_pages_nde implements Xox_xnde, Mwh_atr_itm_owner {
private boolean xtn_literal = false;
private Xop_root_tkn xtn_root;
@@ -363,8 +364,8 @@ public class Pp_pages_nde implements Xox_xnde, Mwh_atr_itm_owner {
}
private Xop_root_tkn Bld_root_nde(Bry_bfr page_bfr, Hash_adp_bry lst_page_regy, byte[] wikitext) {
Xop_ctx tmp_ctx = Xop_ctx.new_sub_page_(wiki, ctx, lst_page_regy);
- tmp_ctx.Page().Ttl_(ctx.Page().Ttl()); // NOTE: must set tmp_ctx.Ttl to ctx.Ttl; EX: Flatland and First World; DATE:2013-04-29
- tmp_ctx.Lnki().File_wkr_(null); // NOTE: set file_wkr to null, else items will be double-counted
+ tmp_ctx.Page().Ttl_(ctx.Page().Ttl()); // NOTE: must set tmp_ctx.Ttl to ctx.Ttl; EX: Flatland and First World; DATE:2013-04-29
+ tmp_ctx.Lnki().File_logger_(Xop_file_logger_.Noop); // NOTE: set file_wkr to null, else items will be double-counted
tmp_ctx.Parse_tid_(Xop_parser_.Parse_tid_tmpl);
Xop_parser tmp_parser = Xop_parser.new_(wiki, wiki.Parser_mgr().Main().Tmpl_lxr_mgr(), wiki.Parser_mgr().Main().Wtxt_lxr_mgr());
Xop_root_tkn rv = tmp_ctx.Tkn_mkr().Root(wikitext);
diff --git a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java
index c3f172a87..d46b52b42 100644
--- a/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java
+++ b/400_xowa/src/gplx/xowa/xtns/wdatas/Wdata_wiki_mgr.java
@@ -142,6 +142,15 @@ public class Wdata_wiki_mgr implements GfoEvObj, GfoInvkAble {
}
return qids[qid_idx];
}
+ public byte[] Get_claim_or(Xow_domain_itm domain, Xoa_ttl page_ttl, int pid, byte[] or) {
+ byte[] qid = this.Qids_get(domain.Abrv_wm(), page_ttl); if (qid == null) return or;
+ Wdata_doc wdoc = this.Pages_get(qid); if (wdoc == null) return or;
+ Wdata_claim_grp claim_grp = wdoc.Claim_list_get(pid); if (claim_grp == null || claim_grp.Len() == 0) return or;
+ Wdata_claim_itm_core claim_itm = claim_grp.Get_at(0);
+ prop_val_visitor.Init(tmp_bfr, hwtr_mgr.Msgs(), domain.Lang_orig_key());
+ claim_itm.Welcome(prop_val_visitor);
+ return tmp_bfr.To_bry_and_clear();
+ } private final Bry_bfr tmp_bfr = Bry_bfr.new_(32);
public void Resolve_to_bfr(Bry_bfr bfr, Wdata_claim_grp prop_grp, byte[] lang_key) {
Hwtr_mgr_assert();
int len = prop_grp.Len();
diff --git a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa
index 4d02f463a..880196eaa 100644
Binary files a/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa and b/tst/400_xowa/root/wiki/en.wikipedia.org/en.wikipedia.org-text.xowa differ