private IList<HtmlAttribute> ParseAttributes(string tagName, string tagNameInLowercase, HtmlTagFlags tagFlags,
string attributesString, SourceCodeNodeCoordinates attributesCoordinates)
{
var attributes = new List<HtmlAttribute>();
if (string.IsNullOrWhiteSpace(attributesString))
{
return attributes;
}
SourceCodeNodeCoordinates currentAttributesCoordinates = attributesCoordinates;
int currentPosition = 0;
MatchCollection attributeMatches = _attributeRegex.Matches(attributesString);
foreach (Match attributeMatch in attributeMatches)
{
GroupCollection groups = attributeMatch.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 = HtmlAttribute.HtmlAttributeDecode(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(attributesString, currentPosition,
attributeNamePosition - currentPosition, out lineBreakCount, out charRemainderCount);
attributeNameCoordinates = SourceCodeNavigator.CalculateAbsoluteNodeCoordinates(
currentAttributesCoordinates, lineBreakCount, charRemainderCount);
currentAttributesCoordinates = attributeNameCoordinates;
currentPosition = attributeNamePosition;
}
var attributeValueCoordinates = SourceCodeNodeCoordinates.Empty;
int attributeValuePosition = -1;
if (attributeValueGroup.Success)
{
attributeValuePosition = attributeValueGroup.Index;
}
if (attributeValuePosition != -1)
{
int lineBreakCount;
int charRemainderCount;
SourceCodeNavigator.CalculateLineBreakCount(attributesString, currentPosition,
attributeValuePosition - currentPosition, out lineBreakCount, out charRemainderCount);
attributeValueCoordinates = SourceCodeNavigator.CalculateAbsoluteNodeCoordinates(
currentAttributesCoordinates, lineBreakCount, charRemainderCount);
currentAttributesCoordinates = attributeValueCoordinates;
currentPosition = attributeValuePosition;
}
HtmlAttributeType attributeType = GetAttributeType(tagNameInLowercase, tagFlags,
attributeNameInLowercase, attributes);
attributes.Add(new HtmlAttribute(attributeName, attributeNameInLowercase, attributeValue,
attributeType, attributeNameCoordinates, attributeValueCoordinates));
}
return attributes;
}