mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
CldrNames: Handle case-sensitive file systems
This commit is contained in:
parent
a8f6fd0fb0
commit
62f41ebbd3
@ -233,7 +233,8 @@ public class Xol_name_mgr {
|
|||||||
return returnMw;
|
return returnMw;
|
||||||
}
|
}
|
||||||
public static Xol_name_mgr New(Io_url root_dir) {
|
public static Xol_name_mgr New(Io_url root_dir) {
|
||||||
return new Xol_name_mgr(new Cldr_name_loader(root_dir), new Language_name_loader(root_dir), root_dir);
|
Io_url cldr_dir = root_dir.GenSubDir_nest("bin", "any", "xowa", "xtns", "cldr", "CldrNames");
|
||||||
|
return new Xol_name_mgr(new Cldr_name_loader(cldr_dir), new Language_name_loader(root_dir), root_dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class Hash_kv_sorter implements gplx.core.lists.ComparerAble {
|
class Hash_kv_sorter implements gplx.core.lists.ComparerAble {
|
||||||
|
@ -15,11 +15,11 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
|||||||
*/
|
*/
|
||||||
package gplx.xowa.xtns.cldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
|
package gplx.xowa.xtns.cldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
|
||||||
import org.junit.*; import gplx.core.tests.*;
|
import org.junit.*; import gplx.core.tests.*;
|
||||||
import gplx.langs.phps.*;
|
|
||||||
public class Cldr_name_converter_tst {
|
public class Cldr_name_converter_tst {
|
||||||
private final Cldr_name_converter_fxt fxt = new Cldr_name_converter_fxt();
|
private final Cldr_name_converter_fxt fxt = new Cldr_name_converter_fxt();
|
||||||
@Test public void Extract_key_or_fail() {
|
@Test public void Extract_key_or_fail() {
|
||||||
fxt.Test__Extract_key_or_fail("CldrNamesEn.php" , "En");
|
fxt.Test__Extract_key_or_fail("CldrNamesEn.php" , "En");
|
||||||
|
fxt.Test__Extract_key_or_fail("CldrNamesEn.php" , "en");
|
||||||
fxt.Test__Extract_key_or_fail("CldrNameEn.php" , null);
|
fxt.Test__Extract_key_or_fail("CldrNameEn.php" , null);
|
||||||
fxt.Test__Extract_key_or_fail("CldrNamesEn.txt" , null);
|
fxt.Test__Extract_key_or_fail("CldrNamesEn.txt" , null);
|
||||||
}
|
}
|
||||||
@ -85,7 +85,7 @@ public class Cldr_name_converter_tst {
|
|||||||
);
|
);
|
||||||
fxt.Test__To_json(file, expd);
|
fxt.Test__To_json(file, expd);
|
||||||
|
|
||||||
file = fxt.Exec__To_file("En", expd);
|
file = fxt.Exec__Parse_json("En", expd);
|
||||||
Assert__parse_fil(file);
|
Assert__parse_fil(file);
|
||||||
}
|
}
|
||||||
private void Assert__parse_fil(Cldr_name_file file) {
|
private void Assert__parse_fil(Cldr_name_file file) {
|
||||||
@ -111,11 +111,10 @@ public class Cldr_name_converter_tst {
|
|||||||
, Keyval_.new_("year-short-past-other", "{0} yr. ago")
|
, Keyval_.new_("year-short-past-other", "{0} yr. ago")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// @Test public void Smoke() {
|
||||||
@Test public void Smoke() {
|
// Cldr_name_converter bldr = new Cldr_name_converter();
|
||||||
Cldr_name_converter bldr = new Cldr_name_converter();
|
// bldr.Convert(Io_url_.new_dir_("C:\\000\\100_bin\\200_server\\200_http\\100_apache\\100_v2.4\\htdocs\\mediawiki\\v1.29.1\\extensions\\cldr\\CldrNames\\"), Io_url_.new_dir_("C:\\xowa\\bin\\any\\xowa\\xtns\\cldr\\"));
|
||||||
bldr.Convert(Io_url_.new_dir_("C:\\000\\100_bin\\200_server\\200_http\\100_apache\\100_v2.4\\htdocs\\mediawiki\\v1.29.1\\extensions\\cldr\\CldrNames\\"), Io_url_.new_dir_("C:\\xowa\\bin\\any\\xowa\\xtns\\cldr\\"));
|
// }
|
||||||
}
|
|
||||||
}
|
}
|
||||||
class Cldr_name_converter_fxt {
|
class Cldr_name_converter_fxt {
|
||||||
private final Cldr_name_converter bldr = new Cldr_name_converter();
|
private final Cldr_name_converter bldr = new Cldr_name_converter();
|
||||||
@ -151,10 +150,11 @@ class Cldr_name_converter_fxt {
|
|||||||
public Cldr_name_file Exec__Parse_fil(String key, String src) {
|
public Cldr_name_file Exec__Parse_fil(String key, String src) {
|
||||||
return bldr.Parse_fil(key, Bry_.new_u8(src));
|
return bldr.Parse_fil(key, Bry_.new_u8(src));
|
||||||
}
|
}
|
||||||
public Cldr_name_file Exec__To_file(String key, String json) {
|
public Cldr_name_file Exec__Parse_json(String key, String json) {
|
||||||
Cldr_name_loader json_parser = new Cldr_name_loader(Io_url_.mem_dir_("mem/Cldr"));
|
Cldr_name_loader loader = new Cldr_name_loader(Io_url_.mem_dir_("mem/Cldr"));
|
||||||
return json_parser.Load(key, Bry_.new_u8(json));
|
return loader.Parse(key, Bry_.new_u8(json));
|
||||||
}
|
}
|
||||||
|
//
|
||||||
public void Test__node(Ordered_hash hash, Keyval... expd) {
|
public void Test__node(Ordered_hash hash, Keyval... expd) {
|
||||||
Keyval[] actl = (Keyval[])hash.To_ary(Keyval.class);
|
Keyval[] actl = (Keyval[])hash.To_ary(Keyval.class);
|
||||||
Gftest.Eq__ary__lines(Keyval_.Ary_to_str(expd), Keyval_.Ary_to_str(actl), "cldr_names_comp_failed");
|
Gftest.Eq__ary__lines(Keyval_.Ary_to_str(expd), Keyval_.Ary_to_str(actl), "cldr_names_comp_failed");
|
||||||
|
@ -18,26 +18,40 @@ import gplx.langs.jsons.*;
|
|||||||
public class Cldr_name_loader {
|
public class Cldr_name_loader {
|
||||||
private final Json_parser parser = new Json_parser();
|
private final Json_parser parser = new Json_parser();
|
||||||
private final Io_url cldr_dir;
|
private final Io_url cldr_dir;
|
||||||
private final Hash_adp hash = Hash_adp_.New();
|
private final Hash_adp files_hash = Hash_adp_.New();
|
||||||
|
private Hash_adp urls_hash;
|
||||||
|
private static final String Token_cldr_names = "CldrNames", Token_json_ext = ".json";
|
||||||
|
|
||||||
public Cldr_name_loader(Io_url root_dir) {
|
public Cldr_name_loader(Io_url cldr_dir) {
|
||||||
cldr_dir = root_dir.GenSubDir_nest("bin", "any", "xowa", "xtns", "cldr", "CldrNames");
|
this.cldr_dir = cldr_dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Cldr_name_file Load(String lang_key) {
|
public Cldr_name_file Load(String lang_key) {
|
||||||
Cldr_name_file file = (Cldr_name_file)hash.Get_by(lang_key);
|
// normalize to lc; scrib will pass lower_case, but underlying files are Title_case
|
||||||
|
lang_key = String_.Lower(lang_key);
|
||||||
|
|
||||||
|
// return file if already exists
|
||||||
|
Cldr_name_file file = (Cldr_name_file)files_hash.Get_by(lang_key);
|
||||||
if (file != null) return file;
|
if (file != null) return file;
|
||||||
|
|
||||||
byte[] json = Io_mgr.Instance.LoadFilBry(cldr_dir.GenSubFil_ary("CldrNames", lang_key, ".json"));
|
// create urls_hash from dir if it doesn't exist
|
||||||
|
if (urls_hash == null)
|
||||||
|
urls_hash = Make_urls_hash(Io_mgr.Instance.QueryDir_fils(cldr_dir));
|
||||||
|
|
||||||
|
// get file
|
||||||
|
Io_url url = (Io_url)urls_hash.Get_by_or_fail(lang_key);
|
||||||
|
byte[] json = Io_mgr.Instance.LoadFilBry(url);
|
||||||
if (json == null) {
|
if (json == null) {
|
||||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "no cldrName file exists for lang; lang=~{lang}", lang_key);
|
Gfo_usr_dlg_.Instance.Warn_many("", "", "no cldrName file exists for lang; lang=~{lang}", lang_key);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
file = Load(lang_key, json);
|
|
||||||
hash.Add(lang_key, file);
|
// parse, cache and return
|
||||||
|
file = Parse(lang_key, json);
|
||||||
|
files_hash.Add(lang_key, file);
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
public Cldr_name_file Load(String lang_key, byte[] json) {
|
public Cldr_name_file Parse(String lang_key, byte[] json) { // TEST
|
||||||
Cldr_name_file file = new Cldr_name_file(lang_key);
|
Cldr_name_file file = new Cldr_name_file(lang_key);
|
||||||
|
|
||||||
Json_doc jdoc = parser.Parse(json);
|
Json_doc jdoc = parser.Parse(json);
|
||||||
@ -48,23 +62,45 @@ public class Cldr_name_loader {
|
|||||||
String key = node.Key_as_str();
|
String key = node.Key_as_str();
|
||||||
Json_nde val = node.Val_as_nde();
|
Json_nde val = node.Val_as_nde();
|
||||||
|
|
||||||
Ordered_hash hash = null;
|
Ordered_hash files_hash = null;
|
||||||
if (String_.Eq(key, Cldr_name_converter.Node_languageNames)) hash = file.Language_names();
|
if (String_.Eq(key, Cldr_name_converter.Node_languageNames)) files_hash = file.Language_names();
|
||||||
else if (String_.Eq(key, Cldr_name_converter.Node_currencyNames)) hash = file.Currency_names();
|
else if (String_.Eq(key, Cldr_name_converter.Node_currencyNames)) files_hash = file.Currency_names();
|
||||||
else if (String_.Eq(key, Cldr_name_converter.Node_currencySymbols)) hash = file.Currency_symbols();
|
else if (String_.Eq(key, Cldr_name_converter.Node_currencySymbols)) files_hash = file.Currency_symbols();
|
||||||
else if (String_.Eq(key, Cldr_name_converter.Node_countryNames)) hash = file.Country_names();
|
else if (String_.Eq(key, Cldr_name_converter.Node_countryNames)) files_hash = file.Country_names();
|
||||||
else if (String_.Eq(key, Cldr_name_converter.Node_timeUnits)) hash = file.Time_units();
|
else if (String_.Eq(key, Cldr_name_converter.Node_timeUnits)) files_hash = file.Time_units();
|
||||||
else throw Err_.new_unhandled_default(key);
|
else throw Err_.new_unhandled_default(key);
|
||||||
Load_ary(file, hash, val);
|
Load_ary(file, files_hash, val);
|
||||||
}
|
}
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
private void Load_ary(Cldr_name_file file, Ordered_hash hash, Json_nde nde) {
|
private void Load_ary(Cldr_name_file file, Ordered_hash files_hash, Json_nde nde) {
|
||||||
int len = nde.Len();
|
int len = nde.Len();
|
||||||
for (int i = 0; i < len; i++) {
|
for (int i = 0; i < len; i++) {
|
||||||
Json_kv kv = (Json_kv)nde.Get_at(i);
|
Json_kv kv = (Json_kv)nde.Get_at(i);
|
||||||
String key = kv.Key_as_str();
|
String key = kv.Key_as_str();
|
||||||
hash.Add(key, Keyval_.new_(key, String_.new_u8(kv.Val_as_bry())));
|
files_hash.Add(key, Keyval_.new_(key, String_.new_u8(kv.Val_as_bry())));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private static Hash_adp Make_urls_hash(Io_url[] urls) {
|
||||||
|
// filenames will have format of CldrNamesEn.json; build a hash of (en, "CldrNamesEn.json"); needed for case-sensitive file-systems; DATE:2018-10-14
|
||||||
|
Hash_adp rv = Hash_adp_.New();
|
||||||
|
for (Io_url url : urls) {
|
||||||
|
String name = url.NameAndExt();
|
||||||
|
if (String_.Has_at_bgn(name, Token_cldr_names))
|
||||||
|
name = String_.Mid(name, String_.Len(Token_cldr_names), String_.Len(name));
|
||||||
|
else {
|
||||||
|
Gfo_usr_dlg_.Instance.Warn_many("", "", "file name does not start with " + Token_cldr_names + " ; url=" + url.Raw());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (String_.Has_at_end(name, Token_json_ext))
|
||||||
|
name = String_.Mid(name, 0, String_.Len(name) - String_.Len(Token_json_ext));
|
||||||
|
else {
|
||||||
|
Gfo_usr_dlg_.Instance.Warn_many("", "", "file name does not end with " + Token_json_ext + " ; url=" + url.Raw());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
name = String_.Lower(name);
|
||||||
|
rv.Add_if_dupe_use_1st(name, url);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
37
400_xowa/src/gplx/xowa/xtns/cldrs/Cldr_name_loader_tst.java
Normal file
37
400_xowa/src/gplx/xowa/xtns/cldrs/Cldr_name_loader_tst.java
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
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.cldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.xtns.*;
|
||||||
|
import org.junit.*; import gplx.core.tests.*;
|
||||||
|
public class Cldr_name_loader_tst {
|
||||||
|
private final Cldr_name_loader_fxt fxt = new Cldr_name_loader_fxt();
|
||||||
|
@Test public void Load_file_is_null() {
|
||||||
|
fxt.Init__file("CldrNamesEn.json", "{}");
|
||||||
|
fxt.Test__load_file_is_null(Bool_.N, "En");
|
||||||
|
fxt.Test__load_file_is_null(Bool_.N, "en"); // NOTE: scrib will pass "en", but earlier implementation was trying to read CldrNamesen.json which failed on LNX; DATE:2018-10-14
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class Cldr_name_loader_fxt {
|
||||||
|
private static final String Dir_name = "mem/CldrNames/";
|
||||||
|
private final Cldr_name_loader name_loader = new Cldr_name_loader(Io_url_.mem_dir_(Dir_name));
|
||||||
|
|
||||||
|
public void Init__file(String fil_name, String txt) {
|
||||||
|
Io_mgr.Instance.SaveFilStr(Io_url_.new_fil_(Dir_name + fil_name), txt);
|
||||||
|
}
|
||||||
|
public void Test__load_file_is_null(boolean expd, String lang_key) {
|
||||||
|
Cldr_name_file name_file = name_loader.Load(lang_key);
|
||||||
|
Gftest.Eq__bool(expd, name_file == null);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user