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;
|
||||
}
|
||||
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 {
|
||||
|
@ -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.*;
|
||||
import org.junit.*; import gplx.core.tests.*;
|
||||
import gplx.langs.phps.*;
|
||||
public class Cldr_name_converter_tst {
|
||||
private final Cldr_name_converter_fxt fxt = new Cldr_name_converter_fxt();
|
||||
@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("CldrNameEn.php" , 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);
|
||||
|
||||
file = fxt.Exec__To_file("En", expd);
|
||||
file = fxt.Exec__Parse_json("En", expd);
|
||||
Assert__parse_fil(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")
|
||||
);
|
||||
}
|
||||
|
||||
@Test public void Smoke() {
|
||||
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\\"));
|
||||
}
|
||||
// @Test public void Smoke() {
|
||||
// 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\\"));
|
||||
// }
|
||||
}
|
||||
class Cldr_name_converter_fxt {
|
||||
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) {
|
||||
return bldr.Parse_fil(key, Bry_.new_u8(src));
|
||||
}
|
||||
public Cldr_name_file Exec__To_file(String key, String json) {
|
||||
Cldr_name_loader json_parser = new Cldr_name_loader(Io_url_.mem_dir_("mem/Cldr"));
|
||||
return json_parser.Load(key, Bry_.new_u8(json));
|
||||
public Cldr_name_file Exec__Parse_json(String key, String json) {
|
||||
Cldr_name_loader loader = new Cldr_name_loader(Io_url_.mem_dir_("mem/Cldr"));
|
||||
return loader.Parse(key, Bry_.new_u8(json));
|
||||
}
|
||||
//
|
||||
public void Test__node(Ordered_hash hash, Keyval... expd) {
|
||||
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");
|
||||
|
@ -18,26 +18,40 @@ import gplx.langs.jsons.*;
|
||||
public class Cldr_name_loader {
|
||||
private final Json_parser parser = new Json_parser();
|
||||
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) {
|
||||
cldr_dir = root_dir.GenSubDir_nest("bin", "any", "xowa", "xtns", "cldr", "CldrNames");
|
||||
public Cldr_name_loader(Io_url cldr_dir) {
|
||||
this.cldr_dir = cldr_dir;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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) {
|
||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "no cldrName file exists for lang; lang=~{lang}", lang_key);
|
||||
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;
|
||||
}
|
||||
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);
|
||||
|
||||
Json_doc jdoc = parser.Parse(json);
|
||||
@ -48,23 +62,45 @@ public class Cldr_name_loader {
|
||||
String key = node.Key_as_str();
|
||||
Json_nde val = node.Val_as_nde();
|
||||
|
||||
Ordered_hash hash = null;
|
||||
if (String_.Eq(key, Cldr_name_converter.Node_languageNames)) 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_currencySymbols)) 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_timeUnits)) hash = file.Time_units();
|
||||
Ordered_hash files_hash = null;
|
||||
if (String_.Eq(key, Cldr_name_converter.Node_languageNames)) files_hash = file.Language_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)) files_hash = file.Currency_symbols();
|
||||
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)) files_hash = file.Time_units();
|
||||
else throw Err_.new_unhandled_default(key);
|
||||
Load_ary(file, hash, val);
|
||||
Load_ary(file, files_hash, val);
|
||||
}
|
||||
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();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Json_kv kv = (Json_kv)nde.Get_at(i);
|
||||
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