mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v2.11.3.1
This commit is contained in:
@@ -28,7 +28,7 @@ public class Mwh_atr_parser { // REF.MW:Sanitizer.php|decodeTagAttributes;MW_ATT
|
||||
private byte qte_byte = Byte_ascii.Null;
|
||||
private boolean key_bfr_on = false, val_bfr_on = false, ws_is_before_val = false, qte_closed = false;
|
||||
private int nde_uid, nde_tid;
|
||||
public Bry_obj_ref Bry_obj() {return bry_ref;} private final Bry_obj_ref bry_ref = Bry_obj_ref.null_();
|
||||
public Bry_obj_ref Bry_obj() {return bry_ref;} private final Bry_obj_ref bry_ref = Bry_obj_ref.New_empty();
|
||||
public int Nde_end_tid() {return nde_end_tid;} private int nde_end_tid;
|
||||
public int Parse(Mwh_atr_wkr wkr, int nde_uid, int nde_tid, byte[] src, int src_bgn, int src_end) {
|
||||
this.nde_uid = nde_uid; this.nde_tid = nde_tid;
|
||||
@@ -434,16 +434,16 @@ public class Mwh_atr_parser { // REF.MW:Sanitizer.php|decodeTagAttributes;MW_ATT
|
||||
key_bfr_on = val_bfr_on = ws_is_before_val = qte_closed = false;
|
||||
}
|
||||
public int Xnde_find_gt_find(byte[] src, int pos, int end) {
|
||||
bry_ref.Val_(null);
|
||||
bry_ref.Val_(Bry_.Empty);
|
||||
byte b = src[pos];
|
||||
if (b == Byte_ascii.Slash && pos + 1 < end) { // if </ move pos to after /
|
||||
++pos;
|
||||
b = src[pos];
|
||||
}
|
||||
int gt_pos = Bry_find_.Find_fwd(src, Byte_ascii.Gt, pos, end); if (gt_pos == Bry_find_.Not_found) return Bry_find_.Not_found;
|
||||
byte[] bry = (byte[])xnde_hash.Get_by_mid(src, pos, gt_pos);
|
||||
byte[] bry = (byte[])xnde_hash.Get_by_mid(src, pos, gt_pos); if (bry == null) return Bry_find_.Not_found;
|
||||
bry_ref.Val_(bry);
|
||||
return bry == null ? Bry_find_.Not_found : bry.length + pos;
|
||||
return bry.length + pos;
|
||||
}
|
||||
private int Xnde_find_gt(byte[] src, int lt_pos, int end) {
|
||||
int pos = lt_pos + 1; if (pos == end) return Bry_find_.Not_found;
|
||||
|
||||
@@ -16,7 +16,7 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.parsers.lnkis; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
|
||||
public class Xop_lnki_align_h {
|
||||
public class Xop_lnki_align_h_ {
|
||||
public static final byte Null = 0, None = 1, Left = 2, Center = 3, Right = 4;
|
||||
public static final byte[][] Html_names = new byte[][]
|
||||
{ Object_.Bry__null
|
||||
@@ -31,7 +31,8 @@ public class Xop_lnki_align_h {
|
||||
.Add_str_byte("tcenter" , Center)
|
||||
.Add_str_byte("tright" , Right)
|
||||
;
|
||||
public static byte[] To_bry(int v) {return Html_names[v];}
|
||||
}
|
||||
class Xop_lnki_align_v {
|
||||
class Xop_lnki_align_v_ {
|
||||
public static final byte None = 0, Top = 1, Middle = 2, Bottom = 4, Super = 8, Sub = 16, TextTop = 32, TextBottom = 64, Baseline = 127;
|
||||
}
|
||||
@@ -28,7 +28,7 @@ public class Xop_lnki_tkn extends Xop_tkn_itm_base {
|
||||
public int Tail_bgn() {return tail_bgn;} public Xop_lnki_tkn Tail_bgn_(int v) {tail_bgn = v; return this;} private int tail_bgn = -1;
|
||||
public int Tail_end() {return tail_end;} public Xop_lnki_tkn Tail_end_(int v) {tail_end = v; return this;} private int tail_end = -1;
|
||||
public byte Border() {return border;} public Xop_lnki_tkn Border_(byte v) {border = v; return this;} private byte border = Bool_.__byte;
|
||||
public byte Align_h() {return align_h;} public Xop_lnki_tkn Align_h_(byte v) {if (align_h == Xop_lnki_align_h.Null) align_h = v; return this;} private byte align_h = Xop_lnki_align_h.Null;
|
||||
public byte Align_h() {return align_h;} public Xop_lnki_tkn Align_h_(byte v) {if (align_h == Xop_lnki_align_h_.Null) align_h = v; return this;} private byte align_h = Xop_lnki_align_h_.Null;
|
||||
public byte Align_v() {return align_v;} public Xop_lnki_tkn Align_v_(byte v) {align_v = v; return this;} private byte align_v = Byte_.Max_value_127;
|
||||
public int W() {return w;} public Xop_lnki_tkn W_(int v) {w = v; return this;} private int w = Width_null;
|
||||
public int H() {return h;} public Xop_lnki_tkn H_(int v) {h = v; return this;} private int h = Height_null;
|
||||
|
||||
@@ -55,7 +55,7 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
|
||||
switch (lnki.Ns_id()) {
|
||||
case Xow_ns_.Tid__file:
|
||||
if ( Xop_lnki_type.Id_is_thumbable(lnki.Lnki_type()) // thumbs produce <div> cancels pre
|
||||
|| lnki.Align_h() != Xop_lnki_align_h.Null // halign (left, right, none) also produces <div>; DATE:2014-02-17
|
||||
|| lnki.Align_h() != Xop_lnki_align_h_.Null // halign (left, right, none) also produces <div>; DATE:2014-02-17
|
||||
)
|
||||
ctx.Para().Process_block_lnki_div();
|
||||
lnki_is_file = true;
|
||||
@@ -102,17 +102,17 @@ public class Xop_lnki_wkr implements Xop_ctx_wkr, Xop_arg_wkr {
|
||||
case Xop_lnki_arg_parser.Tid_thumb: lnki.Lnki_type_(Xop_lnki_type.Id_thumb); break;
|
||||
case Xop_lnki_arg_parser.Tid_frame: lnki.Lnki_type_(Xop_lnki_type.Id_frame); break;
|
||||
case Xop_lnki_arg_parser.Tid_frameless: lnki.Lnki_type_(Xop_lnki_type.Id_frameless); break;
|
||||
case Xop_lnki_arg_parser.Tid_left: lnki.Align_h_(Xop_lnki_align_h.Left); break;
|
||||
case Xop_lnki_arg_parser.Tid_center: lnki.Align_h_(Xop_lnki_align_h.Center); break;
|
||||
case Xop_lnki_arg_parser.Tid_right: lnki.Align_h_(Xop_lnki_align_h.Right); break;
|
||||
case Xop_lnki_arg_parser.Tid_top: lnki.Align_v_(Xop_lnki_align_v.Top); break;
|
||||
case Xop_lnki_arg_parser.Tid_middle: lnki.Align_v_(Xop_lnki_align_v.Middle); break;
|
||||
case Xop_lnki_arg_parser.Tid_bottom: lnki.Align_v_(Xop_lnki_align_v.Bottom); break;
|
||||
case Xop_lnki_arg_parser.Tid_super: lnki.Align_v_(Xop_lnki_align_v.Super); break;
|
||||
case Xop_lnki_arg_parser.Tid_sub: lnki.Align_v_(Xop_lnki_align_v.Sub); break;
|
||||
case Xop_lnki_arg_parser.Tid_text_top: lnki.Align_v_(Xop_lnki_align_v.TextTop); break;
|
||||
case Xop_lnki_arg_parser.Tid_text_bottom: lnki.Align_v_(Xop_lnki_align_v.TextBottom); break;
|
||||
case Xop_lnki_arg_parser.Tid_baseline: lnki.Align_v_(Xop_lnki_align_v.Baseline); break;
|
||||
case Xop_lnki_arg_parser.Tid_left: lnki.Align_h_(Xop_lnki_align_h_.Left); break;
|
||||
case Xop_lnki_arg_parser.Tid_center: lnki.Align_h_(Xop_lnki_align_h_.Center); break;
|
||||
case Xop_lnki_arg_parser.Tid_right: lnki.Align_h_(Xop_lnki_align_h_.Right); break;
|
||||
case Xop_lnki_arg_parser.Tid_top: lnki.Align_v_(Xop_lnki_align_v_.Top); break;
|
||||
case Xop_lnki_arg_parser.Tid_middle: lnki.Align_v_(Xop_lnki_align_v_.Middle); break;
|
||||
case Xop_lnki_arg_parser.Tid_bottom: lnki.Align_v_(Xop_lnki_align_v_.Bottom); break;
|
||||
case Xop_lnki_arg_parser.Tid_super: lnki.Align_v_(Xop_lnki_align_v_.Super); break;
|
||||
case Xop_lnki_arg_parser.Tid_sub: lnki.Align_v_(Xop_lnki_align_v_.Sub); break;
|
||||
case Xop_lnki_arg_parser.Tid_text_top: lnki.Align_v_(Xop_lnki_align_v_.TextTop); break;
|
||||
case Xop_lnki_arg_parser.Tid_text_bottom: lnki.Align_v_(Xop_lnki_align_v_.TextBottom); break;
|
||||
case Xop_lnki_arg_parser.Tid_baseline: lnki.Align_v_(Xop_lnki_align_v_.Baseline); break;
|
||||
case Xop_lnki_arg_parser.Tid_class: lnki.Lnki_cls_(Xop_lnki_wkr_.Val_extract(src, arg)); break;
|
||||
case Xop_lnki_arg_parser.Tid_alt: lnki.Alt_tkn_(arg);
|
||||
lnki.Alt_tkn().Tkn_ini_pos(false, arg.Src_bgn(), arg.Src_end());
|
||||
|
||||
@@ -54,8 +54,8 @@ public class Xop_lnki_wkr__basic_tst {
|
||||
fxt.Test_parse_page_wiki("[[Image:a]]" , fxt.tkn_lnki_().Ns_id_(Xow_ns_.Tid__file).Trg_tkn_(fxt.tkn_arg_val_(fxt.tkn_txt_(2, 7), fxt.tkn_colon_(7), fxt.tkn_txt_(8, 9))));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|border]]" , fxt.tkn_lnki_().Border_(Bool_.Y_byte));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|thumb]]" , fxt.tkn_lnki_().ImgType_(Xop_lnki_type.Id_thumb));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|left]]" , fxt.tkn_lnki_().HAlign_(Xop_lnki_align_h.Left));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|top]]" , fxt.tkn_lnki_().VAlign_(Xop_lnki_align_v.Top));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|left]]" , fxt.tkn_lnki_().HAlign_(Xop_lnki_align_h_.Left));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|top]]" , fxt.tkn_lnki_().VAlign_(Xop_lnki_align_v_.Top));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|10px]]" , fxt.tkn_lnki_().Width_(10).Height_(-1));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|20x30px]]" , fxt.tkn_lnki_().Width_(20).Height_(30));
|
||||
fxt.Test_parse_page_wiki("[[Image:a|alt=b]]" , fxt.tkn_lnki_().Alt_tkn_(fxt.tkn_arg_nde_().Key_tkn_(fxt.tkn_arg_itm_(fxt.tkn_txt_(10, 13))).Val_tkn_(fxt.tkn_arg_itm_(fxt.tkn_txt_(14, 15)))));
|
||||
|
||||
@@ -16,6 +16,7 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.parsers.tmpls; import gplx.*; import gplx.xowa.*; import gplx.xowa.parsers.*;
|
||||
import gplx.xowa.wikis.nss.*;
|
||||
public class Xot_defn_tmpl_ {
|
||||
public static Xot_invk CopyNew(Xop_ctx ctx, Xot_defn_tmpl orig_defn, Xot_invk orig, Xot_invk caller, byte[] src, byte[] frame_ttl) { // SEE:NOTE_1
|
||||
Xop_tkn_mkr tkn_mkr = ctx.Tkn_mkr();
|
||||
@@ -23,7 +24,7 @@ public class Xot_defn_tmpl_ {
|
||||
Xowe_wiki wiki = ctx.Wiki();
|
||||
Xot_invk_temp rv = new Xot_invk_temp(orig.Defn_tid(), orig_src, orig.Name_tkn(), caller.Src_bgn(), caller.Src_end());
|
||||
frame_ttl = wiki.Lang().Case_mgr().Case_reuse_1st_upper(frame_ttl); // NOTE: always uppercase 1st; EX:{{navbox -> "Template:Navbox"; PAGE:en.w:Achilles DATE:2014-06-21
|
||||
rv.Frame_ttl_(wiki.Ns_mgr().Ns_template().Gen_ttl(Xoa_ttl.Replace_unders(frame_ttl))); // NOTE: always prepend "Template:" to frame_ttl; DATE:2014-06-13; NOTE: always use spaces; DATE:2014-08-14
|
||||
rv.Frame_ttl_(Bry_.Add(Xow_ns_.Bry__template_w_colon, Xoa_ttl.Replace_unders(frame_ttl))); // NOTE: always prepend "Template:" to frame_ttl; DATE:2014-06-13; always use spaces; DATE:2014-08-14; always use English "Template"; DATE:2015-11-09
|
||||
int orig_args_len = orig.Args_len();
|
||||
boolean tmpl_args_parsing_orig = ctx.Tmpl_args_parsing();
|
||||
ctx.Tmpl_args_parsing_(true);
|
||||
|
||||
@@ -309,7 +309,7 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
|
||||
if (argx_ary != Bry_.Empty) defn_func.Argx_dat_(argx_ary);
|
||||
defn_func.Eval_argx(ctx, src, caller, invk);
|
||||
if (defn_func_id == Xol_kwd_grp_.Id_invoke) // NOTE: if #invoke, set frame_ttl to argx, not name; EX:{{#invoke:A}}
|
||||
invk.Frame_ttl_(ctx.Wiki().Ns_mgr().Ns_module().Gen_ttl(Xoa_ttl.Replace_unders(defn_func.Argx_dat()))); // NOTE: always prepend "Module:" to frame_ttl; DATE:2014-06-13; NOTE: always use spaces; DATE:2014-08-14
|
||||
invk.Frame_ttl_(Bry_.Add(Xow_ns_.Bry__module_w_colon, Xoa_ttl.Replace_unders(defn_func.Argx_dat()))); // NOTE: always prepend "Module:" to frame_ttl; DATE:2014-06-13; NOTE: always use spaces; DATE:2014-08-14; always use canonical English "Module"; DATE:2015-11-09
|
||||
Bry_bfr bfr_func = Bry_bfr.new_();
|
||||
defn_func.Func_evaluate(ctx, src, caller, invk, bfr_func);
|
||||
if (caller.Rslt_is_redirect()) // do not prepend if page is redirect; EX:"#REDIRECT" x> "\n#REDIRECT" DATE:2014-07-11
|
||||
@@ -377,7 +377,8 @@ public class Xot_invk_tkn extends Xop_tkn_itm_base implements Xot_invk {
|
||||
byte old_parse_tid = ctx.Parse_tid(); // NOTE: reusing ctxs is a bad idea; will change Parse_tid and cause strange errors; however, keeping for PERF reasons
|
||||
Xow_ns ns_tmpl = wiki.Ns_mgr().Ns_template();
|
||||
rv = wiki.Parser_mgr().Main().Parse_text_to_defn_obj(ctx, ctx.Tkn_mkr(), ns_tmpl, name_ary, tmpl_page_bry);
|
||||
byte[] frame_ttl = tmpl_page_itm.Ttl().Full_txt(); // NOTE: (1) must have ns (Full); (2) must be txt (space, not underscore); EX:Template:Location map+; DATE:2014-08-22
|
||||
Xoa_ttl tmpl_page_ttl = tmpl_page_itm.Ttl();
|
||||
byte[] frame_ttl = Bry_.Add(Xow_ns_canonical_.To_canonical_or_local_as_bry(tmpl_page_ttl.Ns()), Byte_ascii.Colon_bry, tmpl_page_ttl.Page_txt()); // NOTE: (1) must have ns (Full); (2) must be txt (space, not underscore); EX:Template:Location map+; DATE:2014-08-22; (3) must be canonical; DATE:2015-11-09
|
||||
rv.Frame_ttl_(frame_ttl); // set defn's frame_ttl; needed for redirect_trg; PAGE:en.w:Statutory_city; DATE:2014-08-22
|
||||
ctx.Parse_tid_(old_parse_tid);
|
||||
wiki.Cache_mgr().Defn_cache().Add(rv, ns_tmpl.Case_match());
|
||||
|
||||
@@ -49,7 +49,10 @@ public class Xop_redirect_mgr {
|
||||
if (ttl_bgn == Bry_find_.Not_found) return Redirect_null_ttl;
|
||||
ttl_bgn += Xop_tkn_.Lnki_bgn.length;
|
||||
int ttl_end = Bry_find_.Find_fwd(src, Xop_tkn_.Lnki_end, ttl_bgn); if (ttl_end == Bry_find_.Not_found) return Redirect_null_ttl;
|
||||
int pipe_pos = Bry_find_.Find_fwd(src, Byte_ascii.Pipe, ttl_bgn); if (pipe_pos != Bry_find_.Not_found) ttl_end = pipe_pos; // if pipe exists, end ttl at pipe; PAGE:da.w:Middelaldercentret; DATE:2015-11-06
|
||||
int pipe_pos = Bry_find_.Find_fwd(src, Byte_ascii.Pipe, ttl_bgn);
|
||||
if ( pipe_pos != Bry_find_.Not_found // if pipe exists; PAGE:da.w:Middelaldercentret; DATE:2015-11-06
|
||||
&& pipe_pos < ttl_end) // and pipe is before ]]; do not take pipe from next lnki; PAGE:en.w:Template:pp-semi; DATE:2015-11-14
|
||||
ttl_end = pipe_pos; // end ttl at pipe
|
||||
byte[] redirect_bry = Bry_.Mid(src, ttl_bgn, ttl_end);
|
||||
redirect_bry = url_decoder.Decode(redirect_bry); // NOTE: url-decode links; PAGE: en.w:Watcher_(Buffy_the_Vampire_Slayer); DATE:2014-08-18
|
||||
return Xoa_ttl.parse(wiki, redirect_bry);
|
||||
|
||||
@@ -43,6 +43,9 @@ public class Xop_redirect_mgr_tst {
|
||||
@Test public void State_collapsed() { // PURPOSE: state=collapsed broke redirects; PAGE:da.w:Middelaldercentret; DATE:2015-11-06
|
||||
fxt.Test_redirect("#REDIRECT [[Template:A|state=collapsed]]", "Template:A");
|
||||
}
|
||||
@Test public void Parse_1st_link_only() { // PURPOSE: do not take pipe from 2nd lnki; PAGE:en.w:Template:pp-semi; DATE:2015-11-14
|
||||
fxt.Test_redirect("#REDIRECT [[Template:A]][[Category:B|b]]", "Template:A");
|
||||
}
|
||||
}
|
||||
class Xop_redirect_mgr_fxt {
|
||||
private Xop_fxt fxt = new Xop_fxt();
|
||||
|
||||
Reference in New Issue
Block a user