/// <summary> /// Gets a quotation mark for attribute value /// </summary> /// <param name="attributeValue">Attribute value</param> /// <returns>Quotation mark</returns> private static string GetQuoteForAttributeValue(string attributeValue) { if (HtmlAttributeValueHelpers.IsNotRequireQuotesInHtml5(attributeValue)) { return(string.Empty); } return("\""); }
/// <summary> /// Process a attributes /// </summary> /// <returns>List of attributes</returns> private List <HtmlAttribute> ProcessAttributes() { string content = _innerContext.SourceCode; int currentPosition = _innerContext.Position; SourceCodeNodeCoordinates currentCoordinates = _innerContext.NodeCoordinates; Match match = _attributeRegex.Match(content, currentPosition, _innerContext.RemainderLength); while (match.Success) { GroupCollection groups = match.Groups; Group attributeNameGroup = groups["attributeName"]; Group attributeEqualSignGroup = groups["attributeEqualSign"]; Group attributeValueGroup = groups["attributeValue"]; string attributeName = attributeNameGroup.Value; string attributeNameInLowercase = attributeName; if (Utils.ContainsUppercaseCharacters(attributeName)) { attributeNameInLowercase = attributeName.ToLowerInvariant(); } string attributeValue = null; if (attributeEqualSignGroup.Success) { if (attributeValueGroup.Success) { attributeValue = attributeValueGroup.Value; if (!string.IsNullOrWhiteSpace(attributeValue)) { attributeValue = HtmlAttributeValueHelpers.Decode(attributeValue); } } else { attributeValue = string.Empty; } } var attributeNameCoordinates = SourceCodeNodeCoordinates.Empty; int attributeNamePosition = -1; if (attributeNameGroup.Success) { attributeNamePosition = attributeNameGroup.Index; } if (attributeNamePosition != -1) { int lineBreakCount; int charRemainderCount; SourceCodeNavigator.CalculateLineBreakCount(content, currentPosition, attributeNamePosition - currentPosition, out lineBreakCount, out charRemainderCount); attributeNameCoordinates = SourceCodeNavigator.CalculateAbsoluteNodeCoordinates( currentCoordinates, lineBreakCount, charRemainderCount); currentPosition = attributeNamePosition; currentCoordinates = attributeNameCoordinates; } var attributeValueCoordinates = SourceCodeNodeCoordinates.Empty; int attributeValuePosition = -1; if (attributeValueGroup.Success) { attributeValuePosition = attributeValueGroup.Index; } if (attributeValuePosition != -1) { int lineBreakCount; int charRemainderCount; SourceCodeNavigator.CalculateLineBreakCount(content, currentPosition, attributeValuePosition - currentPosition, out lineBreakCount, out charRemainderCount); attributeValueCoordinates = SourceCodeNavigator.CalculateAbsoluteNodeCoordinates( currentCoordinates, lineBreakCount, charRemainderCount); currentPosition = attributeValuePosition; currentCoordinates = attributeValueCoordinates; } var attribute = new HtmlAttribute(attributeName, attributeNameInLowercase, attributeValue, HtmlAttributeType.Unknown, attributeNameCoordinates, attributeValueCoordinates); _tempAttributes.Add(attribute); _innerContext.IncreasePosition(match.Length); match = _attributeRegex.Match(content, _innerContext.Position, _innerContext.RemainderLength); } int attributeCount = _tempAttributes.Count; var attributes = new List <HtmlAttribute>(attributeCount); for (int attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++) { attributes.Add(_tempAttributes[attributeIndex]); } _tempAttributes.Clear(); return(attributes); }