mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v2.7.3.2
This commit is contained in:
@@ -16,10 +16,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xolg_vnt_grp {
|
||||
public class Vnt_mnu_grp {
|
||||
private final List_adp list = List_adp_.new_();
|
||||
public byte[] Text() {return text;} public void Text_(byte[] v) {text = v;} private byte[] text;
|
||||
public int Len() {return list.Count();}
|
||||
public Xolg_vnt_itm Get_at(int i) {return (Xolg_vnt_itm)list.Get_at(i);}
|
||||
public void Add(Xolg_vnt_itm itm) {list.Add(itm);}
|
||||
public Vnt_mnu_itm Get_at(int i) {return (Vnt_mnu_itm)list.Get_at(i);}
|
||||
public void Add(Vnt_mnu_itm itm) {list.Add(itm);}
|
||||
public byte[] Text() {return text;} public void Text_(byte[] v) {text = v;} private byte[] text;
|
||||
}
|
||||
@@ -16,10 +16,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xolg_vnt_grp_fmtr implements Bry_fmtr_arg {
|
||||
private Xolg_vnt_grp grp;
|
||||
private Xolg_vnt_itm_fmtr itm_fmtr = new Xolg_vnt_itm_fmtr();
|
||||
public void Init(Xolg_vnt_grp grp, byte[] page_href, byte[] page_vnt) {
|
||||
public class Vnt_mnu_grp_fmtr implements Bry_fmtr_arg {
|
||||
private Vnt_mnu_grp grp;
|
||||
private final Xolg_vnt_itm_fmtr itm_fmtr = new Xolg_vnt_itm_fmtr();
|
||||
public void Init(Vnt_mnu_grp grp, byte[] page_href, byte[] page_vnt) {
|
||||
this.grp = grp;
|
||||
itm_fmtr.Init(grp, page_href, page_vnt);
|
||||
}
|
||||
@@ -27,7 +27,8 @@ public class Xolg_vnt_grp_fmtr implements Bry_fmtr_arg {
|
||||
fmtr.Bld_bfr_many(bfr, grp.Text(), itm_fmtr);
|
||||
}
|
||||
private static final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
|
||||
( " <div id='p-variants' role='navigation' class='vectorMenu' aria-labelledby='p-variants-label'>"
|
||||
( ""
|
||||
, " <div id='p-variants' role='navigation' class='vectorMenu' aria-labelledby='p-variants-label'>"
|
||||
, " <h3 id='p-variants-label'><span>~{grp_text}</span><a href='#'></a></h3>"
|
||||
, " <div class='menu'>"
|
||||
, " <ul>~{itms}"
|
||||
@@ -38,12 +39,12 @@ public class Xolg_vnt_grp_fmtr implements Bry_fmtr_arg {
|
||||
);
|
||||
}
|
||||
class Xolg_vnt_itm_fmtr implements Bry_fmtr_arg {
|
||||
private Xolg_vnt_grp grp; private byte[] page_href, page_vnt;
|
||||
public void Init(Xolg_vnt_grp grp, byte[] page_href, byte[] page_vnt) {this.grp = grp; this.page_href = page_href; this.page_vnt = page_vnt;}
|
||||
private Vnt_mnu_grp grp; private byte[] page_href, page_vnt;
|
||||
public void Init(Vnt_mnu_grp grp, byte[] page_href, byte[] page_vnt) {this.grp = grp; this.page_href = page_href; this.page_vnt = page_vnt;}
|
||||
public void XferAry(Bry_bfr bfr, int idx) {
|
||||
int len = grp.Len();
|
||||
for (int i = 0; i < len; ++i) {
|
||||
Xolg_vnt_itm itm = grp.Get_at(i);
|
||||
Vnt_mnu_itm itm = grp.Get_at(i);
|
||||
boolean itm_is_selected = Bry_.Eq(itm.Key(), page_vnt);
|
||||
byte[] itm_cls_selected = itm_is_selected ? Itm_cls_selected_y : Bry_.Empty;
|
||||
fmtr.Bld_bfr_many(bfr, i, itm_cls_selected, itm.Key(), itm.Text(), page_href);
|
||||
@@ -17,11 +17,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import org.junit.*;
|
||||
public class Xolg_vnt_grp_fmtr_tst {
|
||||
@Before public void init() {fxt.Clear();} private final Xolg_vnt_grp_fmtr_fxt fxt = new Xolg_vnt_grp_fmtr_fxt();
|
||||
public class Vnt_mnu_grp_fmtr_tst {
|
||||
@Before public void init() {fxt.Clear();} private final Vnt_mnu_grp_fmtr_fxt fxt = new Vnt_mnu_grp_fmtr_fxt();
|
||||
@Test public void Basic() {
|
||||
fxt.Test_to_str("Earth", "zh-hk", String_.Concat_lines_nl_skip_last
|
||||
( " <div id='p-variants' role='navigation' class='vectorMenu' aria-labelledby='p-variants-label'>"
|
||||
( ""
|
||||
, " <div id='p-variants' role='navigation' class='vectorMenu' aria-labelledby='p-variants-label'>"
|
||||
, " <h3 id='p-variants-label'><span>Choose lang</span><a href='#'></a></h3>"
|
||||
, " <div class='menu'>"
|
||||
, " <ul>"
|
||||
@@ -38,13 +39,13 @@ public class Xolg_vnt_grp_fmtr_tst {
|
||||
));
|
||||
}
|
||||
}
|
||||
class Xolg_vnt_grp_fmtr_fxt {
|
||||
private Xolg_vnt_grp vnt_grp;
|
||||
class Vnt_mnu_grp_fmtr_fxt {
|
||||
private Vnt_mnu_grp vnt_grp;
|
||||
public void Clear() {
|
||||
this.Init_grp("Choose lang", "zh-hans", "Simplified", "zh-hant", "Traditional", "zh-cn", "China", "zh-hk", "Hong Kong", "zh-mo", "Macau", "zh-sg", "Singapore", "zh-tw", "Taiwan");
|
||||
}
|
||||
public void Init_grp(String text, String... langs) {
|
||||
vnt_grp = new Xolg_vnt_grp();
|
||||
vnt_grp = new Vnt_mnu_grp();
|
||||
vnt_grp.Text_(Bry_.new_u8(text));
|
||||
int len = langs.length;
|
||||
String lang_code = "";
|
||||
@@ -53,13 +54,13 @@ class Xolg_vnt_grp_fmtr_fxt {
|
||||
if (i % 2 == 0)
|
||||
lang_code = lang;
|
||||
else {
|
||||
Xolg_vnt_itm itm = new Xolg_vnt_itm(Bry_.new_u8(lang_code), Bry_.new_u8(lang));
|
||||
Vnt_mnu_itm itm = new Vnt_mnu_itm(Bry_.new_u8(lang_code), Bry_.new_u8(lang));
|
||||
vnt_grp.Add(itm);
|
||||
}
|
||||
}
|
||||
}
|
||||
public void Test_to_str(String page_href, String selected_vnt, String expd) {
|
||||
Xolg_vnt_grp_fmtr vnt_grp_fmtr = new Xolg_vnt_grp_fmtr();
|
||||
Vnt_mnu_grp_fmtr vnt_grp_fmtr = new Vnt_mnu_grp_fmtr();
|
||||
Bry_bfr bfr = Bry_bfr.new_();
|
||||
vnt_grp_fmtr.Init(vnt_grp, Bry_.new_u8(page_href), Bry_.new_u8(selected_vnt));
|
||||
vnt_grp_fmtr.XferAry(bfr, 0);
|
||||
@@ -16,8 +16,8 @@ You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
public class Xolg_vnt_itm {
|
||||
public Xolg_vnt_itm(byte[] key, byte[] text) {this.key = key; this.text = text;}
|
||||
public class Vnt_mnu_itm {
|
||||
public Vnt_mnu_itm(byte[] key, byte[] text) {this.key = key; this.text = text;}
|
||||
public byte[] Key() {return key;} private final byte[] key;
|
||||
public byte[] Text() {return text;} private final byte[] text;
|
||||
}
|
||||
@@ -18,27 +18,43 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.xowa.langs.vnts; import gplx.*; import gplx.xowa.*; import gplx.xowa.langs.*;
|
||||
import gplx.xowa.wikis.data.tbls.*;
|
||||
public class Xol_vnt_mgr implements GfoInvkAble {
|
||||
private Ordered_hash vnts = Ordered_hash_.new_bry_();
|
||||
private int converter_ary_len; private Ordered_hash tmp_page_list = Ordered_hash_.new_bry_();
|
||||
private final Ordered_hash vnts = Ordered_hash_.new_bry_(); private int converter_ary_len, cur_converter_ary_idx = -1;
|
||||
private final Ordered_hash tmp_page_list = Ordered_hash_.new_bry_();
|
||||
public Xol_vnt_mgr(Xol_lang lang) {this.lang = lang;}
|
||||
public Xol_lang Lang() {return lang;} private final Xol_lang lang;
|
||||
public Xol_vnt_converter[] Converter_ary() {return converter_ary;} private Xol_vnt_converter[] converter_ary;
|
||||
public Xolg_vnt_grp Vnt_grp() {return vnt_grp;} private Xolg_vnt_grp vnt_grp = new Xolg_vnt_grp();
|
||||
public Xolg_vnt_grp_fmtr Vnt_mnu_fmtr() {return vnt_mnu_fmtr;} private Xolg_vnt_grp_fmtr vnt_mnu_fmtr = new Xolg_vnt_grp_fmtr();
|
||||
public Xol_lang Lang() {return lang;} private Xol_lang lang;
|
||||
public byte[] Cur_vnt() {return cur_vnt;} public Xol_vnt_mgr Cur_vnt_(byte[] v) {cur_vnt = v; return this;} private byte[] cur_vnt = Bry_.Empty;
|
||||
public Vnt_mnu_grp Vnt_grp() {return vnt_grp;} private final Vnt_mnu_grp vnt_grp = new Vnt_mnu_grp();
|
||||
public Vnt_mnu_grp_fmtr Vnt_mnu_fmtr() {return vnt_mnu_fmtr;} private final Vnt_mnu_grp_fmtr vnt_mnu_fmtr = new Vnt_mnu_grp_fmtr();
|
||||
public boolean Enabled() {return enabled;} public void Enabled_(boolean v) {this.enabled = v;} private boolean enabled = false;
|
||||
public byte[] Cur_vnt() {return cur_vnt;} private byte[] cur_vnt = Bry_.Empty;
|
||||
private void Vnt_grp_(byte[][] ary) {
|
||||
int len = ary.length;
|
||||
for (int i = 0; i < len; ++i) {
|
||||
byte[] vnt = ary[i];
|
||||
byte[] msg = lang.Msg_mgr().Itm_by_key_or_new(Bry_.Add(Msg_variantname, vnt)).Val();
|
||||
// byte[] msg = vnt;
|
||||
vnt_grp.Add(new Vnt_mnu_itm(vnt, msg));
|
||||
}
|
||||
}
|
||||
private static final byte[] Msg_variantname = Bry_.new_a7("variantname-");
|
||||
public String Html_style() {return html_style;} private String html_style = "";
|
||||
public Xol_vnt_mgr Cur_vnt_(byte[] v) {
|
||||
int new_converter_ary_idx = -1;
|
||||
for (int i = 0; i < converter_ary_len; i++) {
|
||||
Xol_vnt_converter itm = converter_ary[i];
|
||||
if (Bry_.Eq(v, itm.Owner().Key())) {
|
||||
new_converter_ary_idx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (new_converter_ary_idx == -1) throw Err_.new_("lang.vnt", "uknown vnt", "key", v);
|
||||
this.cur_vnt = v;
|
||||
this.cur_converter_ary_idx = new_converter_ary_idx;
|
||||
return this;
|
||||
}
|
||||
public void Init_by_wiki(Xowe_wiki wiki) {
|
||||
if (!enabled) return;
|
||||
Xop_vnt_lxr_.set_(wiki);
|
||||
// VNT
|
||||
// vnt_grp.Add(new Xolg_vnt_itm(Bry_.new_a7("zh-hans"), Bry_.new_a7("Simplified")));
|
||||
// vnt_grp.Add(new Xolg_vnt_itm(Bry_.new_a7("zh-hant"), Bry_.new_a7("Traditional")));
|
||||
// vnt_grp.Add(new Xolg_vnt_itm(Bry_.new_a7("zh-cn"), Bry_.new_a7("China")));
|
||||
// vnt_grp.Add(new Xolg_vnt_itm(Bry_.new_a7("zh-hk"), Bry_.new_a7("Hong Kong")));
|
||||
// vnt_grp.Add(new Xolg_vnt_itm(Bry_.new_a7("zh-mo"), Bry_.new_a7("Macau")));
|
||||
// vnt_grp.Add(new Xolg_vnt_itm(Bry_.new_a7("zh-sg"), Bry_.new_a7("Singapore")));
|
||||
// vnt_grp.Add(new Xolg_vnt_itm(Bry_.new_a7("zh-tw"), Bry_.new_a7("Taiwan")));
|
||||
}
|
||||
public Xol_vnt_itm Get_or_new(byte[] key) {
|
||||
Xol_vnt_itm rv = (Xol_vnt_itm)vnts.Get_by(key);
|
||||
@@ -49,6 +65,13 @@ public class Xol_vnt_mgr implements GfoInvkAble {
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public byte[] Convert_text(Xowe_wiki wiki, byte[] src) {return Convert_text(wiki, src, 0, src.length);}
|
||||
public byte[] Convert_text(Xowe_wiki wiki, byte[] src, int bgn, int end) {
|
||||
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_m001();
|
||||
Xol_vnt_converter converter = converter_ary[cur_converter_ary_idx];
|
||||
converter.Convert_text(tmp_bfr, src, bgn, end);
|
||||
return tmp_bfr.To_bry_and_rls();
|
||||
}
|
||||
public void Convert_ttl_init() {
|
||||
int vnts_len = vnts.Count();
|
||||
converter_ary_len = vnts_len;
|
||||
@@ -67,39 +90,42 @@ public class Xol_vnt_mgr implements GfoInvkAble {
|
||||
return rv;
|
||||
}
|
||||
public Xowd_page_itm Convert_ttl(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) { // REF.MW:LanguageConverter.php|findVariantLink
|
||||
int converted = Convert_ttl_convert(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;
|
||||
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.Db_mgr().Load_mgr().Load_by_ttls(Cancelable_.Never, tmp_page_list, true, 0, converted);
|
||||
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
|
||||
if (page.Exists()) return page; // return 1st found page
|
||||
}
|
||||
return Xowd_page_itm.Null;
|
||||
}
|
||||
private int Convert_ttl_convert(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) {
|
||||
tmp_page_list.Clear();
|
||||
int rv = 0;
|
||||
for (int i = 0; i < converter_ary_len; i++) { // convert ttl for each variant
|
||||
Xol_vnt_converter converter = converter_ary[i];
|
||||
tmp_bfr.Clear();
|
||||
if (!converter.Convert_text(tmp_bfr, ttl_bry)) continue; // ttl is not converted for variant; ignore
|
||||
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ns.Id(), tmp_bfr.Xto_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;
|
||||
private int Convert_ttl__convert_each_vnt(Xowe_wiki wiki, Bry_bfr tmp_bfr, Xow_ns ns, byte[] ttl_bry) {
|
||||
synchronized (tmp_page_list) {
|
||||
tmp_page_list.Clear();
|
||||
int rv = 0;
|
||||
for (int i = 0; i < converter_ary_len; i++) { // convert ttl for each variant
|
||||
Xol_vnt_converter converter = converter_ary[i];
|
||||
tmp_bfr.Clear();
|
||||
if (!converter.Convert_text(tmp_bfr, ttl_bry)) continue; // ttl is not converted for variant; ignore
|
||||
Xoa_ttl ttl = Xoa_ttl.parse_(wiki, ns.Id(), tmp_bfr.Xto_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;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_get)) return Get_or_new(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_init_end)) Convert_ttl_init();
|
||||
else if (ctx.Match(k, Invk_cur_vnt_)) cur_vnt = m.ReadBry("v");
|
||||
else if (ctx.Match(k, Invk_vnt_grp_)) Vnt_grp_(m.ReadBryAry("v", Byte_ascii.Pipe));
|
||||
else if (ctx.Match(k, Invk_cur_vnt_)) Cur_vnt_(m.ReadBry("v"));
|
||||
else if (ctx.Match(k, Invk_html_style_)) html_style = m.ReadStr("v");
|
||||
else return GfoInvkAble_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk_get = "get", Invk_init_end = "init_end", Invk_cur_vnt_ = "cur_vnt_", Invk_html_style_ = "html_style_";
|
||||
} private static final String Invk_get = "get", Invk_init_end = "init_end", Invk_cur_vnt_ = "cur_vnt_", Invk_html_style_ = "html_style_", Invk_vnt_grp_ = "vnt_grp_";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user