public IEnumerable <ICompletionData> GetResults(string code, string word, XshdRuleSet ruleSet = null, int offset = 0) { var data = new List <ICompletionData>(); word = word.ToLower(); foreach (var item in TextUtils.ExtractFromStringTuple(code, "var[\\s]", "\\s|;")) { var str = item.str.Trim(); if (str.StartsWith(word)) { var foreachMargin = TextUtils.GetPreviousWord(code, item.index, 2).Contains("for") ? 1 : 0; if (TextUtils.GetBracketLevel(code, item.index) + foreachMargin <= TextUtils.GetBracketLevel(code, code.Length - 1)) { data.Add(new VariableCompletion(str)); } } } foreach (var item in TextUtils.ExtractFromStringTuple(code, "global[\\s]", "\\s|;")) { var str = item.str.Trim(); if (str.StartsWith(word)) { if (TextUtils.GetBracketLevel(code, item.index) <= TextUtils.GetBracketLevel(code, code.Length - 1)) { data.Add(new GlobalVariableCompletion(str)); } } } return(data); }
public IEnumerable <ICompletionData> GetResults(string word, XshdRuleSet ruleSet = null) { word = word.ToLower(); return(from codeSnippet in SnippetEditor.CodeSnippets where codeSnippet.ShortenedCalling.ToLower().StartsWith(word) select new CodeSnippetCompletion(codeSnippet)); }
public object VisitRuleSet(XshdRuleSet ruleSet) { HighlightingRuleSet rs = ruleSetDict[ruleSet]; if (processedRuleSets.Contains(ruleSet)) { return(rs); } if (!processingStartedRuleSets.Add(ruleSet)) { throw Error(ruleSet, "RuleSet cannot be processed because it contains cyclic <Import>"); } bool oldIgnoreCase = ignoreCase; if (ruleSet.IgnoreCase != null) { ignoreCase = ruleSet.IgnoreCase.Value; } rs.Name = ruleSet.Name; foreach (XshdElement element in ruleSet.Elements) { object o = element.AcceptVisitor(this); HighlightingRuleSet elementRuleSet = o as HighlightingRuleSet; if (elementRuleSet != null) { Merge(rs, elementRuleSet); } else { HighlightingSpan span = o as HighlightingSpan; if (span != null) { rs.Spans.Add(span); } else { HighlightingRule elementRule = o as HighlightingRule; if (elementRule != null) { rs.Rules.Add(elementRule); } } } } ignoreCase = oldIgnoreCase; processedRuleSets.Add(ruleSet); return(rs); }
static XshdRuleSet ParseRuleSet(XmlReader reader) { XshdRuleSet ruleSet = new XshdRuleSet(); SetPosition(ruleSet, reader); ruleSet.Name = reader.GetAttribute("name"); ruleSet.IgnoreCase = reader.GetBoolAttribute("ignoreCase"); CheckElementName(reader, ruleSet.Name); ParseElements(ruleSet.Elements, reader); return(ruleSet); }
/// <summary> /// Gets the keyword corresponding. /// </summary> /// <param name="word">The word to check</param> /// <param name="ruleSet">The NECESSARY DAMMIT ruleset</param> /// <returns>An IEnumarable of completion data</returns> public IEnumerable <ICompletionData> GetResults(string word, [ItemNotNull] XshdRuleSet ruleSet = null) { word = word.ToLower(); if (ruleSet == null) { throw new NullReferenceException(); // In case the syntax is null } // Else just continue :) var keywords = ruleSet.Elements.FirstOrDefault(e => e is XshdKeywords) as XshdKeywords; return(from keyword in keywords?.Words where keyword.ToLower().StartsWith(word) select new KeywordCompletion(keyword)); }
public IEnumerable <ICompletionData> GetResults(string code, string word, XshdRuleSet ruleSet = null, int offset = 0) { if (System.Text.RegularExpressions.Regex.IsMatch(word, "\\s")) { yield break; } word = word.ToLower(); var funcs = Utilities.TextUtils.ExtractFromString(code, "function", "{") .Select(s => new FunctionCompletion(s.Trim())); foreach (var functionCompletion in funcs) { if (functionCompletion.Text.ToLower().StartsWith(word)) { yield return(functionCompletion); } } }
public object VisitRuleSet(XshdRuleSet ruleSet) { HighlightingRuleSet hrs = new HighlightingRuleSet(); ruleSets.Add(ruleSet, hrs); if (ruleSet.Name != null) { if (ruleSet.Name.Length == 0) { throw Error(ruleSet, "Name must not be the empty string"); } if (def.ruleSetDict.ContainsKey(ruleSet.Name)) { throw Error(ruleSet, "Duplicate rule set name '" + ruleSet.Name + "'."); } def.ruleSetDict.Add(ruleSet.Name, hrs); } ruleSet.AcceptElements(this); return(null); }
private void InitializeDefinitions(XshdSyntaxDefinition xshd, IHighlightingDefinitionReferenceResolver resolver) { this.Name = xshd.Name; // Create HighlightingRuleSet instances var rnev = new RegisterNamedElementsVisitor(this); xshd.AcceptElements(rnev); // Assign MainRuleSet so that references can be resolved foreach (XshdElement element in xshd.Elements) { XshdRuleSet xrs = element as XshdRuleSet; if (xrs != null && xrs.Name == null) { if (MainRuleSet != null) { throw Error(element, "Duplicate main RuleSet. There must be only one nameless RuleSet!"); } else { MainRuleSet = rnev.ruleSets[xrs]; } } } if (MainRuleSet == null) { throw new HighlightingDefinitionInvalidException("Could not find main RuleSet."); } // Translate elements within the rulesets (resolving references and processing imports) xshd.AcceptElements(new TranslateElementVisitor(this, rnev.ruleSets, resolver)); foreach (var p in xshd.Elements.OfType <XshdProperty>()) { propDict.Add(p.Name, p.Value); } }
/// <summary> /// 保持しているInfoに従い、Xshdファイルを生成します /// </summary> /// <returns>true:成功, false:失敗</returns> private bool CreateXshdFile() { Logger.Info(CLASS_NAME, "CreateXshdFile", "start"); XshdSyntaxDefinition def = new XshdSyntaxDefinition(); def.Name = "TXT"; def.Extensions.Add(".txt"); // .txtファイルのみ対象としているので、将来拡張するならここをいじる必要がある // keywordは勝手に正規表現で前後に改行コードが含まれてしまうため、見出し文字列等以外には適さない // ★設定で回避できる? 要調査、現状は動くことを優先して下記設定とする // そのため、日本語文章を対象としていることから、類語・検索語はXshdRuleSetに登録する XshdRuleSet xshdRuleSet = new XshdRuleSet(); int i = 0; foreach (TextHighlightInfo info in _infos) { if (IsInfoCorrect(info) == false) { Logger.Error(CLASS_NAME, "CreateXshdFile", $"info is null or incorrect! index:[{i}]"); continue; } XshdColor color = new XshdColor { // Name = "keywordColor", // 別に名前は何でもいい Foreground = info.ForeGround, Background = info.BackGrouond, // 検索結果表示を太字にする //todo:設定で持たせるべきかもしれない FontWeight = System.Windows.FontWeights.Bold, //FontStyle = System.Windows.FontStyles.Italic これは斜体になる }; string colorName = "keyword"; // 文字毎に異なる背景色を設定したいため、ここでColorおよびColorRefのNameを紐付ける必要がある // 大量にあることを想定し、StringBuilderで結合する StringBuilder sb = new StringBuilder(colorName); sb.Append(i.ToString()); color.Name = sb.ToString(); XshdReference <XshdColor> colorRef = new XshdReference <XshdColor>(null, color.Name); string target = info.TargetWord; if (string.IsNullOrEmpty(target)) { Logger.Error(CLASS_NAME, "CreateXshdFile", $"target is null! target:[{target}]"); continue; } XshdRule rule = new XshdRule { ColorReference = colorRef, Regex = target // 正規表現で持たせる必要があるが、文字単位なのでそのまま渡して問題ない }; xshdRuleSet.Elements.Add(rule); // 追加したいモノは追加した def.Elements.Add(color); System.Threading.Interlocked.Increment(ref i); } def.Elements.Add(xshdRuleSet); return(WriteXshdFile(def)); }
public object VisitRuleSet(XshdRuleSet ruleSet) { ruleSet.AcceptElements(this); return(null); }
public IEnumerable <ICompletionData> GetResults(TextEditor editor, string word, XshdRuleSet ruleSet = null, int offset = 0) { return(GetResults(editor.Text.Substring(0, editor.CaretOffset), word)); }