Exemplo n.º 1
0
        private bool TransModeAndAction(TextParserMode toMode, TokenSpilitHandeler action, StringBuilder word, int tokenLength, bool TranAfterAction, ref int index, int wordPos)
        {
            TokenSpilitEventArgs e = new TokenSpilitEventArgs();

            if (word.Length > 0)
            {
                e.index  = wordPos;
                e.length = word.Length;
                e.type   = GetMode(this.mode, this.KeyWordType);
                action(e);
                word.Clear();
                if (e.breaked)
                {
                    return(true);
                }
            }

            if (TranAfterAction == false)
            {
                this.mode = toMode;
            }

            e.index  = index;
            e.length = tokenLength;
            e.type   = GetMode(this.mode, TokenType.None);
            action(e);
            if (e.breaked)
            {
                return(true);
            }

            if (TranAfterAction)
            {
                this.mode = toMode;
            }

            index += tokenLength;

            return(false);
        }
Exemplo n.º 2
0
        /// <summary>
        /// シンタックスハイライトを行う
        /// </summary>
        /// <param name="text"></param>
        /// <param name="length"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public int DoHilight(string text, int length, TokenSpilitHandeler action)
        {
            int encloserLevel = 0;
            int i, wordPos = 0;

            for (i = 0; i < length;)
            {
                if (IsMatch(text, i, "<!--"))
                {
                    encloserLevel++;
                    if (TransModeAndAction(TextParserMode.MultiLineComment, action, word, 4, false, ref i, wordPos))
                    {
                        break;
                    }
                }
                else if (IsMatch(text, i, "-->"))
                {
                    encloserLevel--;
                    if (TransModeAndAction(TextParserMode.TextPart, action, word, 3, true, ref i, wordPos))
                    {
                        break;
                    }
                }
                else if (text[i] == '<' && this.mode != TextParserMode.MultiLineComment)
                {
                    encloserLevel++;
                    if (TransModeAndAction(TextParserMode.ScriptPart, action, word, 1, true, ref i, wordPos))
                    {
                        break;
                    }
                    this.KeyWordType = TokenType.Keyword1;
                }
                else if (text[i] == '>' && this.mode == TextParserMode.ScriptPart)
                {
                    encloserLevel--;
                    if (TransModeAndAction(TextParserMode.TextPart, action, word, 1, false, ref i, wordPos))
                    {
                        break;
                    }
                }
                else if (IsMatch(text, i, "![CDATA[") && this.mode == TextParserMode.ScriptPart)
                {
                    encloserLevel++;
                    if (TransModeAndAction(TextParserMode.Literal, action, word, 8, false, ref i, wordPos))
                    {
                        break;
                    }
                }
                else if ((text[i] == '\"' || text[i] == '\'') && this.mode == TextParserMode.ScriptPart)
                {
                    encloserLevel++;
                    if (TransModeAndAction(TextParserMode.Literal, action, word, 1, false, ref i, wordPos))
                    {
                        break;
                    }
                }
                else if ((text[i] == '\"' || text[i] == '\'') && this.mode == TextParserMode.Literal)
                {
                    encloserLevel--;
                    if (TransModeAndAction(TextParserMode.ScriptPart, action, word, 1, true, ref i, wordPos))
                    {
                        break;
                    }
                }
                else if (IsMatch(text, i, "]]") && this.mode == TextParserMode.Literal)
                {
                    encloserLevel--;
                    if (TransModeAndAction(TextParserMode.ScriptPart, action, word, 2, true, ref i, wordPos))
                    {
                        break;
                    }
                }
                else if (text[i] == ' ')
                {
                    if (TransModeAndAction(this.mode, action, word, 1, false, ref i, wordPos))
                    {
                        break;
                    }
                    this.KeyWordType = TokenType.Keyword2;
                }
                else if (text[i] == '=')
                {
                    if (TransModeAndAction(this.mode, action, word, 1, false, ref i, wordPos))
                    {
                        break;
                    }
                    this.KeyWordType = TokenType.None;
                }
                else
                {
                    if (word.Length == 0)
                    {
                        wordPos = i;
                    }
                    word.Append(text[i]);
                    i++;
                    continue;
                }
            }

            if (word.Length > 0)
            {
                action(new TokenSpilitEventArgs(wordPos, word.Length, GetMode(this.mode, KeyWordType)));
                word.Clear();
            }

            return(encloserLevel);
        }