Example #1
0
        public AttributeNodeWithPrefix(ElementNode parent, AttributeToken token) :
            base(parent, token)
        {
            var nameToken = token.NameToken as NameToken;

            Prefix = parent != null?parent.GetText(nameToken.PrefixRange) : string.Empty;
        }
Example #2
0
        public void AttributeParsing_Namespaces()
        {
            var target = ParserAccessor.CreateParser("ns:name=foo");

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.True(at.HasName());
                Assert.Equal(0, at.NameToken.Start);
                Assert.Equal(7, at.NameToken.End);

                Assert.True(at.HasValue());
                Assert.Equal(8, at.ValueToken.Start);
                Assert.Equal(11, at.ValueToken.End);

                NameToken nameToken = at.NameToken as NameToken;

                Assert.True(nameToken.HasQualifiedName());

                Assert.True(nameToken.NameRange.Length > 0);
                Assert.Equal(3, nameToken.NameRange.Start);
                Assert.Equal(7, nameToken.NameRange.End);

                Assert.True(nameToken.PrefixRange.Length > 0);
                Assert.Equal(0, nameToken.PrefixRange.Start);
                Assert.Equal(2, nameToken.PrefixRange.End);
            };

            target.OnAttributeState();
        }
Example #3
0
        public void AttributeParsing_NamespacesMissingNameAndPrefix()
        {
            var target = ParserAccessor.CreateParser(":=foo");

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.False(at.HasName());

                Assert.True(at.HasValue());
                Assert.Equal(2, at.ValueToken.Start);
                Assert.Equal(3, at.ValueToken.Length);

                NameToken nameToken = at.NameToken as NameToken;

                Assert.Equal(1, nameToken.ColonRange.Length);

                Assert.False(nameToken.HasName());
                Assert.Equal(0, nameToken.NameRange.Length);

                Assert.False(nameToken.HasPrefix());
                Assert.Equal(0, nameToken.PrefixRange.Length);
            };
            target.OnAttributeState();
        }
Example #4
0
        public static AttributeNode Create(ElementNode parent, AttributeToken token)
        {
            var nameToken = token.NameToken as NameToken;

            if (nameToken != null && nameToken.HasPrefix())
            {
                return(new AttributeNodeWithPrefix(parent, token));
            }

            return(new AttributeNode(parent, token));
        }
Example #5
0
        internal AttributeToken OnAttributeState(int tagEnd, bool artifactTag = false)
        {
            AttributeToken attributeToken = GetAttributeState(tagEnd, artifactTag, true);

            if ((AttributeFound != null) && (attributeToken != null))
            {
                AttributeFound(this, new HtmlParserAttributeEventArgs(attributeToken));
            }

            return(attributeToken);
        }
 internal Attribute(AttributeToken item)
 {
     Line = item.Line;
     AttributeValue = item.Value;
     ValueType = item.ValueType;
     AttributeType = item.AttributeType;
     if (item.Next != null)
     {
         Next = new Attribute(item.Next);
     }
 }
Example #7
0
        public void TestMultiLineTag()
        {
            string      str   = @"<div
    class='test'
/>";
            List <Line> lines = Tokenizer.Parse(str);

            Assert.AreEqual(3, lines.Count);
            List <IToken> lineTokens = lines[0].Tokens;

            Assert.AreEqual(1, lineTokens.Count);

            Assert.AreEqual(TokenType.StartTag, lineTokens[0].TokenType);
            StartTag startTag = (StartTag)lineTokens[0];

            Assert.AreEqual("div", startTag.Name);
            Assert.AreEqual(true, startTag.IsSelfClosingTag);
            Assert.AreEqual(LineType.MultiLineStart, startTag.LineType);
            Assert.AreEqual(0, startTag.Attributes.Count);

            lineTokens = lines[1].Tokens;
            Assert.AreEqual(1, lineTokens.Count);

            Assert.AreEqual(TokenType.StartTag, lineTokens[0].TokenType);
            startTag = (StartTag)lineTokens[0];
            Assert.AreEqual("div", startTag.Name);
            Assert.AreEqual(true, startTag.IsSelfClosingTag);
            Assert.AreEqual(LineType.MultiLine, startTag.LineType);
            Assert.AreEqual(2, startTag.Attributes.Count);

            List <IToken> attributes = startTag.Attributes;

            Assert.AreEqual(TokenType.Text, attributes[0].TokenType);

            Assert.AreEqual(TokenType.Attribute, attributes[1].TokenType);
            AttributeToken attribute = (AttributeToken)attributes[1];

            Assert.AreEqual("class", attribute.Name);
            Assert.AreEqual("test", attribute.Value.Content);

            lineTokens = lines[2].Tokens;
            Assert.AreEqual(1, lineTokens.Count);

            Assert.AreEqual(TokenType.StartTag, lineTokens[0].TokenType);
            startTag = (StartTag)lineTokens[0];
            Assert.AreEqual("div", startTag.Name);
            Assert.AreEqual(true, startTag.IsSelfClosingTag);
            Assert.AreEqual(LineType.MultiLineEnd, startTag.LineType);
            Assert.AreEqual(0, startTag.Attributes.Count);
        }
