mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
HTTP Server: Add search-suggest [#489]
This commit is contained in:
@@ -76,6 +76,7 @@ public class Xoax_addon_mgr {
|
||||
|
||||
// jsons
|
||||
, new gplx.xowa.addons.servers.https.utils .Xoa_util_addon()
|
||||
, new gplx.xowa.addons.wikis.searchs .Xoax_addon_itm__search_ui()
|
||||
);
|
||||
|
||||
if (app.Mode().Tid_is_http()) {
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
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; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*;
|
||||
import gplx.xowa.htmls.bridges.*;
|
||||
import gplx.xowa.addons.wikis.searchs.gui.htmlbars.*;
|
||||
public class Xoax_addon_itm__search_ui implements Xoax_addon_itm, Xoax_addon_itm__json {
|
||||
public String Addon__key() {return "xowa.search.ui";}
|
||||
public Bridge_cmd_itm[] Json_cmds() {
|
||||
return new Bridge_cmd_itm[] {new Bridge_cmd_itm__srch_suggest()};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
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.gui.htmlbars; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.gui.*;
|
||||
import gplx.langs.jsons.*;
|
||||
import gplx.xowa.htmls.bridges.*;
|
||||
public class Bridge_cmd_itm__srch_suggest implements Bridge_cmd_itm {
|
||||
private Xoa_app app;
|
||||
public byte[] Key() {return Bry_.new_a7("xowa.search.ui.suggest");}
|
||||
public void Init_by_app(Xoa_app app) {
|
||||
this.app = app;
|
||||
}
|
||||
public String Exec(Json_nde data) {
|
||||
// extract vars from json
|
||||
byte[] wiki_bry = data.Get_as_bry("wiki");
|
||||
byte[] search_bry = data.Get_as_bry("search");
|
||||
byte[] cbk_func = data.Get_as_bry("cbk");
|
||||
|
||||
// build vars for search
|
||||
Xowe_wiki wiki = (Xowe_wiki)app.Wiki_mgri().Get_by_or_null(wiki_bry);
|
||||
Srch_rslt_cbk__js cbk = new Srch_rslt_cbk__js(cbk_func, search_bry);
|
||||
|
||||
// do search and return result
|
||||
app.Addon_mgr().Itms__search__htmlbar().Search(wiki, search_bry, cbk);
|
||||
return cbk.To_str_and_clear();
|
||||
}
|
||||
}
|
||||
@@ -14,44 +14,41 @@ 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.gui.htmlbars; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.gui.*;
|
||||
import gplx.core.net.*; import gplx.core.net.qargs.*;
|
||||
import gplx.xowa.wikis.nss.*;
|
||||
import gplx.xowa.addons.wikis.searchs.searchers.cbks.*; import gplx.xowa.addons.wikis.searchs.searchers.*;
|
||||
import gplx.xowa.addons.wikis.searchs.searchers.*; import gplx.xowa.addons.wikis.searchs.searchers.cbks.*; import gplx.xowa.addons.wikis.searchs.searchers.rslts.*;
|
||||
public class Srch_htmlbar_mgr implements Gfo_invk {
|
||||
private Srch_search_addon addon;
|
||||
private int results_max = 25;
|
||||
public void Init_by_kit(Xoae_app app, gplx.gfui.kits.core.Gfui_kit kit) {
|
||||
app.Cfg().Bind_many_app(this, Cfg__enabled, Cfg__results_max);
|
||||
}
|
||||
public boolean Enabled() {return enabled;} private boolean enabled = true;
|
||||
public void Search(Xowe_wiki wiki, byte[] search_bry, byte[] cbk_func) {
|
||||
if ( !enabled
|
||||
|| search_bry.length == 0
|
||||
) return;
|
||||
if (addon == null)
|
||||
addon = Srch_search_addon.Get(wiki);
|
||||
else {
|
||||
if (!Bry_.Eq(wiki.Domain_bry(), addon.Wiki_domain())) // NOTE: suggest-box caches addon at wiki level; need to check if wiki has changed
|
||||
addon = Srch_search_addon.Get(wiki);
|
||||
}
|
||||
// tab_close_mgr.Add(this);
|
||||
Srch_search_qry qry = Srch_search_qry.New__suggest_box(wiki, wiki.App().Addon_mgr().Itms__search__special().Ns_mgr(), wiki.App().Addon_mgr().Itms__search__special().Auto_wildcard(), results_max, search_bry);
|
||||
Srch_rslt_cbk__suggest_box cbk = new Srch_rslt_cbk__suggest_box(wiki.Appe(), cbk_func, search_bry);
|
||||
addon.Search(qry, cbk);
|
||||
cbkrslt = cbk.Get_js_str();
|
||||
public void Search_by_swt(Xowe_wiki wiki, byte[] search_bry, byte[] cbk_func) {
|
||||
this.Search(wiki, search_bry, new Srch_rslt_cbk__swt(wiki.Appe(), cbk_func, search_bry));
|
||||
}
|
||||
private String cbkrslt;
|
||||
public String Get_js_rslt() {
|
||||
return cbkrslt;
|
||||
public void Search(Xowe_wiki wiki, byte[] search_bry, Srch_rslt_cbk cbk) {
|
||||
// return if not-enabled or if search is empty
|
||||
if (!enabled || Bry_.Len_eq_0(search_bry)) return;
|
||||
|
||||
// get search_addon associated with wiki
|
||||
Srch_search_addon addon = Srch_search_addon.Get(wiki);
|
||||
|
||||
// build query
|
||||
Srch_search_qry qry = Srch_search_qry.New__suggest_box
|
||||
( wiki
|
||||
, wiki.App().Addon_mgr().Itms__search__special().Ns_mgr()
|
||||
, wiki.App().Addon_mgr().Itms__search__special().Auto_wildcard()
|
||||
, results_max, search_bry);
|
||||
|
||||
// run it
|
||||
addon.Search(qry, cbk);
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Cfg__enabled)) enabled = m.ReadYn("v");
|
||||
else if (ctx.Match(k, Cfg__results_max)) results_max = m.ReadInt("v");
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
if (ctx.Match(k, Cfg__enabled)) enabled = m.ReadYn("v");
|
||||
else if (ctx.Match(k, Cfg__results_max)) results_max = m.ReadInt("v");
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
private static final String
|
||||
Cfg__enabled = "xowa.addon.search.suggest.enabled"
|
||||
, Cfg__results_max = "xowa.addon.search.suggest.results_max"
|
||||
Cfg__enabled = "xowa.addon.search.suggest.enabled"
|
||||
, Cfg__results_max = "xowa.addon.search.suggest.results_max"
|
||||
;
|
||||
}
|
||||
|
||||
@@ -13,21 +13,23 @@ 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.searchers.cbks; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.searchers.*;
|
||||
package gplx.xowa.addons.wikis.searchs.gui.htmlbars; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.wikis.*; import gplx.xowa.addons.wikis.searchs.*; import gplx.xowa.addons.wikis.searchs.gui.*;
|
||||
import gplx.core.js.*;
|
||||
import gplx.xowa.addons.wikis.searchs.searchers.*; import gplx.xowa.addons.wikis.searchs.searchers.rslts.*;
|
||||
public class Srch_rslt_cbk__suggest_box implements Srch_rslt_cbk, Gfo_invk {
|
||||
private final Js_wtr js_wtr = new Js_wtr();
|
||||
private final Xoae_app app;
|
||||
private final byte[] cbk_func;
|
||||
private final byte[] search_raw;
|
||||
public Srch_rslt_cbk__suggest_box(Xoae_app app, byte[] cbk_func, byte[] search_raw) {
|
||||
this.app = app; this.cbk_func = cbk_func;
|
||||
class Srch_rslt_cbk__js implements Srch_rslt_cbk {
|
||||
protected final Js_wtr js_wtr = new Js_wtr();
|
||||
private byte[] cbk_func, search_raw;
|
||||
public Srch_rslt_cbk__js(byte[] cbk_func, byte[] search_raw) {
|
||||
this.cbk_func = cbk_func;
|
||||
this.search_raw = search_raw;
|
||||
}
|
||||
public String To_str_and_clear() {return js_wtr.To_str_and_clear();}
|
||||
public void On_cancel() {}
|
||||
public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) {
|
||||
@gplx.Virtual public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) {
|
||||
// exit if done
|
||||
if (!rslts_list.Rslts_are_enough && !rslts_list.Rslts_are_done) return;
|
||||
|
||||
// build js; EX: "receiveSuggestions('search_word', ["a"])"
|
||||
js_wtr.Func_init(cbk_func);
|
||||
js_wtr.Prm_bry(search_raw);
|
||||
js_wtr.Prm_spr();
|
||||
@@ -41,20 +43,22 @@ public class Srch_rslt_cbk__suggest_box implements Srch_rslt_cbk, Gfo_invk {
|
||||
}
|
||||
js_wtr.Ary_term();
|
||||
js_wtr.Func_term();
|
||||
Gfo_invk_.Invk_by_key(app.Gui_mgr().Kit().New_cmd_sync(this), Srch_rslt_cbk__suggest_box.Invk__notify);
|
||||
if (!app.Mode().Tid_is_http())
|
||||
Gfo_invk_.Invk_by_key(app.Gui_mgr().Kit().New_cmd_sync(this), Srch_rslt_cbk__suggest_box.Invk__notify);
|
||||
}
|
||||
public String Get_js_str() {
|
||||
return js_wtr.To_str_and_clear();
|
||||
}
|
||||
class Srch_rslt_cbk__swt extends Srch_rslt_cbk__js implements Gfo_invk { private final Xoae_app app;
|
||||
public Srch_rslt_cbk__swt(Xoae_app app, byte[] cbk_func, byte[] search_raw) {super(cbk_func, search_raw);
|
||||
this.app = app;
|
||||
}
|
||||
private void Notify() {
|
||||
app.Gui_mgr().Browser_win().Active_html_box().Html_js_eval_script(js_wtr.To_str_and_clear());
|
||||
@Override public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list list, int rslts_bgn, int rslts_end) {
|
||||
super.On_rslts_found(qry, list, rslts_bgn, rslts_end);
|
||||
Gfo_invk_.Invk_by_val(app.Gui_mgr().Kit().New_cmd_sync(this), Invk__notify, js_wtr.To_str_and_clear());
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk__notify)) Notify();
|
||||
if (ctx.Match(k, Invk__notify)) {
|
||||
app.Gui_mgr().Browser_win().Active_html_box().Html_js_eval_script(m.ReadStr("v"));
|
||||
}
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
}
|
||||
public static final String Invk__notify = "notify";
|
||||
private static final String Invk__notify = "notify";
|
||||
}
|
||||
@@ -127,7 +127,7 @@ public class Xoh_js_cbk implements Gfo_invk {
|
||||
Xowe_wiki wiki = html_itm.Owner_tab().Wiki();
|
||||
byte[] search_str = Bry_.new_u8((String)m.ReadValAt(0));
|
||||
byte[] cbk_func = Bry_.new_u8((String)m.ReadValAt(1));
|
||||
app.Addon_mgr().Itms__search__htmlbar().Search(wiki, search_str, cbk_func);
|
||||
app.Addon_mgr().Itms__search__htmlbar().Search_by_swt(wiki, search_str, cbk_func);
|
||||
return "";
|
||||
}
|
||||
private String[] Wikidata_get_label(GfoMsg m) {
|
||||
|
||||
Reference in New Issue
Block a user