This commit is contained in:
doom-goober 2021-12-26 00:06:20 +00:00 committed by GitHub
commit 2720c83c8a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 79 additions and 4 deletions

View file

@ -61,7 +61,7 @@ from collections import namedtuple, defaultdict
from decimal import Context, Decimal, InvalidOperation, getcontext from decimal import Context, Decimal, InvalidOperation, getcontext
import six import six
from six.moves import range, urllib import urllib
from scour.stats import ScourStats from scour.stats import ScourStats
from scour.svg_regex import svg_parser from scour.svg_regex import svg_parser
@ -1792,9 +1792,22 @@ def repairStyle(node, options):
del styleMap['overflow'] del styleMap['overflow']
num += 1 num += 1
# now if any of the properties match known SVG attributes we prefer attributes if node.nodeType == Node.ELEMENT_NODE:
# over style so emit them and remove them from the style map if options.style_type == "inline-css":
if options.style_to_xml: # 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): for propName in list(styleMap):
if propName in svgAttributes: if propName in svgAttributes:
node.setAttribute(propName, styleMap[propName]) node.setAttribute(propName, styleMap[propName])
@ -3948,6 +3961,10 @@ _option_group_optimization.add_option("--disable-simplify-colors",
_option_group_optimization.add_option("--disable-style-to-xml", _option_group_optimization.add_option("--disable-style-to-xml",
action="store_false", dest="style_to_xml", default=True, action="store_false", dest="style_to_xml", default=True,
help="won't convert styles into XML attributes") 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", _option_group_optimization.add_option("--disable-group-collapsing",
action="store_false", dest="group_collapse", default=True, action="store_false", dest="group_collapse", default=True,
help="won't collapse <g> elements") help="won't collapse <g> 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") _options_parser.error("Value for --nindent should be positive (or zero), see --help")
if options.infilename and options.outfilename and options.infilename == options.outfilename: if options.infilename and options.outfilename and options.infilename == options.outfilename:
_options_parser.error("Input filename is the same as output filename") _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 return options
@ -4081,6 +4100,10 @@ def sanitizeOptions(options=None):
sanitizedOptions = _options_parser.get_default_values() sanitizedOptions = _options_parser.get_default_values()
sanitizedOptions._update_careful(optionsDict) 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 return sanitizedOptions
@ -4185,4 +4208,5 @@ def run():
if __name__ == '__main__': if __name__ == '__main__':
print('running')
run() run()

View file

@ -2213,6 +2213,47 @@ class StyleToAttr(unittest.TestCase):
self.assertEqual(line.getAttribute('marker-end'), 'url(#m)') 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): class PathCommandRewrites(unittest.TestCase):
def runTest(self): def runTest(self):

View file

@ -0,0 +1,10 @@
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="m">
<rect width="200" height="100"/>
</marker>
</defs>
<line x2="100" stroke="#000" marker-start="url(#m)" marker-end="url(#m)" marker-mid="url(#m)" style="color:#FF0000" />
<line x2="100" style="stroke:#000; marker-start:url(#m); marker-end:url(#m); marker-mid: url(#m)" />
</svg>

After

Width:  |  Height:  |  Size: 372 B