Example #8
0
        public void AttributeParse_MissingNameAndValue()
        {
            var target = ParserAccessor.CreateParser("=");

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.False(at.HasName());
                Assert.False(at.HasValue());
            };

            target.OnAttributeState(100);
        }
Example #9
0
        public void AttributeParse_RandomCharacters()
        {
            var target = new HtmlParser();

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                switch (attributeCalls)
                {
                case 0:
                    Assert.True(at.HasName());
                    Assert.Equal(3, at.NameToken.Start);
                    Assert.Equal(2, at.NameToken.Length);

                    Assert.True(at.HasValue());
                    Assert.Equal(6, at.ValueToken.Start);
                    Assert.Equal(1, at.ValueToken.Length);
                    break;

                case 1:
                    Assert.True(at.HasName());
                    Assert.Equal(8, at.NameToken.Start);
                    Assert.Equal(1, at.NameToken.Length);

                    Assert.True(at.HasValue());
                    Assert.Equal(10, at.ValueToken.Start);
                    Assert.Equal(1, at.ValueToken.Length);
                    break;

                case 2:
                    Assert.True(at.HasName());
                    Assert.Equal(12, at.NameToken.Start);
                    Assert.Equal(2, at.NameToken.Length);

                    Assert.False(at.HasValue());
                    break;
                }
                attributeCalls++;
            };

            attributeCalls = 0;
            target.Parse("<a id=# $=% ^^");

            Assert.Equal(3, attributeCalls);
        }
Example #10
0
        private void BuildRenderAttribute(RenderTreeBuilder builder, AttributeToken attribute)
        {
            builder.OpenElement(Next(), "span");
            builder.AddAttribute(Next(), "class", _themeAttributeNameClass);
            builder.AddContent(Next(), " " + attribute.Name);
            builder.CloseElement();

            if (!attribute.NameOnly)
            {
                builder.OpenElement(Next(), "span");
                builder.AddAttribute(Next(), "class", _themeAttributeValueClass);
                builder.AddContent(Next(), "=");
                builder.CloseElement();

                BuildRendeQuotedTag(builder, attribute.Value);
            }
        }
Example #11
0
        public void NewRazorFeaturesInPreview6()
        {
            string str = @"@page '/'
@namespace MyNamespace
@attribute [Authorize]

<div @key='key' @onclick='@Clicked' @bind='myValue' @directive @directive='value' 
@directive:key @directive:key='value' @directive-suffix @directive-suffix='value'
@directive-suffix:key @directive-suffix:key='value' />

@code {
    public void Clicked()
    {
        //Comments arent supported yet
    }
}
";

            List <Line> lines = Tokenizer.Parse(str);

            Assert.AreEqual(15, lines.Count);

            Assert.AreEqual(TokenType.CSLine, lines[1].Tokens[0].TokenType);
            Assert.AreEqual(CSLineType.Namespace, ((CSLine)lines[1].Tokens[0]).LineType);

            Assert.AreEqual(TokenType.CSLine, lines[2].Tokens[0].TokenType);
            Assert.AreEqual(CSLineType.Attribute, ((CSLine)lines[2].Tokens[0]).LineType);

            Assert.AreEqual(TokenType.StartTag, lines[4].Tokens[0].TokenType);
            StartTag startTag = (StartTag)lines[4].Tokens[0];

            Assert.AreEqual(TokenType.Attribute, startTag.Attributes[0].TokenType);
            AttributeToken attribute = (AttributeToken)startTag.Attributes[0];

            Assert.AreEqual("@key", attribute.Name);
            Assert.AreEqual(TokenType.QuotedString, attribute.Value.TokenType);
            Assert.AreEqual("key", attribute.Value.Content);
            attribute = (AttributeToken)startTag.Attributes[1];
            Assert.AreEqual("@onclick", attribute.Name);
            Assert.AreEqual("Clicked", attribute.Value.Content);
            Assert.AreEqual(true, attribute.Value.IsCSStatement);

            Assert.AreEqual(TokenType.CSBlockStart, lines[8].Tokens[0].TokenType);
            Assert.AreEqual(true, ((CSBlockStart)lines[8].Tokens[0]).IsCode);
        }
