public ResultsRenderer(string lang, CedictLookupResult lr, UiScript uiScript, UiTones uiTones) { this.lang = lang; this.lr = lr; this.uiScript = uiScript; this.uiTones = uiTones; }
/// <summary> /// Dictionary lookup and results rendering in worker thread. /// </summary> /// <param name="ctxt"></param> private void search(object ctxt) { LookupItem li; // Pick very last item in queue to look up; clear rest of queue lock (lookupItems) { if (lookupItems.Count == 0) { return; } li = lookupItems[lookupItems.Count - 1]; lookupItems.Clear(); // If this is not very last request, don't even bother if (li.ID != lookupId) { return; } } // Look up in dictionary CedictLookupResult res = dict.Lookup(li.Text, li.Script, li.Lang); // Call below transfers ownership of entry provider to results control. clearWhite(); bool shown = ctrlResults.SetResults(li.ID, res.EntryProvider, res.Results, searchScript); // If these results came too late (a long query completing too late, when a later fast query already completed) // Then we're done, no flashing. if (!shown) { return; } // Did lookup language change? if (res.ActualSearchLang != li.Lang) { searchLang = res.ActualSearchLang; searchLangChanged(); btnSearchLang.Flash(); } }
private PageResult doSearchInner(string rel, string lang, string searchScript, string searchTones, bool isMobile, out string query) { query = ""; if (rel == "" || rel == "search" || rel == "search/") { return(doWelcome(lang)); } Stopwatch swatch = new Stopwatch(); swatch.Restart(); PageResult pr; // Search settings UiScript uiScript = UiScript.Both; if (searchScript == "simp") { uiScript = UiScript.Simp; } else if (searchScript == "trad") { uiScript = UiScript.Trad; } UiTones uiTones = UiTones.Pleco; if (searchTones == "dummitt") { uiTones = UiTones.Dummitt; } else if (searchTones == "none") { uiTones = UiTones.None; } // Perform query query = rel.Replace("search/", ""); query = query.Trim(); query = WebUtility.UrlDecode(query); query = query.Trim(); CedictLookupResult lr = dict.Lookup(query); int msecLookup = (int)swatch.ElapsedMilliseconds; int msecFull = msecLookup; // No results if (lr.Results.Count == 0 && lr.Annotations.Count == 0) { pr = pageProvider.GetPage(lang, "?/noresults", false); pr.Data = query; // Can add word now? if (canAddWord(query)) { pr.Html = pr.Html.Replace("{addnowclass}", "visible"); } else { pr.Html = pr.Html.Replace("{addnowclass}", ""); } } else { // Render results StringBuilder sb = new StringBuilder(); ResultsRenderer rr = new ResultsRenderer(lang, lr, uiScript, uiTones); rr.Render(sb, lang); // Title string title; if (lr.ActualSearchLang == SearchLang.Chinese) { title = TextProvider.Instance.Mut == Mutation.CHD ? TextProvider.Instance.GetString(lang, "misc.searchResultTitleCHD") : TextProvider.Instance.GetString(lang, "misc.searchResultTitleHDD"); } else { title = TextProvider.Instance.Mut == Mutation.CHD ? TextProvider.Instance.GetString(lang, "misc.searchResultTitleTrgCHD") : TextProvider.Instance.GetString(lang, "misc.searchResultTitleTrgHDD"); } title = string.Format(title, query); msecFull = (int)swatch.ElapsedMilliseconds; // Wrap up pr = new PageResult { RelNorm = rel, Title = title, Html = sb.ToString(), Data = query, }; } // Query log string country; string xfwd = HttpContext.Request.Headers["X-Real-IP"]; if (xfwd != null) { country = cres.GetContryCode(IPAddress.Parse(xfwd)); } else { country = cres.GetContryCode(HttpContext.Connection.RemoteIpAddress); } int resCount = lr.Results.Count > 0 ? lr.Results.Count : lr.Annotations.Count; QueryLogger.SearchMode smode = QueryLogger.SearchMode.Target; if (lr.ActualSearchLang == SearchLang.Target) { smode = QueryLogger.SearchMode.Target; } else if (lr.Results.Count > 0) { smode = QueryLogger.SearchMode.Source; } else if (lr.Annotations.Count > 0) { smode = QueryLogger.SearchMode.Annotate; } qlog.LogQuery(country, isMobile, lang, uiScript, uiTones, resCount, msecLookup, msecFull, smode, query); // Done return(pr); }