Example #1
0
 public ResultsRenderer(string lang, CedictLookupResult lr, UiScript uiScript, UiTones uiTones)
 {
     this.lang     = lang;
     this.lr       = lr;
     this.uiScript = uiScript;
     this.uiTones  = uiTones;
 }
Example #2
0
        /// <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();
            }
        }
Example #3
0
        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);
        }