WebMarkupMin.Core.Parsers.HtmlParser.ParseAttributes C# (CSharp) Method

ParseAttributes() private method

Parses a attributes
private ParseAttributes ( string tagName, string tagNameInLowercase, WebMarkupMin.Core.Parsers.HtmlTagFlags tagFlags, string attributesString, SourceCodeNodeCoordinates attributesCoordinates ) : IList
tagName string Tag name
tagNameInLowercase string Tag name in lowercase
tagFlags WebMarkupMin.Core.Parsers.HtmlTagFlags Tag flags
attributesString string String representation of the attribute list
attributesCoordinates WebMarkupMin.Core.Utilities.SourceCodeNodeCoordinates Attributes coordinates
return IList
        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;
        }