Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Abrahamsson <erik85>2021-04-22 13:42:23 +0300
committerSergey Sharybin <sergey@blender.org>2021-04-22 13:48:12 +0300
commit4cb833e84acfd2be5fa08ce75118ce9cb60643b8 (patch)
tree4925ee0005b16212b4da23917cd4c4f3b8966a5f
parent30012da8352221aa47a8241cb6d642934ddec3a4 (diff)
Fix for T87654: SVG import parse error
Fix for SVG data when there is no space between some arguments in the arc command. See T87654 for example files. See https://www.w3.org/TR/SVG2/paths.html#TheDProperty for arguments to the elliptical arc curve commands. Maniphest Tasks: T87654 Differential Revision: https://developer.blender.org/D11027
-rw-r--r--io_curve_svg/import_svg.py21
1 files changed, 18 insertions, 3 deletions
diff --git a/io_curve_svg/import_svg.py b/io_curve_svg/import_svg.py
index ceb24420..b2f42b57 100644
--- a/io_curve_svg/import_svg.py
+++ b/io_curve_svg/import_svg.py
@@ -173,7 +173,7 @@ def SVGParseTransform(transform):
"""
m = Matrix()
- r = re.compile('\s*([A-z]+)\s*\((.*?)\)')
+ r = re.compile(r'\s*([A-z]+)\s*\((.*?)\)')
for match in r.finditer(transform):
func = match.group(1)
@@ -195,7 +195,7 @@ def SVGGetMaterial(color, context):
"""
materials = context['materials']
- rgb_re = re.compile('^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,(\d+)\s*\)\s*$')
+ rgb_re = re.compile(r'^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,(\d+)\s*\)\s*$')
if color in materials:
return materials[color]
@@ -405,6 +405,7 @@ class SVGPathData:
spaces = ' ,\t'
commands = {'m', 'l', 'h', 'v', 'c', 's', 'q', '', 't', 'a', 'z'}
+ current_command = ''
tokens = []
i = 0
@@ -416,8 +417,22 @@ class SVGPathData:
pass
elif c.lower() in commands:
tokens.append(c)
+ current_command = c
+ arg_index = 1
elif c in ['-', '.'] or c.isdigit():
- token, last_char = read_float(d, i)
+ # Special case for 'a/A' commands.
+ # Arguments 4 and 5 are either 0 or 1 and might not
+ # be separated from the next argument with space or comma.
+ if current_command.lower() == 'a':
+ if arg_index % 7 in [4,5]:
+ token = d[i]
+ last_char = i + 1
+ else:
+ token, last_char = read_float(d, i)
+ else:
+ token, last_char = read_float(d, i)
+
+ arg_index += 1
tokens.append(token)
# in most cases len(token) and (last_char - i) are the same