diff --git a/scour/scour.py b/scour/scour.py index 9d19906..22b3958 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -61,7 +61,7 @@ from decimal import Context, Decimal, InvalidOperation, getcontext import six -from six.moves import range, urllib +import urllib from scour.stats import ScourStats from scour.svg_regex import svg_parser @@ -1792,9 +1792,22 @@ def repairStyle(node, options): del styleMap['overflow'] num += 1 - # now if any of the properties match known SVG attributes we prefer attributes - # over style so emit them and remove them from the style map - if options.style_to_xml: + if node.nodeType == Node.ELEMENT_NODE: + if options.style_type == "inline-css": + # Prefer inline style + # Remove known SVG attributes and store their values in style attribute + attributes = [node.attributes.item(i) for i in range(node.attributes.length)] + for attribute in attributes: + attributeName = attribute.nodeName + if attributeName in svgAttributes: + styleMap[attributeName] = attribute.nodeValue + node.removeAttribute(attributeName) + elif options.style_type == "preserve": + # Keep whatever style of attribute versus style the file currently has + pass + elif options.style_type == "attributes": + # now if any of the properties match known SVG attributes we prefer attributes + # over style so emit them and remove them from the style map for propName in list(styleMap): if propName in svgAttributes: node.setAttribute(propName, styleMap[propName]) @@ -3948,6 +3961,10 @@ def format_usage(self, usage): _option_group_optimization.add_option("--disable-style-to-xml", action="store_false", dest="style_to_xml", default=True, help="won't convert styles into XML attributes") +_option_group_optimization.add_option("--style", + action="store", type="string", dest="style_type", default="none", metavar="TYPE", + help="style type (overrides style-to-xml): none, preserve, inline-css, " + "attributes (default: none)") _option_group_optimization.add_option("--disable-group-collapsing", action="store_false", dest="group_collapse", default=True, help="won't collapse elements") @@ -4064,6 +4081,8 @@ def parse_args(args=None, ignore_additional_args=False): _options_parser.error("Value for --nindent should be positive (or zero), see --help") if options.infilename and options.outfilename and options.infilename == options.outfilename: _options_parser.error("Input filename is the same as output filename") + if options.style_type not in ['none', 'preserve', 'attributes', 'inline-css']: + _options_parser.error("Invalid value for --style, see --help") return options @@ -4081,6 +4100,10 @@ def sanitizeOptions(options=None): sanitizedOptions = _options_parser.get_default_values() sanitizedOptions._update_careful(optionsDict) + #For backwards compatibility, we support style_to_xml but style_type can override it. + if sanitizedOptions.style_type == 'none' and sanitizedOptions.style_to_xml: + sanitizedOptions.style_type = 'attributes' + return sanitizedOptions @@ -4185,4 +4208,5 @@ def run(): if __name__ == '__main__': + print('running') run() diff --git a/test_scour.py b/test_scour.py index 549333f..5ca0cc5 100755 --- a/test_scour.py +++ b/test_scour.py @@ -2213,6 +2213,47 @@ def runTest(self): self.assertEqual(line.getAttribute('marker-end'), 'url(#m)') +class AttrToStyle(unittest.TestCase): + + def runTest(self): + doc = scourXmlFile('unittests/attr-to-style.svg', + parse_args(['--style=inline-css'])) + line = doc.getElementsByTagName('line')[0] + self.assertEqual(line.getAttribute('stroke'), '') + self.assertEqual(line.getAttribute('marker-start'), '') + self.assertEqual(line.getAttribute('marker-mid'), '') + self.assertEqual(line.getAttribute('marker-end'), '') + + style_attribute = line.getAttribute('style') + rawStyles = style_attribute.split(';') + self.assertTrue("color:#FF0000" in rawStyles) + self.assertTrue("stroke:#000" in rawStyles) + self.assertTrue("marker-start:url(#m)" in rawStyles) + self.assertTrue("marker-end:url(#m)" in rawStyles) + self.assertTrue("marker-mid:url(#m)" in rawStyles) + + +class StylePreserve(unittest.TestCase): + + def runTest(self): + doc = scourXmlFile('unittests/attr-to-style.svg', + parse_args(['--style=preserve'])) + + # First line uses attributes. + line = doc.getElementsByTagName('line')[0] + self.assertNotEqual(line.getAttribute('stroke'), '') + self.assertNotEqual(line.getAttribute('marker-start'), '') + self.assertNotEqual(line.getAttribute('marker-mid'), '') + self.assertNotEqual(line.getAttribute('marker-end'), '') + + # Second line uses style attribute. + line = doc.getElementsByTagName('line')[1] + self.assertEqual(line.getAttribute('stroke'), '') + self.assertEqual(line.getAttribute('marker-start'), '') + self.assertEqual(line.getAttribute('marker-mid'), '') + self.assertEqual(line.getAttribute('marker-end'), '') + + class PathCommandRewrites(unittest.TestCase): def runTest(self): diff --git a/unittests/attr-to-style.svg b/unittests/attr-to-style.svg new file mode 100644 index 0000000..9173b0b --- /dev/null +++ b/unittests/attr-to-style.svg @@ -0,0 +1,10 @@ + + + + + + + + + +