/* XOWA: the XOWA Offline Wiki Application Copyright (C) 2012-2017 gnosygnu@gmail.com XOWA is licensed under the terms of the General Public License (GPL) Version 3, or alternatively under the terms of the Apache License Version 2.0. You may use XOWA according to either of these licenses as is most appropriate for your project on a case-by-case basis. The terms of each license can be found in the source code repository: GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt */ package gplx.xowa.addons.wikis.searchs.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.core.primitives.*; import gplx.xowa.addons.wikis.searchs.specials.*; import gplx.xowa.wikis.domains.*; import gplx.xowa.wikis.domains.crts.*; import gplx.xowa.specials.*; import gplx.xowa.addons.wikis.searchs.searchers.*; import gplx.xowa.addons.wikis.searchs.searchers.cbks.*; import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*; public class Srch_special_page implements Xow_special_page { public Xow_special_meta Special__meta() {return Xow_special_meta_.Itm__search;} public void Special__gen(Xow_wiki wikii, Xoa_page pagei, Xoa_url url, Xoa_ttl ttl) { Xowe_wiki wiki = (Xowe_wiki)wikii; Xoae_page page = (Xoae_page)pagei; Srch_special_cfg search_cfg = wiki.Appe().Addon_mgr().Itms__search__special(); Xow_domain_itm[] search_domain_ary = Get_domains(wiki.Appe(), search_cfg, wiki.Domain_itm()); // get args from urls while applying defaults from search_cfg Srch_qarg_mgr qargs_mgr = new Srch_qarg_mgr(wiki.App().Addon_mgr().Itms__search__special().Ns_mgr()); qargs_mgr.Clear(); // parse args_default_str String args_default_str = wiki.App().Cfg().Get_str_wiki_or(wiki, Srch_search_mgr.Cfg__args_default, ""); if (String_.Len_gt_0(args_default_str)) { byte[] bry = Bry_.new_a7("http://x.org/a?" + args_default_str); gplx.core.net.Gfo_url tmp_url = wiki.App().User().Wikii().Utl__url_parser().Url_parser().Parse(bry, 0, bry.length); qargs_mgr.Parse(tmp_url.Qargs()); } qargs_mgr.Parse(url.Qargs_ary()); qargs_mgr.Ns_mgr().Add_main_if_empty(); // get search_raw byte[] search_raw = qargs_mgr.Search_raw(); if (search_raw == null) { // search is not in qarg; EX:Special:Search?search=Earth search_raw = ttl.Leaf_txt_wo_qarg(); // assume search is in leaf; EX: Special:Search/Earth qargs_mgr.Search_raw_(search_raw); } if (Bry_.Len_eq_0(search_raw)) return; // emptry String; exit now, else null ref error; DATE:2015-08-11 // get page directly from url boolean fulltext_invoked = url.Qargs_mgr().Match(Qarg__fulltext, Qarg__fulltext__y); Xoa_ttl search_ttl = Xoa_ttl.Parse(wiki, search_raw); Xoae_page search_page = page; if ( !fulltext_invoked && !Bry_.Eq(search_raw, Xow_special_meta_.Itm__search.Ttl_bry())) // do not lookup self else stack overflow; happens when going directly to Special:Search (from history) search_page = wiki.Data_mgr().Load_page_by_ttl(search_ttl); // try to find page; EX:Special:Search?search=Earth -> en.w:Earth; needed for search suggest // page not found, or explicit_search invoked if (search_page.Db().Page().Exists_n() || fulltext_invoked) { Srch_special_searcher search_mgr = new Srch_special_searcher(wiki.Appe().Wiki_mgr()); if (qargs_mgr.Cancel() != null) { // cancel any existing searches search_mgr.Search__cancel(qargs_mgr.Cancel()); page.Tab_data().Cancel_show_y_(); return; } page.Html_data().Html_restricted_n_(); page.Html_data().Xtn_search_text_(search_raw); Srch_search_qry qry = Srch_search_qry.New__search_page(search_domain_ary, wiki, wiki.App().Addon_mgr().Itms__search__special().Ns_mgr(), search_cfg.Auto_wildcard(), search_raw, qargs_mgr.Slab_idx(), search_cfg.Results_per_page()); search_mgr.Search(wiki, page, search_cfg.Async_db(), search_domain_ary, qry); } // page found; return it; else { wiki.Parser_mgr().Parse(search_page, true); page.Db().Text().Text_bry_(search_page.Db().Text().Text_bry()); if (page.Root() != null) // NOTE: null when going from w:Earth -> q:Earth; DATE:2013-03-20 page.Root().Data_htm_(search_page.Root().Data_htm()); Xoa_url redirect_url = Xoa_url.New(wiki, search_ttl); page.Ttl_(search_ttl).Url_(redirect_url); page.Redirect_trail().Itms__add__article(redirect_url, search_ttl, null); } } public static final byte Match_tid_all = 0, Match_tid_bgn = 1; public static final byte Version_null = 0, Version_1 = 1, Version_2 = 2; private static final byte[] Qarg__fulltext = Bry_.new_a7("fulltext"), Qarg__fulltext__y = Bry_.new_a7("y"); private static Xow_domain_itm[] Get_by_crt(gplx.xowa.wikis.xwikis.Xow_xwiki_mgr xwiki_mgr, Xow_domain_itm cur, gplx.xowa.wikis.domains.crts.Xow_domain_crt_itm crt) { List_adp rv = List_adp_.New(); int len = xwiki_mgr.Len(); for (int i = 0; i < len; ++i) { gplx.xowa.wikis.xwikis.Xow_xwiki_itm xwiki = xwiki_mgr.Get_at(i); if ( !xwiki.Offline() // note that filters are broad (*.wiktionary); skip offline wikis which won't be available on system && xwiki.Domain_tid() != Xow_domain_tid_.Tid__home) // note that home is marked "offline" so it won't show up in wikis sidebar continue; Xow_domain_itm domain_itm = Xow_domain_itm_.parse(xwiki.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); } private static Xow_domain_itm[] Get_domains(Xoae_app app, Srch_special_cfg cfg, Xow_domain_itm wiki_domain) { Xow_domain_crt_itm crt = cfg.Multi_wikis_crt(wiki_domain); Xow_domain_itm[] rv = Get_by_crt(app.Usere().Wiki().Xwiki_mgr(), wiki_domain, crt); if (rv.length == 0) rv = new Xow_domain_itm[] {wiki_domain}; // default to current if bad input Xow_domain_crt_itm[] ary = cfg.Multi_sorts_crt(wiki_domain); if (ary == null) return Xow_domain_itm_.Ary_empty; // default to no sort if bad input Xow_domain_sorter__manual sorter = new Xow_domain_sorter__manual(wiki_domain, ary); Xow_domain_sorter__manual.Sort(sorter, rv); return rv; } public Xow_special_page Special__clone() {return this;} }