From e213d123f89095b5b96dc915a909eec1e5dbfc57 Mon Sep 17 00:00:00 2001 From: gnosygnu Date: Sun, 11 Aug 2019 08:33:17 -0400 Subject: [PATCH] Search.Suggest: Move highlighting code out of cache pathway to js_wtr [#538] --- .../searchs/gui/htmlbars/Srch_rslt_cbk__js.java | 12 +++++++++--- .../searchers/cbks/Srch_rslt_cbk__url_bar.java | 2 +- .../wikis/searchs/searchers/rslts/Srch_rslt_cbk.java | 2 +- .../searchs/searchers/rslts/Srch_rslt_cbk_.java | 2 +- .../searchs/searchers/rslts/Srch_rslt_list_.java | 5 ----- .../wikis/searchs/searchers/wkrs/Srch_link_wkr.java | 4 ++-- .../searchs/searchers/wkrs/Srch_page_tbl_wkr.java | 2 +- .../wikis/searchs/specials/Srch_special_cmd.java | 2 +- .../searchs/specials/Srch_special_searcher.java | 2 +- 9 files changed, 17 insertions(+), 16 deletions(-) diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/gui/htmlbars/Srch_rslt_cbk__js.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/gui/htmlbars/Srch_rslt_cbk__js.java index 6b11c2842..45c0fe27e 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/gui/htmlbars/Srch_rslt_cbk__js.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/gui/htmlbars/Srch_rslt_cbk__js.java @@ -25,10 +25,11 @@ class Srch_rslt_cbk__js implements Srch_rslt_cbk { } public String To_str_and_clear() {return js_wtr.To_str_and_clear();} public void On_cancel() {} - @gplx.Virtual 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_ctx ctx, 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); @@ -38,19 +39,24 @@ class Srch_rslt_cbk__js implements Srch_rslt_cbk { for (int i = 0; i < qry.Slab_end; i++) { if (i >= rslts_len) break; // rslts_end will overshoot actual rslts_len; check for out of bounds and exit; EX: default suggest will have rslts_end of 25, but "earth time" will retrieve 15 results Srch_rslt_row row = rslts_list.Get_at(i); + Highlight(ctx, row); // always highlight title first; needed for suggest_box to update highlighting when increasing word; EX: Eart -> Earth; "Earth" should be highlighted, not "Eart" js_wtr.Ary_bry(row.Page_ttl.Full_txt_w_ttl_case()); js_wtr.Ary_bry(row.Page_ttl_display(Bool_.Y)); } js_wtr.Ary_term(); js_wtr.Func_term(); } + private static void Highlight(Srch_search_ctx ctx, Srch_rslt_row row) { + try {row.Page_ttl_highlight = ctx.Highlight_mgr.Highlight(row.Page_ttl.Full_txt_w_ttl_case());} // NOTE: always highlight row; needed for when search done in url_bar (highlight=n) and then same search reused for search (highlight=y) + catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "highlight failed; ttl=~{0} err=~{1}", row.Page_ttl_wo_ns, Err_.Message_gplx_log(e));} + } } 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; } - @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); + @Override public void On_rslts_found(Srch_search_ctx ctx, Srch_search_qry qry, Srch_rslt_list list, int rslts_bgn, int rslts_end) { + super.On_rslts_found(ctx, 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) { diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/cbks/Srch_rslt_cbk__url_bar.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/cbks/Srch_rslt_cbk__url_bar.java index 462ce6269..e86440f23 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/cbks/Srch_rslt_cbk__url_bar.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/cbks/Srch_rslt_cbk__url_bar.java @@ -29,7 +29,7 @@ public class Srch_rslt_cbk__url_bar implements Srch_rslt_cbk, Gfo_invk { this.app = app; this.url_bar = url_bar; this.max_results = max_results; } public void On_cancel() {} - public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { + public void On_rslts_found(Srch_search_ctx ctx, Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { int rslts_len = rslts_list.Len(); this.rslts_finished = rslts_list.Rslts_are_enough || rslts_list.Rslts_are_done; diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk.java index 50ae36a7e..bac0c1241 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk.java @@ -15,6 +15,6 @@ Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt */ package gplx.xowa.addons.wikis.searchs.searchers.rslts; 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.*; public interface Srch_rslt_cbk { - void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end); + void On_rslts_found(Srch_search_ctx ctx, Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end); void On_cancel(); } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk_.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk_.java index c6917fe8d..0948ec593 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk_.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_cbk_.java @@ -18,6 +18,6 @@ public class Srch_rslt_cbk_ { public static final Srch_rslt_cbk Noop = new Srch_rslt_cbk__noop(); } class Srch_rslt_cbk__noop implements Srch_rslt_cbk { - public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) {} + public void On_rslts_found(Srch_search_ctx ctx, Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) {} public void On_cancel() {} } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_list_.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_list_.java index 9d3805ba6..9226e41da 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_list_.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/rslts/Srch_rslt_list_.java @@ -17,7 +17,6 @@ package gplx.xowa.addons.wikis.searchs.searchers.rslts; import gplx.*; import gp import gplx.xowa.wikis.data.tbls.*; public class Srch_rslt_list_ { public static boolean Add_if_new(Srch_search_ctx ctx, Srch_rslt_list rslts, Srch_rslt_row row) { - Srch_rslt_list_.Highlight(ctx, row); // always highlight title first; needed for suggest_box to update highlighting when increasing word; EX: Eart -> Earth; "Earth" should be highlighted, not "Eart" return ( !rslts.Has(row.Key) // ignore: page already added by another word; EX: "A B"; word is "B", but "A B" already added by "A" && !rslts.Ids__has(row.Page_id) // ignore: page already added by page-tbl or by redirect @@ -30,10 +29,6 @@ public class Srch_rslt_list_ { if (!page_tbl.Select_by_id(tmp_page_itm, redirect_id)) {Xoa_app_.Usr_dlg().Warn_many("", "", "page not found for redirect_id; redirect_id=~{0}", redirect_id); return;} row.Page_redirect_ttl = Xoa_ttl.Replace_unders(tmp_page_itm.Ttl_page_db()); } - private static void Highlight(Srch_search_ctx ctx, Srch_rslt_row row) { - try {row.Page_ttl_highlight = ctx.Highlight_mgr.Highlight(row.Page_ttl.Full_txt_w_ttl_case());} // NOTE: always highlight row; needed for when search done in url_bar (highlight=n) and then same search reused for search (highlight=y) - catch (Exception e) {Xoa_app_.Usr_dlg().Warn_many("", "", "highlight failed; ttl=~{0} err=~{1}", row.Page_ttl_wo_ns, Err_.Message_gplx_log(e));} - } private static boolean Redirect_exists(Srch_rslt_list rslts, Srch_rslt_row cur_row) { int trg_id = cur_row.Page_redirect_id; if (trg_id == Srch_rslt_row.Page_redirect_id_null) { // src_page is not redirect diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_link_wkr.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_link_wkr.java index 4dc930ffa..7099ca842 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_link_wkr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_link_wkr.java @@ -43,7 +43,7 @@ public class Srch_link_wkr extends Percentile_select_base { // enough results at start; occurs in Special:Search when revisiting slabs; EX: 1-100 -> 101-200 -> 1-100 if (ctx.Qry.Slab_end < rslts_list.Len()) { rslts_list.Rslts_are_enough = true; - rslt_cbk.On_rslts_found(ctx.Qry, rslts_list, 0, rslts_list.Len()); + rslt_cbk.On_rslts_found(ctx, ctx.Qry, rslts_list, 0, rslts_list.Len()); return; } @@ -111,7 +111,7 @@ public class Srch_link_wkr extends Percentile_select_base { // merge to rslts_list; notify; cleanup; if (tmp_rslts_len > 0) rslts_list.Merge(tmp_rslts); rslts_list.Process_rdr_done(rng, rslts_are_enough, rslts_are_done); - rslt_cbk.On_rslts_found(ctx.Qry, rslts_list, rslts_bgn, rslts_end); + rslt_cbk.On_rslts_found(ctx, ctx.Qry, rslts_list, rslts_bgn, rslts_end); rslts_list.Rslts_are_first = false; rslts_bgn = rslts_end; // Gfo_usr_dlg_.Instance.Log_many("", "", "search.search rslts; rslts=~{0}", rng_log.To_str_and_clear()); diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_page_tbl_wkr.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_page_tbl_wkr.java index 5d86f20df..d6d7595f8 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_page_tbl_wkr.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/searchers/wkrs/Srch_page_tbl_wkr.java @@ -34,7 +34,7 @@ public class Srch_page_tbl_wkr { Srch_rslt_list_.Get_redirect_ttl(page_tbl, tmp_page_row, row); ctx.Rslts_list.Add(row); ctx.Rslts_list.Ids__add(row.Page_id, row); - cbk.On_rslts_found(ctx.Qry, ctx.Rslts_list, 0, 1); + cbk.On_rslts_found(ctx, ctx.Qry, ctx.Rslts_list, 0, 1); ctx.Rslts_list.Rslts_are_first = false; } } diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_cmd.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_cmd.java index ac1147c65..d5db7c3ad 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_cmd.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_cmd.java @@ -57,7 +57,7 @@ public class Srch_special_cmd implements Gfo_invk, Srch_rslt_cbk, Xog_tab_close_ } private void Hide_cancel_btn() {Thread_adp_.Start_by_key(gplx.xowa.apps.Xoa_thread_.Key_special_search_cancel, this, Invk_hide_cancel);} private void Hide_cancel_btn_async() {js_wkr.Html_atr_set("xowa_cancel_" + wiki.Domain_str(), "style", "display:none;");} - public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { + public void On_rslts_found(Srch_search_ctx ctx, Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { if (rslts_list.Rslts_are_first) { if (rslts_bgn > qry.Slab_bgn) { for (int i = qry.Slab_bgn; i < rslts_bgn; ++i) { diff --git a/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_searcher.java b/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_searcher.java index 158a9ed78..8069b014c 100644 --- a/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_searcher.java +++ b/400_xowa/src/gplx/xowa/addons/wikis/searchs/specials/Srch_special_searcher.java @@ -61,7 +61,7 @@ public class Srch_special_searcher { } class Srch_rslt_cbk__synchronous implements Srch_rslt_cbk { public Srch_rslt_list Rslts() {return rslts;} private Srch_rslt_list rslts; - public void On_rslts_found(Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { + public void On_rslts_found(Srch_search_ctx ctx, Srch_search_qry qry, Srch_rslt_list rslts_list, int rslts_bgn, int rslts_end) { this.rslts = rslts_list; // just assign it } public void On_cancel() {} // synchronous cannot be canceled