mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
created collation wkr for wikis specified by wgCategoryCollation
This commit is contained in:
parent
d0769c32b4
commit
e18a0ac82f
@ -19,23 +19,15 @@ package gplx.xowa.addons.wikis.ctgs.htmls.catpages.langs; import gplx.*; import
|
||||
import gplx.core.intls.ucas.*;
|
||||
public class Xoctg_collation_mgr {
|
||||
private final Xow_wiki wiki;
|
||||
private Uca_collator collator;
|
||||
private String collation_name = "uppercase"; // REF:https://noc.wikimedia.org/conf/InitialiseSettings.php.txt|wgCategoryCollation|default
|
||||
private Xoctg_collation_wkr wkr;
|
||||
public Xoctg_collation_mgr(Xow_wiki wiki) {
|
||||
this.wiki = wiki;
|
||||
if (String_.Eq(wiki.Domain_str(), "en.wikipedia.org"))
|
||||
collation_name = "uca-default-kn";
|
||||
this.wkr = new Xoctg_collation_wkr__uppercase(wiki); // REF:https://noc.wikimedia.org/conf/InitialiseSettings.php.txt|wgCategoryCollation|default
|
||||
}
|
||||
public void Collation_name_(String v) {
|
||||
this.collation_name = v;
|
||||
this.wkr = Xoctg_collation_wkr_.Make(wiki, v);
|
||||
}
|
||||
public byte[] Get_sortkey(byte[] src) {
|
||||
if (String_.Eq(collation_name, "uppercase")) {
|
||||
return wiki.Lang().Case_mgr().Case_build_upper(src);
|
||||
}
|
||||
else {
|
||||
if (collator == null) collator = Uca_collator_.New(collation_name, true);
|
||||
return collator.Get_sortkey(String_.new_u8(src));
|
||||
}
|
||||
return wkr.Get_sortkey(src);
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
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.addons.wikis.ctgs.htmls.catpages.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
|
||||
public interface Xoctg_collation_wkr {
|
||||
String Type_name();
|
||||
String Wm_name();
|
||||
byte[] Get_sortkey(byte[] src);
|
||||
}
|
||||
class Xoctg_collation_wkr__uppercase implements Xoctg_collation_wkr {
|
||||
private final Xow_wiki wiki;
|
||||
public Xoctg_collation_wkr__uppercase(Xow_wiki wiki) {this.wiki = wiki;}
|
||||
public String Type_name() {return "uppercase";}
|
||||
public String Wm_name() {return this.Type_name();}
|
||||
public byte[] Get_sortkey(byte[] src) {
|
||||
return wiki.Lang().Case_mgr().Case_build_upper(src);
|
||||
}
|
||||
}
|
||||
class Xoctg_collation_wkr__identity implements Xoctg_collation_wkr {
|
||||
public String Type_name() {return "identity";}
|
||||
public String Wm_name() {return this.Type_name();}
|
||||
public byte[] Get_sortkey(byte[] src) {
|
||||
return src;
|
||||
}
|
||||
}
|
||||
class Xoctg_collation_wkr__uca implements Xoctg_collation_wkr {
|
||||
private gplx.core.intls.ucas.Uca_collator collator;
|
||||
public Xoctg_collation_wkr__uca(String wm_name, String icu_locale) {
|
||||
// REF:"includes/collation/Collation.php|factory" "includes/collation/IcuCollation.php|__construct"
|
||||
this.wm_name = wm_name;
|
||||
// remove anything after "@"; EX: 'svwikisource' => 'uca-sv@collation=standard', // T48058
|
||||
int at_pos = String_.FindFwd(icu_locale, "@");
|
||||
if (at_pos != String_.Find_none)
|
||||
icu_locale = String_.Mid(icu_locale, 0, at_pos);
|
||||
|
||||
// handle "default-u-kn"
|
||||
if (String_.Eq(icu_locale, "default-u-kn"))
|
||||
this.icu_locale = "en";
|
||||
else if (String_.Eq(icu_locale, "root"))
|
||||
this.icu_locale = "en";
|
||||
else
|
||||
this.icu_locale = icu_locale;
|
||||
this.numeric_sorting = String_.Has_at_end(icu_locale, "-u-kn");
|
||||
}
|
||||
public String Type_name() {return wm_name;} private final String wm_name;
|
||||
public String Wm_name() {return this.Type_name();}
|
||||
public String Icu_locale() {return icu_locale;} private final String icu_locale;
|
||||
public boolean Numeric_sorting() {return numeric_sorting;} private final boolean numeric_sorting;
|
||||
public byte[] Get_sortkey(byte[] src) {
|
||||
if (collator == null) collator = gplx.core.intls.ucas.Uca_collator_.New(icu_locale, numeric_sorting);
|
||||
return collator.Get_sortkey(String_.new_u8(src));
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
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.addons.wikis.ctgs.htmls.catpages.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
|
||||
class Xoctg_collation_wkr_ {
|
||||
public static Xoctg_collation_wkr Make(Xow_wiki wiki, String wm_name) {
|
||||
// REF:"includes/collation/Collation.php|factory"
|
||||
if (String_.Eq(wm_name, "uppercase")) return new Xoctg_collation_wkr__uppercase(wiki);
|
||||
else if (String_.Eq(wm_name, "identity")) return new Xoctg_collation_wkr__identity();
|
||||
else if (String_.Eq(wm_name, "uca-default")) return new Xoctg_collation_wkr__uca(wm_name, "root");
|
||||
else if (String_.Eq(wm_name, "xx-uca-ckb")) return new Xoctg_collation_wkr__uca(wm_name, "fa"); // FUTURE:should create custom collation class to do extra logic
|
||||
else if (String_.Eq(wm_name, "xx-uca-et")) return new Xoctg_collation_wkr__uca(wm_name, "et"); // FUTURE:should create custom collation class to do extra logic
|
||||
else {
|
||||
if (String_.Has_at_bgn(wm_name, "uca-"))
|
||||
return new Xoctg_collation_wkr__uca(wm_name, String_.Replace(wm_name, "uca-", ""));
|
||||
else { // unknown collation code; log and exit
|
||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "unknown collation; collation=~{0}", wm_name);
|
||||
return new Xoctg_collation_wkr__uppercase(wiki);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012 gnosygnu@gmail.com
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
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.addons.wikis.ctgs.htmls.catpages.langs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.ctgs.*; import gplx.xowa.addons.wikis.ctgs.htmls.*; import gplx.xowa.addons.wikis.ctgs.htmls.catpages.*;
|
||||
import org.junit.*; import gplx.core.tests.*;
|
||||
public class Xoctg_collation_wkr___tst {
|
||||
private final Xoctg_collation_wkr___fxt fxt = new Xoctg_collation_wkr___fxt();
|
||||
@Test public void Uppercase() {fxt.Test__make("uppercase" , "uppercase");}
|
||||
@Test public void Identity() {fxt.Test__make("identity" , "identity");}
|
||||
@Test public void Unknown() {fxt.Test__make("unknown" , "uppercase");}
|
||||
@Test public void Uca__uca_default() {fxt.Test__make__uca("uca-default" , "en", false);}
|
||||
@Test public void Uca__xx_uca_ckb() {fxt.Test__make__uca("xx-uca-ckb" , "fa", false);}
|
||||
@Test public void Uca__xx_uca_et() {fxt.Test__make__uca("xx-uca-et" , "et", false);}
|
||||
@Test public void Uca__uca_default_u_kn() {fxt.Test__make__uca("uca-default-u-kn" , "en", true);}
|
||||
@Test public void Uca__uca_at_logic() {fxt.Test__make__uca("uca-sv@collation=standard" , "sv", false);}
|
||||
}
|
||||
class Xoctg_collation_wkr___fxt {
|
||||
public void Test__make(String wm_name, String expd_type) {
|
||||
Xoctg_collation_wkr actl = Xoctg_collation_wkr_.Make(null, wm_name);
|
||||
Gftest.Eq__str(expd_type, actl.Type_name());
|
||||
}
|
||||
public void Test__make__uca(String wm_name, String expd_locale, boolean expd_numeric_sorting) {
|
||||
Xoctg_collation_wkr__uca actl = (Xoctg_collation_wkr__uca)Xoctg_collation_wkr_.Make(null, wm_name);
|
||||
Gftest.Eq__str(expd_locale, actl.Icu_locale());
|
||||
Gftest.Eq__bool(expd_numeric_sorting, actl.Numeric_sorting());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user