mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
Embeddable: Create core dbs in proper subdirectory
This commit is contained in:
@@ -13,41 +13,3 @@ 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.langs; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.xowa.apps.fsys.*; import gplx.xowa.apps.gfs.*;
|
||||
import gplx.xowa.langs.bldrs.*;
|
||||
public class Xoa_lang_mgr implements Gfo_invk {
|
||||
private final Ordered_hash hash = Ordered_hash_.New_bry();
|
||||
private final Xobc_utl_make_lang mw_converter;
|
||||
public Xoa_lang_mgr(Xoa_app app, Xoa_gfs_mgr gfs_mgr) {
|
||||
this.mw_converter = new Xobc_utl_make_lang(this, app.Fsys_mgr(), app.Tid_is_edit() ? ((Xoae_app)app).Msg_log() : null);
|
||||
this.lang_en = Xol_lang_itm_.Lang_en_make(this); this.Add(lang_en);
|
||||
this.gfs_mgr = gfs_mgr;
|
||||
}
|
||||
public Xoa_gfs_mgr Gfs_mgr() {return gfs_mgr;} private final Xoa_gfs_mgr gfs_mgr;
|
||||
public Xol_lang_itm Lang_en() {return lang_en;} private final Xol_lang_itm lang_en;
|
||||
public void Clear() {hash.Clear();}
|
||||
public int Len() {return hash.Count();}
|
||||
public void Add(Xol_lang_itm itm) {hash.Add(itm.Key_bry(), itm);}
|
||||
public Xol_lang_itm Get_at(int i) {return (Xol_lang_itm)hash.Get_at(i);}
|
||||
public Xol_lang_itm Get_by(byte[] key) {return (Xol_lang_itm)hash.Get_by(key);}
|
||||
public Xol_lang_itm Get_by_or_load(byte[] key) {return Get_by_or_new(key).Init_by_load_assert();}
|
||||
public Xol_lang_itm Get_by_or_en(byte[] key) { // called by Xowv_wiki for its .Lang()
|
||||
Xol_lang_itm rv = Get_by(key);
|
||||
return rv == null ? lang_en : rv;
|
||||
}
|
||||
public Xol_lang_itm Get_by_or_new(byte[] key) {
|
||||
Xol_lang_itm rv = Get_by(key);
|
||||
if (rv == null) {
|
||||
rv = new Xol_lang_itm(this, key);
|
||||
this.Add(rv);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_get)) return Get_by_or_new(m.ReadBry("key"));
|
||||
else if (ctx.Match(k, Invk_mediawiki_converter)) return mw_converter;
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
} private static final String Invk_get = "get", Invk_mediawiki_converter = "mediawiki_converter";
|
||||
public static final byte[] Fallback_false = Bry_.new_a7("false");
|
||||
}
|
||||
|
||||
@@ -13,159 +13,3 @@ 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.langs; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.core.envs.*;
|
||||
import gplx.gfui.draws.*;
|
||||
import gplx.xowa.langs.cases.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.grammars.*; import gplx.xowa.langs.genders.*; import gplx.xowa.langs.plurals.*; import gplx.xowa.langs.vnts.*; import gplx.xowa.langs.vnts.converts.*; import gplx.xowa.langs.numbers.*; import gplx.xowa.langs.durations.*; import gplx.xowa.langs.lnki_trails.*; import gplx.xowa.langs.funcs.*; import gplx.xowa.langs.specials.*; import gplx.xowa.langs.bldrs.*; import gplx.xowa.langs.commas.*;
|
||||
import gplx.xowa.apps.gfs.*; import gplx.xowa.apps.fsys.*; import gplx.core.intls.*; import gplx.xowa.wikis.nss.*; import gplx.xowa.xtns.lst.*; import gplx.xowa.wikis.caches.*; import gplx.xowa.parsers.lnkis.*;
|
||||
import gplx.xowa.guis.langs.*;
|
||||
public class Xol_lang_itm implements Gfo_invk {
|
||||
private boolean loaded = false;
|
||||
public Xol_lang_itm(Xoa_lang_mgr lang_mgr, byte[] key_bry) {
|
||||
this.lang_mgr = lang_mgr; this.key_bry = key_bry; this.key_str = String_.new_u8(key_bry);
|
||||
Xol_lang_stub lang_itm = Xol_lang_stub_.Get_by_key_or_null(key_bry); if (lang_itm == null) throw Err_.new_wo_type("unknown lang_key", "key", String_.new_u8(key_bry));
|
||||
this.lang_id = lang_itm.Id();
|
||||
this.func_regy = new Xol_func_regy(lang_mgr, this);
|
||||
this.ns_names = new Xol_ns_grp(this); this.ns_aliases = new Xol_ns_grp(this);
|
||||
this.kwd_mgr = new Xol_kwd_mgr(this);
|
||||
this.msg_mgr = new Xol_msg_mgr(this, true);
|
||||
this.specials_mgr = new Xol_specials_mgr(this);
|
||||
this.case_mgr = Env_.Mode_testing() ? Xol_case_mgr_.A7() : Xol_case_mgr_.U8(); // NOTE: if test load ascii b/c utf8 is large; NOTE: placed here b/c tests do not call load; DATE:2014-07-04
|
||||
this.num_mgr = Xol_num_mgr_.new_by_lang_id(lang_id);
|
||||
this.lnki_trail_mgr = new Xol_lnki_trail_mgr(this);
|
||||
this.vnt_mgr = new Xol_vnt_mgr(this);
|
||||
this.grammar = Xol_grammar_.new_by_lang_id(lang_id);
|
||||
this.gender = Xol_gender_.new_by_lang_id(lang_id);
|
||||
this.plural = Xol_plural_.new_by_lang_id(lang_id);
|
||||
this.duration_mgr = new Xol_duration_mgr(this);
|
||||
if (lang_id != Xol_lang_stub_.Id_en) fallback_bry_ary = Fallback_bry_ary__en; // NOTE: do not set fallback_ary for en to en, else recursive loop
|
||||
}
|
||||
public Xoa_lang_mgr Lang_mgr() {return lang_mgr;} private final Xoa_lang_mgr lang_mgr;
|
||||
public byte[] Key_bry() {return key_bry;} private final byte[] key_bry;
|
||||
public String Key_str() {return key_str;} private final String key_str;
|
||||
public int Lang_id() {return lang_id;} private final int lang_id;
|
||||
public Xol_ns_grp Ns_names() {return ns_names;} private final Xol_ns_grp ns_names;
|
||||
public Xol_ns_grp Ns_aliases() {return ns_aliases;} private final Xol_ns_grp ns_aliases;
|
||||
public Xol_kwd_mgr Kwd_mgr() {return kwd_mgr;} private final Xol_kwd_mgr kwd_mgr;
|
||||
public boolean Kwd_mgr__strx() {return kwd_mgr__strx;} public Xol_lang_itm Kwd_mgr__strx_(boolean v) {kwd_mgr__strx = v; return this;} private boolean kwd_mgr__strx;
|
||||
public Xol_msg_mgr Msg_mgr() {return msg_mgr;} private final Xol_msg_mgr msg_mgr;
|
||||
public Xol_specials_mgr Specials_mgr() {return specials_mgr;} private final Xol_specials_mgr specials_mgr;
|
||||
public Xol_case_mgr Case_mgr() {return case_mgr;} private Xol_case_mgr case_mgr;
|
||||
public void Case_mgr_u8_() {case_mgr = Xol_case_mgr_.U8();} // TEST:
|
||||
public Xol_lang_itm Case_mgr_(Xol_case_mgr v) {this.case_mgr = v; return this;} // TEST:
|
||||
public Xol_comma_wkr Comma_wkr() {return comma_wkr;} private final Xol_comma_wkr comma_wkr = new Xol_comma_wkr__add();
|
||||
public Xol_font_info Gui_font() {return gui_font;} private final Xol_font_info gui_font = new Xol_font_info(null, 0, FontStyleAdp_.Plain);
|
||||
public byte[] Fallback_bry() {return fallback_bry;}
|
||||
public Xol_lang_itm Fallback_bry_(byte[] v) {
|
||||
fallback_bry = v;
|
||||
fallback_bry_ary = Fallbacy_bry_ary__bld(v);
|
||||
return this;
|
||||
} private byte[] fallback_bry;
|
||||
public byte[][] Fallback_bry_ary() {return fallback_bry_ary;} private byte[][] fallback_bry_ary = Bry_.Ary_empty;
|
||||
public boolean Dir_ltr() {return dir_ltr;} private boolean dir_ltr = true;
|
||||
public void Dir_ltr_(boolean v) {
|
||||
dir_ltr = v;
|
||||
img_thumb_halign_default = dir_ltr ? Xop_lnki_align_h_.Right : Xop_lnki_align_h_.Left;
|
||||
}
|
||||
public byte[] Dir_ltr_bry() {return dir_ltr ? Dir_bry_ltr : Dir_bry_rtl;}
|
||||
public Xol_num_mgr Num_mgr() {return num_mgr;} private final Xol_num_mgr num_mgr;
|
||||
public Xol_vnt_mgr Vnt_mgr() {return vnt_mgr;} private final Xol_vnt_mgr vnt_mgr;
|
||||
public Xol_grammar Grammar() {return grammar;} private final Xol_grammar grammar;
|
||||
public Xol_gender Gender() {return gender;} private final Xol_gender gender;
|
||||
public Xol_plural Plural() {return plural;} private final Xol_plural plural;
|
||||
public Xol_duration_mgr Duration_mgr() {return duration_mgr;} private final Xol_duration_mgr duration_mgr;
|
||||
public Xol_lnki_trail_mgr Lnki_trail_mgr() {return lnki_trail_mgr;} private final Xol_lnki_trail_mgr lnki_trail_mgr;
|
||||
public Xop_lnki_arg_parser Lnki_arg_parser() {return lnki_arg_parser;} private Xop_lnki_arg_parser lnki_arg_parser = new Xop_lnki_arg_parser();
|
||||
public Xol_func_regy Func_regy() {return func_regy;} private final Xol_func_regy func_regy;
|
||||
public int Img_thumb_halign_default() {return img_thumb_halign_default;} private int img_thumb_halign_default = Xop_lnki_align_h_.Right;
|
||||
public Hash_adp_bry Xatrs_section() {if (xatrs_section == null) xatrs_section = Lst_section_nde.new_xatrs_(this); return xatrs_section;} private Hash_adp_bry xatrs_section;
|
||||
public void Evt_lang_changed() {
|
||||
lnki_arg_parser.Evt_lang_changed(this);
|
||||
func_regy.Evt_lang_changed(this);
|
||||
comma_wkr.Evt_lang_changed(this);
|
||||
}
|
||||
private byte[] X_axis_end() {return dir_ltr ? X_axis_end_right : X_axis_end_left;}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_ns_names)) return ns_names;
|
||||
else if (ctx.Match(k, Invk_ns_aliases)) return ns_aliases;
|
||||
else if (ctx.Match(k, Invk_keywords)) return kwd_mgr;
|
||||
else if (ctx.Match(k, Invk_messages)) return msg_mgr;
|
||||
else if (ctx.Match(k, Invk_specials)) return specials_mgr;
|
||||
else if (ctx.Match(k, Invk_casings)) return case_mgr;
|
||||
else if (ctx.Match(k, Invk_converts)) return vnt_mgr.Convert_mgr().Converter_regy();
|
||||
else if (ctx.Match(k, Invk_variants)) return vnt_mgr;
|
||||
else if (ctx.Match(k, Invk_dir_rtl_)) Dir_ltr_(!m.ReadYn("v"));
|
||||
else if (ctx.Match(k, Invk_dir_str)) return Dir_ltr_bry();
|
||||
else if (ctx.Match(k, Invk_gui_font_)) gui_font.Name_(m.ReadStr("name")).Size_(m.ReadFloatOr("size", 8));
|
||||
else if (ctx.Match(k, Invk_fallback_load)) Exec_fallback_load(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_numbers)) return num_mgr;
|
||||
else if (ctx.Match(k, Invk_link_trail)) return lnki_trail_mgr;
|
||||
else if (ctx.Match(k, Invk_x_axis_end)) return String_.new_u8(X_axis_end());
|
||||
else if (ctx.Match(k, Invk_this)) return this;
|
||||
else if (ctx.Match(k, Xoae_app.Invk_app)) return lang_mgr.Gfs_mgr().Root_invk();
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static final String Invk_ns_names = "ns_names", Invk_ns_aliases = "ns_aliases"
|
||||
, Invk_keywords = "keywords", Invk_messages = "messages", Invk_specials = "specials", Invk_casings = "casings", Invk_converts = "converts", Invk_variants = "variants"
|
||||
, Invk_numbers = "numbers"
|
||||
, Invk_dir_rtl_ = "dir_rtl_", Invk_gui_font_ = "gui_font_"
|
||||
, Invk_fallback_load = "fallback_load", Invk_this = "this", Invk_dir_str = "dir_str", Invk_link_trail = "link_trail"
|
||||
, Invk_x_axis_end = "x_axis_end"
|
||||
;
|
||||
|
||||
private static final Hash_adp_bry fallback_dupes_regy = Hash_adp_bry.cs(); // to prevent cyclical loops during loading
|
||||
public Xol_lang_itm Init_by_load_assert() {if (!loaded) Init_by_load(); return this;}
|
||||
public boolean Init_by_load() {
|
||||
if (this.loaded) return false;
|
||||
fallback_dupes_regy.Clear();
|
||||
this.loaded = true;
|
||||
boolean lang_is_en = lang_id == Xol_lang_stub_.Id_en;
|
||||
if (!lang_is_en) Xol_lang_itm_.Lang_init(this);
|
||||
msg_mgr.Itm_by_key_or_new(Bry_.new_a7("Lang")).Atrs_set(key_bry, false, false); // set "Lang" keyword; EX: for "fr", "{{int:Lang}}" -> "fr"
|
||||
Load_lang(key_bry);
|
||||
ns_aliases.Ary_add_(Xow_ns_canonical_.Ary); // NOTE: always add English canonical as aliases to all languages
|
||||
this.Evt_lang_changed();
|
||||
return true;
|
||||
}
|
||||
private void Exec_fallback_load(byte[] fallback_lang) {
|
||||
Fallback_bry_(fallback_lang);
|
||||
if (fallback_dupes_regy.Has(fallback_lang)) return; // fallback_lang loaded; avoid recursive loop; EX: zh with fallback of zh-hans which has fallback of zh
|
||||
if (Bry_.Eq(fallback_lang, Xoa_lang_mgr.Fallback_false)) return; // fallback_lang is "none" exit
|
||||
fallback_dupes_regy.Add(fallback_lang, fallback_lang);
|
||||
Load_lang(fallback_lang);
|
||||
fallback_dupes_regy.Del(fallback_lang);
|
||||
}
|
||||
private void Load_lang(byte[] v) {
|
||||
Xoa_gfs_mgr gfs_mgr = lang_mgr.Gfs_mgr(); Xoa_fsys_mgr app_fsys_mgr = gfs_mgr.App_fsys_mgr();
|
||||
gfs_mgr.Run_url_for(this, Xol_lang_itm_.xo_lang_fil_(app_fsys_mgr, String_.new_a7(v)));
|
||||
gfs_mgr.Run_url_for(gfs_mgr.Root_invk(), Xol_convert_regy.Bld_url(app_fsys_mgr, key_str));
|
||||
}
|
||||
private static final byte[]
|
||||
Dir_bry_ltr = Bry_.new_a7("ltr"), Dir_bry_rtl = Bry_.new_a7("rtl")
|
||||
, X_axis_end_right = Bry_.new_a7("right"), X_axis_end_left = Bry_.new_a7("left")
|
||||
;
|
||||
public static final int Tid_lower = 1, Tid_upper = 2;
|
||||
private static byte[][] Fallbacy_bry_ary__bld(byte[] v) {
|
||||
byte[][] rv = Bry_split_.Split(v, Byte_ascii.Comma, true); // gan -> 'gan-hant, zh-hant, zh-hans'
|
||||
boolean en_needed = true;
|
||||
int rv_len = rv.length;
|
||||
for (int i = 0; i < rv_len; i++) {
|
||||
byte[] itm = rv[i];
|
||||
if (Bry_.Eq(itm, Xol_lang_itm_.Key_en)) {
|
||||
en_needed = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (en_needed) {
|
||||
int new_len = rv_len + 1;
|
||||
byte[][] new_ary = new byte[new_len][];
|
||||
for (int i = 0; i < rv_len; i++)
|
||||
new_ary[i] = rv[i];
|
||||
new_ary[rv_len] = Xol_lang_itm_.Key_en;
|
||||
rv = new_ary;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
private static final byte[][] Fallback_bry_ary__en = new byte[][] {Xol_lang_itm_.Key_en};
|
||||
}
|
||||
|
||||
@@ -13,266 +13,3 @@ 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.langs; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.core.intls.*; import gplx.xowa.xtns.cites.*; import gplx.xowa.xtns.gallery.*;
|
||||
import gplx.xowa.langs.bldrs.*; import gplx.xowa.langs.numbers.*; import gplx.xowa.langs.kwds.*;
|
||||
import gplx.xowa.apps.fsys.*;
|
||||
public class Xol_lang_itm_ {
|
||||
public static Io_url xo_lang_fil_(Xoa_fsys_mgr app_fsys_mgr, String lang_key) {return app_fsys_mgr.Cfg_lang_core_dir().GenSubFil(lang_key + ".gfs");}
|
||||
public static final byte Char_tid_ltr_l = 0, Char_tid_ltr_u = 1, Char_tid_num = 2, Char_tid_ws = 3, Char_tid_sym = 4, Char_tid_misc = 5;
|
||||
public static byte Char_tid(byte b) {
|
||||
switch (b) {
|
||||
case Byte_ascii.Ltr_A: case Byte_ascii.Ltr_B: case Byte_ascii.Ltr_C: case Byte_ascii.Ltr_D: case Byte_ascii.Ltr_E:
|
||||
case Byte_ascii.Ltr_F: case Byte_ascii.Ltr_G: case Byte_ascii.Ltr_H: case Byte_ascii.Ltr_I: case Byte_ascii.Ltr_J:
|
||||
case Byte_ascii.Ltr_K: case Byte_ascii.Ltr_L: case Byte_ascii.Ltr_M: case Byte_ascii.Ltr_N: case Byte_ascii.Ltr_O:
|
||||
case Byte_ascii.Ltr_P: case Byte_ascii.Ltr_Q: case Byte_ascii.Ltr_R: case Byte_ascii.Ltr_S: case Byte_ascii.Ltr_T:
|
||||
case Byte_ascii.Ltr_U: case Byte_ascii.Ltr_V: case Byte_ascii.Ltr_W: case Byte_ascii.Ltr_X: case Byte_ascii.Ltr_Y: case Byte_ascii.Ltr_Z:
|
||||
return Char_tid_ltr_u;
|
||||
case Byte_ascii.Ltr_a: case Byte_ascii.Ltr_b: case Byte_ascii.Ltr_c: case Byte_ascii.Ltr_d: case Byte_ascii.Ltr_e:
|
||||
case Byte_ascii.Ltr_f: case Byte_ascii.Ltr_g: case Byte_ascii.Ltr_h: case Byte_ascii.Ltr_i: case Byte_ascii.Ltr_j:
|
||||
case Byte_ascii.Ltr_k: case Byte_ascii.Ltr_l: case Byte_ascii.Ltr_m: case Byte_ascii.Ltr_n: case Byte_ascii.Ltr_o:
|
||||
case Byte_ascii.Ltr_p: case Byte_ascii.Ltr_q: case Byte_ascii.Ltr_r: case Byte_ascii.Ltr_s: case Byte_ascii.Ltr_t:
|
||||
case Byte_ascii.Ltr_u: case Byte_ascii.Ltr_v: case Byte_ascii.Ltr_w: case Byte_ascii.Ltr_x: case Byte_ascii.Ltr_y: case Byte_ascii.Ltr_z:
|
||||
return Char_tid_ltr_l;
|
||||
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
||||
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
|
||||
return Char_tid_num;
|
||||
case Byte_ascii.Space: case Byte_ascii.Nl: case Byte_ascii.Tab: case Byte_ascii.Cr:
|
||||
return Char_tid_ws;
|
||||
default:
|
||||
return Char_tid_misc;
|
||||
}
|
||||
}
|
||||
public static final byte[] Key_en = Bry_.new_a7("en");
|
||||
public static Xol_lang_itm Lang_en_make(Xoa_lang_mgr lang_mgr) {
|
||||
Xol_lang_itm rv = new Xol_lang_itm(lang_mgr, Xol_lang_itm_.Key_en);
|
||||
Xol_lang_itm_.Lang_init(rv);
|
||||
rv.Evt_lang_changed();
|
||||
return rv;
|
||||
}
|
||||
public static void Lang_init(Xol_lang_itm lang) {
|
||||
lang.Num_mgr().Separators_mgr().Set(Xol_num_mgr.Separators_key__grp, Xol_num_mgr.Separators_key__grp);
|
||||
lang.Num_mgr().Separators_mgr().Set(Xol_num_mgr.Separators_key__dec, Xol_num_mgr.Separators_key__dec);
|
||||
lang.Lnki_trail_mgr().Add_range(Byte_ascii.Ltr_a, Byte_ascii.Ltr_z);// REF.MW:MessagesEn.php|$linkTrail = '/^([a-z]+)(.*)$/sD';
|
||||
Xol_kwd_mgr kwd_mgr = lang.Kwd_mgr();
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_redirect, "#REDIRECT");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_notoc, "__NOTOC__");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_nogallery, "__NOGALLERY__");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_forcetoc, "__FORCETOC__");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_toc, "__TOC__");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_noeditsection, "__NOEDITSECTION__");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_noheader, "__NOHEADER__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_month_int_len2, "CURRENTMONTH", "CURRENTMONTH2");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_month_int, "CURRENTMONTH1");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_month_name, "CURRENTMONTHNAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_month_gen, "CURRENTMONTHNAMEGEN");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_month_abrv, "CURRENTMONTHABBREV");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_day_int, "CURRENTDAY");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_day_int_len2, "CURRENTDAY2");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_day_name, "CURRENTDAYNAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_year, "CURRENTYEAR");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_time, "CURRENTTIME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_hour, "CURRENTHOUR");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_month_int_len2, "LOCALMONTH", "LOCALMONTH2");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_month_int, "LOCALMONTH1");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_month_name, "LOCALMONTHNAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_month_gen, "LOCALMONTHNAMEGEN");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_month_abrv, "LOCALMONTHABBREV");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_day_int, "LOCALDAY");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_day_int_len2, "LOCALDAY2");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_day_name, "LOCALDAYNAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_year, "LOCALYEAR");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_time, "LOCALTIME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_hour, "LOCALHOUR");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_pages, "NUMBEROFPAGES");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_articles, "NUMBEROFARTICLES");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_files, "NUMBEROFFILES");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_users, "NUMBEROFUSERS");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_users_active, "NUMBEROFACTIVEUSERS");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_edits, "NUMBEROFEDITS");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_views, "NUMBEROFVIEWS");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_page_txt, "PAGENAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_page_url, "PAGENAMEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ns_txt, "NAME"+"SPACE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ns_url, "NAME"+"SPACEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ns_talk_txt, "TALKSPACE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ns_talk_url, "TALKSPACEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ns_subj_txt, "SUBJECTSPACE", "ARTICLESPACE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ns_subj_url, "SUBJECTSPACEE", "ARTICLESPACEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_full_txt, "FULLPAGENAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_full_url, "FULLPAGENAMEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_leaf_txt, "SUBPAGENAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_leaf_url, "SUBPAGENAMEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_base_txt, "BASEPAGENAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_base_url, "BASEPAGENAMEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_talk_txt, "TALKPAGENAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_talk_url, "TALKPAGENAMEE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_subj_txt, "SUBJECTPAGENAME", "ARTICLEPAGENAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ttl_subj_url, "SUBJECTPAGENAMEE", "ARTICLEPAGENAMEE");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_ttl_root_txt, "ROOTPAGENAME");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_ttl_root_url, "ROOTPAGENAMEE");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_msg, "msg");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_subst, "subst:");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_safesubst, "safesubst:");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_msgnw, "msgnw");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_thumbnail, "thumbnail", "thumb");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_manualthumb, "thumbnail", "thumb");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_framed, "framed", "enframed", "frame");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_frameless, "frameless");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_upright, "upright");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_upright_factor, "upright_factor");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_border, "border");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_align, "align");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_valign, "valign");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_alt, "alt");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_class, "class");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_caption, "caption");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_link_url, "link-url");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_link_title, "link-title");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_link_target, "link-target");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_link_none, "no-link");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_width, "px");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_page, "page");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_none, "none");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_right, "right");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_center, "center", "centre");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_left, "left");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_baseline, "baseline");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_sub, "sub");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_super, "super", "sup");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_top, "top");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_text_top, "text-top");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_middle, "middle");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_bottom, "bottom");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_text_bottom, "text-bottom");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_img_link, "link");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_i18n_int, "int");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_sitename, "SITENAME");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_ns, "ns");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_nse, "nse");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_localurl, "localurl");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_localurle, "localurle");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_articlepath, "ARTICLEPATH");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_server, "SERVER");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_servername, "SERVERNAME");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_scriptpath, "SCRIPTPATH");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_stylepath, "STYLEPATH");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_i18n_grammar, "grammar");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_i18n_gender, "gender");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_notitleconvert, "__NOTITLECONVERT__", "__NOTC__");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_nocontentconvert, "__NOCONTENTCONVERT__", "__NOCC__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_week, "CURRENTWEEK");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_dow, "CURRENTDOW");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_week, "LOCALWEEK");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_dow, "LOCALDOW");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_id, "REVISIONID");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_day_int, "REVISIONDAY");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_day_int_len2, "REVISIONDAY2");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_month_int_len2, "REVISIONMONTH");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_month_int, "REVISIONMONTH1");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_year, "REVISIONYEAR");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_timestamp, "REVISIONTIMESTAMP");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_user, "REVISIONUSER");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_i18n_plural, "plural");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_fullurl, "fullurl");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_fullurle, "fullurle");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_lcfirst, "lcfirst");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_ucfirst, "ucfirst");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_lc, "lc");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_uc, "uc");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_raw, "raw");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_page_displaytitle, "DISPLAYTITLE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_str_rawsuffix, "R");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_newsectionlink, "__NEWSECTIONLINK__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_nonewsectionlink, "__NONEWSECTIONLINK__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_currentversion, "CURRENTVERSION");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_urlencode, "urlencode");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_anchorencode, "anchorencode");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_utc_timestamp, "CURRENTTIMESTAMP");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_lcl_timestamp, "LOCALTIMESTAMP");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_directionmark, "DIRECTIONMARK", "DIRMARK");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_i18n_language, "#language");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_contentlanguage, "CONTENTLANGUAGE", "CONTENTLANG");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_pagesinnamespace, "PAGESINNAMESPACE", "PAGESINNS");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_num_admins, "NUMBEROFADMINS");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_formatnum, "formatnum");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_padleft, "padleft");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_padright, "padright");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_misc_special, "#special");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_page_defaultsort, "DEFAULTSORT", "DEFAULTSORTKEY", "DEFAULTCATEGORYSORT");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_filepath, "filepath");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_misc_tag, "#tag");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_hiddencat, "__HIDDENCAT__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_pagesincategory, "PAGESINCATEGORY", "PAGESINCAT");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_pagesize, "PAGESIZE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_index, "__INDEX__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_noindex, "__NOINDEX__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_site_numberingroup, "NUMBERINGROUP", "NUMINGROUP");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_staticredirect, "__STATICREDIRECT__");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_protectionlevel, "PROTECTIONLEVEL");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_str_formatdate, "#formatdate", "#dateformat");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_path, "path");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_wiki, "wiki");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_query, "query");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_expr, "#expr");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_if, "#if");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_ifeq, "#ifeq");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_ifexpr, "#ifexpr");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_iferror, "#iferror");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_switch, "#switch");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_default, "#default");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_ifexist, "#ifexist");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_time, "#time");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_timel, "#timel");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_rel2abs, "#rel2abs");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_titleparts, "#titleparts");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xowa_dbg, "#xowa_dbg");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ogg_noplayer, "noplayer");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ogg_noicon, "noicon");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_ogg_thumbtime, "thumbtime");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xtn_geodata_coordinates, "#coordinates");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_canonicalurl, "canonicalurl");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_url_canonicalurle, "canonicalurle");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_lst, "#lst", "#section");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_lstx, "#lstx", "#section-x");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_lsth, "#lsth", "#section-h");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_invoke, "#invoke");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_property, "#property");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_noexternallanglinks, "noexternallanglinks");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_ns_num, "namespacenumber");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_page_id, "pageid");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_disambig, "__DISAMBIG__");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_nocommafysuffix, "NOSEP");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_xowa, "#xowa");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_mapSources_deg2dd, "#deg2dd");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_mapSources_dd2dms, "#dd2dms");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_mapSources_geoLink, "#geolink");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_geoCrumbs_isin, "#isin");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_relatedArticles, "#related");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_insider, "#insider");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_massMessage_target, "#target");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_cascadingSources, "CASCADINGSOURCES");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pendingChangeLevel, "PENDINGCHANGELEVEL");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pagesUsingPendingChanges, "PAGESUSINGPENDINGCHANGES");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_bang, "!");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_wbreponame, "wbreponame");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_len, "#len");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_pos, "#pos");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_rpos, "#rpos");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_sub, "#sub");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_count, "#count");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_replace, "#replace");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_explode, "#explode");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_strx_urldecode, "#urldecode");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pagesincategory_pages, "pagesincategory_pages", "pages");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pagesincategory_subcats, "pagesincategory_subcats", "subcats");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_pagesincategory_files, "pagesincategory_files", "files");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_revisionsize, "REVISIONSIZE");
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_pagebanner, "PAGEBANNER"); // NOTE: must be casematch; EX: in en.v, {{pagebanner}} is actually template name which calls {{PAGEBANNER}}
|
||||
kwd_mgr.New(Bool_.Y, Xol_kwd_grp_.Id_rev_protectionexpiry, "PROTECTIONEXPIRY");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_new_window_link, "#NewWindowLink");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_categorytree, "#categorytree");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_assessment, "#assessment");
|
||||
kwd_mgr.New(Bool_.N, Xol_kwd_grp_.Id_statements, "#statements");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,10 +13,3 @@ 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.langs; import gplx.*; import gplx.xowa.*;
|
||||
public class Xol_lang_stub {
|
||||
public Xol_lang_stub(int id, byte[] key, byte[] canonical_name) {this.id = id; this.key = key; this.canonical_name = canonical_name;}
|
||||
public int Id() {return id;} private final int id; // EX: 1
|
||||
public byte[] Key() {return key;} private final byte[] key; // EX: de
|
||||
public byte[] Canonical_name() {return canonical_name;} private final byte[] canonical_name; // EX: Deutsch
|
||||
}
|
||||
|
||||
@@ -13,950 +13,3 @@ 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.langs; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.core.lists.*;
|
||||
public class Xol_lang_stub_ { // lists all known stub_ary supported by MW
|
||||
public static final byte[] Key__unknown = Bry_.Empty;
|
||||
public static final ComparerAble Comparer_key = new Xol_sub_itm_comparer();
|
||||
public static final int
|
||||
Id__intl = -2
|
||||
, Id__unknown = -1
|
||||
, Id_en = 0
|
||||
, Id_aa = 1
|
||||
, Id_ab = 2
|
||||
, Id_ace = 3
|
||||
, Id_ady = 4
|
||||
, Id_ady_cyrl = 5
|
||||
, Id_aeb = 6
|
||||
, Id_aeb_arab = 7
|
||||
, Id_aeb_latn = 8
|
||||
, Id_af = 9
|
||||
, Id_ak = 10
|
||||
, Id_akz = 11
|
||||
, Id_aln = 12
|
||||
, Id_als = 13
|
||||
, Id_am = 14
|
||||
, Id_an = 15
|
||||
, Id_ang = 16
|
||||
, Id_anp = 17
|
||||
, Id_ar = 18
|
||||
, Id_arc = 19
|
||||
, Id_arn = 20
|
||||
, Id_aro = 21
|
||||
, Id_arq = 22
|
||||
, Id_ary = 23
|
||||
, Id_arz = 24
|
||||
, Id_as = 25
|
||||
, Id_ase = 26
|
||||
, Id_ast = 27
|
||||
, Id_atj = 28
|
||||
, Id_av = 29
|
||||
, Id_avk = 30
|
||||
, Id_awa = 31
|
||||
, Id_ay = 32
|
||||
, Id_az = 33
|
||||
, Id_azb = 34
|
||||
, Id_ba = 35
|
||||
, Id_ban = 36
|
||||
, Id_bar = 37
|
||||
, Id_bat_smg = 38
|
||||
, Id_bbc = 39
|
||||
, Id_bbc_latn = 40
|
||||
, Id_bcc = 41
|
||||
, Id_bcl = 42
|
||||
, Id_be = 43
|
||||
, Id_be_tarask = 44
|
||||
, Id_be_x_old = 45
|
||||
, Id_bew = 46
|
||||
, Id_bg = 47
|
||||
, Id_bgn = 48
|
||||
, Id_bh = 49
|
||||
, Id_bho = 50
|
||||
, Id_bi = 51
|
||||
, Id_bjn = 52
|
||||
, Id_bm = 53
|
||||
, Id_bn = 54
|
||||
, Id_bo = 55
|
||||
, Id_bpy = 56
|
||||
, Id_bqi = 57
|
||||
, Id_br = 58
|
||||
, Id_brh = 59
|
||||
, Id_bs = 60
|
||||
, Id_bto = 61
|
||||
, Id_bug = 62
|
||||
, Id_bxr = 63
|
||||
, Id_ca = 64
|
||||
, Id_cbk_zam = 65
|
||||
, Id_cdo = 66
|
||||
, Id_ce = 67
|
||||
, Id_ceb = 68
|
||||
, Id_ch = 69
|
||||
, Id_chm = 70
|
||||
, Id_cho = 71
|
||||
, Id_chr = 72
|
||||
, Id_chy = 73
|
||||
, Id_ckb = 74
|
||||
, Id_co = 75
|
||||
, Id_cps = 76
|
||||
, Id_cr = 77
|
||||
, Id_crh = 78
|
||||
, Id_crh_cyrl = 79
|
||||
, Id_crh_latn = 80
|
||||
, Id_cs = 81
|
||||
, Id_csb = 82
|
||||
, Id_cu = 83
|
||||
, Id_cv = 84
|
||||
, Id_cy = 85
|
||||
, Id_da = 86
|
||||
, Id_de = 87
|
||||
, Id_de_at = 88
|
||||
, Id_de_ch = 89
|
||||
, Id_de_formal = 90
|
||||
, Id_diq = 91
|
||||
, Id_dsb = 92
|
||||
, Id_dtp = 93
|
||||
, Id_dty = 94
|
||||
, Id_dv = 95
|
||||
, Id_dz = 96
|
||||
, Id_ee = 97
|
||||
, Id_egl = 98
|
||||
, Id_el = 99
|
||||
, Id_eml = 100
|
||||
, Id_en_ca = 101
|
||||
, Id_en_gb = 102
|
||||
, Id_en_rtl = 103
|
||||
, Id_enrtl = 104
|
||||
, Id_eo = 105
|
||||
, Id_es = 106
|
||||
, Id_es_formal = 107
|
||||
, Id_esu = 108
|
||||
, Id_et = 109
|
||||
, Id_eu = 110
|
||||
, Id_ext = 111
|
||||
, Id_fa = 112
|
||||
, Id_ff = 113
|
||||
, Id_fi = 114
|
||||
, Id_fit = 115
|
||||
, Id_fiu_vro = 116
|
||||
, Id_fj = 117
|
||||
, Id_fo = 118
|
||||
, Id_fr = 119
|
||||
, Id_frc = 120
|
||||
, Id_frp = 121
|
||||
, Id_frr = 122
|
||||
, Id_fur = 123
|
||||
, Id_fy = 124
|
||||
, Id_ga = 125
|
||||
, Id_gag = 126
|
||||
, Id_gan = 127
|
||||
, Id_gan_hans = 128
|
||||
, Id_gan_hant = 129
|
||||
, Id_gd = 130
|
||||
, Id_gl = 131
|
||||
, Id_glk = 132
|
||||
, Id_gn = 133
|
||||
, Id_gom = 134
|
||||
, Id_gom_deva = 135
|
||||
, Id_gom_latn = 136
|
||||
, Id_gor = 137
|
||||
, Id_got = 138
|
||||
, Id_grc = 139
|
||||
, Id_gsw = 140
|
||||
, Id_gu = 141
|
||||
, Id_guc = 142
|
||||
, Id_gv = 143
|
||||
, Id_ha = 144
|
||||
, Id_hak = 145
|
||||
, Id_haw = 146
|
||||
, Id_he = 147
|
||||
, Id_hi = 148
|
||||
, Id_hif = 149
|
||||
, Id_hif_latn = 150
|
||||
, Id_hil = 151
|
||||
, Id_ho = 152
|
||||
, Id_hr = 153
|
||||
, Id_hrx = 154
|
||||
, Id_hsb = 155
|
||||
, Id_hsn = 156
|
||||
, Id_ht = 157
|
||||
, Id_hu = 158
|
||||
, Id_hu_formal = 159
|
||||
, Id_hy = 160
|
||||
, Id_hz = 161
|
||||
, Id_ia = 162
|
||||
, Id_id = 163
|
||||
, Id_ie = 164
|
||||
, Id_ig = 165
|
||||
, Id_ii = 166
|
||||
, Id_ik = 167
|
||||
, Id_ike_cans = 168
|
||||
, Id_ike_latn = 169
|
||||
, Id_ilo = 170
|
||||
, Id_inh = 171
|
||||
, Id_io = 172
|
||||
, Id_is = 173
|
||||
, Id_it = 174
|
||||
, Id_iu = 175
|
||||
, Id_izh = 176
|
||||
, Id_ja = 177
|
||||
, Id_jam = 178
|
||||
, Id_jbo = 179
|
||||
, Id_jut = 180
|
||||
, Id_jv = 181
|
||||
, Id_ka = 182
|
||||
, Id_kaa = 183
|
||||
, Id_kab = 184
|
||||
, Id_kbd = 185
|
||||
, Id_kbd_cyrl = 186
|
||||
, Id_kbp = 187
|
||||
, Id_kg = 188
|
||||
, Id_khw = 189
|
||||
, Id_ki = 190
|
||||
, Id_kiu = 191
|
||||
, Id_kj = 192
|
||||
, Id_kk = 193
|
||||
, Id_kk_arab = 194
|
||||
, Id_kk_cn = 195
|
||||
, Id_kk_cyrl = 196
|
||||
, Id_kk_kz = 197
|
||||
, Id_kk_latn = 198
|
||||
, Id_kk_tr = 199
|
||||
, Id_kl = 200
|
||||
, Id_km = 201
|
||||
, Id_kn = 202
|
||||
, Id_ko = 203
|
||||
, Id_ko_kp = 204
|
||||
, Id_koi = 205
|
||||
, Id_kok = 206
|
||||
, Id_kr = 207
|
||||
, Id_krc = 208
|
||||
, Id_kri = 209
|
||||
, Id_krj = 210
|
||||
, Id_krl = 211
|
||||
, Id_ks = 212
|
||||
, Id_ks_arab = 213
|
||||
, Id_ks_deva = 214
|
||||
, Id_ksh = 215
|
||||
, Id_ku = 216
|
||||
, Id_ku_arab = 217
|
||||
, Id_ku_latn = 218
|
||||
, Id_kv = 219
|
||||
, Id_kw = 220
|
||||
, Id_ky = 221
|
||||
, Id_la = 222
|
||||
, Id_lad = 223
|
||||
, Id_lb = 224
|
||||
, Id_lbe = 225
|
||||
, Id_lez = 226
|
||||
, Id_lfn = 227
|
||||
, Id_lg = 228
|
||||
, Id_li = 229
|
||||
, Id_lij = 230
|
||||
, Id_liv = 231
|
||||
, Id_lki = 232
|
||||
, Id_lmo = 233
|
||||
, Id_ln = 234
|
||||
, Id_lo = 235
|
||||
, Id_loz = 236
|
||||
, Id_lrc = 237
|
||||
, Id_lt = 238
|
||||
, Id_ltg = 239
|
||||
, Id_lus = 240
|
||||
, Id_luz = 241
|
||||
, Id_lv = 242
|
||||
, Id_lzh = 243
|
||||
, Id_lzz = 244
|
||||
, Id_mai = 245
|
||||
, Id_map_bms = 246
|
||||
, Id_mdf = 247
|
||||
, Id_mg = 248
|
||||
, Id_mh = 249
|
||||
, Id_mhr = 250
|
||||
, Id_mi = 251
|
||||
, Id_mic = 252
|
||||
, Id_min = 253
|
||||
, Id_mk = 254
|
||||
, Id_ml = 255
|
||||
, Id_mn = 256
|
||||
, Id_mnc = 257
|
||||
, Id_mo = 258
|
||||
, Id_mr = 259
|
||||
, Id_mrj = 260
|
||||
, Id_ms = 261
|
||||
, Id_mt = 262
|
||||
, Id_mui = 263
|
||||
, Id_mus = 264
|
||||
, Id_mwl = 265
|
||||
, Id_mwv = 266
|
||||
, Id_my = 267
|
||||
, Id_myv = 268
|
||||
, Id_mzn = 269
|
||||
, Id_na = 270
|
||||
, Id_nah = 271
|
||||
, Id_nan = 272
|
||||
, Id_nap = 273
|
||||
, Id_nb = 274
|
||||
, Id_nds = 275
|
||||
, Id_nds_nl = 276
|
||||
, Id_ne = 277
|
||||
, Id_new = 278
|
||||
, Id_ng = 279
|
||||
, Id_niu = 280
|
||||
, Id_nl = 281
|
||||
, Id_nl_informal = 282
|
||||
, Id_nn = 283
|
||||
, Id_no = 284
|
||||
, Id_nov = 285
|
||||
, Id_nrm = 286
|
||||
, Id_nso = 287
|
||||
, Id_nv = 288
|
||||
, Id_ny = 289
|
||||
, Id_oc = 290
|
||||
, Id_olo = 291
|
||||
, Id_om = 292
|
||||
, Id_or = 293
|
||||
, Id_os = 294
|
||||
, Id_pa = 295
|
||||
, Id_pag = 296
|
||||
, Id_pam = 297
|
||||
, Id_pap = 298
|
||||
, Id_pbb = 299
|
||||
, Id_pcd = 300
|
||||
, Id_pdc = 301
|
||||
, Id_pdt = 302
|
||||
, Id_pfl = 303
|
||||
, Id_pi = 304
|
||||
, Id_pih = 305
|
||||
, Id_pl = 306
|
||||
, Id_pms = 307
|
||||
, Id_pnb = 308
|
||||
, Id_pnt = 309
|
||||
, Id_ppl = 310
|
||||
, Id_prg = 311
|
||||
, Id_ps = 312
|
||||
, Id_pt = 313
|
||||
, Id_pt_br = 314
|
||||
, Id_qqq = 315
|
||||
, Id_qu = 316
|
||||
, Id_qug = 317
|
||||
, Id_rap = 318
|
||||
, Id_rgn = 319
|
||||
, Id_rif = 320
|
||||
, Id_rm = 321
|
||||
, Id_rmf = 322
|
||||
, Id_rmy = 323
|
||||
, Id_rn = 324
|
||||
, Id_ro = 325
|
||||
, Id_roa_rup = 326
|
||||
, Id_roa_tara = 327
|
||||
, Id_ru = 328
|
||||
, Id_rue = 329
|
||||
, Id_rup = 330
|
||||
, Id_ruq = 331
|
||||
, Id_ruq_cyrl = 332
|
||||
, Id_ruq_latn = 333
|
||||
, Id_rw = 334
|
||||
, Id_ryu = 335
|
||||
, Id_sa = 336
|
||||
, Id_sah = 337
|
||||
, Id_sat = 338
|
||||
, Id_saz = 339
|
||||
, Id_sc = 340
|
||||
, Id_scn = 341
|
||||
, Id_sco = 342
|
||||
, Id_sd = 343
|
||||
, Id_sdc = 344
|
||||
, Id_sdh = 345
|
||||
, Id_se = 346
|
||||
, Id_sei = 347
|
||||
, Id_ses = 348
|
||||
, Id_sg = 349
|
||||
, Id_sgs = 350
|
||||
, Id_sh = 351
|
||||
, Id_shi = 352
|
||||
, Id_shn = 353
|
||||
, Id_si = 354
|
||||
, Id_simple = 355
|
||||
, Id_sk = 356
|
||||
, Id_sl = 357
|
||||
, Id_sli = 358
|
||||
, Id_sly = 359
|
||||
, Id_sm = 360
|
||||
, Id_sma = 361
|
||||
, Id_sn = 362
|
||||
, Id_so = 363
|
||||
, Id_sq = 364
|
||||
, Id_sr = 365
|
||||
, Id_sr_ec = 366
|
||||
, Id_sr_el = 367
|
||||
, Id_srn = 368
|
||||
, Id_ss = 369
|
||||
, Id_st = 370
|
||||
, Id_stq = 371
|
||||
, Id_su = 372
|
||||
, Id_sv = 373
|
||||
, Id_sw = 374
|
||||
, Id_sxu = 375
|
||||
, Id_szl = 376
|
||||
, Id_ta = 377
|
||||
, Id_tcy = 378
|
||||
, Id_te = 379
|
||||
, Id_test = 380
|
||||
, Id_tet = 381
|
||||
, Id_tg = 382
|
||||
, Id_tg_cyrl = 383
|
||||
, Id_tg_latn = 384
|
||||
, Id_th = 385
|
||||
, Id_ti = 386
|
||||
, Id_tk = 387
|
||||
, Id_tl = 388
|
||||
, Id_tly = 389
|
||||
, Id_tn = 390
|
||||
, Id_to = 391
|
||||
, Id_tokipona = 392
|
||||
, Id_tp = 393
|
||||
, Id_tpi = 394
|
||||
, Id_tr = 395
|
||||
, Id_tru = 396
|
||||
, Id_ts = 397
|
||||
, Id_tt = 398
|
||||
, Id_tt_cyrl = 399
|
||||
, Id_tt_latn = 400
|
||||
, Id_ttt = 401
|
||||
, Id_tum = 402
|
||||
, Id_tw = 403
|
||||
, Id_ty = 404
|
||||
, Id_tyv = 405
|
||||
, Id_tzm = 406
|
||||
, Id_ua = 407
|
||||
, Id_udm = 408
|
||||
, Id_ug = 409
|
||||
, Id_ug_arab = 410
|
||||
, Id_ug_latn = 411
|
||||
, Id_uk = 412
|
||||
, Id_ur = 413
|
||||
, Id_uz = 414
|
||||
, Id_ve = 415
|
||||
, Id_vec = 416
|
||||
, Id_vep = 417
|
||||
, Id_vi = 418
|
||||
, Id_vls = 419
|
||||
, Id_vmf = 420
|
||||
, Id_vo = 421
|
||||
, Id_vot = 422
|
||||
, Id_vro = 423
|
||||
, Id_wa = 424
|
||||
, Id_war = 425
|
||||
, Id_wo = 426
|
||||
, Id_wuu = 427
|
||||
, Id_xal = 428
|
||||
, Id_xh = 429
|
||||
, Id_xmf = 430
|
||||
, Id_yi = 431
|
||||
, Id_yo = 432
|
||||
, Id_yue = 433
|
||||
, Id_za = 434
|
||||
, Id_zea = 435
|
||||
, Id_zh = 436
|
||||
, Id_zh_classical = 437
|
||||
, Id_zh_cn = 438
|
||||
, Id_zh_hans = 439
|
||||
, Id_zh_hant = 440
|
||||
, Id_zh_hk = 441
|
||||
, Id_zh_min_nan = 442
|
||||
, Id_zh_mo = 443
|
||||
, Id_zh_my = 444
|
||||
, Id_zh_sg = 445
|
||||
, Id_zh_tw = 446
|
||||
, Id_zh_yue = 447
|
||||
, Id_zu = 448
|
||||
;
|
||||
public static final int Id__max = 449;
|
||||
public static Hash_adp_bry Regy() {
|
||||
if (stub_hash == null) { // NOTE: any parenthetical String below will have an "unseen" character of "\xE2\x80\xAA" at the begining and "\xE2\x80\xAC" at the end. They are responsible for parentheses-orientation in RTL stub_ary.
|
||||
stub_hash = Hash_adp_bry.ci_a7(); // ASCII:lang_code; NOTE: must be ci; EX: {{#languages:FR}}
|
||||
Regy_add(stub_hash, Id_en, "en", "English");
|
||||
Regy_add(stub_hash, Id_aa, "aa", "Qafár af");
|
||||
Regy_add(stub_hash, Id_ab, "ab", "Аҧсуа");
|
||||
Regy_add(stub_hash, Id_ace, "ace", "Acèh");
|
||||
Regy_add(stub_hash, Id_ady, "ady", "Adyghe");
|
||||
Regy_add(stub_hash, Id_ady_cyrl, "ady-cyrl", "West Circassian (Cyrillic)");
|
||||
Regy_add(stub_hash, Id_aeb, "aeb", "زَوُن");
|
||||
Regy_add(stub_hash, Id_aeb_arab, "aeb-arab", "زَوُن");
|
||||
Regy_add(stub_hash, Id_aeb_latn, "aeb-latn", "زَوُن");
|
||||
Regy_add(stub_hash, Id_af, "af", "Afrikaans");
|
||||
Regy_add(stub_hash, Id_ak, "ak", "Akan");
|
||||
Regy_add(stub_hash, Id_akz, "akz", "Alibamu");
|
||||
Regy_add(stub_hash, Id_aln, "aln", "Gegë");
|
||||
Regy_add(stub_hash, Id_als, "als", "Alemannisch");
|
||||
Regy_add(stub_hash, Id_am, "am", "አማርኛ");
|
||||
Regy_add(stub_hash, Id_an, "an", "Aragonés");
|
||||
Regy_add(stub_hash, Id_ang, "ang", "Ænglisc");
|
||||
Regy_add(stub_hash, Id_anp, "anp", "अङ्गिका");
|
||||
Regy_add(stub_hash, Id_ar, "ar", "العربية");
|
||||
Regy_add(stub_hash, Id_arc, "arc", "ܐܪܡܝܐ");
|
||||
Regy_add(stub_hash, Id_arn, "arn", "Mapudungun");
|
||||
Regy_add(stub_hash, Id_aro, "aro", "Araona");
|
||||
Regy_add(stub_hash, Id_arq, "arq", "Algerian Arabic");
|
||||
Regy_add(stub_hash, Id_ary, "ary", "Maġribi");
|
||||
Regy_add(stub_hash, Id_arz, "arz", "مصرى");
|
||||
Regy_add(stub_hash, Id_as, "as", "অসমীয়া");
|
||||
Regy_add(stub_hash, Id_ase, "ase", "American Sign Language");
|
||||
Regy_add(stub_hash, Id_ast, "ast", "Asturianu");
|
||||
Regy_add(stub_hash, Id_atj, "atj", "Atikamekw");
|
||||
Regy_add(stub_hash, Id_av, "av", "Авар");
|
||||
Regy_add(stub_hash, Id_avk, "avk", "Kotava");
|
||||
Regy_add(stub_hash, Id_awa, "awa", "Awadhi");
|
||||
Regy_add(stub_hash, Id_ay, "ay", "Aymar aru");
|
||||
Regy_add(stub_hash, Id_az, "az", "Azərbaycanca");
|
||||
Regy_add(stub_hash, Id_azb, "azb", "South Azerbaijani");
|
||||
Regy_add(stub_hash, Id_ba, "ba", "Башҡортса");
|
||||
Regy_add(stub_hash, Id_ban, "ban", "ᬩᬲᬩᬮᬶ");
|
||||
Regy_add(stub_hash, Id_bar, "bar", "Boarisch");
|
||||
Regy_add(stub_hash, Id_bat_smg, "bat-smg", "Žemaitėška");
|
||||
Regy_add(stub_hash, Id_bbc, "bbc", "Batak Toba");
|
||||
Regy_add(stub_hash, Id_bbc_latn, "bbc-latn", "Batak Toba (Latin)");
|
||||
Regy_add(stub_hash, Id_bcc, "bcc", "بلوچی مکرانی");
|
||||
Regy_add(stub_hash, Id_bcl, "bcl", "Bikol Central");
|
||||
Regy_add(stub_hash, Id_be, "be", "Беларуская");
|
||||
Regy_add(stub_hash, Id_be_tarask, "be-tarask", "Беларуская (тарашкевіца)");
|
||||
Regy_add(stub_hash, Id_be_x_old, "be-x-old", "Беларуская (тарашкевіца)");
|
||||
Regy_add(stub_hash, Id_bew, "bew", "Betawi");
|
||||
Regy_add(stub_hash, Id_bg, "bg", "Български");
|
||||
Regy_add(stub_hash, Id_bgn, "bgn", "Balochi");
|
||||
Regy_add(stub_hash, Id_bh, "bh", "भोजपुरी");
|
||||
Regy_add(stub_hash, Id_bho, "bho", "भोजपुरी");
|
||||
Regy_add(stub_hash, Id_bi, "bi", "Bislama");
|
||||
Regy_add(stub_hash, Id_bjn, "bjn", "Bahasa Banjar");
|
||||
Regy_add(stub_hash, Id_bm, "bm", "Bamanankan");
|
||||
Regy_add(stub_hash, Id_bn, "bn", "বাংলা");
|
||||
Regy_add(stub_hash, Id_bo, "bo", "བོད་ཡིག");
|
||||
Regy_add(stub_hash, Id_bpy, "bpy", "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী");
|
||||
Regy_add(stub_hash, Id_bqi, "bqi", "بختياري");
|
||||
Regy_add(stub_hash, Id_br, "br", "Brezhoneg");
|
||||
Regy_add(stub_hash, Id_brh, "brh", "Bráhuí");
|
||||
Regy_add(stub_hash, Id_bs, "bs", "Bosanski");
|
||||
Regy_add(stub_hash, Id_bto, "bto", "Rinconada Bikol");
|
||||
Regy_add(stub_hash, Id_bug, "bug", "ᨅᨔ ᨕᨘᨁᨗ");
|
||||
Regy_add(stub_hash, Id_bxr, "bxr", "Буряад");
|
||||
Regy_add(stub_hash, Id_ca, "ca", "Català");
|
||||
Regy_add(stub_hash, Id_cbk_zam, "cbk-zam", "Chavacano de Zamboanga");
|
||||
Regy_add(stub_hash, Id_cdo, "cdo", "Mìng-dĕ̤ng-ngṳ̄");
|
||||
Regy_add(stub_hash, Id_ce, "ce", "Нохчийн");
|
||||
Regy_add(stub_hash, Id_ceb, "ceb", "Cebuano");
|
||||
Regy_add(stub_hash, Id_ch, "ch", "Chamoru");
|
||||
Regy_add(stub_hash, Id_chm, "chm", "Mari");
|
||||
Regy_add(stub_hash, Id_cho, "cho", "Choctaw");
|
||||
Regy_add(stub_hash, Id_chr, "chr", "ᏣᎳᎩ");
|
||||
Regy_add(stub_hash, Id_chy, "chy", "Tsetsêhestâhese");
|
||||
Regy_add(stub_hash, Id_ckb, "ckb", "کوردی");
|
||||
Regy_add(stub_hash, Id_co, "co", "Corsu");
|
||||
Regy_add(stub_hash, Id_cps, "cps", "Capiceño");
|
||||
Regy_add(stub_hash, Id_cr, "cr", "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ");
|
||||
Regy_add(stub_hash, Id_crh, "crh", "Qırımtatarca");
|
||||
Regy_add(stub_hash, Id_crh_cyrl, "crh-cyrl", "Къырымтатарджа (Кирилл)");
|
||||
Regy_add(stub_hash, Id_crh_latn, "crh-latn", "Qırımtatarca (Latin)");
|
||||
Regy_add(stub_hash, Id_cs, "cs", "Česky");
|
||||
Regy_add(stub_hash, Id_csb, "csb", "Kaszëbsczi");
|
||||
Regy_add(stub_hash, Id_cu, "cu", "Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ");
|
||||
Regy_add(stub_hash, Id_cv, "cv", "Чӑвашла");
|
||||
Regy_add(stub_hash, Id_cy, "cy", "Cymraeg");
|
||||
Regy_add(stub_hash, Id_da, "da", "Dansk");
|
||||
Regy_add(stub_hash, Id_de, "de", "Deutsch");
|
||||
Regy_add(stub_hash, Id_de_at, "de-at", "Österreichisches Deutsch");
|
||||
Regy_add(stub_hash, Id_de_ch, "de-ch", "Schweizer Hochdeutsch");
|
||||
Regy_add(stub_hash, Id_de_formal, "de-formal", "Deutsch (Sie-Form)");
|
||||
Regy_add(stub_hash, Id_diq, "diq", "Zazaki");
|
||||
Regy_add(stub_hash, Id_dsb, "dsb", "Dolnoserbski");
|
||||
Regy_add(stub_hash, Id_dtp, "dtp", "Dusun Bundu-liwan");
|
||||
Regy_add(stub_hash, Id_dty, "dty", "Dotyali");
|
||||
Regy_add(stub_hash, Id_dv, "dv", "ދިވެހިބަސް");
|
||||
Regy_add(stub_hash, Id_dz, "dz", "ཇོང་ཁ");
|
||||
Regy_add(stub_hash, Id_ee, "ee", "Eʋegbe");
|
||||
Regy_add(stub_hash, Id_egl, "egl", "Emiliàn");
|
||||
Regy_add(stub_hash, Id_el, "el", "Ελληνικά");
|
||||
Regy_add(stub_hash, Id_eml, "eml", "Emiliàn e rumagnòl");
|
||||
Regy_add(stub_hash, Id_en_ca, "en-ca", "Canadian English");
|
||||
Regy_add(stub_hash, Id_en_gb, "en-gb", "British English");
|
||||
Regy_add(stub_hash, Id_en_rtl, "en-rtl", "English rtl");
|
||||
Regy_add(stub_hash, Id_enrtl, "enrtl", "English (right to left)");
|
||||
Regy_add(stub_hash, Id_eo, "eo", "Esperanto");
|
||||
Regy_add(stub_hash, Id_es, "es", "Español");
|
||||
Regy_add(stub_hash, Id_es_formal, "es-formal", "Spanish (formal)");
|
||||
Regy_add(stub_hash, Id_esu, "esu", "Yuk'ip");
|
||||
Regy_add(stub_hash, Id_et, "et", "Eesti");
|
||||
Regy_add(stub_hash, Id_eu, "eu", "Euskara");
|
||||
Regy_add(stub_hash, Id_ext, "ext", "Estremeñu");
|
||||
Regy_add(stub_hash, Id_fa, "fa", "فارسی");
|
||||
Regy_add(stub_hash, Id_ff, "ff", "Fulfulde");
|
||||
Regy_add(stub_hash, Id_fi, "fi", "Suomi");
|
||||
Regy_add(stub_hash, Id_fit, "fit", "meänkieli");
|
||||
Regy_add(stub_hash, Id_fiu_vro, "fiu-vro", "Võro");
|
||||
Regy_add(stub_hash, Id_fj, "fj", "Na Vosa Vakaviti");
|
||||
Regy_add(stub_hash, Id_fo, "fo", "Føroyskt");
|
||||
Regy_add(stub_hash, Id_fr, "fr", "Français");
|
||||
Regy_add(stub_hash, Id_frc, "frc", "Français cadien");
|
||||
Regy_add(stub_hash, Id_frp, "frp", "Arpetan");
|
||||
Regy_add(stub_hash, Id_frr, "frr", "Nordfriisk");
|
||||
Regy_add(stub_hash, Id_fur, "fur", "Furlan");
|
||||
Regy_add(stub_hash, Id_fy, "fy", "Frysk");
|
||||
Regy_add(stub_hash, Id_ga, "ga", "Gaeilge");
|
||||
Regy_add(stub_hash, Id_gag, "gag", "Gagauz");
|
||||
Regy_add(stub_hash, Id_gan, "gan", "贛語");
|
||||
Regy_add(stub_hash, Id_gan_hans, "gan-hans", "赣语(简体)");
|
||||
Regy_add(stub_hash, Id_gan_hant, "gan-hant", "贛語(繁體)");
|
||||
Regy_add(stub_hash, Id_gd, "gd", "Gàidhlig");
|
||||
Regy_add(stub_hash, Id_gl, "gl", "Galego");
|
||||
Regy_add(stub_hash, Id_glk, "glk", "گیلکی");
|
||||
Regy_add(stub_hash, Id_gn, "gn", "Avañe'ẽ");
|
||||
Regy_add(stub_hash, Id_gom, "gom", "कोंकणी");
|
||||
Regy_add(stub_hash, Id_gom_deva, "gom-deva", "Konkani");
|
||||
Regy_add(stub_hash, Id_gom_latn, "gom-latn", "कोंकणी (Latin)");
|
||||
Regy_add(stub_hash, Id_gor, "gor", "Gor");
|
||||
Regy_add(stub_hash, Id_got, "got", "𐌲𐌿𐍄𐌹𐍃𐌺");
|
||||
Regy_add(stub_hash, Id_grc, "grc", "Ἀρχαία ἑλληνικὴ");
|
||||
Regy_add(stub_hash, Id_gsw, "gsw", "Alemannisch");
|
||||
Regy_add(stub_hash, Id_gu, "gu", "ગુજરાતી");
|
||||
Regy_add(stub_hash, Id_guc, "guc", "Wayuu");
|
||||
Regy_add(stub_hash, Id_gv, "gv", "Gaelg");
|
||||
Regy_add(stub_hash, Id_ha, "ha", "هَوُسَ");
|
||||
Regy_add(stub_hash, Id_hak, "hak", "Hak-kâ-fa");
|
||||
Regy_add(stub_hash, Id_haw, "haw", "Hawai`i");
|
||||
Regy_add(stub_hash, Id_he, "he", "עברית");
|
||||
Regy_add(stub_hash, Id_hi, "hi", "हिन्दी");
|
||||
Regy_add(stub_hash, Id_hif, "hif", "Fiji Hindi");
|
||||
Regy_add(stub_hash, Id_hif_latn, "hif-latn", "Fiji Hindi");
|
||||
Regy_add(stub_hash, Id_hil, "hil", "Ilonggo");
|
||||
Regy_add(stub_hash, Id_ho, "ho", "Hiri Motu");
|
||||
Regy_add(stub_hash, Id_hr, "hr", "Hrvatski");
|
||||
Regy_add(stub_hash, Id_hrx, "hrx", "Hunsriker");
|
||||
Regy_add(stub_hash, Id_hsb, "hsb", "Hornjoserbsce");
|
||||
Regy_add(stub_hash, Id_hsn, "hsn", "Xiang");
|
||||
Regy_add(stub_hash, Id_ht, "ht", "Kreyòl ayisyen");
|
||||
Regy_add(stub_hash, Id_hu, "hu", "Magyar");
|
||||
Regy_add(stub_hash, Id_hu_formal, "hu-formal", "Magyar (formal)");
|
||||
Regy_add(stub_hash, Id_hy, "hy", "Հայերեն");
|
||||
Regy_add(stub_hash, Id_hz, "hz", "Otsiherero");
|
||||
Regy_add(stub_hash, Id_ia, "ia", "Interlingua");
|
||||
Regy_add(stub_hash, Id_id, "id", "Bahasa Indonesia");
|
||||
Regy_add(stub_hash, Id_ie, "ie", "Interlingue");
|
||||
Regy_add(stub_hash, Id_ig, "ig", "Igbo");
|
||||
Regy_add(stub_hash, Id_ii, "ii", "ꆇꉙ");
|
||||
Regy_add(stub_hash, Id_ik, "ik", "Iñupiak");
|
||||
Regy_add(stub_hash, Id_ike_cans, "ike-cans", "ᐃᓄᒃᑎᑐᑦ");
|
||||
Regy_add(stub_hash, Id_ike_latn, "ike-latn", "inuktitut");
|
||||
Regy_add(stub_hash, Id_ilo, "ilo", "Ilokano");
|
||||
Regy_add(stub_hash, Id_inh, "inh", "ГІалгІай Ğalğaj");
|
||||
Regy_add(stub_hash, Id_io, "io", "Ido");
|
||||
Regy_add(stub_hash, Id_is, "is", "Íslenska");
|
||||
Regy_add(stub_hash, Id_it, "it", "Italiano");
|
||||
Regy_add(stub_hash, Id_iu, "iu", "ᐃᓄᒃᑎᑐᑦ/inuktitut");
|
||||
Regy_add(stub_hash, Id_izh, "izh", "Ingrian");
|
||||
Regy_add(stub_hash, Id_ja, "ja", "日本語");
|
||||
Regy_add(stub_hash, Id_jam, "jam", "Patois");
|
||||
Regy_add(stub_hash, Id_jbo, "jbo", "Lojban");
|
||||
Regy_add(stub_hash, Id_jut, "jut", "Jysk");
|
||||
Regy_add(stub_hash, Id_jv, "jv", "Basa Jawa");
|
||||
Regy_add(stub_hash, Id_ka, "ka", "ქართული");
|
||||
Regy_add(stub_hash, Id_kaa, "kaa", "Qaraqalpaqsha");
|
||||
Regy_add(stub_hash, Id_kab, "kab", "Taqbaylit");
|
||||
Regy_add(stub_hash, Id_kbd, "kbd", "Къэбэрдеибзэ / Qabardjajəbza");
|
||||
Regy_add(stub_hash, Id_kbd_cyrl, "kbd-cyrl", "къэбэрдеибзэ");
|
||||
Regy_add(stub_hash, Id_kbp, "kbp", "Kabiye");
|
||||
Regy_add(stub_hash, Id_kg, "kg", "Kongo");
|
||||
Regy_add(stub_hash, Id_khw, "khw", "کھوار");
|
||||
Regy_add(stub_hash, Id_ki, "ki", "Gĩkũyũ");
|
||||
Regy_add(stub_hash, Id_kiu, "kiu", "Kırmancki");
|
||||
Regy_add(stub_hash, Id_kj, "kj", "Kwanyama");
|
||||
Regy_add(stub_hash, Id_kk, "kk", "Қазақша");
|
||||
Regy_add(stub_hash, Id_kk_arab, "kk-arab", "قازاقشا (تٴوتە)");
|
||||
Regy_add(stub_hash, Id_kk_cn, "kk-cn", "قازاقشا (جۇنگو)");
|
||||
Regy_add(stub_hash, Id_kk_cyrl, "kk-cyrl", "Қазақша (кирил)");
|
||||
Regy_add(stub_hash, Id_kk_kz, "kk-kz", "Қазақша (Қазақстан)");
|
||||
Regy_add(stub_hash, Id_kk_latn, "kk-latn", "Qazaqşa (latın)");
|
||||
Regy_add(stub_hash, Id_kk_tr, "kk-tr", "Qazaqşa (Türkïya)");
|
||||
Regy_add(stub_hash, Id_kl, "kl", "Kalaallisut");
|
||||
Regy_add(stub_hash, Id_km, "km", "ភាសាខ្មែរ");
|
||||
Regy_add(stub_hash, Id_kn, "kn", "ಕನ್ನಡ");
|
||||
Regy_add(stub_hash, Id_ko, "ko", "한국어");
|
||||
Regy_add(stub_hash, Id_ko_kp, "ko-kp", "한국어 (조선)");
|
||||
Regy_add(stub_hash, Id_koi, "koi", "Перем Коми");
|
||||
Regy_add(stub_hash, Id_kok, "kok", "");
|
||||
Regy_add(stub_hash, Id_kr, "kr", "Kanuri");
|
||||
Regy_add(stub_hash, Id_krc, "krc", "Къарачай-Малкъар");
|
||||
Regy_add(stub_hash, Id_kri, "kri", "Krio");
|
||||
Regy_add(stub_hash, Id_krj, "krj", "Kinaray-a");
|
||||
Regy_add(stub_hash, Id_krl, "krl", "Karelian");
|
||||
Regy_add(stub_hash, Id_ks, "ks", "कश्मीरी - (كشميري)");
|
||||
Regy_add(stub_hash, Id_ks_arab, "ks-arab", "کٲشُر");
|
||||
Regy_add(stub_hash, Id_ks_deva, "ks-deva", "कॉशुर");
|
||||
Regy_add(stub_hash, Id_ksh, "ksh", "Ripoarisch");
|
||||
Regy_add(stub_hash, Id_ku, "ku", "Kurdî");
|
||||
Regy_add(stub_hash, Id_ku_arab, "ku-arab", "كوردي (عەرەبی)");
|
||||
Regy_add(stub_hash, Id_ku_latn, "ku-latn", "Kurdî (latînî)");
|
||||
Regy_add(stub_hash, Id_kv, "kv", "Коми");
|
||||
Regy_add(stub_hash, Id_kw, "kw", "Kernowek");
|
||||
Regy_add(stub_hash, Id_ky, "ky", "Кыргызча");
|
||||
Regy_add(stub_hash, Id_la, "la", "Latina");
|
||||
Regy_add(stub_hash, Id_lad, "lad", "Ladino");
|
||||
Regy_add(stub_hash, Id_lb, "lb", "Lëtzebuergesch");
|
||||
Regy_add(stub_hash, Id_lbe, "lbe", "Лакку");
|
||||
Regy_add(stub_hash, Id_lez, "lez", "Лезги");
|
||||
Regy_add(stub_hash, Id_lfn, "lfn", "Lingua Franca Nova");
|
||||
Regy_add(stub_hash, Id_lg, "lg", "Luganda");
|
||||
Regy_add(stub_hash, Id_li, "li", "Limburgs");
|
||||
Regy_add(stub_hash, Id_lij, "lij", "Líguru");
|
||||
Regy_add(stub_hash, Id_liv, "liv", "Līvõ kēļ");
|
||||
Regy_add(stub_hash, Id_lki, "lki", "Laki");
|
||||
Regy_add(stub_hash, Id_lmo, "lmo", "Lumbaart");
|
||||
Regy_add(stub_hash, Id_ln, "ln", "Lingála");
|
||||
Regy_add(stub_hash, Id_lo, "lo", "ລາວ");
|
||||
Regy_add(stub_hash, Id_loz, "loz", "Silozi");
|
||||
Regy_add(stub_hash, Id_lrc, "lrc", "لوری");
|
||||
Regy_add(stub_hash, Id_lt, "lt", "Lietuvių");
|
||||
Regy_add(stub_hash, Id_ltg, "ltg", "Latgaļu");
|
||||
Regy_add(stub_hash, Id_lus, "lus", "Mizo ţawng");
|
||||
Regy_add(stub_hash, Id_luz, "luz", "Luri");
|
||||
Regy_add(stub_hash, Id_lv, "lv", "Latviešu");
|
||||
Regy_add(stub_hash, Id_lzh, "lzh", "文言");
|
||||
Regy_add(stub_hash, Id_lzz, "lzz", "Lazuri");
|
||||
Regy_add(stub_hash, Id_mai, "mai", "मैथिली");
|
||||
Regy_add(stub_hash, Id_map_bms, "map-bms", "Basa Banyumasan");
|
||||
Regy_add(stub_hash, Id_mdf, "mdf", "Мокшень");
|
||||
Regy_add(stub_hash, Id_mg, "mg", "Malagasy");
|
||||
Regy_add(stub_hash, Id_mh, "mh", "Ebon");
|
||||
Regy_add(stub_hash, Id_mhr, "mhr", "Олык Марий");
|
||||
Regy_add(stub_hash, Id_mi, "mi", "Māori");
|
||||
Regy_add(stub_hash, Id_mic, "mic", "Mi'kmaq");
|
||||
Regy_add(stub_hash, Id_min, "min", "Baso Minangkabau");
|
||||
Regy_add(stub_hash, Id_mk, "mk", "Македонски");
|
||||
Regy_add(stub_hash, Id_ml, "ml", "മലയാളം");
|
||||
Regy_add(stub_hash, Id_mn, "mn", "Монгол");
|
||||
Regy_add(stub_hash, Id_mnc, "mnc", "Manchu");
|
||||
Regy_add(stub_hash, Id_mo, "mo", "Молдовеняскэ");
|
||||
Regy_add(stub_hash, Id_mr, "mr", "मराठी");
|
||||
Regy_add(stub_hash, Id_mrj, "mrj", "Кырык мары");
|
||||
Regy_add(stub_hash, Id_ms, "ms", "Bahasa Melayu");
|
||||
Regy_add(stub_hash, Id_mt, "mt", "Malti");
|
||||
Regy_add(stub_hash, Id_mui, "mui", "Musi");
|
||||
Regy_add(stub_hash, Id_mus, "mus", "Mvskoke");
|
||||
Regy_add(stub_hash, Id_mwl, "mwl", "Mirandés");
|
||||
Regy_add(stub_hash, Id_mwv, "mwv", "Behase Mentawei");
|
||||
Regy_add(stub_hash, Id_my, "my", "Burmese");
|
||||
Regy_add(stub_hash, Id_myv, "myv", "Эрзянь");
|
||||
Regy_add(stub_hash, Id_mzn, "mzn", "مازِرونی");
|
||||
Regy_add(stub_hash, Id_na, "na", "Dorerin Naoero");
|
||||
Regy_add(stub_hash, Id_nah, "nah", "Nāhuatl");
|
||||
Regy_add(stub_hash, Id_nan, "nan", "Bân-lâm-gú");
|
||||
Regy_add(stub_hash, Id_nap, "nap", "Nnapulitano");
|
||||
Regy_add(stub_hash, Id_nb, "nb", "Norsk (bokmål)");
|
||||
Regy_add(stub_hash, Id_nds, "nds", "Plattdüütsch");
|
||||
Regy_add(stub_hash, Id_nds_nl, "nds-nl", "Nedersaksisch");
|
||||
Regy_add(stub_hash, Id_ne, "ne", "नेपाली");
|
||||
Regy_add(stub_hash, Id_new, "new", "नेपाल भाषा");
|
||||
Regy_add(stub_hash, Id_ng, "ng", "Oshiwambo");
|
||||
Regy_add(stub_hash, Id_niu, "niu", "Niuē");
|
||||
Regy_add(stub_hash, Id_nl, "nl", "Nederlands");
|
||||
Regy_add(stub_hash, Id_nl_informal, "nl-informal", "Nederlands (informeel)");
|
||||
Regy_add(stub_hash, Id_nn, "nn", "Norsk (nynorsk)");
|
||||
Regy_add(stub_hash, Id_no, "no", "Norsk (bokmål)");
|
||||
Regy_add(stub_hash, Id_nov, "nov", "Novial");
|
||||
Regy_add(stub_hash, Id_nrm, "nrm", "Nouormand");
|
||||
Regy_add(stub_hash, Id_nso, "nso", "Sesotho sa Leboa");
|
||||
Regy_add(stub_hash, Id_nv, "nv", "Diné bizaad");
|
||||
Regy_add(stub_hash, Id_ny, "ny", "Chi-Chewa");
|
||||
Regy_add(stub_hash, Id_oc, "oc", "Occitan");
|
||||
Regy_add(stub_hash, Id_olo, "olo", "Olo");
|
||||
Regy_add(stub_hash, Id_om, "om", "Oromoo");
|
||||
Regy_add(stub_hash, Id_or, "or", "ଓଡ଼ିଆ");
|
||||
Regy_add(stub_hash, Id_os, "os", "Иронау");
|
||||
Regy_add(stub_hash, Id_pa, "pa", "ਪੰਜਾਬੀ");
|
||||
Regy_add(stub_hash, Id_pag, "pag", "Pangasinan");
|
||||
Regy_add(stub_hash, Id_pam, "pam", "Kapampangan");
|
||||
Regy_add(stub_hash, Id_pap, "pap", "Papiamentu");
|
||||
Regy_add(stub_hash, Id_pbb, "pbb", "Páez");
|
||||
Regy_add(stub_hash, Id_pcd, "pcd", "Picard");
|
||||
Regy_add(stub_hash, Id_pdc, "pdc", "Deitsch");
|
||||
Regy_add(stub_hash, Id_pdt, "pdt", "Plautdietsch");
|
||||
Regy_add(stub_hash, Id_pfl, "pfl", "Pälzisch");
|
||||
Regy_add(stub_hash, Id_pi, "pi", "पािऴ");
|
||||
Regy_add(stub_hash, Id_pih, "pih", "Norfuk / Pitkern");
|
||||
Regy_add(stub_hash, Id_pl, "pl", "Polski");
|
||||
Regy_add(stub_hash, Id_pms, "pms", "Piemontèis");
|
||||
Regy_add(stub_hash, Id_pnb, "pnb", "پنجابی");
|
||||
Regy_add(stub_hash, Id_pnt, "pnt", "Ποντιακά");
|
||||
Regy_add(stub_hash, Id_ppl, "ppl", "Pipil");
|
||||
Regy_add(stub_hash, Id_prg, "prg", "Prūsiskan");
|
||||
Regy_add(stub_hash, Id_ps, "ps", "پښتو");
|
||||
Regy_add(stub_hash, Id_pt, "pt", "Português");
|
||||
Regy_add(stub_hash, Id_pt_br, "pt-br", "Português do Brasil");
|
||||
Regy_add(stub_hash, Id_qqq, "qqq", "MediaWiki sample");
|
||||
Regy_add(stub_hash, Id_qu, "qu", "Runa Simi");
|
||||
Regy_add(stub_hash, Id_qug, "qug", "Runa shimi");
|
||||
Regy_add(stub_hash, Id_rap, "rap", "Rapa Nui");
|
||||
Regy_add(stub_hash, Id_rgn, "rgn", "Rumagnôl");
|
||||
Regy_add(stub_hash, Id_rif, "rif", "Tarifit");
|
||||
Regy_add(stub_hash, Id_rm, "rm", "Rumantsch");
|
||||
Regy_add(stub_hash, Id_rmf, "rmf", "Finnish Kalo");
|
||||
Regy_add(stub_hash, Id_rmy, "rmy", "Romani");
|
||||
Regy_add(stub_hash, Id_rn, "rn", "Kirundi");
|
||||
Regy_add(stub_hash, Id_ro, "ro", "Română");
|
||||
Regy_add(stub_hash, Id_roa_rup, "roa-rup", "Armãneashce");
|
||||
Regy_add(stub_hash, Id_roa_tara, "roa-tara", "Tarandíne");
|
||||
Regy_add(stub_hash, Id_ru, "ru", "Русский");
|
||||
Regy_add(stub_hash, Id_rue, "rue", "Русиньскый");
|
||||
Regy_add(stub_hash, Id_rup, "rup", "Armãneașce");
|
||||
Regy_add(stub_hash, Id_ruq, "ruq", "Vlăheşte");
|
||||
Regy_add(stub_hash, Id_ruq_cyrl, "ruq-cyrl", "Влахесте");
|
||||
Regy_add(stub_hash, Id_ruq_latn, "ruq-latn", "Vlăheşte");
|
||||
Regy_add(stub_hash, Id_rw, "rw", "Kinyarwanda");
|
||||
Regy_add(stub_hash, Id_ryu, "ryu", "Okinawan");
|
||||
Regy_add(stub_hash, Id_sa, "sa", "संस्कृत");
|
||||
Regy_add(stub_hash, Id_sah, "sah", "Саха тыла");
|
||||
Regy_add(stub_hash, Id_sat, "sat", "Santali");
|
||||
Regy_add(stub_hash, Id_saz, "saz", "Saurashtra");
|
||||
Regy_add(stub_hash, Id_sc, "sc", "Sardu");
|
||||
Regy_add(stub_hash, Id_scn, "scn", "Sicilianu");
|
||||
Regy_add(stub_hash, Id_sco, "sco", "Scots");
|
||||
Regy_add(stub_hash, Id_sd, "sd", "سنڌي");
|
||||
Regy_add(stub_hash, Id_sdc, "sdc", "Sassaresu");
|
||||
Regy_add(stub_hash, Id_sdh, "sdh", "Southern Kurdish");
|
||||
Regy_add(stub_hash, Id_se, "se", "Sámegiella");
|
||||
Regy_add(stub_hash, Id_sei, "sei", "Cmique Itom");
|
||||
Regy_add(stub_hash, Id_ses, "ses", "Songhay");
|
||||
Regy_add(stub_hash, Id_sg, "sg", "Sängö");
|
||||
Regy_add(stub_hash, Id_sgs, "sgs", "Žemaitėška");
|
||||
Regy_add(stub_hash, Id_sh, "sh", "Srpskohrvatski / Српскохрватски");
|
||||
Regy_add(stub_hash, Id_shi, "shi", "Tašlḥiyt");
|
||||
Regy_add(stub_hash, Id_shn, "shn", "Shan");
|
||||
Regy_add(stub_hash, Id_si, "si", "Sinhalese");
|
||||
Regy_add(stub_hash, Id_simple, "simple", "Simple English");
|
||||
Regy_add(stub_hash, Id_sk, "sk", "Slovenčina");
|
||||
Regy_add(stub_hash, Id_sl, "sl", "Slovenščina");
|
||||
Regy_add(stub_hash, Id_sli, "sli", "Schläsch");
|
||||
Regy_add(stub_hash, Id_sly, "sly", "Selayar");
|
||||
Regy_add(stub_hash, Id_sm, "sm", "Gagana Samoa");
|
||||
Regy_add(stub_hash, Id_sma, "sma", "Åarjelsaemien");
|
||||
Regy_add(stub_hash, Id_sn, "sn", "chiShona");
|
||||
Regy_add(stub_hash, Id_so, "so", "Soomaaliga");
|
||||
Regy_add(stub_hash, Id_sq, "sq", "Shqip");
|
||||
Regy_add(stub_hash, Id_sr, "sr", "Српски / Srpski");
|
||||
Regy_add(stub_hash, Id_sr_ec, "sr-ec", "Српски (ћирилица)");
|
||||
Regy_add(stub_hash, Id_sr_el, "sr-el", "Srpski (latinica)");
|
||||
Regy_add(stub_hash, Id_srn, "srn", "Sranantongo");
|
||||
Regy_add(stub_hash, Id_ss, "ss", "SiSwati");
|
||||
Regy_add(stub_hash, Id_st, "st", "Sesotho");
|
||||
Regy_add(stub_hash, Id_stq, "stq", "Seeltersk");
|
||||
Regy_add(stub_hash, Id_su, "su", "Basa Sunda");
|
||||
Regy_add(stub_hash, Id_sv, "sv", "Svenska");
|
||||
Regy_add(stub_hash, Id_sw, "sw", "Kiswahili");
|
||||
Regy_add(stub_hash, Id_sxu, "sxu", "Saxon, Upper");
|
||||
Regy_add(stub_hash, Id_szl, "szl", "Ślůnski");
|
||||
Regy_add(stub_hash, Id_ta, "ta", "தமிழ்");
|
||||
Regy_add(stub_hash, Id_tcy, "tcy", "ತುಳು");
|
||||
Regy_add(stub_hash, Id_te, "te", "తెలుగు");
|
||||
Regy_add(stub_hash, Id_test, "test", "MediaWiki test");
|
||||
Regy_add(stub_hash, Id_tet, "tet", "Tetun");
|
||||
Regy_add(stub_hash, Id_tg, "tg", "Тоҷикӣ");
|
||||
Regy_add(stub_hash, Id_tg_cyrl, "tg-cyrl", "Тоҷикӣ");
|
||||
Regy_add(stub_hash, Id_tg_latn, "tg-latn", "tojikī");
|
||||
Regy_add(stub_hash, Id_th, "th", "ไทย");
|
||||
Regy_add(stub_hash, Id_ti, "ti", "ትግርኛ");
|
||||
Regy_add(stub_hash, Id_tk, "tk", "Türkmençe");
|
||||
Regy_add(stub_hash, Id_tl, "tl", "Tagalog");
|
||||
Regy_add(stub_hash, Id_tly, "tly", "толышә зывон");
|
||||
Regy_add(stub_hash, Id_tn, "tn", "Setswana");
|
||||
Regy_add(stub_hash, Id_to, "to", "lea faka-Tonga");
|
||||
Regy_add(stub_hash, Id_tokipona, "tokipona", "Toki Pona");
|
||||
Regy_add(stub_hash, Id_tp, "tp", "Toki Pona (deprecated:tokipona)");
|
||||
Regy_add(stub_hash, Id_tpi, "tpi", "Tok Pisin");
|
||||
Regy_add(stub_hash, Id_tr, "tr", "Türkçe");
|
||||
Regy_add(stub_hash, Id_tru, "tru", "Ṫuroyo");
|
||||
Regy_add(stub_hash, Id_ts, "ts", "Xitsonga");
|
||||
Regy_add(stub_hash, Id_tt, "tt", "Татарча/Tatarça");
|
||||
Regy_add(stub_hash, Id_tt_cyrl, "tt-cyrl", "Татарча");
|
||||
Regy_add(stub_hash, Id_tt_latn, "tt-latn", "Tatarça");
|
||||
Regy_add(stub_hash, Id_ttt, "ttt", "Tat, Muslim");
|
||||
Regy_add(stub_hash, Id_tum, "tum", "chiTumbuka");
|
||||
Regy_add(stub_hash, Id_tw, "tw", "Twi");
|
||||
Regy_add(stub_hash, Id_ty, "ty", "Reo Mā`ohi");
|
||||
Regy_add(stub_hash, Id_tyv, "tyv", "Тыва дыл");
|
||||
Regy_add(stub_hash, Id_tzm, "tzm", "ⵜⴰⵎⴰⵣⵉⵖⵜ");
|
||||
Regy_add(stub_hash, Id_ua, "ua", "Ukrainian");
|
||||
Regy_add(stub_hash, Id_udm, "udm", "Удмурт");
|
||||
Regy_add(stub_hash, Id_ug, "ug", "ئۇيغۇرچە / Uyghurche");
|
||||
Regy_add(stub_hash, Id_ug_arab, "ug-arab", "ئۇيغۇرچە");
|
||||
Regy_add(stub_hash, Id_ug_latn, "ug-latn", "Uyghurche");
|
||||
Regy_add(stub_hash, Id_uk, "uk", "Українська");
|
||||
Regy_add(stub_hash, Id_ur, "ur", "اردو");
|
||||
Regy_add(stub_hash, Id_uz, "uz", "O'zbek");
|
||||
Regy_add(stub_hash, Id_ve, "ve", "Tshivenda");
|
||||
Regy_add(stub_hash, Id_vec, "vec", "Vèneto");
|
||||
Regy_add(stub_hash, Id_vep, "vep", "Vepsan kel'");
|
||||
Regy_add(stub_hash, Id_vi, "vi", "Tiếng Việt");
|
||||
Regy_add(stub_hash, Id_vls, "vls", "West-Vlams");
|
||||
Regy_add(stub_hash, Id_vmf, "vmf", "Mainfränkisch");
|
||||
Regy_add(stub_hash, Id_vo, "vo", "Volapük");
|
||||
Regy_add(stub_hash, Id_vot, "vot", "Vaďďa");
|
||||
Regy_add(stub_hash, Id_vro, "vro", "Võro");
|
||||
Regy_add(stub_hash, Id_wa, "wa", "Walon");
|
||||
Regy_add(stub_hash, Id_war, "war", "Winaray");
|
||||
Regy_add(stub_hash, Id_wo, "wo", "Wolof");
|
||||
Regy_add(stub_hash, Id_wuu, "wuu", "吴语");
|
||||
Regy_add(stub_hash, Id_xal, "xal", "Хальмг");
|
||||
Regy_add(stub_hash, Id_xh, "xh", "isiXhosa");
|
||||
Regy_add(stub_hash, Id_xmf, "xmf", "მარგალური");
|
||||
Regy_add(stub_hash, Id_yi, "yi", "ייִדיש");
|
||||
Regy_add(stub_hash, Id_yo, "yo", "Yorùbá");
|
||||
Regy_add(stub_hash, Id_yue, "yue", "粵語");
|
||||
Regy_add(stub_hash, Id_za, "za", "Vahcuengh");
|
||||
Regy_add(stub_hash, Id_zea, "zea", "Zeêuws");
|
||||
Regy_add(stub_hash, Id_zh, "zh", "中文");
|
||||
Regy_add(stub_hash, Id_zh_classical, "zh-classical", "文言");
|
||||
Regy_add(stub_hash, Id_zh_cn, "zh-cn", "中文(中国大陆)");
|
||||
Regy_add(stub_hash, Id_zh_hans, "zh-hans", "中文(简体)");
|
||||
Regy_add(stub_hash, Id_zh_hant, "zh-hant", "中文(繁體)");
|
||||
Regy_add(stub_hash, Id_zh_hk, "zh-hk", "中文(香港)");
|
||||
Regy_add(stub_hash, Id_zh_min_nan, "zh-min-nan", "Bân-lâm-gú");
|
||||
Regy_add(stub_hash, Id_zh_mo, "zh-mo", "中文(澳門)");
|
||||
Regy_add(stub_hash, Id_zh_my, "zh-my", "中文(马来西亚)");
|
||||
Regy_add(stub_hash, Id_zh_sg, "zh-sg", "中文(新加坡)");
|
||||
Regy_add(stub_hash, Id_zh_tw, "zh-tw", "中文(台灣)");
|
||||
Regy_add(stub_hash, Id_zh_yue, "zh-yue", "粵語");
|
||||
Regy_add(stub_hash, Id_zu, "zu", "isiZulu");
|
||||
}
|
||||
return stub_hash;
|
||||
}
|
||||
private static Hash_adp_bry stub_hash; private static final Xol_lang_stub[] stub_ary = new Xol_lang_stub[Id__max];
|
||||
public static Xol_lang_stub[] Ary() {return stub_ary;}
|
||||
private static void Regy_add(Hash_adp_bry stub_hash, int uid, String code_str, String canonical) {
|
||||
byte[] code = Bry_.new_a7(code_str);// ASCII:lang_code should always be ASCII
|
||||
Xol_lang_stub itm = new Xol_lang_stub(uid, code, Bry_.new_u8(canonical));
|
||||
stub_ary[uid] = itm;
|
||||
stub_hash.Add(code, itm);
|
||||
}
|
||||
public static boolean Exists(byte[] key) {return Get_by_key_or_null(key) != null;} // Language.php!isSupportedLanguage
|
||||
public static Xol_lang_stub Get_by_id(int id) {if (stub_hash == null) Regy(); return stub_ary[id];}
|
||||
public static Xol_lang_stub Get_by_key_or_null(byte[] key) {return Get_by_key_or_null(key, 0, key.length);}
|
||||
public static Xol_lang_stub Get_by_key_or_null(byte[] key, int bgn, int end) {
|
||||
if (stub_hash == null) Regy();
|
||||
return (Xol_lang_stub)stub_hash.Get_by_mid(key, bgn, end);
|
||||
}
|
||||
public static Xol_lang_stub Get_by_key_or_en(byte[] key) {
|
||||
Xol_lang_stub rv = Get_by_key_or_null(key);
|
||||
return (rv == null) ? (Xol_lang_stub)stub_hash.Get_by_bry(Xol_lang_itm_.Key_en) : rv;
|
||||
}
|
||||
public static Xol_lang_stub Get_by_key_or_intl(byte[] key) {return Get_by_key_or_intl(key, 0, key.length);}
|
||||
public static Xol_lang_stub Get_by_key_or_intl(byte[] key, int bgn, int end) {
|
||||
Xol_lang_stub rv = Get_by_key_or_null(key, bgn, end);
|
||||
return rv == null ? Intl : rv;
|
||||
}
|
||||
public static final Xol_lang_stub Intl = new Xol_lang_stub(Xol_lang_stub_.Id__intl, Bry_.Empty, Bry_.Empty); // intended for international wikis like commons, wikidata, etc..
|
||||
}
|
||||
class Xol_sub_itm_comparer implements ComparerAble {
|
||||
public int compare(Object lhsObj, Object rhsObj) {
|
||||
Xol_lang_stub lhs = (Xol_lang_stub)lhsObj;
|
||||
Xol_lang_stub rhs = (Xol_lang_stub)rhsObj;
|
||||
return Bry_.Compare(lhs.Key(), rhs.Key());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,69 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*; import gplx.langs.jsons.*; import gplx.langs.phps.*; import gplx.langs.gfs.*;
|
||||
import gplx.xowa.apps.gfs.*;
|
||||
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.parsers.*;
|
||||
interface Json_itm_wkr {
|
||||
void Read_kv_sub(byte[] key, byte[] val);
|
||||
}
|
||||
abstract class Json_itm_wkr__base implements Json_itm_wkr {
|
||||
private Json_parser json_parser = new Json_parser();
|
||||
private Php_text_itm_parser php_quote_parser = new Php_text_itm_parser().Quote_is_single_(true); // assume values are equivalent to php single quote; DATE:2014-08-06
|
||||
public void Exec(byte[] src) {
|
||||
List_adp tmp_list = List_adp_.New(); Byte_obj_ref tmp_result = Byte_obj_ref.zero_(); Bry_bfr tmp_bfr = Bry_bfr_.Reset(16);
|
||||
Json_doc jdoc = json_parser.Parse(src);
|
||||
this.Exec_bgn();
|
||||
Json_nde root = jdoc.Root_nde();
|
||||
int subs_len = root.Len();
|
||||
for (int i = 0; i < subs_len; ++i) {
|
||||
Json_itm itm = root.Get_at(i);
|
||||
switch (itm.Tid()) {
|
||||
case Json_itm_.Tid__kv:
|
||||
Json_kv kv = (Json_kv)itm;
|
||||
if (kv.Key().Data_eq(Name_metadata)) continue; // ignore @metadata node
|
||||
byte[] kv_key = kv.Key().Data_bry();
|
||||
byte[] kv_val = kv.Val().Data_bry();
|
||||
kv_val = php_quote_parser.Parse_as_bry(tmp_list, kv_val, tmp_result, tmp_bfr);
|
||||
Read_kv_sub(kv_key, kv_val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
this.Exec_end();
|
||||
}
|
||||
@gplx.Virtual public void Exec_bgn() {}
|
||||
@gplx.Virtual public void Exec_end() {}
|
||||
public abstract void Read_kv_sub(byte[] key, byte[] val);
|
||||
private static final byte[] Name_metadata = Bry_.new_a7("@metadata");
|
||||
}
|
||||
class Json_itm_wkr__gfs extends Json_itm_wkr__base {
|
||||
private Xoa_gfs_bldr gfs_bldr = new Xoa_gfs_bldr();
|
||||
private Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
private Bry_bfr bfr;
|
||||
public byte[] Xto_bry() {return gfs_bldr.Xto_bry();}
|
||||
@Override public void Exec_bgn() {
|
||||
bfr = gfs_bldr.Bfr();
|
||||
gfs_bldr.Add_proc_init_many("this", "messages", "load_text").Add_paren_bgn().Add_nl();
|
||||
gfs_bldr.Add_quote_xtn_bgn();
|
||||
}
|
||||
@Override public void Exec_end() {
|
||||
gfs_bldr.Add_quote_xtn_end().Add_paren_end().Add_term_nl();
|
||||
}
|
||||
@Override public void Read_kv_sub(byte[] key, byte[] val) {
|
||||
csv_parser.Save(bfr, key); // key
|
||||
bfr.Add_byte_pipe(); // |
|
||||
csv_parser.Save(bfr, val); // val
|
||||
bfr.Add_byte_nl(); // \n
|
||||
}
|
||||
}
|
||||
class Json_itm_wkr__msgs extends Json_itm_wkr__base {
|
||||
private Xol_msg_mgr msg_mgr; private boolean dirty;
|
||||
public void Ctor(boolean dirty, Xol_msg_mgr msg_mgr) {this.dirty = dirty; this.msg_mgr = msg_mgr;}
|
||||
@Override public void Read_kv_sub(byte[] key, byte[] val) {
|
||||
Xol_msg_itm msg_itm = msg_mgr.Itm_by_key_or_new(key);
|
||||
Xol_msg_itm_.update_val_(msg_itm, val);
|
||||
if (dirty) // bldr needs to dirty message to generate lang.gfs; DATE:2014-08-05
|
||||
msg_itm.Dirty_(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,18 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.*;
|
||||
public class Xob_i18n_parser {
|
||||
public static void Load_msgs(boolean dirty, Xol_lang_itm lang, Io_url i18n_fil) {
|
||||
String i18n_str = Io_mgr.Instance.LoadFilStr_args(i18n_fil).MissingIgnored_().Exec(); if (String_.Len_eq_0(i18n_str)) return;
|
||||
Json_itm_wkr__msgs wkr = new Json_itm_wkr__msgs();
|
||||
wkr.Ctor(dirty, lang.Msg_mgr());
|
||||
wkr.Exec(Bry_.new_u8(i18n_str));
|
||||
}
|
||||
public static byte[] Xto_gfs(byte[] raw) {
|
||||
Json_itm_wkr__gfs wkr = new Json_itm_wkr__gfs();
|
||||
wkr.Exec(raw);
|
||||
return wkr.Xto_bry();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,50 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
import gplx.core.intls.*;
|
||||
public class Xob_i18n_parser_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xob_i18n_parser_fxt fxt = new Xob_i18n_parser_fxt();
|
||||
@Test public void Basic() {
|
||||
fxt.Test_xto_gfs(String_.Concat_lines_nl_skip_last
|
||||
( "{"
|
||||
, " \"@metadata\": {"
|
||||
, " \"authors\": []"
|
||||
, " },"
|
||||
, "\"key_1\": \"val_1\","
|
||||
, "\"key_2\": \"val_2\","
|
||||
, "\"key_3\": \"val $1\","
|
||||
, "}"
|
||||
), String_.Concat_lines_nl_skip_last
|
||||
( "this.messages.load_text("
|
||||
, "<:['"
|
||||
, "key_1|val_1"
|
||||
, "key_2|val_2"
|
||||
, "key_3|val ~{0}"
|
||||
, "']:>"
|
||||
, ");"
|
||||
));
|
||||
}
|
||||
// @Test public void Load_msgs_validate() {
|
||||
// fxt.Test_load_msgs_dir("C:\\xowa\\bin\\any\\xowa\\xtns\\Insider\\i18n\\");
|
||||
// }
|
||||
}
|
||||
class Xob_i18n_parser_fxt {
|
||||
public void Clear() {
|
||||
}
|
||||
public void Test_xto_gfs(String raw, String expd) {
|
||||
byte[] actl = Xob_i18n_parser.Xto_gfs(Bry_.new_u8(raw));
|
||||
Tfds.Eq_str_lines(expd, String_.new_u8(actl));
|
||||
}
|
||||
public void Test_load_msgs_dir(String dir_str) {
|
||||
Xoae_app app = Xoa_app_fxt.Make__app__edit();
|
||||
Xowe_wiki wiki = Xoa_app_fxt.Make__wiki__edit(app);
|
||||
Io_url dir_url = Io_url_.new_dir_(dir_str);
|
||||
Io_url[] fil_urls = Io_mgr.Instance.QueryDir_fils(dir_url);
|
||||
int len = fil_urls.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Xob_i18n_parser.Load_msgs(false, wiki.Lang(), fil_urls[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,36 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.log_msgs.*;
|
||||
import gplx.xowa.apps.fsys.*;
|
||||
import gplx.xowa.langs.*;
|
||||
public class Xobc_utl_make_lang implements Gfo_invk {
|
||||
private final Xoa_lang_mgr lang_mgr; private final Xoa_fsys_mgr fsys_mgr; Xol_mw_lang_parser lang_parser;
|
||||
public Xobc_utl_make_lang(Xoa_lang_mgr lang_mgr, Xoa_fsys_mgr fsys_mgr, Gfo_msg_log msg_log) {
|
||||
this.lang_mgr = lang_mgr; this.fsys_mgr = fsys_mgr;
|
||||
kwd_mgr = new Xobc_utl_make_lang_kwds(lang_mgr);
|
||||
lang_parser = new Xol_mw_lang_parser(msg_log);
|
||||
}
|
||||
public Xobc_utl_make_lang_kwds Kwd_mgr() {return kwd_mgr;} private Xobc_utl_make_lang_kwds kwd_mgr;
|
||||
public Ordered_hash Manual_text_bgn_hash() {return manual_text_bgn_hash;} private final Ordered_hash manual_text_bgn_hash = Ordered_hash_.New_bry();
|
||||
public Ordered_hash Manual_text_end_hash() {return manual_text_end_hash;} private final Ordered_hash manual_text_end_hash = Ordered_hash_.New_bry();
|
||||
public void Bld_all() {
|
||||
Io_url lang_root = fsys_mgr.Cfg_lang_core_dir().OwnerDir(); // OwnerDir to get "/lang/" in "/cfg/lang/core/"
|
||||
lang_parser.Parse_mediawiki(lang_mgr, lang_root.GenSubDir("mediawiki"), kwd_mgr);
|
||||
kwd_mgr.Add_words();
|
||||
lang_parser.Save_langs(lang_mgr, lang_root.GenSubDir(Xol_mw_lang_parser.Dir_name_core), manual_text_bgn_hash, manual_text_end_hash);
|
||||
Gfo_usr_dlg_.Instance.Prog_many("", "", "done");
|
||||
}
|
||||
public void Parse_manual_text(byte[] key, byte[] text, Ordered_hash manual_text) {
|
||||
manual_text.Add(key, new byte[][] {key, text});
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_kwds)) return kwd_mgr;
|
||||
else if (ctx.Match(k, Invk_build_all)) Bld_all();
|
||||
else if (ctx.Match(k, Invk_manual_text_bgn)) Parse_manual_text(m.ReadBry("langs"), m.ReadBry("text"), manual_text_bgn_hash);
|
||||
else if (ctx.Match(k, Invk_manual_text_end)) Parse_manual_text(m.ReadBry("langs"), m.ReadBry("text"), manual_text_end_hash);
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_kwds = "keywords", Invk_manual_text_bgn = "manual_text_bgn", Invk_manual_text_end = "manual_text_end", Invk_build_all = "build_all";
|
||||
}
|
||||
|
||||
@@ -13,135 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.parsers.*;
|
||||
public class Xobc_utl_make_lang_kwds implements Gfo_invk, Xol_lang_transform {
|
||||
private final Xoa_lang_mgr lang_mgr;
|
||||
public Xobc_utl_make_lang_kwds(Xoa_lang_mgr lang_mgr) {this.lang_mgr = lang_mgr;}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_keep_trailing_colon)) Parse_keep_trailing_colon(m.ReadBry("langs"), m.ReadBry("text"));
|
||||
else if (ctx.Match(k, Invk_prepend_hash)) Parse_prepend_hash(m.ReadBry("langs"), m.ReadBry("text"));
|
||||
else if (ctx.Match(k, Invk_add_words)) Parse_add_words(m.ReadBry("langs"), m.ReadBry("text"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_keep_trailing_colon = "keep_trailing_colon", Invk_prepend_hash = "prepend_hash", Invk_add_words = "add_words";
|
||||
|
||||
public byte[] Kwd_transform(byte[] lang_key, byte[] kwd_key, byte[] kwd_word) {
|
||||
byte[] rv = kwd_word;
|
||||
if (!Hash_itm_applies(trailing_colons, lang_key, kwd_key, kwd_word)) {
|
||||
int kwd_last = rv.length - 1;
|
||||
if (kwd_last > 0 && rv[kwd_last] == Byte_ascii.Colon)
|
||||
rv = Bry_.Mid(rv, 0, rv.length - 1);
|
||||
}
|
||||
if (Hash_itm_applies(prepend_hash, lang_key, kwd_key, kwd_word)) {
|
||||
if (rv.length > 0 && rv[0] != Byte_ascii.Hash)
|
||||
rv = Bry_.Add(Byte_ascii.Hash, rv);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public void Add_words() {
|
||||
Ordered_hash hash = add_words_hash;
|
||||
Ordered_hash tmp = Ordered_hash_.New_bry();
|
||||
int hash_len = hash.Count();
|
||||
for (int i = 0; i < hash_len; i++) {
|
||||
Xobcl_kwd_lang cfg_lang = (Xobcl_kwd_lang)hash.Get_at(i);
|
||||
Xol_lang_itm lang = lang_mgr.Get_by(cfg_lang.Key_bry()); if (lang == null) continue;
|
||||
int cfg_grp_len = cfg_lang.Grps().length;
|
||||
for (int j = 0; j < cfg_grp_len; j++) {
|
||||
Xobcl_kwd_row cfg_grp = cfg_lang.Grps()[j];
|
||||
int kwd_id = Xol_kwd_grp_.Id_by_bry(cfg_grp.Key());
|
||||
if (kwd_id == -1) throw Err_.new_wo_type("could not find kwd for key", "key", String_.new_u8(cfg_grp.Key()));
|
||||
Xol_kwd_grp kwd_grp = lang.Kwd_mgr().Get_at(kwd_id);
|
||||
tmp.Clear();
|
||||
if (kwd_grp == null) {
|
||||
kwd_grp = lang.Kwd_mgr().Get_or_new(kwd_id);
|
||||
kwd_grp.Srl_load(Bool_.N, Bry_.Ary_empty); // ASSUME: kwd explicitly added, but does not exist in language; default to !case_match
|
||||
}
|
||||
|
||||
for (Xol_kwd_itm itm : kwd_grp.Itms())
|
||||
tmp.Add(itm.Val(), itm.Val());
|
||||
if (cfg_grp.Itms().length == 0) {
|
||||
if (!tmp.Has(cfg_grp.Key())) tmp.Add(cfg_grp.Key(), cfg_grp.Key());
|
||||
}
|
||||
else {
|
||||
for (byte[] itm : cfg_grp.Itms()) {
|
||||
if (!tmp.Has(itm)) tmp.Add(itm, itm);
|
||||
}
|
||||
}
|
||||
byte[][] words = (byte[][])tmp.To_ary(byte[].class);
|
||||
kwd_grp.Srl_load(kwd_grp.Case_match(), words);
|
||||
}
|
||||
}
|
||||
}
|
||||
boolean Hash_itm_applies(Ordered_hash hash, byte[] lang_key, byte[] kwd_key, byte[] kwd_word) {
|
||||
Xobcl_kwd_lang cfg_lang = (Xobcl_kwd_lang)hash.Get_by(lang_key); if (cfg_lang == null) return false;
|
||||
Xobcl_kwd_row cfg_grp = cfg_lang.Grps_get_by_key(kwd_key); if (cfg_grp == null) return false;
|
||||
return cfg_grp.Itms().length == 0 || cfg_grp.Itms_has(kwd_word);
|
||||
}
|
||||
public void Parse_add_words(byte[] langs_bry, byte[] kwds) {Parse(langs_bry, kwds, add_words_hash);} private Ordered_hash add_words_hash = Ordered_hash_.New_bry();
|
||||
public void Parse_prepend_hash(byte[] langs_bry, byte[] kwds) {Parse(langs_bry, kwds, prepend_hash);} private Ordered_hash prepend_hash = Ordered_hash_.New_bry();
|
||||
public void Parse_keep_trailing_colon(byte[] langs_bry, byte[] kwds) {Parse(langs_bry, kwds, trailing_colons);} private Ordered_hash trailing_colons = Ordered_hash_.New_bry();
|
||||
private void Parse(byte[] langs_bry, byte[] kwds, Ordered_hash hash) {
|
||||
Xobcl_kwd_row[] itms = Parse(kwds);
|
||||
Xol_lang_stub[] stub_ary = Xol_lang_stub_.Ary(); // NOTE: was "lang_mgr.To_hash(langs_bry);" which was effectively "wiki_types" -> all langs; DATE:2015-10-07
|
||||
int len = stub_ary.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Xol_lang_stub stub_itm = stub_ary[i];
|
||||
byte[] key = stub_itm.Key();
|
||||
Xobcl_kwd_lang grp = (Xobcl_kwd_lang)hash.Get_by(key);
|
||||
if (grp == null) {
|
||||
grp = new Xobcl_kwd_lang(key, itms);
|
||||
hash.Add(key, grp);
|
||||
}
|
||||
else
|
||||
grp.Merge(itms);
|
||||
}
|
||||
}
|
||||
@gplx.Internal protected static Xobcl_kwd_row[] Parse(byte[] src) {
|
||||
int src_len = src.length, pos = 0, fld_bgn = 0;
|
||||
byte[] cur_key = Bry_.Empty;
|
||||
Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
List_adp rv = List_adp_.New(); int fld_idx = 0;
|
||||
while (true) {
|
||||
boolean last = pos == src_len; // NOTE: logic occurs b/c of \n}~-> dlm which gobbles up last \n
|
||||
byte b = last ? Byte_ascii.Nl : src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
cur_key = csv_parser.Load(src, fld_bgn, pos);
|
||||
fld_bgn = pos + 1;
|
||||
++fld_idx;
|
||||
break;
|
||||
case Byte_ascii.Nl:
|
||||
if (pos - fld_bgn > 0 || fld_idx == 1) {
|
||||
byte[] cur_val = csv_parser.Load(src, fld_bgn, pos);
|
||||
Xobcl_kwd_row row = new Xobcl_kwd_row(cur_key, Bry_split_.Split(cur_val, Byte_ascii.Tilde));
|
||||
rv.Add(row);
|
||||
}
|
||||
fld_bgn = pos + 1;
|
||||
fld_idx = 0;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (last) break;
|
||||
++pos;
|
||||
}
|
||||
return (Xobcl_kwd_row[])rv.To_ary(Xobcl_kwd_row.class);
|
||||
}
|
||||
}
|
||||
class Xobcl_kwd_lang {
|
||||
public Xobcl_kwd_lang(byte[] key_bry, Xobcl_kwd_row[] grps) {
|
||||
this.key_bry = key_bry; this.grps = grps;
|
||||
for (Xobcl_kwd_row grp : grps)
|
||||
grps_hash.Add(grp.Key(), grp);
|
||||
}
|
||||
public void Merge(Xobcl_kwd_row[] v) {
|
||||
grps = (Xobcl_kwd_row[])Array_.Resize_add(grps, v);
|
||||
for (Xobcl_kwd_row grp : v) {
|
||||
grps_hash.Add_if_dupe_use_nth(grp.Key(), grp); // NOTE: Add_if_dupe_use_nth instead of Add b/c kwds may be expanded; EX: lst is added to all langs but de requires #lst~#section~Abschnitt~; DATE:2013-06-02
|
||||
}
|
||||
}
|
||||
public Xobcl_kwd_row Grps_get_by_key(byte[] key) {return (Xobcl_kwd_row)grps_hash.Get_by(key);} private Ordered_hash grps_hash = Ordered_hash_.New_bry();
|
||||
public byte[] Key_bry() {return key_bry;} private byte[] key_bry;
|
||||
public Xobcl_kwd_row[] Grps() {return grps;} private Xobcl_kwd_row[] grps;
|
||||
}
|
||||
|
||||
@@ -13,166 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*; import gplx.core.strings.*;
|
||||
import gplx.xowa.langs.*;
|
||||
public class Xobc_utl_make_lang_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xobc_utl_make_lang_fxt fxt = new Xobc_utl_make_lang_fxt();
|
||||
@Test public void Parse() {
|
||||
fxt.Parse_rows(String_.Concat_lines_nl
|
||||
( ""
|
||||
, "if|#if~#si~"
|
||||
, ""
|
||||
, "ifeq|#ifeq~#sieq"
|
||||
, ""
|
||||
, "expr|"
|
||||
)
|
||||
, fxt.row_("if", "#if", "#si")
|
||||
, fxt.row_("ifeq", "#ifeq", "#sieq")
|
||||
, fxt.row_("expr")
|
||||
);
|
||||
}
|
||||
@Test public void Trailing_colon() {
|
||||
fxt.Kwd_mgr().Parse_keep_trailing_colon(Bry_.new_a7("fr"), Bry_.new_u8(String_.Concat_lines_nl
|
||||
( "if|if:~si:~"
|
||||
, "ifeq|"
|
||||
)));
|
||||
fxt.Ini_file_mw_core("fr", String_.Concat_lines_nl
|
||||
( "$magicWords = array("
|
||||
, " 'expr' => array(0, 'expr:'),"
|
||||
, " 'if' => array(0, 'if:', 'si:', 'if_unchanged:'),"
|
||||
, " 'ifeq' => array(0, 'ifeq:', 'sieq:'),"
|
||||
, ");"
|
||||
)
|
||||
);
|
||||
fxt.Mgr().Bld_all();
|
||||
fxt.Tst_file_xo("fr", String_.Concat_lines_nl
|
||||
( "this"
|
||||
, ".keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "expr|0|expr~"
|
||||
, "if|0|if:~si:~if_unchanged~"
|
||||
, "ifeq|0|ifeq:~sieq:~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ";"
|
||||
));
|
||||
}
|
||||
@Test public void Prepend_hash() {
|
||||
fxt.Kwd_mgr().Parse_prepend_hash(Bry_.new_a7("fr"), Bry_.new_u8(String_.Concat_lines_nl
|
||||
( "if|if:~si:~"
|
||||
, "ifeq|"
|
||||
, "tag|tag~"
|
||||
)));
|
||||
fxt.Ini_file_mw_core("fr", String_.Concat_lines_nl
|
||||
( "$magicWords = array("
|
||||
, " 'tag' => array( '0', 'etiqueta', 'ETIQUETA', 'tag' ),"
|
||||
, " 'expr' => array(0, 'expr:'),"
|
||||
, " 'if' => array(0, 'if:', 'si:', 'if_unchanged:'),"
|
||||
, " 'ifeq' => array(0, 'ifeq:', 'sieq:'),"
|
||||
, ");"
|
||||
)
|
||||
);
|
||||
fxt.Mgr().Bld_all();
|
||||
fxt.Tst_file_xo("fr", String_.Concat_lines_nl
|
||||
( "this"
|
||||
, ".keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "tag|0|etiqueta~ETIQUETA~#tag~"
|
||||
, "expr|0|expr~"
|
||||
, "if|0|#if~#si~if_unchanged~"
|
||||
, "ifeq|0|#ifeq~#sieq~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ";"
|
||||
));
|
||||
}
|
||||
@Test public void Add_words_hash() {
|
||||
fxt.Kwd_mgr().Parse_add_words(Bry_.new_a7("fr"), Bry_.new_u8(String_.Concat_lines_nl
|
||||
( "if|if_new:~if~"
|
||||
, "ifeq|"
|
||||
)));
|
||||
fxt.Ini_file_mw_core("fr", String_.Concat_lines_nl
|
||||
( "$magicWords = array("
|
||||
, " 'if' => array(0, 'if:', 'si:'),"
|
||||
, " 'ifeq' => array(0, 'sieq:'),"
|
||||
, ");"
|
||||
)
|
||||
);
|
||||
fxt.Mgr().Bld_all();
|
||||
fxt.Tst_file_xo("fr", String_.Concat_lines_nl
|
||||
( "this"
|
||||
, ".keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "if|0|if~si~if_new:~"
|
||||
, "ifeq|0|sieq~ifeq~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ";"
|
||||
));
|
||||
}
|
||||
@Test public void Manual_text() {
|
||||
fxt.Mgr().Parse_manual_text(Bry_.new_a7("fr"), Bry_.new_u8(String_.Concat_lines_nl
|
||||
( "app;"
|
||||
))
|
||||
, fxt.Mgr().Manual_text_end_hash());
|
||||
fxt.Ini_file_mw_core("fr", String_.Concat_lines_nl
|
||||
( "$magicWords = array("
|
||||
, " 'if' => array(0, 'if:', 'si:'),"
|
||||
, ");"
|
||||
)
|
||||
);
|
||||
fxt.Mgr().Bld_all();
|
||||
fxt.Tst_file_xo("fr", String_.Concat_lines_nl
|
||||
( "this"
|
||||
, ".keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "if|0|if~si~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ";"
|
||||
, "app;"
|
||||
));
|
||||
}
|
||||
}
|
||||
class Xobc_utl_make_lang_fxt {
|
||||
public Xobc_utl_make_lang Mgr() {return mgr;} private Xobc_utl_make_lang mgr;
|
||||
public Xobc_utl_make_lang_kwds Kwd_mgr() {return mgr.Kwd_mgr();}
|
||||
public Xobc_utl_make_lang_fxt Clear() {
|
||||
app = Xoa_app_fxt.Make__app__edit();
|
||||
mgr = new Xobc_utl_make_lang(app.Lang_mgr(), app.Fsys_mgr(), app.Msg_log());
|
||||
return this;
|
||||
} private String_bldr sb = String_bldr_.new_(); private Xoae_app app;
|
||||
public Xobcl_kwd_row row_(String key, String... itms) {return new Xobcl_kwd_row(Bry_.new_a7(key), Bry_.Ary(itms));}
|
||||
public void Parse_rows(String raw, Xobcl_kwd_row... expd) {Tfds.Eq_str_lines(Xto_str(expd), Xto_str(Xobc_utl_make_lang_kwds.Parse(Bry_.new_a7(raw))));}
|
||||
public void Ini_file_mw_core(String lang, String raw) {
|
||||
Io_url fil = app.Fsys_mgr().Cfg_lang_core_dir().OwnerDir().GenSubFil_nest("mediawiki", "core_php", "Messages" + String_.UpperFirst(lang) + ".php");
|
||||
Io_mgr.Instance.SaveFilStr(fil, raw);
|
||||
}
|
||||
public void Tst_file_xo(String lang, String expd) {
|
||||
Io_url fil = Xol_lang_itm_.xo_lang_fil_(app.Fsys_mgr(), lang);
|
||||
Tfds.Eq_str_lines(expd, Io_mgr.Instance.LoadFilStr(fil));
|
||||
}
|
||||
private String Xto_str(Xobcl_kwd_row[] expd) {
|
||||
int len = expd.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xobcl_kwd_row row = expd[i];
|
||||
sb.Add(row.Key());
|
||||
byte[][] itms = row.Itms();
|
||||
int itms_len = itms.length;
|
||||
if (itms_len > 0) {
|
||||
sb.Add_char_pipe();
|
||||
for (int j = 0; j < itms_len; j++) {
|
||||
byte[] itm = itms[j];
|
||||
sb.Add(itm).Add_char_pipe();
|
||||
}
|
||||
}
|
||||
sb.Add_char_nl();
|
||||
}
|
||||
return sb.To_str_and_clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,14 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xobcl_kwd_row {
|
||||
public Xobcl_kwd_row(byte[] key, byte[][] itms) {
|
||||
this.key = key; this.itms = itms;
|
||||
for (byte[] itm : itms)
|
||||
itms_hash.Add(itm, itm);
|
||||
}
|
||||
public byte[] Key() {return key;} private byte[] key;
|
||||
public byte[][] Itms() {return itms;} private byte[][] itms;
|
||||
public boolean Itms_has(byte[] key) {return itms_hash.Has(key);} private Ordered_hash itms_hash = Ordered_hash_.New_bry();
|
||||
}
|
||||
|
||||
@@ -13,11 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public interface Xol_lang_transform {
|
||||
byte[] Kwd_transform(byte[] lang_key, byte[] kwd_key, byte[] kwd_word);
|
||||
}
|
||||
class Xol_lang_transform_null implements Xol_lang_transform {
|
||||
public byte[] Kwd_transform(byte[] lang_key, byte[] kwd_key, byte[] kwd_word) {return kwd_word;}
|
||||
public static final Xol_lang_transform_null Instance = new Xol_lang_transform_null(); Xol_lang_transform_null() {}
|
||||
}
|
||||
|
||||
@@ -13,356 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*; import gplx.core.btries.*; import gplx.core.consoles.*; import gplx.core.intls.*; import gplx.langs.phps.*; import gplx.core.log_msgs.*;
|
||||
import gplx.xowa.apps.gfs.*;
|
||||
import gplx.xowa.apps.fsys.*;
|
||||
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.numbers.*; import gplx.xowa.langs.parsers.*; import gplx.xowa.langs.specials.*;
|
||||
import gplx.xowa.wikis.nss.*;
|
||||
public class Xol_mw_lang_parser {
|
||||
private Php_parser parser = new Php_parser(); private Php_evaluator evaluator;
|
||||
public Xol_mw_lang_parser(Gfo_msg_log msg_log) {evaluator = new Php_evaluator(msg_log);}
|
||||
public void Bld_all(Xoa_lang_mgr lang_mgr, Xoa_fsys_mgr fsys_mgr) {Bld_all(lang_mgr, fsys_mgr, Xol_lang_transform_null.Instance);}
|
||||
public void Bld_all(Xoa_lang_mgr lang_mgr, Xoa_fsys_mgr fsys_mgr, Xol_lang_transform lang_transform) {
|
||||
Io_url lang_root = fsys_mgr.Cfg_lang_core_dir().OwnerDir();
|
||||
Parse_mediawiki(lang_mgr, lang_root.GenSubDir("mediawiki"), lang_transform);
|
||||
Save_langs(lang_mgr, lang_root.GenSubDir(Xol_mw_lang_parser.Dir_name_core), Ordered_hash_.New_bry(), Ordered_hash_.New_bry());
|
||||
}
|
||||
public void Save_langs(Xoa_lang_mgr lang_mgr, Io_url xowa_root, Ordered_hash manual_text_bgn, Ordered_hash manual_text_end) {
|
||||
int len = lang_mgr.Len();
|
||||
Xoa_gfs_bldr bldr = new Xoa_gfs_bldr();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_lang_itm lang = lang_mgr.Get_at(i);
|
||||
String lang_key = lang.Key_str();
|
||||
Io_url lang_url = xowa_root.GenSubFil(lang_key + ".gfs");
|
||||
Save_langs_by_manual_text(bldr, manual_text_bgn, lang_key);
|
||||
|
||||
Xol_lang_srl.Save_num_mgr(bldr, lang.Num_mgr());
|
||||
bldr.Add_proc_init_many("this").Add_nl();
|
||||
if (lang.Fallback_bry() != null) // NOTE: fallback will often be null; EX: en
|
||||
bldr.Add_proc_cont_one(Xol_lang_itm.Invk_fallback_load).Add_parens_str(lang.Fallback_bry()).Add_nl();
|
||||
if (!lang.Dir_ltr()) // NOTE: only save dir_ltr if false; EX: en
|
||||
bldr.Add_proc_cont_one(Xol_lang_itm.Invk_dir_rtl_).Add_parens_str(Yn.To_str(!lang.Dir_ltr())).Add_nl();
|
||||
Xol_lang_srl.Save_ns_grps(bldr, lang.Ns_names(), Xol_lang_itm.Invk_ns_names);
|
||||
Xol_lang_srl.Save_ns_grps(bldr, lang.Ns_aliases(), Xol_lang_itm.Invk_ns_aliases);
|
||||
Xol_lang_srl.Save_specials(bldr, lang.Specials_mgr());
|
||||
Xol_lang_srl.Save_keywords(bldr, lang.Kwd_mgr());
|
||||
Xol_lang_srl.Save_messages(bldr, lang.Msg_mgr(), true);
|
||||
bldr.Add_term_nl();
|
||||
|
||||
Save_langs_by_manual_text(bldr, manual_text_end, lang_key);
|
||||
Io_mgr.Instance.SaveFilBfr(lang_url, bldr.Bfr());
|
||||
}
|
||||
}
|
||||
private void Save_langs_by_manual_text(Xoa_gfs_bldr bldr, Ordered_hash manual_text_hash, String lang_key) {
|
||||
byte[][] itm = (byte[][])manual_text_hash.Get_by(Bry_.new_u8(lang_key));
|
||||
if (itm != null) bldr.Bfr().Add(itm[1]);
|
||||
}
|
||||
public void Parse_mediawiki(Xoa_lang_mgr lang_mgr, Io_url mediawiki_root, Xol_lang_transform lang_transform) {
|
||||
Bry_bfr bfr = Bry_bfr_.New();
|
||||
Parse_file_core_php(lang_mgr, mediawiki_root, bfr, lang_transform);
|
||||
Parse_file_xtns_php(lang_mgr, mediawiki_root, bfr, lang_transform);
|
||||
Parse_file_json(lang_mgr, bfr, lang_transform, mediawiki_root.GenSubDir("core_json"));
|
||||
Parse_file_json(lang_mgr, bfr, lang_transform, mediawiki_root.GenSubDir("xtns_json"));
|
||||
}
|
||||
private void Parse_file_core_php(Xoa_lang_mgr lang_mgr, Io_url mediawiki_root, Bry_bfr bfr, Xol_lang_transform lang_transform) {
|
||||
Io_url dir = mediawiki_root.GenSubDir("core_php");
|
||||
Io_url[] urls = Io_mgr.Instance.QueryDir_fils(dir);
|
||||
int len = urls.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Io_url url = urls[i];
|
||||
try {
|
||||
String lang_key = String_.Replace(String_.Lower(String_.Mid(url.NameOnly(), 8)), "_", "-"); // 8=Messages.length; lower b/c format is MessagesEn.php (need "en")
|
||||
// if (String_.In(lang_key, "qqq", "enrtl", "bbc", "bbc-latn")) continue;
|
||||
String text = Io_mgr.Instance.LoadFilStr(url);
|
||||
Xol_lang_itm lang = lang_mgr.Get_by_or_new(Bry_.new_u8(lang_key));
|
||||
this.Parse_core(text, lang, bfr, lang_transform);
|
||||
} catch (Exception exc) {Err_.Noop(exc); Console_adp__sys.Instance.Write_str_w_nl("failed to parse " + url.NameOnly() + Err_.Message_gplx_log(exc));}
|
||||
}
|
||||
}
|
||||
private void Parse_file_xtns_php(Xoa_lang_mgr lang_mgr, Io_url mediawiki_root, Bry_bfr bfr, Xol_lang_transform lang_transform) {
|
||||
Io_url dir = mediawiki_root.GenSubDir("xtns_php");
|
||||
Io_url[] urls = Io_mgr.Instance.QueryDir_fils(dir);
|
||||
int len = urls.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Io_url url = urls[i];
|
||||
try {
|
||||
String text = Io_mgr.Instance.LoadFilStr(url);
|
||||
boolean prepend_hash = String_.Eq("ParserFunctions.i18n.magic", url.NameOnly());
|
||||
this.Parse_xtn(text, url, lang_mgr, bfr, prepend_hash, lang_transform);
|
||||
} catch (Exception exc) {Err_.Noop(exc); Console_adp__sys.Instance.Write_str_w_nl("failed to parse " + url.NameOnly() + Err_.Message_gplx_log(exc));}
|
||||
}
|
||||
}
|
||||
private void Parse_file_json(Xoa_lang_mgr lang_mgr, Bry_bfr bfr, Xol_lang_transform lang_transform, Io_url root_dir) {
|
||||
Io_url[] dirs = Io_mgr.Instance.QueryDir_args(root_dir).DirOnly_().ExecAsUrlAry();
|
||||
int dirs_len = dirs.length;
|
||||
for (int i = 0; i < dirs_len; i++) {
|
||||
Io_url dir = dirs[i];
|
||||
Io_url[] fils = Io_mgr.Instance.QueryDir_args(dir).ExecAsUrlAry();
|
||||
int fils_len = fils.length;
|
||||
for (int j = 0; j < fils_len; ++j) {
|
||||
Io_url fil = fils[j];
|
||||
try {
|
||||
Xol_lang_itm lang = lang_mgr.Get_by_or_new(Bry_.new_u8(fil.NameOnly()));
|
||||
Xob_i18n_parser.Load_msgs(true, lang, fil);
|
||||
} catch (Exception exc) {Err_.Noop(exc); Console_adp__sys.Instance.Write_str_w_nl(String_.Format("failed to parse json file; url={0} err={1}\n", fil.Raw(), Err_.Message_gplx_log(exc)));}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void Parse_core(String text, Xol_lang_itm lang, Bry_bfr bfr, Xol_lang_transform lang_transform) {
|
||||
evaluator.Clear();
|
||||
parser.Parse_tkns(text, evaluator);
|
||||
Php_line[] lines = (Php_line[])evaluator.List().To_ary(Php_line.class);
|
||||
int lines_len = lines.length;
|
||||
List_adp bry_list = List_adp_.New();
|
||||
for (int i = 0; i < lines_len; i++) {
|
||||
Php_line_assign line = (Php_line_assign)lines[i];
|
||||
byte[] key = line.Key().Val_obj_bry();
|
||||
Object o = Tid_hash.Get_by_bry(key);
|
||||
if (o != null) {
|
||||
Byte_obj_val stub = (Byte_obj_val)o;
|
||||
switch (stub.Val()) {
|
||||
case Tid_namespaceNames:
|
||||
Parse_array_kv(bry_list, line);
|
||||
lang.Ns_names().Ary_set_(Parse_namespace_strings(bry_list, true));
|
||||
break;
|
||||
case Tid_namespaceAliases:
|
||||
Parse_array_kv(bry_list, line);
|
||||
lang.Ns_aliases().Ary_set_(Parse_namespace_strings(bry_list, false));
|
||||
break;
|
||||
case Tid_specialPageAliases:
|
||||
Parse_specials(line, lang.Key_bry(), lang.Specials_mgr());
|
||||
break;
|
||||
case Tid_magicwords:
|
||||
Parse_magicwords(line, lang.Key_bry(), lang.Kwd_mgr(), false, lang_transform);
|
||||
break;
|
||||
case Tid_messages:
|
||||
Parse_array_kv(bry_list, line);
|
||||
Parse_messages(bry_list, lang, bfr);
|
||||
break;
|
||||
case Tid_fallback:
|
||||
byte[] fallback_bry = Php_itm_.Parse_bry(line.Val());
|
||||
if (!Bry_.Eq(fallback_bry, Bool_.True_bry)) // MessagesEn.php has fallback = false; ignore
|
||||
lang.Fallback_bry_(fallback_bry);
|
||||
break;
|
||||
case Tid_rtl:
|
||||
byte[] rtl_bry = Php_itm_.Parse_bry(line.Val());
|
||||
boolean dir_rtl = Bry_.Eq(rtl_bry, Bool_.True_bry);
|
||||
lang.Dir_ltr_(!dir_rtl);
|
||||
break;
|
||||
case Tid_separatorTransformTable:
|
||||
Parse_separatorTransformTable(line, lang.Num_mgr());
|
||||
break;
|
||||
case Tid_digitTransformTable:
|
||||
Parse_digitTransformTable(line, lang.Num_mgr());
|
||||
break;
|
||||
case Tid_digitGroupingPattern:
|
||||
byte[] digitGroupingPattern = Php_itm_.Parse_bry(line.Val());
|
||||
lang.Num_mgr().Num_grp_fmtr().Digit_grouping_pattern_(digitGroupingPattern);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
lang.Evt_lang_changed();
|
||||
}
|
||||
// public static String[] Lang_skip = new String[] {"qqq", "enrtl", "akz", "sxu", "test", "mwv", "rup", "hu-formal", "tzm", "bbc", "bbc-latn", "lrc", "ttt", "gom", "gom-latn"};
|
||||
public static String[] Lang_skip = String_.Ary_empty;
|
||||
public void Parse_xtn(String text, Io_url url, Xoa_lang_mgr lang_mgr, Bry_bfr bfr, boolean prepend_hash, Xol_lang_transform lang_transform) {
|
||||
evaluator.Clear();
|
||||
parser.Parse_tkns(text, evaluator);
|
||||
List_adp bry_list = List_adp_.New();
|
||||
Php_line[] lines = (Php_line[])evaluator.List().To_ary(Php_line.class);
|
||||
int lines_len = lines.length;
|
||||
for (int i = 0; i < lines_len; i++) {
|
||||
Php_line_assign line = (Php_line_assign)lines[i];
|
||||
byte[] key = line.Key().Val_obj_bry();
|
||||
Object o = Tid_hash.Get_by_bry(key);
|
||||
if (o != null) {
|
||||
Php_key[] subs = line.Key_subs();
|
||||
if (subs.length == 0) continue; // ignore if no lang_key; EX: ['en']
|
||||
byte[] lang_key = subs[0].Val_obj_bry();
|
||||
try {
|
||||
if (String_.In(String_.new_u8(lang_key), Lang_skip)) continue;
|
||||
Xol_lang_itm lang = lang_mgr.Get_by_or_new(lang_key);
|
||||
Byte_obj_val stub = (Byte_obj_val)o;
|
||||
switch (stub.Val()) {
|
||||
case Tid_messages:
|
||||
Parse_array_kv(bry_list, line);
|
||||
Parse_messages(bry_list, lang, bfr);
|
||||
break;
|
||||
case Tid_magicwords:
|
||||
if (line.Key_subs().length == 0) continue; // ignore lines like $magicWords = array();
|
||||
if (line.Key_subs().length > 1) throw Err_.new_wo_type("magicWords in xtn must have only 1 accessor", "len", line.Key_subs().length);
|
||||
Php_key accessor = line.Key_subs()[0];
|
||||
byte[] accessor_bry = accessor.Val_obj_bry();
|
||||
if (Bry_.Eq(accessor_bry, lang_key)) // accessor must match lang_key
|
||||
Parse_magicwords(line, lang.Key_bry(), lang.Kwd_mgr(), prepend_hash, lang_transform);
|
||||
break;
|
||||
}
|
||||
} catch (Exception exc) {Err_.Noop(exc); Console_adp__sys.Instance.Write_str_w_nl("failed to parse " + url.NameOnly() + Err_.Message_gplx_log(exc));}
|
||||
}
|
||||
}
|
||||
}
|
||||
private void Parse_array_kv(List_adp rv, Php_line_assign line) {
|
||||
rv.Clear();
|
||||
Php_itm_ary ary = (Php_itm_ary)line.Val();
|
||||
int subs_len = ary.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Php_itm_kv kv = (Php_itm_kv)ary.Subs_get(i);
|
||||
rv.Add(Php_itm_.Parse_bry(kv.Key()));
|
||||
rv.Add(Php_itm_.Parse_bry(kv.Val()));
|
||||
}
|
||||
}
|
||||
public Xow_ns[] Parse_namespace_strings(List_adp list, boolean ns_names) {
|
||||
byte[][] brys = (byte[][])list.To_ary(byte[].class);
|
||||
int brys_len = brys.length;
|
||||
Xow_ns[] rv = new Xow_ns[brys_len / 2];
|
||||
int key_dif = ns_names ? 0 : 1;
|
||||
int val_dif = ns_names ? 1 : 0;
|
||||
for (int i = 0; i < brys_len; i+=2) {
|
||||
byte[] kv_key = brys[i + key_dif];
|
||||
byte[] kv_val = brys[i + val_dif];
|
||||
Bry_.Replace_all_direct(kv_val, Byte_ascii.Underline, Byte_ascii.Space); // NOTE: siteInfo.xml names have " " not "_" (EX: "User talk"). for now, follow that convention
|
||||
int ns_id = Id_by_mw_name(kv_key);
|
||||
// if (ns_id == Xow_ns_.Tid__null) throw Err_mgr.Instance.fmt_auto_(GRP_KEY, "namespace_names", String_.new_u8(kv_key));
|
||||
rv[i / 2] = new Xow_ns(ns_id, Xow_ns_case_.Tid__1st, kv_val, false); // note that Xow_ns is being used as glorified id-name struct; case_match and alias values do not matter
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
private void Parse_messages(List_adp rv, Xol_lang_itm lang, Bry_bfr bfr) {
|
||||
byte[][] brys = (byte[][])rv.To_ary(byte[].class);
|
||||
int brys_len = brys.length;
|
||||
Xol_msg_mgr mgr = lang.Msg_mgr();
|
||||
List_adp quote_itm_list = List_adp_.New(); Byte_obj_ref quote_parse_result = Byte_obj_ref.zero_();
|
||||
for (int i = 0; i < brys_len; i+=2) {
|
||||
byte[] kv_key = brys[i];
|
||||
Xol_msg_itm itm = mgr.Itm_by_key_or_new(kv_key);
|
||||
if (itm == null) continue;
|
||||
byte[] kv_val = brys[i + 1];
|
||||
kv_val = php_quote_parser.Parse_as_bry(quote_itm_list, kv_val, quote_parse_result, bfr);
|
||||
Xol_msg_itm_.update_val_(itm, kv_val);
|
||||
itm.Dirty_(true);
|
||||
}
|
||||
} private Php_text_itm_parser php_quote_parser = new Php_text_itm_parser();
|
||||
private void Parse_magicwords(Php_line_assign line, byte[] lang_key, Xol_kwd_mgr mgr, boolean prepend_hash, Xol_lang_transform lang_transform) {
|
||||
Php_itm_ary ary = (Php_itm_ary)line.Val();
|
||||
int subs_len = ary.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Php_itm_sub sub = ary.Subs_get(i);
|
||||
Php_itm_kv kv = (Php_itm_kv)sub;
|
||||
byte[] kv_key = kv.Key().Val_obj_bry();
|
||||
Php_itm_ary kv_ary = (Php_itm_ary)kv.Val();
|
||||
int kv_ary_len = kv_ary.Subs_len();
|
||||
boolean case_match = false; // if 1 arg, default to false
|
||||
int kv_ary_bgn = 0; int words_len = kv_ary_len; // if 1 arg, default to entire kv_ary; words_len
|
||||
int case_match_int = Php_itm_.Parse_int_or(kv_ary.Subs_get(0), Int_.Min_value);
|
||||
if (case_match_int != Int_.Min_value) {
|
||||
case_match = Parse_int_as_bool(kv_ary.Subs_get(0)); // arg[0] is case_match
|
||||
kv_ary_bgn = 1; // arg[1] is 1st word
|
||||
words_len = kv_ary_len - 1; // words.len = kv_len - 1 (skip case_match
|
||||
}
|
||||
byte[][] words = new byte[words_len][];
|
||||
for (int j = kv_ary_bgn; j < kv_ary_len; j++) {
|
||||
Php_itm_sub kv_sub = kv_ary.Subs_get(j);
|
||||
byte[] word = Php_itm_.Parse_bry(kv_sub);
|
||||
// if (prepend_hash && word[0] != Byte_ascii.Hash) word = Bry_.Add(Byte_ascii.Hash, word);
|
||||
words[j - kv_ary_bgn] = lang_transform.Kwd_transform(lang_key, kv_key, word);
|
||||
}
|
||||
int keyword_id = Xol_kwd_grp_.Id_by_bry(kv_key); if (keyword_id == -1) continue; //throw Err_mgr.Instance.fmt_(Err_scope_keywords, "invalid_key", "key does not have id", String_.new_u8(kv_key));
|
||||
Xol_kwd_grp grp = mgr.Get_or_new(keyword_id);
|
||||
grp.Srl_load(case_match, words);
|
||||
}
|
||||
}
|
||||
private void Parse_specials(Php_line_assign line, byte[] lang_key, Xol_specials_mgr specials_mgr) {
|
||||
specials_mgr.Clear(); // NOTE: always clear, else will try to readd to en.gfs
|
||||
Php_itm_ary ary = (Php_itm_ary)line.Val();
|
||||
int subs_len = ary.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Php_itm_sub sub = ary.Subs_get(i);
|
||||
Php_itm_kv kv = (Php_itm_kv)sub;
|
||||
byte[] kv_key = kv.Key().Val_obj_bry();
|
||||
Php_itm_ary kv_ary = (Php_itm_ary)kv.Val();
|
||||
int kv_ary_len = kv_ary.Subs_len();
|
||||
byte[][] aliases = new byte[kv_ary_len][];
|
||||
for (int j = 0; j < kv_ary_len; j++) {
|
||||
Php_itm_sub kv_sub = kv_ary.Subs_get(j);
|
||||
aliases[j] = Php_itm_.Parse_bry(kv_sub);
|
||||
}
|
||||
specials_mgr.Add(kv_key, aliases);
|
||||
}
|
||||
}
|
||||
private boolean Parse_int_as_bool(Php_itm itm) {
|
||||
int rv = Php_itm_.Parse_int_or(itm, Int_.Min_value);
|
||||
if (rv == Int_.Min_value) throw Err_.new_wo_type("value must be 0 or 1", "val", String_.new_u8(itm.Val_obj_bry()));
|
||||
return rv == 1;
|
||||
}
|
||||
private void Parse_separatorTransformTable(Php_line_assign line, Xol_num_mgr num_mgr) {
|
||||
if (line.Val().Itm_tid() == Php_itm_.Tid_null) return;// en is null; $separatorTransformTable = null;
|
||||
Php_itm_ary ary = (Php_itm_ary)line.Val();
|
||||
int subs_len = ary.Subs_len();
|
||||
List_adp tmp_list = List_adp_.New(); Byte_obj_ref tmp_result = Byte_obj_ref.zero_(); Bry_bfr tmp_bfr = Bry_bfr_.Reset(16);
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Php_itm_kv kv = (Php_itm_kv)ary.Subs_get(i);
|
||||
byte[] key_bry = Php_itm_.Parse_bry(kv.Key()), val_bry = Php_itm_.Parse_bry(kv.Val());
|
||||
val_bry = php_quote_parser.Parse_as_bry(tmp_list, val_bry, tmp_result, tmp_bfr);
|
||||
Xol_csv_parser.Instance.Load(tmp_bfr, val_bry);
|
||||
val_bry = tmp_bfr.To_bry_and_clear();
|
||||
if ( Bry_.Eq(key_bry, Bry_separatorTransformTable_dot)
|
||||
|| Bry_.Eq(key_bry, Bry_separatorTransformTable_comma)
|
||||
)
|
||||
num_mgr.Separators_mgr().Set(key_bry, val_bry);
|
||||
else throw Err_.new_unhandled(String_.new_u8(key_bry)); // NOTE: as of v1.22.2, all Messages only have a key of "." or "," DATE:2014-04-15
|
||||
}
|
||||
} private static final byte[] Bry_separatorTransformTable_comma = new byte[] {Byte_ascii.Comma}, Bry_separatorTransformTable_dot = new byte[] {Byte_ascii.Dot};
|
||||
private void Parse_digitTransformTable(Php_line_assign line, Xol_num_mgr num_mgr) {
|
||||
if (line.Val().Itm_tid() == Php_itm_.Tid_null) return;// en is null; $digitTransformTable = null;
|
||||
Php_itm_ary ary = (Php_itm_ary)line.Val();
|
||||
int subs_len = ary.Subs_len();
|
||||
List_adp tmp_list = List_adp_.New(); Byte_obj_ref tmp_result = Byte_obj_ref.zero_(); Bry_bfr tmp_bfr = Bry_bfr_.Reset(16);
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Php_itm_kv kv = (Php_itm_kv)ary.Subs_get(i);
|
||||
byte[] key_bry = Php_itm_.Parse_bry(kv.Key()), val_bry = Php_itm_.Parse_bry(kv.Val());
|
||||
val_bry = php_quote_parser.Parse_as_bry(tmp_list, val_bry, tmp_result, tmp_bfr);
|
||||
num_mgr.Digits_mgr().Set(key_bry, val_bry);
|
||||
}
|
||||
}
|
||||
private static final byte
|
||||
Tid_namespaceNames = 0, Tid_namespaceAliases = 1, Tid_specialPageAliases = 2
|
||||
, Tid_messages = 3, Tid_magicwords = 4
|
||||
, Tid_fallback = 5, Tid_rtl = 6
|
||||
, Tid_separatorTransformTable = 7, Tid_digitTransformTable = 8, Tid_digitGroupingPattern = 9
|
||||
;
|
||||
private static Hash_adp_bry Tid_hash = Hash_adp_bry.cs()
|
||||
.Add_str_byte("namespaceNames", Tid_namespaceNames).Add_str_byte("namespaceAliases", Tid_namespaceAliases).Add_str_byte("specialPageAliases", Tid_specialPageAliases)
|
||||
.Add_str_byte("messages", Tid_messages).Add_str_byte("magicWords", Tid_magicwords)
|
||||
.Add_str_byte("fallback", Tid_fallback).Add_str_byte("rtl", Tid_rtl)
|
||||
.Add_str_byte("separatorTransformTable", Tid_separatorTransformTable)
|
||||
.Add_str_byte("digitTransformTable", Tid_digitTransformTable).Add_str_byte("digitGroupingPattern", Tid_digitGroupingPattern)
|
||||
;
|
||||
public static int Id_by_mw_name(byte[] src) {
|
||||
if (mw_names == null) {
|
||||
mw_names = Btrie_slim_mgr.cs();
|
||||
mw_names.Add_obj("NS_MEDIA", new Int_obj_val(Xow_ns_.Tid__media));
|
||||
mw_names.Add_obj("NS_SPECIAL", new Int_obj_val(Xow_ns_.Tid__special));
|
||||
mw_names.Add_obj("NS_MAIN", new Int_obj_val(Xow_ns_.Tid__main));
|
||||
mw_names.Add_obj("NS_TALK", new Int_obj_val(Xow_ns_.Tid__talk));
|
||||
mw_names.Add_obj("NS_USER", new Int_obj_val(Xow_ns_.Tid__user));
|
||||
mw_names.Add_obj("NS_USER_TALK", new Int_obj_val(Xow_ns_.Tid__user_talk));
|
||||
mw_names.Add_obj("NS_PROJECT", new Int_obj_val(Xow_ns_.Tid__project));
|
||||
mw_names.Add_obj("NS_PROJECT_TALK", new Int_obj_val(Xow_ns_.Tid__project_talk));
|
||||
mw_names.Add_obj("NS_FILE", new Int_obj_val(Xow_ns_.Tid__file));
|
||||
mw_names.Add_obj("NS_FILE_TALK", new Int_obj_val(Xow_ns_.Tid__file_talk));
|
||||
mw_names.Add_obj("NS_MEDIAWIKI", new Int_obj_val(Xow_ns_.Tid__mediawiki));
|
||||
mw_names.Add_obj("NS_MEDIAWIKI_TALK", new Int_obj_val(Xow_ns_.Tid__mediawiki_talk));
|
||||
mw_names.Add_obj("NS_TEMPLATE", new Int_obj_val(Xow_ns_.Tid__template));
|
||||
mw_names.Add_obj("NS_TEMPLATE_TALK", new Int_obj_val(Xow_ns_.Tid__template_talk));
|
||||
mw_names.Add_obj("NS_HELP", new Int_obj_val(Xow_ns_.Tid__help));
|
||||
mw_names.Add_obj("NS_HELP_TALK", new Int_obj_val(Xow_ns_.Tid__help_talk));
|
||||
mw_names.Add_obj("NS_CATEGORY", new Int_obj_val(Xow_ns_.Tid__category));
|
||||
mw_names.Add_obj("NS_CATEGORY_TALK", new Int_obj_val(Xow_ns_.Tid__category_talk));
|
||||
}
|
||||
Object o = mw_names.Match_exact(src, 0, src.length);
|
||||
return o == null ? Xow_ns_.Tid__null : ((Int_obj_val)o).Val();
|
||||
} private static Btrie_slim_mgr mw_names;
|
||||
public static final String Dir_name_core = "core";
|
||||
}
|
||||
|
||||
@@ -13,303 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
import gplx.core.intls.*; import gplx.core.log_msgs.*; import gplx.xowa.parsers.lnkis.*;
|
||||
import gplx.xowa.wikis.nss.*;
|
||||
import gplx.xowa.langs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.specials.*;
|
||||
public class Xol_mw_lang_parser_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xol_mw_lang_parser_fxt fxt = new Xol_mw_lang_parser_fxt();
|
||||
@Test public void Core_keywords() {
|
||||
fxt.Parse_core("$magicWords = array('toc' => array(0, 'a1', 'a2', 'a3'), 'notoc' => array(1, 'b1', 'b2', 'b3'));")
|
||||
.Tst_keyword(Xol_kwd_grp_.Id_toc, false, "a1", "a2", "a3")
|
||||
.Tst_keyword(Xol_kwd_grp_.Id_notoc, true, "b1", "b2", "b3")
|
||||
;
|
||||
}
|
||||
@Test public void Core_keywords_img_thumb() {
|
||||
fxt.Parse_core("$magicWords = array('img_thumbnail' => array(1, 'thumb', 'thmb'));")
|
||||
.Tst_keyword_img("thumb", Xop_lnki_arg_parser.Tid_thumb)
|
||||
.Tst_keyword_img("thmb" , Xop_lnki_arg_parser.Tid_thumb)
|
||||
.Tst_keyword_img("thum" , Xop_lnki_arg_parser.Tid_caption)
|
||||
;
|
||||
}
|
||||
@Test public void Core_keywords_img_upright() {
|
||||
fxt.Parse_core("$magicWords = array('img_upright' => array(1, 'upright', 'upright=$1', 'upright $1'));")
|
||||
.Tst_keyword_img("upright" , Xop_lnki_arg_parser.Tid_upright)
|
||||
.Tst_keyword_img("upright " , Xop_lnki_arg_parser.Tid_upright)
|
||||
;
|
||||
}
|
||||
@Test public void Core_keywords_func_currentmonth() {
|
||||
Datetime_now.Manual_y_();
|
||||
fxt.Parse_core("$magicWords = array('currentmonth' => array(0, 'MOISACTUEL'));")
|
||||
.Tst_parse("{{MOISACTUEL}}", "01")
|
||||
;
|
||||
Datetime_now.Manual_n_();
|
||||
}
|
||||
@Test public void Core_keywords_func_ns() {
|
||||
fxt.Parse_core("$magicWords = array('ns' => array(0, 'ESPACEN'));")
|
||||
.Tst_parse("{{ESPACEN:6}}", "File")
|
||||
;
|
||||
}
|
||||
@Test public void Keywords_img_dim() {
|
||||
fxt.Parse_core("$magicWords = array('img_width' => array(1, '$1pxl'));")
|
||||
.Tst_keyword_img("50pxl", Xop_lnki_arg_parser.Tid_dim)
|
||||
.Tst_keyword_img("50pxlpxl", Xop_lnki_arg_parser.Tid_dim)
|
||||
.Tst_keyword_img("50xl", Xop_lnki_arg_parser.Tid_caption)
|
||||
;
|
||||
}
|
||||
@Test public void Core_namespaces_names() {
|
||||
fxt.Parse_core("$namespaceNames = array(NS_FILE => 'Fichier');")
|
||||
.Sync_ns()
|
||||
.Tst_ns_lkp("Fichier", Xow_ns_.Tid__file)
|
||||
.Tst_ns_lkp("File" , Xow_ns_.Tid__null)
|
||||
;
|
||||
}
|
||||
@Test public void Core_namespaces_aliases() {
|
||||
fxt.Parse_core("$namespaceAliases = array('Discussion_Fichier' => NS_FILE_TALK);")
|
||||
.Sync_ns()
|
||||
.Tst_ns_lkp("Discussion Fichier", Xow_ns_.Tid__file_talk)
|
||||
.Tst_ns_lkp("Discussion Fichierx", Xow_ns_.Tid__null)
|
||||
;
|
||||
}
|
||||
@Test public void Core_specialPageAliases() {
|
||||
fxt.Parse_core("$specialPageAliases = array('Randompage' => array('PageAuHasard', 'Page_au_hasard'));")
|
||||
.Test_specialPageAliases("Randompage", "PageAuHasard", "Page_au_hasard")
|
||||
;
|
||||
}
|
||||
@Test public void Xtn_keywords_fr() {fxt.Parse_xtn("$magicWords['fr'] = array('if' => array(0, 'si' ));").Tst_parse("{{si:|y|n}}", "n");}
|
||||
@Test public void Xtn_keywords_de() {fxt.Parse_xtn("$magicWords['de'] = array('if' => array(0, 'si' ));").Tst_parse("{{si:|y|n}}", "<a href=\"/wiki/Template:Si:\">Template:Si:</a>");} // should be "Si", not "si"; ALSO, should probably be "{{si:|y|n}}" not "[[:Template:si:]]" DATE:2014-07-04
|
||||
@Test public void Core_messages() {
|
||||
fxt.Parse_core("$messages = array('sunday' => 'dimanche');")
|
||||
.Tst_message("sunday", 0, "dimanche", false)
|
||||
;
|
||||
}
|
||||
@Test public void Fallback() {
|
||||
fxt.Parse_core("$fallback = 'zh-hans';");
|
||||
Tfds.Eq("zh-hans", String_.new_u8(fxt.Lang().Fallback_bry()));
|
||||
}
|
||||
@Test public void Separator_transform_table() {
|
||||
fxt.Parse_core("$separatorTransformTable = array( ',' => '.', '.' => ',' );");
|
||||
fxt.Num_fmt_tst("1234,56", "1.234.56"); // NOTE: dot is repeated; confirmed with dewiki and {{formatnum:1234,56}}
|
||||
}
|
||||
@Test public void Separator_transform_table_fr() {
|
||||
fxt.Parse_core("$separatorTransformTable = array( ',' => '\\xc2\\xa0', '.' => ',' );");
|
||||
fxt.Num_fmt_tst("1234,56", "1 234 56"); // NOTE: nbsp here; also, nbsp is repeated. see dewiki and {{formatnum:1234,56}}
|
||||
}
|
||||
@Test public void Digit_transform_table() {
|
||||
fxt.Save_file("mem/xowa/bin/any/xowa/cfg/lang/mediawiki/core_php/MessagesFr.php"
|
||||
, "$digitTransformTable = array("
|
||||
, " '0' => 'nulla',"
|
||||
, " '1' => 'I',"
|
||||
, " '2' => 'II',"
|
||||
, " '3' => 'III',"
|
||||
, " '4' => 'IV',"
|
||||
, " '5' => 'V',"
|
||||
, " '6' => 'VI',"
|
||||
, " '7' => 'VII',"
|
||||
, " '8' => 'VIII',"
|
||||
, " '9' => 'IX',"
|
||||
, ");"
|
||||
);
|
||||
fxt.Run_bld_all();
|
||||
fxt.Tst_file("mem/xowa/bin/any/xowa/cfg/lang/core/fr.gfs", String_.Concat_lines_nl
|
||||
( "numbers {"
|
||||
, " digits {"
|
||||
, " clear;"
|
||||
, " set('0', 'nulla');"
|
||||
, " set('1', 'I');"
|
||||
, " set('2', 'II');"
|
||||
, " set('3', 'III');"
|
||||
, " set('4', 'IV');"
|
||||
, " set('5', 'V');"
|
||||
, " set('6', 'VI');"
|
||||
, " set('7', 'VII');"
|
||||
, " set('8', 'VIII');"
|
||||
, " set('9', 'IX');"
|
||||
, " }"
|
||||
, "}"
|
||||
, "this"
|
||||
, ";"
|
||||
));
|
||||
}
|
||||
@Test public void Digit_grouping_pattern() {
|
||||
fxt.Save_file("mem/xowa/bin/any/xowa/cfg/lang/mediawiki/core_php/MessagesFr.php"
|
||||
, "$digitGroupingPattern = '##,##,###'"
|
||||
, ");"
|
||||
);
|
||||
fxt.Run_bld_all();
|
||||
fxt.Tst_file("mem/xowa/bin/any/xowa/cfg/lang/core/fr.gfs", String_.Concat_lines_nl
|
||||
( "numbers {"
|
||||
, " digit_grouping_pattern = '##,##,###';"
|
||||
, "}"
|
||||
, "this"
|
||||
, ";"
|
||||
));
|
||||
}
|
||||
@Test public void Bld() {
|
||||
fxt.Save_file("mem/xowa/bin/any/xowa/cfg/lang/mediawiki/core_php/MessagesFr.php"
|
||||
, "$fallback = 'zh-hans';"
|
||||
, "$rtl = true;"
|
||||
, "$namespaceNames = array(NS_FILE => 'Filex');"
|
||||
, "$namespaceAliases = array('File Discussion' => NS_FILE_TALK);"
|
||||
, "$magicWords = array('currentmonth' => array(0, 'CUR_MONTH'));"
|
||||
, "$messages = array('sunday' => 'sunday');"
|
||||
);
|
||||
fxt.Save_file("mem/xowa/bin/any/xowa/cfg/lang/mediawiki/xtns_php/Test.il8n.php"
|
||||
, "$magicWords['fr'] = array('currentyear' => array(0, 'CUR_YEAR'));"
|
||||
, "$messages['fr'] = array('monday' => 'monday');"
|
||||
);
|
||||
fxt.Save_file("mem/xowa/bin/any/xowa/cfg/lang/mediawiki/core_json/Messages/fr.json"
|
||||
, "{"
|
||||
, " \"@metadata\": {"
|
||||
, " \"authors\": []"
|
||||
, " },"
|
||||
, "\"key_1\": \"val_1\","
|
||||
, "\"key_2\": \"val $1\","
|
||||
, "}"
|
||||
);
|
||||
fxt.Save_file("mem/xowa/bin/any/xowa/cfg/lang/mediawiki/xtns_json/Test2/fr.json"
|
||||
, "{"
|
||||
, " \"@metadata\": {"
|
||||
, " \"authors\": []"
|
||||
, " },"
|
||||
, "\"key_3\": \"val_3\","
|
||||
, "\"key_4\": \"val $1\","
|
||||
, "}"
|
||||
);
|
||||
fxt.Run_bld_all();
|
||||
fxt.Tst_file("mem/xowa/bin/any/xowa/cfg/lang/core/fr.gfs", String_.Concat_lines_nl
|
||||
( "this"
|
||||
, ".fallback_load('zh-hans')"
|
||||
, ".dir_rtl_('y')"
|
||||
, ".ns_names"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "6|Filex"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ".ns_aliases"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "7|File Discussion"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ".keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "currentmonth|0|CUR_MONTH~"
|
||||
, "currentyear|0|CUR_YEAR~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ".messages"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "sunday|sunday"
|
||||
, "monday|monday"
|
||||
, "key_1|val_1"
|
||||
, "key_2|val ~{0}"
|
||||
, "key_3|val_3"
|
||||
, "key_4|val ~{0}"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ";"
|
||||
));
|
||||
}
|
||||
@Test public void Dir_ltr() {
|
||||
fxt.Parse_core("$rtl = 'true';");
|
||||
Tfds.Eq(false, fxt.Lang().Dir_ltr());
|
||||
}
|
||||
@Test public void Core_keywords__only_1() { // PURPOSE: some magic words don't specify case-match; EX: Disambiguator.php; DATE:2013-12-24
|
||||
fxt.Parse_core("$magicWords = array('toc' => array('a1'));")
|
||||
.Tst_keyword(Xol_kwd_grp_.Id_toc, false, "a1")
|
||||
;
|
||||
}
|
||||
@Test public void Core_keywords__skip_case_match__1() { // PURPOSE: some magic words don't specify case-match; EX: Disambiguator.php; DATE:2013-12-24
|
||||
fxt.Parse_core("$magicWords = array('toc' => array('a1'));")
|
||||
.Tst_keyword(Xol_kwd_grp_.Id_toc, false, "a1")
|
||||
;
|
||||
}
|
||||
@Test public void Core_keywords__skip_case_match__2() { // PURPOSE: some magic words don't specify case-match; EX: Disambiguator.php; DATE:2013-12-24
|
||||
fxt.Parse_core("$magicWords = array('toc' => array('a1', 'a2'));")
|
||||
.Tst_keyword(Xol_kwd_grp_.Id_toc, false, "a1", "a2")
|
||||
;
|
||||
}
|
||||
}
|
||||
class Xol_mw_lang_parser_fxt {
|
||||
Xoae_app app; Xowe_wiki wiki; private Xop_fxt fxt;
|
||||
Xol_mw_lang_parser parser = new Xol_mw_lang_parser(Gfo_msg_log.Test()); Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
||||
public void Clear() {
|
||||
if (app == null) {
|
||||
app = Xoa_app_fxt.Make__app__edit();
|
||||
}
|
||||
app.Lang_mgr().Clear();// NOTE: always clear the lang
|
||||
lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7("fr"));
|
||||
wiki = Xoa_app_fxt.Make__wiki__edit(app, "en.wikipedia.org", lang);
|
||||
fxt = new Xop_fxt(app, wiki);
|
||||
lang.Kwd_mgr().Clear(); lang.Msg_mgr().Clear(); // NOTE: clear kwds and msgs else they will be printed to file; this line must go last b/c various xtns will fill in kwds dynamically
|
||||
}
|
||||
public Xol_lang_itm Lang() {return lang;} private Xol_lang_itm lang;
|
||||
public void Num_fmt_tst(String raw, String expd) {Tfds.Eq(expd, String_.new_u8(lang.Num_mgr().Format_num(Bry_.new_u8(raw))));}
|
||||
public void Run_bld_all() {parser.Bld_all(app.Lang_mgr(), app.Fsys_mgr());}
|
||||
public void Save_file(String path, String... lines) {
|
||||
Io_mgr.Instance.SaveFilStr(Io_url_.mem_fil_(path), String_.Concat_lines_nl(lines));
|
||||
}
|
||||
public void Tst_file(String path, String expd) {
|
||||
Io_url url = Io_url_.mem_fil_(path);
|
||||
String actl = Io_mgr.Instance.LoadFilStr(url);
|
||||
Tfds.Eq_str_lines(expd, actl);
|
||||
}
|
||||
public Xol_mw_lang_parser_fxt Parse_core(String raw) {parser.Parse_core(raw, lang, tmp_bfr, Xol_lang_transform_null.Instance); return this;}
|
||||
public Xol_mw_lang_parser_fxt Parse_xtn (String raw) {parser.Parse_xtn(raw, Io_url_.Empty, app.Lang_mgr(), tmp_bfr, false, Xol_lang_transform_null.Instance); lang.Evt_lang_changed(); return this;}
|
||||
public Xol_mw_lang_parser_fxt Tst_keyword(int id, boolean case_sensitive, String... words) {
|
||||
Xol_kwd_grp lst = lang.Kwd_mgr().Get_at(id); if (lst == null) throw Err_.new_wo_type("list should not be null");
|
||||
Tfds.Eq(case_sensitive, lst.Case_match());
|
||||
int actl_len = lst.Itms().length;
|
||||
String[] actl = new String[actl_len];
|
||||
for (int i = 0; i < actl_len; i++)
|
||||
actl[i] = String_.new_u8(lst.Itms()[i].Val());
|
||||
Tfds.Eq_ary_str(words, actl);
|
||||
return this;
|
||||
}
|
||||
public Xol_mw_lang_parser_fxt Tst_keyword_img(String key_str, byte tid) {
|
||||
byte[] key = Bry_.new_u8(key_str);
|
||||
Tfds.Eq(tid, lang.Lnki_arg_parser().Identify_tid(key, 0, key.length));
|
||||
return this;
|
||||
}
|
||||
public Xol_mw_lang_parser_fxt Tst_parse(String raw, String expd) {
|
||||
fxt.Reset();
|
||||
fxt.Test_parse_page_all_str(raw, expd);
|
||||
return this;
|
||||
}
|
||||
public Xol_mw_lang_parser_fxt Tst_ns_lkp(String key_str, int id) {
|
||||
byte[] key = Bry_.new_u8(key_str);
|
||||
Xow_ns ns = (Xow_ns)wiki.Ns_mgr().Names_get_or_null(key, 0, key.length);
|
||||
int actl = ns == null ? Xow_ns_.Tid__null : ns.Id();
|
||||
Tfds.Eq(id, actl);
|
||||
return this;
|
||||
}
|
||||
public Xol_mw_lang_parser_fxt Test_specialPageAliases(String special, String... expd_aliases) {
|
||||
Xol_specials_itm actl_aliases = lang.Specials_mgr().Get_by_key(Bry_.new_u8(special));
|
||||
Tfds.Eq_ary_str(expd_aliases, To_str_ary(actl_aliases));
|
||||
return this;
|
||||
}
|
||||
private String[] To_str_ary(Xol_specials_itm itm) {
|
||||
int len = itm.Aliases().length;
|
||||
String[] rv = new String[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
rv[i] = String_.new_u8((byte[])itm.Aliases()[i]);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public Xol_mw_lang_parser_fxt Sync_ns() {
|
||||
Xow_ns_mgr_.rebuild_(lang, wiki.Ns_mgr());
|
||||
return this;
|
||||
}
|
||||
public Xol_mw_lang_parser_fxt Tst_message(String key, int id, String val, boolean fmt) {
|
||||
Xol_msg_itm itm = lang.Msg_mgr().Itm_by_key_or_new(Bry_.new_a7(key));
|
||||
Tfds.Eq(id, itm.Id());
|
||||
Tfds.Eq(val, String_.new_u8(itm.Val()));
|
||||
Tfds.Eq(fmt, itm.Has_fmt_arg());
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,32 +13,3 @@ 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.langs.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.wikis.nss.*;
|
||||
import gplx.xowa.langs.parsers.*;
|
||||
public class Xol_ns_grp implements Gfo_invk {
|
||||
public Xol_ns_grp(Xol_lang_itm lang) {this.lang = lang;} private Xol_lang_itm lang;
|
||||
public int Len() {return ary.length;}
|
||||
public Xow_ns Get_at(int i) {return ary[i];} private Xow_ns[] ary = Ary_empty;
|
||||
public void Ary_set_(Xow_ns[] v) {this.ary = v;}
|
||||
public void Ary_add_(Xow_ns[] add_ary) {
|
||||
int old_ary_len = ary.length;
|
||||
int add_ary_len = add_ary.length;
|
||||
Xow_ns[] new_ary = new Xow_ns[old_ary_len + add_ary_len];
|
||||
for (int i = 0; i < old_ary_len; i++)
|
||||
new_ary[i] = ary[i];
|
||||
for (int i = 0; i < add_ary_len; i++)
|
||||
new_ary[i + old_ary_len] = add_ary[i];
|
||||
this.ary = new_ary;
|
||||
}
|
||||
private static final Xow_ns[] Ary_empty = new Xow_ns[0];
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_lang)) return lang;
|
||||
else if (ctx.Match(k, Invk_load_text)) Exec_load_text(m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_lang = Xol_lang_srl.Invk_lang, Invk_load_text = Xol_lang_srl.Invk_load_text;
|
||||
private void Exec_load_text(byte[] bry) {
|
||||
ary = (Xow_ns[])Array_.Resize_add(ary, Xol_lang_srl.Load_ns_grps(bry));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,73 +13,3 @@ 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.langs.cases; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*;
|
||||
import gplx.core.intls.*;
|
||||
public interface Xol_case_itm extends Gfo_case_itm {
|
||||
byte Tid();
|
||||
byte[] Src_ary();
|
||||
byte[] Trg_ary();
|
||||
void Case_build_upper(Bry_bfr bfr);
|
||||
void Case_build_lower(Bry_bfr bfr);
|
||||
void Case_reuse_upper(byte[] ary, int bgn, int len);
|
||||
void Case_reuse_lower(byte[] ary, int bgn, int len);
|
||||
Xol_case_itm Clone();
|
||||
}
|
||||
class Xol_case_itm_byt implements Xol_case_itm {
|
||||
public Xol_case_itm_byt(byte tid, byte src_byte, byte trg_byte) {
|
||||
this.tid = tid; this.src_byte = src_byte; this.trg_byte = trg_byte; this.src_ary = new byte[] {src_byte}; this.trg_ary = new byte[] {trg_byte};
|
||||
switch (tid) {
|
||||
case Xol_case_itm_.Tid_both:
|
||||
case Xol_case_itm_.Tid_upper: upper_byte = trg_byte; lower_byte = src_byte; break;
|
||||
case Xol_case_itm_.Tid_lower: upper_byte = src_byte; lower_byte = trg_byte; break;
|
||||
}
|
||||
}
|
||||
public byte Tid() {return tid;} private byte tid;
|
||||
public boolean Is_single_byte() {return true;}
|
||||
public byte[] Src_ary() {return src_ary;} private byte[] src_ary;
|
||||
public byte[] Trg_ary() {return trg_ary;} private byte[] trg_ary;
|
||||
public byte Src_byte() {return src_byte;} private byte src_byte;
|
||||
public byte Trg_byte() {return trg_byte;} private byte trg_byte;
|
||||
public void Case_build_upper(Bry_bfr bfr) {bfr.Add_byte(upper_byte);} private byte upper_byte;
|
||||
public void Case_build_lower(Bry_bfr bfr) {bfr.Add_byte(lower_byte);} private byte lower_byte;
|
||||
public void Case_reuse_upper(byte[] ary, int bgn, int len) {ary[bgn] = upper_byte;}
|
||||
public void Case_reuse_lower(byte[] ary, int bgn, int len) {ary[bgn] = lower_byte;}
|
||||
public Xol_case_itm Clone() {return new Xol_case_itm_byt(tid, src_byte, trg_byte);}
|
||||
public int Utf8_id_lo() {return lower_byte;}
|
||||
public int Hashcode_lo() {return lower_byte;}
|
||||
public int Len_lo() {return 1;}
|
||||
public byte[] Asymmetric_bry() {return null;}
|
||||
}
|
||||
class Xol_case_itm_bry implements Xol_case_itm {
|
||||
public Xol_case_itm_bry(byte tid, byte[] src_ary, byte[] trg_ary) {
|
||||
this.tid = tid; this.src_ary = src_ary; this.trg_ary = trg_ary;
|
||||
switch (tid) {
|
||||
case Xol_case_itm_.Tid_both: upper_ary = trg_ary; lower_ary = src_ary; break;
|
||||
case Xol_case_itm_.Tid_upper: upper_ary = trg_ary; lower_ary = src_ary; asymmetric_bry = src_ary; break;
|
||||
case Xol_case_itm_.Tid_lower: upper_ary = src_ary; lower_ary = trg_ary; asymmetric_bry = trg_ary; break;
|
||||
}
|
||||
len_lo = lower_ary.length;
|
||||
utf8_id_lo = Utf16_.Decode_to_int(lower_ary, 0);
|
||||
hashcode_ci_lo = Bry_obj_ref.CalcHashCode(lower_ary, 0, len_lo);
|
||||
}
|
||||
public byte Tid() {return tid;} public Xol_case_itm_bry Tid_(byte v) {tid = v; return this;} private byte tid;
|
||||
public boolean Is_single_byte() {return false;}
|
||||
public byte[] Src_ary() {return src_ary;} private byte[] src_ary;
|
||||
public byte[] Trg_ary() {return trg_ary;} private byte[] trg_ary;
|
||||
public void Case_build_upper(Bry_bfr bfr) {bfr.Add(upper_ary);} private byte[] upper_ary;
|
||||
public void Case_build_lower(Bry_bfr bfr) {bfr.Add(lower_ary);} private byte[] lower_ary;
|
||||
public void Case_reuse_upper(byte[] ary, int bgn, int len) { // ASSUME: upper/lower have same width; i.e.: upper'ing a character doesn't go from a 2-width byte to a 3-width byte
|
||||
for (int i = 0; i < len; i++)
|
||||
ary[i + bgn] = upper_ary[i];
|
||||
}
|
||||
public void Case_reuse_lower(byte[] ary, int bgn, int len) { // ASSUME: upper/lower have same width; i.e.: upper'ing a character doesn't go from a 2-width byte to a 3-width byte
|
||||
for (int i = 0; i < len; i++)
|
||||
ary[i + bgn] = lower_ary[i];
|
||||
}
|
||||
public Xol_case_itm Clone() {return new Xol_case_itm_bry(tid, src_ary, trg_ary);}
|
||||
public int Len_lo() {return len_lo;} private int len_lo;
|
||||
public int Utf8_id_lo() {return utf8_id_lo;} private int utf8_id_lo;
|
||||
public byte[] Asymmetric_bry() {return asymmetric_bry;} private byte[] asymmetric_bry;
|
||||
public int Hashcode_lo() {return hashcode_ci_lo;} private int hashcode_ci_lo;
|
||||
}
|
||||
|
||||
@@ -13,135 +13,3 @@ 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.langs.cases; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.parsers.*;
|
||||
public class Xol_case_itm_ {
|
||||
public static final byte Tid_both = 0, Tid_upper = 1, Tid_lower = 2;
|
||||
public static Xol_case_itm new_(int tid, String src_str, String trg_str) {return new_((byte)tid, Bry_.new_u8(src_str), Bry_.new_u8(trg_str));}
|
||||
public static Xol_case_itm new_(byte tid, byte[] src, byte[] trg) {
|
||||
if (src.length == 1 && trg.length == 1)
|
||||
return new Xol_case_itm_byt(tid, src[0], trg[0]);
|
||||
else
|
||||
return new Xol_case_itm_bry(tid, src, trg);
|
||||
}
|
||||
public static Xol_case_itm[] parse_xo_(byte[] src) {
|
||||
List_adp list = List_adp_.New();
|
||||
int src_len = src.length, src_pos = 0, fld_bgn = 0, fld_idx = 0;
|
||||
byte cur_cmd = Byte_.Zero;
|
||||
byte[] cur_lhs = null;
|
||||
Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
while (true) {
|
||||
boolean last = src_pos == src_len;
|
||||
byte b = last ? Byte_ascii.Nl : src[src_pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
switch (fld_idx) {
|
||||
case 0:
|
||||
boolean fail = true;
|
||||
if (src_pos - fld_bgn == 1) {
|
||||
byte cmd_byte = src[src_pos - 1];
|
||||
cur_cmd = Byte_.Zero;
|
||||
switch (cmd_byte) {
|
||||
case Byte_ascii.Num_0: cur_cmd = Xol_case_itm_.Tid_both; fail = false; break;
|
||||
case Byte_ascii.Num_1: cur_cmd = Xol_case_itm_.Tid_upper; fail = false; break;
|
||||
case Byte_ascii.Num_2: cur_cmd = Xol_case_itm_.Tid_lower; fail = false; break;
|
||||
}
|
||||
}
|
||||
if (fail) throw Err_.new_wo_type("cmd is invalid", "cmd", String_.new_u8(src, fld_bgn, src_pos));
|
||||
break;
|
||||
case 1: cur_lhs = csv_parser.Load(src, fld_bgn, src_pos); break;
|
||||
}
|
||||
++fld_idx;
|
||||
fld_bgn = src_pos + 1;
|
||||
break;
|
||||
case Byte_ascii.Nl:
|
||||
if (!(fld_idx == 0 && fld_bgn == src_pos)) {
|
||||
byte[] cur_rhs = csv_parser.Load(src, fld_bgn, src_pos);
|
||||
Xol_case_itm itm = Xol_case_itm_.new_(cur_cmd, cur_lhs, cur_rhs);
|
||||
list.Add(itm);
|
||||
}
|
||||
cur_cmd = Byte_.Zero;
|
||||
cur_lhs = null;
|
||||
fld_idx = 0;
|
||||
fld_bgn = src_pos + 1;
|
||||
break;
|
||||
}
|
||||
if (last) break;
|
||||
++src_pos;
|
||||
}
|
||||
return (Xol_case_itm[])list.To_ary(Xol_case_itm.class);
|
||||
}
|
||||
public static Xol_case_itm[] parse_mw_(byte[] raw) {
|
||||
Ordered_hash hash = Ordered_hash_.New_bry();
|
||||
int pos = 0;
|
||||
pos = parse_mw_grp(hash, raw, Bool_.Y, pos);
|
||||
pos = parse_mw_grp(hash, raw, Bool_.N, pos);
|
||||
return (Xol_case_itm[])hash.To_ary(Xol_case_itm.class);
|
||||
}
|
||||
private static int parse_mw_grp(Ordered_hash hash, byte[] raw, boolean section_is_upper, int find_bgn) {
|
||||
byte[] find = section_is_upper ? parse_mw_upper : parse_mw_lower;
|
||||
int raw_len = raw.length;
|
||||
int pos = Bry_find_.Find_fwd(raw, find, find_bgn); if (pos == Bry_find_.Not_found) throw Err_.new_wo_type("could not find section name", "name", String_.new_u8(find));
|
||||
pos = Bry_find_.Find_fwd(raw, Byte_ascii.Curly_bgn, pos, raw_len); if (pos == Bry_find_.Not_found) throw Err_.new_wo_type("could not find '{' after section name", "name", String_.new_u8(find));
|
||||
int itm_bgn = 0;
|
||||
boolean quote_off = true, itm_is_first = true;
|
||||
byte[] cur_lhs = Bry_.Empty;
|
||||
boolean loop = true;
|
||||
while (loop) {
|
||||
if (pos >= raw_len) break;
|
||||
byte b = raw[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Quote:
|
||||
if (quote_off) {
|
||||
itm_bgn = pos + 1;
|
||||
quote_off = false;
|
||||
}
|
||||
else {
|
||||
if (itm_is_first) {
|
||||
cur_lhs = Bry_.Mid(raw, itm_bgn, pos);
|
||||
itm_is_first = false;
|
||||
}
|
||||
else {
|
||||
byte[] cur_rhs = Bry_.Mid(raw, itm_bgn, pos);
|
||||
byte[] upper = null, lower = null; byte tid = Byte_.Zero, rev_tid = Byte_.Zero;
|
||||
if (section_is_upper) {
|
||||
upper = cur_rhs;
|
||||
lower = cur_lhs;
|
||||
tid = Xol_case_itm_.Tid_upper;
|
||||
rev_tid = Xol_case_itm_.Tid_lower;
|
||||
}
|
||||
else {
|
||||
upper = cur_lhs;
|
||||
lower = cur_rhs;
|
||||
tid = Xol_case_itm_.Tid_lower;
|
||||
rev_tid = Xol_case_itm_.Tid_upper;
|
||||
}
|
||||
Xol_case_itm_bry itm = (Xol_case_itm_bry)hash.Get_by(upper);
|
||||
if (itm == null) {
|
||||
itm = new Xol_case_itm_bry(tid, upper, lower);
|
||||
hash.Add(upper, itm);
|
||||
}
|
||||
else {
|
||||
if (itm.Tid() == rev_tid && Bry_.Eq(itm.Src_ary(), upper) && Bry_.Eq(itm.Trg_ary(), lower))
|
||||
itm.Tid_(Xol_case_itm_.Tid_both);
|
||||
else {
|
||||
itm = new Xol_case_itm_bry(tid, cur_lhs, cur_rhs);
|
||||
byte[] add_key = Bry_.Add(section_is_upper ? Bry_upper : Bry_lower, Bry_pipe, upper, Bry_pipe, lower);
|
||||
hash.Add(add_key, itm);
|
||||
}
|
||||
}
|
||||
itm_is_first = true;
|
||||
}
|
||||
quote_off = true;
|
||||
}
|
||||
break;
|
||||
case Byte_ascii.Curly_end:
|
||||
loop = false;
|
||||
break;
|
||||
}
|
||||
++pos;
|
||||
}
|
||||
return pos;
|
||||
} private static final byte[] parse_mw_upper= Bry_.new_a7("wikiUpperChars"), parse_mw_lower= Bry_.new_a7("wikiLowerChars"), Bry_upper = Bry_.new_a7("upper"), Bry_lower = Bry_.new_a7("lower"), Bry_pipe = Bry_.new_a7("|");
|
||||
static final String GRP_KEY = "xowa.langs.case_parser";
|
||||
}
|
||||
|
||||
@@ -13,127 +13,3 @@ 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.langs.cases; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*; import gplx.core.intls.*;
|
||||
public class Xol_case_mgr implements Gfo_invk, Gfo_case_mgr {
|
||||
private final Btrie_fast_mgr upper_trie = Btrie_fast_mgr.cs(), lower_trie = Btrie_fast_mgr.cs(); private Xol_case_itm[] itms;
|
||||
public Xol_case_mgr(byte tid) {this.tid = tid;}
|
||||
public byte Tid() {return tid;} private byte tid;
|
||||
public Gfo_case_itm Get_or_null(byte bgn_byte, byte[] src, int bgn, int end) {
|
||||
Object rv = lower_trie.Match_bgn_w_byte(bgn_byte, src, bgn, end);
|
||||
return rv == null
|
||||
? (Gfo_case_itm)upper_trie.Match_bgn_w_byte(bgn_byte, src, bgn, end)
|
||||
: (Gfo_case_itm)rv;
|
||||
}
|
||||
public void Clear() {upper_trie.Clear(); lower_trie.Clear();}
|
||||
public boolean Match_any_exists(byte b, byte[] src, int bgn_pos, int end_pos) {
|
||||
return upper_trie.Match_bgn_w_byte(b, src, bgn_pos, end_pos) != null
|
||||
|| lower_trie.Match_bgn_w_byte(b, src, bgn_pos, end_pos) != null
|
||||
;
|
||||
}
|
||||
public Object Match_upper(byte b, byte[] src, int bgn_pos, int end_pos) {return upper_trie.Match_bgn_w_byte(b, src, bgn_pos, end_pos);}
|
||||
public void Add_bulk(byte[] raw) {Add_bulk(Xol_case_itm_.parse_xo_(raw));}
|
||||
public Xol_case_mgr Add_bulk(Xol_case_itm[] ary) {
|
||||
itms = ary;
|
||||
int itms_len = itms.length;
|
||||
for (int i = 0; i < itms_len; i++) {
|
||||
Xol_case_itm itm = itms[i];
|
||||
switch (itm.Tid()) {
|
||||
case Xol_case_itm_.Tid_both:
|
||||
upper_trie.Add(itm.Src_ary(), itm);
|
||||
lower_trie.Add(itm.Trg_ary(), itm);
|
||||
break;
|
||||
case Xol_case_itm_.Tid_upper:
|
||||
upper_trie.Add(itm.Src_ary(), itm);
|
||||
break;
|
||||
case Xol_case_itm_.Tid_lower:
|
||||
lower_trie.Add(itm.Src_ary(), itm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
public byte[] Case_reuse_upper(byte[] src, int bgn, int end) {return Case_reuse(Bool_.Y, src, bgn, end);}
|
||||
public byte[] Case_reuse_lower(byte[] src, int bgn, int end) {return Case_reuse(Bool_.N, src, bgn, end);}
|
||||
public byte[] Case_reuse(boolean upper, byte[] src, int bgn, int end) {
|
||||
Btrie_fast_mgr trie = upper ? upper_trie : lower_trie;
|
||||
Btrie_rv trv = new Btrie_rv(); // TS.MEM: DATE:2016-07-12
|
||||
int pos = bgn;
|
||||
while (true) {
|
||||
if (pos >= end) break;
|
||||
byte b = src[pos];
|
||||
int b_len = gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(b);
|
||||
|
||||
Object o = trie.Match_at_w_b0(trv, b, src, pos, end); // NOTE: used to be (b, src, bgn, end) which would never case correctly; DATE:2013-12-25; TS: DATE:2016-07-06
|
||||
if (o != null && pos < end) { // pos < end used for casing 1st letter only; upper_1st will pass end of 1
|
||||
Xol_case_itm itm = (Xol_case_itm)o;
|
||||
if (upper)
|
||||
itm.Case_reuse_upper(src, pos, b_len);
|
||||
else
|
||||
itm.Case_reuse_lower(src, pos, b_len);
|
||||
}
|
||||
else {} // noop
|
||||
pos += b_len;
|
||||
}
|
||||
return src;
|
||||
}
|
||||
public byte[] Case_reuse_1st_upper(byte[] src) { // NOTE: optimized version called by Frame_ttl; DATE:2014-06-21
|
||||
int src_len = src.length;
|
||||
if (src_len == 0) return src; // empty bry
|
||||
byte b = src[0];
|
||||
int b_len = gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(b);
|
||||
|
||||
Btrie_rv trv = new Btrie_rv(); // TS.MEM: DATE:2016-07-12
|
||||
Object o = upper_trie.Match_at_w_b0(trv, b, src, 0, b_len);
|
||||
if (o == null) return src; // 1st letter is not a lower case char (either num, symbol, or upper)
|
||||
Xol_case_itm itm = (Xol_case_itm)o;
|
||||
Bry_bfr tmp_bfr = Bry_bfr_.New(); // TS.MEM: DATE:2016-07-12
|
||||
itm.Case_build_upper(tmp_bfr);
|
||||
tmp_bfr.Add_mid(src, trv.Pos(), src_len);
|
||||
return tmp_bfr.To_bry_and_clear();
|
||||
}
|
||||
public byte[] Case_build_upper(byte[] src) {return Case_build_upper(src, 0, src.length);}
|
||||
public byte[] Case_build_upper(byte[] src, int bgn, int end) {return Case_build(Bool_.Y, src, bgn, end);}
|
||||
public byte[] Case_build_lower(byte[] src) {return Case_build_lower(src, 0, src.length);}
|
||||
public byte[] Case_build_lower(byte[] src, int bgn, int end) {return Case_build(Bool_.N, src, bgn, end);}
|
||||
public byte[] Case_build(boolean upper, byte[] src, int bgn, int end) {
|
||||
Btrie_fast_mgr trie = upper ? upper_trie : lower_trie;
|
||||
Btrie_rv trv = new Btrie_rv(); // TS.MEM: DATE:2016-07-12
|
||||
Bry_bfr tmp_bfr = Bry_bfr_.New(); // TS.MEM: DATE:2016-07-12
|
||||
int pos = bgn;
|
||||
while (true) {
|
||||
if (pos >= end) break;
|
||||
byte b = src[pos];
|
||||
int b_len = gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(b);
|
||||
|
||||
Object o = trie.Match_at_w_b0(trv, b, src, pos, end); // NOTE: used to be (b, src, bgn, end) which would never case correctly; DATE:2013-12-25;
|
||||
if (o != null && pos < end) { // pos < end used for casing 1st letter only; upper_1st will pass end of 1
|
||||
Xol_case_itm itm = (Xol_case_itm)o;
|
||||
if (upper)
|
||||
itm.Case_build_upper(tmp_bfr);
|
||||
else
|
||||
itm.Case_build_lower(tmp_bfr);
|
||||
}
|
||||
else {
|
||||
tmp_bfr.Add_mid(src, pos, pos + b_len);
|
||||
}
|
||||
pos += b_len;
|
||||
}
|
||||
return tmp_bfr.To_bry_and_clear();
|
||||
}
|
||||
public byte[] Case_build_1st_upper(Bry_bfr bfr, byte[] src, int bgn, int end) {return Case_build_1st(bfr, Bool_.Y, src, bgn, end);}
|
||||
public byte[] Case_build_1st_lower(Bry_bfr bfr, byte[] src, int bgn, int end) {return Case_build_1st(bfr, Bool_.N, src, bgn, end);}
|
||||
public byte[] Case_build_1st(Bry_bfr bfr, boolean upper, byte[] src, int bgn, int end) {
|
||||
if (bgn == end) return Bry_.Empty; // upper "" -> ""
|
||||
int b_len = gplx.core.intls.Utf8_.Len_of_char_by_1st_byte(src[bgn]);
|
||||
bfr.Add(Case_build(upper, src, bgn, bgn + b_len));
|
||||
bfr.Add_mid(src, bgn + b_len, end);
|
||||
return bfr.To_bry_and_clear();
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_add_bulk)) Add_bulk(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_clear)) throw Err_.new_unimplemented();
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_clear = "clear", Invk_add_bulk = "add_bulk";
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -13,144 +13,3 @@ 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.langs.cases; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*; import gplx.core.strings.*;
|
||||
public class Xol_case_mgr_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xol_case_mgr_fxt fxt = new Xol_case_mgr_fxt();
|
||||
@Test public void Mw_parse() {
|
||||
fxt.parse_mw__tst(fxt.itm_both_("A", "a"), fxt.itm_both_("B", "b"));
|
||||
}
|
||||
@Test public void Xo_parse() {
|
||||
fxt.parse_xo__tst(fxt.Init_ltrs_raw(), fxt.itm_both_("a", "A"), fxt.itm_upper_("b", "B"), fxt.itm_lower_("C", "c"));
|
||||
}
|
||||
@Test public void Upper_a() {fxt.Init_ltrs().Upper("aAaz", "AAAz");}
|
||||
@Test public void Upper_ab() {fxt.Init_ltrs().Upper("abac", "ABAc");}
|
||||
@Test public void Lower_a() {fxt.Init_ltrs().Lower("aAaZ", "aaaZ");}
|
||||
@Test public void Lower_ac() {fxt.Init_ltrs().Lower("ABAC", "aBac");}
|
||||
@Test public void Upper_1st() {
|
||||
fxt.Init_ltrs_universal();
|
||||
fxt.Test_reuse_1st_upper("a", "A");
|
||||
fxt.Test_reuse_1st_upper("abc", "Abc");
|
||||
fxt.Test_reuse_1st_upper("");
|
||||
fxt.Test_reuse_1st_upper("Abc");
|
||||
fxt.Test_reuse_1st_upper("é", "É");
|
||||
fxt.Test_reuse_1st_upper("É");
|
||||
fxt.Lower("Ι", "ι"); // PURPOSE:test reversal; PAGE:en.d:ἀρχιερεύς DATE:2014-09-02
|
||||
}
|
||||
@Test public void Turkish_redirect() { // PURPOSE: lowercase redirect should match uppercase for asymmetric brys; PAGE:tr.w:Zvishavane DATE:2015-09-07
|
||||
Hash_adp_bry hash = Hash_adp_bry.c__u8(Bool_.N, Xol_case_mgr_.U8());
|
||||
byte[] upper = Bry_.new_u8("YÖNLENDİRME");
|
||||
byte[] lower = Bry_.new_u8("yönlendirme");
|
||||
hash.Add(upper, upper); // add upper to hash
|
||||
Tfds.Eq_bry(upper, (byte[])hash.Get_by_bry(lower)); // get upper by using lower
|
||||
}
|
||||
// @Test public void Hack() {
|
||||
// Xol_case_itm[] ary = Xol_case_mgr_.Utf_8;
|
||||
// Bry_bfr bfr = Bry_bfr_.New();
|
||||
// for (int i = 0; i < ary.length; i++) {
|
||||
// Xol_case_itm itm = ary[i];
|
||||
// bfr.Add_str_a7("xo|");
|
||||
// bfr.Add_bry_comma(itm.Src_ary()).Add_byte_pipe();
|
||||
// bfr.Add_bry_comma(itm.Trg_ary()).Add_byte_nl();
|
||||
// }
|
||||
// Io_mgr.Instance.SaveFilStr("C:\\test1.txt", bfr.To_str_and_clear());
|
||||
// }
|
||||
}
|
||||
class Xol_case_mgr_fxt {
|
||||
private Xol_case_mgr case_mgr = Xol_case_mgr_.new_(); private String_bldr sb = String_bldr_.new_();
|
||||
public void Clear() {case_mgr.Clear();}
|
||||
public Xol_case_itm_bry itm_both_(String src, String trg) {return new Xol_case_itm_bry(Xol_case_itm_.Tid_both , Bry_.new_u8(src), Bry_.new_u8(trg));}
|
||||
public Xol_case_itm_bry itm_upper_(String src, String trg) {return new Xol_case_itm_bry(Xol_case_itm_.Tid_upper, Bry_.new_u8(src), Bry_.new_u8(trg));}
|
||||
public Xol_case_itm_bry itm_lower_(String src, String trg) {return new Xol_case_itm_bry(Xol_case_itm_.Tid_lower, Bry_.new_u8(src), Bry_.new_u8(trg));}
|
||||
public String Init_ltrs_raw() {
|
||||
return String_.Concat_lines_nl
|
||||
( "0|a|A"
|
||||
, "1|b|B"
|
||||
, "2|C|c"
|
||||
);
|
||||
}
|
||||
public Xol_case_mgr_fxt Init_ltrs() {
|
||||
case_mgr = Xol_case_mgr_.new_();
|
||||
case_mgr.Add_bulk(Bry_.new_u8(Init_ltrs_raw()));
|
||||
return this;
|
||||
}
|
||||
public Xol_case_mgr_fxt Init_ltrs_universal() {
|
||||
case_mgr = Xol_case_mgr_.U8();
|
||||
return this;
|
||||
}
|
||||
public Xol_case_mgr_fxt Upper(String raw_str, String expd) {return Case_build(Bool_.Y, raw_str, expd);}
|
||||
public Xol_case_mgr_fxt Lower(String raw_str, String expd) {return Case_build(Bool_.N, raw_str, expd);}
|
||||
public Xol_case_mgr_fxt Case_build(boolean upper, String raw_str, String expd) {
|
||||
byte[] raw = Bry_.new_u8(raw_str);
|
||||
byte[] actl = case_mgr.Case_build(upper, raw, 0, raw.length);
|
||||
Tfds.Eq(expd, String_.new_u8(actl));
|
||||
return this;
|
||||
}
|
||||
public void parse_xo__tst(String raw, Xol_case_itm_bry... expd) {
|
||||
Tfds.Eq_str_lines(Xto_str(expd), Xto_str(Xol_case_itm_.parse_xo_(Bry_.new_u8(raw))));
|
||||
}
|
||||
public void parse_mw__tst(Xol_case_itm_bry... expd) {
|
||||
String raw = raw_(expd);
|
||||
Xol_case_itm[] actl = Xol_case_itm_.parse_mw_(Bry_.new_u8(raw));
|
||||
Tfds.Eq_str_lines(Xto_str(expd), Xto_str(actl));
|
||||
}
|
||||
public String Xto_str(Xol_case_itm[] ary) {
|
||||
int ary_len = ary.length;
|
||||
for (int i = 0; i < ary_len; i++) {
|
||||
Xol_case_itm itm = ary[i];
|
||||
sb.Add(Byte_.To_str(itm.Tid())).Add_char_pipe().Add(String_.new_u8(itm.Src_ary())).Add_char_pipe().Add(String_.new_u8(itm.Trg_ary())).Add_char_nl();
|
||||
}
|
||||
return sb.To_str_and_clear();
|
||||
}
|
||||
public String raw_(Xol_case_itm_bry[] itms) {
|
||||
int itms_len = itms.length;
|
||||
uppers_list.Clear(); lowers_list.Clear();
|
||||
for (int i = 0; i < itms_len; i++) {
|
||||
Xol_case_itm_bry itm = itms[i];
|
||||
String src = String_.new_u8(itm.Src_ary());
|
||||
String trg = String_.new_u8(itm.Trg_ary());
|
||||
switch (itm.Tid()) {
|
||||
case Xol_case_itm_.Tid_both:
|
||||
uppers_list.Add(trg); uppers_list.Add(src);
|
||||
lowers_list.Add(src); lowers_list.Add(trg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return raw_str_(uppers_list.To_str_ary(), lowers_list.To_str_ary());
|
||||
} List_adp uppers_list = List_adp_.New(), lowers_list = List_adp_.New();
|
||||
String raw_str_(String[] uppers, String[] lowers) {
|
||||
sb.Add("a:2:{s:14:\"wikiUpperChars\";a:1046:{");
|
||||
raw_ary(sb, uppers);
|
||||
sb.Add("}");
|
||||
sb.Add("s:14:\"wikiLowerChars\";a:1038:{");
|
||||
raw_ary(sb, lowers);
|
||||
sb.Add("}}");
|
||||
return sb.To_str_and_clear();
|
||||
}
|
||||
private void raw_ary(String_bldr sb, String[] ary) {
|
||||
int ary_len = ary.length;
|
||||
for (int i = 0; i < ary_len; i++) {
|
||||
String itm = ary[i];
|
||||
int itm_len = String_.Len(itm);
|
||||
sb.Add_fmt("s:{0}:\"{1}\";", itm_len, itm);
|
||||
}
|
||||
}
|
||||
public void Test_reuse_1st_upper(String raw) {Test_reuse_1st_upper(raw, null, Bool_.Y);}
|
||||
public void Test_reuse_1st_upper(String raw, String expd) {Test_reuse_1st_upper(raw, expd, Bool_.N);}
|
||||
private void Test_reuse_1st_upper(String raw, String expd, boolean expd_is_same) {
|
||||
byte[] raw_bry = Bry_.new_u8(raw);
|
||||
byte[] actl_bry = case_mgr.Case_reuse_1st_upper(raw_bry);
|
||||
String actl_str = String_.new_u8(actl_bry);
|
||||
boolean actl_is_same = Object_.Eq(raw_bry, actl_bry); // pointers will be same if no change
|
||||
if (expd_is_same) {
|
||||
Tfds.Eq_true(actl_is_same, "expd should be same: " + actl_str);
|
||||
}
|
||||
else {
|
||||
Tfds.Eq_true(!actl_is_same, "expd should not be same: " + actl_str);
|
||||
Tfds.Eq(expd, actl_str, expd);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
a:2:{s:14:"wikiUpperChars";a:1046:{s:1:"a";s:1:"A";s:1:"b";}s:14:"wikiLowerChars";a:1038:{s:1:"A";s:1:"a";s:1:"B";}}
|
||||
*/
|
||||
@@ -13,9 +13,3 @@ 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.langs.commas; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public interface Xol_comma_wkr {
|
||||
void Evt_lang_changed(Xol_lang_itm lang_itm);
|
||||
void Comma__itm(Bry_bfr bfr, int itm_idx, int itms_len);
|
||||
void Comma__end(Bry_bfr bfr);
|
||||
}
|
||||
|
||||
@@ -13,16 +13,3 @@ 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.langs.commas; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.msgs.*;
|
||||
public class Xol_comma_wkr__add implements Xol_comma_wkr {
|
||||
private byte[] comma_bry = Bry_.new_a7(", "); // needed for TEST
|
||||
public void Evt_lang_changed(Xol_lang_itm lang_itm) {
|
||||
this.comma_bry = lang_itm.Msg_mgr().Val_by_bry_or(Bry_.new_a7("comma-separator"), Byte_ascii.Comma_bry);
|
||||
}
|
||||
public void Comma__itm(Bry_bfr bfr, int itm_idx, int itms_len) {
|
||||
if (itm_idx != itms_len - 1)
|
||||
bfr.Add(comma_bry);
|
||||
}
|
||||
public void Comma__end(Bry_bfr bfr) {}
|
||||
}
|
||||
|
||||
@@ -13,14 +13,3 @@ 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.langs.durations; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_duration_itm {
|
||||
public Xol_duration_itm(byte tid, String name_str, long seconds) {
|
||||
this.tid = tid; this.seconds = seconds;
|
||||
this.name_str = name_str; this.name_bry = Bry_.new_a7(name_str);
|
||||
}
|
||||
public byte Tid() {return tid;} private byte tid;
|
||||
public byte[] Name_bry() {return name_bry;} private byte[] name_bry;
|
||||
public String Name_str() {return name_str;} private String name_str;
|
||||
public long Seconds() {return seconds;} private long seconds;
|
||||
}
|
||||
|
||||
@@ -13,66 +13,3 @@ 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.langs.durations; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_duration_itm_ {
|
||||
private static final Hash_adp_bry regy = Hash_adp_bry.ci_a7(); // ASCII:MW.consts
|
||||
public static final byte
|
||||
Tid_millenia = 0
|
||||
, Tid_centuries = 1
|
||||
, Tid_decades = 2
|
||||
, Tid_years = 3
|
||||
, Tid_weeks = 4
|
||||
, Tid_days = 5
|
||||
, Tid_hours = 6
|
||||
, Tid_minutes = 7
|
||||
, Tid_seconds = 8
|
||||
;
|
||||
public static final Xol_duration_itm
|
||||
Itm_millenia = new_(Tid_millenia , "millenia" , 31556952000L)
|
||||
, Itm_centuries = new_(Tid_centuries , "centuries" , 3155695200L)
|
||||
, Itm_decades = new_(Tid_decades , "decades" , 315569520L)
|
||||
, Itm_years = new_(Tid_years , "years" , 31556952L) // 86400 * (365 + (24 * 3 + 25) / 400)
|
||||
, Itm_weeks = new_(Tid_weeks , "weeks" , 604800L)
|
||||
, Itm_days = new_(Tid_days , "days" , 86400L)
|
||||
, Itm_hours = new_(Tid_hours , "hours" , 3600L)
|
||||
, Itm_minutes = new_(Tid_minutes , "minutes" , 60L)
|
||||
, Itm_seconds = new_(Tid_seconds , "seconds" , 1L)
|
||||
;
|
||||
private static Xol_duration_itm new_(byte tid, String name, long factor) {
|
||||
Xol_duration_itm rv = new Xol_duration_itm(tid, name, factor);
|
||||
regy.Add(rv.Name_bry(), rv);
|
||||
return rv;
|
||||
}
|
||||
public static final Xol_duration_itm[] Ary_default = new Xol_duration_itm[]
|
||||
{ Itm_millenia
|
||||
, Itm_centuries
|
||||
, Itm_decades
|
||||
, Itm_years
|
||||
, Itm_weeks
|
||||
, Itm_days
|
||||
, Itm_hours
|
||||
, Itm_minutes
|
||||
, Itm_seconds
|
||||
};
|
||||
public static Xol_duration_itm[] Xto_itm_ary(Keyval[] kv_ary) {
|
||||
if (kv_ary == null) return Xol_duration_itm_.Ary_default;
|
||||
List_adp rv = List_adp_.New();
|
||||
int len = kv_ary.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Keyval kv = kv_ary[i];
|
||||
String name = kv.Val_to_str_or_empty();
|
||||
Xol_duration_itm itm = (Xol_duration_itm)regy.Get_by(Bry_.new_u8(name));
|
||||
if (itm != null)
|
||||
rv.Add(itm);
|
||||
}
|
||||
return (Xol_duration_itm[])rv.To_ary(Xol_duration_itm.class);
|
||||
}
|
||||
}
|
||||
class Xol_duration_itm_sorter implements gplx.core.lists.ComparerAble {
|
||||
public int compare(Object lhsObj, Object rhsObj) {
|
||||
Xol_duration_itm lhs = (Xol_duration_itm)lhsObj;
|
||||
Xol_duration_itm rhs = (Xol_duration_itm)rhsObj;
|
||||
return -Long_.Compare(lhs.Seconds(), rhs.Seconds()); // - to sort from largest to smallest
|
||||
}
|
||||
public static final Xol_duration_itm_sorter Instance = new Xol_duration_itm_sorter(); Xol_duration_itm_sorter() {}// TS.static
|
||||
}
|
||||
|
||||
@@ -13,80 +13,3 @@ 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.langs.durations; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.brys.fmtrs.*;
|
||||
import gplx.xowa.parsers.*;
|
||||
import gplx.xowa.langs.msgs.*;
|
||||
public class Xol_duration_mgr {
|
||||
private Xol_msg_itm[] interval_msgs = null;
|
||||
private final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
||||
private final Bry_fmtr tmp_fmtr = Bry_fmtr.New__tmp();
|
||||
public Xol_duration_mgr(Xol_lang_itm lang) {this.lang = lang;} private Xol_lang_itm lang;
|
||||
public Xol_interval_itm[] Get_duration_intervals(long seconds, Xol_duration_itm[] intervals) {
|
||||
if (intervals == null) intervals = Xol_duration_itm_.Ary_default;
|
||||
Array_.Sort(intervals, Xol_duration_itm_sorter.Instance);
|
||||
int intervals_len = intervals.length;
|
||||
long val = seconds;
|
||||
List_adp rv = List_adp_.New();
|
||||
for (int i = 0; i < intervals_len; i++) {
|
||||
Xol_duration_itm itm = intervals[i];
|
||||
long itm_seconds = itm.Seconds();
|
||||
val = seconds / itm_seconds;
|
||||
if ( val > 0
|
||||
|| (i == intervals_len - 1 && rv.Count() == 0) // always add one seg; EX: 40 seconds, but minutes requested -> 0 minutes; DATE:2014-05-10
|
||||
) {
|
||||
seconds -= val * itm_seconds;
|
||||
rv.Add(new Xol_interval_itm(itm, val));
|
||||
}
|
||||
}
|
||||
return (Xol_interval_itm[])rv.To_ary(Xol_interval_itm.class);
|
||||
}
|
||||
public byte[] Format_durations(Xop_ctx ctx, long seconds, Xol_duration_itm[] ary) {
|
||||
if (interval_msgs == null) Format_durations_init();
|
||||
Xol_interval_itm[] intervals = Get_duration_intervals(seconds, ary);
|
||||
int intervals_len = intervals.length;
|
||||
byte[][] msgs_ary = new byte[intervals_len][];
|
||||
for (int i = 0; i < intervals_len; i++) {
|
||||
Xol_interval_itm interval = intervals[i];
|
||||
Xol_msg_itm msg_itm = interval_msgs[interval.Duration_itm().Tid()];
|
||||
byte[] msg_bry = msg_itm.Fmt(tmp_bfr, tmp_fmtr, interval.Val());
|
||||
msg_bry = ctx.Wiki().Parser_mgr().Main().Parse_text_to_html(ctx, msg_bry);
|
||||
msgs_ary[i] = msg_bry;
|
||||
}
|
||||
return List_to_str(msgs_ary);
|
||||
}
|
||||
private byte[] Msg_and, Msg_word_separator, Msg_comma_separator;
|
||||
private void Format_durations_init() {
|
||||
Xol_msg_mgr msg_mgr = lang.Msg_mgr();
|
||||
int len = Xol_duration_itm_.Ary_default.length;
|
||||
interval_msgs = new Xol_msg_itm[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_duration_itm itm = Xol_duration_itm_.Ary_default[i];
|
||||
byte[] msg_key = Bry_.Add(Bry_duration, itm.Name_bry());
|
||||
interval_msgs[i] = msg_mgr.Itm_by_key_or_new(msg_key);
|
||||
}
|
||||
} private static final byte[] Bry_duration = Bry_.new_a7("duration-");
|
||||
private void List_to_str_init() {
|
||||
Xol_msg_mgr msg_mgr = lang.Msg_mgr();
|
||||
Msg_and = msg_mgr.Val_by_str_or_empty("and");
|
||||
Msg_word_separator = msg_mgr.Val_by_str_or_empty("word-separator");
|
||||
Msg_comma_separator = msg_mgr.Val_by_str_or_empty("comma-separator");
|
||||
}
|
||||
|
||||
public byte[] List_to_str(byte[][] segs_ary) {
|
||||
int len = segs_ary.length;
|
||||
switch (len) {
|
||||
case 0: return Bry_.Empty;
|
||||
case 1: return segs_ary[0];
|
||||
default:
|
||||
if (Msg_and == null) List_to_str_init();
|
||||
int last_idx = len - 1;
|
||||
for (int i = 0; i < last_idx; i++) {
|
||||
if (i != 0) tmp_bfr.Add(Msg_comma_separator);
|
||||
tmp_bfr.Add(segs_ary[i]);
|
||||
}
|
||||
tmp_bfr.Add(Msg_and).Add(Msg_word_separator).Add(segs_ary[last_idx]);
|
||||
return tmp_bfr.To_bry_and_clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,18 +13,3 @@ 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.langs.durations; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_interval_itm {
|
||||
public Xol_interval_itm(Xol_duration_itm duration_itm, long val) {this.duration_itm = duration_itm; this.val = val;}
|
||||
public Xol_duration_itm Duration_itm() {return duration_itm;} private Xol_duration_itm duration_itm;
|
||||
public long Val() {return val;} private long val;
|
||||
public static Keyval[] Xto_kv_ary(Xol_interval_itm[] ary) {
|
||||
int len = ary.length;
|
||||
Keyval[] rv = new Keyval[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_interval_itm itm = ary[i];
|
||||
rv[i] = Keyval_.new_(itm.Duration_itm().Name_str(), (int)itm.Val()); // double for scribunto
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,23 +13,3 @@ 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.langs.funcs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.parsers.tmpls.*;
|
||||
public class Xol_func_itm {
|
||||
public byte Tid() {return tid;} private byte tid = Xot_defn_.Tid_null;
|
||||
public Xot_defn Func() {return func;} private Xot_defn func = Xot_defn_.Null;
|
||||
public int Colon_pos() {return colon_pos;} private int colon_pos = -1;
|
||||
public int Subst_bgn() {return subst_bgn;} private int subst_bgn = -1;
|
||||
public int Subst_end() {return subst_end;} private int subst_end = -1;
|
||||
public void Clear() {
|
||||
tid = Xot_defn_.Tid_null;
|
||||
func = Xot_defn_.Null;
|
||||
colon_pos = subst_bgn = subst_end = -1;
|
||||
}
|
||||
public void Init_by_subst(byte tid, int bgn, int end) {this.tid = tid; this.subst_bgn = bgn; this.subst_end = end;}
|
||||
public void Func_(Xot_defn v, int colon_pos) {
|
||||
if (tid == Xot_defn_.Tid_null) tid = Xot_defn_.Tid_func; // only set tid if subst did not set it
|
||||
this.func = v;
|
||||
this.colon_pos = colon_pos;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,97 +13,3 @@ 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.langs.funcs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*; import gplx.core.intls.*; import gplx.core.envs.*; import gplx.xowa.xtns.pfuncs.*;
|
||||
import gplx.xowa.parsers.tmpls.*;
|
||||
import gplx.xowa.langs.kwds.*;
|
||||
public class Xol_func_regy {
|
||||
private final Xoa_lang_mgr lang_mgr; private final Xol_lang_itm lang;
|
||||
private final Btrie_slim_mgr cs_trie = Btrie_slim_mgr.cs(), ci_trie = Btrie_slim_mgr.ci_u8();
|
||||
public Xol_func_regy(Xoa_lang_mgr lang_mgr, Xol_lang_itm lang) {this.lang_mgr = lang_mgr; this.lang = lang;}
|
||||
public void Evt_lang_changed(Xol_lang_itm lang) {
|
||||
Xol_kwd_mgr kwd_mgr = lang.Kwd_mgr();
|
||||
ci_trie.Clear(); cs_trie.Clear();
|
||||
int[] kwd_ary = Pf_func_.Ary_get(null, !lang.Kwd_mgr__strx());
|
||||
int len = kwd_ary.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
int id = kwd_ary[i];
|
||||
Xol_kwd_grp list = kwd_mgr.Get_at(id);
|
||||
if (list == null) {
|
||||
if (Env_.Mode_testing())
|
||||
continue; // TEST: allows partial parsing of $magicWords
|
||||
else
|
||||
list = lang_mgr.Lang_en().Kwd_mgr().Get_at(id); // get from fallback language; TODO_OLD: allow other fallback langs besides "English"
|
||||
}
|
||||
Reg_defn(kwd_mgr, id, Pf_func_.Get_prototype(id));
|
||||
}
|
||||
}
|
||||
public void Reg_defn(Xol_kwd_mgr kwd_mgr, int id, Xot_defn defn) {
|
||||
Xol_kwd_grp grp = kwd_mgr.Get_at(id); if (grp == null) return;
|
||||
Xol_kwd_itm[] itms = grp.Itms(); if (itms == null) return;
|
||||
int itms_len = itms.length;
|
||||
for (int i = 0; i < itms_len; i++) {
|
||||
byte[] name = itms[i].Val();
|
||||
this.Add(name, grp.Case_match(), defn.Clone(id, name));
|
||||
}
|
||||
}
|
||||
private void Add(byte[] ary, boolean case_match, Xot_defn func) {
|
||||
if (case_match)
|
||||
cs_trie.Add_obj(ary, func);
|
||||
else {
|
||||
byte[] lower_ary = lang.Case_mgr().Case_build_lower(ary, 0, ary.length);
|
||||
ci_trie.Add_obj(lower_ary, func);
|
||||
}
|
||||
}
|
||||
public void Find_defn(Xol_func_itm rv, byte[] src, int txt_bgn, int txt_end) {
|
||||
rv.Clear();
|
||||
for (int i = 0; i < 2; i++) {
|
||||
if (txt_bgn == txt_end) return; // NOTE: true when tmpl_name is either not loaded, or doesn't exist
|
||||
Xot_defn func = Match_bgn(src, txt_bgn, txt_end);
|
||||
if (func == null) return; // NOTE: null when tmpl_name is either not loaded, or doesn't exist
|
||||
byte[] func_name = func.Name();
|
||||
int match_pos = func_name.length + txt_bgn;
|
||||
byte defn_tid = func.Defn_tid();
|
||||
switch (defn_tid) {
|
||||
case Xot_defn_.Tid_func:
|
||||
if (match_pos == txt_end) // next char is ws (b/c match_pos == txt_end)
|
||||
rv.Func_(func, -1);
|
||||
else if (src[match_pos] == Pf_func_.Name_dlm) // next char is :
|
||||
rv.Func_(func, match_pos);
|
||||
else { // func is close, but not quite: ex: #ifx: or padlefts:
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case Xot_defn_.Tid_safesubst:
|
||||
case Xot_defn_.Tid_subst:
|
||||
rv.Init_by_subst(defn_tid, txt_bgn, match_pos);
|
||||
if (match_pos < txt_end) txt_bgn = Bry_find_.Find_fwd_while_not_ws(src, match_pos, txt_end);
|
||||
break;
|
||||
case Xot_defn_.Tid_raw:
|
||||
case Xot_defn_.Tid_msg:
|
||||
case Xot_defn_.Tid_msgnw:
|
||||
rv.Init_by_subst(defn_tid, txt_bgn, match_pos);
|
||||
if (match_pos + 1 < txt_end) // +1 to include ":" (keyword id "raw", not "raw:")
|
||||
txt_bgn = Bry_find_.Find_fwd_while_not_ws(src, match_pos + 1, txt_end);
|
||||
break;
|
||||
default: return;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
private Xot_defn Match_bgn(byte[] src, int bgn, int end) {
|
||||
Object cs_obj = cs_trie.Match_bgn(src, bgn, end);
|
||||
Xot_defn rv = null;
|
||||
if (cs_obj != null) { // match found for cs; could be false_match; EX: NAME"+"SPACE and NAME"+"SPACENUMBER
|
||||
rv = (Xot_defn)cs_obj;
|
||||
if (rv.Name().length == end - bgn) // func_name matches cur_name; DATE:2013-04-15
|
||||
return rv;
|
||||
// else {} // func_name doesn't match cur_name; continue below; EX: NAME"+"SPACENUMBER passed in and matches NAME"+"SPACE (which is cs); note that NAME"+"SPACENUMBER only exists in ci
|
||||
}
|
||||
byte[] ary = lang.Case_mgr().Case_build_lower(src, bgn, end); // NOTE: cannot call Case_reuse_lower b/c some langs (Turkish) may have differently-sized brys between upper and lower; DATE:2017-01-26
|
||||
Xot_defn rv_alt = (Xot_defn)ci_trie.Match_bgn(ary, 0, ary.length);
|
||||
return (rv != null && rv_alt == null)
|
||||
? rv // name not found in ci, but name was found in cs; return cs; handles NAME"+"SPACENUMBER
|
||||
: rv_alt; // else return rv_alt
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,3 @@ 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.langs.genders; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public interface Xol_gender {
|
||||
byte[] Gender_eval(int gender, byte[] when_m, byte[] when_f, byte[] when_u);
|
||||
}
|
||||
|
||||
@@ -13,20 +13,3 @@ 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.langs.genders; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*; import gplx.core.btries.*;
|
||||
public class Xol_gender_ {
|
||||
public static Xol_gender new_by_lang_id(int lang_id) {return Xol_gender__basic.Instance;}
|
||||
public static final int Tid_male = 0, Tid_female = 1, Tid_unknown = 2;
|
||||
}
|
||||
class Xol_gender__basic implements Xol_gender {
|
||||
public byte[] Gender_eval(int gender, byte[] when_m, byte[] when_f, byte[] when_u) {
|
||||
switch (gender) {
|
||||
case Xol_gender_.Tid_male: return when_m;
|
||||
case Xol_gender_.Tid_female: return when_f;
|
||||
case Xol_gender_.Tid_unknown: return when_u;
|
||||
default: throw Err_.new_unimplemented();
|
||||
}
|
||||
}
|
||||
public static final Xol_gender__basic Instance = new Xol_gender__basic(); Xol_gender__basic() {}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,3 @@ 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.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public interface Xol_grammar {
|
||||
boolean Grammar_eval(Bry_bfr bfr, Xol_lang_itm lang, byte[] word, byte[] type);
|
||||
}
|
||||
|
||||
@@ -13,44 +13,3 @@ 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.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*; import gplx.core.btries.*;
|
||||
public class Xol_grammar_ {
|
||||
public static final byte Tid__max = 9;
|
||||
public static final byte Tid_genitive = 0, Tid_elative = 1, Tid_partitive = 2, Tid_illative = 3, Tid_inessive = 4, Tid_accusative = 5, Tid_instrumental = 6, Tid_prepositional = 7, Tid_dative = 8, Tid_unknown = Byte_.Max_value_127;
|
||||
private static final Btrie_slim_mgr Tid_trie = Btrie_slim_mgr.ci_a7() // NOTE:ci.ascii:MW kwds
|
||||
.Add_str_byte("genitive", Tid_genitive)
|
||||
.Add_str_byte("elative", Tid_elative)
|
||||
.Add_str_byte("partitive", Tid_partitive)
|
||||
.Add_str_byte("illative", Tid_illative)
|
||||
.Add_str_byte("inessive", Tid_inessive)
|
||||
.Add_str_byte("accusative", Tid_accusative)
|
||||
.Add_str_byte("instrumental", Tid_instrumental)
|
||||
.Add_str_byte("prepositional", Tid_prepositional)
|
||||
.Add_str_byte("dative", Tid_dative)
|
||||
;
|
||||
public static byte Tid_of_type(byte[] v) {
|
||||
if (Bry_.Len_eq_0(v)) return Tid_unknown;
|
||||
Object o = Xol_grammar_.Tid_trie.Match_exact(v, 0, v.length);
|
||||
return o == null ? Tid_unknown : ((Byte_obj_val)o).Val();
|
||||
}
|
||||
public static Xol_grammar new_by_lang_id(int lang_id) {
|
||||
switch (lang_id) {
|
||||
case Xol_lang_stub_.Id_fi: return new Xol_grammar_fi();
|
||||
case Xol_lang_stub_.Id_ru: return new Xol_grammar_ru();
|
||||
case Xol_lang_stub_.Id_he: return new Xol_grammar_he();
|
||||
case Xol_lang_stub_.Id_pl:
|
||||
case Xol_lang_stub_.Id_cs: // PAGE:cs.q; DATE:2016-09-04
|
||||
return Xol_grammar__noop.Instance;
|
||||
default: return Xol_grammar__unimplemented.Instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
class Xol_grammar__unimplemented implements Xol_grammar {
|
||||
public boolean Grammar_eval(Bry_bfr bfr, Xol_lang_itm lang, byte[] word, byte[] type) {return false;}
|
||||
public static final Xol_grammar__unimplemented Instance = new Xol_grammar__unimplemented(); Xol_grammar__unimplemented() {}
|
||||
}
|
||||
class Xol_grammar__noop implements Xol_grammar {
|
||||
public boolean Grammar_eval(Bry_bfr bfr, Xol_lang_itm lang, byte[] word, byte[] type) {bfr.Add(word); return true;}
|
||||
public static final Xol_grammar__noop Instance = new Xol_grammar__noop(); Xol_grammar__noop() {}
|
||||
}
|
||||
|
||||
@@ -13,68 +13,3 @@ 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.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*; import gplx.core.btries.*;
|
||||
import gplx.xowa.apps.urls.*;
|
||||
public class Xol_grammar_fi implements Xol_grammar {
|
||||
public boolean Vowel_harmony(byte[] word, int word_len) {
|
||||
// $aou = preg_match( '/[aou][^äöy]*$/i', $word );
|
||||
boolean aou_found = false;
|
||||
for (int i = 0; i < word_len; i++) {
|
||||
byte b = word[i];
|
||||
Object o = trie_vh.Match_bgn_w_byte(b, word, i, word_len);
|
||||
if (o != null) {
|
||||
byte vh_type = ((Byte_obj_val)o).Val();
|
||||
if (vh_type == Trie_vh_back)
|
||||
aou_found = true;
|
||||
else
|
||||
aou_found = false;
|
||||
}
|
||||
}
|
||||
return aou_found;
|
||||
}
|
||||
public boolean Grammar_eval(Bry_bfr bfr, Xol_lang_itm lang, byte[] word, byte[] type) {
|
||||
if (Bry_.Len_eq_0(word)) return true; // empty_string returns ""
|
||||
byte tid = Xol_grammar_.Tid_of_type(type);
|
||||
if (tid == Xol_grammar_.Tid_unknown) {bfr.Add(word); return true;} // unknown type returns word
|
||||
// PHP: if (isset($wgGrammarForms['fi'][$case][$word])){ return $wgGrammarForms['fi'][$case][$word];
|
||||
if (manual_regy == null) {
|
||||
manual_regy = new Xol_grammar_manual_regy()
|
||||
.Itms_add(Xol_grammar_.Tid_elative, "Wikiuutiset", "Wikiuutisista");
|
||||
}
|
||||
byte[] manual_repl = manual_regy.Itms_get(tid, word);
|
||||
if (manual_repl != null) {
|
||||
bfr.Add(manual_repl);
|
||||
return true;
|
||||
}
|
||||
bfr.Add(word); // NOTE: preemptively add word now; the rest of this function takes "word" and adds other letters to it;
|
||||
int word_len = word.length;
|
||||
byte[] lower = lang.Case_mgr().Case_build_lower(word, 0, word_len);
|
||||
boolean aou = Vowel_harmony(lower, word_len);
|
||||
// PHP: if ( preg_match( '/wiki$/i', $word ) ) $aou = false;
|
||||
if (aou && Bry_.Has_at_end(lower, Bry_wiki))
|
||||
aou = false;
|
||||
// PHP: if ( preg_match( '/[bcdfghjklmnpqrstvwxz]$/i', $word ) ) $word .= 'i';
|
||||
switch (lower[word_len - 1]) {
|
||||
case Byte_ascii.Ltr_b: case Byte_ascii.Ltr_c: case Byte_ascii.Ltr_d: case Byte_ascii.Ltr_f: case Byte_ascii.Ltr_g:
|
||||
case Byte_ascii.Ltr_h: case Byte_ascii.Ltr_j: case Byte_ascii.Ltr_k: case Byte_ascii.Ltr_l: case Byte_ascii.Ltr_m:
|
||||
case Byte_ascii.Ltr_n: case Byte_ascii.Ltr_p: case Byte_ascii.Ltr_q: case Byte_ascii.Ltr_r: case Byte_ascii.Ltr_s:
|
||||
case Byte_ascii.Ltr_t: case Byte_ascii.Ltr_v: case Byte_ascii.Ltr_w: case Byte_ascii.Ltr_x: case Byte_ascii.Ltr_z:
|
||||
bfr.Add_byte(Byte_ascii.Ltr_i);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (tid) {
|
||||
case Xol_grammar_.Tid_genitive: bfr.Add_byte(Byte_ascii.Ltr_n); break; // case 'genitive': $word .= 'n';
|
||||
case Xol_grammar_.Tid_elative: bfr.Add(aou ? Bry_sta_y : Bry_sta_n); break; // case 'elative': $word .= ( $aou ? 'sta' : 'stä' );
|
||||
case Xol_grammar_.Tid_partitive: bfr.Add(aou ? Bry_a_y : Bry_a_n); break; // case 'partitive': $word .= ( $aou ? 'a' : 'ä' );
|
||||
case Xol_grammar_.Tid_inessive: bfr.Add(aou ? Bry_ssa_y : Bry_ssa_n); break; // case 'inessive': $word .= ( $aou ? 'ssa' : 'ssä' );
|
||||
case Xol_grammar_.Tid_illative: bfr.Add_byte(word[word_len - 1]).Add_byte(Byte_ascii.Ltr_n); break;// # Double the last letter and add 'n'
|
||||
}
|
||||
return true;
|
||||
} private static Xol_grammar_manual_regy manual_regy;
|
||||
private static final byte[] Bry_sta_y = Bry_.new_a7("sta"), Bry_sta_n = Bry_.new_u8("stä"), Bry_a_y = Bry_.new_a7("a"), Bry_a_n = Bry_.new_u8("ä"), Bry_ssa_y = Bry_.new_a7("ssa"), Bry_ssa_n = Bry_.new_u8("ssä");
|
||||
static final byte Trie_vh_back = 0, Trie_vh_front = 1;
|
||||
private static Btrie_slim_mgr trie_vh = Btrie_slim_mgr.cs().Add_str_byte__many(Trie_vh_back, "a", "o", "u").Add_str_byte__many(Trie_vh_front, "ä", "ö", "y");
|
||||
private static final byte[] Bry_wiki = Bry_.new_a7("wiki");
|
||||
}
|
||||
|
||||
@@ -13,37 +13,3 @@ 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.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*;
|
||||
public class Xol_grammar_he implements Xol_grammar {
|
||||
public boolean Grammar_eval(Bry_bfr bfr, Xol_lang_itm lang, byte[] word, byte[] type) {
|
||||
// if ( isset( $wgGrammarForms['he'][$case][$word] ) ) return $wgGrammarForms['he'][$case][$word]; // TODO_OLD: implement global $wgGrammarForms; WHEN: need to find he.w entries for DefaultSettings.php
|
||||
if (hash.Get_as_int_or(type, -1) == Tid__prefixed) {
|
||||
// Duplicate the "Waw" if prefixed, but not if it is already double.
|
||||
if ( Bry_.Match(word, 0, 2, Bry__waw__0) // "ו"
|
||||
&& !Bry_.Match(word, 0, 4, Bry__waw__1) // "וו"
|
||||
)
|
||||
word = Bry_.Add(Bry__waw__0, word);
|
||||
// Remove the "He" article if prefixed
|
||||
if ( Bry_.Match(word, 0, 2, Bry__he__0)) // "ה"
|
||||
word = Bry_.Mid(word, 2);
|
||||
// Add a hyphen (maqaf) before non-Hebrew letters.
|
||||
if ( Bry_.Match(word, 0, 2, Bry__maqaf__0) // "א"
|
||||
|| Bry_.Compare(word, 0, 2, Bry__maqaf__1, 0, 2) == CompareAble_.More // "ת"
|
||||
)
|
||||
word = Bry_.Add(Bry__maqaf__2, word);
|
||||
}
|
||||
bfr.Add(word);
|
||||
return true;
|
||||
}
|
||||
private static final int Tid__prefixed = 1;
|
||||
private static final Hash_adp_bry hash = Hash_adp_bry.ci_u8(gplx.xowa.langs.cases.Xol_case_mgr_.U8())
|
||||
.Add_str_int("prefixed" , Tid__prefixed)
|
||||
.Add_str_int("תחילית" , Tid__prefixed)
|
||||
;
|
||||
private static final byte[]
|
||||
Bry__waw__0 = Bry_.new_u8("ו"), Bry__waw__1 = Bry_.new_u8("וו")
|
||||
, Bry__he__0 = Bry_.new_u8("ה")
|
||||
, Bry__maqaf__0 = Bry_.new_u8("א"), Bry__maqaf__1 = Bry_.new_u8("ת"), Bry__maqaf__2 = Bry_.new_u8("־")
|
||||
;
|
||||
}
|
||||
|
||||
@@ -13,20 +13,3 @@ 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.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_grammar_manual_regy {
|
||||
private Hash_adp_bry[] ary = new Hash_adp_bry[Xol_grammar_.Tid__max];
|
||||
public byte[] Itms_get(byte type_tid, byte[] word) {
|
||||
Hash_adp_bry hash = ary[type_tid]; if (hash == null) return null;
|
||||
return (byte[])hash.Get_by_bry(word);
|
||||
}
|
||||
public Xol_grammar_manual_regy Itms_add(byte type_tid, String orig, String repl) {
|
||||
Hash_adp_bry hash = ary[type_tid];
|
||||
if (hash == null) {
|
||||
hash = Hash_adp_bry.ci_a7(); // ASCII:currently only being used for Wikiuutiset; DATE:2014-07-07
|
||||
ary[type_tid] = hash;
|
||||
}
|
||||
hash.Add_str_obj(orig, Bry_.new_a7(repl));
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,60 +13,3 @@ 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.langs.grammars; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*;
|
||||
public class Xol_grammar_ru implements Xol_grammar {
|
||||
static final byte Genitive_null = 0, Genitive_bnkn = 1, Genitive_Bnkn = 26, Genitive_b = 3, Genitive_nr = 4, Genitive_ka = 5, Genitive_tn = 6, Genitive_abl = 7, Genitive_hnk = 8;
|
||||
private final Btrie_rv trv = new Btrie_rv();
|
||||
private static Btrie_bwd_mgr Genitive_trie;
|
||||
private static Btrie_bwd_mgr genitive_trie_() {
|
||||
Btrie_bwd_mgr rv = new Btrie_bwd_mgr(false);
|
||||
genitive_trie_add(rv, Genitive_bnkn, "вики", null);
|
||||
genitive_trie_add(rv, Genitive_Bnkn, "Вики", null);
|
||||
genitive_trie_add(rv, Genitive_b, "ь", "я");
|
||||
genitive_trie_add(rv, Genitive_nr, "ия", "ии");
|
||||
genitive_trie_add(rv, Genitive_ka, "ка", "ки");
|
||||
genitive_trie_add(rv, Genitive_tn, "ти", "тей");
|
||||
genitive_trie_add(rv, Genitive_abl, "ды", "дов");
|
||||
genitive_trie_add(rv, Genitive_hnk , "ник", "ника");
|
||||
return rv;
|
||||
}
|
||||
private static void genitive_trie_add(Btrie_bwd_mgr trie, byte tid, String find_str, String repl_str) {
|
||||
byte[] find_bry = Bry_.new_u8(find_str);
|
||||
byte[] repl_bry = repl_str == null ? null : Bry_.new_u8(repl_str);
|
||||
Xol_grammar_ru_genitive_itm itm = new Xol_grammar_ru_genitive_itm(tid, find_bry, repl_bry);
|
||||
trie.Add(find_bry, itm);
|
||||
}
|
||||
public boolean Grammar_eval(Bry_bfr bfr, Xol_lang_itm lang, byte[] word, byte[] type) {
|
||||
if (Bry_.Len_eq_0(word)) return true; // empty_string returns ""
|
||||
byte tid = Xol_grammar_.Tid_of_type(type);
|
||||
switch (tid) {
|
||||
case Xol_grammar_.Tid_genitive: {
|
||||
if (Genitive_trie == null) Genitive_trie = genitive_trie_();
|
||||
Object o = Genitive_trie.Match_at(trv, word, word.length - 1, -1);
|
||||
if (o != null) {
|
||||
Xol_grammar_ru_genitive_itm itm = (Xol_grammar_ru_genitive_itm)o;
|
||||
if (!itm.Repl_is_noop()) {
|
||||
bfr.Add_mid(word, 0, trv.Pos() + 1);
|
||||
bfr.Add(itm.Repl());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Xol_grammar_.Tid_dative: break;
|
||||
case Xol_grammar_.Tid_accusative: break;
|
||||
case Xol_grammar_.Tid_instrumental: break;
|
||||
case Xol_grammar_.Tid_prepositional:break;
|
||||
}
|
||||
bfr.Add(word);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
class Xol_grammar_ru_genitive_itm {
|
||||
public Xol_grammar_ru_genitive_itm(byte tid, byte[] find, byte[] repl) {this.tid = tid; this.find = find; this.repl = repl;}
|
||||
public byte Tid() {return tid;} private byte tid;
|
||||
public byte[] Find() {return find;} private byte[] find;
|
||||
public byte[] Repl() {return repl;} private byte[] repl;
|
||||
public boolean Repl_is_noop() {return repl == null;}
|
||||
}
|
||||
|
||||
@@ -13,20 +13,3 @@ 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.langs.kwds; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_kwd_grp {// REF.MW: Messages_en.php; EX: 'redirect' => array( 0, '#REDIRECT' )
|
||||
public Xol_kwd_grp(byte[] key) {this.key = key;}
|
||||
public byte[] Key() {return key;} private final byte[] key;
|
||||
public boolean Case_match() {return case_match;} private boolean case_match;
|
||||
public Xol_kwd_itm[] Itms() {return itms;} private Xol_kwd_itm[] itms = Xol_kwd_itm.Ary_empty;
|
||||
public void Srl_load(boolean case_match, byte[][] words) {
|
||||
this.case_match = case_match;
|
||||
int words_len = words.length;
|
||||
itms = new Xol_kwd_itm[words_len];
|
||||
for (int i = 0; i < words_len; i++) {
|
||||
byte[] word = words[i];
|
||||
Xol_kwd_itm itm = new Xol_kwd_itm(word);
|
||||
itms[i] = itm;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,477 +13,3 @@ 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.langs.kwds; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*;
|
||||
public class Xol_kwd_grp_ {
|
||||
public static final int
|
||||
Id_redirect = 0
|
||||
, Id_notoc = 1
|
||||
, Id_nogallery = 2
|
||||
, Id_forcetoc = 3
|
||||
, Id_toc = 4
|
||||
, Id_noeditsection = 5
|
||||
, Id_noheader = 6
|
||||
, Id_utc_month_int_len2 = 7
|
||||
, Id_utc_month_int = 8
|
||||
, Id_utc_month_name = 9
|
||||
, Id_utc_month_gen = 10
|
||||
, Id_utc_month_abrv = 11
|
||||
, Id_utc_day_int = 12
|
||||
, Id_utc_day_int_len2 = 13
|
||||
, Id_utc_day_name = 14
|
||||
, Id_utc_year = 15
|
||||
, Id_utc_time = 16
|
||||
, Id_utc_hour = 17
|
||||
, Id_lcl_month_int_len2 = 18
|
||||
, Id_lcl_month_int = 19
|
||||
, Id_lcl_month_name = 20
|
||||
, Id_lcl_month_gen = 21
|
||||
, Id_lcl_month_abrv = 22
|
||||
, Id_lcl_day_int = 23
|
||||
, Id_lcl_day_int_len2 = 24
|
||||
, Id_lcl_day_name = 25
|
||||
, Id_lcl_year = 26
|
||||
, Id_lcl_time = 27
|
||||
, Id_lcl_hour = 28
|
||||
, Id_num_pages = 29
|
||||
, Id_num_articles = 30
|
||||
, Id_num_files = 31
|
||||
, Id_num_users = 32
|
||||
, Id_num_users_active = 33
|
||||
, Id_num_edits = 34
|
||||
, Id_num_views = 35
|
||||
, Id_ttl_page_txt = 36
|
||||
, Id_ttl_page_url = 37
|
||||
, Id_ns_txt = 38
|
||||
, Id_ns_url = 39
|
||||
, Id_ns_talk_txt = 40
|
||||
, Id_ns_talk_url = 41
|
||||
, Id_ns_subj_txt = 42
|
||||
, Id_ns_subj_url = 43
|
||||
, Id_ttl_full_txt = 44
|
||||
, Id_ttl_full_url = 45
|
||||
, Id_ttl_leaf_txt = 46
|
||||
, Id_ttl_leaf_url = 47
|
||||
, Id_ttl_base_txt = 48
|
||||
, Id_ttl_base_url = 49
|
||||
, Id_ttl_talk_txt = 50
|
||||
, Id_ttl_talk_url = 51
|
||||
, Id_ttl_subj_txt = 52
|
||||
, Id_ttl_subj_url = 53
|
||||
, Id_msg = 54
|
||||
, Id_subst = 55
|
||||
, Id_safesubst = 56
|
||||
, Id_msgnw = 57
|
||||
, Id_img_thumbnail = 58
|
||||
, Id_img_manualthumb = 59
|
||||
, Id_img_framed = 60
|
||||
, Id_img_frameless = 61
|
||||
, Id_img_upright = 62
|
||||
, Id_img_upright_factor = 63
|
||||
, Id_img_border = 64
|
||||
, Id_img_align = 65
|
||||
, Id_img_valign = 66
|
||||
, Id_img_alt = 67
|
||||
, Id_img_class = 68
|
||||
, Id_img_caption = 69
|
||||
, Id_img_link_url = 70
|
||||
, Id_img_link_title = 71
|
||||
, Id_img_link_target = 72
|
||||
, Id_img_link_none = 73
|
||||
, Id_img_width = 74
|
||||
, Id_img_page = 75
|
||||
, Id_img_none = 76
|
||||
, Id_img_right = 77
|
||||
, Id_img_center = 78
|
||||
, Id_img_left = 79
|
||||
, Id_img_baseline = 80
|
||||
, Id_img_sub = 81
|
||||
, Id_img_super = 82
|
||||
, Id_img_top = 83
|
||||
, Id_img_text_top = 84
|
||||
, Id_img_middle = 85
|
||||
, Id_img_bottom = 86
|
||||
, Id_img_text_bottom = 87
|
||||
, Id_img_link = 88
|
||||
, Id_i18n_int = 89
|
||||
, Id_site_sitename = 90
|
||||
, Id_url_ns = 91
|
||||
, Id_url_nse = 92
|
||||
, Id_url_localurl = 93
|
||||
, Id_url_localurle = 94
|
||||
, Id_site_articlepath = 95
|
||||
, Id_site_server = 96
|
||||
, Id_site_servername = 97
|
||||
, Id_site_scriptpath = 98
|
||||
, Id_site_stylepath = 99
|
||||
, Id_i18n_grammar = 100
|
||||
, Id_i18n_gender = 101
|
||||
, Id_notitleconvert = 102
|
||||
, Id_nocontentconvert = 103
|
||||
, Id_utc_week = 104
|
||||
, Id_utc_dow = 105
|
||||
, Id_lcl_week = 106
|
||||
, Id_lcl_dow = 107
|
||||
, Id_rev_id = 108
|
||||
, Id_rev_day_int = 109
|
||||
, Id_rev_day_int_len2 = 110
|
||||
, Id_rev_month_int_len2 = 111
|
||||
, Id_rev_month_int = 112
|
||||
, Id_rev_year = 113
|
||||
, Id_rev_timestamp = 114
|
||||
, Id_rev_user = 115
|
||||
, Id_i18n_plural = 116
|
||||
, Id_url_fullurl = 117
|
||||
, Id_url_fullurle = 118
|
||||
, Id_str_lcfirst = 119
|
||||
, Id_str_ucfirst = 120
|
||||
, Id_str_lc = 121
|
||||
, Id_str_uc = 122
|
||||
, Id_raw = 123
|
||||
, Id_page_displaytitle = 124
|
||||
, Id_str_rawsuffix = 125
|
||||
, Id_newsectionlink = 126
|
||||
, Id_nonewsectionlink = 127
|
||||
, Id_site_currentversion = 128
|
||||
, Id_url_urlencode = 129
|
||||
, Id_url_anchorencode = 130
|
||||
, Id_utc_timestamp = 131
|
||||
, Id_lcl_timestamp = 132
|
||||
, Id_site_directionmark = 133
|
||||
, Id_i18n_language = 134
|
||||
, Id_site_contentlanguage = 135
|
||||
, Id_site_pagesinnamespace = 136
|
||||
, Id_num_admins = 137
|
||||
, Id_str_formatnum = 138
|
||||
, Id_str_padleft = 139
|
||||
, Id_str_padright = 140
|
||||
, Id_misc_special = 141
|
||||
, Id_page_defaultsort = 142
|
||||
, Id_url_filepath = 143
|
||||
, Id_misc_tag = 144
|
||||
, Id_hiddencat = 145
|
||||
, Id_site_pagesincategory = 146
|
||||
, Id_rev_pagesize = 147
|
||||
, Id_index = 148
|
||||
, Id_noindex = 149
|
||||
, Id_site_numberingroup = 150
|
||||
, Id_staticredirect = 151
|
||||
, Id_rev_protectionlevel = 152
|
||||
, Id_str_formatdate = 153
|
||||
, Id_url_path = 154
|
||||
, Id_url_wiki = 155
|
||||
, Id_url_query = 156
|
||||
, Id_xtn_expr = 157
|
||||
, Id_xtn_if = 158
|
||||
, Id_xtn_ifeq = 159
|
||||
, Id_xtn_ifexpr = 160
|
||||
, Id_xtn_iferror = 161
|
||||
, Id_xtn_switch = 162
|
||||
, Id_xtn_default = 163
|
||||
, Id_xtn_ifexist = 164
|
||||
, Id_xtn_time = 165
|
||||
, Id_xtn_timel = 166
|
||||
, Id_xtn_rel2abs = 167
|
||||
, Id_xtn_titleparts = 168
|
||||
, Id_xowa_dbg = 169
|
||||
, Id_ogg_noplayer = 170
|
||||
, Id_ogg_noicon = 171
|
||||
, Id_ogg_thumbtime = 172
|
||||
, Id_xtn_geodata_coordinates = 173
|
||||
, Id_url_canonicalurl = 174
|
||||
, Id_url_canonicalurle = 175
|
||||
, Id_lst = 176
|
||||
, Id_lstx = 177
|
||||
, Id_invoke = 178
|
||||
, Id_property = 179
|
||||
, Id_noexternallanglinks = 180
|
||||
, Id_ns_num = 181
|
||||
, Id_page_id = 182
|
||||
, Id_disambig = 183
|
||||
, Id_nocommafysuffix = 184
|
||||
, Id_xowa = 185
|
||||
, Id_mapSources_deg2dd = 186
|
||||
, Id_mapSources_dd2dms = 187
|
||||
, Id_mapSources_geoLink = 188
|
||||
, Id_geoCrumbs_isin = 189
|
||||
, Id_relatedArticles = 190
|
||||
, Id_insider = 191
|
||||
, Id_massMessage_target = 192
|
||||
, Id_cascadingSources = 193
|
||||
, Id_pendingChangeLevel = 194
|
||||
, Id_pagesUsingPendingChanges = 195
|
||||
, Id_bang = 196
|
||||
, Id_wbreponame = 197
|
||||
, Id_strx_len = 198
|
||||
, Id_strx_pos = 199
|
||||
, Id_strx_rpos = 200
|
||||
, Id_strx_sub = 201
|
||||
, Id_strx_count = 202
|
||||
, Id_strx_replace = 203
|
||||
, Id_strx_explode = 204
|
||||
, Id_strx_urldecode = 205
|
||||
, Id_pagesincategory_pages = 206
|
||||
, Id_pagesincategory_subcats = 207
|
||||
, Id_pagesincategory_files = 208
|
||||
, Id_rev_revisionsize = 209
|
||||
, Id_pagebanner = 210
|
||||
, Id_rev_protectionexpiry = 211
|
||||
, Id_new_window_link = 212
|
||||
, Id_categorytree = 213
|
||||
, Id_lsth = 214
|
||||
, Id_assessment = 215
|
||||
, Id_ttl_root_txt = 216
|
||||
, Id_ttl_root_url = 217
|
||||
, Id_statements = 218
|
||||
;
|
||||
public static final int Id__max = 219;
|
||||
|
||||
private static byte[] ary_itm_(int id) {
|
||||
switch (id) {
|
||||
case Xol_kwd_grp_.Id_redirect: return Bry_.new_a7("redirect");
|
||||
case Xol_kwd_grp_.Id_notoc: return Bry_.new_a7("notoc");
|
||||
case Xol_kwd_grp_.Id_nogallery: return Bry_.new_a7("nogallery");
|
||||
case Xol_kwd_grp_.Id_forcetoc: return Bry_.new_a7("forcetoc");
|
||||
case Xol_kwd_grp_.Id_toc: return Bry_.new_a7("toc");
|
||||
case Xol_kwd_grp_.Id_noeditsection: return Bry_.new_a7("noeditsection");
|
||||
case Xol_kwd_grp_.Id_noheader: return Bry_.new_a7("noheader");
|
||||
case Xol_kwd_grp_.Id_utc_month_int_len2: return Bry_.new_a7("currentmonth");
|
||||
case Xol_kwd_grp_.Id_utc_month_int: return Bry_.new_a7("currentmonth1");
|
||||
case Xol_kwd_grp_.Id_utc_month_name: return Bry_.new_a7("currentmonthname");
|
||||
case Xol_kwd_grp_.Id_utc_month_gen: return Bry_.new_a7("currentmonthnamegen");
|
||||
case Xol_kwd_grp_.Id_utc_month_abrv: return Bry_.new_a7("currentmonthabbrev");
|
||||
case Xol_kwd_grp_.Id_utc_day_int: return Bry_.new_a7("currentday");
|
||||
case Xol_kwd_grp_.Id_utc_day_int_len2: return Bry_.new_a7("currentday2");
|
||||
case Xol_kwd_grp_.Id_utc_day_name: return Bry_.new_a7("currentdayname");
|
||||
case Xol_kwd_grp_.Id_utc_year: return Bry_.new_a7("currentyear");
|
||||
case Xol_kwd_grp_.Id_utc_time: return Bry_.new_a7("currenttime");
|
||||
case Xol_kwd_grp_.Id_utc_hour: return Bry_.new_a7("currenthour");
|
||||
case Xol_kwd_grp_.Id_lcl_month_int_len2: return Bry_.new_a7("localmonth");
|
||||
case Xol_kwd_grp_.Id_lcl_month_int: return Bry_.new_a7("localmonth1");
|
||||
case Xol_kwd_grp_.Id_lcl_month_name: return Bry_.new_a7("localmonthname");
|
||||
case Xol_kwd_grp_.Id_lcl_month_gen: return Bry_.new_a7("localmonthnamegen");
|
||||
case Xol_kwd_grp_.Id_lcl_month_abrv: return Bry_.new_a7("localmonthabbrev");
|
||||
case Xol_kwd_grp_.Id_lcl_day_int: return Bry_.new_a7("localday");
|
||||
case Xol_kwd_grp_.Id_lcl_day_int_len2: return Bry_.new_a7("localday2");
|
||||
case Xol_kwd_grp_.Id_lcl_day_name: return Bry_.new_a7("localdayname");
|
||||
case Xol_kwd_grp_.Id_lcl_year: return Bry_.new_a7("localyear");
|
||||
case Xol_kwd_grp_.Id_lcl_time: return Bry_.new_a7("localtime");
|
||||
case Xol_kwd_grp_.Id_lcl_hour: return Bry_.new_a7("localhour");
|
||||
case Xol_kwd_grp_.Id_num_pages: return Bry_.new_a7("numberofpages");
|
||||
case Xol_kwd_grp_.Id_num_articles: return Bry_.new_a7("numberofarticles");
|
||||
case Xol_kwd_grp_.Id_num_files: return Bry_.new_a7("numberoffiles");
|
||||
case Xol_kwd_grp_.Id_num_users: return Bry_.new_a7("numberofusers");
|
||||
case Xol_kwd_grp_.Id_num_users_active: return Bry_.new_a7("numberofactiveusers");
|
||||
case Xol_kwd_grp_.Id_num_edits: return Bry_.new_a7("numberofedits");
|
||||
case Xol_kwd_grp_.Id_num_views: return Bry_.new_a7("numberofviews");
|
||||
case Xol_kwd_grp_.Id_ttl_page_txt: return Bry_.new_a7("pagename");
|
||||
case Xol_kwd_grp_.Id_ttl_page_url: return Bry_.new_a7("pagenamee");
|
||||
case Xol_kwd_grp_.Id_ns_txt: return Bry_.new_a7("namespace");
|
||||
case Xol_kwd_grp_.Id_ns_url: return Bry_.new_a7("namespacee");
|
||||
case Xol_kwd_grp_.Id_ns_talk_txt: return Bry_.new_a7("talkspace");
|
||||
case Xol_kwd_grp_.Id_ns_talk_url: return Bry_.new_a7("talkspacee");
|
||||
case Xol_kwd_grp_.Id_ns_subj_txt: return Bry_.new_a7("subjectspace");
|
||||
case Xol_kwd_grp_.Id_ns_subj_url: return Bry_.new_a7("subjectspacee");
|
||||
case Xol_kwd_grp_.Id_ttl_full_txt: return Bry_.new_a7("fullpagename");
|
||||
case Xol_kwd_grp_.Id_ttl_full_url: return Bry_.new_a7("fullpagenamee");
|
||||
case Xol_kwd_grp_.Id_ttl_leaf_txt: return Bry_.new_a7("subpagename");
|
||||
case Xol_kwd_grp_.Id_ttl_leaf_url: return Bry_.new_a7("subpagenamee");
|
||||
case Xol_kwd_grp_.Id_ttl_base_txt: return Bry_.new_a7("basepagename");
|
||||
case Xol_kwd_grp_.Id_ttl_base_url: return Bry_.new_a7("basepagenamee");
|
||||
case Xol_kwd_grp_.Id_ttl_talk_txt: return Bry_.new_a7("talkpagename");
|
||||
case Xol_kwd_grp_.Id_ttl_talk_url: return Bry_.new_a7("talkpagenamee");
|
||||
case Xol_kwd_grp_.Id_ttl_subj_txt: return Bry_.new_a7("subjectpagename");
|
||||
case Xol_kwd_grp_.Id_ttl_subj_url: return Bry_.new_a7("subjectpagenamee");
|
||||
case Xol_kwd_grp_.Id_ttl_root_txt: return Bry_.new_u8("rootpagename");
|
||||
case Xol_kwd_grp_.Id_ttl_root_url: return Bry_.new_u8("rootpagenamee");
|
||||
case Xol_kwd_grp_.Id_msg: return Bry_.new_a7("msg");
|
||||
case Xol_kwd_grp_.Id_subst: return Bry_.new_a7("subst");
|
||||
case Xol_kwd_grp_.Id_safesubst: return Bry_.new_a7("safesubst");
|
||||
case Xol_kwd_grp_.Id_msgnw: return Bry_.new_a7("msgnw");
|
||||
case Xol_kwd_grp_.Id_img_thumbnail: return Bry_.new_a7("img_thumbnail");
|
||||
case Xol_kwd_grp_.Id_img_manualthumb: return Bry_.new_a7("img_manualthumb");
|
||||
case Xol_kwd_grp_.Id_img_framed: return Bry_.new_a7("img_framed");
|
||||
case Xol_kwd_grp_.Id_img_frameless: return Bry_.new_a7("img_frameless");
|
||||
case Xol_kwd_grp_.Id_img_upright: return Bry_.new_a7("img_upright");
|
||||
case Xol_kwd_grp_.Id_img_upright_factor: return Bry_.new_a7("img_upright_factor");
|
||||
case Xol_kwd_grp_.Id_img_border: return Bry_.new_a7("img_border");
|
||||
case Xol_kwd_grp_.Id_img_align: return Bry_.new_a7("img_align");
|
||||
case Xol_kwd_grp_.Id_img_valign: return Bry_.new_a7("img_valign");
|
||||
case Xol_kwd_grp_.Id_img_alt: return Bry_.new_a7("img_alt");
|
||||
case Xol_kwd_grp_.Id_img_class: return Bry_.new_a7("img_class");
|
||||
case Xol_kwd_grp_.Id_img_caption: return Bry_.new_a7("img_caption");
|
||||
case Xol_kwd_grp_.Id_img_link_url: return Bry_.new_a7("img_link_url");
|
||||
case Xol_kwd_grp_.Id_img_link_title: return Bry_.new_a7("img_link_title");
|
||||
case Xol_kwd_grp_.Id_img_link_target: return Bry_.new_a7("img_link_target");
|
||||
case Xol_kwd_grp_.Id_img_link_none: return Bry_.new_a7("img_link_none");
|
||||
case Xol_kwd_grp_.Id_img_width: return Bry_.new_a7("img_width");
|
||||
case Xol_kwd_grp_.Id_img_page: return Bry_.new_a7("img_page");
|
||||
case Xol_kwd_grp_.Id_img_none: return Bry_.new_a7("img_none");
|
||||
case Xol_kwd_grp_.Id_img_right: return Bry_.new_a7("img_right");
|
||||
case Xol_kwd_grp_.Id_img_center: return Bry_.new_a7("img_center");
|
||||
case Xol_kwd_grp_.Id_img_left: return Bry_.new_a7("img_left");
|
||||
case Xol_kwd_grp_.Id_img_baseline: return Bry_.new_a7("img_baseline");
|
||||
case Xol_kwd_grp_.Id_img_sub: return Bry_.new_a7("img_sub");
|
||||
case Xol_kwd_grp_.Id_img_super: return Bry_.new_a7("img_super");
|
||||
case Xol_kwd_grp_.Id_img_top: return Bry_.new_a7("img_top");
|
||||
case Xol_kwd_grp_.Id_img_text_top: return Bry_.new_a7("img_text_top");
|
||||
case Xol_kwd_grp_.Id_img_middle: return Bry_.new_a7("img_middle");
|
||||
case Xol_kwd_grp_.Id_img_bottom: return Bry_.new_a7("img_bottom");
|
||||
case Xol_kwd_grp_.Id_img_text_bottom: return Bry_.new_a7("img_text_bottom");
|
||||
case Xol_kwd_grp_.Id_img_link: return Bry_.new_a7("img_link");
|
||||
case Xol_kwd_grp_.Id_i18n_int: return Bry_.new_a7("int");
|
||||
case Xol_kwd_grp_.Id_site_sitename: return Bry_.new_a7("sitename");
|
||||
case Xol_kwd_grp_.Id_url_ns: return Bry_.new_a7("ns");
|
||||
case Xol_kwd_grp_.Id_url_nse: return Bry_.new_a7("nse");
|
||||
case Xol_kwd_grp_.Id_url_localurl: return Bry_.new_a7("localurl");
|
||||
case Xol_kwd_grp_.Id_url_localurle: return Bry_.new_a7("localurle");
|
||||
case Xol_kwd_grp_.Id_site_articlepath: return Bry_.new_a7("articlepath");
|
||||
case Xol_kwd_grp_.Id_site_server: return Bry_.new_a7("server");
|
||||
case Xol_kwd_grp_.Id_site_servername: return Bry_.new_a7("servername");
|
||||
case Xol_kwd_grp_.Id_site_scriptpath: return Bry_.new_a7("scriptpath");
|
||||
case Xol_kwd_grp_.Id_site_stylepath: return Bry_.new_a7("stylepath");
|
||||
case Xol_kwd_grp_.Id_i18n_grammar: return Bry_.new_a7("grammar");
|
||||
case Xol_kwd_grp_.Id_i18n_gender: return Bry_.new_a7("gender");
|
||||
case Xol_kwd_grp_.Id_notitleconvert: return Bry_.new_a7("notitleconvert");
|
||||
case Xol_kwd_grp_.Id_nocontentconvert: return Bry_.new_a7("nocontentconvert");
|
||||
case Xol_kwd_grp_.Id_utc_week: return Bry_.new_a7("currentweek");
|
||||
case Xol_kwd_grp_.Id_utc_dow: return Bry_.new_a7("currentdow");
|
||||
case Xol_kwd_grp_.Id_lcl_week: return Bry_.new_a7("localweek");
|
||||
case Xol_kwd_grp_.Id_lcl_dow: return Bry_.new_a7("localdow");
|
||||
case Xol_kwd_grp_.Id_rev_id: return Bry_.new_a7("revisionid");
|
||||
case Xol_kwd_grp_.Id_rev_day_int: return Bry_.new_a7("revisionday");
|
||||
case Xol_kwd_grp_.Id_rev_day_int_len2: return Bry_.new_a7("revisionday2");
|
||||
case Xol_kwd_grp_.Id_rev_month_int_len2: return Bry_.new_a7("revisionmonth");
|
||||
case Xol_kwd_grp_.Id_rev_month_int: return Bry_.new_a7("revisionmonth1");
|
||||
case Xol_kwd_grp_.Id_rev_year: return Bry_.new_a7("revisionyear");
|
||||
case Xol_kwd_grp_.Id_rev_timestamp: return Bry_.new_a7("revisiontimestamp");
|
||||
case Xol_kwd_grp_.Id_rev_user: return Bry_.new_a7("revisionuser");
|
||||
case Xol_kwd_grp_.Id_i18n_plural: return Bry_.new_a7("plural");
|
||||
case Xol_kwd_grp_.Id_url_fullurl: return Bry_.new_a7("fullurl");
|
||||
case Xol_kwd_grp_.Id_url_fullurle: return Bry_.new_a7("fullurle");
|
||||
case Xol_kwd_grp_.Id_str_lcfirst: return Bry_.new_a7("lcfirst");
|
||||
case Xol_kwd_grp_.Id_str_ucfirst: return Bry_.new_a7("ucfirst");
|
||||
case Xol_kwd_grp_.Id_str_lc: return Bry_.new_a7("lc");
|
||||
case Xol_kwd_grp_.Id_str_uc: return Bry_.new_a7("uc");
|
||||
case Xol_kwd_grp_.Id_raw: return Bry_.new_a7("raw");
|
||||
case Xol_kwd_grp_.Id_page_displaytitle: return Bry_.new_a7("displaytitle");
|
||||
case Xol_kwd_grp_.Id_str_rawsuffix: return Bry_.new_a7("rawsuffix");
|
||||
case Xol_kwd_grp_.Id_newsectionlink: return Bry_.new_a7("newsectionlink");
|
||||
case Xol_kwd_grp_.Id_nonewsectionlink: return Bry_.new_a7("nonewsectionlink");
|
||||
case Xol_kwd_grp_.Id_site_currentversion: return Bry_.new_a7("currentversion");
|
||||
case Xol_kwd_grp_.Id_url_urlencode: return Bry_.new_a7("urlencode");
|
||||
case Xol_kwd_grp_.Id_url_anchorencode: return Bry_.new_a7("anchorencode");
|
||||
case Xol_kwd_grp_.Id_utc_timestamp: return Bry_.new_a7("currenttimestamp");
|
||||
case Xol_kwd_grp_.Id_lcl_timestamp: return Bry_.new_a7("localtimestamp");
|
||||
case Xol_kwd_grp_.Id_site_directionmark: return Bry_.new_a7("directionmark");
|
||||
case Xol_kwd_grp_.Id_i18n_language: return Bry_.new_a7("language");
|
||||
case Xol_kwd_grp_.Id_site_contentlanguage: return Bry_.new_a7("contentlanguage");
|
||||
case Xol_kwd_grp_.Id_site_pagesinnamespace: return Bry_.new_a7("pagesinnamespace");
|
||||
case Xol_kwd_grp_.Id_num_admins: return Bry_.new_a7("numberofadmins");
|
||||
case Xol_kwd_grp_.Id_str_formatnum: return Bry_.new_a7("formatnum");
|
||||
case Xol_kwd_grp_.Id_str_padleft: return Bry_.new_a7("padleft");
|
||||
case Xol_kwd_grp_.Id_str_padright: return Bry_.new_a7("padright");
|
||||
case Xol_kwd_grp_.Id_misc_special: return Bry_.new_a7("special");
|
||||
case Xol_kwd_grp_.Id_page_defaultsort: return Bry_.new_a7("defaultsort");
|
||||
case Xol_kwd_grp_.Id_url_filepath: return Bry_.new_a7("filepath");
|
||||
case Xol_kwd_grp_.Id_misc_tag: return Bry_.new_a7("tag");
|
||||
case Xol_kwd_grp_.Id_hiddencat: return Bry_.new_a7("hiddencat");
|
||||
case Xol_kwd_grp_.Id_site_pagesincategory: return Bry_.new_a7("pagesincategory");
|
||||
case Xol_kwd_grp_.Id_rev_pagesize: return Bry_.new_a7("pagesize");
|
||||
case Xol_kwd_grp_.Id_index: return Bry_.new_a7("index");
|
||||
case Xol_kwd_grp_.Id_noindex: return Bry_.new_a7("noindex");
|
||||
case Xol_kwd_grp_.Id_site_numberingroup: return Bry_.new_a7("numberingroup");
|
||||
case Xol_kwd_grp_.Id_staticredirect: return Bry_.new_a7("staticredirect");
|
||||
case Xol_kwd_grp_.Id_rev_protectionlevel: return Bry_.new_a7("protectionlevel");
|
||||
case Xol_kwd_grp_.Id_str_formatdate: return Bry_.new_a7("formatdate");
|
||||
case Xol_kwd_grp_.Id_url_path: return Bry_.new_a7("url_path");
|
||||
case Xol_kwd_grp_.Id_url_wiki: return Bry_.new_a7("url_wiki");
|
||||
case Xol_kwd_grp_.Id_url_query: return Bry_.new_a7("url_query");
|
||||
case Xol_kwd_grp_.Id_xtn_expr: return Bry_.new_a7("expr");
|
||||
case Xol_kwd_grp_.Id_xtn_if: return Bry_.new_a7("if");
|
||||
case Xol_kwd_grp_.Id_xtn_ifeq: return Bry_.new_a7("ifeq");
|
||||
case Xol_kwd_grp_.Id_xtn_ifexpr: return Bry_.new_a7("ifexpr");
|
||||
case Xol_kwd_grp_.Id_xtn_iferror: return Bry_.new_a7("iferror");
|
||||
case Xol_kwd_grp_.Id_xtn_switch: return Bry_.new_a7("switch");
|
||||
case Xol_kwd_grp_.Id_xtn_default: return Bry_.new_a7("default");
|
||||
case Xol_kwd_grp_.Id_xtn_ifexist: return Bry_.new_a7("ifexist");
|
||||
case Xol_kwd_grp_.Id_xtn_time: return Bry_.new_a7("time");
|
||||
case Xol_kwd_grp_.Id_xtn_timel: return Bry_.new_a7("timel");
|
||||
case Xol_kwd_grp_.Id_xtn_rel2abs: return Bry_.new_a7("rel2abs");
|
||||
case Xol_kwd_grp_.Id_xtn_titleparts: return Bry_.new_a7("titleparts");
|
||||
case Xol_kwd_grp_.Id_xowa_dbg: return Bry_.new_a7("xowa_dbg");
|
||||
case Xol_kwd_grp_.Id_ogg_noplayer: return Bry_.new_a7("noplayer");
|
||||
case Xol_kwd_grp_.Id_ogg_noicon: return Bry_.new_a7("noicon");
|
||||
case Xol_kwd_grp_.Id_ogg_thumbtime: return Bry_.new_a7("thumbtime");
|
||||
case Xol_kwd_grp_.Id_xtn_geodata_coordinates: return Bry_.new_a7("coordinates");
|
||||
case Xol_kwd_grp_.Id_url_canonicalurl: return Bry_.new_a7("canonicalurl");
|
||||
case Xol_kwd_grp_.Id_url_canonicalurle: return Bry_.new_a7("canonicalurle");
|
||||
case Xol_kwd_grp_.Id_lst: return Bry_.new_a7("lst");
|
||||
case Xol_kwd_grp_.Id_lstx: return Bry_.new_a7("lstx");
|
||||
case Xol_kwd_grp_.Id_lsth: return Bry_.new_u8("lsth");
|
||||
case Xol_kwd_grp_.Id_invoke: return Bry_.new_a7("invoke");
|
||||
case Xol_kwd_grp_.Id_property: return Bry_.new_a7("property");
|
||||
case Xol_kwd_grp_.Id_noexternallanglinks: return Bry_.new_a7("noexternallanglinks");
|
||||
case Xol_kwd_grp_.Id_ns_num: return Bry_.new_a7("namespacenumber");
|
||||
case Xol_kwd_grp_.Id_page_id: return Bry_.new_a7("pageid");
|
||||
case Xol_kwd_grp_.Id_disambig: return Bry_.new_a7("disambiguation");
|
||||
case Xol_kwd_grp_.Id_nocommafysuffix: return Bry_.new_a7("nosep");
|
||||
case Xol_kwd_grp_.Id_xowa: return Bry_.new_a7("xowa");
|
||||
case Xol_kwd_grp_.Id_mapSources_deg2dd: return Bry_.new_a7("deg2dd");
|
||||
case Xol_kwd_grp_.Id_mapSources_dd2dms: return Bry_.new_a7("dd2dms");
|
||||
case Xol_kwd_grp_.Id_mapSources_geoLink: return Bry_.new_a7("geolink");
|
||||
case Xol_kwd_grp_.Id_geoCrumbs_isin: return Bry_.new_a7("isin");
|
||||
case Xol_kwd_grp_.Id_relatedArticles: return Bry_.new_a7("relatedArticles");
|
||||
case Xol_kwd_grp_.Id_insider: return Bry_.new_a7("insider");
|
||||
case Xol_kwd_grp_.Id_massMessage_target: return Bry_.new_a7("target");
|
||||
case Xol_kwd_grp_.Id_cascadingSources: return Bry_.new_a7("cascadingSources");
|
||||
case Xol_kwd_grp_.Id_pendingChangeLevel: return Bry_.new_a7("pendingChangeLevel");
|
||||
case Xol_kwd_grp_.Id_pagesUsingPendingChanges: return Bry_.new_a7("pagesUsingPendingChanges");
|
||||
case Xol_kwd_grp_.Id_bang: return Bry_.new_a7("!");
|
||||
case Xol_kwd_grp_.Id_wbreponame: return Bry_.new_a7("wbreponame");
|
||||
case Xol_kwd_grp_.Id_strx_len: return Bry_.new_a7("len");
|
||||
case Xol_kwd_grp_.Id_strx_pos: return Bry_.new_a7("pos");
|
||||
case Xol_kwd_grp_.Id_strx_rpos: return Bry_.new_a7("rpos");
|
||||
case Xol_kwd_grp_.Id_strx_sub: return Bry_.new_a7("sub");
|
||||
case Xol_kwd_grp_.Id_strx_count: return Bry_.new_a7("count");
|
||||
case Xol_kwd_grp_.Id_strx_replace: return Bry_.new_a7("replace");
|
||||
case Xol_kwd_grp_.Id_strx_explode: return Bry_.new_a7("explode");
|
||||
case Xol_kwd_grp_.Id_strx_urldecode: return Bry_.new_a7("urldecode");
|
||||
case Xol_kwd_grp_.Id_pagesincategory_pages: return Bry_.new_u8("pagesincategory_pages");
|
||||
case Xol_kwd_grp_.Id_pagesincategory_subcats: return Bry_.new_u8("pagesincategory_subcats");
|
||||
case Xol_kwd_grp_.Id_pagesincategory_files: return Bry_.new_u8("pagesincategory_files");
|
||||
case Xol_kwd_grp_.Id_rev_revisionsize: return Bry_.new_u8("revisionsize");
|
||||
case Xol_kwd_grp_.Id_pagebanner: return Bry_.new_u8("pagebanner");
|
||||
case Xol_kwd_grp_.Id_rev_protectionexpiry: return Bry_.new_u8("protectionexpiry");
|
||||
case Xol_kwd_grp_.Id_new_window_link: return Bry_.new_u8("newwindowlink");
|
||||
case Xol_kwd_grp_.Id_categorytree: return Bry_.new_u8("categorytree");
|
||||
case Xol_kwd_grp_.Id_assessment: return Bry_.new_u8("assessment");
|
||||
case Xol_kwd_grp_.Id_statements: return Bry_.new_u8("statements");
|
||||
default: throw Err_.new_unhandled(id);
|
||||
}
|
||||
}
|
||||
public static byte[] Bry_by_id(int id) {
|
||||
if (Bry__ == null) Bry_init();
|
||||
return Bry__[id];
|
||||
} private static byte[][] Bry__;
|
||||
public static int Id_by_bry(byte[] find) {
|
||||
if (hash == null) {
|
||||
hash = Hash_adp_bry.ci_a7(); // ASCII: all MW kwds appear to be ASCII; EX: "redirect", "toc", "currentmont", etc.
|
||||
if (Bry__ == null) Bry_init();
|
||||
int len = Bry__.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte[] bry = Bry__[i];
|
||||
hash.Add(bry, new Int_obj_val(i));
|
||||
}
|
||||
}
|
||||
Object o = hash.Get_by_bry(find);
|
||||
return o == null? Int_.Neg1 : ((Int_obj_val)o).Val();
|
||||
} private static Hash_adp_bry hash;
|
||||
private static void Bry_init() {
|
||||
Bry__ = new byte[Id__max][];
|
||||
for (int i = 0; i < Id__max; i++)
|
||||
Bry__[i] = ary_itm_(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,10 +13,3 @@ 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.langs.kwds; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_kwd_itm {// NOTE: keeping as separate class b/c may include fmt props later; EX: thumbnail=$1
|
||||
public Xol_kwd_itm(byte[] val) {this.val = val;}
|
||||
public byte[] Val() {return val;} private byte[] val;
|
||||
public void Val_(byte[] v) {val = v;} // should only be called by lang
|
||||
public static final Xol_kwd_itm[] Ary_empty = new Xol_kwd_itm[0];
|
||||
}
|
||||
|
||||
@@ -13,83 +13,3 @@ 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.langs.kwds; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*;
|
||||
import gplx.xowa.langs.parsers.*;
|
||||
public class Xol_kwd_mgr implements Gfo_invk {
|
||||
private final Xol_lang_itm lang; private final Xol_kwd_grp[] grps = new Xol_kwd_grp[Xol_kwd_grp_.Id__max];
|
||||
private Btrie_slim_mgr kwd_default_trie; private byte[] kwd_default_key; private boolean kwd_default_init_needed = true;
|
||||
public Xol_kwd_mgr(Xol_lang_itm lang) {this.lang = lang;}
|
||||
public int Len() {return grps.length;}
|
||||
public void Clear() {
|
||||
int len = grps.length;
|
||||
for (int i = 0; i < len; ++i)
|
||||
grps[i] = null;
|
||||
}
|
||||
public Btrie_slim_mgr Trie_raw() {if (trie_raw == null) trie_raw = Xol_kwd_mgr.trie_(this, Xol_kwd_grp_.Id_str_rawsuffix); return trie_raw;} private Btrie_slim_mgr trie_raw;
|
||||
public Btrie_slim_mgr Trie_nosep() {if (trie_nosep == null) trie_nosep = Xol_kwd_mgr.trie_(this, Xol_kwd_grp_.Id_nocommafysuffix); return trie_nosep;} private Btrie_slim_mgr trie_nosep;
|
||||
public void Kwd_default_match_reset() {kwd_default_init_needed = true;} // TEST:
|
||||
public boolean Kwd_default_match(byte[] match) { // handle multiple #default keywords; DATE:2014-07-28
|
||||
if (match == null) return false; // null never matches #default
|
||||
int match_len = match.length;
|
||||
if (match_len == 0) return false; // "" never matches default
|
||||
if (kwd_default_init_needed) {
|
||||
kwd_default_init_needed = false;
|
||||
Xol_kwd_grp grp = this.Get_at(Xol_kwd_grp_.Id_xtn_default);
|
||||
int len = grp.Itms().length;
|
||||
if (len == 1)
|
||||
kwd_default_key = grp.Itms()[0].Val();
|
||||
else {
|
||||
kwd_default_trie = Btrie_slim_mgr.new_(grp.Case_match());
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_kwd_itm itm = grp.Itms()[i];
|
||||
kwd_default_trie.Add_obj(itm.Val(), itm);
|
||||
}
|
||||
}
|
||||
}
|
||||
return kwd_default_trie == null
|
||||
? Bry_.Has_at_bgn(match, kwd_default_key, 0, match_len)
|
||||
: kwd_default_trie.Match_bgn(match, 0, match_len) != null
|
||||
;
|
||||
}
|
||||
public Xol_kwd_grp Get_at(int id) {return grps[id];}
|
||||
public Xol_kwd_grp Get_or_new(int id) {
|
||||
Xol_kwd_grp rv = grps[id];
|
||||
if (rv == null) {
|
||||
rv = new Xol_kwd_grp(Xol_kwd_grp_.Bry_by_id(id));
|
||||
grps[id] = rv;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public Xol_kwd_grp New(boolean case_match, int id, String... words_str) {
|
||||
Xol_kwd_grp rv = Get_or_new(id);
|
||||
rv.Srl_load(case_match, Bry_.Ary(words_str));
|
||||
return rv;
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_lang)) return lang;
|
||||
else if (ctx.Match(k, Invk_load_text)) Xol_lang_srl.Load_keywords(this, m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_lang = Xol_lang_srl.Invk_lang, Invk_load_text = Xol_lang_srl.Invk_load_text;
|
||||
public static Btrie_slim_mgr trie_(Xol_kwd_mgr mgr, int id) {
|
||||
Xol_kwd_grp grp = mgr.Get_at(id);
|
||||
Btrie_slim_mgr rv = Btrie_slim_mgr.new_(grp.Case_match());
|
||||
int len = grp.Itms().length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_kwd_itm itm = grp.Itms()[i];
|
||||
rv.Add_obj(itm.Val(), itm);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public static Hash_adp_bry hash_(Xol_kwd_mgr mgr, int id) {
|
||||
Xol_kwd_grp grp = mgr.Get_at(id);
|
||||
Hash_adp_bry rv = Hash_adp_bry.c__u8(grp.Case_match(), mgr.lang.Case_mgr());
|
||||
int len = grp.Itms().length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_kwd_itm itm = grp.Itms()[i];
|
||||
rv.Add(itm.Val(), itm);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,66 +13,3 @@ 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.langs.kwds; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*;
|
||||
public class Xol_kwd_parse_data {
|
||||
public static byte[] Strip(Bry_bfr tmp, byte[] raw, Byte_obj_ref rslt) {
|
||||
int raw_len = raw.length;
|
||||
boolean dirty = false;
|
||||
for (int i = 0; i < raw_len; i++) {
|
||||
byte b = raw[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Dollar:
|
||||
byte prv = i == 0 ? Byte_ascii.Null : raw[i - 1];
|
||||
switch (prv) {
|
||||
case Byte_ascii.Backslash: { // ignore \$
|
||||
if (dirty) tmp.Add_byte(b);
|
||||
else {tmp.Add_mid(raw, 0, i - 1); dirty = true;} // i - 1 to ignore backslash
|
||||
break;
|
||||
}
|
||||
case Byte_ascii.Eq: { // assume end; EX: link=$1
|
||||
dirty = true;
|
||||
tmp.Add_mid(raw, 0, i - 1); // - 1 to ignore =
|
||||
rslt.Val_(Strip_end);
|
||||
i = raw_len;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
if (i == 0) {
|
||||
rslt.Val_(Strip_bgn);
|
||||
dirty = true;
|
||||
int txt_bgn = 1;
|
||||
for (int j = 1; j < raw_len; j++) {
|
||||
b = raw[j];
|
||||
switch (b) {
|
||||
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
||||
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
|
||||
break;
|
||||
default:
|
||||
txt_bgn = j;
|
||||
j = raw_len;
|
||||
break;
|
||||
}
|
||||
}
|
||||
tmp.Add_mid(raw, txt_bgn, raw_len);
|
||||
}
|
||||
else {
|
||||
dirty = true;
|
||||
tmp.Add_mid(raw, 0, i);
|
||||
rslt.Val_(Strip_end);
|
||||
i = raw_len;
|
||||
}
|
||||
i = raw_len;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (dirty) tmp.Add_byte(b);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return dirty ? tmp.To_bry_and_clear() : raw;
|
||||
}
|
||||
public static final byte Strip_none = 0, Strip_bgn = 1, Strip_end = 2;
|
||||
}
|
||||
|
||||
@@ -13,24 +13,3 @@ 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.langs.kwds; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*; import gplx.core.primitives.*;
|
||||
public class Xol_kwd_parse_data_tst {
|
||||
@Before public void init() {Clear();}
|
||||
@Test public void Basic() {Key_("upright" ).Tst_strip("upright");}
|
||||
@Test public void Eq_arg() {Key_("upright" ).Tst_strip("upright=$1");}
|
||||
@Test public void Space() {Key_("upright ").Tst_strip("upright $1");}
|
||||
@Test public void Px() {Key_("px").Tst_strip("$1px");}
|
||||
|
||||
private void Clear() {
|
||||
key = null;
|
||||
}
|
||||
Xol_kwd_parse_data_tst Key_(String v) {this.key = v; return this;} private String key;
|
||||
Xol_kwd_parse_data_tst Tst_strip(String v) {
|
||||
Bry_bfr tmp = Bry_bfr_.New();
|
||||
Byte_obj_ref rslt = Byte_obj_ref.zero_();
|
||||
byte[] actl = Xol_kwd_parse_data.Strip(tmp, Bry_.new_a7(v), rslt);
|
||||
Tfds.Eq(key, String_.new_a7(actl));
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,59 +13,3 @@ 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.langs.lnki_trails; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*;
|
||||
public class Xol_lnki_trail_mgr implements Gfo_invk {
|
||||
public Xol_lnki_trail_mgr(Xol_lang_itm lang) {}
|
||||
public void Clear() {trie.Clear();}
|
||||
public int Count() {return trie.Count();}
|
||||
public Btrie_slim_mgr Trie() {return trie;} private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs();
|
||||
public void Add(byte[] v) {trie.Add_obj(v, v);}
|
||||
public void Del(byte[] v) {trie.Del(v);}
|
||||
private void Add(String... ary) {
|
||||
for (String itm_str : ary) {
|
||||
byte[] itm = Bry_.new_u8(itm_str);
|
||||
trie.Add_obj(itm, itm);
|
||||
}
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_add_range)) Add_range(m);
|
||||
else if (ctx.Match(k, Invk_add_many)) Add_many(m);
|
||||
else if (ctx.Match(k, Invk_add_bulk)) Add_bulk(m);
|
||||
else if (ctx.Match(k, Invk_clear)) Clear();
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_add_many = "add_many", Invk_add_range = "add_range", Invk_add_bulk = "add_bulk", Invk_clear = "clear";
|
||||
private void Add_bulk(GfoMsg m) {byte[] src = m.ReadBry("bulk"); Add_bulk(src);}
|
||||
public void Add_bulk(byte[] src) {
|
||||
int pos = 0, src_len = src.length;
|
||||
while (true) {
|
||||
byte[] itm = gplx.core.intls.Utf8_.Get_char_at_pos_as_bry(src, pos);
|
||||
Add(itm);
|
||||
pos += itm.length;
|
||||
if (pos >= src_len) break;
|
||||
}
|
||||
}
|
||||
private void Add_many(GfoMsg m) {
|
||||
int len = m.Args_count();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Keyval kv = m.Args_getAt(i);
|
||||
Add(kv.Val_to_str_or_empty());
|
||||
}
|
||||
}
|
||||
private void Add_range(GfoMsg m) {
|
||||
byte bgn = Add_rng_extract(m, "bgn");
|
||||
byte end = Add_rng_extract(m, "end");
|
||||
for (byte i = bgn; i <= end; i++)
|
||||
Add(new byte[] {i});
|
||||
}
|
||||
public void Add_range(byte bgn, byte end) {
|
||||
for (byte i = bgn; i <= end; i++)
|
||||
Add(new byte[] {i});
|
||||
}
|
||||
byte Add_rng_extract(GfoMsg m, String key) {
|
||||
byte[] bry = m.ReadBry(key);
|
||||
if (bry.length != 1) throw Err_.new_wo_type("argument must be ascii character", "key", key, "bry", String_.new_u8(bry));
|
||||
return bry[0];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,29 +13,3 @@ 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.langs.lnki_trails; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xol_lnki_trail_mgr_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xol_lnki_trail_mgr_fxt fxt = new Xol_lnki_trail_mgr_fxt();
|
||||
@Test public void Add_bulk() {
|
||||
fxt.Test_add_bulk("äöüß", "ä", "ö", "ü", "ß");
|
||||
}
|
||||
}
|
||||
class Xol_lnki_trail_mgr_fxt {
|
||||
Xol_lang_itm lang; Xol_lnki_trail_mgr lnki_trail_mgr;
|
||||
public void Clear() {
|
||||
Xoae_app app = Xoa_app_fxt.Make__app__edit();
|
||||
lang = new Xol_lang_itm(app.Lang_mgr(), Bry_.new_a7("fr"));
|
||||
lnki_trail_mgr = lang.Lnki_trail_mgr();
|
||||
}
|
||||
public void Test_add_bulk(String raw, String... expd_ary) {
|
||||
lnki_trail_mgr.Add_bulk(Bry_.new_u8(raw));
|
||||
int expd_len = expd_ary.length;
|
||||
Tfds.Eq(expd_len, lang.Lnki_trail_mgr().Count());
|
||||
for (int i = 0; i < expd_len; i++) {
|
||||
byte[] expd_bry = Bry_.new_u8(expd_ary[i]);
|
||||
byte[] actl_bry = (byte[])lnki_trail_mgr.Trie().Match_bgn(expd_bry, 0, expd_bry.length);
|
||||
Tfds.Eq_bry(expd_bry, actl_bry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,34 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.brys.fmtrs.*;
|
||||
public class Xol_msg_itm {
|
||||
public Xol_msg_itm(int id, byte[] key) {this.id = id; this.key = key;}
|
||||
public int Id() {return id;} private final int id;
|
||||
public byte[] Key() {return key;} private final byte[] key;
|
||||
public byte[] Val() {return val;} private byte[] val;
|
||||
public int Defined_in() {return defined_in;} private int defined_in;
|
||||
public boolean Defined_in_none() {return defined_in == Defined_in__none;}
|
||||
public boolean Has_fmt_arg() {return has_fmt_arg;} private boolean has_fmt_arg;
|
||||
public boolean Has_tmpl_txt() {return has_tmpl_txt;} private boolean has_tmpl_txt;
|
||||
public boolean Dirty() {return dirty;} private boolean dirty; // BLDR:
|
||||
|
||||
public Xol_msg_itm Defined_in_(int v) {defined_in = v; return this;}
|
||||
public Xol_msg_itm Dirty_(boolean v) {dirty = v; return this;}
|
||||
|
||||
public void Atrs_set(byte[] val, boolean has_fmt_arg, boolean has_tmpl_txt) {
|
||||
this.val = val; this.has_fmt_arg = has_fmt_arg; this.has_tmpl_txt = has_tmpl_txt;
|
||||
}
|
||||
public byte[] Fmt(Bry_bfr bfr, Bry_fmtr fmtr, Object... args) {
|
||||
fmtr.Fmt_(val);
|
||||
fmtr.Bld_bfr_many(bfr, args);
|
||||
return bfr.To_bry_and_clear();
|
||||
}
|
||||
public byte[] Fmt_tmp(Bry_bfr bfr, Bry_fmtr fmtr, byte[] tmp_val, Object... args) {
|
||||
fmtr.Fmt_(tmp_val);
|
||||
fmtr.Bld_bfr_many(bfr, args);
|
||||
return bfr.To_bry_and_clear();
|
||||
}
|
||||
public static final int Defined_in__unknown = 0, Defined_in__lang = 1, Defined_in__wiki = 2, Defined_in__none = 3; // NOTE: unknown not manually used, but is different than none (which means missing?)
|
||||
}
|
||||
|
||||
@@ -13,512 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*; import gplx.core.brys.fmtrs.*; import gplx.xowa.parsers.tmpls.*;
|
||||
public class Xol_msg_itm_ {
|
||||
public static final int
|
||||
Id_dte_dow_name_sunday = 0
|
||||
, Id_dte_dow_name_monday = 1
|
||||
, Id_dte_dow_name_tuesday = 2
|
||||
, Id_dte_dow_name_wednesday = 3
|
||||
, Id_dte_dow_name_thursday = 4
|
||||
, Id_dte_dow_name_friday = 5
|
||||
, Id_dte_dow_name_saturday = 6
|
||||
, Id_dte_dow_abrv_sun = 7
|
||||
, Id_dte_dow_abrv_mon = 8
|
||||
, Id_dte_dow_abrv_tue = 9
|
||||
, Id_dte_dow_abrv_wed = 10
|
||||
, Id_dte_dow_abrv_thu = 11
|
||||
, Id_dte_dow_abrv_fri = 12
|
||||
, Id_dte_dow_abrv_sat = 13
|
||||
, Id_dte_month_name_january = 14
|
||||
, Id_dte_month_name_february = 15
|
||||
, Id_dte_month_name_march = 16
|
||||
, Id_dte_month_name_april = 17
|
||||
, Id_dte_month_name_may = 18
|
||||
, Id_dte_month_name_june = 19
|
||||
, Id_dte_month_name_july = 20
|
||||
, Id_dte_month_name_august = 21
|
||||
, Id_dte_month_name_september = 22
|
||||
, Id_dte_month_name_october = 23
|
||||
, Id_dte_month_name_november = 24
|
||||
, Id_dte_month_name_december = 25
|
||||
, Id_dte_month_gen_january = 26
|
||||
, Id_dte_month_gen_february = 27
|
||||
, Id_dte_month_gen_march = 28
|
||||
, Id_dte_month_gen_april = 29
|
||||
, Id_dte_month_gen_may = 30
|
||||
, Id_dte_month_gen_june = 31
|
||||
, Id_dte_month_gen_july = 32
|
||||
, Id_dte_month_gen_august = 33
|
||||
, Id_dte_month_gen_september = 34
|
||||
, Id_dte_month_gen_october = 35
|
||||
, Id_dte_month_gen_november = 36
|
||||
, Id_dte_month_gen_december = 37
|
||||
, Id_dte_month_abrv_jan = 38
|
||||
, Id_dte_month_abrv_feb = 39
|
||||
, Id_dte_month_abrv_mar = 40
|
||||
, Id_dte_month_abrv_apr = 41
|
||||
, Id_dte_month_abrv_may = 42
|
||||
, Id_dte_month_abrv_jun = 43
|
||||
, Id_dte_month_abrv_jul = 44
|
||||
, Id_dte_month_abrv_aug = 45
|
||||
, Id_dte_month_abrv_sep = 46
|
||||
, Id_dte_month_abrv_oct = 47
|
||||
, Id_dte_month_abrv_nov = 48
|
||||
, Id_dte_month_abrv_dec = 49
|
||||
, Id_pfunc_desc = 50
|
||||
, Id_pfunc_time_error = 51
|
||||
, Id_pfunc_time_too_long = 52
|
||||
, Id_pfunc_rel2abs_invalid_depth = 53
|
||||
, Id_pfunc_expr_stack_exhausted = 54
|
||||
, Id_pfunc_expr_unexpected_number = 55
|
||||
, Id_pfunc_expr_preg_match_failure = 56
|
||||
, Id_pfunc_expr_unrecognised_word = 57
|
||||
, Id_pfunc_expr_unexpected_operator = 58
|
||||
, Id_pfunc_expr_missing_operand = 59
|
||||
, Id_pfunc_expr_unexpected_closing_bracket = 60
|
||||
, Id_pfunc_expr_unrecognised_punctuation = 61
|
||||
, Id_pfunc_expr_unclosed_bracket = 62
|
||||
, Id_pfunc_expr_division_by_zero = 63
|
||||
, Id_pfunc_expr_invalid_argument = 64
|
||||
, Id_pfunc_expr_invalid_argument_ln = 65
|
||||
, Id_pfunc_expr_unknown_error = 66
|
||||
, Id_pfunc_expr_not_a_number = 67
|
||||
, Id_pfunc_string_too_long = 68
|
||||
, Id_pfunc_convert_dimensionmismatch = 69
|
||||
, Id_pfunc_convert_unknownunit = 70
|
||||
, Id_pfunc_convert_unknowndimension = 71
|
||||
, Id_pfunc_convert_invalidcompoundunit = 72
|
||||
, Id_pfunc_convert_nounit = 73
|
||||
, Id_pfunc_convert_doublecompoundunit = 74
|
||||
, Id_toc = 75
|
||||
, Id_redirectedfrom = 76
|
||||
, Id_sp_allpages_hdr = 77
|
||||
, Id_sp_allpages_bwd = 78
|
||||
, Id_sp_allpages_fwd = 79
|
||||
, Id_js_tables_collapsible_collapse = 80
|
||||
, Id_js_tables_collapsible_expand = 81
|
||||
, Id_js_tables_sort_descending = 82
|
||||
, Id_js_tables_sort_ascending = 83
|
||||
, Id_ctg_tbl_hdr = 84
|
||||
, Id_portal_lastmodified = 85
|
||||
, Id_file_enlarge = 86
|
||||
, Id_xowa_portal_exit_text = 87
|
||||
, Id_xowa_portal_exit_tooltip = 88
|
||||
, Id_xowa_portal_exit_accesskey = 89
|
||||
, Id_xowa_portal_view_html_text = 90
|
||||
, Id_xowa_portal_view_html_tooltip = 91
|
||||
, Id_xowa_portal_view_html_accesskey = 92
|
||||
, Id_xowa_portal_bookmarks_text = 93
|
||||
, Id_xowa_portal_bookmarks_add_text = 94
|
||||
, Id_xowa_portal_bookmarks_add_tooltip = 95
|
||||
, Id_xowa_portal_bookmarks_add_accesskey = 96
|
||||
, Id_xowa_portal_bookmarks_show_text = 97
|
||||
, Id_xowa_portal_bookmarks_show_tooltip = 98
|
||||
, Id_xowa_portal_bookmarks_show_accesskey = 99
|
||||
, Id_xowa_portal_page_history_text = 100
|
||||
, Id_xowa_portal_page_history_tooltip = 101
|
||||
, Id_xowa_portal_page_history_accesskey = 102
|
||||
, Id_xowa_portal_options_text = 103
|
||||
, Id_xowa_portal_options_tooltip = 104
|
||||
, Id_xowa_portal_options_accesskey = 105
|
||||
, Id_xowa_portal_version_text = 106
|
||||
, Id_xowa_portal_build_time_text = 107
|
||||
, Id_page_lang_header = 108
|
||||
, Id_xowa_window_go_bwd_btn_tooltip = 109
|
||||
, Id_xowa_window_go_fwd_btn_tooltip = 110
|
||||
, Id_xowa_window_url_box_tooltip = 111
|
||||
, Id_xowa_window_url_btn_tooltip = 112
|
||||
, Id_xowa_window_search_box_tooltip = 113
|
||||
, Id_xowa_window_search_btn_tooltip = 114
|
||||
, Id_xowa_window_find_close_btn_tooltip = 115
|
||||
, Id_xowa_window_find_box_tooltip = 116
|
||||
, Id_xowa_window_find_fwd_btn_tooltip = 117
|
||||
, Id_xowa_window_find_bwd_btn_tooltip = 118
|
||||
, Id_xowa_window_prog_box_tooltip = 119
|
||||
, Id_xowa_window_info_box_tooltip = 120
|
||||
, Id_scribunto_parser_error = 121
|
||||
, Id_ns_blankns = 122
|
||||
, Id_ctg_page_label = 123
|
||||
, Id_ctg_page_header = 124
|
||||
, Id_ctg_subc_header = 125
|
||||
, Id_ctg_file_header = 126
|
||||
, Id_ctg_empty = 127
|
||||
, Id_ctg_subc_count = 128
|
||||
, Id_ctg_subc_count_limit = 129
|
||||
, Id_ctg_page_count = 130
|
||||
, Id_ctg_page_count_limit = 131
|
||||
, Id_ctg_file_count = 132
|
||||
, Id_ctg_file_count_limit = 133
|
||||
, Id_ctgtree_subc_counts = 134
|
||||
, Id_ctgtree_subc_counts_ctg = 135
|
||||
, Id_ctgtree_subc_counts_page = 136
|
||||
, Id_ctgtree_subc_counts_file = 137
|
||||
, Id_next_results = 138
|
||||
, Id_prev_results = 139
|
||||
, Id_list_continues = 140
|
||||
, Id_xowa_wikidata_languages = 141
|
||||
, Id_xowa_wikidata_labels = 142
|
||||
, Id_xowa_wikidata_aliasesHead = 143
|
||||
, Id_xowa_wikidata_descriptions = 144
|
||||
, Id_xowa_wikidata_links = 145
|
||||
, Id_xowa_wikidata_claims = 146
|
||||
, Id_xowa_wikidata_json = 147
|
||||
, Id_xowa_wikidata_language = 148
|
||||
, Id_xowa_wikidata_wiki = 149
|
||||
, Id_xowa_wikidata_label = 150
|
||||
, Id_xowa_wikidata_aliases = 151
|
||||
, Id_xowa_wikidata_description = 152
|
||||
, Id_xowa_wikidata_link = 153
|
||||
, Id_xowa_wikidata_property = 154
|
||||
, Id_xowa_wikidata_value = 155
|
||||
, Id_xowa_wikidata_references = 156
|
||||
, Id_xowa_wikidata_qualifiers = 157
|
||||
, Id_search_results_header = 158
|
||||
, Id_edit_toolbar_bold_sample = 159
|
||||
, Id_edit_toolbar_bold_tip = 160
|
||||
, Id_edit_toolbar_italic_sample = 161
|
||||
, Id_edit_toolbar_italic_tip = 162
|
||||
, Id_edit_toolbar_link_sample = 163
|
||||
, Id_edit_toolbar_link_tip = 164
|
||||
, Id_edit_toolbar_headline_sample = 165
|
||||
, Id_edit_toolbar_headline_tip = 166
|
||||
, Id_edit_toolbar_ulist_tip = 167
|
||||
, Id_edit_toolbar_ulist_sample = 168
|
||||
, Id_edit_toolbar_olist_tip = 169
|
||||
, Id_edit_toolbar_olist_sample = 170
|
||||
, Id_xowa_portal_about_text = 171
|
||||
, Id_xowa_portal_about_tooltip = 172
|
||||
, Id_xowa_portal_about_accesskey = 173
|
||||
, Id_symbol_catseparator = 174
|
||||
, Id_symbol_semicolon_separator = 175
|
||||
, Id_symbol_comma_separator = 176
|
||||
, Id_symbol_colon_separator = 177
|
||||
, Id_symbol_autocomment_prefix = 178
|
||||
, Id_symbol_pipe_separator = 179
|
||||
, Id_symbol_word_separator = 180
|
||||
, Id_symbol_ellipsis = 181
|
||||
, Id_symbol_percent = 182
|
||||
, Id_symbol_parentheses = 183
|
||||
, Id_duration_ago = 184
|
||||
, Id_xowa_wikidata_novalue = 185
|
||||
, Id_xowa_wikidata_somevalue = 186
|
||||
, Id_xowa_wikidata_links_wiki = 187
|
||||
, Id_xowa_wikidata_links_wiktionary = 188
|
||||
, Id_xowa_wikidata_links_wikisource = 189
|
||||
, Id_xowa_wikidata_links_wikivoyage = 190
|
||||
, Id_xowa_wikidata_links_wikiquote = 191
|
||||
, Id_xowa_wikidata_links_wikibooks = 192
|
||||
, Id_xowa_wikidata_links_wikiversity = 193
|
||||
, Id_xowa_wikidata_links_wikinews = 194
|
||||
, Id_xowa_wikidata_plus = 195
|
||||
, Id_xowa_wikidata_minus = 196
|
||||
, Id_xowa_wikidata_plusminus = 197
|
||||
, Id_xowa_wikidata_degree = 198
|
||||
, Id_xowa_wikidata_minute = 199
|
||||
, Id_xowa_wikidata_second = 200
|
||||
, Id_xowa_wikidata_north = 201
|
||||
, Id_xowa_wikidata_south = 202
|
||||
, Id_xowa_wikidata_west = 203
|
||||
, Id_xowa_wikidata_east = 204
|
||||
, Id_xowa_wikidata_meters = 205
|
||||
, Id_xowa_wikidata_julian = 206
|
||||
, Id_xowa_wikidata_year = 207
|
||||
, Id_xowa_wikidata_decade = 208
|
||||
, Id_xowa_wikidata_century = 209
|
||||
, Id_xowa_wikidata_millenium = 210
|
||||
, Id_xowa_wikidata_years1e4 = 211
|
||||
, Id_xowa_wikidata_years1e5 = 212
|
||||
, Id_xowa_wikidata_years1e6 = 213
|
||||
, Id_xowa_wikidata_years1e7 = 214
|
||||
, Id_xowa_wikidata_years1e8 = 215
|
||||
, Id_xowa_wikidata_years1e9 = 216
|
||||
, Id_xowa_wikidata_bc = 217
|
||||
, Id_xowa_wikidata_inTime = 218
|
||||
, Id_ctg_tbl_hidden = 219
|
||||
, Id_ctg_help_page = 220
|
||||
, Id_statistics_title = 221
|
||||
, Id_statistics_header_pages = 222
|
||||
, Id_statistics_articles = 223
|
||||
, Id_statistics_pages = 224
|
||||
, Id_statistics_pages_desc = 225
|
||||
, Id_statistics_header_ns = 226
|
||||
, Id_wikibase_diffview_rank = 227
|
||||
, Id_xowa_wikidata_deprecated = 228
|
||||
, Id_xowa_wikidata_normal = 229
|
||||
, Id_xowa_wikidata_preferred = 230
|
||||
, Id_xowa_wikidata_links_special = 231
|
||||
, Id_xowa_window_allpages_box_tooltip = 232
|
||||
, Id_xowa_window_allpages_btn_tooltip = 233
|
||||
;
|
||||
public static final int Id__max = 234;
|
||||
public static Xol_msg_itm new_(int id, String key, String val) {return new_(id, Bry_.new_u8(key), Bry_.new_u8(val));}
|
||||
public static Xol_msg_itm new_(int id, byte[] key, byte[] val) {
|
||||
Xol_msg_itm rv = new Xol_msg_itm(id, key);
|
||||
update_val_(rv, val);
|
||||
return rv;
|
||||
}
|
||||
private static final Bry_fmtr tmp_fmtr = Bry_fmtr.New__tmp().Fail_when_invalid_escapes_(false);
|
||||
private static final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
||||
public static void update_val_(Xol_msg_itm itm, byte[] val) {
|
||||
synchronized (tmp_fmtr) { // LOCK:static-objs; DATE:2016-07-07
|
||||
boolean has_fmt_arg = tmp_fmtr.Fmt_(val).Compile().Fmt_args_exist();
|
||||
boolean has_tmpl_txt = Bry_find_.Find_fwd(val, Xop_curly_bgn_lxr.Hook, 0) != -1;
|
||||
val = trie_space.Replace(tmp_bfr, val, 0, val.length);
|
||||
itm.Atrs_set(val, has_fmt_arg, has_tmpl_txt);
|
||||
}
|
||||
}
|
||||
public static final byte[] Bry_nbsp = Byte_.Ary_by_ints(194, 160);
|
||||
private static final Btrie_slim_mgr trie_space = Btrie_slim_mgr.cs() // MW:cache/MessageCache.php|get|Fix for trailing whitespace, removed by textarea|DATE:2014-04-29
|
||||
.Add_bry(" " , " ")
|
||||
.Add_bry(" " , Bry_nbsp)
|
||||
.Add_bry(" " , Bry_nbsp)
|
||||
;
|
||||
public static Xol_msg_itm new_(int id) {
|
||||
switch (id) {
|
||||
case Xol_msg_itm_.Id_dte_dow_name_sunday: return new_(Xol_msg_itm_.Id_dte_dow_name_sunday, "sunday", "Sunday");
|
||||
case Xol_msg_itm_.Id_dte_dow_name_monday: return new_(Xol_msg_itm_.Id_dte_dow_name_monday, "monday", "Monday");
|
||||
case Xol_msg_itm_.Id_dte_dow_name_tuesday: return new_(Xol_msg_itm_.Id_dte_dow_name_tuesday, "tuesday", "Tuesday");
|
||||
case Xol_msg_itm_.Id_dte_dow_name_wednesday: return new_(Xol_msg_itm_.Id_dte_dow_name_wednesday, "wednesday", "Wednesday");
|
||||
case Xol_msg_itm_.Id_dte_dow_name_thursday: return new_(Xol_msg_itm_.Id_dte_dow_name_thursday, "thursday", "Thursday");
|
||||
case Xol_msg_itm_.Id_dte_dow_name_friday: return new_(Xol_msg_itm_.Id_dte_dow_name_friday, "friday", "Friday");
|
||||
case Xol_msg_itm_.Id_dte_dow_name_saturday: return new_(Xol_msg_itm_.Id_dte_dow_name_saturday, "saturday", "Saturday");
|
||||
case Xol_msg_itm_.Id_dte_dow_abrv_sun: return new_(Xol_msg_itm_.Id_dte_dow_abrv_sun, "sun", "Sun");
|
||||
case Xol_msg_itm_.Id_dte_dow_abrv_mon: return new_(Xol_msg_itm_.Id_dte_dow_abrv_mon, "mon", "Mon");
|
||||
case Xol_msg_itm_.Id_dte_dow_abrv_tue: return new_(Xol_msg_itm_.Id_dte_dow_abrv_tue, "tue", "Tue");
|
||||
case Xol_msg_itm_.Id_dte_dow_abrv_wed: return new_(Xol_msg_itm_.Id_dte_dow_abrv_wed, "wed", "Wed");
|
||||
case Xol_msg_itm_.Id_dte_dow_abrv_thu: return new_(Xol_msg_itm_.Id_dte_dow_abrv_thu, "thu", "Thu");
|
||||
case Xol_msg_itm_.Id_dte_dow_abrv_fri: return new_(Xol_msg_itm_.Id_dte_dow_abrv_fri, "fri", "Fri");
|
||||
case Xol_msg_itm_.Id_dte_dow_abrv_sat: return new_(Xol_msg_itm_.Id_dte_dow_abrv_sat, "sat", "Sat");
|
||||
case Xol_msg_itm_.Id_dte_month_name_january: return new_(Xol_msg_itm_.Id_dte_month_name_january, "january", "January");
|
||||
case Xol_msg_itm_.Id_dte_month_name_february: return new_(Xol_msg_itm_.Id_dte_month_name_february, "february", "February");
|
||||
case Xol_msg_itm_.Id_dte_month_name_march: return new_(Xol_msg_itm_.Id_dte_month_name_march, "march", "March");
|
||||
case Xol_msg_itm_.Id_dte_month_name_april: return new_(Xol_msg_itm_.Id_dte_month_name_april, "april", "April");
|
||||
case Xol_msg_itm_.Id_dte_month_name_may: return new_(Xol_msg_itm_.Id_dte_month_name_may, "may_long", "May");
|
||||
case Xol_msg_itm_.Id_dte_month_name_june: return new_(Xol_msg_itm_.Id_dte_month_name_june, "june", "June");
|
||||
case Xol_msg_itm_.Id_dte_month_name_july: return new_(Xol_msg_itm_.Id_dte_month_name_july, "july", "July");
|
||||
case Xol_msg_itm_.Id_dte_month_name_august: return new_(Xol_msg_itm_.Id_dte_month_name_august, "august", "August");
|
||||
case Xol_msg_itm_.Id_dte_month_name_september: return new_(Xol_msg_itm_.Id_dte_month_name_september, "september", "September");
|
||||
case Xol_msg_itm_.Id_dte_month_name_october: return new_(Xol_msg_itm_.Id_dte_month_name_october, "october", "October");
|
||||
case Xol_msg_itm_.Id_dte_month_name_november: return new_(Xol_msg_itm_.Id_dte_month_name_november, "november", "November");
|
||||
case Xol_msg_itm_.Id_dte_month_name_december: return new_(Xol_msg_itm_.Id_dte_month_name_december, "december", "December");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_january: return new_(Xol_msg_itm_.Id_dte_month_gen_january, "january-gen", "January");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_february: return new_(Xol_msg_itm_.Id_dte_month_gen_february, "february-gen", "February");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_march: return new_(Xol_msg_itm_.Id_dte_month_gen_march, "march-gen", "March");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_april: return new_(Xol_msg_itm_.Id_dte_month_gen_april, "april-gen", "April");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_may: return new_(Xol_msg_itm_.Id_dte_month_gen_may, "may-gen", "May");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_june: return new_(Xol_msg_itm_.Id_dte_month_gen_june, "june-gen", "June");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_july: return new_(Xol_msg_itm_.Id_dte_month_gen_july, "july-gen", "July");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_august: return new_(Xol_msg_itm_.Id_dte_month_gen_august, "august-gen", "August");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_september: return new_(Xol_msg_itm_.Id_dte_month_gen_september, "september-gen", "September");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_october: return new_(Xol_msg_itm_.Id_dte_month_gen_october, "october-gen", "October");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_november: return new_(Xol_msg_itm_.Id_dte_month_gen_november, "november-gen", "November");
|
||||
case Xol_msg_itm_.Id_dte_month_gen_december: return new_(Xol_msg_itm_.Id_dte_month_gen_december, "december-gen", "December");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_jan: return new_(Xol_msg_itm_.Id_dte_month_abrv_jan, "jan", "Jan");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_feb: return new_(Xol_msg_itm_.Id_dte_month_abrv_feb, "feb", "Feb");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_mar: return new_(Xol_msg_itm_.Id_dte_month_abrv_mar, "mar", "Mar");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_apr: return new_(Xol_msg_itm_.Id_dte_month_abrv_apr, "apr", "Apr");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_may: return new_(Xol_msg_itm_.Id_dte_month_abrv_may, "may", "May");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_jun: return new_(Xol_msg_itm_.Id_dte_month_abrv_jun, "jun", "Jun");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_jul: return new_(Xol_msg_itm_.Id_dte_month_abrv_jul, "jul", "Jul");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_aug: return new_(Xol_msg_itm_.Id_dte_month_abrv_aug, "aug", "Aug");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_sep: return new_(Xol_msg_itm_.Id_dte_month_abrv_sep, "sep", "Sep");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_oct: return new_(Xol_msg_itm_.Id_dte_month_abrv_oct, "oct", "Oct");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_nov: return new_(Xol_msg_itm_.Id_dte_month_abrv_nov, "nov", "Nov");
|
||||
case Xol_msg_itm_.Id_dte_month_abrv_dec: return new_(Xol_msg_itm_.Id_dte_month_abrv_dec, "dec", "Dec");
|
||||
case Xol_msg_itm_.Id_pfunc_desc: return new_(Xol_msg_itm_.Id_pfunc_desc, "pfunc_desc", "Enhance parser with logical functions");
|
||||
case Xol_msg_itm_.Id_pfunc_time_error: return new_(Xol_msg_itm_.Id_pfunc_time_error, "pfunc_time_error", "Error: invalid time");
|
||||
case Xol_msg_itm_.Id_pfunc_time_too_long: return new_(Xol_msg_itm_.Id_pfunc_time_too_long, "pfunc_time_too_long", "Error: too many #time calls");
|
||||
case Xol_msg_itm_.Id_pfunc_rel2abs_invalid_depth: return new_(Xol_msg_itm_.Id_pfunc_rel2abs_invalid_depth, "pfunc_rel2abs_invalid_depth", "Error: Invalid depth in path: \"~{0}\" (tried to access a node above the root node)");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_stack_exhausted: return new_(Xol_msg_itm_.Id_pfunc_expr_stack_exhausted, "pfunc_expr_stack_exhausted", "Expression error: Stack exhausted");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_unexpected_number: return new_(Xol_msg_itm_.Id_pfunc_expr_unexpected_number, "pfunc_expr_unexpected_number", "Expression error: Unexpected number");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_preg_match_failure: return new_(Xol_msg_itm_.Id_pfunc_expr_preg_match_failure, "pfunc_expr_preg_match_failure", "Expression error: Unexpected preg_match failure");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_unrecognised_word: return new_(Xol_msg_itm_.Id_pfunc_expr_unrecognised_word, "pfunc_expr_unrecognised_word", "Expression error: Unrecognised word \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_unexpected_operator: return new_(Xol_msg_itm_.Id_pfunc_expr_unexpected_operator, "pfunc_expr_unexpected_operator", "Expression error: Unexpected ~{0} operator");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_missing_operand: return new_(Xol_msg_itm_.Id_pfunc_expr_missing_operand, "pfunc_expr_missing_operand", "Expression error: Missing operand for ~{0}");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_unexpected_closing_bracket: return new_(Xol_msg_itm_.Id_pfunc_expr_unexpected_closing_bracket, "pfunc_expr_unexpected_closing_bracket", "Expression error: Unexpected closing bracket");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_unrecognised_punctuation: return new_(Xol_msg_itm_.Id_pfunc_expr_unrecognised_punctuation, "pfunc_expr_unrecognised_punctuation", "Expression error: Unrecognised punctuation character \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_unclosed_bracket: return new_(Xol_msg_itm_.Id_pfunc_expr_unclosed_bracket, "pfunc_expr_unclosed_bracket", "Expression error: Unclosed bracket");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_division_by_zero: return new_(Xol_msg_itm_.Id_pfunc_expr_division_by_zero, "pfunc_expr_division_by_zero", "Division by zero");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_invalid_argument: return new_(Xol_msg_itm_.Id_pfunc_expr_invalid_argument, "pfunc_expr_invalid_argument", "Invalid argument for ~{0}: < -1 or > 1");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_invalid_argument_ln: return new_(Xol_msg_itm_.Id_pfunc_expr_invalid_argument_ln, "pfunc_expr_invalid_argument_ln", "Invalid argument for ln: <= 0");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_unknown_error: return new_(Xol_msg_itm_.Id_pfunc_expr_unknown_error, "pfunc_expr_unknown_error", "Expression error: Unknown error (~{0})");
|
||||
case Xol_msg_itm_.Id_pfunc_expr_not_a_number: return new_(Xol_msg_itm_.Id_pfunc_expr_not_a_number, "pfunc_expr_not_a_number", "In ~{0}: result is not a number");
|
||||
case Xol_msg_itm_.Id_pfunc_string_too_long: return new_(Xol_msg_itm_.Id_pfunc_string_too_long, "pfunc_string_too_long", "Error: String exceeds ~{0} character limit");
|
||||
case Xol_msg_itm_.Id_pfunc_convert_dimensionmismatch: return new_(Xol_msg_itm_.Id_pfunc_convert_dimensionmismatch, "pfunc-convert-dimensionmismatch", "Error: cannot convert between units of \"~{0}\" and \"~{1}\"");
|
||||
case Xol_msg_itm_.Id_pfunc_convert_unknownunit: return new_(Xol_msg_itm_.Id_pfunc_convert_unknownunit, "pfunc-convert-unknownunit", "Error: unknown unit \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_pfunc_convert_unknowndimension: return new_(Xol_msg_itm_.Id_pfunc_convert_unknowndimension, "pfunc-convert-unknowndimension", "Error: unknown dimension \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_pfunc_convert_invalidcompoundunit: return new_(Xol_msg_itm_.Id_pfunc_convert_invalidcompoundunit, "pfunc-convert-invalidcompoundunit", "Error: invalid compound unit \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_pfunc_convert_nounit: return new_(Xol_msg_itm_.Id_pfunc_convert_nounit, "pfunc-convert-nounit", "Error: no source unit given");
|
||||
case Xol_msg_itm_.Id_pfunc_convert_doublecompoundunit: return new_(Xol_msg_itm_.Id_pfunc_convert_doublecompoundunit, "pfunc-convert-doublecompoundunit", "Error: cannot parse double compound units like \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_toc: return new_(Xol_msg_itm_.Id_toc, "toc", "Contents");
|
||||
case Xol_msg_itm_.Id_redirectedfrom: return new_(Xol_msg_itm_.Id_redirectedfrom, "redirectedfrom", "(Redirected from ~{0})");
|
||||
case Xol_msg_itm_.Id_sp_allpages_hdr: return new_(Xol_msg_itm_.Id_sp_allpages_hdr, "allpages", "All pages");
|
||||
case Xol_msg_itm_.Id_sp_allpages_bwd: return new_(Xol_msg_itm_.Id_sp_allpages_bwd, "prevpage", "Previous page (~{0})");
|
||||
case Xol_msg_itm_.Id_sp_allpages_fwd: return new_(Xol_msg_itm_.Id_sp_allpages_fwd, "nextpage", "Next page (~{0})");
|
||||
case Xol_msg_itm_.Id_js_tables_collapsible_collapse: return new_(Xol_msg_itm_.Id_js_tables_collapsible_collapse, "collapsible-collapse", "Collapse");
|
||||
case Xol_msg_itm_.Id_js_tables_collapsible_expand: return new_(Xol_msg_itm_.Id_js_tables_collapsible_expand, "collapsible-expand", "Expand");
|
||||
case Xol_msg_itm_.Id_js_tables_sort_descending: return new_(Xol_msg_itm_.Id_js_tables_sort_descending, "sort-descending", "Sort descending");
|
||||
case Xol_msg_itm_.Id_js_tables_sort_ascending: return new_(Xol_msg_itm_.Id_js_tables_sort_ascending, "sort-ascending", "Sort ascending");
|
||||
case Xol_msg_itm_.Id_ctg_tbl_hdr: return new_(Xol_msg_itm_.Id_ctg_tbl_hdr, "categories", "Categories");
|
||||
case Xol_msg_itm_.Id_portal_lastmodified: return new_(Xol_msg_itm_.Id_portal_lastmodified, "lastmodifiedat", "This page was last modified on ~{0}, at ~{1}.");
|
||||
case Xol_msg_itm_.Id_file_enlarge: return new_(Xol_msg_itm_.Id_file_enlarge, "thumbnail-more", "Enlarge");
|
||||
case Xol_msg_itm_.Id_xowa_portal_exit_text: return new_(Xol_msg_itm_.Id_xowa_portal_exit_text, "xowa-portal-exit", "Exit");
|
||||
case Xol_msg_itm_.Id_xowa_portal_exit_tooltip: return new_(Xol_msg_itm_.Id_xowa_portal_exit_tooltip, "tooltip-xowa-portal-exit", "Exit XOWA");
|
||||
case Xol_msg_itm_.Id_xowa_portal_exit_accesskey: return new_(Xol_msg_itm_.Id_xowa_portal_exit_accesskey, "accesskey-xowa-portal-exit", "");
|
||||
case Xol_msg_itm_.Id_xowa_portal_view_html_text: return new_(Xol_msg_itm_.Id_xowa_portal_view_html_text, "xowa-portal-view_html", "View HTML");
|
||||
case Xol_msg_itm_.Id_xowa_portal_view_html_tooltip: return new_(Xol_msg_itm_.Id_xowa_portal_view_html_tooltip, "tooltip-xowa-portal-view_html", "View HTML source for this page");
|
||||
case Xol_msg_itm_.Id_xowa_portal_view_html_accesskey: return new_(Xol_msg_itm_.Id_xowa_portal_view_html_accesskey, "accesskey-xowa-portal-view_html", "h");
|
||||
case Xol_msg_itm_.Id_xowa_portal_bookmarks_text: return new_(Xol_msg_itm_.Id_xowa_portal_bookmarks_text, "xowa-portal-bookmarks", "Bookmarks");
|
||||
case Xol_msg_itm_.Id_xowa_portal_bookmarks_add_text: return new_(Xol_msg_itm_.Id_xowa_portal_bookmarks_add_text, "xowa-portal-bookmarks-add", "Bookmark this page");
|
||||
case Xol_msg_itm_.Id_xowa_portal_bookmarks_add_tooltip: return new_(Xol_msg_itm_.Id_xowa_portal_bookmarks_add_tooltip, "tooltip-xowa-portal-bookmarks-add", "Bookmark this page");
|
||||
case Xol_msg_itm_.Id_xowa_portal_bookmarks_add_accesskey: return new_(Xol_msg_itm_.Id_xowa_portal_bookmarks_add_accesskey, "accesskey-xowa-portal-bookmarks-add", "");
|
||||
case Xol_msg_itm_.Id_xowa_portal_bookmarks_show_text: return new_(Xol_msg_itm_.Id_xowa_portal_bookmarks_show_text, "xowa-portal-bookmarks-show", "Show all bookmarks");
|
||||
case Xol_msg_itm_.Id_xowa_portal_bookmarks_show_tooltip: return new_(Xol_msg_itm_.Id_xowa_portal_bookmarks_show_tooltip, "tooltip-xowa-portal-bookmarks-show", "Show all bookmarks");
|
||||
case Xol_msg_itm_.Id_xowa_portal_bookmarks_show_accesskey: return new_(Xol_msg_itm_.Id_xowa_portal_bookmarks_show_accesskey, "accesskey-xowa-portal-bookmarks-show", "");
|
||||
case Xol_msg_itm_.Id_xowa_portal_page_history_text: return new_(Xol_msg_itm_.Id_xowa_portal_page_history_text, "xowa-portal-page_history", "Page history");
|
||||
case Xol_msg_itm_.Id_xowa_portal_page_history_tooltip: return new_(Xol_msg_itm_.Id_xowa_portal_page_history_tooltip, "tooltip-xowa-portal-page_history", "View history of opened pages");
|
||||
case Xol_msg_itm_.Id_xowa_portal_page_history_accesskey: return new_(Xol_msg_itm_.Id_xowa_portal_page_history_accesskey, "accesskey-xowa-portal-page_history", "");
|
||||
case Xol_msg_itm_.Id_xowa_portal_options_text: return new_(Xol_msg_itm_.Id_xowa_portal_options_text, "xowa-portal-options", "Options");
|
||||
case Xol_msg_itm_.Id_xowa_portal_options_tooltip: return new_(Xol_msg_itm_.Id_xowa_portal_options_tooltip, "tooltip-xowa-portal-options", "Change XOWA options");
|
||||
case Xol_msg_itm_.Id_xowa_portal_options_accesskey: return new_(Xol_msg_itm_.Id_xowa_portal_options_accesskey, "accesskey-xowa-portal-options", "");
|
||||
case Xol_msg_itm_.Id_xowa_portal_version_text: return new_(Xol_msg_itm_.Id_xowa_portal_version_text, "xowa-portal-version", "version");
|
||||
case Xol_msg_itm_.Id_xowa_portal_build_time_text: return new_(Xol_msg_itm_.Id_xowa_portal_build_time_text, "xowa-portal-build_time", "build time");
|
||||
case Xol_msg_itm_.Id_page_lang_header: return new_(Xol_msg_itm_.Id_page_lang_header, "otherlanguages", "In other languages");
|
||||
case Xol_msg_itm_.Id_xowa_window_go_bwd_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_go_bwd_btn_tooltip, "xowa-window-go_bwd_btn-tooltip", "Go back one page");
|
||||
case Xol_msg_itm_.Id_xowa_window_go_fwd_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_go_fwd_btn_tooltip, "xowa-window-go_fwd_btn-tooltip", "Go forward one page");
|
||||
case Xol_msg_itm_.Id_xowa_window_url_box_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_url_box_tooltip, "xowa-window-url_box-tooltip", "Enter address");
|
||||
case Xol_msg_itm_.Id_xowa_window_url_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_url_btn_tooltip, "xowa-window-url_btn-tooltip", "Go to the address in the Location Bar");
|
||||
case Xol_msg_itm_.Id_xowa_window_search_box_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_search_box_tooltip, "xowa-window-search_box-tooltip", "Search using {{ns:Special}}:XowaSearch");
|
||||
case Xol_msg_itm_.Id_xowa_window_search_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_search_btn_tooltip, "xowa-window-search_btn-tooltip", "Search");
|
||||
case Xol_msg_itm_.Id_xowa_window_allpages_box_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_allpages_box_tooltip, "xowa-window-allpages_box-tooltip", "List using {{ns:Special}}:AllPages");
|
||||
case Xol_msg_itm_.Id_xowa_window_allpages_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_allpages_btn_tooltip, "xowa-window-allpages_btn-tooltip", "List all pages");
|
||||
case Xol_msg_itm_.Id_xowa_window_find_close_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_find_close_btn_tooltip, "xowa-window-find_close_btn-tooltip", "Close Find bar");
|
||||
case Xol_msg_itm_.Id_xowa_window_find_box_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_find_box_tooltip, "xowa-window-find_box-tooltip", "Enter phrase to find on this page");
|
||||
case Xol_msg_itm_.Id_xowa_window_find_fwd_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_find_fwd_btn_tooltip, "xowa-window-find_fwd_btn-tooltip", "Find the next occurrence of the phrase");
|
||||
case Xol_msg_itm_.Id_xowa_window_find_bwd_btn_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_find_bwd_btn_tooltip, "xowa-window-find_bwd_btn-tooltip", "Find the previous occurrence of the phrase");
|
||||
case Xol_msg_itm_.Id_xowa_window_prog_box_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_prog_box_tooltip, "xowa-window-prog_box-tooltip", "Displays progress messages");
|
||||
case Xol_msg_itm_.Id_xowa_window_info_box_tooltip: return new_(Xol_msg_itm_.Id_xowa_window_info_box_tooltip, "xowa-window-info_box-tooltip", "Displays system messages");
|
||||
case Xol_msg_itm_.Id_scribunto_parser_error: return new_(Xol_msg_itm_.Id_scribunto_parser_error, "scribunto-parser-error", "Script error");
|
||||
case Xol_msg_itm_.Id_ns_blankns: return new_(Xol_msg_itm_.Id_ns_blankns, "blanknamespace", "(Main)");
|
||||
case Xol_msg_itm_.Id_ctg_page_label: return new_(Xol_msg_itm_.Id_ctg_page_label, "pagecategories", "{{PLURAL:~{0}|Category|Categories}}");
|
||||
case Xol_msg_itm_.Id_ctg_page_header: return new_(Xol_msg_itm_.Id_ctg_page_header, "category_header", "Pages in category \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_ctg_subc_header: return new_(Xol_msg_itm_.Id_ctg_subc_header, "subcategories", "Subcategories");
|
||||
case Xol_msg_itm_.Id_ctg_file_header: return new_(Xol_msg_itm_.Id_ctg_file_header, "category-media-header", "Media in category \"~{0}\"");
|
||||
case Xol_msg_itm_.Id_ctg_empty: return new_(Xol_msg_itm_.Id_ctg_empty, "category-empty", "''This category currently contains no pages or media.''");
|
||||
case Xol_msg_itm_.Id_ctg_subc_count: return new_(Xol_msg_itm_.Id_ctg_subc_count, "category-subcat-count", "{{PLURAL:~{1}|This category has only the following subcategory.|This category has the following {{PLURAL:~{0}|subcategory|~{0} subcategories}}, out of ~{1} total.}}");
|
||||
case Xol_msg_itm_.Id_ctg_subc_count_limit: return new_(Xol_msg_itm_.Id_ctg_subc_count_limit, "category-subcat-count-limited", "This category has the following {{PLURAL:~{0}|subcategory|~{0} subcategories}}.");
|
||||
case Xol_msg_itm_.Id_ctg_page_count: return new_(Xol_msg_itm_.Id_ctg_page_count, "category-article-count", "{{PLURAL:~{1}|This category contains only the following page.|The following {{PLURAL:~{0}|page is|~{0} pages are}} in this category, out of ~{1} total.}}");
|
||||
case Xol_msg_itm_.Id_ctg_page_count_limit: return new_(Xol_msg_itm_.Id_ctg_page_count_limit, "category-article-count-limited", "The following {{PLURAL:~{0}|page is|~{0} pages are}} in the current category.");
|
||||
case Xol_msg_itm_.Id_ctg_file_count: return new_(Xol_msg_itm_.Id_ctg_file_count, "category-file-count", "{{PLURAL:~{1}|This category contains only the following file.|The following {{PLURAL:~{0}|file is|~{0} files are}} in this category, out of ~{1} total.}}");
|
||||
case Xol_msg_itm_.Id_ctg_file_count_limit: return new_(Xol_msg_itm_.Id_ctg_file_count_limit, "category-file-count-limited", "The following {{PLURAL:~{0}|file is|~{0} files are}} in the current category.");
|
||||
case Xol_msg_itm_.Id_ctgtree_subc_counts: return new_(Xol_msg_itm_.Id_ctgtree_subc_counts, "categorytree-member-counts", "contains {{PLURAL:~{0}|1 subcategory|~{0} subcategories}}, {{PLURAL:~{1}|1 page|~{1} pages}}, and {{PLURAL:~{2}|1 file|~{2} files}}");
|
||||
case Xol_msg_itm_.Id_ctgtree_subc_counts_ctg: return new_(Xol_msg_itm_.Id_ctgtree_subc_counts_ctg, "categorytree-num-categories", "~{0} C");
|
||||
case Xol_msg_itm_.Id_ctgtree_subc_counts_page: return new_(Xol_msg_itm_.Id_ctgtree_subc_counts_page, "categorytree-num-pages", "~{0} P");
|
||||
case Xol_msg_itm_.Id_ctgtree_subc_counts_file: return new_(Xol_msg_itm_.Id_ctgtree_subc_counts_file, "categorytree-num-files", "~{0} F");
|
||||
case Xol_msg_itm_.Id_prev_results: return new_(Xol_msg_itm_.Id_next_results, "prevn", "previous {{PLURAL:~{0}|~{0}}}");
|
||||
case Xol_msg_itm_.Id_next_results: return new_(Xol_msg_itm_.Id_prev_results, "nextn", "next {{PLURAL:~{0}|~{0}}}");
|
||||
case Xol_msg_itm_.Id_list_continues: return new_(Xol_msg_itm_.Id_list_continues, "listingcontinuesabbrev", "cont.");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_languages: return new_(Xol_msg_itm_.Id_xowa_wikidata_languages, "xowa-wikidata-languages", "en");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_labels: return new_(Xol_msg_itm_.Id_xowa_wikidata_labels, "xowa-wikidata-labels", "Labels");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_aliasesHead: return new_(Xol_msg_itm_.Id_xowa_wikidata_aliasesHead, "xowa-wikidata-aliasesHead", "Aliases");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_descriptions: return new_(Xol_msg_itm_.Id_xowa_wikidata_descriptions, "xowa-wikidata-descriptions", "Descriptions");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links: return new_(Xol_msg_itm_.Id_xowa_wikidata_links, "xowa-wikidata-links", "Links");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_claims: return new_(Xol_msg_itm_.Id_xowa_wikidata_claims, "xowa-wikidata-claims", "Claims");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_json: return new_(Xol_msg_itm_.Id_xowa_wikidata_json, "xowa-wikidata-json", "JSON");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_language: return new_(Xol_msg_itm_.Id_xowa_wikidata_language, "xowa-wikidata-language", "language");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_wiki: return new_(Xol_msg_itm_.Id_xowa_wikidata_wiki, "xowa-wikidata-wiki", "wiki");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_label: return new_(Xol_msg_itm_.Id_xowa_wikidata_label, "xowa-wikidata-label", "label");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_aliases: return new_(Xol_msg_itm_.Id_xowa_wikidata_aliases, "xowa-wikidata-aliases", "aliases");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_description: return new_(Xol_msg_itm_.Id_xowa_wikidata_description, "xowa-wikidata-description", "description");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_link: return new_(Xol_msg_itm_.Id_xowa_wikidata_link, "xowa-wikidata-link", "link");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_property: return new_(Xol_msg_itm_.Id_xowa_wikidata_property, "xowa-wikidata-property", "property");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_value: return new_(Xol_msg_itm_.Id_xowa_wikidata_value, "xowa-wikidata-value", "value");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_references: return new_(Xol_msg_itm_.Id_xowa_wikidata_references, "xowa-wikidata-references", "references");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_qualifiers: return new_(Xol_msg_itm_.Id_xowa_wikidata_qualifiers, "xowa-wikidata-qualifiers", "qualifiers");
|
||||
case Xol_msg_itm_.Id_search_results_header: return new_(Xol_msg_itm_.Id_search_results_header, "showingresultsheader", "{{PLURAL:~{4}\u007CResult '''~{0}''' of '''~{2}'''\u007CResults '''~{0} - ~{1}''' of '''~{2}'''}} for '''~{3}'''");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_bold_sample: return new_(Xol_msg_itm_.Id_edit_toolbar_bold_sample, "bold_sample", "Bold text");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_bold_tip: return new_(Xol_msg_itm_.Id_edit_toolbar_bold_tip, "bold_tip", "Bold text");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_italic_sample: return new_(Xol_msg_itm_.Id_edit_toolbar_italic_sample, "italic_sample", "Italic text");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_italic_tip: return new_(Xol_msg_itm_.Id_edit_toolbar_italic_tip, "italic_tip", "Italic text");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_link_sample: return new_(Xol_msg_itm_.Id_edit_toolbar_link_sample, "link_sample", "Link title");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_link_tip: return new_(Xol_msg_itm_.Id_edit_toolbar_link_tip, "link_tip", "Internal link");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_headline_sample: return new_(Xol_msg_itm_.Id_edit_toolbar_headline_sample, "headline_sample", "Headline text");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_headline_tip: return new_(Xol_msg_itm_.Id_edit_toolbar_headline_tip, "headline_tip", "Level 2 headline");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_ulist_tip: return new_(Xol_msg_itm_.Id_edit_toolbar_ulist_tip, "wikieditor-toolbar-tool-ulist", "Bulleted list");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_ulist_sample: return new_(Xol_msg_itm_.Id_edit_toolbar_ulist_sample, "wikieditor-toolbar-tool-ulist-example", "Bulleted list item");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_olist_tip: return new_(Xol_msg_itm_.Id_edit_toolbar_olist_tip, "wikieditor-toolbar-tool-olist", "Numbered list");
|
||||
case Xol_msg_itm_.Id_edit_toolbar_olist_sample: return new_(Xol_msg_itm_.Id_edit_toolbar_olist_sample, "wikieditor-toolbar-tool-olist-example", "Numbered list item");
|
||||
case Xol_msg_itm_.Id_xowa_portal_about_text: return new_(Xol_msg_itm_.Id_xowa_portal_about_text, "xowa-portal-about", "About");
|
||||
case Xol_msg_itm_.Id_xowa_portal_about_tooltip: return new_(Xol_msg_itm_.Id_xowa_portal_about_tooltip, "tooltip-xowa-portal-about", "About XOWA");
|
||||
case Xol_msg_itm_.Id_xowa_portal_about_accesskey: return new_(Xol_msg_itm_.Id_xowa_portal_about_accesskey, "accesskey-xowa-portal-about", "");
|
||||
case Xol_msg_itm_.Id_symbol_catseparator: return new_(Xol_msg_itm_.Id_symbol_catseparator, "catseparator", "\u007C");
|
||||
case Xol_msg_itm_.Id_symbol_semicolon_separator: return new_(Xol_msg_itm_.Id_symbol_semicolon_separator, "semicolon-separator", "; ");
|
||||
case Xol_msg_itm_.Id_symbol_comma_separator: return new_(Xol_msg_itm_.Id_symbol_comma_separator, "comma-separator", ", ");
|
||||
case Xol_msg_itm_.Id_symbol_colon_separator: return new_(Xol_msg_itm_.Id_symbol_colon_separator, "colon-separator", ": ");
|
||||
case Xol_msg_itm_.Id_symbol_autocomment_prefix: return new_(Xol_msg_itm_.Id_symbol_autocomment_prefix, "autocomment-prefix", "- ");
|
||||
case Xol_msg_itm_.Id_symbol_pipe_separator: return new_(Xol_msg_itm_.Id_symbol_pipe_separator, "pipe-separator", " \u007C ");
|
||||
case Xol_msg_itm_.Id_symbol_word_separator: return new_(Xol_msg_itm_.Id_symbol_word_separator, "word-separator", " ");
|
||||
case Xol_msg_itm_.Id_symbol_ellipsis: return new_(Xol_msg_itm_.Id_symbol_ellipsis, "ellipsis", "...");
|
||||
case Xol_msg_itm_.Id_symbol_percent: return new_(Xol_msg_itm_.Id_symbol_percent, "percent", "~{0}%");
|
||||
case Xol_msg_itm_.Id_symbol_parentheses: return new_(Xol_msg_itm_.Id_symbol_parentheses, "parentheses", "(~{0})");
|
||||
case Xol_msg_itm_.Id_duration_ago: return new_(Xol_msg_itm_.Id_duration_ago, "ago", "~{0} ago");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_novalue: return new_(Xol_msg_itm_.Id_xowa_wikidata_novalue, "xowa-wikidata-novalue", "—");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_somevalue: return new_(Xol_msg_itm_.Id_xowa_wikidata_somevalue, "xowa-wikidata-somevalue", "?");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wiki: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wiki, "xowa-wikidata-links-wiki", "Links (Wikipedia)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wiktionary: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wiktionary, "xowa-wikidata-links-wiktionary", "Links (Wiktionary)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wikisource: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wikisource, "xowa-wikidata-links-wikisource", "Links (Wikisource)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wikivoyage: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wikivoyage, "xowa-wikidata-links-wikivoyage", "Links (Wikivoyage)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wikiquote: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wikiquote, "xowa-wikidata-links-wikiquote", "Links (Wikiquote)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wikibooks: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wikibooks, "xowa-wikidata-links-wikibooks", "Links (Wikibooks)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wikiversity: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wikiversity, "xowa-wikidata-links-wikiversity", "Links (Wikiversity)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_wikinews: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_wikinews, "xowa-wikidata-links-wikinews", "Links (Wikinews)");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_plus: return new_(Xol_msg_itm_.Id_xowa_wikidata_plus, "xowa-wikidata-plus", "+");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_minus: return new_(Xol_msg_itm_.Id_xowa_wikidata_minus, "xowa-wikidata-minus", "−");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_plusminus: return new_(Xol_msg_itm_.Id_xowa_wikidata_plusminus, "xowa-wikidata-plusminus", "±");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_degree: return new_(Xol_msg_itm_.Id_xowa_wikidata_degree, "xowa-wikidata-degree", "°");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_minute: return new_(Xol_msg_itm_.Id_xowa_wikidata_minute, "xowa-wikidata-minute", "′");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_second: return new_(Xol_msg_itm_.Id_xowa_wikidata_second, "xowa-wikidata-second", "″");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_north: return new_(Xol_msg_itm_.Id_xowa_wikidata_north, "xowa-wikidata-north", "N");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_south: return new_(Xol_msg_itm_.Id_xowa_wikidata_south, "xowa-wikidata-south", "S");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_west: return new_(Xol_msg_itm_.Id_xowa_wikidata_west, "xowa-wikidata-west", "W");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_east: return new_(Xol_msg_itm_.Id_xowa_wikidata_east, "xowa-wikidata-east", "E");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_meters: return new_(Xol_msg_itm_.Id_xowa_wikidata_meters, "xowa-wikidata-meters", " m");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_julian: return new_(Xol_msg_itm_.Id_xowa_wikidata_julian, "xowa-wikidata-julian", "<sup>jul</sup>");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_year: return new_(Xol_msg_itm_.Id_xowa_wikidata_year, "xowa-wikidata-year", "~{0}");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_decade: return new_(Xol_msg_itm_.Id_xowa_wikidata_decade, "xowa-wikidata-decade", "~{0}0s");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_century: return new_(Xol_msg_itm_.Id_xowa_wikidata_century, "xowa-wikidata-century", "~{0}. century");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_millenium: return new_(Xol_msg_itm_.Id_xowa_wikidata_millenium, "xowa-wikidata-millenium", "~{0}. millenium");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_years1e4: return new_(Xol_msg_itm_.Id_xowa_wikidata_years1e4, "xowa-wikidata-years1e4", "~{0}0,000 years");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_years1e5: return new_(Xol_msg_itm_.Id_xowa_wikidata_years1e5, "xowa-wikidata-years1e5", "~{0}00,000 years");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_years1e6: return new_(Xol_msg_itm_.Id_xowa_wikidata_years1e6, "xowa-wikidata-years1e6", "~{0} million years");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_years1e7: return new_(Xol_msg_itm_.Id_xowa_wikidata_years1e7, "xowa-wikidata-years1e7", "~{0}0 million years");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_years1e8: return new_(Xol_msg_itm_.Id_xowa_wikidata_years1e8, "xowa-wikidata-years1e8", "~{0}00 million years");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_years1e9: return new_(Xol_msg_itm_.Id_xowa_wikidata_years1e9, "xowa-wikidata-years1e9", "~{0} billion years");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_bc: return new_(Xol_msg_itm_.Id_xowa_wikidata_bc, "xowa-wikidata-bc", "~{0} BC");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_inTime: return new_(Xol_msg_itm_.Id_xowa_wikidata_inTime, "xowa-wikidata-inTime", "in ~{0}");
|
||||
case Xol_msg_itm_.Id_ctg_tbl_hidden: return new_(Xol_msg_itm_.Id_ctg_tbl_hidden, "hidden-category-category", "Hidden categories");
|
||||
case Xol_msg_itm_.Id_ctg_help_page: return new_(Xol_msg_itm_.Id_ctg_help_page, "pagecategorieslink", "Special:Categories");
|
||||
case Xol_msg_itm_.Id_statistics_title: return new_(Xol_msg_itm_.Id_statistics_title, "statistics", "Statistics");
|
||||
case Xol_msg_itm_.Id_statistics_header_pages: return new_(Xol_msg_itm_.Id_statistics_header_pages, "statistics-header-pages", "Page statistics");
|
||||
case Xol_msg_itm_.Id_statistics_articles: return new_(Xol_msg_itm_.Id_statistics_articles, "statistics-articles", "Content pages");
|
||||
case Xol_msg_itm_.Id_statistics_pages: return new_(Xol_msg_itm_.Id_statistics_pages, "statistics-pages", "Pages");
|
||||
case Xol_msg_itm_.Id_statistics_pages_desc: return new_(Xol_msg_itm_.Id_statistics_pages_desc, "statistics-pages-desc", "All pages in the wiki, including talk pages, redirects, etc.");
|
||||
case Xol_msg_itm_.Id_statistics_header_ns: return new_(Xol_msg_itm_.Id_statistics_header_ns, "statistics-header-ns", "Namespace statistics");
|
||||
case Xol_msg_itm_.Id_wikibase_diffview_rank: return new_(Xol_msg_itm_.Id_wikibase_diffview_rank, "Wikibase-diffview-rank", "rank");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_deprecated: return new_(Xol_msg_itm_.Id_xowa_wikidata_deprecated, "xowa-wikidata-deprecated", "deprecated");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_normal: return new_(Xol_msg_itm_.Id_xowa_wikidata_normal, "xowa-wikidata-normal", "normal");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_preferred: return new_(Xol_msg_itm_.Id_xowa_wikidata_preferred, "xowa-wikidata-preferred", "preferred");
|
||||
case Xol_msg_itm_.Id_xowa_wikidata_links_special: return new_(Xol_msg_itm_.Id_xowa_wikidata_links_special, "xowa-wikidata-links-special", "Links (special wikis)");
|
||||
default: throw Err_.new_unhandled(id);
|
||||
}
|
||||
}
|
||||
public static byte[] eval_(Bry_bfr bfr, Xol_msg_itm tmp_msg_itm, byte[] val, Object... args) {
|
||||
synchronized (tmp_fmtr) { // LOCK:static-objs; DATE:2016-07-07
|
||||
val = gplx.xowa.apps.gfs.Gfs_php_converter.To_gfs(bfr, val);
|
||||
update_val_(tmp_msg_itm, val);
|
||||
return tmp_fmtr.Bld_bry_many(bfr, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,25 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xol_msg_itm_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xol_msg_itm_fxt fxt = new Xol_msg_itm_fxt();
|
||||
@Test public void New_plain() {fxt.Test_new("a" , Bool_.N, Bool_.N);}
|
||||
@Test public void New_fmt() {fxt.Test_new("a~{0}b" , Bool_.Y, Bool_.N);}
|
||||
@Test public void New_tmpl() {fxt.Test_new("a{{b}}c" , Bool_.N, Bool_.Y);}
|
||||
@Test public void New_fmt_tmpl() {fxt.Test_new("a{{b}}c~{0}d" , Bool_.Y, Bool_.Y);}
|
||||
@Test public void New_space() {fxt.Test_val("a b" , "a b");}
|
||||
}
|
||||
class Xol_msg_itm_fxt {
|
||||
public void Clear() {}
|
||||
public void Test_new(String val, boolean has_fmt_arg, boolean has_tmpl_txt) {
|
||||
Xol_msg_itm itm = Xol_msg_itm_.new_(0, "test", val);
|
||||
Tfds.Eq(has_fmt_arg, itm.Has_fmt_arg(), "has_fmt_arg");
|
||||
Tfds.Eq(has_tmpl_txt, itm.Has_tmpl_txt(), "has_tmpl_txt");
|
||||
}
|
||||
public void Test_val(String val, String expd) {
|
||||
Xol_msg_itm itm = Xol_msg_itm_.new_(0, "test", val);
|
||||
Tfds.Eq(expd, String_.new_u8(itm.Val()), "has_fmt_arg");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,93 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.parsers.*;
|
||||
public class Xol_msg_mgr implements Gfo_invk {
|
||||
private final Gfo_invk owner; private final boolean owner_is_lang;
|
||||
public Xol_msg_mgr(Gfo_invk owner, boolean owner_is_lang) {
|
||||
this.owner = owner; this.owner_is_lang = owner_is_lang;
|
||||
this.Clear();
|
||||
}
|
||||
public void Clear() {
|
||||
if (owner_is_lang)
|
||||
itms = Ary_new();
|
||||
else
|
||||
itms = new Xol_msg_itm[Xol_msg_itm_.Id__max];
|
||||
hash = Hash_new(itms);
|
||||
itms_max = itms_id_next = Xol_msg_itm_.Id__max;
|
||||
}
|
||||
public int Itms_max() {return itms_max;} private Xol_msg_itm[] itms; int itms_max = Xol_msg_itm_.Id__max; int itms_id_next = Xol_msg_itm_.Id__max;
|
||||
public Xol_msg_itm Itm_by_id_or_null(int id) {return id < itms_max ? itms[id] : null;}
|
||||
public Xol_msg_itm Itm_by_key_or_null(byte[] key) {return (Xol_msg_itm)hash.Get_by(key);}
|
||||
public Xol_msg_itm Itms_new(byte[] msg_key) {
|
||||
Xol_msg_itm rv = new Xol_msg_itm(itms_id_next++, msg_key);
|
||||
Itms_reg(rv);
|
||||
return rv;
|
||||
}
|
||||
public Xol_msg_itm Itm_by_key_or_new(String key, String val) {return Itm_by_key_or_new(key, val, false);} // TEST:
|
||||
public Xol_msg_itm Itm_by_key_or_new(String key, String val, boolean has_fmt_arg) { // TEST:
|
||||
Xol_msg_itm rv = Itm_by_key_or_new(Bry_.new_u8(key));
|
||||
Xol_msg_itm_.update_val_(rv, Bry_.new_u8(val));
|
||||
return rv;
|
||||
}
|
||||
public Xol_msg_itm Itm_by_key_or_new(byte[] key) {
|
||||
Object o = hash.Get_by(key);
|
||||
Xol_msg_itm rv = null;
|
||||
if (o == null) { // key not found; likely not a system_id; generate a custom one
|
||||
rv = new Xol_msg_itm(itms_id_next++, key);
|
||||
Itms_reg(rv);
|
||||
}
|
||||
else {
|
||||
rv = (Xol_msg_itm)o;
|
||||
}
|
||||
return rv;
|
||||
} Hash_adp hash;
|
||||
public byte[] Val_by_id(int id) { // NOTE: Val_by_id needs to exist on lang (not wiki_msg_mgr); {{#time}} can pass in lang, and will need to call lang's msg_mgr directly
|
||||
Xol_msg_itm itm = Itm_by_id_or_null(id);
|
||||
return itm == null ? null : itm.Val();
|
||||
}
|
||||
public byte[] Val_by_id(Xowe_wiki wiki, int id) { // NOTE: Val_by_id needs to exist on lang (not wiki_msg_mgr); {{#time}} can pass in lang, and will need to call lang's msg_mgr directly
|
||||
Xol_msg_itm itm = Itm_by_id_or_null(id);
|
||||
if (itm == null) return null;
|
||||
byte[] rv = itm.Val();
|
||||
if (itm.Has_tmpl_txt()) rv = wiki.Parser_mgr().Main().Expand_tmpl(rv);
|
||||
return rv;
|
||||
}
|
||||
public byte[] Val_by_str_or_empty(String str) {return Val_by_bry_or(Bry_.new_u8(str), Bry_.Empty);}
|
||||
public byte[] Val_by_bry_or(byte[] bry, byte[] or) {
|
||||
Xol_msg_itm itm = Itm_by_key_or_null(bry);
|
||||
return itm == null ? or : itm.Val();
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_lang)) return owner;
|
||||
else if (ctx.Match(k, Invk_load_text)) Xol_lang_srl.Load_messages(this, m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_lang = Xol_lang_srl.Invk_lang, Invk_load_text = Xol_lang_srl.Invk_load_text;
|
||||
private void Itms_reg(Xol_msg_itm itm) {
|
||||
int id = itm.Id();
|
||||
if (id >= itms_max) {
|
||||
int new_max = (id + 1) * 2;
|
||||
itms = (Xol_msg_itm[])Array_.Expand(itms, new Xol_msg_itm[new_max], itms_max);
|
||||
itms_max = new_max;
|
||||
}
|
||||
itms[id] = itm;
|
||||
hash.Add(itm.Key(), itm);
|
||||
}
|
||||
private static Xol_msg_itm[] Ary_new() {
|
||||
Xol_msg_itm[] rv = new Xol_msg_itm[Xol_msg_itm_.Id__max];
|
||||
for (int i = 0; i < Xol_msg_itm_.Id__max; i++)
|
||||
rv[i] = Xol_msg_itm_.new_(i);
|
||||
return rv;
|
||||
}
|
||||
private static Hash_adp Hash_new(Xol_msg_itm[] ary) {
|
||||
Hash_adp rv = Hash_adp_bry.ci_a7(); // ASCII:MW messages are currently all ASCII
|
||||
for (int i = 0; i < Xol_msg_itm_.Id__max; i++) {
|
||||
Xol_msg_itm itm = ary[i]; if (itm == null) continue; // NOTE: can be null when msg_mgr is owned by wiki
|
||||
rv.Add(itm.Key(), itm);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
static final String GRP_KEY = "xowa.lang.msg_mgr";
|
||||
}
|
||||
|
||||
@@ -13,147 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.brys.fmtrs.*;
|
||||
import gplx.langs.phps.*; import gplx.xowa.parsers.*;
|
||||
import gplx.xowa.apps.gfs.*;
|
||||
import gplx.xowa.htmls.*;
|
||||
import gplx.xowa.wikis.*; import gplx.xowa.wikis.pages.dbs.*;
|
||||
public class Xol_msg_mgr_ {
|
||||
public static String Get_msg_val_gui_or_empty(Xoa_lang_mgr lang_mgr, Xol_lang_itm lang, byte[] pre, byte[] key, byte[] suf) { // get from lang, else get from en; does not use get_msg_val to skip db lookups; should only be used for gui; DATE:2014-05-28
|
||||
String rv = Get_msg_val_gui_or_null(lang_mgr, lang, pre, key, suf);
|
||||
return rv == null ? "" : rv;
|
||||
}
|
||||
public static String Get_msg_val_gui_or(Xoa_lang_mgr lang_mgr, Xol_lang_itm lang, byte[] pre, byte[] key, byte[] suf, String or) {
|
||||
String rv = Get_msg_val_gui_or_null(lang_mgr, lang, pre, key, suf);
|
||||
return rv == null ? or : rv;
|
||||
}
|
||||
public static String Get_msg_val_gui_or_null(Xoa_lang_mgr lang_mgr, Xol_lang_itm lang, byte[] pre, byte[] key, byte[] suf) { // get from lang, else get from en; does not use get_msg_val to skip db lookups; should only be used for gui; DATE:2014-05-28
|
||||
byte[] msg_key = Bry_.Add(pre, key, suf);
|
||||
Xol_msg_itm msg_itm = lang.Msg_mgr().Itm_by_key_or_null(msg_key);
|
||||
if (msg_itm == null)
|
||||
msg_itm = lang_mgr.Lang_en().Msg_mgr().Itm_by_key_or_null(msg_key);
|
||||
return msg_itm == null ? null : String_.new_u8(msg_itm.Val());
|
||||
}
|
||||
public static byte[] Get_msg_val(Xow_wiki wiki, Xol_lang_itm lang, byte[] msg_key, byte[][] fmt_args) {
|
||||
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
|
||||
Xol_msg_itm msg_itm = Get_msg_itm(tmp_bfr, wiki, lang, msg_key);
|
||||
byte[] rv = (msg_itm.Defined_in_none())
|
||||
? tmp_bfr.Add_byte(Byte_ascii.Lt).Add(msg_key).Add_byte(Byte_ascii.Gt).To_bry_and_clear() // NOTE: do not use key from msg_itm; msg_itms are case-insensitive, and val should match key exactly; EX: missing should return <missing> not <Missing> DATE:2016-08-01
|
||||
: Get_msg_val(tmp_bfr, wiki, msg_itm, fmt_args);
|
||||
tmp_bfr.Mkr_rls();
|
||||
return rv;
|
||||
} private static final byte[] Missing_bry = Bry_.new_a7("$"), Slash_bry = new byte[] {Byte_ascii.Slash};
|
||||
public static byte[] Get_msg_val(Bry_bfr tmp_bfr, Xow_wiki wiki, Xol_msg_itm msg_itm, byte[][] fmt_args) {
|
||||
byte[] msg_val = msg_itm.Val();
|
||||
boolean has_fmt = msg_itm.Has_fmt_arg(), has_tmpl = msg_itm.Has_tmpl_txt();
|
||||
if (!has_fmt && !has_tmpl) // no fmt or tmpl; just add val
|
||||
return msg_val;
|
||||
if (has_fmt) { // fmt exists; fmt first (before tmpl text); EX: Expression error: Unrecognised word "~{0}"
|
||||
Bry_fmtr tmp_fmtr = Bry_fmtr.New__tmp().Missing_bgn_(Missing_bry).Missing_end_(Bry_.Empty).Missing_adj_(1);
|
||||
tmp_fmtr.Fmt_(msg_val);
|
||||
tmp_fmtr.Bld_bfr(tmp_bfr, fmt_args);
|
||||
msg_val = tmp_bfr.To_bry_and_clear();
|
||||
}
|
||||
if (has_tmpl) {
|
||||
if (wiki.Type_is_edit()) {
|
||||
Xowe_wiki wikie = (Xowe_wiki)wiki;
|
||||
Xop_ctx sub_ctx = Xop_ctx.New__sub__reuse_page(wikie.Parser_mgr().Ctx()); Xop_tkn_mkr tkn_mkr = sub_ctx.Tkn_mkr();
|
||||
Xop_root_tkn sub_root = tkn_mkr.Root(msg_val);
|
||||
msg_val = wikie.Parser_mgr().Main().Expand_tmpl(sub_root, sub_ctx, tkn_mkr, msg_val);
|
||||
}
|
||||
}
|
||||
return msg_val;
|
||||
}
|
||||
public static Xol_msg_itm Get_msg_itm(Bry_bfr tmp_bfr, Xow_wiki wiki, Xol_lang_itm lang, byte[] msg_key) {
|
||||
byte[] msg_key_sub_root = msg_key;
|
||||
int slash_pos = Bry_find_.Find_bwd(msg_key, Byte_ascii.Slash);
|
||||
if (slash_pos != Bry_find_.Not_found) { // key is of format "key/lang"; EX: "January/en"
|
||||
int msg_key_len = msg_key.length;
|
||||
if (slash_pos != msg_key_len) { // get text after slash; EX: "en"
|
||||
Object o = Xol_lang_stub_.Regy().Get_by_mid(msg_key, slash_pos + 1, msg_key_len);
|
||||
if (o != null) { // text is known lang_code;
|
||||
Xol_lang_stub lang_itm = (Xol_lang_stub)o;
|
||||
lang = wiki.App().Lang_mgr().Get_by_or_new(lang_itm.Key()); // set lang
|
||||
}
|
||||
msg_key_sub_root = Bry_.Mid(msg_key, 0, slash_pos); // set msg to "a" (discarding "/b")
|
||||
}
|
||||
}
|
||||
Xol_msg_itm msg_in_wiki = wiki.Msg_mgr().Get_or_null(msg_key); // check wiki; used to be check lang, but Search_mediawiki should never be toggled on lang; DATE:2014-05-13
|
||||
if (msg_in_wiki != null) return msg_in_wiki; // NOTE: all new msgs will Search_mediawiki once; EX: de.w:{{int:Autosumm-replace}}; DATE:2013-01-25
|
||||
msg_in_wiki = wiki.Msg_mgr().Get_or_make(msg_key);
|
||||
byte[] msg_db = Get_msg_from_db_or_null(wiki, lang, msg_key, msg_key_sub_root);
|
||||
byte[] msg_val = Bry_.Empty;
|
||||
if (msg_db == null) { // [[MediaWiki:key/fallback]] still not found; search "lang.gfs";
|
||||
Xol_msg_itm msg_in_lang = Get_msg_itm_from_gfs(wiki, lang, msg_key_sub_root);
|
||||
if (msg_in_lang == null) {
|
||||
msg_val = tmp_bfr.Add_byte(Byte_ascii.Lt).Add(msg_key).Add_byte(Byte_ascii.Gt).To_bry_and_clear(); // set val to <msg_key>
|
||||
msg_in_wiki.Defined_in_(Xol_msg_itm.Defined_in__none);
|
||||
}
|
||||
else {
|
||||
msg_val = msg_in_lang.Val();
|
||||
msg_in_wiki.Defined_in_(Xol_msg_itm.Defined_in__lang);
|
||||
}
|
||||
}
|
||||
else { // page found; dump entire contents
|
||||
msg_val = Gfs_php_converter.To_gfs(tmp_bfr, msg_db); // note that MediaWiki msg's use php arg format ($1); xowa.gfs msgs are already converted
|
||||
msg_in_wiki.Defined_in_(Xol_msg_itm.Defined_in__wiki);
|
||||
}
|
||||
Xol_msg_itm_.update_val_(msg_in_wiki, msg_val);
|
||||
return msg_in_wiki;
|
||||
}
|
||||
private static byte[] Get_msg_from_db_or_null(Xow_wiki wiki, Xol_lang_itm lang, byte[] msg_key, byte[] msg_key_sub_root) {
|
||||
byte[] ns_bry = wiki.Ns_mgr().Ns_mediawiki().Name_db_w_colon();
|
||||
Xoa_ttl ttl = wiki.Ttl_parse(Bry_.Add(ns_bry, msg_key)); // ttl="MediaWiki:msg_key"; note that there may be "/lang"; EX:pl.d:Wikislownik:Bar/Archiwum_6 and newarticletext/pl
|
||||
byte[] rv = null;
|
||||
if (ttl != null)
|
||||
rv = Load_msg_from_db_or_null(wiki, ttl);
|
||||
if (rv == null) {// [[MediaWiki:key]] not found; search for [[MediaWiki:key/fallback]]
|
||||
byte[][] fallback_ary = lang.Fallback_bry_ary();
|
||||
int fallback_ary_len = fallback_ary.length;
|
||||
for (int i = 0; i < fallback_ary_len; i++) {
|
||||
byte[] fallback = fallback_ary[i];
|
||||
ttl = wiki.Ttl_parse(Bry_.Add(ns_bry, msg_key_sub_root, Slash_bry, fallback)); // ttl="MediaWiki:msg_key/fallback"
|
||||
if (ttl != null)
|
||||
rv = Load_msg_from_db_or_null(wiki, ttl);
|
||||
if (rv != null) break;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
private static byte[] Load_msg_from_db_or_null(Xow_wiki wiki, Xoa_ttl ttl) {
|
||||
Xoa_page pg = null;
|
||||
if (wiki.Type_is_edit()) // NOTE: this check only works when loading pages directly (EX:en.wikipedia.org/wiki/MediaWiki:Sidebar); however, due to way msgs load, wiki is always edit, even if html_dump; DATE:2016-09-17
|
||||
pg = ((Xowe_wiki)wiki).Data_mgr().Load_page_by_ttl_for_msg(ttl);
|
||||
|
||||
// HACK: handle htmp_dump wikis when loading messages such as sidebar; DATE:2016-09-17
|
||||
if ( !wiki.Type_is_edit() // app is drd; DATE:2016-09-23
|
||||
|| ( pg.Db().Page().Exists() // page exists
|
||||
&& Bry_.Len_eq_0(pg.Db().Text().Text_bry()) // but text is empty -> check html_dump
|
||||
)
|
||||
) {
|
||||
Xoh_page hpg = new Xoh_page();
|
||||
pg = hpg;
|
||||
hpg.Ctor_by_hview(wiki, Xoa_url.New(wiki, ttl), ttl, -1);
|
||||
wiki.Html__hdump_mgr().Load_mgr().Load_by_xowh(hpg, ttl, Bool_.N);
|
||||
pg.Db().Text().Text_bry_(pg.Db().Html().Html_bry());
|
||||
}
|
||||
return pg.Db().Page().Exists() ? pg.Db().Text().Text_bry() : null;
|
||||
}
|
||||
private static Xol_msg_itm Get_msg_itm_from_gfs(Xow_wiki wiki, Xol_lang_itm lang, byte[] msg_key_sub_root) {
|
||||
Xol_msg_itm rv = lang.Msg_mgr().Itm_by_key_or_null(msg_key_sub_root); // NOTE: should always be msg_key_sub_root; EX: "msg/lang" will never be in lang.gfs
|
||||
if (rv == null) { // msg not found; check fallbacks; note that this is different from MW b/c when MW constructs a lang, it automatically adds all fallback msgs to the current lang
|
||||
byte[][] fallback_ary = lang.Fallback_bry_ary();
|
||||
int fallback_ary_len = fallback_ary.length;
|
||||
Xoa_lang_mgr lang_mgr = wiki.App().Lang_mgr();
|
||||
for (int i = 0; i < fallback_ary_len; i++) {
|
||||
byte[] fallback = fallback_ary[i];
|
||||
Xol_lang_itm fallback_lang = lang_mgr.Get_by(fallback);
|
||||
if (fallback_lang == null) continue; // NOTE: en has fallback of "false"; ignore bad fallbacks;
|
||||
rv = fallback_lang.Msg_mgr().Itm_by_key_or_null(msg_key_sub_root);
|
||||
if (rv != null) break;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,56 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*; import gplx.core.tests.*; import gplx.xowa.langs.msgs.*;
|
||||
public class Xol_msg_mgr_tst {
|
||||
@Before public void init() {fxt.Clear();} private final Xol_msg_mgr_fxt fxt = new Xol_msg_mgr_fxt();
|
||||
@Test public void Template_msg() {fxt.Test_val_by_key("About {{SITENAME}}", "About Wikipedia");} // PURPOSE.fix: {{Template}} not working inside label tags; EX:de.wikisource.org; DATE:2013-02-10
|
||||
@Test public void Template_mediawiki() { // PURPOSE.fix: {{Template}} not working inside MediaWiki template
|
||||
fxt.Test_mediaWiki_msg("About {{SITENAME}}", "About Wikipedia");
|
||||
}
|
||||
@Test public void Val_html_accesskey_and_title() {
|
||||
fxt.Clear().Test_val_html_accesskey_and_title("test_title" , "a" , " accesskey=\"a\" title=\"test_title [a]\"");
|
||||
fxt.Clear().Test_val_html_accesskey_and_title("test_title" , null , " title=\"test_title\""); // accesskey is missing
|
||||
fxt.Clear().Test_val_html_accesskey_and_title("test_title" , "" , " title=\"test_title\""); // accesskey is ""
|
||||
fxt.Clear().Test_val_html_accesskey_and_title(null , "a" , " title=\"\""); // no title; leave blank
|
||||
}
|
||||
@Test public void Missing() {
|
||||
fxt.Test__get_msg_val("missing", "<missing>"); // check that key is enclosed in <>
|
||||
fxt.Test__get_msg_val("Missing", "<Missing>"); // check that val matches key; used to match 1st case-insensitive variant; EX: "<missing>" b/c "<missing>" was returned above; DATE:2016-08-01
|
||||
}
|
||||
}
|
||||
class Xol_msg_mgr_fxt {
|
||||
public Xol_msg_mgr_fxt Clear() {
|
||||
if (app == null) {
|
||||
app = Xoa_app_fxt.Make__app__edit();
|
||||
wiki = Xoa_app_fxt.Make__wiki__edit(app);
|
||||
mgr = wiki.Msg_mgr();
|
||||
}
|
||||
mgr.Clear();
|
||||
wiki.Lang().Msg_mgr().Clear();
|
||||
return this;
|
||||
} private Xoae_app app; Xowe_wiki wiki; Xow_msg_mgr mgr;
|
||||
public void Test_val_by_key(String val, String expd) {
|
||||
Xol_msg_itm itm = wiki.Lang().Msg_mgr().Itm_by_key_or_new(Bry_.new_a7("test"));
|
||||
itm.Atrs_set(Bry_.new_a7(val), false, true);
|
||||
Tfds.Eq(expd, String_.new_u8(wiki.Msg_mgr().Val_by_key_obj(Bry_.new_a7("test"))), "has_tmpl_txt");
|
||||
}
|
||||
public void Test_mediaWiki_msg(String raw, String expd) {
|
||||
byte[] msg_ttl = Bry_.new_a7("MediaWiki:msg_ttl");
|
||||
wiki.Db_mgr().Save_mgr().Data_create(Xoa_ttl.Parse(wiki, msg_ttl), Bry_.new_a7(raw));
|
||||
Tfds.Eq(expd, String_.new_u8(wiki.Msg_mgr().Val_by_key_obj(Bry_.new_a7("msg_ttl"))));
|
||||
}
|
||||
public void Test_val_html_accesskey_and_title(String init_title, String init_accesskey, String expd) {
|
||||
if (init_title != null) new_msg_itm_("tooltip-test" , init_title);
|
||||
if (init_accesskey != null) new_msg_itm_("accesskey-test" , init_accesskey);
|
||||
Tfds.Eq(expd, String_.new_a7(wiki.Msg_mgr().Val_html_accesskey_and_title(Bry_.new_a7("test"))));
|
||||
}
|
||||
public void Test__get_msg_val(String key, String expd) {
|
||||
Gftest.Eq__str(expd, Xol_msg_mgr_.Get_msg_val(wiki, wiki.Lang(), Bry_.new_a7(key), Bry_.Ary_empty));
|
||||
}
|
||||
private void new_msg_itm_(String key, String val) {
|
||||
Xol_msg_itm itm = wiki.Lang().Msg_mgr().Itm_by_key_or_new(Bry_.new_a7(key));
|
||||
itm.Atrs_set(Bry_.new_a7(val), false, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,17 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xow_mainpage_finder {
|
||||
public static byte[] Find_or(Xowe_wiki wiki, byte[] or) {
|
||||
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
|
||||
Xol_msg_itm msg_itm = Xol_msg_mgr_.Get_msg_itm(tmp_bfr, wiki, wiki.Lang(), Msg_mainpage);
|
||||
byte[] rv = msg_itm.Defined_in_none()
|
||||
? or
|
||||
: Xol_msg_mgr_.Get_msg_val(tmp_bfr, wiki, msg_itm, Bry_.Ary_empty)
|
||||
;
|
||||
tmp_bfr.Mkr_rls();
|
||||
return rv;
|
||||
}
|
||||
public static final byte[] Msg_mainpage = Bry_.new_a7("mainpage");
|
||||
}
|
||||
|
||||
@@ -13,59 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xow_mainpage_finder_tst {
|
||||
@Before public void init() {fxt.Clear();} private Xow_mainpage_finder_fxt fxt = new Xow_mainpage_finder_fxt();
|
||||
@Test public void Mediawiki() {
|
||||
fxt.Init_mediawiki_page("Mainpage_by_mediawiki");
|
||||
fxt.Test_mainpage("Mainpage_by_mediawiki");
|
||||
}
|
||||
@Test public void Lang() {
|
||||
fxt.Init_lang("Mainpage_by_lang");
|
||||
fxt.Test_mainpage("Mainpage_by_lang");
|
||||
}
|
||||
@Test public void Siteinfo() {
|
||||
fxt.Init_siteinfo("Mainpage_by_siteinfo");
|
||||
fxt.Test_mainpage("Mainpage_by_siteinfo");
|
||||
}
|
||||
@Test public void Lang_and_siteinfo() {
|
||||
fxt.Init_lang("Mainpage_by_lang");
|
||||
fxt.Init_siteinfo("Mainpage_by_siteinfo");
|
||||
fxt.Test_mainpage("Mainpage_by_lang");
|
||||
}
|
||||
@Test public void Mediawiki_and_siteinfo() {
|
||||
fxt.Init_mediawiki_page("Mainpage_by_mediawiki");
|
||||
fxt.Init_siteinfo("Mainpage_by_siteinfo");
|
||||
fxt.Test_mainpage("Mainpage_by_mediawiki");
|
||||
}
|
||||
@Test public void Mediawiki_and_lang_and_siteinfo() {
|
||||
fxt.Init_mediawiki_page("Mainpage_by_mediawiki");
|
||||
fxt.Init_lang("Mainpage_by_lang");
|
||||
fxt.Init_siteinfo("Mainpage_by_siteinfo");
|
||||
fxt.Test_mainpage("Mainpage_by_mediawiki");
|
||||
}
|
||||
@Test public void Mediawiki_tmpl() { // PURPOSE: de.wiktionary.org has "{{ns:project}}:Hauptseite"; DATE:2013-07-07
|
||||
fxt.Init_mediawiki_page("{{ns:project}}:Hauptseite");
|
||||
fxt.Test_mainpage("Wikipedia:Hauptseite");
|
||||
}
|
||||
}
|
||||
class Xow_mainpage_finder_fxt {
|
||||
public void Clear() {
|
||||
fxt.Reset_for_msgs();
|
||||
} private final Xop_fxt fxt = new Xop_fxt();
|
||||
public void Init_siteinfo(String mainpage_val) {
|
||||
fxt.Wiki().Props().Main_page_(Bry_.new_a7(mainpage_val));
|
||||
}
|
||||
public void Init_mediawiki_page(String mainpage_val) {
|
||||
fxt.Init_page_create(String_.new_a7(Ttl_mainpage), mainpage_val);
|
||||
} private static final byte[] Ttl_mainpage = Bry_.new_a7("MediaWiki:Mainpage"); // TEST:
|
||||
public void Init_lang(String mainpage_val) {
|
||||
Xol_msg_itm msg_itm = fxt.Wiki().Lang().Msg_mgr().Itm_by_key_or_new(Xow_mainpage_finder.Msg_mainpage);
|
||||
msg_itm.Atrs_set(Bry_.new_a7(mainpage_val), false, false);
|
||||
}
|
||||
public void Test_mainpage(String expd) {
|
||||
byte[] actl = Xow_mainpage_finder.Find_or(fxt.Wiki(), fxt.Wiki().Props().Main_page());
|
||||
Tfds.Eq(expd, String_.new_a7(actl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,101 +13,3 @@ 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.langs.msgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.brys.fmtrs.*;
|
||||
import gplx.xowa.addons.htmls.sidebars.*;
|
||||
public class Xow_msg_mgr implements Gfo_invk {
|
||||
private final Xow_wiki wiki; private Xol_lang_itm lang; private final Xol_msg_mgr msg_mgr;
|
||||
private final Bry_fmtr tmp_fmtr = Bry_fmtr.New__tmp();
|
||||
public Xow_msg_mgr(Xow_wiki wiki, Xol_lang_itm lang) {
|
||||
this.wiki = wiki;
|
||||
this.lang = lang;
|
||||
this.msg_mgr = new Xol_msg_mgr(wiki, false);
|
||||
}
|
||||
public void Clear() {msg_mgr.Clear();}
|
||||
public void Lang_(Xol_lang_itm v) {
|
||||
this.lang = v;
|
||||
this.Clear();
|
||||
}
|
||||
public byte[] Val_by_id_args(int id, Object... args) {return Val_by_id_priv(id, args);}
|
||||
public byte[] Val_by_id(int id) {return Val_by_id_priv(id, null);}
|
||||
private byte[] Val_by_id_priv(int id, Object[] args) {
|
||||
Xol_msg_itm itm = msg_mgr.Itm_by_id_or_null(id);
|
||||
if (itm == null)
|
||||
itm = lang.Msg_mgr().Itm_by_id_or_null(id);
|
||||
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
|
||||
byte[] rv = Val_by_itm(tmp_bfr, itm, args);
|
||||
tmp_bfr.Mkr_rls();
|
||||
return rv;
|
||||
}
|
||||
public Xol_msg_itm Get_or_make(byte[] key) {return msg_mgr.Itm_by_key_or_new(key);}
|
||||
public Xol_msg_itm Get_or_null(byte[] key) {return msg_mgr.Itm_by_key_or_null(key);}
|
||||
public Xol_msg_itm Find_or_null(byte[] key) {
|
||||
Xol_msg_itm itm = msg_mgr.Itm_by_key_or_null(key);
|
||||
if (itm == null) {
|
||||
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
|
||||
itm = Xol_msg_mgr_.Get_msg_itm(tmp_bfr, wiki, lang, key);
|
||||
if (itm.Defined_in_none()) itm = null;
|
||||
tmp_bfr.Mkr_rls();
|
||||
}
|
||||
return itm;
|
||||
}
|
||||
public byte[] Val_by_key_args(byte[] key, Object... args) {return Val_by_key(key, args);}
|
||||
public byte[] Val_by_key_obj(String key) {return Val_by_key(Bry_.new_u8(key), null);}
|
||||
public byte[] Val_by_key_obj(byte[] key) {return Val_by_key(key, null);}
|
||||
private byte[] Val_by_key(byte[] key, Object[] args) {
|
||||
Xol_msg_itm itm = msg_mgr.Itm_by_key_or_null(key);
|
||||
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b512();
|
||||
if (itm == null)
|
||||
itm = Xol_msg_mgr_.Get_msg_itm(tmp_bfr, wiki, lang, key);
|
||||
if (itm.Defined_in_none()) {
|
||||
tmp_bfr.Mkr_rls();
|
||||
return Bry_.Empty;
|
||||
}
|
||||
byte[] rv = Val_by_itm(tmp_bfr, itm, args);
|
||||
tmp_bfr.Mkr_rls();
|
||||
return rv;
|
||||
}
|
||||
public byte[] Val_by_itm(Bry_bfr tmp_bfr, Xol_msg_itm itm, Object[] args) {
|
||||
byte[] rv = itm.Val();
|
||||
if (args != null) rv = itm.Fmt_tmp(tmp_bfr, tmp_fmtr, rv, args);
|
||||
if (itm.Has_tmpl_txt()) rv = wiki.Wtxt__expand_tmpl(rv);
|
||||
return rv;
|
||||
}
|
||||
public byte[] Val_html_accesskey_and_title(byte[] id) {
|
||||
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_b512();
|
||||
byte[] rv = Val_html_accesskey_and_title(id, bfr, null);
|
||||
bfr.Mkr_rls();
|
||||
return rv;
|
||||
}
|
||||
public byte[] Val_html_accesskey_and_title(byte[] id, Bry_bfr bfr, Xoh_sidebar_itm itm) {
|
||||
byte[] tooltip_key = Bry_.Add(CONST_prefix_tooltip, id);
|
||||
byte[] tooltip_val = Val_by_key_obj(tooltip_key);
|
||||
boolean tooltip_found = Bry_.Len_gt_0(tooltip_val);
|
||||
byte[] accesskey_key = Bry_.Empty, accesskey_val = Bry_.Empty;
|
||||
boolean accesskey_found = false;
|
||||
if (tooltip_found) {
|
||||
accesskey_key = Bry_.Add(CONST_prefix_accesskey, id);
|
||||
accesskey_val = Val_by_key_obj(accesskey_key);
|
||||
accesskey_found = Bry_.Len_gt_0(accesskey_val);
|
||||
}
|
||||
if (accesskey_found)
|
||||
bfr.Add(CONST_atr_accesskey).Add(accesskey_val).Add_byte(Byte_ascii.Quote);
|
||||
bfr.Add(CONST_atr_title).Add(tooltip_found ? tooltip_val : Bry_.Empty); // NOTE: if tooltip not found, make blank; don't bother showing tooltip_key
|
||||
if (accesskey_found)
|
||||
bfr.Add_byte(Byte_ascii.Space).Add_byte(Byte_ascii.Brack_bgn).Add(accesskey_val).Add_byte(Byte_ascii.Brack_end);
|
||||
bfr.Add_byte(Byte_ascii.Quote);
|
||||
byte[] rv = bfr.To_bry_and_clear();
|
||||
if (itm == null)
|
||||
return rv;
|
||||
else {
|
||||
itm.Init_by_title_and_accesskey(tooltip_val, accesskey_val, rv);
|
||||
return null;
|
||||
}
|
||||
} private static final byte[] CONST_prefix_tooltip = Bry_.new_a7("tooltip-"), CONST_prefix_accesskey = Bry_.new_a7("accesskey-"), CONST_atr_title = Bry_.new_a7(" title=\""), CONST_atr_accesskey = Bry_.new_a7(" accesskey=\"");
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_get)) return this.Val_by_key_obj(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_get_html_accesskey_and_title)) return this.Val_html_accesskey_and_title(m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
} private static final String Invk_get = "get", Invk_get_html_accesskey_and_title = "get_html_accesskey_and_title";
|
||||
}
|
||||
|
||||
@@ -13,190 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.primitives.*; import gplx.core.btries.*;
|
||||
public class Xol_num_fmtr_base implements Gfo_invk {
|
||||
private final Btrie_fast_mgr dlm_trie = Btrie_fast_mgr.cs(); private final Btrie_rv trv = new Btrie_rv();
|
||||
private Xol_num_grp[] grp_ary = Xol_num_grp.Ary_empty; int grp_ary_len;
|
||||
private Gfo_num_fmt_wkr[] cache; int cache_len = 16;
|
||||
private Bry_bfr tmp = Bry_bfr_.New();
|
||||
public boolean Standard() {return standard;} private boolean standard = true;
|
||||
public byte[] Dec_dlm() {return dec_dlm;} public Xol_num_fmtr_base Dec_dlm_(byte[] v) {this.dec_dlm = v; dlm_trie.Add_bry_byte(v, Raw_tid_dec); return this;} private byte[] dec_dlm = Dec_dlm_default;
|
||||
private byte[] grp_dlm;
|
||||
public byte[] Raw(byte tid, byte[] src) {
|
||||
int src_len = src.length;
|
||||
for (int i = 0; i < src_len; i++) {
|
||||
byte b = src[i];
|
||||
Object o = dlm_trie.Match_at(trv, src, i, src_len);
|
||||
if (o == null)
|
||||
tmp.Add_byte(b);
|
||||
else {
|
||||
byte dlm_tid = ((Byte_obj_val)o).Val();
|
||||
int dlm_match_pos = trv.Pos();
|
||||
switch (dlm_tid) {
|
||||
case Raw_tid_dec:
|
||||
if (tid == Tid_raw)
|
||||
tmp.Add_byte(Byte_ascii.Dot); // NOTE: dec_dlm is always outputted as dot, not regional dec_spr; EX: for dewiki, 12,34 -> 12.34
|
||||
else
|
||||
tmp.Add(dec_dlm);
|
||||
break;
|
||||
case Raw_tid_grp: {
|
||||
if (tid == Tid_raw) {} // never add grp_sep for raw
|
||||
else // add raw grp_spr
|
||||
tmp.Add_mid(src, i, dlm_match_pos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
i = dlm_match_pos - 1; // NOTE: handle multi-byte delims
|
||||
}
|
||||
}
|
||||
return tmp.To_bry_and_clear();
|
||||
}
|
||||
public byte[] Fmt(int val) {return Fmt(Bry_.new_a7(Int_.To_str(val)));}
|
||||
public byte[] Fmt(byte[] src) { // SEE: DOC_1:Fmt
|
||||
int src_len = src.length;
|
||||
int num_bgn = -1, dec_pos = -1;
|
||||
for (int i = 0; i < src_len; i++) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
||||
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
|
||||
if (dec_pos == -1) { // no decimal seen
|
||||
if (num_bgn == -1) // num_bgn hasn't started
|
||||
num_bgn = i; // set num_bgn
|
||||
}
|
||||
else // decimal seen; add rest of src literally
|
||||
tmp.Add_byte(b);
|
||||
break;
|
||||
default: // non-number; includes alpha chars, as well as ".", "," and other potential separators
|
||||
if (num_bgn != -1) { // number started; format group; EX: 1234. -> 1,234.
|
||||
Gfo_num_fmt_wkr wkr = Get_or_new(i - num_bgn);
|
||||
wkr.Fmt(src, num_bgn, i, tmp);
|
||||
num_bgn = dec_pos = -1; // reset vars
|
||||
if (b == Byte_ascii.Dot // current char is "."; NOTE: all languages treat "." as decimal separator for parse; EX: for de, "1.23" is "1,23" DATE:2013-10-21
|
||||
//|| Bry_.Has_at_bgn(src, dec_dlm, i, src_len)
|
||||
) { // current char is languages's decimal delimiter; note this can be "," or any other multi-byte separator
|
||||
dec_pos = i;
|
||||
// i += dec_dlm.length - 1;
|
||||
tmp.Add(dec_dlm);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (b == Byte_ascii.Comma)
|
||||
tmp.Add(grp_dlm);
|
||||
else
|
||||
tmp.Add_byte(b);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (num_bgn != -1) { // digits left unprocessed
|
||||
Gfo_num_fmt_wkr wkr = Get_or_new(src_len - num_bgn);
|
||||
wkr.Fmt(src, num_bgn, src_len, tmp);
|
||||
}
|
||||
return tmp.To_bry_and_clear();
|
||||
}
|
||||
private Gfo_num_fmt_wkr Get_or_new(int src_len) {
|
||||
Gfo_num_fmt_wkr rv = null;
|
||||
if (src_len < cache_len) {
|
||||
rv = cache[src_len];
|
||||
if (rv != null) return rv;
|
||||
}
|
||||
rv = new Gfo_num_fmt_wkr(grp_ary, grp_ary_len, src_len);
|
||||
if (src_len < cache_len) cache[src_len] = rv;
|
||||
return rv;
|
||||
}
|
||||
public Xol_num_grp Grps_get_last() {return grp_ary[grp_ary_len - 1];}
|
||||
public Xol_num_grp Grps_get(int i) {return grp_ary[i];}
|
||||
public int Grps_len() {return grp_ary_len;}
|
||||
public void Grps_add(Xol_num_grp dat_itm) {
|
||||
standard = false;
|
||||
this.grp_ary = (Xol_num_grp[])Array_.Resize(grp_ary, grp_ary_len + 1);
|
||||
grp_ary[grp_ary_len] = dat_itm;
|
||||
grp_ary_len = grp_ary.length;
|
||||
for (int i = 0; i < grp_ary_len; i++) {
|
||||
Xol_num_grp itm = grp_ary[i];
|
||||
byte[] itm_dlm = itm.Dlm();
|
||||
Object o = dlm_trie.Match_exact(itm_dlm, 0, itm_dlm.length); // check for existing Object
|
||||
if (o == null) {
|
||||
dlm_trie.Add_bry_byte(itm_dlm, Raw_tid_grp);
|
||||
grp_dlm = itm_dlm;
|
||||
}
|
||||
}
|
||||
}
|
||||
public Xol_num_fmtr_base Clear() {
|
||||
this.grp_ary = Xol_num_grp.Ary_empty;
|
||||
grp_ary_len = 0;
|
||||
cache = new Gfo_num_fmt_wkr[cache_len];
|
||||
dlm_trie.Clear();
|
||||
return this;
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_dec_dlm_)) this.Dec_dlm_(m.ReadBry("v")); // NOTE: must call mutator
|
||||
else if (ctx.Match(k, Invk_clear)) this.Clear();
|
||||
else if (ctx.Match(k, Invk_grps_add)) this.Grps_add(new Xol_num_grp(m.ReadBry("dlm"), m.ReadInt("digits"), m.ReadYn("repeat")));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static final String Invk_dec_dlm_ = "dec_dlm_", Invk_clear = "clear", Invk_grps_add = "grps_add";
|
||||
private static final byte Raw_tid_dec = 0, Raw_tid_grp = 1;
|
||||
private static final byte[] Dec_dlm_default = new byte[] {Byte_ascii.Dot};
|
||||
public static final byte[] Grp_dlm_default = new byte[] {Byte_ascii.Comma};
|
||||
public static final byte Tid_format = 0, Tid_raw = 1, Tid_nosep = 2;
|
||||
}
|
||||
class Gfo_num_fmt_wkr {
|
||||
public void Fmt(byte[] src, int bgn, int end, Bry_bfr bb) {
|
||||
if (itm_max == 0) {bb.Add_mid(src, bgn, end); return;}; // NOTE: small numbers (<=3) will have a 0-len ary
|
||||
int cur_idx = itm_max - 1;
|
||||
Gfo_num_fmt_bldr cur = itm_ary[cur_idx];
|
||||
int cur_pos = cur.Pos();
|
||||
for (int i = bgn; i < end; i++) {
|
||||
if (i == cur_pos + bgn) {
|
||||
cur.Gen(bb);
|
||||
if (cur_idx > 0) cur = itm_ary[--cur_idx];
|
||||
cur_pos = cur.Pos();
|
||||
}
|
||||
bb.Add_byte(src[i]);
|
||||
}
|
||||
}
|
||||
public Gfo_num_fmt_wkr(Xol_num_grp[] grp_ary, int grp_ary_len, int src_len) {
|
||||
itm_ary = new Gfo_num_fmt_bldr[src_len]; // default to src_len; will resize below;
|
||||
int src_pos = src_len, dat_idx = 0, dat_repeat = -1;
|
||||
while (true) {
|
||||
if (dat_idx == grp_ary_len) dat_idx = dat_repeat; // no more itms left; return to repeat
|
||||
Xol_num_grp dat = grp_ary[dat_idx];
|
||||
src_pos -= dat.Digits();
|
||||
if (src_pos < 1) break; // no more digits needed; stop
|
||||
byte[] dat_dlm = dat.Dlm();
|
||||
itm_ary[itm_max++] = dat_dlm.length == 1 ? new Gfo_num_fmt_bldr_one(src_pos, dat_dlm[0]) : (Gfo_num_fmt_bldr)new Gfo_num_fmt_bldr_many(src_pos, dat_dlm);
|
||||
if (dat.Repeat() && dat_repeat == -1) dat_repeat = dat_idx;
|
||||
++dat_idx;
|
||||
}
|
||||
itm_ary = (Gfo_num_fmt_bldr[])Array_.Resize(itm_ary, itm_max);
|
||||
}
|
||||
private Gfo_num_fmt_bldr[] itm_ary; private int itm_max;
|
||||
}
|
||||
interface Gfo_num_fmt_bldr {
|
||||
int Pos();
|
||||
void Gen(Bry_bfr bb);
|
||||
}
|
||||
class Gfo_num_fmt_bldr_one implements Gfo_num_fmt_bldr {
|
||||
public int Pos() {return pos;} private int pos;
|
||||
public void Gen(Bry_bfr bb) {bb.Add_byte(b);}
|
||||
public Gfo_num_fmt_bldr_one(int pos, byte b) {this.pos = pos; this.b = b;} private byte b;
|
||||
}
|
||||
class Gfo_num_fmt_bldr_many implements Gfo_num_fmt_bldr {
|
||||
public int Pos() {return pos;} private int pos;
|
||||
public void Gen(Bry_bfr bb) {bb.Add(ary);}
|
||||
public Gfo_num_fmt_bldr_many(int pos, byte[] ary) {this.pos = pos; this.ary = ary;} private byte[] ary;
|
||||
}
|
||||
/*
|
||||
DOC_1:Fmt
|
||||
. mediawiki does the following (from Language.php|commafy
|
||||
.. split the number by digitGoupingPattern: ###,###,### -> 3,3,3
|
||||
.. use regx to search for number groups
|
||||
.. for each number group, format with "," and "."
|
||||
.. replace final result with languages's decimal / grouping entry from separatorTransformTable
|
||||
. XOWA does the following
|
||||
.. iterate over bytes until non-number reached
|
||||
.. take all seen numbers and format according to lang
|
||||
*/
|
||||
|
||||
@@ -13,104 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xol_num_fmtr_base_tst {
|
||||
Xol_num_fmtr_base mgr = new Xol_num_fmtr_base();
|
||||
@Before public void init() {mgr.Clear();}
|
||||
@Test public void Outliers() {
|
||||
ini_(".", dat_(",", 3));
|
||||
tst_Fmt("1234a1234" , "1,234a1,234");
|
||||
tst_Fmt("1234abc1234" , "1,234abc1,234");
|
||||
tst_Fmt("1234,1234" , "1,234,1,234");
|
||||
tst_Fmt("1234.1234" , "1,234.1234");
|
||||
tst_Fmt("1234." , "1,234.");
|
||||
tst_Fmt("1234.1234.1234.1234" , "1,234.1234.1234.1234");
|
||||
tst_Fmt("-1234567" , "-1,234,567");
|
||||
tst_Fmt("1,234,567" , "1,234,567");
|
||||
}
|
||||
@Test public void English() {
|
||||
ini_(".", dat_(",", 3));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1,234");
|
||||
tst_Fmt("12345678" , "12,345,678");
|
||||
tst_Fmt("12345678901234567890" , "12,345,678,901,234,567,890");
|
||||
tst_Raw("1,234.12" , "1234.12");
|
||||
}
|
||||
@Test public void French() {
|
||||
ini_(",", dat_(" ", 3));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1 234");
|
||||
tst_Fmt("12345678" , "12 345 678");
|
||||
tst_Fmt("12345678901234567890" , "12 345 678 901 234 567 890");
|
||||
tst_Fmt("1234,5678" , "1 234 5 678"); // NOTE: nbsp here; also, nbsp is repeated. see dewiki and {{formatnum:1234,56}}
|
||||
}
|
||||
@Test public void Croatia() {
|
||||
ini_(",", dat_(".", 3), dat_(",", 3));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1.234");
|
||||
tst_Fmt("12345678" , "12,345.678");
|
||||
tst_Fmt("12345678901234567890" , "12,345.678,901.234,567.890");
|
||||
}
|
||||
@Test public void Mexico() {
|
||||
ini_(".", dat_(",", 3, false), dat_("'", 3, false), dat_(",", 3));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1,234");
|
||||
tst_Fmt("12345678" , "12'345,678");
|
||||
tst_Fmt("12345678901234567890" , "12,345,678,901,234'567,890");
|
||||
tst_Raw("12'345,678.90" , "12345678.90");
|
||||
}
|
||||
@Test public void China() {
|
||||
ini_(".", dat_(",", 4));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1234");
|
||||
tst_Fmt("12345678" , "1234,5678");
|
||||
tst_Fmt("12345678901234567890" , "1234,5678,9012,3456,7890");
|
||||
}
|
||||
@Test public void Hindi() {
|
||||
ini_(".", dat_(",", 3, false), dat_(",", 2));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1,234");
|
||||
tst_Fmt("12345678" , "1,23,45,678");
|
||||
tst_Fmt("12345678901234567890" , "1,23,45,67,89,01,23,45,67,890");
|
||||
}
|
||||
@Test public void India() {
|
||||
ini_(".", dat_(",", 3), dat_(",", 2), dat_(",", 2));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1,234");
|
||||
tst_Fmt("12345678" , "1,23,45,678");
|
||||
tst_Fmt("12345678901234567890" , "1,23,456,78,90,123,45,67,890");
|
||||
}
|
||||
@Test public void MiddleDot() {
|
||||
ini_("·", dat_("·", 3));
|
||||
tst_Fmt("123" , "123");
|
||||
tst_Fmt("1234" , "1·234");
|
||||
tst_Fmt("12345678" , "12·345·678");
|
||||
tst_Fmt("12345678901234567890" , "12·345·678·901·234·567·890");
|
||||
tst_Fmt("1234·5678" , "1·234·5·678");// NOTE: middle-dot is repeated. see dewiki and {{formatnum:1234,5678}}
|
||||
tst_Raw("1234·5678" , "1234.5678");
|
||||
}
|
||||
Xol_num_grp dat_(String dlm, int digits) {return new Xol_num_grp(Bry_.new_u8(dlm), digits, true);}
|
||||
Xol_num_grp dat_(String dlm, int digits, boolean repeat) {return new Xol_num_grp(Bry_.new_u8(dlm), digits, repeat);}
|
||||
private void tst_Fmt(String val, String expd) {Tfds.Eq(expd, String_.new_u8(mgr.Fmt(Bry_.new_u8(val))));}
|
||||
private void tst_Raw(String val, String expd) {Tfds.Eq(expd, String_.new_u8(mgr.Raw(Xol_num_fmtr_base.Tid_raw, Bry_.new_u8(val))));}
|
||||
private void ini_(String dec_dlm, Xol_num_grp... ary) {
|
||||
mgr.Dec_dlm_(Bry_.new_u8(dec_dlm));
|
||||
int ary_len = ary.length;
|
||||
for (int i = 0; i < ary_len; i++)
|
||||
mgr.Grps_add(ary[i]);
|
||||
}
|
||||
}
|
||||
/*
|
||||
'france' ' 3#' ',0%' // 1 234 567,89
|
||||
'spain' '.3#' "'0%" // 1.234.567'89
|
||||
'germany' '.3#' ",0%" // 1.234.567,89
|
||||
'italy' ''3#' ",0%" // 1'234'567,89
|
||||
'en-us' ',3#' '.0%' // 1,234,567.89
|
||||
'en-sa' ',3#' '\u00120%' // 1,234,567·89
|
||||
'croatia' ',3#*' '.3#*' ',0%' // 1,234.567,890.123,45
|
||||
'china' ',4$' // 123,4567.89
|
||||
'mexico' ',3#*' "'3#" ',3#' // 1'234,567.89
|
||||
'hindi' ",2#*" ',3#' // 1,23,45,678.9
|
||||
'india' ',2#*' ',2#*' ',3#*' // 1,245,67,89,012
|
||||
*/
|
||||
@@ -13,12 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_num_grp {
|
||||
public Xol_num_grp(byte[] dlm, int digits, boolean repeat) {this.dlm = dlm; this.digits = digits; this.repeat = repeat;}
|
||||
public byte[] Dlm() {return dlm;} private byte[] dlm;
|
||||
public int Digits() {return digits;} private int digits;
|
||||
public boolean Repeat() {return repeat;} private boolean repeat;
|
||||
public static final Xol_num_grp[] Ary_empty = new Xol_num_grp[0];
|
||||
public static final Xol_num_grp Default = new Xol_num_grp(new byte[] {Byte_ascii.Comma}, 3, true);
|
||||
}
|
||||
|
||||
@@ -13,67 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_num_grp_fmtr {
|
||||
public boolean Mode_is_regx() {return digit_grouping_pattern == null || Bry_.Eq(digit_grouping_pattern, Digit_grouping_pattern_normal);}
|
||||
public byte[] Digit_grouping_pattern() {return digit_grouping_pattern;} public void Digit_grouping_pattern_(byte[] v) {digit_grouping_pattern = v;} private byte[] digit_grouping_pattern;
|
||||
public void Clear() {digit_grouping_pattern = null;}
|
||||
public byte[] Fmt_regx(Bry_bfr bfr, byte[] src) {// NOTE: specific code to handle preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $number ) ) );"; DATE:2014-04-15
|
||||
int src_len = src.length;
|
||||
int bgn = 0;
|
||||
int pos = bgn;
|
||||
boolean dirty = false;
|
||||
int grp_len = 3;
|
||||
while (true) {
|
||||
if (pos == src_len) break;
|
||||
byte b = src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
||||
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9: {
|
||||
int num_end = Bry_find_.Find_fwd_while_num(src, pos, src_len);
|
||||
int num_len = num_end - pos;
|
||||
if (num_len > grp_len) {
|
||||
if (!dirty) {
|
||||
bfr.Add_mid(src, bgn, pos);
|
||||
dirty = true;
|
||||
}
|
||||
Fmt_grp(bfr, src, pos, num_end, num_len, grp_len);
|
||||
}
|
||||
else {
|
||||
if (dirty)
|
||||
bfr.Add_mid(src, pos, num_end);
|
||||
}
|
||||
pos = num_end;
|
||||
break;
|
||||
}
|
||||
case Byte_ascii.Dot: {
|
||||
int num_end = Bry_find_.Find_fwd_while_num(src, pos + 1, src_len); // +1 to skip dot
|
||||
if (dirty)
|
||||
bfr.Add_mid(src, pos, num_end);
|
||||
pos = num_end;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if (dirty)
|
||||
bfr.Add_byte(b);
|
||||
++pos;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return dirty ? bfr.To_bry_and_clear() : src;
|
||||
}
|
||||
private void Fmt_grp(Bry_bfr bfr, byte[] src, int bgn, int end, int len, int grp_len) {
|
||||
int seg_0 = bgn + (len % grp_len); // 5 digit number will have seg_0 of 2; 12345 -> 12,345
|
||||
for (int i = bgn; i < end; i++) {
|
||||
if ( i != bgn // never format at bgn; necessary for even multiples of grp_len (6, 9)
|
||||
&& ( i == seg_0 // seg_0
|
||||
|| (i - seg_0) % grp_len == 0 // seg_n
|
||||
)
|
||||
) {
|
||||
bfr.Add_byte(Byte_ascii.Comma); // MW: hard-coded
|
||||
}
|
||||
bfr.Add_byte(src[i]);
|
||||
}
|
||||
}
|
||||
private static final byte[] Digit_grouping_pattern_normal = Bry_.new_a7("###,###,###");
|
||||
}
|
||||
|
||||
@@ -13,40 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xol_num_grp_fmtr_tst {
|
||||
@Before public void init() {fxt.Reset();} private Xol_num_grp_fmtr_fxt fxt = new Xol_num_grp_fmtr_fxt();
|
||||
@Test public void Num() {
|
||||
fxt.Test_fmt_regx("" , "");
|
||||
fxt.Test_fmt_regx("1" , "1");
|
||||
fxt.Test_fmt_regx("12" , "12");
|
||||
fxt.Test_fmt_regx("123" , "123");
|
||||
fxt.Test_fmt_regx("1234" , "1,234");
|
||||
fxt.Test_fmt_regx("12345" , "12,345");
|
||||
fxt.Test_fmt_regx("123456" , "123,456");
|
||||
fxt.Test_fmt_regx("1234567" , "1,234,567");
|
||||
fxt.Test_fmt_regx("1234567890" , "1,234,567,890");
|
||||
}
|
||||
@Test public void Dec() {
|
||||
fxt.Test_fmt_regx("1.9876" , "1.9876");
|
||||
fxt.Test_fmt_regx("1234.9876" , "1,234.9876");
|
||||
}
|
||||
@Test public void Neg() {
|
||||
fxt.Test_fmt_regx("-1234.5678" , "-1,234.5678");
|
||||
}
|
||||
@Test public void Char() {
|
||||
fxt.Test_fmt_regx("1,234" , "1,234");
|
||||
fxt.Test_fmt_regx("1a2345" , "1a2,345");
|
||||
fxt.Test_fmt_regx("1234a5678b2345c.3456d7890e3210.f5432", "1,234a5,678b2,345c.3456d7,890e3,210.f5,432");
|
||||
}
|
||||
}
|
||||
class Xol_num_grp_fmtr_fxt {
|
||||
private Xol_num_grp_fmtr grouper = new Xol_num_grp_fmtr();
|
||||
private Bry_bfr bfr = Bry_bfr_.New();
|
||||
public void Reset() {}
|
||||
public void Test_fmt_regx(String raw, String expd) {
|
||||
byte[] actl = grouper.Fmt_regx(bfr, Bry_.new_a7(raw));
|
||||
Tfds.Eq(expd, String_.new_u8(actl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,61 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_num_mgr implements Gfo_invk {
|
||||
private boolean digits_translate;
|
||||
protected Bry_bfr tmp_bfr = Bry_bfr_.Reset(32);
|
||||
private static final byte[] Comma_bry = Bry_.new_a7(",");
|
||||
public Xol_num_grp_fmtr Num_grp_fmtr() {return num_grp_fmtr;} private Xol_num_grp_fmtr num_grp_fmtr = new Xol_num_grp_fmtr();
|
||||
public Xol_transform_mgr Separators_mgr() {return separators_mgr;} private Xol_transform_mgr separators_mgr = new Xol_transform_mgr();
|
||||
public Xol_transform_mgr Digits_mgr() {return digits_mgr;} private Xol_transform_mgr digits_mgr = new Xol_transform_mgr();
|
||||
public byte[] Raw(byte[] num) {
|
||||
if (digits_translate)
|
||||
num = digits_mgr.Replace(tmp_bfr, num, false);
|
||||
num = separators_mgr.Replace(tmp_bfr, num, false);
|
||||
num = Bry_.Replace_safe(tmp_bfr, num, Comma_bry, Bry_.Empty);
|
||||
return num;
|
||||
}
|
||||
public byte[] Format_num_no_separators(byte[] num) {return Format_num(num, true);}
|
||||
public byte[] Format_num_by_long(long val) {return Format_num(Bry_.new_a7(Long_.To_str(val)));}
|
||||
public byte[] Format_num_by_decimal(Decimal_adp val){return Format_num(Bry_.new_a7(val.To_str()));}
|
||||
public byte[] Format_num(int val) {return Format_num(Bry_.new_a7(Int_.To_str(val)));}
|
||||
public byte[] Format_num(byte[] num) {return Format_num(num, false);}
|
||||
public byte[] Format_num(byte[] num, boolean skip_commafy) {
|
||||
if (!skip_commafy) {
|
||||
num = Commafy(num);
|
||||
num = separators_mgr.Replace(tmp_bfr, num, true);
|
||||
}
|
||||
if (digits_translate)
|
||||
num = digits_mgr.Replace(tmp_bfr, num, true);
|
||||
return num;
|
||||
}
|
||||
@gplx.Virtual public byte[] Commafy(byte[] num_bry) {
|
||||
if (num_bry == null) return Bry_.Empty; // MW: if ( $number === null ) return '';
|
||||
if (num_grp_fmtr.Mode_is_regx())
|
||||
return num_grp_fmtr.Fmt_regx(tmp_bfr, num_bry);
|
||||
else // NOTE: for now, return same as ###,###,###; only affects 12 languages; current implementation is bad; https://bugzilla.wikimedia.org/show_bug.cgi?id=63977
|
||||
return num_grp_fmtr.Fmt_regx(tmp_bfr, num_bry);
|
||||
}
|
||||
public Xol_num_mgr Clear() {
|
||||
digits_mgr.Clear();
|
||||
separators_mgr.Clear();
|
||||
num_grp_fmtr.Clear();
|
||||
return this;
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_clear)) this.Clear();
|
||||
else if (ctx.Match(k, Invk_separators)) return separators_mgr;
|
||||
else if (ctx.Match(k, Invk_digits)) {digits_translate = true; return digits_mgr;} // NOTE: only langes with a digit_transform_table will call digits; DATE:2014-05-28
|
||||
else if (ctx.Match(k, Invk_digit_grouping_pattern)) return String_.new_u8(num_grp_fmtr.Digit_grouping_pattern());
|
||||
else if (ctx.Match(k, Invk_digit_grouping_pattern_)) num_grp_fmtr.Digit_grouping_pattern_(m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static final String Invk_clear = "clear", Invk_separators = "separators"
|
||||
, Invk_digits = "digits", Invk_digit_grouping_pattern = "digit_grouping_pattern", Invk_digit_grouping_pattern_ = "digit_grouping_pattern_";
|
||||
public static final byte[]
|
||||
Separators_key__grp = new byte[]{Byte_ascii.Comma}
|
||||
, Separators_key__dec = new byte[]{Byte_ascii.Dot}
|
||||
;
|
||||
}
|
||||
|
||||
@@ -13,26 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_num_mgr_ {
|
||||
public static Xol_num_mgr new_by_lang_id(int lang_id) {
|
||||
switch (lang_id) {
|
||||
case Xol_lang_stub_.Id_be_tarask:
|
||||
case Xol_lang_stub_.Id_bg:
|
||||
case Xol_lang_stub_.Id_ru:
|
||||
case Xol_lang_stub_.Id_pl:
|
||||
case Xol_lang_stub_.Id_uk:
|
||||
case Xol_lang_stub_.Id_es:
|
||||
case Xol_lang_stub_.Id_et:
|
||||
case Xol_lang_stub_.Id_hy:
|
||||
case Xol_lang_stub_.Id_kaa:
|
||||
case Xol_lang_stub_.Id_kk_cyrl:
|
||||
case Xol_lang_stub_.Id_ksh:
|
||||
// case Xol_lang_stub_.Id_ku_ku:
|
||||
return new Xol_num_mgr__commafy_5();
|
||||
case Xol_lang_stub_.Id_km:
|
||||
case Xol_lang_stub_.Id_my: return new Xol_num_mgr__noop();
|
||||
default: return new Xol_num_mgr();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,30 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
class Xol_num_mgr__commafy_5 extends Xol_num_mgr { @Override public byte[] Commafy(byte[] num) {
|
||||
if (Bry_.Len_eq_0(num)) return num; // bounds check
|
||||
int num_len = num.length;
|
||||
int num_bgn = 0;
|
||||
byte b = num[num_bgn];
|
||||
if (b == Byte_ascii.Dash) {
|
||||
if (num_len == 1) return num; // bounds check
|
||||
b = num[++num_bgn]; // skip negative sign
|
||||
}
|
||||
if (Byte_ascii.Is_num(b)) { // check for preg_match( '/^-?\d{1,4}(\.\d+)?$/', $_ )
|
||||
int num_end = Bry_find_.Find_fwd_while_num(num, num_bgn, num_len);
|
||||
if (num_end - num_bgn < 5) { // 1-4 digits
|
||||
if (num_end == num_len) return num; // no decimal; exit
|
||||
b = num[num_end];
|
||||
if ( b == Byte_ascii.Dot
|
||||
&& num_end != num_len - 1) { // if dot at end, then no match on above regx; fall-thru to below
|
||||
num_end = Bry_find_.Find_fwd_while_num(num, num_end + 1, num_len);
|
||||
if (num_end == num_len) return num; // only numbers after dot; matches regx;
|
||||
}
|
||||
}
|
||||
}
|
||||
return this.Num_grp_fmtr().Fmt_regx(tmp_bfr, num); // otherwise do default grouping; '/(\d{3})(?=\d)(?!\d*\.)/', '$1,'
|
||||
}
|
||||
}
|
||||
class Xol_num_mgr__noop extends Xol_num_mgr { @Override public byte[] Commafy(byte[] num) {return num;}
|
||||
}
|
||||
|
||||
@@ -13,40 +13,3 @@ 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.langs.numbers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*;
|
||||
public class Xol_transform_mgr implements Gfo_invk {
|
||||
private Btrie_fast_mgr trie_k_to_v = Btrie_fast_mgr.cs();
|
||||
private Btrie_fast_mgr trie_v_to_k = Btrie_fast_mgr.cs();
|
||||
private Ordered_hash hash = Ordered_hash_.New_bry();
|
||||
private boolean empty = true;
|
||||
public void Clear() {hash.Clear(); trie_k_to_v.Clear(); trie_v_to_k.Clear(); empty = true;}
|
||||
public int Len() {return hash.Count();}
|
||||
public Keyval Get_at(int i) {return (Keyval)hash.Get_at(i);}
|
||||
public byte[] Get_val_or_self(byte[] k) { // NOTE: return self; note that MW defaults "." and "," to self, even though MessagesLa.php only specifies ","; i.e.: always return something for "."; DATE:2014-05-13
|
||||
Keyval kv = (Keyval)hash.Get_by(k);
|
||||
return kv == null ? k : (byte[])kv.Val();
|
||||
}
|
||||
public Xol_transform_mgr Set(byte[] k, byte[] v) {
|
||||
trie_k_to_v.Add(k, v);
|
||||
trie_v_to_k.Add(v, k);
|
||||
Keyval kv = Keyval_.new_(String_.new_u8(k), v);
|
||||
hash.Del(k);
|
||||
hash.Add(k, kv);
|
||||
empty = false;
|
||||
return this;
|
||||
}
|
||||
public byte[] Replace(Bry_bfr tmp_bfr, byte[] src, boolean k_to_v) {
|
||||
if (empty || src == null) return src;
|
||||
int src_len = src.length; if (src_len == 0) return src;
|
||||
Btrie_fast_mgr trie = k_to_v ? trie_k_to_v : trie_v_to_k;
|
||||
return trie.Replace(tmp_bfr, src, 0, src_len);
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_set)) Set(m.ReadBry("k"), m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_clear)) Clear();
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static final String Invk_set = "set", Invk_clear = "clear";
|
||||
}
|
||||
|
||||
@@ -13,68 +13,3 @@ 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.langs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_csv_parser {
|
||||
public void Save(Bry_bfr bfr, byte[] src) {
|
||||
int len = src.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Cr: bfr.Add_byte(Byte_ascii.Backslash); bfr.Add_byte(Byte_ascii.Ltr_r); break;
|
||||
case Byte_ascii.Nl: bfr.Add_byte(Byte_ascii.Backslash); bfr.Add_byte(Byte_ascii.Ltr_n); break;
|
||||
case Byte_ascii.Tab: bfr.Add_byte(Byte_ascii.Backslash); bfr.Add_byte(Byte_ascii.Ltr_t); break;
|
||||
case Byte_ascii.Backslash: bfr.Add_byte(Byte_ascii.Backslash); bfr.Add_byte(Byte_ascii.Backslash); break;
|
||||
case Byte_ascii.Pipe: bfr.Add(Bry_pipe); break;
|
||||
default: bfr.Add_byte(b); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
public byte[] Load(byte[] src, int bgn, int end) {Load(tmp_bfr, src, bgn, end); return tmp_bfr.To_bry_and_clear();}
|
||||
public void Load(Bry_bfr bfr, byte[] src) {Load(bfr, src, 0, src.length);}
|
||||
public void Load(Bry_bfr bfr, byte[] src, int bgn, int end) {
|
||||
for (int i = bgn; i < end; i++) {
|
||||
byte b = src[i];
|
||||
switch (b) {
|
||||
case Byte_ascii.Backslash: {
|
||||
int nxt_pos = i + 1; if (nxt_pos == end) throw Err_.new_wo_type("backslash cannot be last character");
|
||||
byte nxt_byte = src[nxt_pos];
|
||||
switch (nxt_byte) {
|
||||
case Byte_ascii.Backslash: bfr.Add_byte(Byte_ascii.Backslash); break;
|
||||
case Byte_ascii.Ltr_r: bfr.Add_byte(Byte_ascii.Cr); break;
|
||||
case Byte_ascii.Ltr_n: bfr.Add_byte(Byte_ascii.Nl); break;
|
||||
case Byte_ascii.Ltr_t: bfr.Add_byte(Byte_ascii.Tab); break;
|
||||
case Byte_ascii.Ltr_u:
|
||||
int utf_len = 1;
|
||||
for (int j = i + 6; j < end; j += 6) { // iterate over rest of String; EX: \u0123
|
||||
if (j + 1 < end && src[j] == Byte_ascii.Backslash && src[j + 1] == Byte_ascii.Ltr_u)
|
||||
++utf_len;
|
||||
else
|
||||
break;
|
||||
}
|
||||
byte[] utf_bytes = new byte[utf_len]; int utf_idx = 0;
|
||||
int utf_pos = i + 2;
|
||||
for (int j = 0; j < utf_len; j++) {
|
||||
int utf_int = Int_.By_hex_bry(src, utf_pos, utf_pos + 4);
|
||||
if (utf_int == -1) throw Err_.new_wo_type("invalid value for \\u", "val", String_.new_u8(src, bgn, end));
|
||||
utf_bytes[utf_idx++] = (byte)utf_int;
|
||||
utf_pos += 6;
|
||||
}
|
||||
int utf_int_decoded = gplx.core.intls.Utf16_.Decode_to_int(utf_bytes, 0);
|
||||
bfr.Add(gplx.core.intls.Utf16_.Encode_int_to_bry(utf_int_decoded));
|
||||
nxt_pos = i + (utf_len * 6) - 1; // -1 b/c "for" will ++
|
||||
break;
|
||||
default:
|
||||
bfr.Add_byte(b).Add_byte(nxt_byte);
|
||||
break;
|
||||
}
|
||||
i = nxt_pos;
|
||||
break;
|
||||
}
|
||||
default: bfr.Add_byte(b); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
private static final byte[] Bry_pipe = Bry_.new_a7("\\u007C");
|
||||
private static final Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
||||
public static final Xol_csv_parser Instance = new Xol_csv_parser(); Xol_csv_parser() {}
|
||||
}
|
||||
|
||||
@@ -13,27 +13,3 @@ 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.langs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xol_csv_parser_tst {
|
||||
Xol_csv_parser_fxt fxt = new Xol_csv_parser_fxt();
|
||||
@Before public void init() {fxt.Clear();}
|
||||
@Test public void Save() {fxt.Tst_save("a\r\n\t|d", "a\\r\\n\\t\\u007Cd");}
|
||||
@Test public void Load() {fxt.Tst_load("a\r\n\t|d", "a\\r\\n\\t\\u007Cd");}
|
||||
@Test public void Save_backslash() {fxt.Tst_save("a\\\\n", "a\\\\\\\\n");}
|
||||
@Test public void Load_backslash() {fxt.Tst_load("a\\\\n", "a\\\\\\\\n");}
|
||||
@Test public void Utf() {fxt.Tst_load(" ", "\\u00c2\\u00a0");} // NOTE: 1st String is nbsp;
|
||||
}
|
||||
class Xol_csv_parser_fxt {
|
||||
Xol_csv_parser parser = Xol_csv_parser.Instance; Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
||||
public void Clear() {}
|
||||
public void Tst_save(String raw, String expd) {
|
||||
parser.Save(tmp_bfr, Bry_.new_u8(raw));
|
||||
Tfds.Eq(expd, tmp_bfr.To_str_and_clear());
|
||||
}
|
||||
public void Tst_load(String expd, String raw_str) {
|
||||
byte[] raw = Bry_.new_u8(raw_str);
|
||||
parser.Load(tmp_bfr, raw, 0, raw.length);
|
||||
Tfds.Eq(expd, tmp_bfr.To_str_and_clear());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,261 +13,3 @@ 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.langs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.intls.*;
|
||||
import gplx.xowa.apps.gfs.*;
|
||||
import gplx.xowa.langs.numbers.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.bldrs.*; import gplx.xowa.langs.specials.*;
|
||||
import gplx.xowa.wikis.nss.*;
|
||||
public class Xol_lang_srl {
|
||||
public static Xow_ns[] Load_ns_grps(byte[] src) {
|
||||
int src_len = src.length, pos = 0, fld_bgn = 0;
|
||||
int cur_id = -1;
|
||||
List_adp rv = List_adp_.New(); Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
while (true) {
|
||||
boolean last = pos == src_len; // NOTE: logic occurs b/c of \n}~-> dlm which gobbles up last \n
|
||||
byte b = last ? Byte_ascii.Nl : src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
cur_id = Bry_.To_int_or(src, fld_bgn, pos, Int_.Min_value);
|
||||
if (cur_id == Int_.Min_value) throw Err_.new_wo_type("invalid_id", "id", String_.new_u8(src, fld_bgn, pos));
|
||||
fld_bgn = pos + 1;
|
||||
break;
|
||||
case Byte_ascii.Nl:
|
||||
byte[] cur_name = csv_parser.Load(src, fld_bgn, pos);
|
||||
cur_name = Xoa_ttl.Replace_spaces(cur_name); // NOTE: *.gfs files will have names with \s instead of _; this comes from Language.php which also has same \s convention; EX: "Template talk" instead of "Template_talk"
|
||||
Xow_ns ns = new Xow_ns(cur_id, Xow_ns_case_.Tid__1st, cur_name, false);
|
||||
rv.Add(ns);
|
||||
fld_bgn = pos + 1;
|
||||
cur_id = -1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (last) break;
|
||||
++pos;
|
||||
}
|
||||
return (Xow_ns[])rv.To_ary(Xow_ns.class);
|
||||
}
|
||||
public static void Load_keywords(Xol_kwd_mgr keyword_mgr, byte[] src) {
|
||||
int src_len = src.length, pos = 0, fld_bgn = 0, fld_idx = 0;
|
||||
boolean cur_cs = false; byte[] cur_key = Bry_.Empty;
|
||||
List_adp cur_words = List_adp_.New();
|
||||
Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
while (true) {
|
||||
boolean last = pos == src_len; // NOTE: logic occurs b/c of \n}~-> dlm which gobbles up last \n
|
||||
byte b = last ? Byte_ascii.Nl : src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
switch (fld_idx) {
|
||||
case 0:
|
||||
cur_key = csv_parser.Load(src, fld_bgn, pos);
|
||||
break;
|
||||
case 1:
|
||||
byte cs_byte = src[pos - 1];
|
||||
switch (cs_byte) {
|
||||
case Byte_ascii.Num_0: cur_cs = false; break;
|
||||
case Byte_ascii.Num_1: cur_cs = true; break;
|
||||
default: throw Err_.new_wo_type("case sensitive should be 0 or 1", "cs", Byte_.To_str(cs_byte));
|
||||
}
|
||||
break;
|
||||
}
|
||||
fld_bgn = pos + 1;
|
||||
++fld_idx;
|
||||
break;
|
||||
case Byte_ascii.Tilde:
|
||||
byte[] word = csv_parser.Load(src, fld_bgn, pos);
|
||||
cur_words.Add(word);
|
||||
fld_bgn = pos + 1;
|
||||
break;
|
||||
case Byte_ascii.Nl:
|
||||
if (cur_words.Count() > 0) { // guard against blank line wiping out entries; EX: "toc|0|toc1\n\n"; 2nd \n will get last grp and make 0 entries
|
||||
int cur_id = Xol_kwd_grp_.Id_by_bry(cur_key); if (cur_id == -1) throw Err_.new_wo_type("key does not have id", "id", cur_id);
|
||||
Xol_kwd_grp grp = keyword_mgr.Get_or_new(cur_id);
|
||||
grp.Srl_load(cur_cs, (byte[][])cur_words.To_ary(byte[].class));
|
||||
}
|
||||
fld_bgn = pos + 1;
|
||||
fld_idx = 0;
|
||||
cur_words.Clear();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (last) break;
|
||||
++pos;
|
||||
}
|
||||
// return (Xol_kwd_grp[])rv.To_ary(typeof(Xol_kwd_grp));
|
||||
}
|
||||
public static void Load_messages(Xol_msg_mgr msg_mgr, byte[] src) {
|
||||
int src_len = src.length, pos = 0, fld_bgn = 0;
|
||||
byte[] cur_key = Bry_.Empty;
|
||||
Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
while (true) {
|
||||
boolean last = pos == src_len; // NOTE: logic occurs b/c of \n}~-> dlm which gobbles up last \n
|
||||
byte b = last ? Byte_ascii.Nl : src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
cur_key = csv_parser.Load(src, fld_bgn, pos);
|
||||
fld_bgn = pos + 1;
|
||||
break;
|
||||
case Byte_ascii.Nl:
|
||||
byte[] cur_val = csv_parser.Load(src, fld_bgn, pos);
|
||||
Xol_msg_itm itm = msg_mgr.Itm_by_key_or_new(cur_key).Defined_in_(Xol_msg_itm.Defined_in__lang); // NOTE: this proc should only be called when loading lang.gfs
|
||||
Xol_msg_itm_.update_val_(itm, cur_val);
|
||||
itm.Dirty_(true);
|
||||
fld_bgn = pos + 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (last) break;
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
public static void Load_specials(Xol_specials_mgr special_mgr, byte[] src) {
|
||||
int src_len = src.length, pos = 0, fld_bgn = 0;
|
||||
byte[] cur_key = Bry_.Empty;
|
||||
Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
while (true) {
|
||||
boolean last = pos == src_len; // NOTE: logic occurs b/c of \n}~-> dlm which gobbles up last \n
|
||||
byte b = last ? Byte_ascii.Nl : src[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
cur_key = csv_parser.Load(src, fld_bgn, pos);
|
||||
fld_bgn = pos + 1;
|
||||
break;
|
||||
case Byte_ascii.Nl:
|
||||
byte[] cur_val_raw = csv_parser.Load(src, fld_bgn, pos);
|
||||
byte[][] cur_vals = Bry_split_.Split(cur_val_raw, Byte_ascii.Tilde);
|
||||
special_mgr.Add(cur_key, cur_vals);
|
||||
fld_bgn = pos + 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (last) break;
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
public static void Save_num_mgr(Xoa_gfs_bldr bldr, Xol_num_mgr num_mgr) {
|
||||
Xol_transform_mgr separators_mgr = num_mgr.Separators_mgr(); int separators_len = separators_mgr.Len();
|
||||
Xol_transform_mgr digits_mgr = num_mgr.Digits_mgr(); int digits_len = digits_mgr.Len();
|
||||
byte[] digit_grouping_pattern = num_mgr.Num_grp_fmtr().Digit_grouping_pattern();
|
||||
if (separators_len > 0 || digits_len > 0 || digit_grouping_pattern != null) {
|
||||
bldr.Add_proc_init_one(Xol_lang_itm.Invk_numbers).Add_curly_bgn_nl(); // numbers {
|
||||
if (digit_grouping_pattern != null) {
|
||||
bldr.Add_indent(1).Add_eq_str(Xol_num_mgr.Invk_digit_grouping_pattern, digit_grouping_pattern);
|
||||
}
|
||||
if (separators_len > 0) {
|
||||
bldr.Add_indent(1).Add_proc_init_one(Xol_num_mgr.Invk_separators).Add_curly_bgn_nl(); // separators {
|
||||
bldr.Add_indent(2).Add_proc_init_one(Xol_num_mgr.Invk_clear).Add_term_nl(); // clear;
|
||||
for (int i = 0; i < separators_len; i++) {
|
||||
Keyval kv = separators_mgr.Get_at(i);
|
||||
String k = kv.Key(), v = kv.Val_to_str_or_empty();
|
||||
bldr.Add_indent(2).Add_proc_init_many(Xol_transform_mgr.Invk_set).Add_parens_str_many(k, v).Add_term_nl(); // set('k', 'v');
|
||||
}
|
||||
bldr.Add_indent(1).Add_curly_end_nl(); // }
|
||||
}
|
||||
if (digits_len > 0) {
|
||||
bldr.Add_indent(1).Add_proc_init_one(Xol_num_mgr.Invk_digits).Add_curly_bgn_nl(); // digits {
|
||||
bldr.Add_indent(2).Add_proc_init_one(Xol_num_mgr.Invk_clear).Add_term_nl(); // clear;
|
||||
for (int i = 0; i < digits_len; i++) {
|
||||
Keyval kv = digits_mgr.Get_at(i);
|
||||
String k = kv.Key(), v = kv.Val_to_str_or_empty();
|
||||
bldr.Add_indent(2).Add_proc_init_many(Xol_transform_mgr.Invk_set).Add_parens_str_many(k, v).Add_term_nl(); // set('k', 'v');
|
||||
}
|
||||
bldr.Add_indent(1).Add_curly_end_nl(); // }
|
||||
}
|
||||
bldr.Add_curly_end_nl(); // }
|
||||
}
|
||||
}
|
||||
public static void Save_ns_grps(Xoa_gfs_bldr bldr, Xol_ns_grp ns_grp, String proc_invk) {
|
||||
int ns_grp_len = ns_grp.Len(); Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
if (ns_grp_len == 0) return;
|
||||
Bry_bfr bfr = bldr.Bfr();
|
||||
bldr.Add_proc_cont_one(proc_invk).Add_nl();
|
||||
bldr.Add_indent().Add_proc_cont_one(Invk_load_text).Add_paren_bgn().Add_nl(); // .load_text(\n
|
||||
bldr.Add_quote_xtn_bgn(); // <~{\n'
|
||||
for (int i = 0; i < ns_grp_len; i++) {
|
||||
Xow_ns ns = ns_grp.Get_at(i);
|
||||
bfr.Add_int_variable(ns.Id()).Add_byte_pipe(); // id|
|
||||
csv_parser.Save(bfr, ns.Name_db()); // name
|
||||
bfr.Add_byte_nl(); // \n
|
||||
}
|
||||
bldr.Add_quote_xtn_end(); // ']:>\n
|
||||
bldr.Add_paren_end().Add_proc_cont_one(Invk_lang).Add_nl(); // ).lang\n
|
||||
}
|
||||
public static void Save_specials(Xoa_gfs_bldr bldr, Xol_specials_mgr specials_mgr) {
|
||||
int specials_len = specials_mgr.Len(); Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
if (specials_len == 0) return;
|
||||
Bry_bfr bfr = bldr.Bfr();
|
||||
bldr.Add_proc_cont_one(Xol_lang_itm.Invk_specials).Add_nl();
|
||||
bldr.Add_indent().Add_proc_cont_one(Xol_specials_mgr.Invk_clear).Add_nl();
|
||||
bldr.Add_indent().Add_proc_cont_one(Invk_load_text).Add_paren_bgn().Add_nl(); // .load_text(\n
|
||||
bldr.Add_quote_xtn_bgn(); // <~{\n'
|
||||
for (int i = 0; i < specials_len; i++) {
|
||||
Xol_specials_itm itm = specials_mgr.Get_at(i);
|
||||
bfr.Add(itm.Special()).Add_byte_pipe(); // id|
|
||||
int aliases_len = itm.Aliases().length;
|
||||
for (int j = 0; j < aliases_len; j++) {
|
||||
if (j != 0) bfr.Add_byte(Byte_ascii.Tilde);
|
||||
csv_parser.Save(bfr, itm.Aliases()[j]); // name
|
||||
}
|
||||
bfr.Add_byte_nl(); // \n
|
||||
}
|
||||
bldr.Add_quote_xtn_end(); // ']:>\n
|
||||
bldr.Add_paren_end().Add_proc_cont_one(Invk_lang).Add_nl(); // ).lang\n
|
||||
}
|
||||
public static void Save_keywords(Xoa_gfs_bldr bldr, Xol_kwd_mgr kwd_mgr) {
|
||||
int len = kwd_mgr.Len(); Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
int count = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_kwd_grp grp = kwd_mgr.Get_at(i); if (grp == null) continue; // some items may not be loaded/set by lang
|
||||
++count;
|
||||
}
|
||||
if (count == 0) return;
|
||||
Bry_bfr bfr = bldr.Bfr();
|
||||
bldr.Add_proc_cont_one(Xol_lang_itm.Invk_keywords).Add_nl(); // .keywords\n
|
||||
bldr.Add_indent().Add_proc_cont_one(Invk_load_text).Add_paren_bgn().Add_nl(); // .load_text(\n
|
||||
bldr.Add_quote_xtn_bgn(); // <~{\n'
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_kwd_grp grp = kwd_mgr.Get_at(i); if (grp == null) continue; // some items may not be loaded/set by lang
|
||||
csv_parser.Save(bfr, grp.Key()); // key
|
||||
bfr.Add_byte_pipe(); // |
|
||||
bfr.Add_int_bool(grp.Case_match()).Add_byte_pipe(); // 1|
|
||||
int word_len = grp.Itms().length;
|
||||
for (int j = 0; j < word_len; j++) {
|
||||
Xol_kwd_itm word = grp.Itms()[j];
|
||||
csv_parser.Save(bfr, word.Val()); // word
|
||||
bfr.Add_byte(Byte_ascii.Tilde); // ~
|
||||
}
|
||||
bldr.Add_nl(); // \n
|
||||
}
|
||||
bldr.Add_quote_xtn_end(); // ']:>\n
|
||||
bldr.Add_paren_end().Add_proc_cont_one(Invk_lang).Add_nl(); // ).lang\n
|
||||
}
|
||||
public static void Save_messages(Xoa_gfs_bldr bldr, Xol_msg_mgr msg_mgr, boolean dirty) {
|
||||
int len = msg_mgr.Itms_max(); Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
int count = 0;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_msg_itm itm = msg_mgr.Itm_by_id_or_null(i); if (itm == null) continue; // some items may not be loaded/set by lang
|
||||
if (dirty && !itm.Dirty()) continue; // TEST:
|
||||
++count;
|
||||
}
|
||||
if (count == 0) return;
|
||||
Bry_bfr bfr = bldr.Bfr();
|
||||
bldr.Add_proc_cont_one(Xol_lang_itm.Invk_messages).Add_nl(); // .keywords\n
|
||||
bldr.Add_indent().Add_proc_cont_one(Invk_load_text).Add_paren_bgn().Add_nl(); // .load_text(\n
|
||||
bldr.Add_quote_xtn_bgn(); // <~{\n'
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_msg_itm itm = msg_mgr.Itm_by_id_or_null(i); if (itm == null) continue; // some items may not be loaded/set by lang
|
||||
if (dirty && !itm.Dirty()) continue; // TEST:
|
||||
csv_parser.Save(bfr, itm.Key()); // key
|
||||
bfr.Add_byte_pipe(); // |
|
||||
csv_parser.Save(bfr, itm.Val()); // val
|
||||
bfr.Add_byte_nl(); // \n
|
||||
}
|
||||
bldr.Add_quote_xtn_end(); // ']:>\n
|
||||
bldr.Add_paren_end().Add_proc_cont_one(Invk_lang).Add_nl(); // ).lang\n
|
||||
}
|
||||
public static final String Invk_load_text = "load_text", Invk_lang = "lang";
|
||||
}
|
||||
|
||||
@@ -13,334 +13,3 @@ 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.langs.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*; import gplx.core.strings.*;
|
||||
import gplx.core.intls.*;
|
||||
import gplx.xowa.apps.gfs.*;
|
||||
import gplx.xowa.langs.numbers.*; import gplx.xowa.langs.msgs.*; import gplx.xowa.langs.kwds.*; import gplx.xowa.langs.bldrs.*; import gplx.xowa.langs.specials.*;
|
||||
import gplx.xowa.wikis.nss.*;
|
||||
public class Xol_lang_srl_tst {
|
||||
private Xol_lang_srl_fxt fxt = new Xol_lang_srl_fxt();
|
||||
@Before public void init() {fxt.Clear();}
|
||||
@Test public void Ns_names() {
|
||||
String raw = String_.Concat_lines_nl
|
||||
( "ns_names"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "6|Filex"
|
||||
, "10|Templatex"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
);
|
||||
fxt.Invk(raw);
|
||||
Xol_ns_grp grp = fxt.Lang().Ns_names();
|
||||
fxt.Tst_ns_grp(grp, fxt.ns_(6, "Filex"), fxt.ns_(10, "Templatex"));
|
||||
fxt.Run_save_ns_grp(grp, Xol_lang_itm.Invk_ns_names, raw);
|
||||
}
|
||||
@Test public void Ns_aliases() {
|
||||
String raw = String_.Concat_lines_nl
|
||||
( "ns_aliases"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "6|Filex"
|
||||
, "10|Templatex"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
);
|
||||
fxt.Invk(raw);
|
||||
Xol_ns_grp grp = fxt.Lang().Ns_aliases();
|
||||
fxt.Tst_ns_grp(grp, fxt.ns_(6, "Filex"), fxt.ns_(10, "Templatex"));
|
||||
fxt.Run_save_ns_grp(grp, Xol_lang_itm.Invk_ns_aliases, raw);
|
||||
}
|
||||
@Test public void Kwds() {
|
||||
String raw = String_.Concat_lines_nl // NOTE: notoc must go before toc because ID order
|
||||
( "keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "notoc|1|no_table_of_contents~toc_n~"
|
||||
, "toc|0|table_of_contents~toc_y~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
);
|
||||
fxt.Invk(raw);
|
||||
Xol_kwd_mgr kwd_mgr = fxt.Lang().Kwd_mgr();
|
||||
fxt.Tst_keywords(kwd_mgr, fxt.kwd_("notoc", true, "no_table_of_contents", "toc_n"), fxt.kwd_("toc", false, "table_of_contents", "toc_y"));
|
||||
fxt.Run_save_kwd_mgr(kwd_mgr, Xol_lang_itm.Invk_keywords, raw);
|
||||
}
|
||||
@Test public void Specials() {
|
||||
String raw = String_.Concat_lines_nl // NOTE: notoc must go before toc because ID order
|
||||
( "specials"
|
||||
, " .clear"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "Randompage|PageAuHasard~Page_au_hasard"
|
||||
, "Search|Recherche~Rechercher"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
);
|
||||
fxt.Invk(raw);
|
||||
Xol_specials_mgr specials_mgr = fxt.Lang().Specials_mgr();
|
||||
fxt.Tst_specials(specials_mgr, fxt.special_("Randompage", "PageAuHasard", "Page_au_hasard"), fxt.special_("Search", "Recherche", "Rechercher"));
|
||||
fxt.Run_save_specials_mgr(specials_mgr, Xol_lang_itm.Invk_specials, raw);
|
||||
}
|
||||
@Test public void Kwds_blank_line() { // PURPOSE.fix: extra blank line negates entire entry
|
||||
String raw = String_.Concat_lines_nl
|
||||
( "keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "toc|0|table_of_contents~toc_y~"
|
||||
, ""
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
);
|
||||
fxt.Invk(raw);
|
||||
Xol_kwd_mgr kwd_mgr = fxt.Lang().Kwd_mgr();
|
||||
fxt.Tst_keywords(kwd_mgr, fxt.kwd_("toc", false, "table_of_contents", "toc_y")); // make sure 2 items (and not 0)
|
||||
}
|
||||
@Test public void Msgs() {
|
||||
String raw = String_.Concat_lines_nl
|
||||
( "messages"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "sunday|dimanche"
|
||||
, "monday|lundi"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
);
|
||||
fxt.Invk(raw);
|
||||
Xol_msg_mgr msg_mgr = fxt.Lang().Msg_mgr();
|
||||
fxt.Tst_messages(msg_mgr, fxt.msg_("sunday", "dimanche"), fxt.msg_("monday", "lundi"));
|
||||
fxt.Run_save_msg_mgr(msg_mgr, Xol_lang_itm.Invk_messages, raw);
|
||||
}
|
||||
@Test public void Fallback() {
|
||||
Io_mgr.Instance.SaveFilStr(Xol_lang_itm_.xo_lang_fil_(fxt.App().Fsys_mgr(), "zh-hans"), String_.Concat_lines_nl
|
||||
( "this"
|
||||
, ".keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "toc|0|table_of_contents~toc_y~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ".ns_names"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "6|FileA"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ".messages"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "sunday|sunday1"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ";"
|
||||
));
|
||||
String raw = String_.Concat_lines_nl // NOTE: notoc must go before toc because ID order
|
||||
( "fallback_load('zh-hans')"
|
||||
, ".keywords"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "notoc|1|no_table_of_contents~toc_n~"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ".ns_names"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "6|FileB"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
, ".messages"
|
||||
, " .load_text("
|
||||
, "<:['"
|
||||
, "monday|monday1"
|
||||
, "']:>"
|
||||
, ").lang"
|
||||
);
|
||||
fxt.Invk(raw);
|
||||
Xol_kwd_mgr kwd_mgr = fxt.Lang().Kwd_mgr();
|
||||
fxt.Tst_keywords(kwd_mgr, fxt.kwd_("notoc", true, "no_table_of_contents", "toc_n"), fxt.kwd_("toc", false, "table_of_contents", "toc_y"));
|
||||
fxt.Tst_ns_grp(fxt.Lang().Ns_names(), fxt.ns_(6, "FileA"), fxt.ns_(6, "FileB"));
|
||||
fxt.Tst_messages(fxt.Lang().Msg_mgr(), fxt.msg_("sunday", "sunday1"), fxt.msg_("monday", "monday1"));
|
||||
}
|
||||
@Test public void Fallback_circular() { // PURPOSE: pt and pt-br cite each other as fallback in Messages*.php; DATE:2013-02-18
|
||||
Io_mgr.Instance.SaveFilStr(Xol_lang_itm_.xo_lang_fil_(fxt.App().Fsys_mgr(), "pt") , "fallback_load('pt-br');");
|
||||
Io_mgr.Instance.SaveFilStr(Xol_lang_itm_.xo_lang_fil_(fxt.App().Fsys_mgr(), "pt-br") , "fallback_load('pt');");
|
||||
Xol_lang_itm lang = new Xol_lang_itm(fxt.App().Lang_mgr(), Bry_.new_a7("pt"));
|
||||
lang.Init_by_load();
|
||||
}
|
||||
@Test public void Num_fmt() {
|
||||
String raw = String_.Concat_lines_nl
|
||||
( "numbers {"
|
||||
, " separators {"
|
||||
, " clear;"
|
||||
, " set(',', '.');"
|
||||
, " set('.', ',');"
|
||||
, " }"
|
||||
, "}"
|
||||
);
|
||||
fxt.Invk_no_semic(raw);
|
||||
fxt.Tst_num_fmt("1234,56", "1.234.56"); // NOTE: dot is repeated; confirmed with dewiki and {{formatnum:1234,56}}
|
||||
fxt.Run_save_num_mgr(fxt.Lang().Num_mgr(), raw);
|
||||
}
|
||||
@Test public void Num_fmt_apos() { // PURPOSE:de.ch has apos which breaks gfs
|
||||
fxt .Init_clear()
|
||||
.Init_separators(",", "'")
|
||||
.Init_separators(".", ",")
|
||||
;
|
||||
fxt.Run_save_num_mgr(fxt.Lang().Num_mgr(), String_.Concat_lines_nl
|
||||
( "numbers {"
|
||||
, " separators {"
|
||||
, " clear;"
|
||||
, " set(',', '''');"
|
||||
, " set('.', ',');"
|
||||
, " }"
|
||||
, "}"
|
||||
));
|
||||
}
|
||||
}
|
||||
class Xol_lang_srl_fxt {
|
||||
public void Clear() {
|
||||
app = Xoa_app_fxt.Make__app__edit();
|
||||
lang = new Xol_lang_itm(app.Lang_mgr(), Bry_.new_a7("fr"));
|
||||
Xoa_gfs_mgr.Msg_parser_init(); // required by fallback_load
|
||||
} GfsCtx ctx = GfsCtx.new_(); Xoa_gfs_bldr bldr = new Xoa_gfs_bldr(); //Bry_bfr tmp_bfr = Bry_bfr_.Reset(255);
|
||||
public Xoae_app App() {return app;} private Xoae_app app;
|
||||
public Xol_lang_itm Lang() {return lang;} private Xol_lang_itm lang;
|
||||
public Xow_ns ns_(int id, String s) {return new Xow_ns(id, Xow_ns_case_.Tid__1st, Bry_.new_u8(s), false);}
|
||||
public Xol_specials_itm special_(String key, String... words) {return new Xol_specials_itm(Bry_.new_u8(key), Bry_.Ary(words));}
|
||||
public Xol_kwd_grp kwd_(String key, boolean case_match, String... words) {
|
||||
Xol_kwd_grp rv = new Xol_kwd_grp(Bry_.new_u8(key));
|
||||
rv.Srl_load(case_match, Bry_.Ary(words));
|
||||
return rv;
|
||||
}
|
||||
public Xol_msg_itm msg_(String key, String val) {
|
||||
Xol_msg_itm rv = lang.Msg_mgr().Itm_by_key_or_new(Bry_.new_u8(key));
|
||||
rv.Atrs_set(Bry_.new_u8(val), false, false);
|
||||
return rv;
|
||||
}
|
||||
public Xol_lang_srl_fxt Init_clear() {
|
||||
lang.Num_mgr().Clear();
|
||||
return this;
|
||||
}
|
||||
public Xol_lang_srl_fxt Init_separators(String k, String v) {
|
||||
lang.Num_mgr().Separators_mgr().Set(Bry_.new_u8(k), Bry_.new_u8(v));
|
||||
return this;
|
||||
}
|
||||
public void Invk(String raw) {
|
||||
app.Gfs_mgr().Run_str_for(lang, raw + ";");
|
||||
}
|
||||
public void Invk_no_semic(String raw) {
|
||||
app.Gfs_mgr().Run_str_for(lang, raw);
|
||||
}
|
||||
public void Tst_ns_grp(Xol_ns_grp grp, Xow_ns... expd_ns) {
|
||||
Tfds.Eq_str_lines(Xto_str(expd_ns), Xto_str(To_ary(grp)));
|
||||
}
|
||||
public void Run_save_ns_grp(Xol_ns_grp grp, String invk, String raw) {
|
||||
Xol_lang_srl.Save_ns_grps(bldr, grp, invk);
|
||||
Tfds.Eq_str_lines("." + raw, bldr.Bfr().To_str_and_clear());
|
||||
}
|
||||
public void Run_save_kwd_mgr(Xol_kwd_mgr kwd_mgr, String invk, String raw) {
|
||||
Xol_lang_srl.Save_keywords(bldr, kwd_mgr);
|
||||
Tfds.Eq_str_lines("." + raw, bldr.Bfr().To_str_and_clear());
|
||||
}
|
||||
public void Run_save_msg_mgr(Xol_msg_mgr msg_mgr, String invk, String raw) {
|
||||
Xol_lang_srl.Save_messages(bldr, msg_mgr, true);
|
||||
Tfds.Eq_str_lines("." + raw, bldr.Bfr().To_str_and_clear());
|
||||
}
|
||||
public void Run_save_num_mgr(Xol_num_mgr num_mgr, String raw) {
|
||||
Xol_lang_srl.Save_num_mgr(bldr, num_mgr);
|
||||
Tfds.Eq_str_lines(raw, bldr.Bfr().To_str_and_clear());
|
||||
}
|
||||
public void Run_save_specials_mgr(Xol_specials_mgr specials_mgr, String invk, String raw) {
|
||||
Xol_lang_srl.Save_specials(bldr, specials_mgr);
|
||||
Tfds.Eq_str_lines("." + raw, bldr.Bfr().To_str_and_clear());
|
||||
}
|
||||
public void Tst_num_fmt(String raw, String expd) {Tfds.Eq(expd, String_.new_u8(lang.Num_mgr().Format_num(Bry_.new_u8(raw))));}
|
||||
public void Tst_keywords(Xol_kwd_mgr kwd_mgr, Xol_kwd_grp... ary) {
|
||||
Tfds.Eq_str_lines(Xto_str(ary), Xto_str(To_ary(kwd_mgr)));
|
||||
}
|
||||
public void Tst_messages(Xol_msg_mgr msg_mgr, Xol_msg_itm... ary) {
|
||||
Tfds.Eq_str_lines(Xto_str(ary), Xto_str(To_ary(msg_mgr)));
|
||||
}
|
||||
public void Tst_specials(Xol_specials_mgr specials_mgr, Xol_specials_itm... expd) {
|
||||
Tfds.Eq_str_lines(Xto_str(expd), Xto_str(To_ary(specials_mgr)));
|
||||
}
|
||||
private String Xto_str(Xol_specials_itm[] ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_specials_itm itm = ary[i];
|
||||
sb.Add(itm.Special()).Add("|");
|
||||
int aliases_len = itm.Aliases().length;
|
||||
for (int j = 0; j < aliases_len; j++) {
|
||||
if (j != 0) sb.Add("~");
|
||||
sb.Add(itm.Aliases()[j]).Add_char_nl();
|
||||
}
|
||||
}
|
||||
return sb.To_str_and_clear();
|
||||
}
|
||||
private Xol_specials_itm[] To_ary(Xol_specials_mgr specials_mgr) {
|
||||
int len = specials_mgr.Len();
|
||||
Xol_specials_itm[] rv = new Xol_specials_itm[len];
|
||||
for (int i = 0; i < len; i++)
|
||||
rv[i] = specials_mgr.Get_at(i);
|
||||
return rv;
|
||||
}
|
||||
String Xto_str(Xow_ns[] ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xow_ns ns = ary[i];
|
||||
sb.Add(ns.Id()).Add("|").Add(ns.Name_db_str()).Add_char_nl();
|
||||
}
|
||||
return sb.To_str_and_clear();
|
||||
}
|
||||
Xow_ns[] To_ary(Xol_ns_grp ary) {
|
||||
int len = ary.Len();
|
||||
Xow_ns[] rv = new Xow_ns[len];
|
||||
for (int i = 0; i < len; i++)
|
||||
rv[i] = ary.Get_at(i);
|
||||
return rv;
|
||||
}
|
||||
Xol_kwd_grp[] To_ary(Xol_kwd_mgr kwd_mgr) {
|
||||
int len = kwd_mgr.Len();
|
||||
List_adp rv = List_adp_.New();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_kwd_grp kwd_grp = kwd_mgr.Get_at(i);
|
||||
if (kwd_grp == null) continue;
|
||||
rv.Add(kwd_grp);
|
||||
}
|
||||
return (Xol_kwd_grp[])rv.To_ary(Xol_kwd_grp.class);
|
||||
}
|
||||
String Xto_str(Xol_kwd_grp[] ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_kwd_grp grp = ary[i];
|
||||
sb.Add(grp.Key()).Add("|").Add(grp.Case_match() ? "1" : "0").Add("|");
|
||||
Xol_kwd_itm[] itms = grp.Itms();
|
||||
int itms_len = itms.length;
|
||||
for (int j = 0; j < itms_len; j++) {
|
||||
sb.Add(itms[i].Val()).Add(";");
|
||||
}
|
||||
sb.Add_char_nl();
|
||||
}
|
||||
return sb.To_str_and_clear();
|
||||
}
|
||||
Xol_msg_itm[] To_ary(Xol_msg_mgr msg_mgr) {
|
||||
int len = msg_mgr.Itms_max();
|
||||
List_adp rv = List_adp_.New();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_msg_itm itm = msg_mgr.Itm_by_id_or_null(i);
|
||||
if (itm == null || !itm.Dirty()) continue;
|
||||
rv.Add(itm);
|
||||
}
|
||||
return (Xol_msg_itm[])rv.To_ary(Xol_msg_itm.class);
|
||||
}
|
||||
String Xto_str(Xol_msg_itm[] ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_msg_itm itm = ary[i];
|
||||
sb.Add(itm.Key()).Add("|").Add(itm.Val()).Add_char_nl();
|
||||
}
|
||||
return sb.To_str_and_clear();
|
||||
}
|
||||
private static String_bldr sb = String_bldr_.new_();
|
||||
}
|
||||
|
||||
@@ -13,7 +13,3 @@ 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.langs.plurals; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public interface Xol_plural {
|
||||
byte[] Plural_eval(Xol_lang_itm lang, int count, byte[][] words);
|
||||
}
|
||||
|
||||
@@ -13,30 +13,3 @@ 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.langs.plurals; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_plural_ {
|
||||
public static Xol_plural new_by_lang_id(int lang_id) {
|
||||
switch (lang_id) {
|
||||
case Xol_lang_stub_.Id_ru: return Xol_plural_ru.Instance;
|
||||
default: return Xol_plural__default.Instance;
|
||||
}
|
||||
}
|
||||
public static byte[][] Fill_ary(byte[][] words, int words_len, int reqd_len) {// convert words to an ary of at least reqd_len where new entries are filled with last item; EX: {"a", "b"}, 3 -> {"a", "b", "b"}
|
||||
byte[][] rv = new byte[reqd_len][];
|
||||
byte[] last = words[words_len - 1];
|
||||
for (int i = 0; i < reqd_len; i++)
|
||||
rv[i] = i < words_len ? words[i] : last;
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
class Xol_plural__default implements Xol_plural {
|
||||
public byte[] Plural_eval(Xol_lang_itm lang, int count, byte[][] forms) {
|
||||
int forms_len = forms.length;
|
||||
switch (forms_len) {
|
||||
case 0: return Bry_.Empty; // forms is empty; do nothing
|
||||
case 1: return forms[0]; // only one word specified; use it; REF.MW:$pluralForm = min( $pluralForm, count( $forms ) - 1 );
|
||||
default: return count == 1 ? forms[0] : forms[1]; // TODO_OLD: incorporate plurals.xml logic
|
||||
}
|
||||
}
|
||||
public static final Xol_plural__default Instance = new Xol_plural__default(); Xol_plural__default() {}
|
||||
}
|
||||
|
||||
@@ -13,26 +13,3 @@ 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.langs.plurals; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_plural_ru implements Xol_plural {
|
||||
public byte[] Plural_eval(Xol_lang_itm lang, int count, byte[][] forms) {
|
||||
int forms_len = forms.length;
|
||||
switch (forms_len) {
|
||||
case 0: return null; // forms is empty; do nothing
|
||||
case 2: return count == 1 ? forms[0] : forms[1];
|
||||
default: { // either 1, 3, or >3;
|
||||
if (forms_len == 1) forms = Xol_plural_.Fill_ary(forms, forms_len, 3);
|
||||
if (count > 10 && ((count % 100) / 10) == 1)
|
||||
return forms[2];
|
||||
else {
|
||||
switch (count % 10) {
|
||||
case 1: return forms[0];
|
||||
case 2: case 3: case 4: return forms[1];
|
||||
default: return forms[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public static final Xol_plural_ru Instance = new Xol_plural_ru(); Xol_plural_ru() {}
|
||||
}
|
||||
|
||||
@@ -13,21 +13,3 @@ 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.langs.plurals; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xol_plural_ru_tst {
|
||||
@Test public void Plural() {
|
||||
Tst(1, String_.Ary_empty, null); // 0 forms
|
||||
Tst(1, String_.Ary("a", "b"), "a"); // 2 forms; singluar
|
||||
Tst(2, String_.Ary("a", "b"), "b"); // 2 forms; plural
|
||||
Tst(111, String_.Ary("a", "b", "c"), "c"); // 3 forms; (count % 100) / 10 == 0; should not return "a"
|
||||
Tst(1, String_.Ary("a", "b", "c"), "a"); // 3 forms; count % 10 == 1
|
||||
Tst(2, String_.Ary("a", "b", "c"), "b"); // 3 forms; count % 10 == (2, 3, 4)
|
||||
Tst(5, String_.Ary("a", "b", "c"), "c"); // 3 forms; count % 10 != (1, 2, 3, 4)
|
||||
Tst(5, String_.Ary("a"), "a"); // 1 form; count % 10 != (1, 2, 3, 4); but only 1 element, so take 1st
|
||||
}
|
||||
private void Tst(int count, String[] forms, String expd) {
|
||||
byte[] actl = Xol_plural_ru.Instance.Plural_eval(null, count, Bry_.Ary(forms));
|
||||
Tfds.Eq_bry(Bry_.new_a7(expd), actl);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,9 +13,3 @@ 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.langs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_specials_itm {
|
||||
public Xol_specials_itm(byte[] special, byte[][] aliases) {this.special = special; this.aliases = aliases;}
|
||||
public byte[] Special() {return special;} private byte[] special;
|
||||
public byte[][] Aliases() {return aliases;} private byte[][] aliases;
|
||||
}
|
||||
|
||||
@@ -13,36 +13,3 @@ 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.langs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.parsers.*;
|
||||
public class Xol_specials_mgr implements Gfo_invk {
|
||||
private final Ordered_hash hash_by_special = Ordered_hash_.New_bry(), hash_by_aliases = Ordered_hash_.New_bry();
|
||||
private final Xol_lang_itm lang;
|
||||
public Xol_specials_mgr(Xol_lang_itm lang) {this.lang = lang;}
|
||||
public void Clear() {hash_by_special.Clear();}
|
||||
public int Len() {return hash_by_special.Len();}
|
||||
public Xol_specials_itm Get_at(int i) {return (Xol_specials_itm)hash_by_special.Get_at(i);}
|
||||
public Xol_specials_itm Get_by_alias(byte[] alias) {return (Xol_specials_itm)hash_by_aliases.Get_by(alias);}
|
||||
public Xol_specials_itm Get_by_key(byte[] special) {return (Xol_specials_itm)hash_by_special.Get_by(special);}
|
||||
public void Add(byte[] special, byte[][] alias_ary) {
|
||||
Xol_specials_itm itm = (Xol_specials_itm)hash_by_special.Get_by(special);
|
||||
if (itm == null) { // NOTE: most items will be null, but MessagesCs.php has two entries for PasswordReset; DATE:2016-07-08
|
||||
itm = new Xol_specials_itm(special, alias_ary);
|
||||
hash_by_special.Add(special, itm);
|
||||
}
|
||||
int len = alias_ary.length;
|
||||
for (int i = 0; i < len; i++) {
|
||||
byte[] alias = alias_ary[i];
|
||||
if (!hash_by_aliases.Has(alias))
|
||||
hash_by_aliases.Add(alias, itm);
|
||||
}
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_lang)) return lang;
|
||||
else if (ctx.Match(k, Invk_clear)) this.Clear();
|
||||
else if (ctx.Match(k, Invk_load_text)) Xol_lang_srl.Load_specials(this, m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static final String Invk_lang = "lang", Invk_clear = "clear", Invk_load_text = "load_text";
|
||||
}
|
||||
|
||||
@@ -13,13 +13,3 @@ 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.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xol_vnt_dir_ {
|
||||
public static final int Tid__none = 0, Tid__uni = 1, Tid__bi = 2;
|
||||
public static int Parse(byte[] v) {return hash.Get_as_int_or(v, Tid__none);}
|
||||
private static final byte[] Bry__none = Bry_.new_a7("disable"), Bry__uni = Bry_.new_a7("unidirectional"), Bry__bi = Bry_.new_a7("bidirectional");
|
||||
private static final Hash_adp_bry hash = Hash_adp_bry.cs()
|
||||
.Add_bry_int(Bry__none , Tid__none)
|
||||
.Add_bry_int(Bry__uni , Tid__uni)
|
||||
.Add_bry_int(Bry__bi , Tid__bi);
|
||||
}
|
||||
|
||||
@@ -13,36 +13,3 @@ 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.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.vnts.converts.*;
|
||||
public class Xol_vnt_itm implements Gfo_invk {
|
||||
public Xol_vnt_itm(int idx, byte[] key, byte[] name, int mask__vnt) {
|
||||
this.idx = idx; this.key = key; this.name = name; this.mask__vnt = mask__vnt;
|
||||
this.convert_wkr = new Xol_convert_wkr(key);
|
||||
}
|
||||
public int Idx() {return idx;} private final int idx; // EX: 2
|
||||
public byte[] Key() {return key;} private final byte[] key; // EX: zh-cn
|
||||
public byte[] Name() {return name;} private final byte[] name; // EX: 大陆简体
|
||||
public boolean Visible() {return visible;} private boolean visible = true; // visible in menu
|
||||
public int Mask__vnt() {return mask__vnt;} private final int mask__vnt; // EX: 8
|
||||
public int Mask__fallbacks() {return mask_fallbacks;} private int mask_fallbacks; // EX: 11 for zh,zh-hans,zh-cn
|
||||
public int Dir() {return dir;} private int dir = Xol_vnt_dir_.Tid__bi; // EX: "bidirectional"
|
||||
public byte[][] Fallback_ary() {return fallback_ary;} private byte[][] fallback_ary = Bry_.Ary_empty; // EX: zh-hans|zh
|
||||
public byte[][] Convert_ary() {return convert_ary;} private byte[][] convert_ary = Bry_.Ary_empty; // EX: zh-hans|zh-cn
|
||||
public Xol_convert_wkr Convert_wkr() {return convert_wkr;} private final Xol_convert_wkr convert_wkr;
|
||||
public void Visible_(boolean v) {this.visible = v;}
|
||||
public void Convert_ary_(byte[][] v) {convert_ary = v;}
|
||||
public void Init(int dir, byte[][] fallback_ary) {
|
||||
this.dir = dir; this.fallback_ary = fallback_ary;
|
||||
}
|
||||
public void Mask__fallbacks_(Xol_vnt_regy regy, byte[][] ary) {
|
||||
this.mask_fallbacks = regy.Mask__calc(Bry_.Ary_add(Bry_.Ary(key), ary));// NOTE: must add lang.key which is not part of fallback; EX: "zh-cn" has fallback of "zh-hans", but chain should calc "zh-cn","zh-hans"
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_fallbacks_)) fallback_ary = Bry_split_.Split(m.ReadBry("v"), Byte_ascii.Pipe);
|
||||
else if (ctx.Match(k, Invk_converts_)) Convert_ary_(Bry_split_.Split(m.ReadBry("v"), Byte_ascii.Pipe));
|
||||
else if (ctx.Match(k, Invk_dir_)) dir = Xol_vnt_dir_.Parse(m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_fallbacks_ = "fallbacks_", Invk_converts_ = "converts_", Invk_dir_ = "dir_";
|
||||
}
|
||||
|
||||
@@ -13,59 +13,3 @@ 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.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.langs.vnts.converts.*; import gplx.xowa.parsers.vnts.*;
|
||||
public class Xol_vnt_mgr implements Gfo_invk {
|
||||
public Xol_vnt_mgr(Xol_lang_itm lang) {
|
||||
this.lang = lang;
|
||||
this.convert_lang = new Vnt_convert_lang(convert_mgr, regy);
|
||||
}
|
||||
public Xol_lang_itm Lang() {return lang;} private final Xol_lang_itm lang;
|
||||
public Xol_convert_mgr Convert_mgr() {return convert_mgr;} private final Xol_convert_mgr convert_mgr = new Xol_convert_mgr();
|
||||
public Vnt_convert_lang Convert_lang() {return convert_lang;} private final Vnt_convert_lang convert_lang;
|
||||
public Xol_vnt_regy Regy() {return regy;} private final Xol_vnt_regy regy = new Xol_vnt_regy(); // EX:zh;zh-hans;zh-hant;zh-cn;zh-hk;zh-mo;zh-sg;zh-tw
|
||||
public Xol_vnt_itm Cur_itm() {return cur_itm;} private Xol_vnt_itm cur_itm; // EX:zh-cn
|
||||
public boolean Enabled() {return enabled;} private boolean enabled = false;
|
||||
public String Html__lnki_style() {return html__lnki_style;} private String html__lnki_style = ""; // style for showing vnt lnkis in different colors
|
||||
public void Enabled_(boolean v) {this.enabled = v;} // TEST
|
||||
public Xol_vnt_itm Regy__get_or_new(byte[] key) {
|
||||
Xol_vnt_itm rv = regy.Get_by(key);
|
||||
if (rv == null) {
|
||||
byte[] name = lang.Msg_mgr().Itm_by_key_or_new(Bry_.Add(Msg_variantname, key)).Val();
|
||||
rv = regy.Add(key, name);
|
||||
enabled = true; // NOTE: mark enabled if any vnts have been added
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public void Cur_itm_(byte[] v) {
|
||||
if (Bry_.Len_eq_0(v)) return; // Cfg is empty by default
|
||||
this.cur_itm = regy.Get_by(v); if (cur_itm == null) throw Err_.new_("lang.vnt", "vnt not found", "key", v);
|
||||
}
|
||||
public void Init_end() {
|
||||
int len = regy.Len();
|
||||
for (int i = 0; i < len; ++i) { // calc fallback_flag; needs to be run after all items added, b/c "zh-cn" added before "zh-sg" but "zh-cn" can have "zh-sg" as fallback
|
||||
Xol_vnt_itm itm = regy.Get_at(i);
|
||||
Xol_lang_itm vnt_lang = lang.Lang_mgr().Get_by_or_load(itm.Key()); // load vnt's language in order to get fallback; EX: "zh-mo" to get "zh-hant|zh-hk|zh-tw"
|
||||
itm.Mask__fallbacks_(regy, vnt_lang.Fallback_bry_ary());
|
||||
}
|
||||
convert_mgr.Init(regy); // needs to run at end b/c converts are added one at a time
|
||||
}
|
||||
private void Limit_visibility(byte[][] ary) {
|
||||
int regy_len = regy.Len();
|
||||
for (int i = 0; i < regy_len; ++i)
|
||||
regy.Get_at(i).Visible_(Bool_.N);
|
||||
int ary_len = ary.length;
|
||||
for (int i = 0; i < ary_len; ++i)
|
||||
regy.Get_by(ary[i]).Visible_(Bool_.Y);
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_get)) return Regy__get_or_new(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_init_end)) Init_end();
|
||||
else if (ctx.Match(k, Invk_vnt_grp_)) Limit_visibility(m.ReadBryAry("v", Byte_ascii.Pipe));
|
||||
else if (ctx.Match(k, Invk_cur_vnt_)) Cur_itm_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_html_style_)) html__lnki_style = m.ReadStr("v");
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_get = "get", Invk_init_end = "init_end", Invk_cur_vnt_ = "cur_vnt_", Invk_vnt_grp_ = "vnt_grp_", Invk_html_style_ = "html_style_";
|
||||
private static final byte[] Msg_variantname = Bry_.new_a7("variantname-");
|
||||
}
|
||||
|
||||
@@ -13,47 +13,3 @@ 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.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.core.btries.*; import gplx.core.bits.*;
|
||||
import gplx.xowa.parsers.vnts.*;
|
||||
public class Xol_vnt_regy {
|
||||
private final Hash_adp_bry hash = Hash_adp_bry.ci_a7(); private int hash_len;
|
||||
private final List_adp list = List_adp_.New();
|
||||
public Btrie_slim_mgr Trie() {return trie;} private final Btrie_slim_mgr trie = Btrie_slim_mgr.ci_a7();
|
||||
public int Len() {return hash.Count();}
|
||||
public boolean Has(byte[] k) {return hash.Has(k);}
|
||||
public Xol_vnt_itm Get_at(int i) {return (Xol_vnt_itm)list.Get_at(i);}
|
||||
public Xol_vnt_itm Get_by(byte[] k) {return (Xol_vnt_itm)hash.Get_by(k);}
|
||||
public Xol_vnt_itm Get_by(byte[] s, int b, int e) {return (Xol_vnt_itm)hash.Get_by_mid(s, b, e);}
|
||||
public void Clear() {hash.Clear(); list.Clear(); trie.Clear(); hash_len = 0;}
|
||||
public Xol_vnt_itm Add(byte[] key, byte[] name) {
|
||||
int mask = gplx.core.brys.Bit_.Get_flag(hash_len);
|
||||
Xol_vnt_itm itm = new Xol_vnt_itm(hash_len, key, name, mask);
|
||||
hash.Add(key, itm);
|
||||
list.Add(itm);
|
||||
trie.Add_obj(key, itm);
|
||||
hash_len = hash.Count();
|
||||
return itm;
|
||||
}
|
||||
public int Mask__calc(byte[]... ary) {
|
||||
int rv = 0;
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
byte[] key = ary[i];
|
||||
Xol_vnt_itm itm = (Xol_vnt_itm)hash.Get_by(key); if (itm == null) continue; // handle bad vnt from user input; EX: -{zh;bad|text}-
|
||||
int itm_mask = itm.Mask__vnt();
|
||||
rv = rv == 0 ? itm_mask : Bitmask_.Flip_int(true, rv, itm_mask);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public boolean Mask__match_any(int lhs, int rhs) { // EX: match "zh-cn|zh-hans|zh-hant" against "zh|zh-hans|zh-hant"
|
||||
for (int i = 0; i < hash_len; ++i) {
|
||||
int mask = gplx.core.brys.Bit_.Get_flag(i); // 1,2,4,8
|
||||
if (Bitmask_.Has_int(lhs, mask)) { // lhs has mask; EX: for lhs=6, mask=1 -> 'n'; mask=2 -> 'y'
|
||||
if (Bitmask_.Has_int(rhs, mask)) // if rhs does not have mask, return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false; // should only occur when len = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,48 +13,3 @@ 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.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.parsers.vnts.*;
|
||||
public class Xol_vnt_regy_fxt {
|
||||
private final Xol_vnt_regy mgr = new_chinese();
|
||||
public String[] Make_lang_chain_cn() {return String_.Ary("zh-cn", "zh-hans", "zh-hant", "zh");}
|
||||
public void Test_match_any(boolean expd, String[] lang_chain, String[]... vnt_chain_ary) {
|
||||
int len = vnt_chain_ary.length;
|
||||
int lang_flag = mgr.Mask__calc(Bry_.Ary(lang_chain));
|
||||
for (int i = 0; i < len; ++i) {
|
||||
String[] vnt_chain = vnt_chain_ary[i]; // EX: -{zh;zh-hans;zh-hant}-
|
||||
int vnt_flag = mgr.Mask__calc(Bry_.Ary(vnt_chain));
|
||||
Tfds.Eq(expd, mgr.Mask__match_any(vnt_flag, lang_flag), String_.Concat_with_str(";", vnt_chain) + "<>" + String_.Concat_with_str(";", lang_chain));
|
||||
}
|
||||
}
|
||||
public void Test_calc(String[] ary, int expd) {
|
||||
Tfds.Eq(expd, mgr.Mask__calc(Bry_.Ary(ary)));
|
||||
}
|
||||
public static void Init__vnt_mgr(Xol_vnt_mgr vnt_mgr, int cur_idx, String[] ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Xol_vnt_itm itm = vnt_mgr.Regy__get_or_new(Bry_.new_a7(ary[i]));
|
||||
vnt_mgr.Lang().Lang_mgr().Get_by_or_load(itm.Key()).Fallback_bry_(Bry_.new_a7("zh-hans,zh-hant"));
|
||||
}
|
||||
vnt_mgr.Init_end();
|
||||
vnt_mgr.Cur_itm_(Bry_.new_a7(ary[cur_idx]));
|
||||
}
|
||||
public static Xol_vnt_regy new_chinese() { // REF.MW:/languages/classes/LanguageZh.php|LanguageZh|__construct
|
||||
Xol_vnt_regy rv = new Xol_vnt_regy();
|
||||
new_chinese_vnt(rv, "zh" , Xol_vnt_dir_.Tid__none, "zh-hans", "zh-hant", "zh-cn", "zh-tw", "zh-hk", "zh-sg", "zh-mo", "zh-my");
|
||||
new_chinese_vnt(rv, "zh-hans" , Xol_vnt_dir_.Tid__uni , "zh-cn", "zh-sg", "zh-my");
|
||||
new_chinese_vnt(rv, "zh-hant" , Xol_vnt_dir_.Tid__uni , "zh-tw", "zh-hk", "zh-mo");
|
||||
new_chinese_vnt(rv, "zh-cn" , Xol_vnt_dir_.Tid__bi , "zh-hans", "zh-sg", "zh-my");
|
||||
new_chinese_vnt(rv, "zh-hk" , Xol_vnt_dir_.Tid__bi , "zh-hant", "zh-mo", "zh-tw");
|
||||
new_chinese_vnt(rv, "zh-my" , Xol_vnt_dir_.Tid__bi , "zh-hans", "zh-sg", "zh-cn");
|
||||
new_chinese_vnt(rv, "zh-mo" , Xol_vnt_dir_.Tid__bi , "zh-hant", "zh-hk", "zh-tw");
|
||||
new_chinese_vnt(rv, "zh-sg" , Xol_vnt_dir_.Tid__bi , "zh-hans", "zh-cn", "zh-my");
|
||||
new_chinese_vnt(rv, "zh-tw" , Xol_vnt_dir_.Tid__bi , "zh-hant", "zh-hk", "zh-mo");
|
||||
return rv;
|
||||
}
|
||||
private static void new_chinese_vnt(Xol_vnt_regy regy, String key, int dir, String... fallbacks) {
|
||||
byte[] key_bry = Bry_.new_u8(key);
|
||||
Xol_vnt_itm itm = regy.Add(key_bry, Bry_.Ucase__all(key_bry));
|
||||
itm.Init(dir, Bry_.Ary(fallbacks));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,35 +13,3 @@ 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.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xol_vnt_regy_tst {
|
||||
private final Xol_vnt_regy_fxt fxt = new Xol_vnt_regy_fxt();
|
||||
@Test public void Calc() {
|
||||
fxt.Test_calc(String_.Ary("zh") , 1);
|
||||
fxt.Test_calc(String_.Ary("zh", "zh-hans") , 3);
|
||||
fxt.Test_calc(String_.Ary("zh", "bad") , 1);
|
||||
}
|
||||
@Test public void Match() {
|
||||
String[] lang_chain = fxt.Make_lang_chain_cn(); // zh;zh-hans;zh-hant;zh-cn
|
||||
fxt.Test_match_any(Bool_.Y, lang_chain
|
||||
, String_.Ary("zh")
|
||||
, String_.Ary("zh-hans")
|
||||
, String_.Ary("zh-hant")
|
||||
, String_.Ary("zh-cn")
|
||||
, String_.Ary("zh", "zh-hans")
|
||||
, String_.Ary("zh-cn", "zh-hk")
|
||||
);
|
||||
fxt.Test_match_any(Bool_.N, lang_chain
|
||||
, String_.Ary_empty
|
||||
, String_.Ary("bad")
|
||||
, String_.Ary("zh-hk")
|
||||
, String_.Ary("zh-hk", "zh-sg")
|
||||
);
|
||||
}
|
||||
@Test public void Match_2() {
|
||||
fxt.Test_match_any(Bool_.Y, String_.Ary("zh-hans")
|
||||
, String_.Ary("zh", "zh-hant", "zh-hans")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,48 +13,3 @@ 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.langs.vnts.converts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*;
|
||||
import gplx.xowa.langs.parsers.*;
|
||||
public class Xol_convert_grp implements Gfo_invk {// group of convert_itm by vnt; EX: zh-hant {A -> A1; B -> B1}
|
||||
private final Ordered_hash hash = Ordered_hash_.New_bry();
|
||||
public Xol_convert_grp(byte[] key) {this.key = key;}
|
||||
public byte[] Key() {return key;} private final byte[] key;
|
||||
public int Len() {return hash.Count();}
|
||||
public Xol_convert_itm Get_at(int i) {return (Xol_convert_itm)hash.Get_at(i);}
|
||||
public void Add(byte[] src, byte[] trg) {hash.Add_if_dupe_use_nth(src, new Xol_convert_itm(src, trg));}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_add_bulk)) Add_bulk(this, m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_add_bulk = "add_bulk";
|
||||
private static void Add_bulk(Xol_convert_grp grp, byte[] raw) {
|
||||
int len = raw.length;
|
||||
int pos = 0, fld_bgn = 0, fld_idx = 0;
|
||||
byte[] src = Bry_.Empty, trg = Bry_.Empty;
|
||||
Xol_csv_parser csv_parser = Xol_csv_parser.Instance;
|
||||
while (true) {
|
||||
boolean last = pos == len;
|
||||
byte b = last ? Byte_ascii.Nl : raw[pos];
|
||||
switch (b) {
|
||||
case Byte_ascii.Pipe:
|
||||
switch (fld_idx) {
|
||||
case 0: src = csv_parser.Load(raw, fld_bgn, pos); break;
|
||||
default: throw Err_.new_unhandled(fld_idx);
|
||||
}
|
||||
fld_bgn = pos + 1;
|
||||
++fld_idx;
|
||||
break;
|
||||
case Byte_ascii.Nl:
|
||||
if (fld_bgn < pos) { // guard against trailing new lines
|
||||
trg = csv_parser.Load(raw, fld_bgn, pos);
|
||||
grp.Add(src, trg);
|
||||
}
|
||||
fld_bgn = pos + 1;
|
||||
fld_idx = 0;
|
||||
break;
|
||||
}
|
||||
if (last) break;
|
||||
++pos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,9 +13,3 @@ 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.langs.vnts.converts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*;
|
||||
public class Xol_convert_itm {
|
||||
public Xol_convert_itm(byte[] src, byte[] trg) {this.src = src; this.trg = trg;} // convert from src to trg; EX: A -> A1
|
||||
public byte[] Src() {return src;} private final byte[] src;
|
||||
public byte[] Trg() {return trg;} private final byte[] trg;
|
||||
}
|
||||
|
||||
@@ -13,57 +13,3 @@ 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.langs.vnts.converts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*;
|
||||
import gplx.xowa.wikis.nss.*; import gplx.xowa.wikis.data.tbls.*;
|
||||
public class Xol_convert_mgr {
|
||||
private final Ordered_hash tmp_page_list = Ordered_hash_.New_bry();
|
||||
private final Bry_bfr tmp_bfr = Bry_bfr_.New();
|
||||
public Xol_convert_regy Converter_regy() {return converter_regy;} private final Xol_convert_regy converter_regy = new Xol_convert_regy();
|
||||
public Xol_convert_wkr[] Converter_ary() {return wkr_ary;} private Xol_convert_wkr[] wkr_ary; private int wkr_ary_len;
|
||||
public void Init(Xol_vnt_regy regy) {
|
||||
int len = regy.Len();
|
||||
this.wkr_ary_len = len;
|
||||
this.wkr_ary = new Xol_convert_wkr[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xol_vnt_itm itm = regy.Get_at(i);
|
||||
itm.Convert_wkr().Init(converter_regy, itm.Convert_ary());
|
||||
wkr_ary[i] = itm.Convert_wkr();
|
||||
}
|
||||
}
|
||||
public byte[] Convert_text(int vnt_idx, byte[] src, int bgn, int end) {
|
||||
Xol_convert_wkr converter = wkr_ary[vnt_idx];
|
||||
converter.Convert_text(tmp_bfr, src, bgn, end);
|
||||
return tmp_bfr.To_bry_and_clear();
|
||||
}
|
||||
public Xowd_page_itm Convert_ttl(Xow_wiki wiki, Xoa_ttl ttl) {return Convert_ttl(wiki, ttl.Ns(), ttl.Page_db());} // NOTE: not Full_db as ttl.Ns is passed; EX:Шаблон:Šablon:Jez-eng; PAGE:sr.w:ДНК DATE:2014-07-06
|
||||
public Xowd_page_itm Convert_ttl(Xow_wiki wiki, Xow_ns ns, byte[] ttl_bry) {return Convert_ttl(wiki, tmp_bfr, ns, ttl_bry);}
|
||||
private Xowd_page_itm Convert_ttl(Xow_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) { // REF.MW:LanguageConverter.php|findVariantLink
|
||||
synchronized (tmp_page_list) { // THREAD:
|
||||
int converted = Convert_ttl__convert_each_vnt(wiki, tmp_bfr, ns, ttl_bry); // convert ttl for each vnt
|
||||
if (converted == 0) return Xowd_page_itm.Null; // ttl_bry has no conversions; exit;
|
||||
wiki.Data__core_mgr().Tbl__page().Select_in__ns_ttl(Cancelable_.Never, tmp_page_list, wiki.Ns_mgr(), true, 0, converted); // TODO_OLD: use this call; when defaulting test to use db_mgr, not txt_mgr
|
||||
for (int i = 0; i < converted; i++) {
|
||||
Xowd_page_itm page = (Xowd_page_itm)tmp_page_list.Get_at(i);
|
||||
if (page.Exists()) return page; // return 1st found page
|
||||
}
|
||||
return Xowd_page_itm.Null;
|
||||
}
|
||||
}
|
||||
private int Convert_ttl__convert_each_vnt(Xow_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) {
|
||||
tmp_page_list.Clear();
|
||||
int rv = 0;
|
||||
for (int i = 0; i < wkr_ary_len; i++) { // convert ttl for each variant
|
||||
Xol_convert_wkr converter = wkr_ary[i];
|
||||
tmp_bfr.Clear();
|
||||
if (!converter.Convert_text(tmp_bfr, ttl_bry)) continue; // ttl is not converted for variant; ignore
|
||||
Xoa_ttl ttl = wiki.Ttl_parse(ns.Id(), tmp_bfr.To_bry_and_clear()); // NOTE: must convert to ttl in order to upper 1st letter; EX:{{jez-eng|sense}} -> Jez-eng; PAGE:sr.w:ДНК DATE:2014-07-06
|
||||
if (ttl == null) continue;
|
||||
Xowd_page_itm page = new Xowd_page_itm();
|
||||
page.Ttl_(ns, ttl.Page_db());
|
||||
byte[] converted_ttl = page.Ttl_full_db(); if (tmp_page_list.Has(converted_ttl)) continue;
|
||||
tmp_page_list.Add(converted_ttl, page);
|
||||
++rv;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,23 +13,3 @@ 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.langs.vnts.converts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*;
|
||||
import gplx.xowa.apps.fsys.*;
|
||||
public class Xol_convert_regy implements Gfo_invk { // registry of convert_grp; EX: zh-hans;zh-hant;
|
||||
private final Ordered_hash hash = Ordered_hash_.New_bry();
|
||||
public Xol_convert_grp Get_or_null(byte[] key) {return (Xol_convert_grp)hash.Get_by(key);}
|
||||
public Xol_convert_grp Get_or_make(byte[] key) {
|
||||
Xol_convert_grp rv = (Xol_convert_grp)hash.Get_by(key);
|
||||
if (rv == null) {
|
||||
rv = new Xol_convert_grp(key);
|
||||
hash.Add(key, rv);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_get)) return Get_or_make(m.ReadBry("v"));
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
} private static final String Invk_get = "get";
|
||||
public static Io_url Bld_url(Xoa_fsys_mgr app_fsys_mgr, String lang) {return Bld_url(app_fsys_mgr.Cfg_lang_core_dir(), lang);}
|
||||
public static Io_url Bld_url(Io_url dir, String lang) {return dir.GenSubFil_nest("variants", lang + ".gfs");}
|
||||
}
|
||||
|
||||
@@ -13,79 +13,3 @@ 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.langs.vnts.converts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*;
|
||||
import org.junit.*;
|
||||
import gplx.xowa.langs.vnts.*; import gplx.xowa.wikis.data.tbls.*;
|
||||
import gplx.xowa.drds.*;
|
||||
public class Xol_convert_regy_tst {
|
||||
private final Xol_convert_regy_fxt fxt = new Xol_convert_regy_fxt();
|
||||
@Before public void init() {fxt.Clear();}
|
||||
@Test public void Basic() {
|
||||
// fxt.Parser_fxt().Init_page_create("Template:Test_x1", "val");
|
||||
fxt.Init_page("Template:Test_x1", "val");
|
||||
fxt.Parser_fxt().Test_parse_tmpl_str_test("{{Test_x0}}", "{{test}}", "val");
|
||||
}
|
||||
@Test public void Upper_1st() { // PURPOSE: convert should call Xoa_ttl.Parse(), which will upper 1st letter; EX:{{jez-eng|sense}} -> Jez-eng; PAGE:sr.w:ДНК DATE:2014-07-06
|
||||
fxt.Init_page("Template:X1", "val");
|
||||
fxt.Parser_fxt().Test_parse_tmpl_str_test("{{x0}}", "{{test}}", "val");
|
||||
}
|
||||
@Test public void Redlink() { // PURPOSE: check redlink's Convert_ttl(Xowe_wiki wiki, Xoa_ttl ttl); DATE:2014-07-06
|
||||
fxt.Init_page("Template:Test_x1", "val");
|
||||
fxt.Test_convert_by_ttl("zh", "Template:Test_x0", Bool_.Y); // Template:Test_xo should not be parsed to Template:Template:Test_x0; EX:Шаблон:Šablon:Jez-eng; PAGE:sr.w:ДНК DATE:2014-07-06
|
||||
fxt.Test_convert_by_ttl("zh", "Template:Test_x1", Bool_.N); // note that convert of trg should not find title;
|
||||
fxt.Test_convert_by_ttl("zh", "Template:Test_x2", Bool_.N); // test that non-convert characters return false
|
||||
}
|
||||
@Test public void Pfunc() {
|
||||
fxt.Parser_fxt().Init_defn_clear();
|
||||
fxt.Init_page("Test_x1", "");
|
||||
fxt.Test_parse("{{#ifexist:Test_x0|y|n}}", "y");
|
||||
}
|
||||
}
|
||||
class Xol_convert_regy_fxt {
|
||||
public Xoae_app App() {return app;} private Xoae_app app;
|
||||
public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki;
|
||||
public Xop_fxt Parser_fxt() {return parser_fxt;} private Xop_fxt parser_fxt;
|
||||
public Xowd_data_tstr Data_mgr() {return data_mgr;} private final Xowd_data_tstr data_mgr = new Xowd_data_tstr();
|
||||
public void Clear() {
|
||||
app = Xoa_app_fxt.Make__app__edit();
|
||||
Xol_lang_itm lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7("zh"));
|
||||
Xol_lang_itm_.Lang_init(lang);
|
||||
Init_cnv(app, "zh", "zh-hant", Keyval_.new_("x0", "x1"));
|
||||
wiki = Xoa_app_fxt.Make__wiki__edit(app, "zh.wikipedia.org", lang);
|
||||
Xoa_test_.Init__db__edit(wiki);
|
||||
data_mgr.Wiki_(wiki);
|
||||
gplx.xowa.langs.vnts.Xol_vnt_regy_fxt.Init__vnt_mgr(wiki.Lang().Vnt_mgr(), 1, String_.Ary("zh", "zh-hans", "zh-hant"));
|
||||
parser_fxt = new Xop_fxt(app, wiki);
|
||||
}
|
||||
public void Init_page(String ttl, String wtxt) {Xow_data_fxt.Create(wiki, data_mgr, ttl, wtxt);}
|
||||
public static void Init_cnv(Xoae_app app, String lang_key, String vnt_key, Keyval... ary) {
|
||||
Xol_lang_itm lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7(lang_key));
|
||||
Xol_convert_grp grp = lang.Vnt_mgr().Convert_mgr().Converter_regy().Get_or_make(Bry_.new_a7(vnt_key));
|
||||
int ary_len = ary.length;
|
||||
for (int i = 0; i < ary_len; i++) {
|
||||
Keyval itm = ary[i];
|
||||
grp.Add(Bry_.new_u8(itm.Key()), Bry_.new_u8(itm.Val_to_str_or_empty()));
|
||||
}
|
||||
Xol_vnt_itm vnt_itm = lang.Vnt_mgr().Regy__get_or_new(Bry_.new_a7(vnt_key));
|
||||
vnt_itm.Convert_ary_(Bry_.Ary(vnt_key));
|
||||
vnt_itm.Convert_wkr().Init(lang.Vnt_mgr().Convert_mgr().Converter_regy(), vnt_itm.Convert_ary());
|
||||
}
|
||||
public void Test_parse(String raw, String expd) {
|
||||
parser_fxt.Test_parse_page_all_str(raw, expd);
|
||||
}
|
||||
public void Test_convert_by_ttl(String lang_key, String raw, boolean expd) {
|
||||
Xol_lang_itm lang = app.Lang_mgr().Get_by_or_new(Bry_.new_a7(lang_key));
|
||||
Xoa_ttl ttl = wiki.Ttl_parse(Bry_.new_u8(raw));
|
||||
Xowd_page_itm page = lang.Vnt_mgr().Convert_mgr().Convert_ttl(wiki, ttl);
|
||||
if (expd)
|
||||
Tfds.Eq_true(page.Exists());
|
||||
else
|
||||
Tfds.Eq_null(page);
|
||||
}
|
||||
}
|
||||
class Xow_data_fxt {
|
||||
public static void Create(Xow_wiki wiki, Xowd_data_tstr tstr, String ttl_str, String wtxt) {
|
||||
tstr.Page__insert(1, ttl_str, "2015-10-19 00:01:02");
|
||||
tstr.Text__insert(1, wtxt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,57 +13,3 @@ 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.langs.vnts.converts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*;
|
||||
import gplx.core.btries.*; import gplx.core.intls.*;
|
||||
public class Xol_convert_wkr {
|
||||
private final Btrie_slim_mgr trie = Btrie_slim_mgr.cs(); private final Btrie_rv trv = new Btrie_rv();
|
||||
public Xol_convert_wkr(byte[] key) {this.key = key;}
|
||||
public byte[] Key() {return key;} private final byte[] key;
|
||||
public void Add(byte[] src, byte[] trg) {trie.Add_obj(src, trg);} // called by -{H}-
|
||||
public void Del(byte[] src) {trie.Del(src);} // called by -{-}-
|
||||
public boolean Convert_text(Bry_bfr bfr, byte[] src) {return Convert_text(bfr, src, 0, src.length);}
|
||||
public boolean Convert_text(Bry_bfr bfr, byte[] src, int bgn, int end) {
|
||||
int pos = bgn;
|
||||
boolean matched = false;
|
||||
while (pos < end) {
|
||||
byte b = src[pos];
|
||||
Object o = trie.Match_at_w_b0(trv, b, src, pos, end);
|
||||
if (o == null) { // no match; skip to next char
|
||||
int char_len = Utf8_.Len_of_char_by_1st_byte(b); // NOTE: must increment by char_len, not +1
|
||||
if (matched) {
|
||||
if (char_len == 1)
|
||||
bfr.Add_byte(b);
|
||||
else
|
||||
bfr.Add_mid(src, pos, pos + char_len);
|
||||
}
|
||||
pos += char_len;
|
||||
}
|
||||
else {
|
||||
if (!matched) {
|
||||
bfr.Add_mid(src, bgn, pos); // add everything up to pos
|
||||
matched = true;
|
||||
}
|
||||
bfr.Add((byte[])o);
|
||||
pos = trv.Pos();
|
||||
}
|
||||
}
|
||||
if (!matched) bfr.Add_mid(src, bgn, end); // no convert; make sure to add back src, else bfr will be blank
|
||||
return matched;
|
||||
}
|
||||
public void Init(Xol_convert_regy regy, byte[][] vnt_ary) { // EX: "zh-cn" should add all converts from "zh-hans" "zh-cn" to its wkr
|
||||
trie.Clear();
|
||||
int len = vnt_ary.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
byte[] key = vnt_ary[i];
|
||||
Xol_convert_grp grp = regy.Get_or_null(key); if (grp == null) continue; // vnt may not have convert mapping; EX: zh-my
|
||||
Init_grp(grp);
|
||||
}
|
||||
}
|
||||
private void Init_grp(Xol_convert_grp grp) {
|
||||
int len = grp.Len();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Xol_convert_itm itm = grp.Get_at(i);
|
||||
trie.Add_obj(itm.Src(), itm.Trg()); // NOTE: for dupes, latest value wins
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,129 +13,3 @@ 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.langs.vnts.converts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*; import gplx.xowa.langs.vnts.*;
|
||||
import org.junit.*; import gplx.core.log_msgs.*; import gplx.langs.phps.*;
|
||||
public class Xol_mw_parse_tst {
|
||||
private final Xol_mw_parse_fxt fxt = new Xol_mw_parse_fxt();
|
||||
// @Test public void Basic() {
|
||||
// fxt.Test_convert("$zh2Hant = array('a' => 'A', 'b' => 'B',);", String_.Concat_lines_nl
|
||||
// ( "// zh_zh-hant"
|
||||
// , "app.langs.get('zh').converts.get('zh-hant').add_bulk("
|
||||
// , "<:['"
|
||||
// , "a|A"
|
||||
// , "b|B"
|
||||
// , "']:>"
|
||||
// , ");"
|
||||
// ));
|
||||
// }
|
||||
// @Test public void Run() {
|
||||
// Io_url src_dir = Io_url_.new_dir_("C:\\xowa\\bin\\any\\xowa\\cfg\\lang\\mediawiki\\converts\\");
|
||||
// Io_url trg_dir = Io_url_.new_dir_("C:\\xowa\\bin\\any\\xowa\\cfg\\lang\\");
|
||||
// fxt.Test_run(src_dir, trg_dir);
|
||||
// }
|
||||
@Test public void Ignore() {
|
||||
fxt.toString();
|
||||
}
|
||||
}
|
||||
class Xol_mw_parse_grp {
|
||||
public byte[] Lng() {return lng;} public Xol_mw_parse_grp Lng_(byte[] v) {lng = v; return this;} private byte[] lng;
|
||||
public byte[] Vnt() {return vnt;} public Xol_mw_parse_grp Vnt_(byte[] v) {vnt = v; return this;} private byte[] vnt;
|
||||
public Xol_mw_parse_itm[] Itms() {return itms;} public Xol_mw_parse_grp Itms_(Xol_mw_parse_itm[] v) {itms = v; return this;} private Xol_mw_parse_itm[] itms;
|
||||
public void Write_as_gfs(Bry_bfr bfr) {
|
||||
int itms_len = itms.length;
|
||||
Write_bgn(bfr);
|
||||
for (int i = 0; i < itms_len; i++) {
|
||||
Xol_mw_parse_itm itm = (Xol_mw_parse_itm)itms[i];
|
||||
Write_itm(bfr, itm);
|
||||
}
|
||||
Write_end(bfr);
|
||||
}
|
||||
private void Write_bgn(Bry_bfr bfr) {
|
||||
bfr.Add_str_a7("// ").Add(lng).Add_str_a7("_").Add(vnt).Add_byte_nl();
|
||||
bfr.Add_str_a7("app.langs.get('");
|
||||
bfr.Add(lng);
|
||||
bfr.Add_str_a7("').converts.get('");
|
||||
bfr.Add(vnt);
|
||||
bfr.Add_str_a7("').add_bulk(");
|
||||
bfr.Add_byte_nl().Add_str_a7("<:['").Add_byte_nl();
|
||||
}
|
||||
private void Write_itm(Bry_bfr bfr, Xol_mw_parse_itm itm) {
|
||||
bfr.Add(itm.Src());
|
||||
bfr.Add_byte_pipe();
|
||||
bfr.Add(itm.Trg());
|
||||
bfr.Add_byte_nl();
|
||||
}
|
||||
private void Write_end(Bry_bfr bfr) {
|
||||
bfr.Add_str_a7("']:>").Add_byte_nl();
|
||||
bfr.Add_str_a7(");").Add_byte_nl();
|
||||
}
|
||||
}
|
||||
class Xol_mw_parse_itm {
|
||||
public Xol_mw_parse_itm(byte[] src, byte[] trg) {this.src = src; this.trg = trg;}
|
||||
public byte[] Src() {return src;} private byte[] src;
|
||||
public byte[] Trg() {return trg;} private byte[] trg;
|
||||
}
|
||||
class Xol_mw_parse_fxt {
|
||||
public void Test_convert(String mw, String expd) {
|
||||
Xol_mw_parse_grp[] actl_ary = Parse(Bry_.new_u8(mw));
|
||||
Bry_bfr bfr = Bry_bfr_.New();
|
||||
actl_ary[0].Write_as_gfs(bfr);
|
||||
Tfds.Eq_str_lines(expd, bfr.To_str());
|
||||
}
|
||||
public void Test_run(Io_url src_dir, Io_url trg_dir) {
|
||||
Bry_bfr bfr = Bry_bfr_.New();
|
||||
Io_url[] fils = Io_mgr.Instance.QueryDir_fils(src_dir);
|
||||
int fils_len = fils.length;
|
||||
for (int i = 0; i < fils_len; i++) {
|
||||
Io_url fil = fils[i];
|
||||
byte[] src = Io_mgr.Instance.LoadFilBry(fil);
|
||||
Xol_mw_parse_grp[] itms = Parse(src);
|
||||
int itms_len = itms.length;
|
||||
String lang_name = String_.Lower(String_.Mid(fil.NameOnly(), 0, 2)); // ZhConversion.php -> Zh
|
||||
for (int j = 0; j < itms_len; j++) {
|
||||
Xol_mw_parse_grp itm = itms[j];
|
||||
itm.Write_as_gfs(bfr);
|
||||
}
|
||||
Io_url trg_fil = Xol_convert_regy.Bld_url(trg_dir, lang_name);
|
||||
Io_mgr.Instance.SaveFilBry(trg_fil, bfr.To_bry_and_clear());
|
||||
}
|
||||
}
|
||||
public Xol_mw_parse_grp[] Parse(byte[] src) {
|
||||
List_adp list = List_adp_.New();
|
||||
Php_parser parser = new Php_parser();
|
||||
Gfo_msg_log msg_log = new Gfo_msg_log("xowa");
|
||||
Php_evaluator evaluator = new Php_evaluator(msg_log);
|
||||
parser.Parse_tkns(src, evaluator);
|
||||
Php_line[] lines = (Php_line[])evaluator.List().To_ary(Php_line.class);
|
||||
int lines_len = lines.length;
|
||||
for (int i = 0; i < lines_len; i++) {
|
||||
Php_line_assign line = (Php_line_assign)lines[i];
|
||||
Xol_mw_parse_grp grp = Parse_grp(line);
|
||||
list.Add(grp);
|
||||
}
|
||||
return (Xol_mw_parse_grp[])list.To_ary(Xol_mw_parse_grp.class);
|
||||
}
|
||||
private List_adp tmp_itm_list = List_adp_.New();
|
||||
private Xol_mw_parse_grp Parse_grp(Php_line_assign line) {
|
||||
Xol_mw_parse_grp grp = new Xol_mw_parse_grp();
|
||||
byte[] key = line.Key().Val_obj_bry(); // EX: "zh2Hant"
|
||||
key = Bry_.Lcase__all(key); // EX: "zh2hant"
|
||||
byte[][] parts = Bry_split_.Split(key, Byte_ascii.Num_2); // EX: "zh", "hant"
|
||||
byte[] src = parts[0];
|
||||
byte[] trg = Bry_.Add(parts[0], new byte[] {Byte_ascii.Dash}, parts[1]);
|
||||
grp.Lng_(src).Vnt_(trg);
|
||||
Parse_itms(line, grp);
|
||||
return grp;
|
||||
}
|
||||
private void Parse_itms(Php_line_assign line, Xol_mw_parse_grp grp) {
|
||||
Php_itm_ary ary = (Php_itm_ary)line.Val();
|
||||
tmp_itm_list.Clear();
|
||||
int subs_len = ary.Subs_len();
|
||||
for (int i = 0; i < subs_len; i++) {
|
||||
Php_itm_kv kv = (Php_itm_kv)ary.Subs_get(i);
|
||||
Xol_mw_parse_itm itm = new Xol_mw_parse_itm(kv.Key().Val_obj_bry(), kv.Val().Val_obj_bry());
|
||||
tmp_itm_list.Add(itm);
|
||||
}
|
||||
grp.Itms_((Xol_mw_parse_itm[])tmp_itm_list.To_ary(Xol_mw_parse_itm.class));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user