mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v1.7.1.1
This commit is contained in:
@@ -26,21 +26,15 @@ public class Pf_str_case_tst {
|
||||
@Test public void Uc() {fxt.Test_parse_tmpl_str_test("{{uc:abc}}" , "{{test}}", "ABC");}
|
||||
@Test public void Uc_first() {fxt.Test_parse_tmpl_str_test("{{ucfirst:abc}}" , "{{test}}", "Abc");}
|
||||
@Test public void Multi_byte() {// NOTE: separate test b/c will sometimes fail in suite
|
||||
Xol_lang lang = fxt.Wiki().Lang();
|
||||
lang.Case_mgr().Clear();
|
||||
lang.Case_mgr().Add_bulk(Xol_case_itm_.Universal);
|
||||
fxt.Wiki().Lang().Case_mgr_utf8_();
|
||||
fxt.Test_parse_tmpl_str_test("{{uc:ĉ}}" , "{{test}}", "Ĉ"); // upper all
|
||||
}
|
||||
@Test public void Multi_byte_asymmetric() {
|
||||
Xol_lang lang = fxt.Wiki().Lang();
|
||||
lang.Case_mgr().Clear();
|
||||
lang.Case_mgr().Add_bulk(Xol_case_itm_.Universal);
|
||||
fxt.Wiki().Lang().Case_mgr_utf8_();
|
||||
fxt.Test_parse_tmpl_str_test("{{uc:ⱥ}}" , "{{test}}", "Ⱥ"); // handle multi-byte asymmetry (lc is 3 bytes; uc is 2 bytes)
|
||||
}
|
||||
@Test public void Multi_byte_first() {
|
||||
Xol_lang lang = fxt.Wiki().Lang();
|
||||
lang.Case_mgr().Clear();
|
||||
lang.Case_mgr().Add_bulk(Xol_case_itm_.Universal);
|
||||
fxt.Test_parse_tmpl_str_test("{{ucfirst:провинция}}" , "{{test}}", "Провинция"); // upper first; DATE:2014-02-04
|
||||
@Test public void Multi_byte_first() {
|
||||
fxt.Wiki().Lang().Case_mgr_utf8_();
|
||||
fxt.Test_parse_tmpl_str_test("{{ucfirst:провинция}}" , "{{test}}", "Провинция"); // upper first; DATE:2014-02-04
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,13 +35,10 @@ public class Pf_tag extends Pf_func_base {
|
||||
tmp.Add_byte(Byte_ascii.Lt).Add(tag_name);
|
||||
if (args_len > 1) {
|
||||
for (int i = 1; i < args_len; i++) {
|
||||
byte[] arg = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, args_len, i);
|
||||
if (arg.length == 0) continue; // if atr is empty, skip; see test
|
||||
byte[] arg = Pf_func_.Eval_arg_or_empty(ctx, src, caller, self, args_len, i); // NOTE: must evaluate arg; don't try to parse arg_tkn's key / val separately; EX:{{#tag:pre|a|{{#switch:a|a=id}}=c}}
|
||||
if (arg.length == 0) continue; // skip empty atrs
|
||||
tmp.Add_byte(Byte_ascii.Space);
|
||||
if (!AddHtmlArg(arg, tmp)) {
|
||||
ctx.Msg_log().Add_itm_none(Xop_tag_log.Invalid, arg, 0, arg.length);
|
||||
tmp.Clear();
|
||||
}
|
||||
Pf_tag_kv_bldr.Add_arg_as_html_atr(arg, tmp);
|
||||
}
|
||||
}
|
||||
tmp.Add_byte(Byte_ascii.Gt);
|
||||
@@ -54,23 +51,47 @@ public class Pf_tag extends Pf_func_base {
|
||||
}
|
||||
finally {tmp.Mkr_rls();}
|
||||
}
|
||||
private boolean AddHtmlArg(byte[] src, Bry_bfr tmp) {
|
||||
ParseKeyVal(src, kv_bldr);
|
||||
//if (!kv_bldr.Valid()) return false;
|
||||
if (kv_bldr.Key_bgn() != -1)
|
||||
tmp.Add(Bry_.Mid(src, kv_bldr.Key_bgn(), kv_bldr.KeyEnd()));
|
||||
if (kv_bldr.Val_bgn() != -1) {
|
||||
if (kv_bldr.Key_bgn() != -1) {
|
||||
tmp.Add_byte(Byte_ascii.Eq);
|
||||
public static final int
|
||||
Xtag_len = 27 // <xtag_bgn id='1234567890'/>
|
||||
, Xtag_bgn = 14 // <xtag_bgn id='
|
||||
;
|
||||
public static final byte[]
|
||||
Xtag_bgn_lhs = Bry_.new_ascii_("<xtag_bgn id='")
|
||||
, Xtag_end_lhs = Bry_.new_ascii_("<xtag_end id='")
|
||||
, Xtag_rhs = Bry_.new_ascii_("'/>")
|
||||
;
|
||||
}
|
||||
class Pf_tag_kv_bldr {
|
||||
public int Key_bgn() {return key_bgn;} private int key_bgn;
|
||||
public int KeyEnd() {return key_end;} private int key_end;
|
||||
public Pf_tag_kv_bldr Key_rng_(int bgn, int end) {key_bgn = bgn; key_end = end; return this;}
|
||||
public int Val_bgn() {return val_bgn;} private int val_bgn;
|
||||
public int Val_end() {return val_end;} private int val_end;
|
||||
public Pf_tag_kv_bldr Val_rng_(int bgn, int end) {val_bgn = bgn; val_end = end; return this;}
|
||||
public boolean Valid() {
|
||||
return key_bgn != -1 && key_end != -1 && val_bgn != -1 && val_end != -1 && key_bgn <= key_end && val_bgn <= val_end;
|
||||
}
|
||||
public void Clear() {
|
||||
key_bgn = key_end = val_bgn = val_end = -1;
|
||||
}
|
||||
public static void Add_arg_as_html_atr(byte[] src, Bry_bfr tmp) {
|
||||
synchronized (kv_bldr) {
|
||||
ParseKeyVal(src, kv_bldr);
|
||||
if (kv_bldr.Val_bgn() == -1) return; // ignore atrs with empty vals: EX:{{#tag:ref||group=}} PAGE:ru.w:Колчак,_Александр_Васильевич DATE:2014-07-03
|
||||
if (kv_bldr.Key_bgn() != -1)
|
||||
tmp.Add(Bry_.Mid(src, kv_bldr.Key_bgn(), kv_bldr.KeyEnd()));
|
||||
if (kv_bldr.Val_bgn() != -1) {
|
||||
if (kv_bldr.Key_bgn() != -1) {
|
||||
tmp.Add_byte(Byte_ascii.Eq);
|
||||
}
|
||||
tmp.Add_byte(Byte_ascii.Quote);
|
||||
tmp.Add(Bry_.Mid(src, kv_bldr.Val_bgn(), kv_bldr.Val_end()));
|
||||
tmp.Add_byte(Byte_ascii.Quote);
|
||||
}
|
||||
tmp.Add_byte(Byte_ascii.Quote);
|
||||
tmp.Add(Bry_.Mid(src, kv_bldr.Val_bgn(), kv_bldr.Val_end()));
|
||||
tmp.Add_byte(Byte_ascii.Quote);
|
||||
kv_bldr.Clear();
|
||||
}
|
||||
kv_bldr.Clear();
|
||||
return true;
|
||||
} private KeyValBldr kv_bldr = new KeyValBldr();
|
||||
private static void ParseKeyVal(byte[] src, KeyValBldr kv_bldr) {
|
||||
}
|
||||
private static void ParseKeyVal(byte[] src, Pf_tag_kv_bldr kv_bldr) {
|
||||
int itm_bgn = -1, itm_end = -1, src_len = src.length;
|
||||
boolean mode_is_key = true;
|
||||
for (int i = 0; i < src_len; i++) {
|
||||
@@ -101,27 +122,5 @@ public class Pf_tag extends Pf_func_base {
|
||||
if (itm_end == -1) itm_end = src_len;
|
||||
kv_bldr.Val_rng_(itm_bgn, itm_end);
|
||||
}
|
||||
public static final int
|
||||
Xtag_len = 27 // <xtag_bgn id='1234567890'/>
|
||||
, Xtag_bgn = 14 // <xtag_bgn id='
|
||||
;
|
||||
public static final byte[]
|
||||
Xtag_bgn_lhs = Bry_.new_ascii_("<xtag_bgn id='")
|
||||
, Xtag_end_lhs = Bry_.new_ascii_("<xtag_end id='")
|
||||
, Xtag_rhs = Bry_.new_ascii_("'/>")
|
||||
;
|
||||
}
|
||||
class KeyValBldr {
|
||||
public int Key_bgn() {return key_bgn;} private int key_bgn;
|
||||
public int KeyEnd() {return key_end;} private int key_end;
|
||||
public KeyValBldr Key_rng_(int bgn, int end) {key_bgn = bgn; key_end = end; return this;}
|
||||
public int Val_bgn() {return val_bgn;} private int val_bgn;
|
||||
public int Val_end() {return val_end;} private int val_end;
|
||||
public KeyValBldr Val_rng_(int bgn, int end) {val_bgn = bgn; val_end = end; return this;}
|
||||
public boolean Valid() {
|
||||
return key_bgn != -1 && key_end != -1 && val_bgn != -1 && val_end != -1 && key_bgn <= key_end && val_bgn <= val_end;
|
||||
}
|
||||
public void Clear() {
|
||||
key_bgn = key_end = val_bgn = val_end = -1;
|
||||
}
|
||||
private static Pf_tag_kv_bldr kv_bldr = new Pf_tag_kv_bldr();
|
||||
}
|
||||
|
||||
@@ -17,14 +17,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa; import gplx.*;
|
||||
import org.junit.*;
|
||||
public class Pf_tag_tst {
|
||||
private Xop_fxt fxt = new Xop_fxt();
|
||||
@Before public void init() {fxt.Reset();}
|
||||
public class Pf_tag_tst {
|
||||
@Before public void init() {fxt.Reset();} private Xop_fxt fxt = new Xop_fxt();
|
||||
@Test public void Basic() {fxt.Test_html_full_str("{{#tag:pre|a|id=b|style=c}}" , "<pre id=\"b\" style=\"c\">a</pre>");}
|
||||
// @Test public void Missing_val() {fxt.ini_Msg(Mwl_tag_rsc._.Invalid).Test_parse_tmpl_str_test("{{#tag:pre|a|id=}}" , "{{test}}" , "");} // see {{Reflist|colwidth=30em}} -> <ref group=a>a</ref>{{#tag:references||group=}} -> ""
|
||||
@Test public void Atr2_empty() {fxt.Test_html_full_str("{{#tag:pre|a|id=b|}}" , "<pre id=\"b\">a</pre>");} // see {{Reflist|colwidth=30em}} -> <ref group=a>a</ref>{{#tag:references||group=a|}} -> "<references group=a/>"
|
||||
@Test public void Val_apos() {fxt.Test_html_full_str("{{#tag:pre|a|id='b'}}" , "<pre id=\"b\">a</pre>");}
|
||||
@Test public void Val_quote() {fxt.Test_html_full_str("{{#tag:pre|a|id=\"b\"}}" , "<pre id=\"b\">a</pre>");}
|
||||
@Test public void Val_empty() {fxt.Test_html_full_str("{{#tag:pre|a|id=}}" , "<pre>a</pre>");} // PURPOSE: ignore atrs with no val; EX:{{#ref||group=}} PAGE:ru.w:Колчак,_Александр_Васильевич; DATE:2014-07-03
|
||||
@Test public void Tmpl() {fxt.Test_html_full_str("{{#tag:pre|a|{{#switch:a|a=id}}=c}}" , "<pre id=\"c\">a</pre>");} // PURPOSE: args must be evaluated
|
||||
@Test public void Ws_all() {fxt.Test_html_full_str("{{#tag:pre|a| id = b }}" , "<pre id=\"b\">a</pre>");}
|
||||
@Test public void Ws_quoted() {fxt.Test_html_full_str("{{#tag:pre|a| id = ' b ' }}" , "<pre id=\"_b_\">a</pre>");}
|
||||
@Test public void Err_bad_key() {fxt.Test_html_full_str("{{#tag:pre|a|id=val|b}}" , "<pre id=\"val\">a</pre>");} // PURPOSE: b was failing b/c id was larger and key_end set to 4 (whereas b was len=1)
|
||||
|
||||
@@ -31,7 +31,9 @@ public class Pf_url_ns_tst {
|
||||
@Test public void Ns_Image() {fxt.Test_parse_tmpl_str_test("{{ns:Image}}" , "{{test}}", "File");}
|
||||
@Test public void Ns_Templatex() {fxt.Test_parse_tmpl_str_test("{{ns:Templatex}}" , "{{test}}", "");}
|
||||
@Test public void Ns_Talk() { // PURPOSE: non-English wikis may have parameterized Project Talk ($1 talk); swap out with ns:4; REF.MW: Language.php!fixVariableInNamespace
|
||||
fxt.Wiki().Ns_mgr_(new Xow_ns_mgr().Add_new(4, "wiki").Add_new(5, "$1 talk").Add_new(10, "Template").Init());
|
||||
Xow_ns_mgr ns_mgr = new Xow_ns_mgr(gplx.xowa.langs.cases.Xol_case_mgr_.Ascii());
|
||||
ns_mgr.Add_new(4, "wiki").Add_new(5, "$1 talk").Add_new(10, "Template").Init();
|
||||
fxt.Wiki().Ns_mgr_(ns_mgr);
|
||||
fxt.Test_parse_tmpl_str_test("{{ns:5}}" , "{{test}}", "wiki talk");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ class Pf_url_urlencode extends Pf_func_base { // EX: {{urlencode:a b}} -> a+b
|
||||
@Override public void Func_evaluate(Xop_ctx ctx, byte[] src, Xot_invk caller, Xot_invk self, Bry_bfr bb) {
|
||||
byte[] val_ary = Eval_argx(ctx, src, caller, self); if (val_ary == Bry_.Empty) return;
|
||||
ctx.App().Url_converter_url().Encode(urlEncodeBfr, val_ary);
|
||||
bb.Add_bfr(urlEncodeBfr);
|
||||
bb.Add_bfr_and_preserve(urlEncodeBfr);
|
||||
urlEncodeBfr.Clear();
|
||||
} private Bry_bfr urlEncodeBfr = Bry_bfr.new_(128);
|
||||
@Override public int Id() {return Xol_kwd_grp_.Id_url_urlencode;}
|
||||
|
||||
Reference in New Issue
Block a user