1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-09-29 23:10:52 +00:00

CldrNames: Handle case-sensitive file systems

This commit is contained in:
gnosygnu 2018-10-14 11:13:37 -04:00
parent a8f6fd0fb0
commit 62f41ebbd3
4 changed files with 102 additions and 28 deletions

View File

@ -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 {

View File

@ -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");

View File

@ -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;
}
}

View 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);
}
}