diff --git a/include/mapnik/svg/svg_parser.hpp b/include/mapnik/svg/svg_parser.hpp index a3da60fe0..96559b6dc 100644 --- a/include/mapnik/svg/svg_parser.hpp +++ b/include/mapnik/svg/svg_parser.hpp @@ -44,7 +44,9 @@ namespace mapnik { namespace svg { explicit svg_parser(svg_converter_type & path); ~svg_parser(); void parse(std::string const& filename); + void parse_from_string(std::string const& svg); private: + bool parse_reader(xmlTextReaderPtr reader); void process_node(xmlTextReaderPtr reader); void start_element(xmlTextReaderPtr reader); void end_element(xmlTextReaderPtr reader); diff --git a/src/svg_parser.cpp b/src/svg_parser.cpp index eb8dcb5dc..8eda9cf24 100644 --- a/src/svg_parser.cpp +++ b/src/svg_parser.cpp @@ -135,29 +135,52 @@ svg_parser::~svg_parser() {} void svg_parser::parse(std::string const& filename) { xmlTextReaderPtr reader = xmlNewTextReaderFilename(filename.c_str()); - if (reader != 0) + if (reader == NULL) { - int ret = xmlTextReaderRead(reader); - try { - while (ret == 1) - { - process_node(reader); - ret = xmlTextReaderRead(reader); - } - } - catch (std::exception const& ex) - { - xmlFreeTextReader(reader); - throw; - } - xmlFreeTextReader(reader); - if (ret != 0) - { - MAPNIK_LOG_ERROR(svg_parser) << "Failed to parse " << filename; - } - } else { - MAPNIK_LOG_ERROR(svg_parser) << "Unable to open " << filename; + MAPNIK_LOG_ERROR(svg_parser) << "Unable to open '" << filename << "'"; } + else if (!parse_reader(reader)) + { + MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << filename << "'"; + } +} + +void svg_parser::parse_from_string(std::string const& svg) +{ + xmlTextReaderPtr reader = xmlReaderForMemory(svg.c_str(),svg.size(),NULL,NULL, + (XML_PARSE_NOBLANKS | XML_PARSE_NOCDATA | XML_PARSE_NOERROR | XML_PARSE_NOWARNING)); + if (reader == NULL) + { + MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << svg << "'"; + } + else if (!parse_reader(reader)) + { + MAPNIK_LOG_ERROR(svg_parser) << "Unable to parse '" << svg << "'"; + } +} + +bool svg_parser::parse_reader(xmlTextReaderPtr reader) +{ + int ret = xmlTextReaderRead(reader); + try { + while (ret == 1) + { + process_node(reader); + ret = xmlTextReaderRead(reader); + } + } + catch (std::exception const& ex) + { + xmlFreeTextReader(reader); + throw; + } + xmlFreeTextReader(reader); + if (ret != 0) + { + // parsing failure + return false; + } + return true; } void svg_parser::process_node(xmlTextReaderPtr reader)