public AttributeNodeWithPrefix(ElementNode parent, AttributeToken token) : base(parent, token) { var nameToken = token.NameToken as NameToken; Prefix = parent != null?parent.GetText(nameToken.PrefixRange) : string.Empty; }
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(); }
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(); }
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)); }
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); } }
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); }
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); }
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); }
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); } }
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); }
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); }
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); } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
public override void ShiftStartingFrom(int position, int offset) { AttributeToken.ShiftStartingFrom(position, offset); }
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); }
/// <summary> /// Tells if attribute has an equal sign /// </summary> /// <returns>True if attribute has value</returns> public bool HasEqualSign() { return(AttributeToken.HasEqualSign()); }
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; }
/// <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()); }
public override string ToString() { return(AttributeToken.ToString()); }
public HtmlParserAttributeEventArgs(AttributeToken attributeToken) { AttributeToken = attributeToken; }
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) } }); } }
/// <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()); }
/// <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; }
/// <summary> /// Determines if attribute name has namespace prefix /// </summary> public override bool HasPrefix() { return((Prefix != null && Prefix.Length > 0) || AttributeToken.HasPrefix()); }
public override void Shift(int offset) { AttributeToken.Shift(offset); }