fix(HtmlParser): correctly remove an item from the space struct when requested from a callback

while here:
- implement the removing algorithm for the compact_mode
This commit is contained in:
Tomasz Sowa 2024-04-16 09:35:47 +02:00
parent 90915a7209
commit f02dd1093a
Signed by: tomasz.sowa
GPG Key ID: 662CC1438638588B
4 changed files with 60 additions and 16 deletions

View File

@ -5,7 +5,7 @@
*/ */
/* /*
* Copyright (c) 2008-2023, Tomasz Sowa * Copyright (c) 2008-2024, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -2119,14 +2119,13 @@ void HTMLParser::CheckClosingTags()
return; return;
} }
// CHECK ME
if( RemoveIfNeeded(stack_len - 2) )
{
RemoveLastSpace(i);
}
for(int z=(int)stack_len-2 ; z >= i ; --z) for(int z=(int)stack_len-2 ; z >= i ; --z)
{ {
if( RemoveIfNeeded(z) )
{
RemoveLastSpace(z);
}
CheckWhiteCharsExceptions(pstack[z]); CheckWhiteCharsExceptions(pstack[z]);
if( !skip_tags && IsTagSafe(LastItem().name) && !IsNameEqual(no_filter_tag, LastItem().name) ) if( !skip_tags && IsTagSafe(LastItem().name) && !IsNameEqual(no_filter_tag, LastItem().name) )
@ -2238,7 +2237,6 @@ void HTMLParser::AddItemToSpace()
} }
void HTMLParser::RemoveLastSpace(size_t index) void HTMLParser::RemoveLastSpace(size_t index)
{ {
if( out_space ) if( out_space )
@ -2252,22 +2250,52 @@ void HTMLParser::RemoveLastSpace(size_t index)
if( xml_compact_mode ) if( xml_compact_mode )
{ {
// IMPLEMENT ME if( parent->is_object() )
{
Space::ObjectType::iterator i = parent->value.value_object.find(pstack[index].name);
if( i != parent->value.value_object.end() )
{
if( i->second->is_table() )
{
size_t len = i->second->table_size();
if( len > 0 && i->second->value.value_table[len-1] == pstack[index].space )
{
i->second->remove(len - 1);
pstack[index].space = nullptr;
}
}
else
{
if( i->second == pstack[index].space )
{
parent->remove(i);
pstack[index].space = nullptr;
}
}
}
}
} }
else else
{ {
Space * childs_tab = parent->get_space(L"childs"); Space * childs_tab = parent->get_space(L"childs");
size_t len = childs_tab->table_size();
if( childs_tab && childs_tab->is_table() && len > 0 && childs_tab->value.value_table[len-1] == pstack[stack_len-2].space ) if( childs_tab && childs_tab->is_table() )
{ {
childs_tab->remove(len - 1); size_t len = childs_tab->table_size();
pstack[stack_len-2].space = nullptr;
if( len > 0 && childs_tab->value.value_table[len-1] == pstack[index].space )
{
childs_tab->remove(len - 1);
pstack[index].space = nullptr;
}
} }
} }
} }
} }
void HTMLParser::AddTextSpaceToSpaceTree(const Space & space) void HTMLParser::AddTextSpaceToSpaceTree(const Space & space)
{ {
const std::wstring * text = space.get_wstr(L"text"); const std::wstring * text = space.get_wstr(L"text");

View File

@ -5,7 +5,7 @@
*/ */
/* /*
* Copyright (c) 2008-2023, Tomasz Sowa * Copyright (c) 2008-2024, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without

View File

@ -5,7 +5,7 @@
*/ */
/* /*
* Copyright (c) 2008-2023, Tomasz Sowa * Copyright (c) 2008-2024, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -2223,6 +2223,21 @@ void Space::remove(const std::wstring & field)
} }
void Space::remove(ObjectType::iterator & iterator)
{
if( type == type_object )
{
if( iterator != value.value_object.end() )
{
delete iterator->second;
iterator->second = nullptr;
value.value_object.erase(iterator);
}
}
}
void Space::remove(size_t table_index) void Space::remove(size_t table_index)
{ {
if( type == type_table && table_index < value.value_table.size() ) if( type == type_table && table_index < value.value_table.size() )

View File

@ -5,7 +5,7 @@
*/ */
/* /*
* Copyright (c) 2010-2023, Tomasz Sowa * Copyright (c) 2010-2024, Tomasz Sowa
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -538,6 +538,7 @@ public:
// remove a field from an object // remove a field from an object
void remove(const wchar_t * field); void remove(const wchar_t * field);
void remove(const std::wstring & field); void remove(const std::wstring & field);
void remove(ObjectType::iterator & iterator);
// remove a table item // remove a table item
void remove(size_t table_index); void remove(size_t table_index);