private void ParseEndTag(string tagName, string tagNameInLowercase)
{
int endTagIndex = 0;
int lastTagIndex = _tagStack.Count - 1;
bool tagNameNotEmpty = !string.IsNullOrEmpty(tagName);
HtmlParsingHandlers.EndTagDelegate endTagHandler = _handlers.EndTag;
if (tagNameNotEmpty)
{
for (endTagIndex = lastTagIndex; endTagIndex >= 0; endTagIndex--)
{
if (_tagStack[endTagIndex].NameInLowercase == tagNameInLowercase)
{
break;
}
}
}
if (endTagIndex >= 0)
{
// Close all the open elements, up the stack
if (endTagHandler != null)
{
for (int tagIndex = lastTagIndex; tagIndex >= endTagIndex; tagIndex--)
{
HtmlTag startTag = _tagStack[tagIndex];
string startTagNameInLowercase = startTag.NameInLowercase;
HtmlTagFlags startTagFlags = startTag.Flags;
string endTagName;
if (tagNameNotEmpty && tagNameInLowercase == startTagNameInLowercase)
{
endTagName = tagName;
}
else
{
endTagName = startTag.Name;
}
if (_xmlTagStack.Count > 0 && !startTagFlags.HasFlag(HtmlTagFlags.NonIndependent))
{
_xmlTagStack.Pop();
}
var endTag = new HtmlTag(endTagName, startTagNameInLowercase, startTagFlags);
endTagHandler(_context, endTag);
}
}
// Remove the open elements from the stack
if (endTagIndex <= lastTagIndex)
{
int tagToRemoveStartIndex = endTagIndex;
int tagsToRemoveCount = lastTagIndex - endTagIndex + 1;
_tagStack.RemoveRange(tagToRemoveStartIndex, tagsToRemoveCount);
}
}
else if (tagNameNotEmpty && _conditionalCommentOpened)
{
if (_xmlTagStack.Count > 0 && HtmlTagFlagsHelpers.IsXmlBasedTag(tagNameInLowercase))
{
_xmlTagStack.Pop();
}
var endTag = new HtmlTag(tagName, tagNameInLowercase, GetTagFlagsByName(tagNameInLowercase));
if (endTagHandler != null)
{
endTagHandler(_context, endTag);
}
}
}