diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java index ddcbaf1ff..afc3ffb8f 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/Xoctg_catpage_mgr__basic__tst.java @@ -26,7 +26,7 @@ public class Xoctg_catpage_mgr__basic__tst { fxt.Init_itms__pages("A1"); Xoctg_catpage_itm itm = fxt.Ctg().Grp_by_tid(Xoa_ctg_mgr.Tid__page).Itms__get_at(0); itm.Page_ttl_(Xoa_ttl.Null); - itm.Sortkey_handle_make(Bry_bfr_.New(), Bry_.Empty); + itm.Sortkey_handle_make(Bry_bfr_.New(), fxt.Wiki(), Bry_.Empty); fxt.Test__html__page(Xoa_ctg_mgr.Tid__page, Byte_ascii.Ltr_A, "\n
The following 3 pages are in this category, out of 3 total.
" + , "The following 4 pages are in this category, out of 4 total.
" , ""
, " 0-9 cont." , " " , " | "
, " "
@@ -232,6 +233,39 @@ public class Xoctg_catpage_mgr__basic__tst {
, ""
));
}
+ @Test public void Mixed_case_titles() {// PURPOSE: titles in mixed-case should sort under same upper-case letter; ISSUE#:637 DATE:2019-12-14
+ // init main ns to be case-sensitive, so that "A1" and "a2" get sorted into different groups (fr.wikisource)
+ fxt.Wiki().Ns_mgr().Ns_main().Case_match_(gplx.xowa.wikis.nss.Xow_ns_case_.Tid__all);
+
+ // init pages
+ fxt.Init_itms__pages("A1", "a2");
+
+ fxt.Test__html__all(Xoa_ctg_mgr.Tid__page, String_.Concat_lines_nl_skip_last
+ ( ""
+ , " "
+ , " "
+ ));
+ }
@Test public void Calc_col_len() {
fxt.Test__calc_col_len(10, 0, 4); // for 10 items, col 0 has 4 items
fxt.Test__calc_col_len(10, 1, 3); // for 10 items, col 1 has 3 items
@@ -254,7 +288,7 @@ class Xoctg_catpage_mgr_fxt {
ctg_html = wiki.Ctg__catpage_mgr();
}
ctg = new Xoctg_catpage_ctg(1, Bry_.new_a7("Ctg_1"));
- grp_max = 3; // default to 3 paer page
+ grp_max = 3; // default to 3 per page
return this;
} private Xoae_app app; private Xoctg_catpage_mgr ctg_html;
public void Test__calc_col_len(int grp_len, int col_idx, int expd) {Tfds.Eq(expd, Xoctg_fmt_itm_base.Calc_col_len(grp_len, col_idx, 3));}
@@ -267,7 +301,9 @@ class Xoctg_catpage_mgr_fxt {
byte[] actl = ctg_html.Fmt(Xoa_ctg_mgr.Tid__page).Bld_bwd_fwd(wiki, Xoa_ttl.Parse(wiki, Bry_.new_a7(ctg_str)), ctg.Grp_by_tid(Xoa_ctg_mgr.Tid__page), grp_max);
Tfds.Eq_str_lines(expd, String_.new_u8(actl));
}
- public Xoctg_catpage_mgr_fxt Init_itms__pages(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__page, titles);}
+ public Xoctg_catpage_mgr_fxt Init_itms__pages(String... titles) {
+ return Init_itms(Xoa_ctg_mgr.Tid__page, titles);
+ }
public Xoctg_catpage_mgr_fxt Init_itms__files(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__file, titles);}
public Xoctg_catpage_mgr_fxt Init_itms__subcs(String... titles) {return Init_itms(Xoa_ctg_mgr.Tid__subc, titles);}
private Xoctg_catpage_mgr_fxt Init_itms(byte tid, String[] ttls) {
@@ -281,7 +317,7 @@ class Xoctg_catpage_mgr_fxt {
Xoctg_catpage_itm itm = Xoctg_catpage_itm.New_by_ttl(tid, i, ttl);
tmp.Add(itm);
}
- tmp.Make_by_grp(grp);
+ tmp.Make_by_grp(wiki, grp);
return this;
}
public void Test__html__page(byte tid, byte grp_char_0, String expd) {
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java
index f4567d959..fcc376a5c 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/dbs/Xoctg_catlink_loader.java
@@ -55,7 +55,7 @@ class Xoctg_catlink_loader {
// load ns / ttl for each catlink
Xoctg_catpage_grp grp = rv.Grp_by_tid(grp_tid);
- grp.Itms_((Xoctg_catpage_itm[])catlink_hash.To_ary_and_clear(Xoctg_catpage_itm.class));
+ grp.Itms_(wiki, (Xoctg_catpage_itm[])catlink_hash.To_ary_and_clear(Xoctg_catpage_itm.class));
// get zth_itm (for "Next 200" / "Previous 200")
if (catlink_list_len > limit) {
@@ -138,7 +138,7 @@ class Xoctg_catlink_loader {
// make sortkey
byte[] prv_sortkey = grp.Itms__len() == 0 ? Bry_.Empty : grp.Itms__get_at(grp.Itms__len() - 1).Sortkey_handle();
- zth_itm.Sortkey_handle_make(Bry_bfr_.New(), prv_sortkey);
+ zth_itm.Sortkey_handle_make(Bry_bfr_.New(), wiki, prv_sortkey);
}
public static byte[] Build_sortkey_val(Bry_bfr sortkey_val_bfr, byte version, Xoctg_collation_mgr collation_mgr, byte[] url_sortkey) {
// find \n and ignore everything after it; needed else "< 'A\nA'" will pull up "A"; NOTE: can't find logic in MediaWiki CategoryViewer.php; DATE:2016-10-11
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java
index 470b7b49e..5cfeeee33 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_grp.java
@@ -28,7 +28,7 @@ public class Xoctg_catpage_grp {
public void Count_all_(int v) {this.count_all = v;}
public void Prev_disable_(boolean v) {this.prev_disable = v;}
public void Next_sortkey_(byte[] v) {this.next_sortkey = v;}
- public void Itms_(Xoctg_catpage_itm[] v) {
+ public void Itms_(Xow_wiki wiki, Xoctg_catpage_itm[] v) {
this.itms = v;
Array_.Sort(itms, new Xoctg_catpage_itm_sorter()); // NOTE: need to reorder for page_until b/c ORDER BY DESC
@@ -38,7 +38,7 @@ public class Xoctg_catpage_grp {
byte[] prv_sortkey_handle = Bry_.Empty;
for (int i = 0; i < itms_len; ++i) {
Xoctg_catpage_itm itm = itms[i];
- prv_sortkey_handle = itm.Sortkey_handle_make(tmp_bfr, prv_sortkey_handle);
+ prv_sortkey_handle = itm.Sortkey_handle_make(tmp_bfr, wiki, prv_sortkey_handle);
}
}
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java
index 2693f8a5d..433e367f0 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_itm.java
@@ -42,7 +42,7 @@ public class Xoctg_catpage_itm {
// sortkey_binary will be blank for v2,v3; use page_ttl; PAGE:fr.w:Article_contenant_un_appel_à_traduction_en_anglais; DATE:2016-10-11
if (version != Version__4 && Bry_.Len_eq_0(sortkey_binary)) sortkey_binary = page_ttl.Page_txt();
}
- public byte[] Sortkey_handle_make(Bry_bfr tmp_bfr, byte[] prv_sortkey_handle) {
+ public byte[] Sortkey_handle_make(Bry_bfr tmp_bfr, Xow_wiki wiki, byte[] prv_sortkey_handle) {
// page.tbl missing even though in cat_link.tbl; happens for "User:" namespace pages;
if (page_ttl == Xoa_ttl.Null) {
// sortkey_prefix exists; happens for [[Category:A]] as opposed to [[Category:A|some_sortkey_prefix]]; also, {{DEFAULTSORTKEY:some_sortkey_prefix}}
@@ -67,6 +67,7 @@ public class Xoctg_catpage_itm {
}
else {
byte[] sortkey_normalized = Bry_.Replace(sortkey_prefix, Sortkey_prefix_replace__src, Sortkey_prefix_replace__trg);
+ sortkey_normalized = wiki.Lang().Case_mgr().Case_reuse_1st_upper(sortkey_normalized); // ISSUE#:637
tmp_bfr.Add(sortkey_normalized);
tmp_bfr.Add_byte_nl().Add(page_ttl.Page_txt()); // "$prefix\n$unprefixed";
sortkey_handle = tmp_bfr.To_bry_and_clear();
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java
index 77f3022fb..4657da5b3 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/doms/Xoctg_catpage_tmp.java
@@ -20,15 +20,15 @@ public class Xoctg_catpage_tmp {
List_adp list = Get_by_tid(itm.Grp_tid());
list.Add(itm);
}
- public void Make_by_ctg(Xoctg_catpage_ctg ctg) { // TEST:
+ public void Make_by_ctg(Xow_wiki wiki, Xoctg_catpage_ctg ctg) { // TEST:
for (byte tid = 0; tid < Xoa_ctg_mgr.Tid___max; ++tid)
- Make_by_grp(ctg.Grp_by_tid(tid));
+ Make_by_grp(wiki, ctg.Grp_by_tid(tid));
}
- public void Make_by_grp(Xoctg_catpage_grp grp) {
+ public void Make_by_grp(Xow_wiki wiki, Xoctg_catpage_grp grp) {
byte tid = grp.Tid();
List_adp list = Get_by_tid(tid);
if (list.Len() == 0) return;
- grp.Itms_((Xoctg_catpage_itm[])list.To_ary_and_clear(Xoctg_catpage_itm.class));
+ grp.Itms_(wiki, (Xoctg_catpage_itm[])list.To_ary_and_clear(Xoctg_catpage_itm.class));
}
private List_adp Get_by_tid(byte tid) {
switch (tid) {
diff --git a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java
index 77a1048f3..a547fa8d4 100644
--- a/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java
+++ b/400_xowa/src/gplx/xowa/addons/wikis/ctgs/htmls/catpages/fmts/Xoctg_fmt_grp.java
@@ -48,7 +48,7 @@ public class Xoctg_fmt_grp { // subc|page|file
Fmt__ctg.Bld_many(bfr, div_id, msg_label_bry, msg_stats_bry, nav_html, lang.Key_bry(), lang.Dir_ltr_bry(), itms_fmt);
}
public byte[] Bld_bwd_fwd(Xow_wiki wiki, Xoa_ttl ttl, Xoctg_catpage_grp view_grp, int grp_max) { // TEST:
- if (view_grp.Count_all() < grp_max) return Bry_.Empty; // < 200; never show;
+ if (view_grp.Count_all() < grp_max) return Bry_.Empty; // NOTE: must be "<", not "<="; FOOTNOTE:LT_NOT_LTE; DATE:2019-12-14
Bry_bfr bfr = wiki.Utl__bfr_mkr().Get_k004();
Html_nav_bry(bfr, wiki, ttl, view_grp, grp_max, Bool_.N);
Html_nav_bry(bfr, wiki, ttl, view_grp, grp_max, Bool_.Y);
@@ -105,3 +105,21 @@ public class Xoctg_fmt_grp { // subc|page|file
public static Xoctg_fmt_grp New__page() {return new Xoctg_fmt_grp(Xoa_ctg_mgr.Tid__page, new Xoctg_fmt_itm_page(), Xol_msg_itm_.Id_ctg_page_header, Xol_msg_itm_.Id_ctg_page_count, Xoctg_catpage_url_parser.Bry__arg_page_bgn, Xoctg_catpage_url_parser.Bry__arg_page_end, Bry_.new_a7("mw-pages"));}
public static Xoctg_fmt_grp New__file() {return new Xoctg_fmt_grp(Xoa_ctg_mgr.Tid__file, new Xoctg_fmt_itm_file(), Xol_msg_itm_.Id_ctg_file_header, Xol_msg_itm_.Id_ctg_file_count, Xoctg_catpage_url_parser.Bry__arg_file_bgn, Xoctg_catpage_url_parser.Bry__arg_file_end, Bry_.new_a7("mw-category-media"));}
}
+/*
+== LT_NOT_LTE ==
+DATE:2019-12-14
+
+Must be <, not <=.
+
+* Intuitively, it seems like it should be <=. For example, 200 <= 200
+* However, when there are exactly 200 categories, MediaWiki shows "(previous 200) (next 200)" headers but with no links
+* If changed to <=, then the "(previous 200) (next 200)" disappears. This has no meaningful effect, but might as well imitate MW
+
+Tested with following
+* en.wikipedia.org/wiki/Category:1603_births
+* Also, SQL to find other categories
+Pages in category \"Ctg_1\"" + , "The following 2 pages are in this category, out of 2 total. " + , " " + , "+ ATTACH 'en.wikipedia.org-core.xowa' AS page_db; + SELECT c.cat_id, c.cat_pages, p.page_title FROM cat_core c JOIN page_db.page p ON c.cat_id = p.page_id WHERE c.cat_pages = 200 LIMIT 10; ++*/ diff --git a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java index 15e2326c9..e52dd4d76 100644 --- a/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java +++ b/400_xowa/src/gplx/xowa/xtns/dynamicPageList/Dpl_xnde_tst.java @@ -336,7 +336,7 @@ class Dpl_xnde_fxt { Xoctg_catpage_itm catpage_itm = Xoctg_catpage_itm.New_by_ttl(tid, page.Id(), ttl); tmp.Add(catpage_itm); } - tmp.Make_by_ctg(ctg); + tmp.Make_by_ctg(fxt.Wiki(), ctg); Xoctg_catpage_mgr catpage_mgr = fxt.Wiki().Ctg__catpage_mgr(); catpage_mgr.Cache__add(Bry_.new_u8("Category:" + ctg_ttl), ctg); } |