small refactoring in HTMLParser

This commit is contained in:
Tomasz Sowa 2021-10-02 21:01:09 +02:00
parent f23cabfb2f
commit abe349be34
1 changed files with 26 additions and 67 deletions

View File

@ -1862,55 +1862,6 @@ void HTMLParser::CheckDifferentContentExceptions(Item & item)
void HTMLParser::AddForgottenTags()
{
int i;
if( stack_len < 3 )
{
PopStack();
return;
}
// we have forgotten to close some tags
// looking whether there is a matching opening tag
for(i=int(stack_len)-3 ; i>=0 ; --i)
if( IsNameEqual(pstack[i].name, pstack[stack_len-1].name) )
break;
if( i < 0 )
{
// oops, there is no such a tag
// we don't print the closing and the missing opening tag
PopStack();
return;
}
for(int z=(int)stack_len-2 ; z>=i ; --z)
{
CheckWhiteCharsExceptions(pstack[z]);
if( !skip_tags && pstack[z].new_line )
{
if( current_white_char_mode() == WHITE_MODE_TREE )
{
Put(10);
PutTabs(pstack[z].tree_index);
}
}
PutClosingTag(pstack[z]);
pstack[z].Clear();
}
//last_new_line = pstack[stack_len-1].new_line;
// invalidate tags
stack_len = i;
}
void HTMLParser::CheckStackPrintRest()
{
while( stack_len-- > 0 )
@ -1935,44 +1886,52 @@ void HTMLParser::CheckStackPrintRest()
void HTMLParser::CheckClosingTags()
{
int i;
if( stack_len == 0 )
return;
// on the stack we have only opening tags
// but only the last tag is a closing tag
if( stack_len == 1 )
if( stack_len < 3 )
{
// there is only last closing tag
// we dont print it
PopStack();
return;
}
// there are more than one tag
if( (pstack[stack_len-1].is_commentary && pstack[stack_len-2].is_commentary) || IsNameEqual(pstack[stack_len-1].name, pstack[stack_len-2].name) )
{
CheckWhiteCharsExceptions(pstack[stack_len-1]);
// looking whether there is a matching opening tag
for(i=int(stack_len)-2 ; i >= 0 ; --i)
if( (pstack[i].is_commentary && pstack[stack_len-1].is_commentary) || IsNameEqual(pstack[i].name, pstack[stack_len-1].name) )
break;
// last closing tag is from the previous one
if( !skip_tags && pstack[stack_len-2].new_line )
if( i < 0 )
{
// oops, there is no such an opening tag on the stack
// we don't print the closing and the missing opening tag
PopStack();
return;
}
for(int z=(int)stack_len-2 ; z >= i ; --z)
{
CheckWhiteCharsExceptions(pstack[z]);
if( !skip_tags && pstack[z].new_line )
{
if( current_white_char_mode() == WHITE_MODE_TREE )
{
Put(10);
PutTabs(pstack[stack_len-2].tree_index);
PutTabs(pstack[z].tree_index);
}
}
PutClosingTag(pstack[stack_len-1]);
//last_new_line = pstack[stack_len-1].new_line;
PopStack();
PopStack();
}
else
{
AddForgottenTags();
PutClosingTag(pstack[z]);
pstack[z].Clear();
}
// invalidate items on the stack
stack_len = i;
}