Example #12
0
        public void AttributeParse_WellFormed4()
        {
            var target = ParserAccessor.CreateParser("nowrap");

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.True(at.HasName());
                Assert.Equal(0, at.NameToken.Start);
                Assert.Equal(6, at.NameToken.Length);

                Assert.False(at.HasValue());
            };

            target.OnAttributeState(100);
        }
Example #13
0
        protected AttributeNode(ElementNode parent, AttributeToken token)
        {
            AttributeToken = token;

            if (parent != null && parent.Root.Tree != null)
            {
                var nameToken = token.NameToken as NameToken;

                if (token.HasName())
                {
                    _name = parent.GetText(nameToken != null ? nameToken.NameRange : token);
                }
                else
                {
                    _name = String.Empty;
                }

                UpdateValue(parent.TextProvider);
            }
        }
Example #14
0
        public void AttributeParse_InlineStyle()
        {
            var target = ParserAccessor.CreateParser("style=\"display:none;\"");

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.True(at.HasName());
                Assert.Equal(0, at.NameToken.Start);
                Assert.Equal(5, at.NameToken.Length);

                Assert.True(at.HasValue());
                Assert.Equal(6, at.ValueToken.Start);
                Assert.Equal(15, at.ValueToken.Length);
            };

            target.OnAttributeState(100);
        }
Example #15
0
        public void AttributeParse_WellFormed1()
        {
            var target = ParserAccessor.CreateParser("foo=bar");

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.True(at.HasName());
                Assert.Equal(0, at.NameToken.Start);
                Assert.Equal(3, at.NameToken.End);

                Assert.True(at.HasValue());
                Assert.Equal(4, at.ValueToken.Start);
                Assert.Equal(7, at.ValueToken.End);
            };

            target.OnAttributeState(100);
        }
Example #16
0
        public void AttributeParse_WellFormed2()
        {
            var text   = "class=\"foo\"";
            var target = ParserAccessor.CreateParser(text);

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.True(at.HasName());
                Assert.Equal(0, at.NameToken.Start);
                Assert.Equal(5, at.NameToken.End);

                Assert.True(at.HasValue());
                Assert.Equal(6, at.ValueToken.Start);
                Assert.Equal(text.Length, at.ValueToken.End);
            };

            target.OnAttributeState(100);
        }
Example #17
0
        public void TestStatement()
        {
            List <Line> lines = Tokenizer.Parse("This is an <div onclick='@(() => onclick(\"hello\"))' /> test");

            Assert.AreEqual(1, lines.Count);
            List <IToken> lineTokens = lines[0].Tokens;

            Assert.AreEqual(3, lineTokens.Count);
            Assert.AreEqual(TokenType.StartTag, lineTokens[1].TokenType);
            StartTag startTag = (StartTag)lineTokens[1];

            Assert.AreEqual("div", startTag.Name);
            Assert.AreEqual(1, startTag.Attributes.Count);
            Assert.AreEqual(TokenType.Attribute, startTag.Attributes[0].TokenType);
            AttributeToken attribute = (AttributeToken)startTag.Attributes[0];

            Assert.AreEqual("onclick", attribute.Name);
            Assert.AreEqual(true, attribute.Value.IsCSStatement);
            Assert.AreEqual(true, attribute.Value.HasParentheses);
            Assert.AreEqual("() => onclick(\"hello\")", attribute.Value.Content);
        }
