Пример #1
0
        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);
        }
Пример #2
0
 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);
            }
Пример #4
0
        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);
        }
Пример #5
0
        /// <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));
        }
Пример #6
0
        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);
 }
Пример #11
0
 public IEnumerable <ICompletionData> GetResults(TextEditor editor, string word, XshdRuleSet ruleSet = null, int offset = 0)
 {
     return(GetResults(editor.Text.Substring(0, editor.CaretOffset), word));
 }