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

ParseStartTag() private method

Parses a start tag
private ParseStartTag ( string tagName, string tagNameInLowercase, string attributesString, SourceCodeNodeCoordinates attributesCoordinates, bool isEmptyTag ) : void
tagName string Tag name
tagNameInLowercase string Tag name in lowercase
attributesString string String representation of the attribute list
attributesCoordinates WebMarkupMin.Core.Utilities.SourceCodeNodeCoordinates Attributes coordinates
isEmptyTag bool Flag that tag is empty
return void
        private void ParseStartTag(string tagName, string tagNameInLowercase, string attributesString,
			SourceCodeNodeCoordinates attributesCoordinates, bool isEmptyTag)
        {
            HtmlTagFlags tagFlags = GetTagFlagsByName(tagNameInLowercase);

            if (tagFlags.HasFlag(HtmlTagFlags.Optional))
            {
                HtmlTag lastStackedTag = _tagStack.LastOrDefault();
                if (lastStackedTag != null && lastStackedTag.NameInLowercase == tagNameInLowercase)
                {
                    ParseEndTag(lastStackedTag.Name, lastStackedTag.NameInLowercase);
                }
                else
                {
                    if (tagNameInLowercase == "body" && _tagStack.Any(t => t.NameInLowercase == "head"))
                    {
                        HtmlTag headTag = _tagStack.Single(t => t.NameInLowercase == "head");
                        ParseEndTag(headTag.Name, headTag.NameInLowercase);
                    }
                }
            }

            if (tagFlags.HasFlag(HtmlTagFlags.Empty))
            {
                isEmptyTag = true;
            }
            else if (isEmptyTag)
            {
                tagFlags |= HtmlTagFlags.Empty;
            }

            var attributes = ParseAttributes(tagName, tagNameInLowercase, tagFlags,
                attributesString, attributesCoordinates);
            var tag = new HtmlTag(tagName, tagNameInLowercase, attributes, tagFlags);

            if (!isEmptyTag)
            {
                if (_conditionalCommentOpened)
                {
                    HtmlConditionalComment lastConditionalComment = _conditionalCommentStack.Peek();
                    HtmlConditionalCommentType lastConditionalCommentType = lastConditionalComment.Type;

                    if (tagFlags.HasFlag(HtmlTagFlags.EmbeddedCode)
                        || lastConditionalCommentType == HtmlConditionalCommentType.RevealedValidating
                        || lastConditionalCommentType == HtmlConditionalCommentType.RevealedValidatingSimplified)
                    {
                        _tagStack.Add(tag);
                    }
                }
                else
                {
                    _tagStack.Add(tag);
                }
            }

            if (_handlers.StartTag != null)
            {
                _handlers.StartTag(_context, tag);
            }

            if (tagFlags.HasFlag(HtmlTagFlags.Xml) && !tagFlags.HasFlag(HtmlTagFlags.NonIndependent))
            {
                _xmlTagStack.Push(tagNameInLowercase);
            }
        }