Merge 56c36e3592 into 0609c59676
This commit is contained in:
commit
2720c83c8a
3 changed files with 79 additions and 4 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
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
|
# 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
|
# over style so emit them and remove them from the style map
|
||||||
if options.style_to_xml:
|
|
||||||
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()
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
10
unittests/attr-to-style.svg
Normal file
10
unittests/attr-to-style.svg
Normal 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 |
Loading…
Add table
Add a link
Reference in a new issue