Пример #1
0
        private static bool ShallEscape(IDocCommentNode node, int offset)
        {
            IDocCommentBlockNode docBlock = node.GetContainingNode <IDocCommentBlockNode>(true);

            if (docBlock == null)
            {
                return(false);
            }
            XmlDocLexer lexer = new XmlDocLexer(docBlock);

            lexer.Start();

            bool inCData   = false;
            bool insideTag = false;

            while (lexer.TokenType != null)
            {
                if (lexer.TokenType == lexer.XmlTokenType.TAG_START)
                {
                    insideTag = true;
                }
                else if (lexer.TokenType == lexer.XmlTokenType.TAG_END)
                {
                    insideTag = false;
                }
                else if (lexer.TokenType == lexer.XmlTokenType.TAG_START1)
                {
                    insideTag = true;
                }
                else if (lexer.TokenType == lexer.XmlTokenType.TAG_END1)
                {
                    insideTag = false;
                }
                else if (lexer.TokenType == lexer.XmlTokenType.CDATA_START)
                {
                    inCData = true;
                }
                else if (lexer.TokenType == lexer.XmlTokenType.CDATA_END)
                {
                    inCData = false;
                }
                else if (offset >= lexer.TokenLocalRange.StartOffset && offset <= lexer.TokenLocalRange.EndOffset)
                {
                    return(!inCData && !insideTag);
                }
                else if (offset < lexer.TokenLocalRange.StartOffset)
                {
                    return(false);
                }
                lexer.Advance();
            }

            return(false);
        }
        public IEnumerator <string> GetEnumerator()
        {
            _docLexer.Start();
            int           inCode           = 0;
            bool          currentTagIsCode = false;
            StringBuilder blockBuilder     = new StringBuilder();

            while (_docLexer.TokenType != null)
            {
                if (_docLexer.TokenType == _docLexer.XmlTokenType.TAG_START)
                {
                    if (blockBuilder.Length > 0 && inCode == 0)
                    {
                        yield return(blockBuilder.ToString());

                        blockBuilder.Remove(0, blockBuilder.Length);
                    }

                    blockBuilder.Append(_docLexer.TokenText);
                    _docLexer.Advance();

                    currentTagIsCode = false;
                    if (_docLexer.TokenType == _docLexer.XmlTokenType.IDENTIFIER &&
                        (_docLexer.TokenText == "code" ||
                         _docLexer.TokenText == "c" ||
                         _docLexer.TokenText == "see" ||
                         _docLexer.TokenText == "typeparamref" ||
                         _docLexer.TokenText == "paramref"))
                    {
                        inCode++;
                        currentTagIsCode = true;
                    }

                    blockBuilder.Append(_docLexer.TokenText);
                    _docLexer.Advance();
                }
                else if (_docLexer.TokenType == _docLexer.XmlTokenType.TAG_START1)
                {
                    if (blockBuilder.Length > 0 && inCode == 0)
                    {
                        yield return(blockBuilder.ToString());

                        blockBuilder.Remove(0, blockBuilder.Length);
                    }

                    blockBuilder.Append(_docLexer.TokenText);
                    _docLexer.Advance();
                    if (_docLexer.TokenType == _docLexer.XmlTokenType.IDENTIFIER &&
                        (_docLexer.TokenText == "code" ||
                         _docLexer.TokenText == "c" ||
                         _docLexer.TokenText == "see" ||
                         _docLexer.TokenText == "typeparamref" ||
                         _docLexer.TokenText == "paramref"))
                    {
                        inCode--;
                    }
                }
                else if (_docLexer.TokenType == _docLexer.XmlTokenType.TAG_END ||
                         _docLexer.TokenType == _docLexer.XmlTokenType.TAG_END1)
                {
                    if (_docLexer.TokenType == _docLexer.XmlTokenType.TAG_END1 && currentTagIsCode)
                    {
                        inCode--;
                    }

                    blockBuilder.Append(_docLexer.TokenText);
                    if (inCode == 0)
                    {
                        yield return(blockBuilder.ToString());

                        blockBuilder.Remove(0, blockBuilder.Length);
                    }
                    _docLexer.Advance();
                }
                else
                {
                    blockBuilder.Append(_docLexer.TokenText);
                    _docLexer.Advance();
                }
            }

            yield return(blockBuilder.ToString());
        }
 public XmlCommentReflowableBlockLexer(IDocCommentBlock docCommentBlock)
 {
     _docLexer = new XmlDocLexer(docCommentBlock);
     _docLexer.Start();
 }