Example #18
0
        public void TestVariable()
        {
            List <Line> lines = Tokenizer.Parse("This is an <b name='@testname' /> test");

            Assert.AreEqual(1, lines.Count);
            List <IToken> lineTokens = lines[0].Tokens;

            Assert.AreEqual(3, lineTokens.Count);
            Assert.AreEqual(TokenType.StartTag, lineTokens[1].TokenType);
            StartTag startTag = (StartTag)lineTokens[1];

            Assert.AreEqual("b", startTag.Name);
            Assert.AreEqual(1, startTag.Attributes.Count);
            Assert.AreEqual(TokenType.Attribute, startTag.Attributes[0].TokenType);
            AttributeToken attribute = (AttributeToken)startTag.Attributes[0];

            Assert.AreEqual("name", attribute.Name);
            Assert.AreEqual(true, attribute.Value.IsCSStatement);
            Assert.AreEqual(false, attribute.Value.HasParentheses);
            Assert.AreEqual("testname", attribute.Value.Content);
        }
Example #19
0
        public void AttributeParse_Script()
        {
            var text   = "onclick=\"window.navigateTo(x<y)\"  ";
            var target = ParserAccessor.CreateParser(text);

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                Assert.True(at.HasName());
                Assert.Equal(0, at.NameToken.Start);
                Assert.Equal(7, at.NameToken.End);

                Assert.True(at.HasValue());
                Assert.Equal(8, at.ValueToken.Start);
                Assert.Equal(text.Length - 2, at.ValueToken.End);
            };

            target.OnAttributeState(100);
        }
Example #20
0
        public void AttributeParse_InlineStyle_Typo()
        {
            var target = new HtmlParser();

            target.AttributeFound +=
                delegate(object sender, HtmlParserAttributeEventArgs args) {
                Assert.True(args.AttributeToken is AttributeToken);
                AttributeToken at = args.AttributeToken;

                switch (attributeCalls)
                {
                case 0:
                    Assert.True(at.HasName());
                    Assert.Equal(7, at.NameToken.Start);
                    Assert.Equal(5, at.NameToken.Length);

                    Assert.True(at.HasValue());
                    Assert.Equal(13, at.ValueToken.Start);
                    Assert.Equal(14, at.ValueToken.Length);
                    break;

                case 1:
                    Assert.True(at.HasName());
                    Assert.Equal(27, at.NameToken.Start);
                    Assert.Equal(1, at.NameToken.Length);

                    Assert.False(at.HasValue());
                    break;
                }
                attributeCalls++;
            };

            attributeCalls = 0;
            target.Parse("<input style=\"display:none\";>");
            Assert.Equal(2, attributeCalls);
        }
Example #21
0
 public override void ShiftStartingFrom(int position, int offset)
 {
     AttributeToken.ShiftStartingFrom(position, offset);
 }
Example #22
0
        internal AttributeToken GetAttributeState(int tagEnd, bool artifactTag, bool getValueInfo)
        {
            int            eqPos          = -1;
            bool           isScript       = false;
            IHtmlToken     nameToken      = null;
            AttributeToken attributeToken = null;

            _tokenizer.SkipWhitespace();
            if (!_cs.IsEndOfStream())
            {
                nameToken = _tokenizer.GetNameToken(tagEnd, artifactTag);

                // Allow whitespace before = per HTML standard
                _tokenizer.SkipWhitespace();

                if (_cs.CurrentChar != '=' && nameToken != null)
                {
                    // standalone attribute
                    return(new AttributeToken(nameToken));
                }

                if (_cs.CurrentChar == '=')
                {
                    eqPos = _cs.Position;
                    _cs.MoveToNextChar();
                }

                IHtmlAttributeValueToken value = null;
                if (getValueInfo)
                {
                    // Allow whitespace before = per HTML standard
                    _tokenizer.SkipWhitespace();

                    // Check if attribute name begins with 'on' which means its value is script like
                    // onclick="...". Script can legally include < > (like in if(x < y)... so we are
                    // going to assume that everything between quotes is the script code. Note also
                    // that script should always be quoted. If quote is missing, we assume that
                    // attribute has no value. We cannot tell if attribute is script if attribute name
                    // is an artifact, so we don't support <% %> = "script code".
                    if (_cs.IsAtString() && nameToken != null && nameToken.Length >= 2)
                    {
                        char c1 = _cs[nameToken.Start];
                        char c2 = _cs[nameToken.Start + 1];

                        if ((c1 == 'o' || c1 == 'O') && (c2 == 'n' || c2 == 'N'))
                        {
                            isScript = true;
                        }
                    }

                    value = GetAttributeValue(isScript, tagEnd);

                    // In some odd cases we may end up with no name, no equals sign and no value.
                    // Check if this is the case and if so, advance character stream position
                    // and try again.
                    if (nameToken != null || eqPos >= 0 || value != null)
                    {
                        attributeToken = new AttributeToken(nameToken, eqPos, value);
                    }
                    else
                    {
                        // We could not make sense at all - move on.
                        _cs.MoveToNextChar();
                    }
                }
            }

            return(attributeToken);
        }
