1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2026-03-02 03:49:30 +00:00

v2.10.3.1

This commit is contained in:
gnosygnu
2015-10-18 22:17:57 -04:00
parent 8e18af05b6
commit 4f43f51b18
1935 changed files with 12500 additions and 12889 deletions

View File

@@ -1,85 +0,0 @@
/*
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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
public class Xow_lang_grp implements GfoInvkAble {
public int Id() {return id;} private int id;
public byte[] Key() {return key;} private byte[] key;
public byte[] Name() {return name;} public Xow_lang_grp Name_(byte[] v) {name = v; return this;} private byte[] name;
public int Sort_idx() {return sort_idx;} public Xow_lang_grp Sort_idx_(int v) {sort_idx = v; return this;} private int sort_idx = 0;
public byte Sort_mode() {return sort_mode;} public Xow_lang_grp Sort_mode_(byte v) {sort_mode = v; return this;} private byte sort_mode = Sort_mode_page_name;
public Xow_lang_itm[] Itms() {if (itms == null) itms = (Xow_lang_itm[])itm_list.To_ary(Xow_lang_itm.class); return itms;} private Xow_lang_itm[] itms;
public int Itms_len() {return this.Itms().length;}
public Xow_lang_itm Itms_get(int i) {return this.Itms()[i];}
public void Itms_add(Xow_lang_itm itm) {itms = null; itm_list.Add(itm);} List_adp itm_list = List_adp_.new_();
public void Itms_active_len_add_one_() {++itms_active_len;}
public int Itms_active_len() {return itms_active_len;} private int itms_active_len;
public void Itms_reset() {
Xow_lang_itm[] itms_ary = this.Itms();
int itms_len = itms_ary.length;
for (int i = 0; i < itms_len; i++)
itms_ary[i].Atrs_set(null, false, null); // clear out pre-existing page names; needed b/c this struct is a singleton for entire wiki
itms_active_len = 0;
}
public Bry_fmtr Html_all() {return html_all;} Bry_fmtr html_all; public Xow_lang_grp Html_all_(String s) {html_all = Bry_fmtr.new_(s, "all_name", "grps"); return this;}
public byte[] Html_grp_bgn() {return html_grp_bgn;} private byte[] html_grp_bgn = Bry_.new_a7("\n <tr>");
public byte[] Html_grp_end() {return html_grp_end;} private byte[] html_grp_end = Bry_.new_a7("\n </tr>");
public Bry_fmtr Html_itm() {return html_itm;} Bry_fmtr html_itm; public Xow_lang_grp Html_itm_(String s) {html_itm = Bry_fmtr.new_(s, "lang_code", "lang_domain", "lang_name", "lang_href", "pagename_translation", "page_badge"); return this;}
public void Html_bld(Bry_bfr bfr, Xowe_wiki wiki) {
Xow_lang_itm[] itms_ary = this.Itms();
if (sort_mode == Xow_lang_grp.Sort_mode_page_name)
Array_.Sort(itms_ary, Xow_lang_itm_sorter_page_name._);
int itms_ary_len = itms_ary.length;
for (int i = 0; i < itms_ary_len; i++)
itms_ary[i].Html_bld(bfr, wiki);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_owner)) return lang_mgr;
else if (ctx.Match(k, Invk_name_)) name = m.ReadBry("v");
else if (ctx.Match(k, Invk_sort_idx_)) sort_idx = m.ReadInt("v");
else if (ctx.Match(k, Invk_sort_mode_)) sort_mode = (byte)m.ReadInt("v");
else if (ctx.Match(k, Invk_html_all_)) Html_all_(m.ReadStr("v"));
else if (ctx.Match(k, Invk_html_itm_)) Html_itm_(m.ReadStr("v"));
else return GfoInvkAble_.Rv_unhandled;
return this;
} private static final String Invk_owner = "owner", Invk_name_ = "name_", Invk_sort_mode_ = "sort_mode_", Invk_sort_idx_ = "sort_idx_", Invk_html_all_ = "html_all_", Invk_html_itm_ = "html_itm_";
public static final byte Sort_mode_lang_idx = 0, Sort_mode_lang_name = 1, Sort_mode_page_name = 2;
public static Xow_lang_grp dflt_(Xow_lang_mgr lang_mgr, int id, byte[] key) {
Xow_lang_grp rv = new Xow_lang_grp();
rv.lang_mgr = lang_mgr; rv.id = id; rv.key = key; rv.name = key;
rv.Html_all_(String_.Concat_lines_nl_skip_last
( ""
, " <h4>~{all_name}</h4>"
, " <table style='width: 100%;'>~{grps}"
, " </table>"
));
rv.Html_itm_(String_.Concat_lines_nl_skip_last
( ""
, " <td style='width: 10%; padding-bottom: 5px;'>~{lang_name}</td><td style='width: 20%; padding-bottom: 5px;'><li~{page_badge}><a hreflang=\"~{lang_code}\" title=\"~{pagename_translation}\" href=\"~{lang_href}\">~{pagename_translation}</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
));
return rv;
} private Xow_lang_grp() {}
Xow_lang_mgr lang_mgr;
}
class Xow_lang_itm_sorter_page_name implements gplx.lists.ComparerAble {
public int compare(Object lhsObj, Object rhsObj) {return Bry_.Compare(((Xow_lang_itm)lhsObj).Page_name(), ((Xow_lang_itm)rhsObj).Page_name());}
public static final Xow_lang_itm_sorter_page_name _ = new Xow_lang_itm_sorter_page_name(); Xow_lang_itm_sorter_page_name() {}
}
class Xow_lang_grp_sorter_sort_idx implements gplx.lists.ComparerAble {
public int compare(Object lhsObj, Object rhsObj) {return Int_.Compare(((Xow_lang_grp)lhsObj).Sort_idx(), ((Xow_lang_grp)rhsObj).Sort_idx());}
public static final Xow_lang_grp_sorter_sort_idx _ = new Xow_lang_grp_sorter_sort_idx(); Xow_lang_grp_sorter_sort_idx() {}
}

View File

@@ -1,39 +0,0 @@
/*
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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
import gplx.xowa.langs.cfgs.*;
public class Xow_lang_itm {
private final Xow_lang_grp html_grp; private final Xow_xwiki_itm xwiki; private final Xoac_lang_itm lang;
public Xow_lang_itm(Xow_lang_grp html_grp, Xow_xwiki_itm xwiki, Xoac_lang_itm lang) {
this.html_grp = html_grp; this.xwiki = xwiki; this.lang = lang;
}
public byte[] Lang_key() {return lang.Key_bry();}
public byte[] Lang_domain() {return xwiki.Domain_bry();}
public byte[] Lang_name() {return lang.Local_name_bry();}
public byte[] Page_name() {return page_name;} private byte[] page_name;
public boolean Page_name_has() {return Bry_.Len_gt_0(page_name);}
public boolean Empty_xwiki() {return empty_xwiki;} private boolean empty_xwiki;
public byte[][] Page_badges() {return page_badges;} private byte[][] page_badges;
public void Html_bld(Bry_bfr bfr, Xowe_wiki wiki) {
html_grp.Html_itm().Bld_bfr(bfr, lang.Key_bry(), xwiki.Domain_bry(), lang.Local_name_bry(), page_name);
}
public void Atrs_set(byte[] page_name, boolean empty_xwiki, byte[][] page_badges) {
this.page_name = page_name; this.empty_xwiki = empty_xwiki; this.page_badges = page_badges;
html_grp.Itms_active_len_add_one_();
}
}

View File

@@ -1,194 +0,0 @@
/*
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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
import gplx.xowa.langs.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.apis.xowa.html.*; import gplx.xowa.xtns.wdatas.core.*;
import gplx.xowa.html.hrefs.*;
import gplx.xowa.langs.cfgs.*;
public class Xow_lang_mgr {
Xow_lang_mgr() {
int len = Xol_lang_itm_.Id__max;
itms = new Xow_lang_itm[len];
}
public Bry_fmtr Html_div() {return html_div;} private final Bry_fmtr html_div = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( "<div id=\"xowa-lang\">"
, " <h5>~{toggle_btn} (links: ~{len}) ~{wikidata_link}</h5>"
, " <div~{toggle_hdr}>~{grps}"
, " </div>"
, "</div>"
), "len", "wikidata_link", "toggle_btn", "toggle_hdr", "grps");
public Bry_fmtr Html_wikidata_link() {return html_wikidata_link;} private final Bry_fmtr html_wikidata_link = Bry_fmtr.new_(" (<a href=\"/site/www.wikidata.org/wiki/~{qid}\">wikidata</a>)", "qid");
public void Clear() {hash.Clear();}
public void Itms_reg(Xow_xwiki_itm xwiki, Xoac_lang_itm lang) {
int lang_id = xwiki.Lang_id();
Xoac_lang_grp ini_grp = lang.Grp();
Xow_lang_grp grp = (Xow_lang_grp)hash.Get_by(ini_grp.Key_bry());
if (grp == null) {
grp = Grps_get_or_new(ini_grp.Key_bry());
grp.Name_(ini_grp.Name_bry());
grp.Sort_idx_(ini_grp.Sort_idx());
}
Xow_lang_itm itm = itms[lang_id];
if (itm == null) {
itm = new Xow_lang_itm(grp, xwiki, lang);
itms[lang_id] = itm;
}
grp.Itms_add(itm);
}
public int Grps_len() {return hash.Count();}
public Xow_lang_grp Grps_get_at(int i) {return (Xow_lang_grp)hash.Get_at(i);}
Xow_lang_grp Grps_get_or_new(byte[] key) {
Xow_lang_grp rv = (Xow_lang_grp)hash.Get_by(key);
if (rv == null) {
int id = hash.Count();
rv = Xow_lang_grp.dflt_(this, id, key);
rv.Sort_idx_(id);
hash.Add(key, rv);
rv.Name_(key);
}
return rv;
} private Ordered_hash hash = Ordered_hash_.new_bry_();
public void Grps_sort() {hash.Sort_by(Xow_lang_grp_sorter_sort_idx._);}
public void Html_bld(Bry_bfr bfr, Xowe_wiki wiki, List_adp slink_list, byte[] qid) {
int grp_len = hash.Count();
for (int i = 0; i < grp_len; i++) {
Xow_lang_grp grp = (Xow_lang_grp)hash.Get_at(i);
grp.Itms_reset();
}
int slink_len = slink_list.Count();
for (int i = 0; i < slink_len; i++) {
Wdata_sitelink_itm slink = (Wdata_sitelink_itm)slink_list.Get_at(i);
Xoa_ttl ttl = slink.Page_ttl();
Xow_xwiki_itm xwiki = ttl.Wik_itm();
int lang_id = xwiki.Lang_id();
Xow_lang_itm itm = itms[lang_id]; // NOTE: handles ttls like [[fr:]] and [[:fr;]] which have an empty Page_txt, but a valued Full_txt_raw
byte[] ttl_bry = ttl.Page_txt_w_anchor();
boolean empty_xwiki = false;
if (Bry_.Len_eq_0(ttl_bry)) {
ttl_bry = wiki.Parser_mgr().Ctx().Cur_page().Ttl().Page_txt();
empty_xwiki = true;
}
itm.Atrs_set(ttl_bry, empty_xwiki, slink.Badges());
}
html_bldr.Init(this, wiki, slink_list, slink_len, qid);
html_bldr.XferAry(bfr, -1);
} private Xow_lang_itm[] itms = null; Xow_lang_html html_bldr = new Xow_lang_html();
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_get)) return Grps_get_or_new(m.ReadBry("v"));
else if (ctx.Match(k, Invk_sort)) Grps_sort();
else return GfoInvkAble_.Rv_unhandled;
return this;
} private static final String Invk_get = "get", Invk_sort = "sort";
public static Xow_lang_mgr dflt_() {return new Xow_lang_mgr();}
}
class Xow_lang_html implements Bry_fmtr_arg {
private Xow_lang_mgr lang_mgr; Xowe_wiki wiki; List_adp ttl_list; private byte[] qid;
private Xoapi_toggle_itm toggle_itm;
private int stage = 0;
public Xow_lang_html Init(Xow_lang_mgr lang_mgr, Xowe_wiki wiki, List_adp ttl_list, int ttl_list_len, byte[] qid) {
this.lang_mgr = lang_mgr; this.wiki = wiki; this.ttl_list = ttl_list; this.qid = qid;
toggle_itm = wiki.Appe().Api_root().Html().Page().Toggle_mgr().Get_or_new("wikidata-langs");
return this;
}
public void XferAry(Bry_bfr bfr, int idx) {
switch (stage) {
case 0: {
stage = 1;
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128().Mkr_rls();
byte[] msg_lang = wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_page_lang_header);
byte[] wikidata_link = Bry_.Len_eq_0(qid) ? Bry_.Empty : lang_mgr.Html_wikidata_link().Bld_bry_many(tmp_bfr, qid);
toggle_itm.Init(msg_lang);
lang_mgr.Html_div().Bld_bfr_many(bfr, ttl_list.Count(), wikidata_link, toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr(), this);
stage = 0;
break;
}
case 1:
stage = 2;
int grps_len = lang_mgr.Grps_len();
for (int i = 0; i < grps_len; i++) {
grp = lang_mgr.Grps_get_at(i);
if (grp.Itms_active_len() == 0) continue; // skip grps with no items
grp.Html_all().Bld_bfr_many(bfr, grp.Name(), this);
}
stage = 1;
break;
case 2:
int itms_len = grp.Itms_len();
int grp_counter = 0; boolean row_opened = false;
for (int i = 0; i < itms_len; i++) {
Xow_lang_itm itm = grp.Itms_get(i);
if (!itm.Page_name_has()) continue;
if (grp_counter == 0) {
bfr.Add(grp.Html_grp_bgn());
row_opened = true;
}
byte[] lang_key = itm.Lang_key();
byte[] domain = itm.Lang_domain();
byte[] page_name = itm.Page_name();
byte[] local_name = itm.Lang_name();
byte[] badge_cls = Badge_cls(tmp_bfr, itm.Page_badges());
if (wiki.Appe().Usere().Wiki().Xwiki_mgr().Get_by_key(domain) == null)
tmp_bfr.Add(Xoh_href_.Bry__https).Add(domain).Add(Xoh_href_.Bry__wiki);
else
tmp_bfr.Add(Xoh_href_.Bry__site).Add(domain).Add(Xoh_href_.Bry__wiki);
if (!itm.Empty_xwiki()) tmp_bfr.Add(page_name);
grp.Html_itm().Bld_bfr_many(bfr, lang_key, domain, local_name, tmp_bfr.Xto_bry_and_clear(), page_name, badge_cls);
++grp_counter;
if (grp_counter == 3) {
row_opened = false;
bfr.Add(grp.Html_grp_end());
grp_counter = 0;
}
}
if (row_opened) {
bfr.Add(grp.Html_grp_end());
grp_counter = 0;
}
stage = 2;
break;
}
} private Xow_lang_grp grp; Bry_bfr tmp_bfr = Bry_bfr.reset_(255);
private static byte[] Badge_cls(Bry_bfr bfr, byte[][] badges) {
if (badges == null) badges = Bry_.Ary_empty;
int badges_len = badges.length;
bfr.Add(Cls_bgn);
if (badges_len == 0)
bfr.Add(Badge_none_cls);
else {
for (int i = 0; i < badges_len; ++i) {
if (i != 0) bfr.Add_byte_comma();
byte[] badge = badges[i];
byte[] badge_cls = (byte[])badges_hash.Get_by_bry(badge);
if (badge_cls == null) Gfo_usr_dlg_.I.Warn_many("", "", "unknown badge: badge=~{0}", String_.new_u8(badge));
else bfr.Add(badge_cls);
}
}
bfr.Add_byte_apos();
return bfr.Xto_bry_and_clear();
}
private static final byte[]
Badge_none_cls = Bry_.new_a7("badge-none")
, Cls_bgn = Bry_.new_a7(" class='")
;
private static Hash_adp_bry badges_hash = Hash_adp_bry.ci_a7()
.Add_str_obj("Q17437798", Bry_.new_a7("badge-goodarticle"))
.Add_str_obj("Q17437796", Bry_.new_a7("badge-featuredarticle"))
.Add_str_obj("Q17559452", Bry_.new_a7("badge-recommendedarticle"))
.Add_str_obj("Q17506997", Bry_.new_a7("badge-featuredlist"))
.Add_str_obj("Q17580674", Bry_.new_a7("badge-featuredportal"))
;
}

View File

@@ -20,11 +20,11 @@ import gplx.core.net.*;
import gplx.xowa.langs.*;
import gplx.xowa.wikis.domains.*;
public class Xow_xwiki_itm implements gplx.CompareAble {
public Xow_xwiki_itm(byte[] key_bry, byte[] url_fmt, int lang_id, int domain_tid, byte[] domain_bry, byte[] domain_name) {
public Xow_xwiki_itm(byte[] key_bry, byte[] url_fmt, int lang_id, int domain_tid, byte[] domain_bry, byte[] domain_name, byte[] abrv_wm) {
this.key_bry = key_bry; this.key_str = String_.new_u8(key_bry);
this.url_fmt = url_fmt; this.lang_id = lang_id;
this.url_fmtr = Bry_.Len_eq_0(url_fmt) ? null : Bry_fmtr.new_(url_fmt, "0");
this.domain_tid = domain_tid; this.domain_bry = domain_bry; this.domain_name = domain_name;
this.domain_tid = domain_tid; this.domain_bry = domain_bry; this.domain_name = domain_name; this.abrv_wm = abrv_wm;
}
public byte[] Key_bry() {return key_bry;} private final byte[] key_bry; // EX: commons
public String Key_str() {return key_str;} private final String key_str;
@@ -34,17 +34,17 @@ public class Xow_xwiki_itm implements gplx.CompareAble {
public int Domain_tid() {return domain_tid;} private final int domain_tid; // EX: Tid_int_commons
public byte[] Domain_bry() {return domain_bry;} private final byte[] domain_bry; // EX: commons.wikimedia.org
public byte[] Domain_name() {return domain_name;} private final byte[] domain_name; // EX: Wikimedia Commons
public byte[] Abrv_wm() {return abrv_wm;} private final byte[] abrv_wm; // EX: enwiki; needed for sitelinks
public boolean Offline() {return offline;} public Xow_xwiki_itm Offline_(boolean v) {offline = v; return this;} private boolean offline;
public int compareTo(Object obj) {Xow_xwiki_itm comp = (Xow_xwiki_itm)obj; return Bry_.Compare(key_bry, comp.key_bry);}
public boolean Type_is_xwiki_lang(byte[] cur_lang_key) {
return lang_id != Xol_lang_itm_.Id__unknown // valid lang code
&& domain_tid != Xow_domain_type_.Int__commons // commons should never be considered an xwiki_lang; EX:[[commons:A]] PAGE:species:Scarabaeidae; DATE:2014-09-10
return lang_id != Xol_lang_stub_.Id__unknown // valid lang code
&& domain_tid != Xow_domain_tid_.Int__commons // commons should never be considered an xwiki_lang; EX:[[commons:A]] PAGE:species:Scarabaeidae; DATE:2014-09-10
&& !Bry_.Eq(key_bry, cur_lang_key) // lang is different than current; EX: [[en:A]] in en.wikipedia.org shouldn't link back to self
&& Bry_.Len_gt_0(url_fmt) // url_fmt exists
;
}
public static Xow_xwiki_itm new_(byte[] key_bry, byte[] url_fmt, int lang_id, int domain_tid, byte[] domain_bry) {
return new Xow_xwiki_itm(key_bry, url_fmt, lang_id, domain_tid, domain_bry, domain_bry);
public static Xow_xwiki_itm new_(byte[] key_bry, byte[] url_fmt, int lang_id, int domain_tid, byte[] domain_bry, byte[] abrv_wm) {
return new Xow_xwiki_itm(key_bry, url_fmt, lang_id, domain_tid, domain_bry, domain_bry, abrv_wm);
}
}

View File

@@ -16,217 +16,77 @@ 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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
import gplx.core.net.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.cfgs.*;
import gplx.xowa.html.hrefs.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.cfgs.*;
public class Xow_xwiki_mgr implements GfoInvkAble {
private Xowe_wiki wiki; private Xow_xwiki_mgr_srl srl;
private final Ordered_hash list = Ordered_hash_.new_bry_();
private final Hash_adp_bry hash = Hash_adp_bry.ci_a7();
public Xow_xwiki_mgr() {} // FIXME: current placeholder for viewer
public Xow_xwiki_mgr(Xowe_wiki wiki, Gfo_url_parser url_parser) {
import gplx.core.net.*; import gplx.xowa.htmls.hrefs.*;
import gplx.xowa.langs.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.parsers.*; import gplx.xowa.wikis.xwikis.sitelinks.*;
public class Xow_xwiki_mgr {
private final Ordered_hash list = Ordered_hash_.New_bry(); private final Hash_adp_bry hash = Hash_adp_bry.ci_a7();
private final Xow_wiki wiki;
public Xow_xwiki_mgr(Xow_wiki wiki) {
this.wiki = wiki;
srl = new Xow_xwiki_mgr_srl(wiki.Domain_itm(), this);
this.xwiki_domain_tid = Xwiki_tid(wiki.Domain_tid());
}
public int Xwiki_domain_tid() {return xwiki_domain_tid;} private int xwiki_domain_tid;
public Xow_lang_mgr Lang_mgr() {return lang_mgr;} private final Xow_lang_mgr lang_mgr = Xow_lang_mgr.dflt_();
public int Len() {return list.Count();}
public int Xwiki_domain_tid() {return xwiki_domain_tid;} private int xwiki_domain_tid;
public int Len() {return list.Count();}
public void Clear() {hash.Clear(); list.Clear();}
public void Sort_by_key() {list.Sort();}
public Xow_xwiki_itm Get_at(int i) {return (Xow_xwiki_itm)list.Get_at(i);}
public Xow_xwiki_itm Get_by_key(byte[] key) {return (Xow_xwiki_itm)hash.Get_by_bry(key);}
public Xow_xwiki_itm Get_by_mid(byte[] src, int bgn, int end) {return (Xow_xwiki_itm)hash.Get_by_mid(src, bgn, end);}
public Xow_xwiki_itm Add_full(String alias, String domain) {return Add_full(Bry_.new_a7(alias), Bry_.new_a7(domain), null);}
public Xow_xwiki_itm Add_full(byte[] alias, byte[] domain) {return Add_full(alias, domain, null);}
public Xow_xwiki_itm Add_full(byte[] alias, byte[] domain_bry, byte[] url_fmt) {
int domain_tid = Byte_.Zero;
int lang_id = -1;
Xow_domain_itm wiki_type = Xow_domain_itm_.parse(domain_bry);
domain_tid = wiki_type.Domain_type_id();
if (Bry_.Len_gt_0(wiki_type.Lang_actl_key())) { // domain_bry has lang (EX: "en.")
Xol_lang_itm lang_itm = Xol_lang_itm_.Get_by_key(wiki_type.Lang_actl_key());
if (lang_itm == null) return null; // unknown lang: do not add to wiki collection; EX: en1.wikipedia.org
lang_id = lang_itm.Id();
}
Xow_xwiki_itm itm = Xow_xwiki_itm.new_(alias, url_fmt, lang_id, domain_tid, domain_bry);
Add_itm(itm, null);
public Xow_xwiki_itm Add_by_atrs(String key, String domain) {return Add_by_atrs(Bry_.new_a7(key), Bry_.new_a7(domain), null);}
public Xow_xwiki_itm Add_by_atrs(byte[] key, byte[] domain) {return Add_by_atrs(key, domain, null);}
public Xow_xwiki_itm Add_by_atrs(byte[] key, byte[] domain_bry, byte[] url_fmt) {
Xow_domain_itm domain_itm = Xow_domain_itm_.parse(domain_bry);
Xow_xwiki_itm itm = Xow_xwiki_itm.new_(key, url_fmt, domain_itm.Lang_actl_uid(), domain_itm.Domain_type_id(), domain_bry, domain_itm.Abrv_wm());
Add_itm(itm);
return itm;
}
public void Sort_by_key() {
list.Sort();
}
public Xow_domain_itm[] Get_by_crt(Xow_domain_itm cur, gplx.xowa.wikis.domains.crts.Xow_domain_crt_itm crt) {
List_adp rv = List_adp_.new_();
int len = this.Len();
public void Add_by_sitelink_mgr() {Add_by_sitelink_mgr(wiki.Domain_tid());}
public void Add_by_sitelink_mgr(int domain_tid) {
String wiki_tid_name_str = String_.new_u8(Xow_domain_tid_.Get_type_as_bry(domain_tid));
Xoa_sitelink_itm_mgr itm_mgr = wiki.App().Xwiki_mgr__sitelink_mgr().Itm_mgr();
int len = itm_mgr.Len();
for (int i = 0; i < len; ++i) {
Xow_xwiki_itm wiki = this.Get_at(i);
if (!wiki.Offline()) continue;
Xow_domain_itm domain_itm = Xow_domain_itm_.parse(wiki.Domain_bry());
if (crt.Matches(cur, domain_itm)) rv.Add(domain_itm);
}
return (Xow_domain_itm[])rv.To_ary_and_clear(Xow_domain_itm.class);
}
public void Add_bulk(byte[] raw) {
byte[][] rows = Bry_split_.Split(raw, Byte_ascii.Nl);
int rows_len = rows.length;
Hash_adp_bry lang_regy = Xol_lang_itm_.Regy();
for (int i = 0; i < rows_len; i++) {
byte[] row = rows[i]; if (Bry_.Len_eq_0(row)) continue; // ignore blank rows
Xow_xwiki_itm itm = Add_bulk_row(lang_regy, row);
Add_itm(itm, null);
Xoa_sitelink_itm itm = (Xoa_sitelink_itm)itm_mgr.Get_at(i);
byte[] itm_key = itm.Key(); // EX: "fr" as in "[[fr:]]"
byte[] domain_bry = Bry_.new_u8(String_.Format("{0}.{1}.org", String_.new_u8(itm_key), wiki_tid_name_str)); // EX: fr.wikipedia.org
Xow_domain_itm domain_itm = Xow_domain_itm_.parse(domain_bry);
byte[] abrv_wm = domain_itm == null ? null : domain_itm.Abrv_wm();
Xow_xwiki_itm xwiki = Xow_xwiki_itm.new_(itm_key, Bld_url_fmt(domain_bry), domain_itm.Lang_actl_uid(), domain_tid, domain_bry, abrv_wm);
Add_itm(xwiki);
}
}
public Xow_xwiki_itm Add_bulk_row(Hash_adp_bry lang_regy, byte[] row) {
byte[][] flds = Bry_split_.Split(row, Byte_ascii.Pipe); int flds_len = flds.length;
byte[] alias = Bry_.Empty, domain_bry = Bry_.Empty;
for (int j = 0; j < flds_len; j++) {
byte[] fld = flds[j];
switch (j) {
case 0: alias = fld; break;
case 1: domain_bry = fld; break;
case 2: break; // reserved for 0,1 (0=custom; 1=wmf)
default: throw Err_.new_unhandled(j);
}
}
Xow_domain_itm domain = Xow_domain_itm_.parse(domain_bry);
int lang_id = Xol_lang_itm_.Id__unknown;
if (Bry_.Len_gt_0(domain.Lang_actl_key())) {
Xol_lang_itm lang_itm = Xol_lang_itm_.Get_by_key(domain.Lang_actl_key());
if (lang_itm != null // lang exists
&& Bry_.Eq(alias, lang_itm.Key())) // alias == lang.key; only assign langs to aliases that have lang key; EX: w|en.wikipedia.org; "w" alias should not be registered for "en"; DATE:2013-07-25
lang_id = lang_itm.Id();
}
byte[] url_fmt = Bry_.Add(Xoh_href_.Bry__https, domain_bry, Xoh_href_.Bry__wiki, Arg_0);
return Xow_xwiki_itm.new_(alias, url_fmt, lang_id, domain.Domain_type_id(), domain_bry);
} static final byte[] Arg_0 = Bry_.new_a7("~{0}");
String Exec_itms_print(byte[] raw) {
Bry_fmtr fmtr = Bry_fmtr.new_bry_(raw, "wiki_key");//, "wiki_type_url", "wiki_lang", "wiki_name", "wiki_logo_url");
Bry_bfr tmp_bfr = Xoa_app_.Utl__bfr_mkr().Get_k004();
Hash_adp_bry seen = Hash_adp_bry.ci_a7(); // ASCII:url_domain; EX:en.wikipedia.org
int wikis_len = list.Count();
for (int i = 0; i < wikis_len; i++) {
Xow_xwiki_itm itm = (Xow_xwiki_itm)list.Get_at(i);
byte[] key = itm.Key_bry();
if (Bry_.Eq(key, Xow_domain_type_.Bry__home)) continue; // skip home
byte[] domain = itm.Domain_bry();
if (seen.Has(domain)) continue;
seen.Add_as_key_and_val(domain);
fmtr.Bld_bfr_many(tmp_bfr, key);
}
return tmp_bfr.To_str_and_rls();
}
public void Add_bulk_peers(byte[] raw) {
byte[][] keys = Bry_split_.Split(raw, Byte_ascii.Tilde);
int len = keys.length;
Ordered_hash peers = Ordered_hash_.new_();
Cfg_nde_root peer_root = wiki.Appe().Wiki_mgr().Groups();
for (int i = 0; i < len; i++) {
byte[] key = keys[i];
Cfg_nde_obj peer_grp = peer_root.Grps_get(key);
if (peer_grp == null)
throw Err_.new_wo_type("unknown peer group", "key", String_.new_u8(key));
else
Cfg_nde_obj_.Fill_recurse(peers, peer_grp);
}
len = peers.Count();
byte[] lang_key_bry = wiki.Lang().Key_bry();
if (lang_key_bry == Xol_lang_itm_.Key__unknown) lang_key_bry = Xol_lang_.Key_en; // default non-lang wikis to english
String lang_key_str = String_.new_u8(lang_key_bry);
int lang_id = Xol_lang_itm_.Get_by_key(lang_key_bry).Id();
for (int i = 0; i < len; i++) {
Xoac_wiki_itm wiki_itm = (Xoac_wiki_itm)peers.Get_at(i);
byte[] wiki_name_bry = wiki_itm.Key_bry();
String wiki_name = String_.new_u8(wiki_name_bry);
String domain_str = null;
int domain_tid = Xow_domain_type_.Get_type_as_tid(wiki_name_bry);
switch (domain_tid) {
case Xow_domain_type_.Int__commons:
case Xow_domain_type_.Int__species:
case Xow_domain_type_.Int__meta:
case Xow_domain_type_.Int__incubator: domain_str = String_.Format("{0}.wikimedia.org", wiki_name); break; // EX: commons.wikimedia.org
case Xow_domain_type_.Int__wikidata: domain_str = String_.Format("www.wikidata.org", wiki_name); break; // EX: www.wikidata.org
case Xow_domain_type_.Int__mediawiki: domain_str = String_.Format("www.mediawiki.org", wiki_name); break;
case Xow_domain_type_.Int__wmfblog: domain_str = String_.Format("wikimediafoundation.org", wiki_name); break;
default: domain_str = String_.Format("{0}.{1}.org", lang_key_str, wiki_name); break; // EX: en.wiktionary.org
}
byte[] domain_bry = Bry_.new_u8(domain_str);
// Xowe_wiki lang_wiki = wiki.Appe().Wiki_mgr().Get_by_key_or_null(domain_bry); // DELETE: causes commons to show; DATE:2015-09-23
// boolean offline_exists = lang_wiki != null;
String fmt = String_.Format("http://" + domain_str + "/wiki/~{0}");
int aliases_len = wiki_itm.Aliases().length;
for (int j = 0; j < aliases_len; j++) {
byte[] alias = wiki_itm.Aliases()[j];
if (wiki.Ns_mgr().Names_get_or_null(alias, 0, alias.length) != null) continue; // NOTE: do not add xwiki if alias matches namespace; EX: en.wiktionary.org has ns of "Wiktionary"; do not add alias of "wiktionary"; note that wikipedia does have an alias to wiktionary
Xow_xwiki_itm xwiki = Xow_xwiki_itm.new_(alias, Bry_.new_u8(fmt), lang_id, domain_tid, domain_bry); // .Offline_(offline_exists); // NOTE: domain_tid must be used, not wiki.Domain_tid; DATE:2014-09-14
Add_itm(xwiki, null);
public void Add_by_csv(byte[] src) {
synchronized (list) { // THREAD: parser stores state at app-level
Xow_xwiki_itm_parser itm_parser = wiki.App().Xwiki_mgr__itm_parser();
itm_parser.Init_by_wiki(wiki.Domain_itm());
itm_parser.Load_by_bry(src);
Ordered_hash xwiki_list = itm_parser.Xwiki_list();
int len = xwiki_list.Count();
for (int i = 0; i < len; ++i) {
Xow_xwiki_itm itm = (Xow_xwiki_itm)xwiki_list.Get_at(i);
Add_itm(itm);
}
}
}
public void Add_bulk_langs(GfoMsg m) {
byte[] grp_key = m.ReadBry("grp_key");
byte[] wiki_type_name = m.ReadBryOr("wiki_type_name", null);
int wiki_tid = wiki_type_name == null ? wiki.Domain_tid() : Xow_domain_type_.Get_type_as_tid(wiki_type_name);
Add_bulk_langs(grp_key, wiki_tid);
public void Add_itm(Xow_xwiki_itm itm) {
byte[] key_bry = itm.Key_bry();
if (wiki.Ns_mgr().Names_get_or_null(key_bry) != null) return;// NOTE: do not add xwiki if key matches namespace; EX: en.wiktionary.org has ns of "Wiktionary"; do not add key of "wiktionary"; note that wikipedia does have an key to wiktionary
list.Add_if_dupe_use_nth(key_bry, itm); // NOTE: some wikis like commons will be added multiple times under different aliases (commons, c, commons.wikimedia.org); need to check domain and add only once DATE:2014-11-07
hash.Add_if_dupe_use_nth(key_bry, itm);
}
public void Add_bulk_langs(byte[] grp_key) {Add_bulk_langs(grp_key, wiki.Domain_tid());}
public void Add_bulk_langs(byte[] grp_key, int domain_tid) {
Ordered_hash langs = wiki.Appe().Lang_mgr().Xto_hash(grp_key);
int len = langs.Count();
byte[] wiki_tid_name = Xow_domain_type_.Get_type_as_bry(domain_tid);
String wiki_tid_name_str = String_.new_u8(wiki_tid_name);
for (int i = 0; i < len; i++) {
Xoac_lang_itm lang = (Xoac_lang_itm)langs.Get_at(i);
String domain_str = String_.Format("{0}.{1}.org", String_.new_u8(lang.Key_bry()), wiki_tid_name_str); // EX: fr.wikipedia.org
byte[] domain_bry = Bry_.new_u8(domain_str);
// Xowe_wiki lang_wiki = wiki.Appe().Wiki_mgr().Get_by_key_or_null(domain_bry); // DELETE: causes commons to show; DATE:2015-09-23
// boolean offline_exists = lang_wiki != null;
String url_fmt = String_.Format("http://" + domain_str + "/wiki/~{0}");
int lang_id = Xol_lang_itm_.Get_by_key(lang.Key_bry()).Id();
Xow_xwiki_itm xwiki = Xow_xwiki_itm.new_(lang.Key_bry(), Bry_.new_u8(url_fmt), lang_id, domain_tid, domain_bry); // .Offline_(offline_exists);
Add_itm(xwiki, lang);
}
lang_mgr.Grps_sort();
}
public void Add_itm(Xow_xwiki_itm itm) {Add_itm(itm, null);}
private void Add_itm(Xow_xwiki_itm xwiki, Xoac_lang_itm lang) {
byte[] xwiki_key = xwiki.Key_bry();
if ( !hash.Has(xwiki.Key_bry()) // only register xwiki / lang pair once
&& lang != null) // null lang should not be registered
lang_mgr.Itms_reg(xwiki, lang);
byte[] xwiki_domain = xwiki.Domain_bry();
if (!domain_hash.Has(xwiki_domain)) { // domain is new
domain_hash.Add(xwiki_domain, xwiki_key);
list.Add_if_dupe_use_nth(xwiki_key, xwiki); // only add to list if domain is new; some wikis like commons will be added multiple times under different aliases (commons, c, commons.wikimedia.org); need to check domain and add only once DATE:2014-11-07
}
hash.Add_if_dupe_use_nth(xwiki_key, xwiki);
} private final Hash_adp_bry domain_hash = Hash_adp_bry.ci_a7();
public void Add_many(byte[] v) {srl.Load_by_bry(v);}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_count)) return list.Count();
else if (ctx.Match(k, Invk_add_bulk)) Add_bulk(m.ReadBry("v"));
else if (ctx.Match(k, Invk_add_bulk_langs)) Add_bulk_langs(m);
else if (ctx.Match(k, Invk_add_bulk_peers)) Add_bulk_peers(m.ReadBry("v"));
else if (ctx.Match(k, Invk_add_many)) Add_many(m.ReadBry("v"));
else if (ctx.Match(k, Invk_itms_print)) return Exec_itms_print(m.ReadBry("v"));
else if (ctx.Match(k, Invk_clear)) this.Clear();
else return GfoInvkAble_.Rv_unhandled;
return this;
}
private static final String
Invk_add_bulk = "add_bulk", Invk_add_bulk_langs = "add_bulk_langs", Invk_add_bulk_peers = "add_bulk_peers", Invk_add_many = "add_many"
, Invk_itms_print = "itms_print", Invk_count = "count", Invk_clear = "clear"
;
private static int Xwiki_tid(int tid) {
switch (tid) {
case Xow_domain_type_.Int__commons:
case Xow_domain_type_.Int__species:
case Xow_domain_type_.Int__incubator:
case Xow_domain_type_.Int__mediawiki:
case Xow_domain_type_.Int__wmfblog:
case Xow_domain_type_.Int__home: return Xow_domain_type_.Int__wikipedia; // set xwiki_tid to wikipedia; allows [[da:Page]] to point to da.wikipedia.org; PAGE:species:Puccinia; DATE:2014-09-14
default: return tid;
case Xow_domain_tid_.Int__commons: case Xow_domain_tid_.Int__species: case Xow_domain_tid_.Int__incubator:
case Xow_domain_tid_.Int__mediawiki: case Xow_domain_tid_.Int__wmfblog: case Xow_domain_tid_.Int__home:
return Xow_domain_tid_.Int__wikipedia; // set xwiki_tid to wikipedia; allows [[da:Page]] to point to da.wikipedia.org; PAGE:species:Puccinia; DATE:2014-09-14
default: return tid;
}
}
public static byte[] Get_domain_from_url(Gfo_url_parser url_parser, Gfo_url url, byte[] url_fmt) { // extract "commons.wikimedia.org" from "http://commons.wikimedia.org/wiki/Category:~{0}"
url_parser.Parse(url, url_fmt, 0, url_fmt.length);
return url.Segs__get_at_1st();
}
public static byte[] Bld_url_fmt(byte[] domain_bry) {return Bry_.Add(gplx.core.net.Gfo_protocol_itm.Itm_https.Text_bry(), domain_bry, Bry__url_fmt_end);}
private static final byte[] Bry__url_fmt_end = Bry_.new_a7("/wiki/~{0}");
}

View File

@@ -1,39 +0,0 @@
/*
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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
import gplx.langs.dsvs.*; import gplx.xowa.wikis.domains.*;
class Xow_xwiki_mgr_srl extends Dsv_wkr_base {
private byte[] key, url_fmt, name;
private final Xow_domain_itm cur_domain; private final Xow_xwiki_mgr mgr;
public Xow_xwiki_mgr_srl(Xow_domain_itm cur_domain, Xow_xwiki_mgr mgr) {
this.cur_domain = cur_domain; this.mgr = mgr;
}
@Override public Dsv_fld_parser[] Fld_parsers() {return new Dsv_fld_parser[] {Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser};}
@Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) {
switch (fld_idx) {
case 0: key = Bry_.Mid(src, bgn, end); return true;
case 1: url_fmt = Bry_.Mid(src, bgn, end); return true;
case 2: name = Bry_.Mid(src, bgn, end); return true;
default: return false;
}
}
@Override public void Commit_itm(Dsv_tbl_parser parser, int pos) {
Xow_xwiki_itm itm = Xow_xwiki_itm_bldr.I.Bld(cur_domain, key, url_fmt, name);
mgr.Add_itm(itm);
}
}

View File

@@ -1,141 +0,0 @@
/*
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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
import org.junit.*; import gplx.core.strings.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.langs.*;
public class Xow_xwiki_mgr_tst {
@Before public void init() {fxt.Clear();} private Xow_xwiki_mgr_fxt fxt = new Xow_xwiki_mgr_fxt();
@Test public void Add_bulk_wiki_en() {fxt.Test_add_bulk("w|en.wikipedia.org" , Xol_lang_itm_.Id__unknown , Xow_domain_type_.Int__wikipedia , "w" , "https://en.wikipedia.org/wiki/~{0}", "en.wikipedia.org");}
@Test public void Add_bulk_wiki_fr() {fxt.Test_add_bulk("fr|fr.wikipedia.org" , Xol_lang_itm_.Id_fr , Xow_domain_type_.Int__wikipedia , "fr" , "https://fr.wikipedia.org/wiki/~{0}", "fr.wikipedia.org");}
@Test public void Add_bulk_wikt_en() {fxt.Test_add_bulk("wikt|en.wiktionary.org" , Xol_lang_itm_.Id__unknown , Xow_domain_type_.Int__wiktionary , "wikt" , "https://en.wiktionary.org/wiki/~{0}", "en.wiktionary.org");}
@Test public void Add_bulk_commons() {fxt.Test_add_bulk("commons|commons.wikimedia.org" , Xol_lang_itm_.Id__unknown , Xow_domain_type_.Int__commons , "commons" , "https://commons.wikimedia.org/wiki/~{0}", "commons.wikimedia.org");}
@Test public void Add_bulk_commons_cap() {fxt.Test_add_bulk("Commons|commons.wikimedia.org" , Xol_lang_itm_.Id__unknown , Xow_domain_type_.Int__commons , "Commons" , "https://commons.wikimedia.org/wiki/~{0}", "commons.wikimedia.org");}
@Test public void Add_bulk_langs_wiki() {fxt.Init_langs().Test_add_bulk_langs("wiki", fxt.xwiki_("en", "en.wikipedia.org", "http://en.wikipedia.org/wiki/~{0}"), fxt.xwiki_("de", "de.wikipedia.org", "http://de.wikipedia.org/wiki/~{0}"), fxt.xwiki_("fr", "fr.wikipedia.org", "http://fr.wikipedia.org/wiki/~{0}"), fxt.xwiki_("ja", "ja.wikipedia.org", "http://ja.wikipedia.org/wiki/~{0}"));}
@Test public void Add_bulk_langs_grps() {fxt.Init_langs().Test_add_bulk_langs("europe_west~asia_east", fxt.xwiki_("de", "de.wikipedia.org", "http://de.wikipedia.org/wiki/~{0}"), fxt.xwiki_("fr", "fr.wikipedia.org", "http://fr.wikipedia.org/wiki/~{0}"), fxt.xwiki_("ja", "ja.wikipedia.org", "http://ja.wikipedia.org/wiki/~{0}"));}
@Test public void Add_bulk_langs_grp_itm() {fxt.Init_langs().Test_add_bulk_langs("europe_west~ja", fxt.xwiki_("de", "de.wikipedia.org", "http://de.wikipedia.org/wiki/~{0}"), fxt.xwiki_("fr", "fr.wikipedia.org", "http://fr.wikipedia.org/wiki/~{0}"), fxt.xwiki_("ja", "ja.wikipedia.org", "http://ja.wikipedia.org/wiki/~{0}"));}
@Test public void Add_bulk_langs_grp_commons() {
fxt.Init_langs();
fxt.Wiki().Xwiki_mgr().Add_bulk_langs(Bry_.new_a7("europe_west"), Xow_domain_type_.Int__wikipedia);
fxt.Tst_itms(fxt.xwiki_("de", "de.wikipedia.org", "http://de.wikipedia.org/wiki/~{0}"), fxt.xwiki_("fr", "fr.wikipedia.org", "http://fr.wikipedia.org/wiki/~{0}"));
}
@Test public void Add_bulk_peers() {fxt.Init_peers().Test_add_bulk_peers("peer", fxt.xwiki_null_("commons"), fxt.xwiki_null_("m"), fxt.xwiki_("wikt", "en.wiktionary.org", "http://en.wiktionary.org/wiki/~{0}"), fxt.xwiki_("wiktionary", "en.wiktionary.org", "http://en.wiktionary.org/wiki/~{0}"), fxt.xwiki_("s", "en.wikisource.org", "http://en.wikisource.org/wiki/~{0}"));}
@Test public void Add_bulk_peers_skip_self() {fxt.Init_peers().Test_add_bulk_peers("peer", fxt.xwiki_null_("wikipedia"), fxt.xwiki_("w", "en.wikipedia.org", "http://en.wikipedia.org/wiki/~{0}"));} // PURPOSE: skip "wikipedia" as alias since "Wikipedia" is namespace; needed for titles of "Wikipedia:Main page" (which would otherwise try to go to page "Main Page" in the main names of xwiki "Wikipedia"
@Test public void Add_bulk_core_wikidata() {fxt.Init_peers().Test_add_bulk_peers("core", fxt.xwiki_("d", "www.wikidata.org", "http://www.wikidata.org/wiki/~{0}"));}
@Test public void Add_bulk_peers_tid() { // PURPOSE:wikt should generate wiki_tid of wiktionary, not wikipedia; PAGE:en.s:Main_Page DATE:2014-09-14
fxt.Init_wikt ().Test_add_bulk_peers("peer", fxt.xwiki_("wikt", "en.wiktionary.org", "http://en.wiktionary.org/wiki/~{0}"));
}
@Test public void Multiple_aliases_should_only_add_once() { // PURPOSE.FIX: multiple aliases for same domain should only be added once to Get_at's list; DATE:2014-11-07
fxt.Exec_add_bulk("a1|a.org\na2|a.org").Test_len(1);
}
}
class Xow_xwiki_mgr_fxt {
Xow_xwiki_mgr xwiki_mgr; Xoa_lang_mgr lang_mgr; String_bldr sb = String_bldr_.new_(); Xoae_app app; Xowe_wiki wiki;
public void Clear() {
if (xwiki_mgr == null) {
app = Xoa_app_fxt.app_();
wiki = Xoa_app_fxt.wiki_tst_(app);
xwiki_mgr = wiki.Xwiki_mgr();
lang_mgr = app.Lang_mgr();
}
xwiki_mgr.Clear();
lang_mgr.Clear();
}
public Xowe_wiki Wiki() {return wiki;}
public Xow_xwiki_itm xwiki_null_(String key) {return Xow_xwiki_itm.new_(Bry_.new_u8(key), Bry_.Empty, Xol_lang_itm_.Id__unknown, Xow_domain_type_.Int__other, Bry_.Empty);}
public Xow_xwiki_itm xwiki_(String key, String domain_str, String url_fmt) {
Xow_domain_itm domain = Xow_domain_itm_.parse(Bry_.new_u8(domain_str));
return Xow_xwiki_itm.new_(Bry_.new_u8(key), Bry_.new_u8(url_fmt), domain.Lang_actl_itm().Id(), domain.Domain_type_id(), domain.Domain_bry());
}
public Xow_xwiki_mgr_fxt Test_add_bulk(String raw, int lang_tid, int wiki_tid, String alias, String fmt, String domain) {
Xow_xwiki_itm itm = xwiki_mgr.Add_bulk_row(Xol_lang_itm_.Regy(), Bry_.new_a7(raw));
Tfds.Eq(alias, String_.new_a7(itm.Key_bry()));
Tfds.Eq(fmt, String_.new_a7(itm.Url_fmt()));
Tfds.Eq(wiki_tid, itm.Domain_tid(), "wiki_tid");
Tfds.Eq(lang_tid, itm.Lang_id(), "lang_id");
return this;
}
public Xow_xwiki_mgr_fxt Init_langs() {
lang_mgr.Groups().Set_bulk(Bry_.new_u8(String_.Concat_lines_nl
( "+||grp|wiki"
, "+|wiki|grp|english"
, "+|wiki|grp|europe_west"
, "+|wiki|grp|asia_east"
, "+|english|itm|en|English"
, "+|europe_west|itm|fr|French"
, "+|europe_west|itm|de|German"
, "+|asia_east|itm|ja|Japanese"
)));
return this;
}
public Xow_xwiki_mgr_fxt Init_peers() {
app.Wiki_mgr().Groups().Set_bulk(Bry_.new_u8(String_.Concat_lines_nl
( "+|core|itm|commons|commons"
, "+|core|itm|meta|meta;m"
, "+|core|itm|wikidata|d"
, "+|peer|itm|wiktionary|wikt;wiktionary"
, "+|peer|itm|wikisource|s"
, "+|peer|itm|wikipedia|w;wikipedia"
)));
return this;
}
public Xow_xwiki_mgr_fxt Init_wikt() {
app.Wiki_mgr().Groups().Set_bulk(Bry_.new_u8(String_.Concat_lines_nl
( "+|peer|itm|wiktionary|wikt;wiktionary"
)));
return this;
}
public Xow_xwiki_mgr_fxt Test_add_bulk_langs(String langs, Xow_xwiki_itm... itms) {
xwiki_mgr.Add_bulk_langs(Bry_.new_u8(langs));
Tfds.Eq_str_lines(Xto_str(itms), Xto_str(To_ary(itms)));
return this;
}
public Xow_xwiki_mgr_fxt Test_add_bulk_peers(String peers, Xow_xwiki_itm... itms) {
xwiki_mgr.Add_bulk_peers(Bry_.new_u8(peers));
Tfds.Eq_str_lines(Xto_str(itms), Xto_str(To_ary(itms)));
return this;
}
public Xow_xwiki_mgr_fxt Tst_itms(Xow_xwiki_itm... itms) {
Tfds.Eq_str_lines(Xto_str(itms), Xto_str(To_ary(itms)));
return this;
}
public Xow_xwiki_mgr_fxt Exec_add_bulk(String raw) {xwiki_mgr.Add_bulk(Bry_.new_u8(raw)); return this;}
public Xow_xwiki_mgr_fxt Test_len(int expd) {Tfds.Eq(expd, xwiki_mgr.Len()); return this;}
Xow_xwiki_itm[] To_ary(Xow_xwiki_itm[] itms) {
int len = itms.length;
List_adp rv = List_adp_.new_();
for (int i = 0; i < len; i++) {
byte[] alias = itms[i].Key_bry();
Xow_xwiki_itm itm = xwiki_mgr.Get_by_key(alias);
if (itm == null) itm = xwiki_null_(String_.new_u8(alias)); // "null", ignore
rv.Add(itm);
}
return (Xow_xwiki_itm[])rv.To_ary(Xow_xwiki_itm.class);
}
String Xto_str(Xow_xwiki_itm[] itms) {
int len = itms.length;
for (int i = 0; i < len; i++) {
Xow_xwiki_itm itm = itms[i];
if (Bry_.Len_eq_0(itm.Domain_bry())) // "null", ignore
sb.Add(itm.Key_bry()).Add_char_nl();
else {
sb.Add(itm.Key_bry()).Add_char_pipe().Add(itm.Domain_bry()).Add_char_pipe().Add(itm.Url_fmt()).Add_char_pipe().Add(itm.Domain_tid()).Add_char_nl();
}
}
return sb.Xto_str_and_clear();
}
}

View File

@@ -15,26 +15,25 @@ 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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
package gplx.xowa.wikis.xwikis.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.core.net.*;
import gplx.xowa.apps.gfss.*;
import gplx.xowa.apps.gfs.*;
import gplx.xowa.langs.*;
import gplx.xowa.wikis.domains.*;
public class Xow_xwiki_itm_bldr {
private final Bry_bfr tmp_bfr = Bry_bfr.new_();
private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url();
public Xow_xwiki_itm Bld(Xow_domain_itm cur_domain, byte[] key, byte[] mw_url, byte[] domain_name) {
byte[] xo_url = Xoa_gfs_php_mgr.Xto_gfs(tmp_bfr, mw_url); // EX: "//commons.wikimedia.org/wiki/Category:$1" -> "//commons.wikimedia.org/wiki/Category:~{0}"
url_parser.Parse(url, xo_url, 0, xo_url.length);
byte[] domain_bry = url.Segs__get_at_1st(); // extract "commons.wikimedia.org"
public Xow_xwiki_itm Bld_mw(Xow_domain_itm cur_domain, byte[] key, byte[] mw_url, byte[] domain_name) {return Bld_xo(cur_domain, key, Xoa_gfs_php_mgr.Xto_gfs(tmp_bfr, mw_url), domain_name);} // EX: "//commons.wikimedia.org/wiki/Category:$1" -> "//commons.wikimedia.org/wiki/Category:~{0}"
public Xow_xwiki_itm Bld_xo(Xow_domain_itm cur_domain, byte[] key, byte[] xo_url, byte[] domain_name) {
byte[] domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, xo_url);
Xow_domain_itm domain_itm = Xow_domain_itm_.parse(domain_bry);
Xol_lang_itm lang_itm = Xol_lang_itm_.Get_by_key(domain_itm.Lang_actl_key());
int lang_id = lang_itm == null ? Xol_lang_itm_.Id__unknown : lang_itm.Id();
Xol_lang_stub lang_itm = Xol_lang_stub_.Get_by_key_or_null(domain_itm.Lang_actl_key());
int lang_id = lang_itm == null ? Xol_lang_stub_.Id__unknown : lang_itm.Id();
if (domain_name == null) { // no hard-coded name; currently dmoz or commons
domain_name = (byte[])domain_name_hash.Get_by_bry(domain_bry); // NOTE: domain_name is needed for "Related Sites" in wikivoyage
if (domain_name == null) {
if ( cur_domain.Domain_type_id() != Xow_domain_type_.Int__wikipedia // cur_domain is not wikipedia
&& domain_itm.Domain_type_id() == Xow_domain_type_.Int__wikipedia // domain_itm is wikipedia
if ( cur_domain.Domain_type_id() != Xow_domain_tid_.Int__wikipedia // cur_domain is not wikipedia
&& domain_itm.Domain_type_id() == Xow_domain_tid_.Int__wikipedia // domain_itm is wikipedia
&& cur_domain.Lang_actl_uid() == domain_itm.Lang_actl_uid() // cur_domain lang matches domain_lang
) {
domain_name = Bry__domain_name__wikipedia; // EX: in "en.wikivoyage.org", "en.wikipedia.org" should have name of "Wikipedia" (not "en.wikipedia.org")
@@ -43,12 +42,12 @@ public class Xow_xwiki_itm_bldr {
domain_name = domain_bry; // default to domain_bry
}
}
return new Xow_xwiki_itm(key, xo_url, lang_id, domain_itm.Domain_type_id(), domain_bry, domain_name);
return new Xow_xwiki_itm(key, xo_url, lang_id, domain_itm.Domain_type_id(), domain_bry, domain_name, cur_domain.Abrv_wm());
}
private static final Hash_adp_bry domain_name_hash = Hash_adp_bry.cs()
.Add_str_obj("commons.wikimedia.org" , Bry_.new_a7("Wikimedia Commons"))
.Add_str_obj("www.dmoz.org" , Bry_.new_a7("DMOZ"))
;
private static final byte[] Bry__domain_name__wikipedia = Bry_.new_a7("Wikipedia");
public static final Xow_xwiki_itm_bldr I = new Xow_xwiki_itm_bldr(); Xow_xwiki_itm_bldr() {}
public static final Xow_xwiki_itm_bldr Instance = new Xow_xwiki_itm_bldr(); Xow_xwiki_itm_bldr() {}
}

View File

@@ -15,21 +15,21 @@ 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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
package gplx.xowa.wikis.xwikis.bldrs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import org.junit.*; import gplx.xowa.langs.*; import gplx.xowa.wikis.domains.*;
public class Xow_xwiki_itm_tst {
@Before public void init() {fxt.Clear();} private Xow_xwiki_itm_fxt fxt = new Xow_xwiki_itm_fxt();
@Test public void Commons() {fxt.Test_bld("commons.wikimedia.org/wiki/$1" , "commons.wikimedia.org" , "commons.wikimedia.org/wiki/~{0}" , Xow_domain_type_.Int__commons , Xol_lang_itm_.Id__unknown);}
@Test public void Wiktionary() {fxt.Test_bld("fr.wiktionary.org/wiki/$1" , "fr.wiktionary.org" , "fr.wiktionary.org/wiki/~{0}" , Xow_domain_type_.Int__wiktionary , Xol_lang_itm_.Id_fr);}
@Test public void Lang() {fxt.Test_bld("fr.wikipedia.org/wiki/$1" , "fr.wikipedia.org" , "fr.wikipedia.org/wiki/~{0}" , Xow_domain_type_.Int__wikipedia , Xol_lang_itm_.Id_fr);}
public class Xow_xwiki_itm_bldr_tst {
@Before public void init() {fxt.Clear();} private final Xow_xwiki_itm_bldr_fxt fxt = new Xow_xwiki_itm_bldr_fxt();
@Test public void Commons() {fxt.Test_bld("commons.wikimedia.org/wiki/$1" , "commons.wikimedia.org" , "commons.wikimedia.org/wiki/~{0}" , Xow_domain_tid_.Int__commons , Xol_lang_stub_.Id__unknown);}
@Test public void Wiktionary() {fxt.Test_bld("fr.wiktionary.org/wiki/$1" , "fr.wiktionary.org" , "fr.wiktionary.org/wiki/~{0}" , Xow_domain_tid_.Int__wiktionary , Xol_lang_stub_.Id_fr);}
@Test public void Lang() {fxt.Test_bld("fr.wikipedia.org/wiki/$1" , "fr.wikipedia.org" , "fr.wikipedia.org/wiki/~{0}" , Xow_domain_tid_.Int__wikipedia , Xol_lang_stub_.Id_fr);}
}
class Xow_xwiki_itm_fxt {
class Xow_xwiki_itm_bldr_fxt {
private Xow_domain_itm domain_itm;
public void Clear() {
domain_itm = Xow_domain_itm.new_(Bry_.new_a7("en.wikivoyage.org"), Xow_domain_type_.Int__wikivoyage, Xol_lang_.Key_en); // NOTE: use "en.wikivoyage.org" to domain_name; needed for "Related sites"
domain_itm = Xow_domain_itm.new_(Bry_.new_a7("en.wikivoyage.org"), Xow_domain_tid_.Int__wikivoyage, Xol_lang_itm_.Key_en); // NOTE: use "en.wikivoyage.org" to domain_name; needed for "Related sites"
}
public void Test_bld(String url, String expd_domain, String expd_url_fmt, int expd_wiki_tid, int expd_lang_tid) {
Xow_xwiki_itm itm = Xow_xwiki_itm_bldr.I.Bld(domain_itm, domain_itm.Domain_bry(), Bry_.new_u8(url), null);
Xow_xwiki_itm itm = Xow_xwiki_itm_bldr.Instance.Bld_mw(domain_itm, domain_itm.Domain_bry(), Bry_.new_u8(url), null);
Tfds.Eq(expd_domain , String_.new_u8(itm.Domain_bry()));
Tfds.Eq(expd_url_fmt , String_.new_u8(itm.Url_fmt()));
Tfds.Eq(expd_wiki_tid , itm.Domain_tid(), "wiki");

View File

@@ -1,38 +0,0 @@
/*
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.wikis.xwikis.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.core.strings.*;
public class Xoac_wiki_cfg_bldr_cmd {
public Xoac_wiki_cfg_bldr_cmd(String key, String text) {this.key = key; this.text = text;}
public String Key() {return key;} private String key;
public String Text() {return text;} private String text;
public String Exec(String_bldr sb, String wiki, String src) {
String sect_txt_bgn = sb.Add("// ").Add(key).Add(".bgn\n").Xto_str_and_clear();
String sect_txt_end = sb.Add("// ").Add(key).Add(".end\n").Xto_str_and_clear();
String sect_txt_all = sb.Add(sect_txt_bgn).Add(text + "\n").Add(sect_txt_end).Xto_str_and_clear(); // NOTE: always add \n; convenience for single line cmds
// int sect_pos_bgn = String_.FindFwd(src, sect_txt_bgn);
// if (sect_pos_bgn == String_.Find_none) // new cmd; add to end of file
return src + sect_txt_all;
// int sect_pos_end = String_.FindFwd(src, sect_txt_end);
// if (sect_pos_end == String_.Find_none)
// throw Err_.new_wo_type("section_fail: " + wiki + " " + key);
// try {
// return sb.Add(String_.Mid(src, 0, sect_pos_bgn)).Add(sect_txt_all).Add(String_.Mid(src, sect_pos_end + String_.Len(sect_txt_end), String_.Len(text))).Xto_str_and_clear();
// } catch (Exception e) {Err_.Noop(e); throw Err_.new_wo_type("section_fail: " + wiki + " " + key);}
}
}

View File

@@ -1,35 +0,0 @@
/*
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.wikis.xwikis.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
public class Xoac_wiki_cfg_bldr_fil implements GfoInvkAble {
public Xoac_wiki_cfg_bldr_fil(String wiki) {this.wiki = wiki;}
public String Wiki() {return wiki;} private String wiki;
public int Itms_count() {return list.Count();}
public Xoac_wiki_cfg_bldr_cmd Itms_get_at(int i) {return (Xoac_wiki_cfg_bldr_cmd)list.Get_at(i);}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_new_cmd_)) {Itms_add(m.ReadStr("id"), m.ReadStr("text"));}
else return GfoInvkAble_.Rv_unhandled;
return this;
} private static final String Invk_new_cmd_ = "new_cmd_";
public Xoac_wiki_cfg_bldr_cmd Itms_add(String key, String text) {
Xoac_wiki_cfg_bldr_cmd rv = new Xoac_wiki_cfg_bldr_cmd(key, text);
list.Add(rv);
return rv;
}
List_adp list = List_adp_.new_();
}

View File

@@ -1,48 +0,0 @@
/*
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.wikis.xwikis.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.langs.cfgs.*;
interface Xoac_wiki_obj {}
public class Xoac_wiki_grp implements Cfg_nde_obj, Xoac_wiki_obj {
public Xoac_wiki_grp(byte[] key) {this.key_bry = key; this.name_bry = key_bry;}
public byte[] Key_bry() {return key_bry;} private byte[] key_bry;
public byte[] Name_bry() {return name_bry;} private byte[] name_bry;
public boolean Nde_typ_is_grp() {return true;}
public byte[] Nde_key() {return key_bry;}
public Cfg_nde_obj Nde_subs_make(byte[] itm_type, byte[] itm_key, byte[][] itm_atrs) {
Cfg_nde_obj rv = null;
if (Bry_.Eq(itm_type, Make_grp)) rv = new Xoac_wiki_grp(itm_key);
else if (Bry_.Eq(itm_type, Make_itm)) rv = new Xoac_wiki_itm(itm_key);
else throw Err_.new_unhandled(itm_type);
rv.Nde_atrs_set(itm_atrs);
return rv;
}
public int Nde_subs_len() {return itms.Count();}
public Cfg_nde_obj Nde_subs_get_at(int i) {return (Cfg_nde_obj)itms.Get_at(i);}
public Cfg_nde_obj Nde_subs_get(byte[] key) {return (Cfg_nde_obj)itms.Get_by(key);}
public void Nde_subs_add(byte[] itm_key, Cfg_nde_obj itm_obj) {itms.Add(itm_key, itm_obj);}
public void Nde_subs_del(byte[] key) {itms.Del(key);}
public void Nde_atrs_set(byte[][] ary) {
int ary_len = ary.length;
if (ary_len > 0) name_bry = ary[0];
}
public static final byte[] Make_grp = Bry_.new_a7("grp"), Make_itm = Bry_.new_a7("itm");
public int Itms_len() {return itms.Count();}
public Cfg_nde_obj Itms_get_at(int i) {return (Cfg_nde_obj)itms.Get_at(i);}
Ordered_hash itms = Ordered_hash_.new_bry_();
}

View File

@@ -1,99 +0,0 @@
/*
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.wikis.xwikis.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import org.junit.*; import gplx.core.tests.*;
import gplx.xowa.wikis.*; import gplx.xowa.langs.cfgs.*;
public class Xoac_wiki_grp_tst {
Xoac_wiki_grp_fxt fxt = new Xoac_wiki_grp_fxt();
@Before public void init() {fxt.Clear();}
@Test public void Add_itm_new() {
fxt.Define_bulk(String_.Concat_lines_nl
( "+|core|itm|commons|commons"
, "+|core|itm|meta|meta;m"
, "+|peer|itm|wiktionary|wikt;wiktionary"
, "+|peer|itm|wikisource|s"
)
, fxt.grp_("core").Itms_
( fxt.itm_("commons").Aliases_("commons")
, fxt.itm_("meta").Aliases_("meta", "m")
)
, fxt.grp_("peer").Itms_
( fxt.itm_("wiktionary").Aliases_("wikt", "wiktionary")
, fxt.itm_("wikisource").Aliases_("s")
)
);
}
}
class Xoac_wiki_grp_fxt {
Xoae_wiki_mgr wiki_mgr; Tst_mgr tst_mgr = new Tst_mgr();
public void Clear() {
Xoae_app app = Xoa_app_fxt.app_();
wiki_mgr = app.Wiki_mgr();
}
public Xoac_wiki_itm_chkr itm_(String key) {return new Xoac_wiki_itm_chkr(key);}
public Xoac_wiki_grp_chkr grp_(String key) {return new Xoac_wiki_grp_chkr(key);}
public Xoac_wiki_grp_fxt Define_bulk(String raw, Xoac_wiki_grp_chkr... expd) {
wiki_mgr.Groups().Set_bulk(Bry_.new_u8(raw));
tst_mgr.Tst_ary("", expd, To_ary(wiki_mgr.Groups()));
return this;
}
Xoac_wiki_grp[] To_ary(Cfg_nde_root root) {
int len = root.Root_len();
Xoac_wiki_grp[] rv = new Xoac_wiki_grp[len];
for (int i = 0; i < len; i++) {
rv[i] = (Xoac_wiki_grp)root.Root_get_at(i); // ASSUME: root only has grps (no itms)
}
return rv;
}
}
interface Xoac_wiki_chkr_obj extends Tst_chkr {}
class Xoac_wiki_itm_chkr implements Xoac_wiki_chkr_obj {
public Xoac_wiki_itm_chkr(String key) {this.key = key;}
public String Key() {return key;} private String key;
public Xoac_wiki_itm_chkr Aliases_(String... v) {aliases = v; return this;} private String[] aliases;
public Class<?> TypeOf() {return Xoac_wiki_itm.class;}
public int Chk(Tst_mgr mgr, String path, Object actl_obj) {
Xoac_wiki_itm actl = (Xoac_wiki_itm)actl_obj;
int rv = 0;
rv += mgr.Tst_val(key == null, path, "key", key, String_.new_u8(actl.Key_bry()));
rv += mgr.Tst_val(aliases == null, path, "aliases", String_.AryXtoStr(aliases), String_.AryXtoStr(String_.Ary(actl.Aliases())));
return rv;
}
}
class Xoac_wiki_grp_chkr implements Xoac_wiki_chkr_obj {
public Xoac_wiki_grp_chkr(String key) {this.key = key;}
public String Key() {return key;} private String key;
public Xoac_wiki_grp_chkr Name_(String v) {name = v; return this;} private String name;
public Xoac_wiki_grp_chkr Itms_(Xoac_wiki_chkr_obj... v) {this.itms = v; return this;} private Xoac_wiki_chkr_obj[] itms;
public Class<?> TypeOf() {return Xoac_wiki_grp.class;}
public int Chk(Tst_mgr mgr, String path, Object actl_obj) {
Xoac_wiki_grp actl = (Xoac_wiki_grp)actl_obj;
int rv = 0;
rv += mgr.Tst_val(key == null, path, "key", key, String_.new_u8(actl.Key_bry()));
rv += mgr.Tst_val(name == null, path, "name", name, String_.new_u8(actl.Name_bry()));
rv += mgr.Tst_sub_ary(itms, To_ary(actl), path, rv);
return rv;
}
Xoac_wiki_obj[] To_ary(Xoac_wiki_grp grp) {
int len = grp.Itms_len();
Xoac_wiki_obj[] rv = new Xoac_wiki_obj[len];
for (int i = 0; i < len; i++)
rv[i] = (Xoac_wiki_obj)grp.Itms_get_at(i); // ASSUME: grp only has itms (no grps)
return rv;
}
}

View File

@@ -1,36 +0,0 @@
/*
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.wikis.xwikis.cfgs; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.langs.cfgs.*;
public class Xoac_wiki_itm implements Cfg_nde_obj, Xoac_wiki_obj {
public Xoac_wiki_itm(byte[] key) {this.key_bry = key;}
public byte[] Key_bry() {return key_bry;} private byte[] key_bry;
public byte[][] Aliases() {return aliases;} private byte[][] aliases;
public byte[] Nde_key() {return key_bry;}
public boolean Nde_typ_is_grp() {return false;}
public Cfg_nde_obj Nde_subs_make(byte[] itm_type, byte[] itm_key, byte[][] itm_atrs) {throw Err_.new_wo_type("leafs cannot have itms", "type", itm_type, "key", itm_key);}
public Cfg_nde_obj Nde_subs_get(byte[] key) {throw Err_.new_wo_type("leafs cannot have itms", "key", key);}
public int Nde_subs_len() {return 0;}
public Cfg_nde_obj Nde_subs_get_at(int i) {throw Err_.new_wo_type("leafs cannot have itms", "idx", i);}
public void Nde_subs_add(byte[] itm_key, Cfg_nde_obj itm_obj) {throw Err_.new_wo_type("leafs cannot have itms", "key", String_.new_u8(itm_key));}
public void Nde_subs_del(byte[] key) {throw Err_.new_wo_type("leafs cannot delete itms", "key", String_.new_u8(key));}
public void Nde_atrs_set(byte[][] ary) {
int ary_len = ary.length;
if (ary_len > 0) aliases = Bry_split_.Split(ary[0], Byte_ascii.Semic);
}
}

View File

@@ -0,0 +1,92 @@
/*
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.wikis.xwikis.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.core.net.*;
import gplx.langs.dsvs.*;
import gplx.xowa.langs.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.xwikis.bldrs.*;
public class Xow_xwiki_itm_parser extends Dsv_wkr_base {
private Xow_domain_itm owner_domain_itm;
private int cur_tid = -1; private byte[] cur_fld1, cur_fld2, cur_fld3;
private final Gfo_url_parser url_parser = new Gfo_url_parser(); private final Gfo_url url = new Gfo_url();
public Ordered_hash Xwiki_list() {return xwiki_list;} private final Ordered_hash xwiki_list = Ordered_hash_.New();
@Override public Dsv_fld_parser[] Fld_parsers() {return new Dsv_fld_parser[] {Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser};}
@Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) {
switch (fld_idx) {
case 0: cur_tid = Bry_.To_int_or(src, bgn, end, -1); return true;
case 1: cur_fld1 = Bry_.Mid(src, bgn, end); return true;
case 2: cur_fld2 = Bry_.Mid(src, bgn, end); return true;
case 3: cur_fld3 = Bry_.Mid(src, bgn, end); return true;
default: return false;
}
}
public Xow_xwiki_itm_parser Init_by_wiki(Xow_domain_itm owner_domain_itm) {this.owner_domain_itm = owner_domain_itm; return this;}
@Override public void Load_by_bry_bgn() {xwiki_list.Clear();}
@Override public void Commit_itm(Dsv_tbl_parser parser, int pos) {
byte[][] key_ary = Bry_split_.Split(cur_fld1, Byte_ascii.Semic); // allow multiple key defs; EX: "w;wikipedia"
boolean xwiki_is_mw = true;
byte[] domain_name = cur_fld3; // NOTE: by happenstance, domain_name is always cur_fld3
byte[] url_fmt = null, domain_bry = null;
switch (cur_tid) {
case Tid__manual: // EX: "0|domz|http://www.dmoz.org/~{0}|DMOZ"
xwiki_is_mw = false;
url_fmt = cur_fld2;
domain_bry = Xow_xwiki_mgr.Get_domain_from_url(url_parser, url, url_fmt);
break;
case Tid__mw_domain: // EX: "1|w|en.wikipedia.org"
domain_bry = cur_fld2;
break;
case Tid__wm_peer: // EX: "2|wikt|wikipedia"
domain_bry = Bry_.Add(owner_domain_itm.Lang_actl_key(), Byte_ascii.Dot_bry, cur_fld2, gplx.xowa.apps.urls.Xoa_url_parser.Bry_dot_org);
break;
case Tid__wm_lang: // EX: "3|en;english|en|English"
domain_bry = Bry_.Add(cur_fld2, Byte_ascii.Dot_bry, owner_domain_itm.Domain_type().Key_bry(), gplx.xowa.apps.urls.Xoa_url_parser.Bry_dot_org);
break;
default: throw Err_.new_unhandled(cur_tid);
}
byte[] abrv_wm = null;
int lang_id = Xol_lang_stub_.Id__unknown, domain_tid = Xow_domain_tid_.Int__other;
if (xwiki_is_mw) {
url_fmt = Xow_xwiki_mgr.Bld_url_fmt(domain_bry);
Xow_domain_itm domain_itm = Xow_domain_itm_.parse(domain_bry);
if (Bry_.Len_eq_0(domain_name)) { // no name; build default
Xol_lang_stub stub_itm = Xol_lang_stub_.Get_by_key_or_null(domain_itm.Lang_actl_itm().Key());
byte[] lang_name = stub_itm == null ? Bry_.Empty : stub_itm.Canonical_name();
domain_name = Bry_.Add_w_dlm(Byte_ascii.Space, lang_name, domain_itm.Domain_type().Display_bry());
}
abrv_wm = domain_itm.Abrv_wm();
lang_id = domain_itm.Lang_actl_uid();
domain_tid = domain_itm.Domain_type_id();
}
Create_xwikis(key_ary, url_fmt, lang_id, domain_tid, domain_bry, domain_name, abrv_wm);
cur_tid = -1;
cur_fld1 = cur_fld2 = cur_fld3 = null;
}
private void Create_xwikis(byte[][] key_ary, byte[] url_fmt, int lang_id, int domain_tid, byte[] domain_bry, byte[] domain_name, byte[] abrv_wm) {
for (byte[] key : key_ary) {
Xow_xwiki_itm itm = Xow_xwiki_itm_bldr.Instance.Bld_xo(owner_domain_itm, key, url_fmt, domain_name);
xwiki_list.Add(key, itm);
}
}
public static final int
Tid__manual = 0
, Tid__mw_domain = 1
, Tid__wm_peer = 2
, Tid__wm_lang = 3
;
}

View File

@@ -0,0 +1,97 @@
/*
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.wikis.xwikis.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import org.junit.*; import gplx.xowa.wikis.domains.*;
public class Xow_xwiki_itm_parser_tst {
private final Xow_xwiki_itm_parser_fxt fxt = new Xow_xwiki_itm_parser_fxt();
@Test public void Manual() {
fxt.Exec_parse(String_.Concat_lines_nl_skip_last
( "0|a|https://a.org/~{0}|A"
));
fxt.Test_parse(String_.Concat_lines_nl_skip_last
( "a|https://a.org/~{0}|A"
));
}
@Test public void Mw_domain() {
fxt.Exec_parse(String_.Concat_lines_nl_skip_last
( "1|w|en.wikipedia.org|Wikipedia"
));
fxt.Test_parse(String_.Concat_lines_nl_skip_last
( "w|https://en.wikipedia.org/wiki/~{0}|Wikipedia"
));
}
@Test public void Wm_peer() {
fxt.Exec_parse(String_.Concat_lines_nl_skip_last
( "2|wikt|wiktionary|Wiktionary"
));
fxt.Test_parse(String_.Concat_lines_nl_skip_last
( "wikt|https://en.wiktionary.org/wiki/~{0}|Wiktionary"
));
}
@Test public void Wm_lang() {
fxt.Exec_parse(String_.Concat_lines_nl_skip_last
( "3|fr|fr|French"
));
fxt.Test_parse(String_.Concat_lines_nl_skip_last
( "fr|https://fr.wikipedia.org/wiki/~{0}|French"
));
}
@Test public void Multiple() {
fxt.Exec_parse(String_.Concat_lines_nl_skip_last
( "2|wikt;wiktionary|wiktionary|Wiktionary"
));
fxt.Test_parse(String_.Concat_lines_nl_skip_last
( "wikt|https://en.wiktionary.org/wiki/~{0}|Wiktionary"
, "wiktionary|https://en.wiktionary.org/wiki/~{0}|Wiktionary"
));
}
@Test public void Default_name() {
fxt.Exec_parse(String_.Concat_lines_nl_skip_last
( "2|wikt|wiktionary|"
));
fxt.Test_parse(String_.Concat_lines_nl_skip_last
( "wikt|https://en.wiktionary.org/wiki/~{0}|English Wiktionary"
));
}
}
class Xow_xwiki_itm_parser_fxt {
private final Xow_xwiki_itm_parser parser = new Xow_xwiki_itm_parser();
private final Bry_bfr tmp_bfr = Bry_bfr.new_();
public Xow_xwiki_itm_parser_fxt() {
parser.Init_by_wiki(Xow_domain_itm_.parse(Bry_.new_a7("en.wikipedia.org")));
}
public void Exec_parse(String raw) {
byte[] src = Bry_.new_u8(raw);
parser.Load_by_bry(src);
}
public void Test_parse(String expd) {
Tfds.Eq_str_lines(expd, To_str());
}
private String To_str() {
Ordered_hash list = parser.Xwiki_list();
int len = list.Count();
for (int i = 0; i < len; ++i) {
Xow_xwiki_itm itm = (Xow_xwiki_itm)list.Get_at(i);
tmp_bfr.Add(itm.Key_bry()).Add_byte_pipe();
tmp_bfr.Add(itm.Url_fmt()).Add_byte_pipe();
tmp_bfr.Add(itm.Domain_name()).Add_byte_nl();
}
list.Clear();
return tmp_bfr.To_str_and_clear();
}
}

View File

@@ -0,0 +1,147 @@
/*
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.wikis.xwikis.parsers; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import org.junit.*; import gplx.core.strings.*;
import gplx.xowa.wikis.domains.*; import gplx.xowa.langs.*;
public class Xow_xwiki_mgr_tst {
@Before public void init() {fxt.Clear();} private Xow_xwiki_mgr_fxt fxt = new Xow_xwiki_mgr_fxt();
@Test public void Add_bulk_langs_wiki() {
fxt.Init_langs();
fxt.Test_add_bulk_langs
( fxt.xwiki_("en", "en.wikipedia.org", "https://en.wikipedia.org/wiki/~{0}")
, fxt.xwiki_("de", "de.wikipedia.org", "https://de.wikipedia.org/wiki/~{0}")
, fxt.xwiki_("fr", "fr.wikipedia.org", "https://fr.wikipedia.org/wiki/~{0}")
, fxt.xwiki_("ja", "ja.wikipedia.org", "https://ja.wikipedia.org/wiki/~{0}")
);
}
@Test public void Add_bulk_langs_grp_commons() {
fxt.Init_langs();
fxt.Wiki().Xwiki_mgr().Add_by_sitelink_mgr(Xow_domain_tid_.Int__wikipedia);
fxt.Tst_itms(fxt.xwiki_("de", "de.wikipedia.org", "https://de.wikipedia.org/wiki/~{0}"), fxt.xwiki_("fr", "fr.wikipedia.org", "https://fr.wikipedia.org/wiki/~{0}"));
}
@Test public void Add_bulk_peers() {
fxt.Init_peers();
fxt.Test_add_bulk_peers
( fxt.xwiki_("wikt", "en.wiktionary.org"
, "https://en.wiktionary.org/wiki/~{0}")
, fxt.xwiki_("wiktionary", "en.wiktionary.org"
, "https://en.wiktionary.org/wiki/~{0}")
, fxt.xwiki_("s", "en.wikisource.org", "https://en.wikisource.org/wiki/~{0}"));
}
@Test public void Add_bulk_peers_skip_self() { // PURPOSE: skip "wikipedia" as alias since "Wikipedia" is namespace; needed for titles of "Wikipedia:Main page" (which would otherwise try to go to page "Main Page" in the main names of xwiki "Wikipedia"
fxt.Init_peers();
fxt.Test_add_bulk_peers
( fxt.xwiki_null_("wikipedia")
, fxt.xwiki_("w", "en.wikipedia.org", "https://en.wikipedia.org/wiki/~{0}"));
}
@Test public void Add_bulk_peers_tid() { // PURPOSE:wikt should generate wiki_tid of wiktionary, not wikipedia; PAGE:en.s:Main_Page DATE:2014-09-14
fxt.Init_wikt ().Test_add_bulk_peers(fxt.xwiki_("wikt", "en.wiktionary.org", "https://en.wiktionary.org/wiki/~{0}"));
}
// @Test public void Duplicate() { // PURPOSE.FIX: multiple aliases for same domain should only be added once to Get_at's list; DATE:2014-11-07
// fxt.Exec_parse(String_.Concat_lines_nl_skip_last
// ( "0|a1|a.org"
// , "0|a2|a.org"
// ));
// fxt.Test_parse(String_.Concat_lines_nl_skip_last
// ( "a1|https://a.org//~{0}"
// ));
// }
}
class Xow_xwiki_mgr_fxt {
Xow_xwiki_mgr xwiki_mgr; Xoa_lang_mgr lang_mgr; String_bldr sb = String_bldr_.new_(); Xoae_app app; Xowe_wiki wiki;
public void Clear() {
if (xwiki_mgr == null) {
app = Xoa_app_fxt.app_();
wiki = Xoa_app_fxt.wiki_tst_(app);
xwiki_mgr = wiki.Xwiki_mgr();
lang_mgr = app.Lang_mgr();
}
xwiki_mgr.Clear();
lang_mgr.Clear();
}
public Xowe_wiki Wiki() {return wiki;}
public Xow_xwiki_itm xwiki_null_(String key) {return Xow_xwiki_itm.new_(Bry_.new_u8(key), Bry_.Empty, Xol_lang_stub_.Id__unknown, Xow_domain_tid_.Int__other, Bry_.Empty, Bry_.Empty);}
public Xow_xwiki_itm xwiki_(String key, String domain_str, String url_fmt) {
Xow_domain_itm domain = Xow_domain_itm_.parse(Bry_.new_u8(domain_str));
return Xow_xwiki_itm.new_(Bry_.new_u8(key), Bry_.new_u8(url_fmt), domain.Lang_actl_itm().Id(), domain.Domain_type_id(), domain.Domain_bry(), domain.Abrv_wm());
}
public Xow_xwiki_mgr_fxt Init_langs() {
app.Xwiki_mgr__sitelink_mgr().Parse(Bry_.new_u8(String_.Concat_lines_nl
( "0|english"
, "1|en|English"
, "0|europe_west"
, "1|fr|French"
, "1|de|German"
, "0|asia_east"
, "1|ja|Japanese"
)));
return this;
}
public Xow_xwiki_mgr_fxt Init_peers() {
wiki.Xwiki_mgr().Add_by_csv(Bry_.new_u8(String_.Concat_lines_nl
( "1|d|www.wikidata.org"
, "2|wikt;wiktionary|wiktionary"
, "2|s|wikisource"
, "2|w;wikipedia|wikipedia"
)));
return this;
}
public Xow_xwiki_mgr_fxt Init_wikt() {
wiki.Xwiki_mgr().Add_by_csv(Bry_.new_u8(String_.Concat_lines_nl
( "2|wikt;wiktionary|wiktionary"
)));
return this;
}
public Xow_xwiki_mgr_fxt Test_add_bulk_langs(Xow_xwiki_itm... itms) {
xwiki_mgr.Add_by_sitelink_mgr();
Tfds.Eq_str_lines(Xto_str(itms), Xto_str(To_ary(itms)));
return this;
}
public Xow_xwiki_mgr_fxt Test_add_bulk_peers(Xow_xwiki_itm... itms) {
Tfds.Eq_str_lines(Xto_str(itms), Xto_str(To_ary(itms)));
return this;
}
public Xow_xwiki_mgr_fxt Tst_itms(Xow_xwiki_itm... itms) {
Tfds.Eq_str_lines(Xto_str(itms), Xto_str(To_ary(itms)));
return this;
}
public Xow_xwiki_mgr_fxt Test_len(int expd) {Tfds.Eq(expd, xwiki_mgr.Len()); return this;}
Xow_xwiki_itm[] To_ary(Xow_xwiki_itm[] itms) {
int len = itms.length;
List_adp rv = List_adp_.new_();
for (int i = 0; i < len; i++) {
byte[] alias = itms[i].Key_bry();
Xow_xwiki_itm itm = xwiki_mgr.Get_by_key(alias);
if (itm == null) itm = xwiki_null_(String_.new_u8(alias)); // "null", ignore
rv.Add(itm);
}
return (Xow_xwiki_itm[])rv.To_ary(Xow_xwiki_itm.class);
}
String Xto_str(Xow_xwiki_itm[] itms) {
int len = itms.length;
for (int i = 0; i < len; i++) {
Xow_xwiki_itm itm = itms[i];
if (Bry_.Len_eq_0(itm.Domain_bry())) // "null", ignore
sb.Add(itm.Key_bry()).Add_char_nl();
else {
sb.Add(itm.Key_bry()).Add_char_pipe().Add(itm.Domain_bry()).Add_char_pipe().Add(itm.Url_fmt()).Add_char_pipe().Add(itm.Domain_tid()).Add_char_nl();
}
}
return sb.To_str_and_clear();
}
}

View File

@@ -0,0 +1,51 @@
/*
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.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
public class Xoa_sitelink_grp implements gplx.CompareAble {
private final Ordered_hash hash = Ordered_hash_.New_bry();
public Xoa_sitelink_grp(byte[] name, int sort) {
this.name = name;
this.sort = sort;
}
public byte[] Name() {return name;} private final byte[] name;
public int Sort() {return sort;} private final int sort;
public int Len() {return hash.Count();}
public Xoa_sitelink_itm Get_at(int i) {return (Xoa_sitelink_itm)hash.Get_at(i);}
public void Add(Xoa_sitelink_itm itm) {hash.Add(itm.Key(), itm);}
public void Del(byte[] key) {hash.Del(key);}
public void Active_len__add() {++active_len;}
public int Active_len() {return active_len;} private int active_len;
public void Reset() {
int len = hash.Count();
for (int i = 0; i < len; ++i) {
Xoa_sitelink_itm itm = (Xoa_sitelink_itm)hash.Get_at(i);
itm.Init_by_page(null, null, false, null); // clear out pre-existing page names; needed b/c this struct is a singleton for entire wiki
}
active_len = 0;
}
public int compareTo(Object obj) {Xoa_sitelink_grp comp = (Xoa_sitelink_grp)obj; return Int_.Compare(sort, comp.sort);}
public void To_bfr(Bry_bfr bfr) {
bfr.Add_int_digits(1, Xoa_sitelink_mgr_parser.Tid__grp).Add_byte_pipe();
bfr.Add(name).Add_byte_nl();
int len = hash.Count();
for (int i = 0; i < len; ++i) {
Xoa_sitelink_itm itm = (Xoa_sitelink_itm)hash.Get_at(i);
itm.To_bfr(bfr);
}
}
}

View File

@@ -0,0 +1,45 @@
/*
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.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
public class Xoa_sitelink_grp_mgr {
private final Ordered_hash hash = Ordered_hash_.New_bry();
public Xoa_sitelink_grp_mgr() {
this.default_grp = new Xoa_sitelink_grp(Bry_.new_a7("Others"), 1024);
hash.Add(default_grp.Name(), default_grp);
}
public Xoa_sitelink_grp Default_grp() {return default_grp;} private final Xoa_sitelink_grp default_grp;
public int Len() {return hash.Count();}
public void Clear() {hash.Clear();}
public Xoa_sitelink_grp Get_at(int idx) {return (Xoa_sitelink_grp)hash.Get_at(idx);}
public Xoa_sitelink_grp Get_by_or_new(byte[] key) {
Xoa_sitelink_grp rv = (Xoa_sitelink_grp)hash.Get_by(key);
if (rv == null) {
rv = new Xoa_sitelink_grp(key, hash.Count());
hash.Add(key, rv);
}
return rv;
}
public void Sort() {hash.Sort();}
public void To_bfr(Bry_bfr bfr) {
int len = hash.Count();
for (int i = 0; i < len; ++i) {
Xoa_sitelink_grp grp = (Xoa_sitelink_grp)hash.Get_at(i);
grp.To_bfr(bfr);
}
}
}

View File

@@ -0,0 +1,51 @@
/*
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.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.wikis.domains.*;
public class Xoa_sitelink_itm {
public Xoa_sitelink_itm(Xoa_sitelink_grp grp, byte[] key, byte[] name) {
this.grp = grp; this.key = key; this.name = name;
grp.Add(this);
}
public byte[] Key() {return key;} private final byte[] key; // EX: "en", "c"; NOTE: usually lang_key, but can be xwiki key
public byte[] Name() {return name;} private byte[] name; // EX: "English", "Commons"
public Xoa_sitelink_grp Grp() {return grp;} private Xoa_sitelink_grp grp; // EX: "Tier 1"
public Xow_domain_itm Site_domain() {return site_domain;} private Xow_domain_itm site_domain; // EX: "en.wikipedia.org"; "commons.wikimedia.org"
public byte[] Page_name() {return page_name;} private byte[] page_name; // EX: "Earth", "Terre"
public boolean Page_name_is_empty() {return page_name_is_empty;} private boolean page_name_is_empty; // EX: [[fr:]]
public byte[][] Page_badges() {return page_badges;} private byte[][] page_badges;
public void Init_by_page(Xow_domain_itm site_domain, byte[] page_name, boolean page_name_is_empty, byte[][] page_badges) {
this.site_domain = site_domain;
this.page_name = page_name; this.page_name_is_empty = page_name_is_empty; this.page_badges = page_badges;
grp.Active_len__add();
}
public void Move_to(Xoa_sitelink_grp new_grp) {
if (Bry_.Eq(new_grp.Name(), grp.Name())) return; // same grp
grp.Del(key);
new_grp.Add(this);
this.grp = new_grp;
}
public void Grp_(Xoa_sitelink_grp v) {this.grp = v;}
public void Site_name_(byte[] v) {this.name = v;}
public void To_bfr(Bry_bfr bfr) {
bfr.Add_int_digits(1, Xoa_sitelink_mgr_parser.Tid__itm).Add_byte_pipe();
bfr.Add(key).Add_byte_pipe();
bfr.Add(name).Add_byte_nl();
}
}

View File

@@ -0,0 +1,37 @@
/*
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.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.langs.*;
public class Xoa_sitelink_itm_mgr {
private final Ordered_hash hash = Ordered_hash_.New_bry();
private final Xoa_sitelink_grp default_grp;
public Xoa_sitelink_itm_mgr(Xoa_sitelink_grp default_grp) {this.default_grp = default_grp;}
public int Len() {return hash.Count();}
public void Clear() {hash.Clear();}
public void Add(Xoa_sitelink_itm itm) {hash.Add(itm.Key(), itm);}
public Xoa_sitelink_itm Get_at(int idx) {return (Xoa_sitelink_itm)hash.Get_at(idx);}
public Xoa_sitelink_itm Get_by(byte[] key) {return (Xoa_sitelink_itm)hash.Get_by(key);}
public Xoa_sitelink_itm Get_by_or_new(byte[] key) {
Xoa_sitelink_itm rv = (Xoa_sitelink_itm)hash.Get_by(key);
if (rv == null) {
rv = new Xoa_sitelink_itm(default_grp, key, Bry_.Empty);
hash.Add(key, rv);
}
return rv;
}
}

View File

@@ -0,0 +1,48 @@
/*
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.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.wikis.xwikis.sitelinks.htmls.*; import gplx.xowa.langs.*;
public class Xoa_sitelink_mgr {
private final Xoa_sitelink_div_wtr div_wtr = new Xoa_sitelink_div_wtr();
public Xoa_sitelink_itm_mgr Itm_mgr() {return itm_mgr;} private final Xoa_sitelink_itm_mgr itm_mgr;
public Xoa_sitelink_grp_mgr Grp_mgr() {return grp_mgr;} private final Xoa_sitelink_grp_mgr grp_mgr = new Xoa_sitelink_grp_mgr();
public Xoa_sitelink_mgr() {
this.itm_mgr = new Xoa_sitelink_itm_mgr(grp_mgr.Default_grp());
}
public void Init_by_app() { // add all langs
Xoa_sitelink_grp default_grp = grp_mgr.Default_grp();
Xol_lang_stub[] ary = Xol_lang_stub_.Ary();
int len = ary.length;
for (int i = 0; i < len; ++i) {
Xol_lang_stub stub = ary[i];
Xoa_sitelink_itm itm = itm_mgr.Get_by(stub.Key());
if (itm == null) { // note that some itms may already exist if user has defined custom names
itm = new Xoa_sitelink_itm(default_grp, stub.Key(), stub.Canonical_name());
itm_mgr.Add(itm);
}
}
}
public void Parse(byte[] src) {
Xoa_sitelink_mgr_parser parser = new Xoa_sitelink_mgr_parser(this);
parser.Load_by_bry(src);
grp_mgr.Sort(); // sort again to put "Others" at bottom
}
public void Write_html(Bry_bfr bfr, Xowe_wiki wiki, List_adp slink_list, byte[] qid) {
div_wtr.Write(bfr, wiki, this, slink_list, qid);
}
}

View File

@@ -0,0 +1,52 @@
/*
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.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.langs.dsvs.*;
class Xoa_sitelink_mgr_parser extends Dsv_wkr_base {
private final Xoa_sitelink_grp_mgr grp_mgr;
private final Xoa_sitelink_itm_mgr itm_mgr;
private int cur_tid = -1;
private byte[] cur_fld1, cur_fld2;
private Xoa_sitelink_grp cur_grp;
public Xoa_sitelink_mgr_parser(Xoa_sitelink_mgr mgr) {this.grp_mgr = mgr.Grp_mgr(); this.itm_mgr = mgr.Itm_mgr();}
@Override public Dsv_fld_parser[] Fld_parsers() {return new Dsv_fld_parser[] {Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser, Dsv_fld_parser_.Bry_parser};}
@Override public boolean Write_bry(Dsv_tbl_parser parser, int fld_idx, byte[] src, int bgn, int end) {
switch (fld_idx) {
case 0: cur_tid = Bry_.To_int_or(src, bgn, end, -1); return true;
case 1: cur_fld1 = Bry_.Mid(src, bgn, end); return true;
case 2: cur_fld2 = Bry_.Mid(src, bgn, end); return true;
default: return false;
}
}
@Override public void Commit_itm(Dsv_tbl_parser parser, int pos) {
switch (cur_tid) {
case Tid__grp:
cur_grp = grp_mgr.Get_by_or_new(cur_fld1);
break;
case Tid__itm:
Xoa_sitelink_itm itm = itm_mgr.Get_by_or_new(cur_fld1);
itm.Move_to(cur_grp);
itm.Site_name_(cur_fld2);
break;
default: throw Err_.new_unhandled(cur_tid);
}
cur_tid = -1;
cur_fld1 = cur_fld2 = null;
}
public static final int Tid__grp = 0, Tid__itm = 1;
}

View File

@@ -0,0 +1,69 @@
/*
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.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import org.junit.*;
public class Xoa_sitelink_mgr_parser_tst {
private final Xoa_sitelink_mgr_parser_fxt fxt = new Xoa_sitelink_mgr_parser_fxt();
@Before public void init() {fxt.Clear();}
@Test public void Basic() {
String raw = String_.Concat_lines_nl_skip_last
( "0|Tier 0"
, "1|de|German"
, "1|en|English"
, "0|Tier 1"
, "1|ar|Arabic"
, "1|ca|Catalan"
);
fxt.Exec_parse(raw);
fxt.Test_parse(raw);
}
@Test public void Move() {
String raw = String_.Concat_lines_nl_skip_last
( "0|Tier 0"
, "1|de|German"
, "0|Tier 1"
, "1|ar|Arabic"
);
fxt.Exec_parse(raw);
raw = String_.Concat_lines_nl_skip_last
( "0|Tier 0"
, "1|ar|Arabic"
, "0|Tier 1"
, "1|de|German"
);
fxt.Exec_parse(raw);
fxt.Test_parse(raw);
}
}
class Xoa_sitelink_mgr_parser_fxt {
private final Xoa_sitelink_mgr mgr = new Xoa_sitelink_mgr();
private final Xoa_sitelink_mgr_parser parser;
private final Bry_bfr tmp_bfr = Bry_bfr.new_();
public void Clear() {mgr.Grp_mgr().Clear();}
public Xoa_sitelink_mgr_parser_fxt() {
this.parser = new Xoa_sitelink_mgr_parser(mgr);
}
public void Exec_parse(String raw) {
byte[] src = Bry_.new_u8(raw);
parser.Load_by_bry(src);
}
public void Test_parse(String expd) {
mgr.Grp_mgr().To_bfr(tmp_bfr);
Tfds.Eq_str_lines(expd, tmp_bfr.To_str_and_clear());
}
}

View File

@@ -0,0 +1,69 @@
/*
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.wikis.xwikis.sitelinks.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.xwikis.sitelinks.*;
import gplx.xowa.apps.apis.xowa.html.*;
import gplx.xowa.langs.*; import gplx.xowa.langs.msgs.*;
import gplx.xowa.xtns.wdatas.core.*;
public class Xoa_sitelink_div_wtr {
private final Xoa_sitelink_grp_wtr grp_wtr = new Xoa_sitelink_grp_wtr();
public void Write(Bry_bfr bfr, Xowe_wiki wiki, Xoa_sitelink_mgr mgr, List_adp slink_list, byte[] qid) {
Xoa_sitelink_grp_mgr grp_mgr = mgr.Grp_mgr(); Xoa_sitelink_itm_mgr itm_mgr = mgr.Itm_mgr();
// reset grps
grp_wtr.Init_by_app(wiki.App());
int grp_len = grp_mgr.Len();
for (int i = 0; i < grp_len; ++i) {
Xoa_sitelink_grp grp = grp_mgr.Get_at(i);
grp.Reset();
}
// add itms to each grp
int slink_len = slink_list.Count();
for (int i = 0; i < slink_len; i++) {
Wdata_sitelink_itm slink = (Wdata_sitelink_itm)slink_list.Get_at(i);
Xoa_ttl ttl = slink.Page_ttl();
Xoa_sitelink_itm itm = itm_mgr.Get_by(ttl.Wik_itm().Key_bry());
if (itm == null) {
Xoa_app_.Usr_dlg().Warn_many("", "", "sitelink itm missing; wiki=~{0} key=~{1} lnki_ttl=~{2}", wiki.Domain_bry(), ttl.Wik_itm().Key_bry(), ttl.Raw());
continue;
}
byte[] ttl_bry = ttl.Page_txt_w_anchor();
boolean ttl_is_empty = false;
if (Bry_.Len_eq_0(ttl_bry)) { // NOTE: handles ttls like [[fr:]] and [[:fr;]] which have an empty Page_txt, but a valued Full_txt_raw
ttl_bry = wiki.Parser_mgr().Ctx().Cur_page().Ttl().Page_txt();
ttl_is_empty = true;
}
itm.Init_by_page(slink.Domain_info(), ttl_bry, ttl_is_empty, slink.Badges());
}
// write html
Xoapi_toggle_itm toggle_itm = wiki.Appe().Api_root().Html().Page().Toggle_mgr().Get_or_new("wikidata-langs");
toggle_itm.Init(wiki.Msg_mgr().Val_by_id(Xol_msg_itm_.Id_page_lang_header));
Bry_bfr tmp_bfr = wiki.Utl__bfr_mkr().Get_b128().Mkr_rls();
byte[] wikidata_link = Bry_.Len_eq_0(qid) ? Bry_.Empty : wbase_fmtr.Bld_bry_many(tmp_bfr, qid);
div_fmtr.Bld_bfr_many(bfr, slink_len, wikidata_link, toggle_itm.Html_toggle_btn(), toggle_itm.Html_toggle_hdr(), grp_wtr.Fmt__init(grp_mgr));
}
private static final Bry_fmtr wbase_fmtr = Bry_fmtr.new_(" (<a href=\"/site/www.wikidata.org/wiki/~{qid}\">wikidata</a>)", "qid");
private static final Bry_fmtr div_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( "<div id=\"xowa-lang\">"
, " <h5>~{toggle_btn} (links: ~{len}) ~{wikidata_link}</h5>"
, " <div~{toggle_hdr}>~{grps}"
, " </div>"
, "</div>"
), "len", "wikidata_link", "toggle_btn", "toggle_hdr", "grps");
}

View File

@@ -15,9 +15,9 @@ 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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
package gplx.xowa.wikis.xwikis.sitelinks.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.xwikis.sitelinks.*;
import gplx.xowa.langs.*; import gplx.xowa.parsers.*;
public class Xow_lang_mgr_fxt {
class Xoa_sitelink_div_wtr_fxt {
public void Clear() {
app = Xoa_app_fxt.app_();
wiki = Xoa_app_fxt.wiki_tst_(app);
@@ -25,27 +25,24 @@ public class Xow_lang_mgr_fxt {
}
public static void Init_langs(Xowe_wiki wiki) {
Xoae_app app = wiki.Appe();
Xoa_lang_mgr lang_mgr = app.Lang_mgr();
lang_mgr.Groups().Set_bulk(Bry_.new_a7(String_.Concat_lines_nl
( "+||grp|wiki"
, "+|wiki|grp|grp1"
, "+|wiki|grp|grp2"
, "+|grp1|itm|simple|Simple"
, "+|grp2|itm|fr|French"
, "+|grp1|itm|es|Spanish"
, "+|grp2|itm|de|German"
, "+|grp1|itm|it|Italian"
, "+|grp1|itm|zh|Chinese"
)));
wiki.Xwiki_mgr().Add_bulk_langs(Bry_.new_a7("wiki"));
String bulk = String_.Concat_lines_nl
( "simple.wikipedia.org|simple.wikipedia.org"
, "fr.wikipedia.org|fr.wikipedia.org"
, "es.wikipedia.org|es.wikipedia.org"
, "de.wikipedia.org|de.wikipedia.org"
, "it.wikipedia.org|it.wikipedia.org"
);
wiki.Appe().Usere().Wiki().Xwiki_mgr().Add_bulk(Bry_.new_a7(bulk));
app.Xwiki_mgr__sitelink_mgr().Parse(Bry_.new_u8(String_.Concat_lines_nl
( "0|grp1"
, "1|simple|Simple"
, "1|es|Spanish"
, "1|it|Italian"
, "1|zh|Chinese"
, "0|grp2"
, "1|fr|French"
, "1|de|German"
)));
wiki.Xwiki_mgr().Add_by_sitelink_mgr();
wiki.Appe().Usere().Wiki().Xwiki_mgr().Add_by_csv(Bry_.new_a7(String_.Concat_lines_nl
( "1|simple.wikipedia.org|simple.wikipedia.org"
, "1|fr.wikipedia.org|fr.wikipedia.org"
, "1|es.wikipedia.org|es.wikipedia.org"
, "1|de.wikipedia.org|de.wikipedia.org"
, "1|it.wikipedia.org|it.wikipedia.org"
)));
}
public Xowe_wiki Wiki() {return wiki;} private Xowe_wiki wiki;
Xoae_app app;
@@ -59,7 +56,7 @@ public class Xow_lang_mgr_fxt {
wiki.Html_mgr().Html_wtr().Write_all(bfr, ctx, raw_bry, root);
Bry_bfr html_bfr = Bry_bfr.new_();
wiki.Xwiki_mgr().Lang_mgr().Html_bld(html_bfr, wiki, ctx.Cur_page().Slink_list(), gplx.xowa.xtns.wdatas.Wdata_xwiki_link_wtr.Qid_null);
Tfds.Eq_str_lines(expd, html_bfr.Xto_str_and_clear());
wiki.App().Xwiki_mgr__sitelink_mgr().Write_html(html_bfr, wiki, ctx.Cur_page().Slink_list(), gplx.xowa.xtns.wdatas.Wdata_xwiki_link_wtr.Qid_null);
Tfds.Eq_str_lines(expd, html_bfr.To_str_and_clear());
}
}

View File

@@ -15,10 +15,10 @@ 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.wikis.xwikis; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*;
package gplx.xowa.wikis.xwikis.sitelinks.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.xwikis.sitelinks.*;
import org.junit.*;
public class Xow_lang_mgr_tst {
private final Xow_lang_mgr_fxt fxt = new Xow_lang_mgr_fxt();
public class Xoa_sitelink_div_wtr_tst {
private final Xoa_sitelink_div_wtr_fxt fxt = new Xoa_sitelink_div_wtr_fxt();
@Before public void init() {fxt.Clear();}
@Test public void Basic() {
fxt.tst("[[simple:Earth]] [[fr:Terre]] [[es:Tierra]] [[de:Erde]] [[it:Terre]]", String_.Concat_lines_nl_skip_last
@@ -28,7 +28,7 @@ public class Xow_lang_mgr_tst {
, " <h4>grp1</h4>"
, " <table style='width: 100%;'>"
, " <tr>"
, " <td style='width: 10%; padding-bottom: 5px;'>Simple</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"simple\" title=\"Earth\" href=\"/site/simple.wikipedia.org/wiki/Earth\">Earth</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td style='width: 10%; padding-bottom: 5px;'>Simple</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"en\" title=\"Earth\" href=\"/site/simple.wikipedia.org/wiki/Earth\">Earth</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td style='width: 10%; padding-bottom: 5px;'>Spanish</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"es\" title=\"Tierra\" href=\"/site/es.wikipedia.org/wiki/Tierra\">Tierra</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td style='width: 10%; padding-bottom: 5px;'>Italian</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"it\" title=\"Terre\" href=\"/site/it.wikipedia.org/wiki/Terre\">Terre</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " </tr>"
@@ -38,6 +38,7 @@ public class Xow_lang_mgr_tst {
, " <tr>"
, " <td style='width: 10%; padding-bottom: 5px;'>French</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"fr\" title=\"Terre\" href=\"/site/fr.wikipedia.org/wiki/Terre\">Terre</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td style='width: 10%; padding-bottom: 5px;'>German</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"de\" title=\"Erde\" href=\"/site/de.wikipedia.org/wiki/Erde\">Erde</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td/>"
, " </tr>"
, " </table>"
, " </div>"
@@ -52,7 +53,9 @@ public class Xow_lang_mgr_tst {
, " <h4>grp1</h4>"
, " <table style='width: 100%;'>"
, " <tr>"
, " <td style='width: 10%; padding-bottom: 5px;'>Simple</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"simple\" title=\"Test page\" href=\"/site/simple.wikipedia.org/wiki/\">Test page</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td style='width: 10%; padding-bottom: 5px;'>Simple</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"en\" title=\"Test page\" href=\"/site/simple.wikipedia.org/wiki/\">Test page</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td/>"
, " <td/>"
, " </tr>"
, " </table>"
, " </div>"
@@ -69,6 +72,8 @@ public class Xow_lang_mgr_tst {
, " <table style='width: 100%;'>"
, " <tr>"
, " <td style='width: 10%; padding-bottom: 5px;'>Chinese</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"zh\" title=\"Earth\" href=\"https://zh.wikipedia.org/wiki/Earth\">Earth</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td/>"
, " <td/>"
, " </tr>"
, " </table>"
, " </div>"
@@ -83,7 +88,9 @@ public class Xow_lang_mgr_tst {
, " <h4>grp1</h4>"
, " <table style='width: 100%;'>"
, " <tr>"
, " <td style='width: 10%; padding-bottom: 5px;'>Simple</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"simple\" title=\"A#b\" href=\"/site/simple.wikipedia.org/wiki/A#b\">A#b</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td style='width: 10%; padding-bottom: 5px;'>Simple</td><td style='width: 20%; padding-bottom: 5px;'><li class='badge-none'><a hreflang=\"en\" title=\"A#b\" href=\"/site/simple.wikipedia.org/wiki/A#b\">A#b</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
, " <td/>"
, " <td/>"
, " </tr>"
, " </table>"
, " </div>"

View File

@@ -0,0 +1,38 @@
/*
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.wikis.xwikis.sitelinks.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.xwikis.sitelinks.*;
class Xoa_sitelink_grp_wtr implements Bry_fmtr_arg {
private final Xoa_sitelink_itm_wtr itm_wtr = new Xoa_sitelink_itm_wtr();
private Xoa_sitelink_grp_mgr mgr;
public void Init_by_app(Xoa_app app) {itm_wtr.Init_by_app(app);}
public Xoa_sitelink_grp_wtr Fmt__init(Xoa_sitelink_grp_mgr mgr) {this.mgr = mgr; return this;}
public void Fmt__do(Bry_bfr bfr) {
int len = mgr.Len();
for (int i = 0; i < len; ++i) {
Xoa_sitelink_grp grp = mgr.Get_at(i);
if (grp.Active_len() == 0) continue; // skip grps with no items
fmtr.Bld_bfr_many(bfr, grp.Name(), itm_wtr.Fmt__init(grp));
}
}
private static final Bry_fmtr fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( ""
, " <h4>~{all_name}</h4>"
, " <table style='width: 100%;'>~{grps}"
, " </table>"
), "all_name", "grps");
}

View File

@@ -0,0 +1,64 @@
/*
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.wikis.xwikis.sitelinks.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.xwikis.sitelinks.*;
import gplx.xowa.htmls.hrefs.*;
import gplx.xowa.wikis.domains.*;
class Xoa_sitelink_itm_wtr implements Bry_fmtr_arg {
private final Bry_bfr tmp_bfr = Bry_bfr.new_(255);
private Xoa_app app; private Xoa_sitelink_grp grp;
public void Init_by_app(Xoa_app app) {this.app = app;}
public Xoa_sitelink_itm_wtr Fmt__init(Xoa_sitelink_grp grp) {this.grp = grp; return this;}
public void Fmt__do(Bry_bfr bfr) {
int len = grp.Len();
boolean tr_opened = false; int td_idx = 0;
for (int i = 0; i < len; ++i) {
Xoa_sitelink_itm itm = grp.Get_at(i);
if (Bry_.Len_eq_0(itm.Page_name())) continue; // xwiki does not exist for current page
if (td_idx == 0) {
bfr.Add(tr_bgn);
tr_opened = true;
}
Xow_domain_itm domain_itm = itm.Site_domain();
byte[] domain_bry = domain_itm.Domain_bry();
byte[] page_name = itm.Page_name();
byte[] url_protocol = app.Xwiki_mgr__missing(domain_bry) ? Xoh_href_.Bry__https : Xoh_href_.Bry__site; // if wiki exists, "/site/", else "https://"
byte[] url_page = itm.Page_name_is_empty() ? Bry_.Empty : page_name;
byte[] url = Bry_.Add(url_protocol, domain_bry, Xoh_href_.Bry__wiki, url_page);
td_fmtr.Bld_bfr_many(bfr, domain_itm.Lang_actl_key(), domain_itm.Domain_bry(), itm.Name(), url, page_name, Xoa_sitelink_itm_wtr__badge.Bld_badge_class(tmp_bfr, itm.Page_badges()));
++td_idx;
if (td_idx == td_max) {
tr_opened = false;
bfr.Add(tr_end);
td_idx = 0;
}
}
if (tr_opened) {
for (int i = td_idx; i < td_max; ++i)
bfr.Add(td_nil);
bfr.Add(tr_end);
}
}
private static final int td_max = 3;
private static final byte[] tr_bgn = Bry_.new_a7("\n <tr>");
private static final byte[] td_nil = Bry_.new_a7("\n <td/>");
private static final byte[] tr_end = Bry_.new_a7("\n </tr>");
private static final Bry_fmtr td_fmtr = Bry_fmtr.new_(String_.Concat_lines_nl_skip_last
( ""
, " <td style='width: 10%; padding-bottom: 5px;'>~{lang_name}</td><td style='width: 20%; padding-bottom: 5px;'><li~{page_badge}><a hreflang=\"~{lang_code}\" title=\"~{pagename_translation}\" href=\"~{lang_href}\">~{pagename_translation}</a></li></td><td style='width: 3%; padding-bottom: 5px;'></td>"
), "lang_code", "lang_domain", "lang_name", "lang_href", "pagename_translation", "page_badge");
}

View File

@@ -0,0 +1,51 @@
/*
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.wikis.xwikis.sitelinks.htmls; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*; import gplx.xowa.wikis.xwikis.sitelinks.*;
class Xoa_sitelink_itm_wtr__badge {
public static byte[] Bld_badge_class(Bry_bfr bfr, byte[][] badge_ary) { // EX: "Q17437798", "Q17437796" -> "class='badge-goodarticle,badge-featuredarticle'"
if (badge_ary == null) badge_ary = Bry_.Ary_empty;
bfr.Add(Cls_bgn);
int badges_len = badge_ary.length;
if (badges_len == 0)
bfr.Add(Badge_none_cls);
else {
for (int i = 0; i < badges_len; ++i) {
if (i != 0) bfr.Add_byte_comma();
byte[] badge_itm = badge_ary[i];
byte[] badge_cls = (byte[])badges_hash.Get_by_bry(badge_itm);
if (badge_cls == null)
Gfo_usr_dlg_.Instance.Warn_many("", "", "unknown badge: badge=~{0}", String_.new_u8(badge_itm));
else
bfr.Add(badge_cls);
}
}
bfr.Add_byte_apos();
return bfr.To_bry_and_clear();
}
private static final byte[]
Badge_none_cls = Bry_.new_a7("badge-none")
, Cls_bgn = Bry_.new_a7(" class='")
;
private static final Hash_adp_bry badges_hash = Hash_adp_bry.ci_a7()
.Add_str_obj("Q17437798", Bry_.new_a7("badge-goodarticle"))
.Add_str_obj("Q17437796", Bry_.new_a7("badge-featuredarticle"))
.Add_str_obj("Q17559452", Bry_.new_a7("badge-recommendedarticle"))
.Add_str_obj("Q17506997", Bry_.new_a7("badge-featuredlist"))
.Add_str_obj("Q17580674", Bry_.new_a7("badge-featuredportal"))
;
}