mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 03:07:04 +02:00
Refactoring pinyin
1. use custom patched pinyin library Pinyin4Net 2. fix memory leak on startup: 360mb -> 160mb when using vs15 debugger
This commit is contained in:
@@ -38,13 +38,12 @@ namespace Wox.Plugin.ControlPanel
|
||||
|
||||
public List<Result> Query(Query query)
|
||||
{
|
||||
string myQuery = query.Search.Trim();
|
||||
List<Result> results = new List<Result>();
|
||||
|
||||
foreach (var item in controlPanelItems)
|
||||
{
|
||||
var fuzzyMather = FuzzyMatcher.Create(myQuery);
|
||||
if (MatchProgram(item, fuzzyMather))
|
||||
item.Score = Score(item, query.Search);
|
||||
if (item.Score > 0)
|
||||
{
|
||||
var result = new Result
|
||||
{
|
||||
@@ -61,8 +60,8 @@ namespace Wox.Plugin.ControlPanel
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
//Silently Fail for now.. todo
|
||||
}
|
||||
//Silently Fail for now.. todo
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -74,14 +73,22 @@ namespace Wox.Plugin.ControlPanel
|
||||
return panelItems;
|
||||
}
|
||||
|
||||
private bool MatchProgram(ControlPanelItem item, FuzzyMatcher matcher)
|
||||
private int Score(ControlPanelItem item, string query)
|
||||
{
|
||||
if (item.LocalizedString != null && (item.Score = matcher.Evaluate(item.LocalizedString).Score) > 0) return true;
|
||||
if (item.InfoTip != null && (item.Score = matcher.Evaluate(item.InfoTip).Score) > 0) return true;
|
||||
|
||||
if (item.LocalizedString != null && (item.Score = matcher.Evaluate(item.LocalizedString.Unidecode()).Score) > 0) return true;
|
||||
|
||||
return false;
|
||||
var scores = new List<int>();
|
||||
if (item.LocalizedString != null)
|
||||
{
|
||||
var score1 = StringMatcher.Score(item.LocalizedString, query);
|
||||
var socre2 = StringMatcher.ScoreForPinyin(item.LocalizedString, query);
|
||||
scores.Add(Math.Max(score1, socre2));
|
||||
}
|
||||
if (item.InfoTip != null)
|
||||
{
|
||||
// todo should we add pinyin score for infotip also?
|
||||
var score = StringMatcher.Score(item.InfoTip, query);
|
||||
scores.Add(score);
|
||||
}
|
||||
return scores.Max();
|
||||
}
|
||||
|
||||
public string GetTranslatedPluginTitle()
|
||||
|
||||
@@ -9,24 +9,7 @@ namespace Wox.Plugin.Program
|
||||
public class Program
|
||||
{
|
||||
private static readonly Regex AbbrRegexp = new Regex("[^A-Z0-9]", RegexOptions.Compiled);
|
||||
private string m_Title;
|
||||
public string Title
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Title;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Title = value;
|
||||
string pinyin = m_Title.Unidecode();
|
||||
PinyinTitle = pinyin;
|
||||
AbbrTitle = AbbrRegexp.Replace(Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(pinyin), "");
|
||||
if (AbbrTitle.Length < 2) AbbrTitle = null;
|
||||
}
|
||||
}
|
||||
public string PinyinTitle { get; private set; }
|
||||
public string AbbrTitle { get; private set; }
|
||||
public string Title { get; set; }
|
||||
public string IcoPath { get; set; }
|
||||
public string ExecutePath { get; set; }
|
||||
public string ExecuteName { get; set; }
|
||||
|
||||
@@ -50,33 +50,34 @@ namespace Wox.Plugin.Program
|
||||
|
||||
public List<Result> Query(Query query)
|
||||
{
|
||||
|
||||
var fuzzyMather = FuzzyMatcher.Create(query.Search);
|
||||
var results = _programs.AsParallel()
|
||||
.Where(p => MatchProgram(p, fuzzyMather))
|
||||
.Where(p => Score(p, query.Search) > 0)
|
||||
.Select(ScoreFilter)
|
||||
.OrderByDescending(p => p.Score)
|
||||
.Select(c => new Result
|
||||
.Select(p => new Result
|
||||
{
|
||||
Title = c.Title,
|
||||
SubTitle = c.ExecutePath,
|
||||
IcoPath = c.IcoPath,
|
||||
Score = c.Score,
|
||||
ContextData = c,
|
||||
Title = p.Title,
|
||||
SubTitle = p.ExecutePath,
|
||||
IcoPath = p.IcoPath,
|
||||
Score = p.Score,
|
||||
ContextData = p,
|
||||
Action = e =>
|
||||
{
|
||||
var hide = StartProcess(new ProcessStartInfo(c.ExecutePath));
|
||||
var hide = StartProcess(new ProcessStartInfo(p.ExecutePath));
|
||||
return hide;
|
||||
}
|
||||
}).ToList();
|
||||
return results;
|
||||
}
|
||||
|
||||
private bool MatchProgram(Program program, FuzzyMatcher matcher)
|
||||
private int Score(Program program, string query)
|
||||
{
|
||||
var scores = new List<string> { program.Title, program.PinyinTitle, program.AbbrTitle, program.ExecuteName };
|
||||
program.Score = scores.Select(s => matcher.Evaluate(s ?? string.Empty).Score).Max();
|
||||
return program.Score > 0;
|
||||
var score1 = StringMatcher.Score(program.Title, query);
|
||||
var score2 = StringMatcher.ScoreForPinyin(program.Title, query);
|
||||
var score3 = StringMatcher.Score(program.ExecuteName, query);
|
||||
var score = new[] {score1, score2, score3}.Max();
|
||||
program.Score = score;
|
||||
return score;
|
||||
}
|
||||
|
||||
public void Init(PluginInitContext context)
|
||||
|
||||
@@ -55,11 +55,12 @@ namespace Wox.Plugin.Sys
|
||||
List<Result> results = new List<Result>();
|
||||
foreach (Result availableResult in availableResults)
|
||||
{
|
||||
int titleScore = StringMatcher.Match(availableResult.Title, query.Search);
|
||||
int subTitleScore = StringMatcher.Match(availableResult.SubTitle, query.Search);
|
||||
if (titleScore > 0 || subTitleScore > 0)
|
||||
var titleScore = StringMatcher.Score(availableResult.Title, query.Search);
|
||||
var subTitleScore = StringMatcher.Score(availableResult.SubTitle, query.Search);
|
||||
var score = Math.Max(titleScore, subTitleScore);
|
||||
if (score > 0)
|
||||
{
|
||||
availableResult.Score = titleScore > 0 ? titleScore : subTitleScore;
|
||||
availableResult.Score = score;
|
||||
results.Add(availableResult);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user