Example #23
0
 /// <summary>
 /// Tells if attribute has an equal sign
 /// </summary>
 /// <returns>True if attribute has value</returns>
 public bool HasEqualSign()
 {
     return(AttributeToken.HasEqualSign());
 }
Example #24
0
        internal void Push(Token token)
        {
            int wordtype;
            switch (token.Type)
            {
                case TokenType.Number:
                case TokenType.Boolean:
                    wordtype = (int)TokenType.String;
                    break;

                default:
                    wordtype = (int)token.Type;
                    break;
            }

            var action = _action[_stateStack[_stateStack.Count - 1]][wordtype];
            if (action == null)
            {
                IsLoopingForReduce = false;
                throw new ParseException($"Grammar error at line {token.Line}");
            }
            else if (action[0] == 'A')
            {
                IsAccepted = true;
                IsLoopingForReduce = false;
                switch (action[1])
                {
                    case '1'://ACC for elements
                        var blocktype = (BlockTypes)System.Enum.Parse(typeof(BlockTypes), _tokenStack[1].Value);
                        _blockToken = new BlockToken(blocktype, _tokenStack[_tokenStack.Count - 1] as ElementToken);
                        break;

                    case '2'://ACC for settings
                        _blockToken = new BlockToken(_tokenStack[_tokenStack.Count - 1] as AttributeToken);
                        break;

                    case '3'://ACC for content
                        _blockToken = new BlockToken(_tokenStack[_tokenStack.Count - 1].Value);
                        break;
                }
                Block = new Block(_blockToken);
            }
            else if (action[0] == 'S')
            {
                var statestring = "";
                for (var i = 1; i < action.Length; i++)
                {
                    statestring += action[i];
                }
                var nextstate = int.Parse(statestring);
                _stateStack.Add(nextstate);
                _tokenStack.Add(token);
                IsLoopingForReduce = false;
            }
            else
            {
                IsLoopingForReduce = true;
                var reducestring = "";
                for (var i = 1; i < action.Length; i++)
                {
                    reducestring += action[i];
                }
                var reducerule = int.Parse(reducestring);
                switch (reducerule)
                {
                    //case 1:// Block -> Type Bracket Elements Bracket
                    //    break;
                    //case 2:// Block -> Settings
                    //    break;
                    //case 3:// Block -> Content
                    //    break;
                    case 4:// Elements -> Element
                        _stateStack[_stateStack.Count - 1] = _goto[_stateStack[_stateStack.Count - 2]][2];
                        break;

                    case 5:// Elements -> Elements Element
                        var nextele = _tokenStack[_tokenStack.Count - 1] as ElementToken;
                        var preele = _tokenStack[_tokenStack.Count - 2] as ElementToken;
                        Debug.Assert(nextele != null, "nextele != null");
                        nextele.Next = preele;
                        _tokenStack.RemoveRange(_tokenStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _stateStack.RemoveRange(_stateStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _tokenStack.Add(nextele);
                        _stateStack.Add(_goto[_stateStack[_stateStack.Count - 1]][2]);
                        break;

                    case 6:// Element -> Sharp Ename Equals Value Break
                        var eName = _tokenStack[_tokenStack.Count - 4].Value;
                        var eType = (ElementTypes)System.Enum.Parse(typeof(ElementTypes), eName);
                        var setele = new ElementToken(_tokenStack[_tokenStack.Count - 5].Line, eType, _tokenStack[_tokenStack.Count - 2].Value);
                        _tokenStack.RemoveRange(_tokenStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _stateStack.RemoveRange(_stateStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _tokenStack.Add(setele);
                        _stateStack.Add(_goto[_stateStack[_stateStack.Count - 1]][3]);
                        break;

                    case 7:// Element -> EName Bracket Atts Bracket
                        var elementName = _tokenStack[_tokenStack.Count - 4].Value;
                        var elementType = (ElementTypes)System.Enum.Parse(typeof(ElementTypes), elementName);
                        var atts = _tokenStack[_tokenStack.Count - 2] as AttributeToken;
                        Debug.Assert(atts != null, "atts != null");
                        var element = new ElementToken(atts.Line, elementType, atts);
                        _tokenStack.RemoveRange(_tokenStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _stateStack.RemoveRange(_stateStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _tokenStack.Add(element);
                        _stateStack.Add(_goto[_stateStack[_stateStack.Count - 1]][3]);
                        break;

                    case 8:// Settings -> Setting
                        _stateStack[_stateStack.Count - 1] = _goto[_stateStack[_stateStack.Count - 2]][0];
                        break;

                    case 9:// Settings -> Settings Setting
                        var nextset = _tokenStack[_tokenStack.Count - 1] as AttributeToken;
                        var preset = _tokenStack[_tokenStack.Count - 2] as AttributeToken;
                        Debug.Assert(nextset != null, "nextset != null");
                        nextset.Next = preset;
                        _tokenStack.RemoveRange(_tokenStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _stateStack.RemoveRange(_stateStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _tokenStack.Add(nextset);
                        _stateStack.Add(_goto[_stateStack[_stateStack.Count - 1]][0]);
                        break;
                    //case 10:// Content -> USD Value Break
                    //    break;
                    case 11:// Setting -> Sharp Att
                        _tokenStack.RemoveAt(_tokenStack.Count - _popCount[reducerule - 1]);
                        _stateStack.RemoveAt(_stateStack.Count - _popCount[reducerule - 1]);
                        _stateStack[_stateStack.Count - 1] = _goto[_stateStack[_stateStack.Count - 2]][1];
                        break;

                    case 12:// Atts -> Att
                        _stateStack[_stateStack.Count - 1] = _goto[_stateStack[_stateStack.Count - 2]][4];
                        break;

                    case 13:// Atts -> Atts Att
                        var nextatt = _tokenStack[_tokenStack.Count - 1] as AttributeToken;
                        var preatt = _tokenStack[_tokenStack.Count - 2] as AttributeToken;
                        Debug.Assert(nextatt != null, "nextatt != null");
                        nextatt.Next = preatt;
                        _tokenStack.RemoveRange(_tokenStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _stateStack.RemoveRange(_stateStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _tokenStack.Add(nextatt);
                        _stateStack.Add(_goto[_stateStack[_stateStack.Count - 1]][4]);
                        break;

                    case 14:// Att -> Name Equals Value Break
                        AttributeValueType valueType = AttributeValueType.String;
                        switch (_tokenStack[_tokenStack.Count - 2].Type)
                        {
                            case TokenType.Number:
                                valueType = AttributeValueType.Number;
                                break;

                            case TokenType.Boolean:
                                valueType = AttributeValueType.Boolean;
                                break;
                        }
                        AttributeTypes attType = (AttributeTypes)System.Enum.Parse(typeof(AttributeTypes), _tokenStack[_tokenStack.Count - 4].Value);
                        AttributeToken att = new AttributeToken
                            (
                                _tokenStack[_tokenStack.Count - 2].Line,
                                attType,
                                _tokenStack[_tokenStack.Count - 2].Value,
                                valueType
                            );
                        _tokenStack.RemoveRange(_tokenStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _stateStack.RemoveRange(_stateStack.Count - _popCount[reducerule - 1], _popCount[reducerule - 1]);
                        _tokenStack.Add(att);
                        _stateStack.Add(_goto[_stateStack[_stateStack.Count - 1]][5]);
                        break;
                }
            }
        }
        public override BaseState Process(HtmlTokenizer tokenizer, StreamReader reader)
        {
            AttributeToken attrToken = null;

            int c;
            do
            {
                c = Read(reader);
            } while (IsWhitespace(c));

            if (c == '/')
            {
                return SelfClosingStartTagState.Instance;
            }

            if (c == '>')
            {
                tokenizer.EmitToken(Token);
                return DataState.Instance;
            }

            if (base.IsUppercaseAsciiLetter(c))
            {
                attrToken = new AttributeToken() {
                    AttributeName = Char.ToLower((char)c).ToString(),
                    AttributeValue = string.Empty,
                    ContainingTag = Token
                };
                Token.Attributes.Add(attrToken);
                AttributeNameState.Instance.Token = attrToken;
                return AttributeNameState.Instance;
            }

            if (c == 0)
            {
                ReportParseError();
                attrToken = new AttributeToken() {
                    AttributeName = "\uFFFD",
                    AttributeValue = string.Empty,
                    ContainingTag = Token
                };
                Token.Attributes.Add(attrToken);
                AttributeNameState.Instance.Token = attrToken;
                return AttributeNameState.Instance;
            }

            if (c == -1)
            {
                ReportParseError();
                return DataState.Instance;
                // Reconsume the EOF character (?)
            }

            if (c == '"' || c == '\'' || c == '<' || c == '=')
            {
                ReportParseError();
            }

            attrToken = new AttributeToken() {
                AttributeName = ((char)c).ToString(),
                AttributeValue = string.Empty,
                ContainingTag = Token
            };

            Token.Attributes.Add(attrToken);
            AttributeNameState.Instance.Token = attrToken;
            return AttributeNameState.Instance;
        }
Example #26
0
 /// <summary>
 /// Determines if attribute is a standalone attribute (i.e. does not have equal sign or value)
 /// </summary>
 public bool IsStandalone()
 {
     return(AttributeToken.EqualsSign < 0 && !AttributeToken.HasValue());
 }
Example #27
0
 public override string ToString()
 {
     return(AttributeToken.ToString());
 }
Example #28
0
 public HtmlParserAttributeEventArgs(AttributeToken attributeToken)
 {
     AttributeToken = attributeToken;
 }
Example #29
0
 protected override IEnumerable <Suggestion> TryProvideSuggestions(BeginTagToken tagToken, AttributeToken attributeToken)
 {
     if (string.Equals(attributeToken.GetValue(), "server", StringComparison.CurrentCultureIgnoreCase))
     {
         yield return(new Suggestion()
         {
             Description = @"DotVVM doesn't need <code>runat=""server""</code> attributes.",
             Fixes = new[]
             {
                 new RemoveAttributeFix(tagToken, attributeToken)
             }
         });
     }
 }
Example #30
0
 /// <summary>
 /// Determines if attribute has qualified name (i.e. both prefix and name)
 /// </summary>
 public bool HasQualifiedName()
 {
     return((QualifiedName != null && QualifiedName.Length > 0) || AttributeToken.HasQualifiedName());
 }
Example #31
0
 /// <summary>
 /// Determines of attribute has name
 /// </summary>
 public bool HasName()
 {
     return((Name != null && Name.Length > 0) || AttributeToken.HasName());
 }
	protected Expression OnAttribute( Expression exp, Expression[] atoms ) {
		if(document.Name!="xmlns"
		&& document.Prefix!="xmlns") {
			Trace.WriteLine("@"+document.Name);
			
			AttributeToken token = new AttributeToken(
					document.NamespaceURI,
					document.LocalName,
					document.Value,
					this, builder );
			AttFeeder feeder = new AttFeeder(builder,token);

			exp = exp.Visit(feeder);
			if( exp==Expression.NotAllowed ) {
				// error: bad attribute
				ReportError(ERR_BAD_ATTRIBUTE,document.Name);
			}
			
			if(atoms!=null)
				for( int i=0; i<atoms.Length; i++ )
					atoms[i] = atoms[i].Visit(feeder);
			
			Trace.WriteLine("residual: " + ExpPrinter.printContentModel(exp));
		}
		return exp;
	}
Example #33
0
 /// <summary>
 /// Determines if attribute name has namespace prefix
 /// </summary>
 public override bool HasPrefix()
 {
     return((Prefix != null && Prefix.Length > 0) || AttributeToken.HasPrefix());
 }
Example #34
0
 public override void Shift(int offset)
 {
     AttributeToken.Shift(offset);
 }