QString CleanSource::PreprocessSpecialCases(const QString &source) { QString newsource = source; // For content files we want to retain the functionality offered by an // auto-correcting html parser, but this can only handle one namespace // in the <html> tag and simply strips tags with namespace prefixes it // doesn't understand. The solution used here is to embed the namespace // definition in the root tag itself. QRegularExpression root_svg_tag_with_prefix("<\\s*svg\\s*:\\s*svg"); QString root_svg_embeddedNS = "<svg xmlns=\"http://www.w3.org/2000/svg\""; newsource.replace(root_svg_tag_with_prefix, root_svg_embeddedNS); // Once the root tag has an embedded namespace, strip the prefix from all other tags QRegularExpression child_svg_tag_with_prefix("<\\s*svg\\s*:"); QString child_tag_no_prefix = "<"; newsource.replace(child_svg_tag_with_prefix, child_tag_no_prefix); return newsource; }
// neither svg nor math tags need a namespace prefix defined // especially as epub3 now includes them into the html5 spec // So we need to remove the svg prefix from the tags before // processing them with gumbo QString CleanSource::PreprocessSpecialCases(const QString &source) { QString newsource = source; // remove prefix from root tag and add unprefixed svg namespace to it QRegularExpression root_svg_tag_with_prefix("<\\s*svg\\s*:\\s*svg"); QString root_svg_embeddedNS = "<svg xmlns=\"http://www.w3.org/2000/svg\""; newsource.replace(root_svg_tag_with_prefix, root_svg_embeddedNS); // search for any prefixed svg namespace in that root tag and remove it QRegularExpression svg_nsprefix(SVG_NAMESPACE_PREFIX); QRegularExpressionMatch mo = svg_nsprefix.match(newsource); if (mo.hasMatch()) { newsource.replace(mo.capturedStart(1), mo.capturedLength(1), ""); } // now strip the prefix from all child starting tags QRegularExpression starting_child_svg_tag_with_prefix("<\\s*svg\\s*:"); QString starting_child_tag_no_prefix = "<"; newsource.replace(starting_child_svg_tag_with_prefix, starting_child_tag_no_prefix); // do the same for any child ending tags QRegularExpression ending_child_svg_tag_with_prefix("<\\s*/\\s*svg\\s*:"); QString ending_child_tag_no_prefix = "</"; newsource.replace(ending_child_svg_tag_with_prefix, ending_child_tag_no_prefix); return newsource; }