From afed865c843f9bcb11a925cf98d5a4cd7b37ba81 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Mon, 3 Aug 2020 08:37:51 -0400 Subject: [PATCH] Scribunto: Implement`'lang` argument for `mw.ext.data.get` [#779] --- .../scribunto/Jscfg_scrib_lib.java | 91 +++- .../scribunto/Jscfg_scrib_lib_tst.java | 400 +++++++++++------- 2 files changed, 309 insertions(+), 182 deletions(-) diff --git a/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib.java b/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib.java index 44e5f9bec..823c1ecc3 100644 --- a/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib.java +++ b/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib.java @@ -1,24 +1,44 @@ -/* -XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012-2017 gnosygnu@gmail.com - -XOWA is licensed under the terms of the General Public License (GPL) Version 3, -or alternatively under the terms of the Apache License Version 2.0. - -You may use XOWA according to either of these licenses as is most appropriate -for your project on a case-by-case basis. - -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.xtns.jsonConfigs.scribunto; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.jsonConfigs.*; -import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.scribunto.libs.*; import gplx.xowa.xtns.scribunto.procs.*; -import gplx.xowa.wikis.domains.*; +/* +XOWA: the XOWA Offline Wiki Application +Copyright (C) 2012-2020 gnosygnu@gmail.com + +XOWA is licensed under the terms of the General Public License (GPL) Version 3, +or alternatively under the terms of the Apache License Version 2.0. + +You may use XOWA according to either of these licenses as is most appropriate +for your project on a case-by-case basis. + +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.xtns.jsonConfigs.scribunto; + +import gplx.Bry_; +import gplx.Byte_ascii; +import gplx.Err_; +import gplx.Gfo_usr_dlg_; +import gplx.Io_url; +import gplx.Keyval; +import gplx.Keyval_; +import gplx.String_; +import gplx.xowa.Xowe_wiki; +import gplx.xowa.langs.Xol_lang_itm; +import gplx.xowa.wikis.domains.Xow_domain_itm_; +import gplx.xowa.xtns.scribunto.Scrib_core; +import gplx.xowa.xtns.scribunto.Scrib_lib; +import gplx.xowa.xtns.scribunto.Scrib_lua_mod; +import gplx.xowa.xtns.scribunto.libs.Scrib_lib_text; +import gplx.xowa.xtns.scribunto.libs.Scrib_lib_text__json_util; +import gplx.xowa.xtns.scribunto.libs.Scrib_lib_title; +import gplx.xowa.xtns.scribunto.procs.Scrib_proc_args; +import gplx.xowa.xtns.scribunto.procs.Scrib_proc_mgr; +import gplx.xowa.xtns.scribunto.procs.Scrib_proc_rslt; + public class Jscfg_scrib_lib implements Scrib_lib { - private final Scrib_lib_text__json_util json_util = new Scrib_lib_text__json_util(); - private final Jscfg_localizer localizer = new Jscfg_localizer(); + private final Scrib_lib_text__json_util json_util = new Scrib_lib_text__json_util(); + private final Jscfg_localizer localizer = new Jscfg_localizer(); private Scrib_core core; public String Key() {return "JCLuaLibrary";} public Scrib_lua_mod Mod() {return mod;} private Scrib_lua_mod mod; @@ -42,7 +62,20 @@ public class Jscfg_scrib_lib implements Scrib_lib { public static final String Invk_get = "get"; private static final String[] Proc_names = String_.Ary(Invk_get); public boolean Get(Scrib_proc_args args, Scrib_proc_rslt rslt) { - byte[] ttl_bry = args.Xstr_bry_or_null(0); + byte[] ttl_bry = args.Xstr_bry_or_null(0); + byte[] langCode = args.Xstr_bry_or_null(1); + + // get language; ISSUE#:779; DATE:2020-08-03 + Xol_lang_itm language = null; + if (langCode == null) { + language = this.core.Wiki().Lang(); + } + else if (!Bry_.Eq(langCode, Byte_ascii.Underline_bry)) { + language = this.core.Wiki().App().Lang_mgr().Get_by_or_null(langCode); + } + else { + language = null; + } // get commons wiki Xowe_wiki commons_wiki = (Xowe_wiki)core.App().Wiki_mgr().Get_by_or_null(Xow_domain_itm_.Bry__commons); @@ -59,8 +92,20 @@ public class Jscfg_scrib_lib implements Scrib_lib { throw Err_.new_wo_type("bad argument #1 to 'get' (not a valid title) " + String_.new_u8(ttl_bry)); } - Keyval[] rv = Scrib_lib_text.JsonDecodeStatic(args, core, json_util, page, Scrib_lib_text__json_util.Opt__force_assoc, Scrib_lib_text__json_util.Flag__none); - rv = localizer.Localize(core.Wiki().Lang(), page, rv); + // get content + Keyval[] rv = null; + if (page == null) { + rv = Keyval_.Ary_empty; + Gfo_usr_dlg_.Instance.Warn_many("", "", "bad argument #1 to 'get' (page does not exist): ~{0}", ttl_bry); + } else { + rv = Scrib_lib_text.JsonDecodeStatic(args, core, json_util, page, Scrib_lib_text__json_util.Opt__force_assoc, Scrib_lib_text__json_util.Flag__none); + if (language == null) { // "_" passed in; return entire document + } + else {// COMMENT:desb42@: sometime should not be called (dewiki) BUT... + rv = localizer.Localize(language, page, rv); + } + } + return rslt.Init_obj(rv); } } diff --git a/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib_tst.java b/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib_tst.java index 0a4a24aa4..6af12b9bf 100644 --- a/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/jsonConfigs/scribunto/Jscfg_scrib_lib_tst.java @@ -1,6 +1,6 @@ /* XOWA: the XOWA Offline Wiki Application -Copyright (C) 2012-2017 gnosygnu@gmail.com +Copyright (C) 2012-2020 gnosygnu@gmail.com XOWA is licensed under the terms of the General Public License (GPL) Version 3, or alternatively under the terms of the Apache License Version 2.0. @@ -13,161 +13,243 @@ 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.xtns.jsonConfigs.scribunto; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*; import gplx.xowa.xtns.jsonConfigs.*; -import org.junit.*; import gplx.core.tests.*; -import gplx.xowa.xtns.scribunto.*; import gplx.xowa.xtns.scribunto.libs.*; -import gplx.xowa.langs.*; import gplx.xowa.langs.names.*; -import gplx.langs.jsons.*; -public class Jscfg_scrib_lib_tst { - private final Jscfg_scrib_lib_fxt fxt = new Jscfg_scrib_lib_fxt(); - @Test public void Get() { - fxt.Init__page("Data:Test.tab", Json_doc.Make_str_by_apos - ( "{" - , " 'data':" - , " [" - , " [" - , " 'Q1'" - , " , 'Data:Q1'" - , " ]" - , " ," - , " [" - , " 'Q2'" - , " , 'Data:Q2'" - , " ]" - , " ]" - , "}" - )); - fxt.Test__get("Test.tab", String_.Concat_lines_nl_skip_last - ( "1=" - , " data=" - , " 1=" - , " 1=Q1" - , " 2=Data:Q1" - , " 2=" - , " 1=Q2" - , " 2=Data:Q2" - )); - } - @Test public void Get_localize() { - fxt.Init__page("Data:Test_localize.tab", Json_doc.Make_str_by_apos - ( "{" - , " 'license': 'CC0-1.0'," - , " 'description': {" - , " 'de': 'Objekttabelle'," - , " 'en': 'Object table'" - , " }," - , " 'sources': 'Objects in Data:Data.tab completed by [https://www.wikidata.org Wikidata]'," - , " 'schema': {" - , " 'fields': [" - , " {" - , " 'name': 'wikidataID'," - , " 'type': 'String'," - , " 'title': {" - , " 'de': 'Wikidata-Item'," - , " 'en': 'Wikidata item'" - , " }" - , " }," - , " {" - , " 'name': 'wikidataLabel'," - , " 'type': 'localized'," - , " 'title': {" - , " 'de': 'Wikidata-Label'," - , " 'en': 'Wikidata label'" - , " }" - , " }" - , " ]" - , " }," - , " 'data': [" - , " [" - , " 'Q183'," - , " {" - , " 'de': 'Deutschland'," - , " 'en': 'Germany'" - , " }" - , " ]," - , " [" - , " 'Q61912'," - , " {" - , " 'de': 'Wertheim'," - , " 'en': 'Wertheim am Main'" - , " }" - , " ]" - , " ]" - , "}" - )); - fxt.Test__get( "Test_localize.tab", String_.Concat_lines_nl_skip_last - ( "1=" - , " license=CC0-1.0" - , " description=Object table" - , " sources=Objects in Data:Data.tab completed by [https://www.wikidata.org Wikidata]" - , " schema=" - , " fields=" - , " 1=" - , " name=wikidataID" - , " type=String" - , " title=Wikidata item" - , " 2=" - , " name=wikidataLabel" - , " type=localized" - , " title=Wikidata label" - , " data=" - , " 1=" - , " 1=Q183" - , " 2=Germany" - , " 2=" - , " 1=Q61912" - , " 2=Wertheim am Main" - )); - } - @Test public void pickLocalizedString() { - Xol_lang_itm lang = fxt.Init__lang("zh-cn", "zh1,zh0"); - - // match key - fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("fr", "zh-cn"), "zh-cn"); - - // match fallback; note that zh1 is higher in fallback list, but lower in kvs - fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("zh0", "zh1"), "zh1"); - - // match en if no key or fallbacks - fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("fr", "en"), "en"); - - // pick 1st if no match - fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("fr", "de"), "fr"); - } -} -class Jscfg_scrib_lib_fxt { - private final Scrib_invoke_func_fxt fxt = new Scrib_invoke_func_fxt(); - private final Jscfg_scrib_lib lib; - private final Xowe_wiki commons_wiki; - public Jscfg_scrib_lib_fxt() { - fxt.Clear_for_lib(); - lib = new Jscfg_scrib_lib(); - lib.Init(); - lib.Core_(fxt.Core()); - this.commons_wiki = fxt.Parser_fxt().Wiki().Appe().Wiki_mgr().Get_by_or_make(gplx.xowa.wikis.domains.Xow_domain_itm_.Bry__commons).Init_assert(); - } - public void Init__page(String page, String text) { - fxt.Parser_fxt().Init_page_create(commons_wiki, page, text); - } - public Xol_lang_itm Init__lang(String key, String fallbacks) { - Xol_lang_itm lang = Xol_lang_itm.New(fxt.Core().App().Lang_mgr(), Bry_.new_u8(key)); - lang.Fallback_bry_(Bry_.new_a7(fallbacks)); - return lang; - } - public Keyval[] Init__picklocalizedStringKvs(String... vals) { - int len = vals.length; - Keyval[] rv = new Keyval[len]; - for (int i = 0; i < len; i++) { - String val = vals[i]; - rv[i] = Keyval_.new_(val, val); - } - return rv; - } - public void Test__get(String page, String expd) { - fxt.Test_scrib_proc_str_ary(lib, Jscfg_scrib_lib.Invk_get, Keyval_.Ary(Keyval_.int_(1, page)), expd); - } - public void Test__pickLocalizedString(Xol_lang_itm lang, Keyval[] kv_ary, String expd) { - Keyval actl_kv = Jscfg_localizer.pickLocalizedString(lang, "key", kv_ary); - Gftest.Eq__obj_or_null(expd, actl_kv.Val()); - } -} +package gplx.xowa.xtns.jsonConfigs.scribunto; + +import gplx.Bry_; +import gplx.Keyval; +import gplx.Keyval_; +import gplx.String_; +import gplx.core.tests.Gftest; +import gplx.langs.jsons.Json_doc; +import gplx.xowa.Xowe_wiki; +import gplx.xowa.langs.Xoa_lang_mgr; +import gplx.xowa.langs.Xol_lang_itm; +import gplx.xowa.xtns.scribunto.Scrib_invoke_func_fxt; +import org.junit.Test; + +public class Jscfg_scrib_lib_tst { + private final Jscfg_scrib_lib_fxt fxt = new Jscfg_scrib_lib_fxt(); + @Test public void Get() { + fxt.Init__page("Data:Test.tab", Json_doc.Make_str_by_apos + ( "{" + , " 'data':" + , " [" + , " [" + , " 'Q1'" + , " , 'Data:Q1'" + , " ]" + , " ," + , " [" + , " 'Q2'" + , " , 'Data:Q2'" + , " ]" + , " ]" + , "}" + )); + fxt.Test__get("Test.tab", String_.Concat_lines_nl_skip_last + ( "1=" + , " data=" + , " 1=" + , " 1=Q1" + , " 2=Data:Q1" + , " 2=" + , " 1=Q2" + , " 2=Data:Q2" + )); + } + @Test public void Get_localize_null() { // null defaults to wiki.Lang + fxt.Init__page__multilingual(); + fxt.Test__get( "Test_localize.tab", null, String_.Concat_lines_nl_skip_last + ( "1=" + , " license=CC0-1.0" + , " description=Object table" + , " sources=Objects in Data:Data.tab completed by [https://www.wikidata.org Wikidata]" + , " schema=" + , " fields=" + , " 1=" + , " name=wikidataID" + , " type=String" + , " title=Wikidata item" + , " 2=" + , " name=wikidataLabel" + , " type=localized" + , " title=Wikidata label" + , " data=" + , " 1=" + , " 1=Q183" + , " 2=Germany" + , " 2=" + , " 1=Q61912" + , " 2=Wertheim am Main" + )); + } + @Test public void Get_localize_underscore() {// underscore retrieves the entire document + fxt.Init__page__multilingual(); + fxt.Test__get( "Test_localize.tab", "_", String_.Concat_lines_nl_skip_last + ( "1=" + , " license=CC0-1.0" + , " description=" + , " de=Objekttabelle" + , " en=Object table" + , " sources=Objects in Data:Data.tab completed by [https://www.wikidata.org Wikidata]" + , " schema=" + , " fields=" + , " 1=" + , " name=wikidataID" + , " type=String" + , " title=" + , " de=Wikidata-Item" + , " en=Wikidata item" + , " 2=" + , " name=wikidataLabel" + , " type=localized" + , " title=" + , " de=Wikidata-Label" + , " en=Wikidata label" + , " data=" + , " 1=" + , " 1=Q183" + , " 2=" + , " de=Deutschland" + , " en=Germany" + , " 2=" + , " 1=Q61912" + , " 2=" + , " de=Wertheim" + , " en=Wertheim am Main" + )); + } + @Test public void Get_localize_de() { + fxt.Init__lang("de", "en"); + fxt.Init__page__multilingual(); + fxt.Test__get( "Test_localize.tab", "de", String_.Concat_lines_nl_skip_last + ( "1=" + , " license=CC0-1.0" + , " description=Objekttabelle" + , " sources=Objects in Data:Data.tab completed by [https://www.wikidata.org Wikidata]" + , " schema=" + , " fields=" + , " 1=" + , " name=wikidataID" + , " type=String" + , " title=Wikidata-Item" + , " 2=" + , " name=wikidataLabel" + , " type=localized" + , " title=Wikidata-Label" + , " data=" + , " 1=" + , " 1=Q183" + , " 2=Deutschland" + , " 2=" + , " 1=Q61912" + , " 2=Wertheim" + )); + } + @Test public void pickLocalizedString() { + Xol_lang_itm lang = fxt.Init__lang("zh-cn", "zh1,zh0"); + + // match key + fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("fr", "zh-cn"), "zh-cn"); + + // match fallback; note that zh1 is higher in fallback list, but lower in kvs + fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("zh0", "zh1"), "zh1"); + + // match en if no key or fallbacks + fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("fr", "en"), "en"); + + // pick 1st if no match + fxt.Test__pickLocalizedString(lang, fxt.Init__picklocalizedStringKvs("fr", "de"), "fr"); + } +} +class Jscfg_scrib_lib_fxt { + private final Scrib_invoke_func_fxt fxt = new Scrib_invoke_func_fxt(); + private final Jscfg_scrib_lib lib; + private final Xowe_wiki commons_wiki; + public Jscfg_scrib_lib_fxt() { + fxt.Clear_for_lib(); + lib = new Jscfg_scrib_lib(); + lib.Init(); + lib.Core_(fxt.Core()); + this.commons_wiki = fxt.Parser_fxt().Wiki().Appe().Wiki_mgr().Get_by_or_make(gplx.xowa.wikis.domains.Xow_domain_itm_.Bry__commons).Init_assert(); + } + public void Init__page(String page, String text) { + fxt.Parser_fxt().Init_page_create(commons_wiki, page, text); + } + public void Init__page__multilingual() { + this.Init__page("Data:Test_localize.tab", Json_doc.Make_str_by_apos + ( "{" + , " 'license': 'CC0-1.0'," + , " 'description': {" + , " 'de': 'Objekttabelle'," + , " 'en': 'Object table'" + , " }," + , " 'sources': 'Objects in Data:Data.tab completed by [https://www.wikidata.org Wikidata]'," + , " 'schema': {" + , " 'fields': [" + , " {" + , " 'name': 'wikidataID'," + , " 'type': 'String'," + , " 'title': {" + , " 'de': 'Wikidata-Item'," + , " 'en': 'Wikidata item'" + , " }" + , " }," + , " {" + , " 'name': 'wikidataLabel'," + , " 'type': 'localized'," + , " 'title': {" + , " 'de': 'Wikidata-Label'," + , " 'en': 'Wikidata label'" + , " }" + , " }" + , " ]" + , " }," + , " 'data': [" + , " [" + , " 'Q183'," + , " {" + , " 'de': 'Deutschland'," + , " 'en': 'Germany'" + , " }" + , " ]," + , " [" + , " 'Q61912'," + , " {" + , " 'de': 'Wertheim'," + , " 'en': 'Wertheim am Main'" + , " }" + , " ]" + , " ]" + , "}" + )); + } + public Xol_lang_itm Init__lang(String key, String fallbacks) { + Xoa_lang_mgr lang_mgr = fxt.Core().App().Lang_mgr(); + + Xol_lang_itm lang = Xol_lang_itm.New(lang_mgr, Bry_.new_u8(key)); + lang.Fallback_bry_(Bry_.new_a7(fallbacks)); + lang_mgr.Add(lang); + + return lang; + } + public Keyval[] Init__picklocalizedStringKvs(String... vals) { + int len = vals.length; + Keyval[] rv = new Keyval[len]; + for (int i = 0; i < len; i++) { + String val = vals[i]; + rv[i] = Keyval_.new_(val, val); + } + return rv; + } + public void Test__get(String page, String expd) { + Test__get(page, null, expd); + } + public void Test__get(String page, String lang, String expd) { + fxt.Test_scrib_proc_str_ary(lib, Jscfg_scrib_lib.Invk_get, Keyval_.Ary(Keyval_.int_(1, page), Keyval_.int_(2, lang)), expd); + } + public void Test__pickLocalizedString(Xol_lang_itm lang, Keyval[] kv_ary, String expd) { + Keyval actl_kv = Jscfg_localizer.pickLocalizedString(lang, "key", kv_ary); + Gftest.Eq__obj_or_null(expd, actl_kv.Val()); + } +}