HTTP Server: Add search-suggest [#489]

pull/620/head
gnosygnu 5 years ago
parent f5abfa11da
commit b350d95206

@ -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) {

@ -5,6 +5,7 @@
width: 100%;
list-style: none;
background: transparent; /*2013-08-20:else blue vertical bar will be visible directly underneath right-edge of search box*/
z-index: 128; /*else indicators page-indicator icons will show; EX:en.w:Earth; DATE:2019-08-04*/
}
#xowa-search-suggestions li {

@ -37,11 +37,37 @@ function receiveSuggestions (search, suggestions) {
}
window.receiveSuggestions = receiveSuggestions;
function fetchSuggestions () {
if (xowa_mode_is_server)
xowa_exec_async(function(){}, 'get_search_suggestions', currentSearch, 'receiveSuggestions');
if (xowa_global_values.mode_is_http) {
var wiki = xowa.page.wiki;
var search = document.getElementById("searchInput").value;
sendByAjaxWithCallback
( 'xowa.search.ui.suggest'
, { wiki: wiki
, search: search
, cbk: "receiveSuggestions"
}
, function(xreq)
{
eval(xreq.responseText);
}
);
}
else
xowa_exec('get_search_suggestions', currentSearch, 'receiveSuggestions');
}
function sendByAjaxWithCallback(cmd, data, cbk) {
var xreq = new XMLHttpRequest();
xreq.onreadystatechange = function() {
if (xreq.readyState == 4 && xreq.status == 200) {
cbk(xreq)
}
};
var form_data = new FormData();
form_data.append('msg', JSON.stringify({cmd:cmd, data:data}));
form_data.append('app_mode', 'http_server');
xreq.open("POST", '/exec/json', true);
xreq.send(form_data);
}
function renderSuggestion (page_db, page_display) {
var textNode = document.createElement('span'),
@ -49,7 +75,11 @@ function renderSuggestion (page_db, page_display) {
liNode = document.createElement('li');
textNode.innerHTML = page_display;
textNode.setAttribute('xowa_page_db', page_db);
linkNode.href = '/wiki/' + page_db;
var href = '/wiki/' + page_db;
if (xowa_global_values.mode_is_http) {
href = '/' + xowa.page.wiki + href;
}
linkNode.href = href;
linkNode.appendChild(textNode);
liNode.appendChild(linkNode);
return liNode;

@ -5,6 +5,7 @@
width: 100%;
list-style: none;
background: transparent; /*2013-08-20:else blue vertical bar will be visible directly underneath right-edge of search box*/
z-index: 128; /*else indicators page-indicator icons will show; EX:en.w:Earth; DATE:2019-08-04*/
}
#xowa-search-suggestions li {

Loading…
Cancel
Save