SVG CSS - add <style> element handler

This commit is contained in:
Artem Pavlenko 2020-02-04 11:25:35 +00:00
parent 00b888c1ef
commit 8a90551b63

View file

@ -22,6 +22,7 @@
#include <mapnik/debug.hpp> #include <mapnik/debug.hpp>
#include <mapnik/color_factory.hpp> #include <mapnik/color_factory.hpp>
#include <mapnik/css/css_grammar_x3.hpp>
#include <mapnik/svg/svg_parser.hpp> #include <mapnik/svg/svg_parser.hpp>
#include <mapnik/svg/svg_path_parser.hpp> #include <mapnik/svg/svg_path_parser.hpp>
#include <mapnik/config_error.hpp> #include <mapnik/config_error.hpp>
@ -373,12 +374,12 @@ bool parse_id_from_url (char const* str, std::string & id)
void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node) void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node)
{ {
if (parser.ignore_) return; if (parser.ignore_) return;
auto const* name = node->name(); auto name = name_to_int(node->name());
switch (node->type()) switch (node->type())
{ {
case rapidxml::node_element: case rapidxml::node_element:
{ {
switch(name_to_int(name)) switch(name)
{ {
case "defs"_case: case "defs"_case:
{ {
@ -407,7 +408,7 @@ void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node)
if (!parser.is_defs_) // FIXME if (!parser.is_defs_) // FIXME
{ {
switch (name_to_int(name)) switch (name)
{ {
case "g"_case: case "g"_case:
if (node->first_node() != nullptr) if (node->first_node() != nullptr)
@ -430,7 +431,7 @@ void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node)
parse_attr(parser, node); parse_attr(parser, node);
if (parser.path_.display()) if (parser.path_.display())
{ {
parse_element(parser, name, node); parse_element(parser, node->name(), node);
} }
parser.path_.pop_attr(); parser.path_.pop_attr();
} }
@ -441,32 +442,32 @@ void traverse_tree(svg_parser & parser, rapidxml::xml_node<char> const* node)
parse_id(parser, node); parse_id(parser, node);
} }
for (auto const* child = node->first_node(); if ("style"_case == name)
child; child = child->next_sibling())
{ {
traverse_tree(parser, child); // <style> element shouldn't have nested elements
// only CDATA
for (auto const* child = node->first_node();
child; child = child->next_sibling())
{
if (child->type() == rapidxml::node_cdata)
{
std::cerr << "======================== STYLE " << std::endl;
std::cerr << "CDATA:" << child->value() << std::endl;
}
}
}
else
{
for (auto const* child = node->first_node();
child; child = child->next_sibling())
{
traverse_tree(parser, child);
}
} }
end_element(parser, node); end_element(parser, node);
} }
break; break;
#if 0 //
// Data nodes
case rapidxml::node_data:
case rapidxml::node_cdata:
{
if (node->value_size() > 0) // Don't add empty text nodes
{
// parsed text values should have leading and trailing
// whitespace trimmed.
//std::string trimmed = node->value();
//mapnik::util::trim(trimmed);
//std::cerr << "CDATA:" << node->value() << std::endl;
}
}
break;
#endif
default: default:
break; break;
} }