File mr_568_extensions_python3_compatibility.patch of Package inkscape

From 006353b6342416ef7518c70e21081496708b8ad0 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 09:24:55 +0100
Subject: [PATCH 01/17] extensions 2to3: ne raise except has_key

---
 share/extensions/coloreffect.py              |  4 ++--
 share/extensions/convert2dashes.py           |  4 ++--
 share/extensions/dpiswitcher.py              |  2 +-
 share/extensions/dxf_input.py                | 20 ++++++++--------
 share/extensions/dxf_outlines.py             |  4 ++--
 share/extensions/gcodetools.py               | 18 +++++++--------
 share/extensions/generate_voronoi.py         |  4 ++--
 share/extensions/grid_polar.py               |  2 +-
 share/extensions/hpgl_input.py               |  2 +-
 share/extensions/hpgl_output.py              |  2 +-
 share/extensions/interp.py                   |  2 +-
 share/extensions/jessyInk_autoTexts.py       |  2 +-
 share/extensions/jessyInk_effects.py         |  8 +++----
 share/extensions/jessyInk_export.py          |  2 +-
 share/extensions/jessyInk_summary.py         | 12 +++++-----
 share/extensions/jessyInk_video.py           |  8 +++----
 share/extensions/jessyInk_view.py            |  6 ++---
 share/extensions/markers_strokepaint.py      |  2 +-
 share/extensions/merge_styles.py             |  6 ++---
 share/extensions/pathmodifier.py             |  4 ++--
 share/extensions/pixelsnap.py                |  6 ++---
 share/extensions/plotter.py                  |  6 ++---
 share/extensions/print_win32_vector.py       |  8 +++----
 share/extensions/render_alphabetsoup.py      |  2 +-
 share/extensions/run_command.py              |  4 ++--
 share/extensions/simplepath.py               | 10 ++++----
 share/extensions/simpletransform.py          |  2 +-
 share/extensions/svg_and_media_zip_output.py |  6 ++---
 share/extensions/synfig_fileformat.py        |  6 ++---
 share/extensions/synfig_output.py            | 24 ++++++++++----------
 share/extensions/synfig_prepare.py           |  6 ++---
 share/extensions/text_braille.py             |  2 +-
 share/extensions/uniconv_output.py           |  4 ++--
 share/extensions/voronoi2svg.py              |  2 +-
 share/extensions/webslicer_export.py         |  2 +-
 35 files changed, 102 insertions(+), 102 deletions(-)

diff --git a/share/extensions/coloreffect.py b/share/extensions/coloreffect.py
index d33ac41fe3..94e909a728 100755
--- a/share/extensions/coloreffect.py
+++ b/share/extensions/coloreffect.py
@@ -52,7 +52,7 @@ class ColorEffect(inkex.Effect):
             if new_val != val:
                 node.set(attr, new_val)
 
-    if node.attrib.has_key('style'):
+    if 'style' in node.attrib:
         # References for style attribute:
         # http://www.w3.org/TR/SVG11/styling.html#StyleAttribute,
         # http://www.w3.org/TR/CSS21/syndata.html
@@ -131,7 +131,7 @@ class ColorEffect(inkex.Effect):
     for child in newnode:
       self.changeStyle(child)
     xlink = inkex.addNS('href','xlink')
-    if newnode.attrib.has_key(xlink):
+    if xlink in newnode.attrib:
       href=newnode.get(xlink)
       if href.startswith('#'):
         id = href[len('#'):len(href)]
diff --git a/share/extensions/convert2dashes.py b/share/extensions/convert2dashes.py
index 1d1ba97360..44241c2548 100755
--- a/share/extensions/convert2dashes.py
+++ b/share/extensions/convert2dashes.py
@@ -66,10 +66,10 @@ class SplitIt(inkex.Effect):
                 dashes = []
                 offset = 0
                 style = simplestyle.parseStyle(node.get('style'))
-                if style.has_key('stroke-dasharray'):
+                if 'stroke-dasharray' in style:
                     if style['stroke-dasharray'].find(',') > 0:
                         dashes = [float (dash) for dash in style['stroke-dasharray'].split(',')]
-                if style.has_key('stroke-dashoffset'):
+                if 'stroke-dashoffset' in style:
                     offset = style['stroke-dashoffset']
                 if dashes:
                     p = cubicsuperpath.parsePath(node.get('d'))
diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py
index 317616db51..dcffa202db 100644
--- a/share/extensions/dpiswitcher.py
+++ b/share/extensions/dpiswitcher.py
@@ -409,7 +409,7 @@ class DPISwitcher(inkex.Effect):
             namedview = svg.find(inkex.addNS('namedview', 'sodipodi'))
             namedview.set(inkex.addNS('document-units', 'inkscape'), "px")
             self.units = self.parse_length(svg.get('width'))[1]
-            if self.units and self.units <> "px" and self.units <> "" and self.units <> "%":
+            if self.units and self.units != "px" and self.units != "" and self.units != "%":
                 if self.options.switcher == "0":
                     self.unitExponent = 1.0/(self.factor_a/self.__uuconv[self.units])
                 else:
diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py
index 1dcbac7b8d..cd0e508b59 100755
--- a/share/extensions/dxf_input.py
+++ b/share/extensions/dxf_input.py
@@ -262,7 +262,7 @@ def export_DIMENSION():
         y = height - scale*(vals[groups['21']][0] - ymin)
         size = 12                   # default fontsize in px
         if vals[groups['3']]:
-            if DIMTXT.has_key(vals[groups['3']][0]):
+            if vals[groups['3']][0] in DIMTXT:
                 size = scale*DIMTXT[vals[groups['3']][0]]
                 if size < 2:
                     size = 2
@@ -428,7 +428,7 @@ else:
 desc.text = '%s - scale = %f, origin = (%f, %f), method = %s' % (unicode(args[0], options.input_encode), scale, xmin, ymin, options.scalemethod)
 scale *= 96.0/25.4                                  # convert from mm to pixels
 
-if not layer_nodes.has_key('0'):
+if '0' not in layer_nodes:
     attribs = {inkex.addNS('groupmode','inkscape'): 'layer', inkex.addNS('label','inkscape'): '0'}
     layer_nodes['0'] = inkex.etree.SubElement(doc.getroot(), 'g', attribs)
     layer_colors['0'] = 7
@@ -454,7 +454,7 @@ while line[0] and (line[1] != 'ENDSEC' or not inENTITIES):
         inENTITIES = True
     elif line[1] == 'POLYLINE':
         polylines += 1
-    if entity and groups.has_key(line[0]):
+    if entity and line[0] in groups:
         seqs.append(line[0])                        # list of group codes
         if line[0] == '1' or line[0] == '2' or line[0] == '3' or line[0] == '6' or line[0] == '8':  # text value
             val = line[1].replace('\~', ' ')
@@ -474,24 +474,24 @@ while line[0] and (line[1] != 'ENDSEC' or not inENTITIES):
         else:                                       # unscaled float value
             val = float(line[1])
         vals[groups[line[0]]].append(val)
-    elif entities.has_key(line[1]):
-        if entities.has_key(entity):
+    elif line[1] in entities:
+        if entity in entities:
             if block != defs:                       # in a BLOCK
                 layer = block
             elif vals[groups['8']]:                 # use Common Layer Name
                 if not vals[groups['8']][0]:
                     vals[groups['8']][0] = '0'      # use default name
-                if not layer_nodes.has_key(vals[groups['8']][0]):
+                if vals[groups['8']][0] not in layer_nodes:
                     attribs = {inkex.addNS('groupmode','inkscape'): 'layer', inkex.addNS('label','inkscape'): '%s' % vals[groups['8']][0]}
                     layer_nodes[vals[groups['8']][0]] = inkex.etree.SubElement(doc.getroot(), 'g', attribs)
                 layer = layer_nodes[vals[groups['8']][0]]
             color = '#000000'                       # default color
             if vals[groups['8']]:
-                if layer_colors.has_key(vals[groups['8']][0]):
-                    if colors.has_key(layer_colors[vals[groups['8']][0]]):
+                if vals[groups['8']][0] in layer_colors:
+                    if layer_colors[vals[groups['8']][0]] in colors:
                         color = colors[layer_colors[vals[groups['8']][0]]]
             if vals[groups['62']]:                  # Common Color Number
-                if colors.has_key(vals[groups['62']][0]):
+                if vals[groups['62']][0] in colors:
                     color = colors[vals[groups['62']][0]]
             style = simplestyle.formatStyle({'stroke': '%s' % color, 'fill': 'none'})
             w = 0.5                                 # default lineweight for POINT
@@ -502,7 +502,7 @@ while line[0] and (line[1] != 'ENDSEC' or not inENTITIES):
                         w = 0.5
                     style = simplestyle.formatStyle({'stroke': '%s' % color, 'fill': 'none', 'stroke-width': '%.1f' % w})
             if vals[groups['6']]:                   # Common Linetype
-                if linetypes.has_key(vals[groups['6']][0]):
+                if vals[groups['6']][0] in linetypes:
                     style += ';' + linetypes[vals[groups['6']][0]]
             extrude = 1.0
             if vals[groups['230']]:
diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py
index 53de1066d5..876f41f5f9 100755
--- a/share/extensions/dxf_outlines.py
+++ b/share/extensions/dxf_outlines.py
@@ -194,7 +194,7 @@ class MyEffect(inkex.Effect):
         style = node.get('style')
         if style:
             style = simplestyle.parseStyle(style)
-            if style.has_key('stroke'):
+            if 'stroke' in style:
                 if style['stroke'] and style['stroke'] != 'none' and style['stroke'][0:3] != 'url':
                     rgb = simplestyle.parseColor(style['stroke'])
         hsl = coloreffect.ColorEffect.rgb_to_hsl(coloreffect.ColorEffect(),rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0)
@@ -286,7 +286,7 @@ class MyEffect(inkex.Effect):
             style = group.get('style')
             if style:
                 style = simplestyle.parseStyle(style)
-                if style.has_key('display'):
+                if 'display' in style:
                     if style['display'] == 'none' and self.options.layer_option and self.options.layer_option=='visible':
                         return
             layer = group.get(inkex.addNS('label', 'inkscape'))
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index be471136ed..27fedd9a5f 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -1325,7 +1325,7 @@ def csp_segment_convex_hull(sp1,sp2):
 	if not (m1 and m2) and m3 : return [c,a,d]
 	if not (m1 and m3) and m2 : return [b,c,d]
 	
-	raise ValueError, "csp_segment_convex_hull happened which is something that shouldn't happen!"	
+	raise ValueError("csp_segment_convex_hull happened which is something that shouldn't happen!")	
 
 	
 ################################################################################
@@ -1474,7 +1474,7 @@ def atan2(*arg):
 		
 		return (math.pi/2 - math.atan2(arg[0],arg[1]) ) % math.pi2
 	else :
-		raise ValueError, "Bad argumets for atan! (%s)" % arg  
+		raise ValueError("Bad argumets for atan! (%s)" % arg)  
 
 def get_text(node) :
 	value = None
@@ -2331,11 +2331,11 @@ def biarc(sp1, sp2, z1, z2, depth=0):
 	elif 	csmall and a!=0:	beta = -b/a 
 	elif not asmall:	 
 		discr = b*b-4*a*c
-		if discr < 0:	raise ValueError, (a,b,c,discr)
+		if discr < 0:	raise ValueError(a,b,c,discr)
 		disq = discr**.5
 		beta1 = (-b - disq) / 2 / a
 		beta2 = (-b + disq) / 2 / a
-		if beta1*beta2 > 0 :	raise ValueError, (a,b,c,disq,beta1,beta2)
+		if beta1*beta2 > 0 :	raise ValueError(a,b,c,disq,beta1,beta2)
 		beta = max(beta1, beta2)
 	elif	asmall and bsmall:	
 		return biarc_split(sp1, sp2, z1, z2, depth)
@@ -2984,7 +2984,7 @@ class Polygon:
 		
 		while len(edges)>0 :
 			poly = []
-			if loops > len_edges  : raise ValueError, "Hull error"
+			if loops > len_edges  : raise ValueError("Hull error")
 			loops+=1
 			# Find left most vertex.
 			start = (1e100,1)
@@ -2995,7 +2995,7 @@ class Polygon:
 			loops1 = 0
 			while (last[1]!=start[0] or first_run) : 	
 				first_run = False
-				if loops1 > len_edges  : raise ValueError, "Hull error"
+				if loops1 > len_edges  : raise ValueError("Hull error")
 				loops1 += 1
 				next = get_closes_edge_by_angle(edges[last[1]],last)
 				#draw_pointer(next[0]+next[1],"Green","line", comment=i, width= 1)
@@ -4894,11 +4894,11 @@ class Gcodetools(inkex.Effect):
 			elif 	csmall and a!=0:	beta = -b/a 
 			elif not asmall:	 
 				discr = b*b-4*a*c
-				if discr < 0:	raise ValueError, (a,b,c,discr)
+				if discr < 0:	raise ValueError(a,b,c,discr)
 				disq = discr**.5
 				beta1 = (-b - disq) / 2 / a
 				beta2 = (-b + disq) / 2 / a
-				if beta1*beta2 > 0 :	raise ValueError, (a,b,c,disq,beta1,beta2)
+				if beta1*beta2 > 0 :	raise ValueError(a,b,c,disq,beta1,beta2)
 				beta = max(beta1, beta2)
 			elif	asmall and bsmall:	
 				return biarc_split(sp1, sp2, z1, z2, depth)
@@ -6359,7 +6359,7 @@ G01 Z1 (going to cutting z)\n""",
 			time_ = l/feed
 			c1,c2 = self.graffiti_reference_points[layer][0][0],self.graffiti_reference_points[layer][1][0]
 			d = math.sqrt( (c1[0]-c2[0])**2 + (c1[1]-c2[1])**2 )
-			if d == 0 : raise ValueError, "Error! Reference points should not be the same!"
+			if d == 0 : raise ValueError("Error! Reference points should not be the same!")
 			for i in range(int(time_*emmit+1)) :
 				t = i/(time_*emmit)
 				r1,r2 = start[0]*(1-t) + end[0]*t, start[1]*(1-t) + end[1]*t
diff --git a/share/extensions/generate_voronoi.py b/share/extensions/generate_voronoi.py
index 4cf541aa20..5184dcbbc6 100755
--- a/share/extensions/generate_voronoi.py
+++ b/share/extensions/generate_voronoi.py
@@ -183,14 +183,14 @@ class Pattern(inkex.Effect):
         # link selected object to pattern
         obj = self.selected[self.options.ids[0]]
         style = {}
-        if obj.attrib.has_key('style'):
+        if 'style' in obj.attrib:
             style = simplestyle.parseStyle(obj.attrib['style'])
         style['fill'] = 'url(#%s)' % pattern.get('id')
         obj.attrib['style'] = simplestyle.formatStyle(style)
         if obj.tag == inkex.addNS('g', 'svg'):
             for node in obj:
                 style = {}
-                if node.attrib.has_key('style'):
+                if 'style' in node.attrib:
                     style = simplestyle.parseStyle(node.attrib['style'])
                 style['fill'] = 'url(#%s)' % pattern.get('id')
                 node.attrib['style'] = simplestyle.formatStyle(style)
diff --git a/share/extensions/grid_polar.py b/share/extensions/grid_polar.py
index c5a7e7062c..41d099b24f 100755
--- a/share/extensions/grid_polar.py
+++ b/share/extensions/grid_polar.py
@@ -189,7 +189,7 @@ class Grid_Polar(inkex.Effect):
                                   rmax*sin(angle), rmax*cos(angle), 
                                   self.options.a_subdivs_th, 'RadialMinorGridline'+str(i), grid)
         
-        if self.options.c_dot_dia <> 0: #if a non-zero diameter, draw the centre dot
+        if self.options.c_dot_dia != 0: #if a non-zero diameter, draw the centre dot
             draw_SVG_circle(self.options.c_dot_dia /2.0,
                             0, 0, 0, '#000000', 'CentreDot', grid)
         
diff --git a/share/extensions/hpgl_input.py b/share/extensions/hpgl_input.py
index 13d6d00ecc..37607358bc 100755
--- a/share/extensions/hpgl_input.py
+++ b/share/extensions/hpgl_input.py
@@ -59,7 +59,7 @@ except Exception as inst:
         exit(1)
     else:
         type, value, traceback = sys.exc_info()
-        raise ValueError, ("", type, value), traceback
+        raise ValueError("", type, value).with_traceback(traceback)
 
 # issue warning if unknown commands where found
 if 'UNKNOWN_COMMANDS' in warnings:
diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py
index f593e9cf50..20ec363fde 100755
--- a/share/extensions/hpgl_output.py
+++ b/share/extensions/hpgl_output.py
@@ -58,7 +58,7 @@ class HpglOutput(inkex.Effect):
                 return
             else:
                 type, value, traceback = sys.exc_info()
-                raise ValueError, ("", type, value), traceback
+                raise ValueError("", type, value).with_traceback(traceback)
         # convert raw HPGL to HPGL
         hpglInit = 'IN'
         if self.options.force > 0:
diff --git a/share/extensions/interp.py b/share/extensions/interp.py
index fd80ab4128..1754e82c55 100755
--- a/share/extensions/interp.py
+++ b/share/extensions/interp.py
@@ -152,7 +152,7 @@ class Interp(inkex.Effect):
             sst = copy.deepcopy(styles[sorted_ids[i-1]])
             est = copy.deepcopy(styles[sorted_ids[i]])
             basestyle = copy.deepcopy(sst)
-            if basestyle.has_key('stroke-width'):
+            if 'stroke-width' in basestyle:
                 basestyle['stroke-width'] = self.tweenstyleunit('stroke-width',sst,est,0)
 
             #prepare for experimental style tweening
diff --git a/share/extensions/jessyInk_autoTexts.py b/share/extensions/jessyInk_autoTexts.py
index 2c52964da9..a865a2aec2 100755
--- a/share/extensions/jessyInk_autoTexts.py
+++ b/share/extensions/jessyInk_autoTexts.py
@@ -59,7 +59,7 @@ class JessyInk_AutoTexts(inkex.Effect):
 				elif self.options.autoText == "numberOfSlides":
 					nodes[0].set("{" + inkex.NSS["jessyink"] + "}autoText","numberOfSlides")
 				else:
-					if nodes[0].attrib.has_key("{" + inkex.NSS["jessyink"] + "}autoText"):
+					if "{" + inkex.NSS["jessyink"] + "}autoText" in nodes[0].attrib:
 						del nodes[0].attrib["{" + inkex.NSS["jessyink"] + "}autoText"]
 
 # Create effect instance
diff --git a/share/extensions/jessyInk_effects.py b/share/extensions/jessyInk_effects.py
index dc56d3a75e..89a8286c7f 100755
--- a/share/extensions/jessyInk_effects.py
+++ b/share/extensions/jessyInk_effects.py
@@ -55,19 +55,19 @@ class JessyInk_Effects(inkex.Effect):
 			if (self.options.effectIn == "appear") or (self.options.effectIn == "fade") or (self.options.effectIn == "pop"):
 				node.set("{" + inkex.NSS["jessyink"] + "}effectIn","name:" + self.options.effectIn  + ";order:" + self.options.effectInOrder + ";length:" + str(int(self.options.effectInDuration * 1000)))
 				# Remove possible view argument.
-				if node.attrib.has_key("{" + inkex.NSS["jessyink"] + "}view"):
+				if "{" + inkex.NSS["jessyink"] + "}view" in node.attrib:
 					del node.attrib["{" + inkex.NSS["jessyink"] + "}view"]
 			else:
-				if node.attrib.has_key("{" + inkex.NSS["jessyink"] + "}effectIn"):
+				if "{" + inkex.NSS["jessyink"] + "}effectIn" in node.attrib:
 					del node.attrib["{" + inkex.NSS["jessyink"] + "}effectIn"]
 		
 			if (self.options.effectOut == "appear") or (self.options.effectOut == "fade") or (self.options.effectOut == "pop"):
 				node.set("{" + inkex.NSS["jessyink"] + "}effectOut","name:" + self.options.effectOut  + ";order:" + self.options.effectOutOrder + ";length:" + str(int(self.options.effectOutDuration * 1000)))
 				# Remove possible view argument.
-				if node.attrib.has_key("{" + inkex.NSS["jessyink"] + "}view"):
+				if "{" + inkex.NSS["jessyink"] + "}view" in node.attrib:
 					del node.attrib["{" + inkex.NSS["jessyink"] + "}view"]
 			else:
-				if node.attrib.has_key("{" + inkex.NSS["jessyink"] + "}effectOut"):
+				if "{" + inkex.NSS["jessyink"] + "}effectOut" in node.attrib:
 					del node.attrib["{" + inkex.NSS["jessyink"] + "}effectOut"]
 
 # Create effect instance
diff --git a/share/extensions/jessyInk_export.py b/share/extensions/jessyInk_export.py
index 1c7cc8c371..a08cfb6ddb 100755
--- a/share/extensions/jessyInk_export.py
+++ b/share/extensions/jessyInk_export.py
@@ -53,7 +53,7 @@ def dictToPropStr(dictio):
 def setStyle(node, propKey, propValue):
 	props = {}
 
-	if node.attrib.has_key("style"):
+	if "style" in node.attrib:
 		props = propStrToDict(node.get("style"))
 	
 	props[propKey] = propValue
diff --git a/share/extensions/jessyInk_summary.py b/share/extensions/jessyInk_summary.py
index c5be47a49f..9010483f3d 100755
--- a/share/extensions/jessyInk_summary.py
+++ b/share/extensions/jessyInk_summary.py
@@ -97,7 +97,7 @@ class JessyInk_Summary(inkex.Effect):
 		if transitionInAttribute:
 			transInDict = propListToDict(propStrToList(transitionInAttribute))
 
-			if (transInDict["name"] != "appear") and transInDict.has_key("length"):
+			if (transInDict["name"] != "appear") and "length" in transInDict:
 				inkex.errormsg(_("{0}Transition in: {1} ({2!s} s)").format(prefix, transInDict["name"], int(transInDict["length"]) / 1000.0))
 			else:
 				inkex.errormsg(_("{0}Transition in: {1}").format(prefix, transInDict["name"]))
@@ -106,7 +106,7 @@ class JessyInk_Summary(inkex.Effect):
 		if transitionOutAttribute:
 			transOutDict = propListToDict(propStrToList(transitionOutAttribute))
 
-			if (transOutDict["name"] != "appear") and transOutDict.has_key("length"):
+			if (transOutDict["name"] != "appear") and "length" in transOutDict:
 				inkex.errormsg(_("{0}Transition out: {1} ({2!s} s)").format(prefix, transOutDict["name"], int(transOutDict["length"]) / 1000.0))
 			else:
 				inkex.errormsg(_("{0}Transition out: {1}").format(prefix, transOutDict["name"]))
@@ -130,7 +130,7 @@ class JessyInk_Summary(inkex.Effect):
 			dictio["id"] = effectNode.get("id")
 			dictio["type"] = "effect"
 
-			if not effects.has_key(dictio["order"]):
+			if dictio["order"] not in effects:
 				effects[dictio["order"]] = []
 
 			effects[dictio["order"]].append(dictio)
@@ -141,7 +141,7 @@ class JessyInk_Summary(inkex.Effect):
 			dictio["id"] = effectNode.get("id")
 			dictio["type"] = "effect"
 
-			if not effects.has_key(dictio["order"]):
+			if dictio["order"] not in effects:
 				effects[dictio["order"]] = []
 
 			effects[dictio["order"]].append(dictio)
@@ -151,7 +151,7 @@ class JessyInk_Summary(inkex.Effect):
 			dictio["id"] = viewNode.get("id")
 			dictio["type"] = "view"
 
-			if not effects.has_key(dictio["order"]):
+			if dictio["order"] not in effects:
 				effects[dictio["order"]] = []
 
 			effects[dictio["order"]].append(dictio)
@@ -182,7 +182,7 @@ class JessyInk_Summary(inkex.Effect):
 				if item["name"] != "appear":
 					tmpStr += _(" using effect \"{0}\"").format(item["name"])
 					
-				if item.has_key("length"):
+				if "length" in item:
 					tmpStr += _(" in {0!s} s").format(int(item["length"]) / 1000.0)
 
 				inkex.errormsg(tmpStr + ".\n")
diff --git a/share/extensions/jessyInk_video.py b/share/extensions/jessyInk_video.py
index bd20d837f1..cf5052c446 100755
--- a/share/extensions/jessyInk_video.py
+++ b/share/extensions/jessyInk_video.py
@@ -86,15 +86,15 @@ def findInternalLinks(node, docRoot, nodeDict = {}):
 	for entry in re.findall("url\(#.*\)", etree.tostring(node)):
 		linkId = entry[5:len(entry) - 1]
 
-		if not nodeDict.has_key(linkId):
+		if linkId not in nodeDict:
 			nodeDict[linkId] = deepcopy(docRoot.xpath("//*[@id='" + linkId + "']", namespaces=inkex.NSS)[0])
 			nodeDict = findInternalLinks(nodeDict[linkId], docRoot, nodeDict)
 
 	for entry in node.iter():
-		if entry.attrib.has_key('{' + inkex.NSS['xlink'] + '}href'):
+		if '{' + inkex.NSS['xlink'] + '}href' in entry.attrib:
 			linkId = entry.attrib['{' + inkex.NSS['xlink'] + '}href'][1:len(entry.attrib['{' + inkex.NSS['xlink'] + '}href'])]
 	
-			if not nodeDict.has_key(linkId):
+			if linkId not in nodeDict:
 				nodeDict[linkId] = deepcopy(docRoot.xpath("//*[@id='" + linkId + "']", namespaces=inkex.NSS)[0])
 				nodeDict = findInternalLinks(nodeDict[linkId], docRoot, nodeDict)
 
@@ -112,7 +112,7 @@ def getNewId(prefix, docRoot):
 
 def deleteIds(node):
 	for entry in node.iter():
-		if entry.attrib.has_key('id'):
+		if 'id' in entry.attrib:
 			del entry.attrib['id']
 
 # Create effect instance
diff --git a/share/extensions/jessyInk_view.py b/share/extensions/jessyInk_view.py
index 37a30758f0..d020263db5 100755
--- a/share/extensions/jessyInk_view.py
+++ b/share/extensions/jessyInk_view.py
@@ -90,13 +90,13 @@ class JessyInk_Effects(inkex.Effect):
 			rect.set("{" + inkex.NSS["jessyink"] + "}view","name:view;order:" + self.options.viewOrder + ";length:" + str(int(self.options.viewDuration * 1000)))
 
 			# Remove possible effect arguments.
-			if rect.attrib.has_key("{" + inkex.NSS["jessyink"] + "}effectIn"):
+			if "{" + inkex.NSS["jessyink"] + "}effectIn" in rect.attrib:
 				del rect.attrib["{" + inkex.NSS["jessyink"] + "}effectIn"]
 
-			if rect.attrib.has_key("{" + inkex.NSS["jessyink"] + "}effectOut"):
+			if "{" + inkex.NSS["jessyink"] + "}effectOut" in rect.attrib:
 				del rect.attrib["{" + inkex.NSS["jessyink"] + "}effectOut"]
 		else:
-			if node.attrib.has_key("{" + inkex.NSS["jessyink"] + "}view"):
+			if "{" + inkex.NSS["jessyink"] + "}view" in node.attrib:
 				del node.attrib["{" + inkex.NSS["jessyink"] + "}view"]
 		
 # Create effect instance
diff --git a/share/extensions/markers_strokepaint.py b/share/extensions/markers_strokepaint.py
index d922ef474e..34e2216de1 100755
--- a/share/extensions/markers_strokepaint.py
+++ b/share/extensions/markers_strokepaint.py
@@ -123,7 +123,7 @@ class MyEffect(inkex.Effect):
                     stroke = "none";
 
             for mprop in mprops:
-                if style.has_key(mprop) and style[mprop] != 'none'and style[mprop][:5] == 'url(#':
+                if mprop in style and style[mprop] != 'none'and style[mprop][:5] == 'url(#':
                     marker_id = style[mprop][5:-1]
 
                     try:
diff --git a/share/extensions/merge_styles.py b/share/extensions/merge_styles.py
index cdd7b5ed58..d76333ae04 100755
--- a/share/extensions/merge_styles.py
+++ b/share/extensions/merge_styles.py
@@ -56,7 +56,7 @@ class Style(dict):
     def add(self, c, el):
         self.total.append( (c, el) )
         for name,value in c.iteritems():
-            if not self.has_key(name):
+            if name not in self:
                 self[name] = value
             if self[name] == value:
                 self.weights[name] += 1
@@ -76,7 +76,7 @@ class Style(dict):
     def __eq__(self, o):
         """Not equals, prefer to overload 'in' but that doesn't seem possible"""
         for arg in self.keys():
-            if o.has_key(arg) and self[arg] != o[arg]:
+            if arg in o and self[arg] != o[arg]:
                 return False
         return True
 
@@ -122,7 +122,7 @@ class MergeStyles(inkex.Effect):
             st.remove(common.keys())
             el.attrib['style'] = st.to_str("")
             
-            olds = el.attrib.has_key('class') and el.attrib['class'].split() or []
+            olds = 'class' in el.attrib and el.attrib['class'].split() or []
             if newclass not in olds:
                 olds.append(newclass)
             el.attrib['class'] = ' '.join(olds)
diff --git a/share/extensions/pathmodifier.py b/share/extensions/pathmodifier.py
index bf45dd77a2..01c9a63845 100755
--- a/share/extensions/pathmodifier.py
+++ b/share/extensions/pathmodifier.py
@@ -129,7 +129,7 @@ class PathModifier(inkex.Effect):
             newNode = self.document.getroot().xpath(path, namespaces=inkex.NSS)[0]
             return newNode
         else:
-            raise AssertionError, "Trying to follow empty xlink.href attribute."
+            raise AssertionError("Trying to follow empty xlink.href attribute.")
 
     def unlinkClone(self,node,doReplace):
         if node.tag == inkex.addNS('use','svg') or node.tag=='use':
@@ -144,7 +144,7 @@ class PathModifier(inkex.Effect):
 
             return newNode
         else:
-            raise AssertionError, "Only clones can be unlinked..."
+            raise AssertionError("Only clones can be unlinked...")
 
 
 
diff --git a/share/extensions/pixelsnap.py b/share/extensions/pixelsnap.py
index 1628229200..2d2ccf834a 100755
--- a/share/extensions/pixelsnap.py
+++ b/share/extensions/pixelsnap.py
@@ -470,7 +470,7 @@ class PixelSnapEffect(inkex.Effect):
             for e in elem:
                 try:
                     self.pixel_snap(e, transform)
-                except TransformError, e:
+                except TransformError as e:
                     print >>sys.stderr, e
             return
 
@@ -480,7 +480,7 @@ class PixelSnapEffect(inkex.Effect):
         self.snap_transform(elem)
         try:
             self.snap_stroke(elem, parent_transform)
-        except TransformError, e:
+        except TransformError as e:
             print >>sys.stderr, e
 
         if elemtype(elem, 'path'):
@@ -498,7 +498,7 @@ class PixelSnapEffect(inkex.Effect):
         for id, elem in self.selected.iteritems():
             try:
                 self.pixel_snap(elem)
-            except TransformError, e:
+            except TransformError as e:
                 print >>sys.stderr, e
 
 
diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py
index 800142bb2b..4af4d97963 100755
--- a/share/extensions/plotter.py
+++ b/share/extensions/plotter.py
@@ -69,7 +69,7 @@ class Plot(inkex.Effect):
                 return 1
             else:
                 type, value, traceback = sys.exc_info()
-                raise ValueError, ('', type, value), traceback
+                raise ValueError('', type, value).with_traceback(traceback)
         # TODO: Get preview to work. This requires some work on the C++ side to be able to determine if it is
         # a preview or a final run. (Remember to set <effect needs-live-preview='false'> to true)
         '''
@@ -142,7 +142,7 @@ class Plot(inkex.Effect):
         # gracefully exit script when pySerial is missing
         try:
             import serial
-        except ImportError, e:
+        except ImportError as e:
             inkex.errormsg(_("pySerial is not installed. Please follow these steps:")
                 + "\n\n" + _("1. Download and extract (unzip) this file to your local harddisk:")
                 + "\n"   +   "   https://pypi.python.org/packages/source/p/pyserial/pyserial-2.7.tar.gz"
@@ -201,7 +201,7 @@ class Plot(inkex.Effect):
                 return
             else:
                 type, value, traceback = sys.exc_info()
-                raise ValueError, ('', type, value), traceback
+                raise ValueError('', type, value).with_traceback(traceback)
         # send data to plotter
         mySerial.write(self.hpgl)
         mySerial.read(2)
diff --git a/share/extensions/print_win32_vector.py b/share/extensions/print_win32_vector.py
index 19c4ccb7eb..a65886fc1f 100755
--- a/share/extensions/print_win32_vector.py
+++ b/share/extensions/print_win32_vector.py
@@ -58,13 +58,13 @@ class MyEffect(inkex.Effect):
         style = node.get('style')
         if style:
             style = simplestyle.parseStyle(style)
-            if style.has_key('stroke'):
+            if 'stroke' in style:
                 if style['stroke'] and style['stroke'] != 'none' and style['stroke'][0:3] != 'url':
                     rgb = simplestyle.parseColor(style['stroke'])
-            if style.has_key('stroke-width'):
+            if 'stroke-width' in style:
                 stroke = self.unittouu(style['stroke-width'])/self.unittouu('1px')
                 stroke = int(stroke*self.scale)
-            if style.has_key('fill'):
+            if 'fill' in style:
                 if style['fill'] and style['fill'] != 'none' and style['fill'][0:3] != 'url':
                     fill = simplestyle.parseColor(style['fill'])
                     fillcolor = fill[0] + 256*fill[1] + 256*256*fill[2]
@@ -152,7 +152,7 @@ class MyEffect(inkex.Effect):
             style = group.get('style')
             if style:
                 style = simplestyle.parseStyle(style)
-                if style.has_key('display'):
+                if 'display' in style:
                     if style['display'] == 'none' and self.visibleLayers:
                         return
         trans = group.get('transform')
diff --git a/share/extensions/render_alphabetsoup.py b/share/extensions/render_alphabetsoup.py
index 4aa6af4c7d..c529e6202c 100755
--- a/share/extensions/render_alphabetsoup.py
+++ b/share/extensions/render_alphabetsoup.py
@@ -328,7 +328,7 @@ def randomize_input_string(tokens, zoom ):					   # generate a glyph starting fr
 	for i in range(0,len(tokens)):
 		char = tokens[i]
 		#if ( re.match("[a-zA-Z0-9?]", char)):
-		if ( alphabet.has_key(char)):
+		if ( char in alphabet):
 			if ((i > 0) and (char == tokens[i-1])):		 # if this letter matches previous letter
 				imagelist.append(imagelist[len(stack)-1])# make them the same image
 			else:										# generate image for letter
diff --git a/share/extensions/run_command.py b/share/extensions/run_command.py
index 950e9ed7cd..d760567a19 100755
--- a/share/extensions/run_command.py
+++ b/share/extensions/run_command.py
@@ -66,7 +66,7 @@ def run(command_format, prog_name):
                 msg = "%s failed:\n%s\n%s\n" % (prog_name, out, err)
             elif err:
                 sys.stderr.write("%s executed but logged the following error:\n%s\n%s\n" % (prog_name, out, err))
-    except Exception, inst:
+    except Exception as inst:
         msg = "Error attempting to run %s: %s" % (prog_name, str(inst))
 
     # If successful, copy the output file to stdout.
@@ -79,7 +79,7 @@ def run(command_format, prog_name):
             data = f.read()
             sys.stdout.write(data)
             f.close()
-        except IOError, inst:
+        except IOError as inst:
             msg = "Error reading temporary file: %s" % str(inst)
 
     # Clean up.
diff --git a/share/extensions/simplepath.py b/share/extensions/simplepath.py
index 5d99e46e76..a83cbb4529 100644
--- a/share/extensions/simplepath.py
+++ b/share/extensions/simplepath.py
@@ -48,7 +48,7 @@ def lexPath(d):
             offset = m.end()
             continue
         #TODO: create new exception
-        raise Exception, 'Invalid path data!'
+        raise Exception('Invalid path data!')
 '''
 pathdefs = {commandfamily:
     [
@@ -93,7 +93,7 @@ def parsePath(d):
         needParam = True
         if isCommand:
             if not lastCommand and token.upper() != 'M':
-                raise Exception, 'Invalid path, must begin with moveto.'    
+                raise Exception('Invalid path, must begin with moveto.')    
             else:                
                 command = token
         else:
@@ -106,16 +106,16 @@ def parsePath(d):
                 else:
                     command = pathdefs[lastCommand.upper()][0].lower()
             else:
-                raise Exception, 'Invalid path, no initial command.'    
+                raise Exception('Invalid path, no initial command.')    
         numParams = pathdefs[command.upper()][1]
         while numParams > 0:
             if needParam:
                 try: 
                     token, isCommand = lexer.next()
                     if isCommand:
-                        raise Exception, 'Invalid number of parameters'
+                        raise Exception('Invalid number of parameters')
                 except StopIteration:
-                    raise Exception, 'Unexpected end of path'
+                    raise Exception('Unexpected end of path')
             cast = pathdefs[command.upper()][2][-numParams]
             param = cast(token)
             if command.islower():
diff --git a/share/extensions/simpletransform.py b/share/extensions/simpletransform.py
index f6f68d2be6..9cb7651857 100644
--- a/share/extensions/simpletransform.py
+++ b/share/extensions/simpletransform.py
@@ -131,7 +131,7 @@ def applyTransformToPath(mat,path):
 def fuseTransform(node):
     if node.get('d')==None:
         #FIXME: how do you raise errors?
-        raise AssertionError, 'can not fuse "transform" of elements that have no "d" attribute'
+        raise AssertionError('can not fuse "transform" of elements that have no "d" attribute')
     t = node.get("transform")
     if t == None:
         return
diff --git a/share/extensions/svg_and_media_zip_output.py b/share/extensions/svg_and_media_zip_output.py
index e021bfd4e3..1a148f8a8a 100755
--- a/share/extensions/svg_and_media_zip_output.py
+++ b/share/extensions/svg_and_media_zip_output.py
@@ -160,12 +160,12 @@ class CompressedMediaOutput(inkex.Effect):
         if not s:
             return fonts
             
-        if s.has_key('font-family'):
-            if s.has_key('font-weight'):
+        if 'font-family' in s:
+            if 'font-weight' in s:
                 fonts.append(s['font-family'] + ' ' + s['font-weight'])
             else:
                 fonts.append(s['font-family'])
-        elif s.has_key('-inkscape-font-specification'):
+        elif '-inkscape-font-specification' in s:
             fonts.append(s['-inkscape-font-specification'])
         return fonts
 
diff --git a/share/extensions/synfig_fileformat.py b/share/extensions/synfig_fileformat.py
index 6c93e6b87f..41e6bee38c 100755
--- a/share/extensions/synfig_fileformat.py
+++ b/share/extensions/synfig_fileformat.py
@@ -204,11 +204,11 @@ def paramType(layer, param, value=None):
         if param in layer_params.keys():
             return layer_params[param][0]
         else:
-            raise Exception, "Invalid parameter type for layer"
+            raise Exception("Invalid parameter type for layer")
     else:
         # Unknown layer, try to determine parameter type based on value
         if value is None:
-            raise Exception, "No information for given layer"
+            raise Exception("No information for given layer")
         if type(value) == int:
             return "integer"
         elif type(value) == float:
@@ -221,7 +221,7 @@ def paramType(layer, param, value=None):
             elif 0.0 in value.keys():
                 return "gradient"
             else:
-                raise Exception, "Could not automatically determine parameter type"
+                raise Exception("Could not automatically determine parameter type")
         elif type(value) == list:
             if len(value) == 2:
                 return "vector"
diff --git a/share/extensions/synfig_output.py b/share/extensions/synfig_output.py
index bcd1eeaf32..5a36934aae 100755
--- a/share/extensions/synfig_output.py
+++ b/share/extensions/synfig_output.py
@@ -393,7 +393,7 @@ class SynfigDocument(object):
                 for layer in value:
                     el.append(layer)
         else:
-            raise AssertionError, "Unsupported param type %s" % (param_type)
+            raise AssertionError("Unsupported param type %s" % (param_type))
 
         if guid:
             el.set("guid", guid)
@@ -446,7 +446,7 @@ class SynfigDocument(object):
         guid -- guid of the parameter value
         """
         if modify_linked:
-            raise AssertionError, "Modifying linked parameters is not supported"
+            raise AssertionError("Modifying linked parameters is not supported")
 
         layer_type = layer.get("type")
         assert layer_type, "Layer does not have a type"
@@ -463,7 +463,7 @@ class SynfigDocument(object):
         if len(existing) == 0:
             self.build_param(layer, name, value, param_type, guid)
         elif len(existing) > 1:
-            raise AssertionError, "Found multiple parameters with the same name"
+            raise AssertionError("Found multiple parameters with the same name")
         else:
             new_param = self.build_param(None, name, value, param_type, guid)
             layer.replace(existing[0], new_param)
@@ -505,7 +505,7 @@ class SynfigDocument(object):
                 elif param_type == "integer":
                     return int(param[0].get("integer", "0"))
                 else:
-                    raise Exception, "Getting this type of parameter not yet implemented"
+                    raise Exception("Getting this type of parameter not yet implemented")
 
     ### Global defs, and related
 
@@ -530,7 +530,7 @@ class SynfigDocument(object):
         elif link != "":
             gradient["link"] = link
         else:
-            raise MalformedSVGError, "Gradient has neither stops nor link"
+            raise MalformedSVGError("Gradient has neither stops nor link")
         self.gradients[gradient_id] = gradient
 
     def add_radial_gradient(self, gradient_id, center, radius, focus, mtx=[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], stops=[], link="", spread_method="pad"):
@@ -549,7 +549,7 @@ class SynfigDocument(object):
         elif link != "":
             gradient["link"] = link
         else:
-            raise MalformedSVGError, "Gradient has neither stops nor link"
+            raise MalformedSVGError("Gradient has neither stops nor link")
         self.gradients[gradient_id] = gradient
 
     def get_gradient(self, gradient_id):
@@ -598,7 +598,7 @@ class SynfigDocument(object):
 
         # If the gradient does have a link, find the color stops recursively
         if gradient["link"] not in self.gradients.keys():
-            raise MalformedSVGError, "Linked gradient ID not found"
+            raise MalformedSVGError("Linked gradient ID not found")
 
         linked_gradient = self.get_gradient(gradient["link"])
         gradient["stops"] = linked_gradient["stops"]
@@ -772,7 +772,7 @@ class SynfigDocument(object):
         Returns: list of layers
         """
         if filter_id not in self.filters.keys():
-            raise MalformedSVGError, "Filter %s not found" % filter_id
+            raise MalformedSVGError("Filter %s not found" % filter_id)
 
         try:
             ret = self.filters[filter_id](self, layers, is_end)
@@ -907,7 +907,7 @@ def path_to_bline_list(path_d, nodetypes=None, mtx=[[1.0, 0.0, 0.0], [0.0, 1.0,
     for s in path:
         cmd, params = s
         if cmd != "M" and bline_list == []:
-            raise MalformedSVGError, "Bad path data: path doesn't start with moveto, %s, %s" % (s, path)
+            raise MalformedSVGError("Bad path data: path doesn't start with moveto, %s, %s" % (s, path))
         elif cmd == "M":
             # Add previous point to subpath
             if last:
@@ -1171,7 +1171,7 @@ class SynfigExport(SynfigPrep):
                 style = extract_style(stop)
                 stops[offset] = extract_color(style, "stop-color", "stop-opacity")
             else:
-                raise MalformedSVGError, "Child of gradient is not a stop"
+                raise MalformedSVGError("Child of gradient is not a stop")
 
         return stops
 
@@ -1224,7 +1224,7 @@ class SynfigExport(SynfigPrep):
                     elif mode == "lighten":
                         blend_method = "brighten"
                     else:
-                        raise MalformedSVGError, "Invalid blend method"
+                        raise MalformedSVGError("Invalid blend method")
 
                     if child.get("in2") == "BackgroundImage":
                         encapsulate_result = False
@@ -1342,7 +1342,7 @@ if __name__ == '__main__':
     try:
         e = SynfigExport()
         e.affect(output=False)
-    except MalformedSVGError, e:
+    except MalformedSVGError as e:
         errormsg(e)
 
 # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
diff --git a/share/extensions/synfig_prepare.py b/share/extensions/synfig_prepare.py
index ebc50fd8e1..3785920ae5 100755
--- a/share/extensions/synfig_prepare.py
+++ b/share/extensions/synfig_prepare.py
@@ -97,7 +97,7 @@ class InkscapeActionGroup(object):
         """
         node_id = node.get("id", None)
         if node_id is None:
-            raise MalformedSVGError, "Node has no id"
+            raise MalformedSVGError("Node has no id")
         self.select_id(node_id)
 
     def select_nodes(self, nodes):
@@ -293,7 +293,7 @@ def split_fill_and_stroke(path_node):
         d = attribs["d"]
         del attribs["d"]
     else:
-        raise AssertionError, "Cannot split stroke and fill of non-path element"
+        raise AssertionError("Cannot split stroke and fill of non-path element")
 
     if addNS("nodetypes", "sodipodi") in attribs.keys():
         nodetypes = attribs[addNS("nodetypes", "sodipodi")]
@@ -494,7 +494,7 @@ if __name__ == '__main__':
     try:
         e = SynfigPrep()
         e.affect()
-    except MalformedSVGError, e:
+    except MalformedSVGError as e:
         errormsg(e)
 
 
diff --git a/share/extensions/text_braille.py b/share/extensions/text_braille.py
index ba2e3d81b1..d778f19eac 100755
--- a/share/extensions/text_braille.py
+++ b/share/extensions/text_braille.py
@@ -37,7 +37,7 @@ class C(chardataeffect.CharDataEffect):
   def process_chardata(self,text, line, par):
     r = ""
     for c in text:
-      if convert_table.has_key(c.lower()):
+      if c.lower() in convert_table:
         r = r + convert_table[c.lower()]
       else:
         r = r + c
diff --git a/share/extensions/uniconv_output.py b/share/extensions/uniconv_output.py
index de6b6409ff..170477540a 100755
--- a/share/extensions/uniconv_output.py
+++ b/share/extensions/uniconv_output.py
@@ -63,7 +63,7 @@ def run(command_format, prog_name, uniconv_format):
                 msg = "Neither subprocess.Popen nor popen2.Popen3 is available"
         if rc and msg is None:
             msg = "%s failed:\n%s\n%s\n" % (prog_name, out, err)
-    except Exception, inst:
+    except Exception as inst:
         msg = "Error attempting to run %s: %s" % (prog_name, str(inst))
 
     # If successful, copy the output file to stdout.
@@ -76,7 +76,7 @@ def run(command_format, prog_name, uniconv_format):
             data = f.read()
             sys.stdout.write(data)
             f.close()
-        except IOError, inst:
+        except IOError as inst:
             msg = "Error reading temporary file: %s" % str(inst)
 
     # Clean up.
diff --git a/share/extensions/voronoi2svg.py b/share/extensions/voronoi2svg.py
index 5232fb81ea..a180eaa583 100644
--- a/share/extensions/voronoi2svg.py
+++ b/share/extensions/voronoi2svg.py
@@ -258,7 +258,7 @@ class Voronoi2svg(inkex.Effect):
         pts.append(Point(pt[0],pt[1]))
         fill = 'none'
         if self.options.delaunayFillOptions != "delaunay-no-fill":
-            if node.attrib.has_key('style'):
+            if 'style' in node.attrib:
                 style = node.get('style') # fixme: this will break for presentation attributes!
                 if style:
                     declarations = style.split(';')
diff --git a/share/extensions/webslicer_export.py b/share/extensions/webslicer_export.py
index 9acb9d6c37..28c4f9ba82 100755
--- a/share/extensions/webslicer_export.py
+++ b/share/extensions/webslicer_export.py
@@ -63,7 +63,7 @@ class WebSlicer_Export(WebSlicer_Effect):
                 # Try to create it:
                 try:
                     os.makedirs( self.options.dir )
-                except Exception, e:
+                except Exception as e:
                     inkex.errormsg( _('Can\'t create "%s".') % self.options.dir )
                     inkex.errormsg( _('Error: %s') % e )
                     return {'error':'Can\'t create the directory to export.'}
-- 
2.21.0


From cac83ec8b8d399340e9952b3438bc62318293cb3 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 09:33:54 +0100
Subject: [PATCH 02/17] extensions 2to3: next basestring

---
 share/extensions/simplepath.py | 4 ++--
 share/extensions/tar_layers.py | 3 +++
 share/extensions/voronoi.py    | 2 +-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/share/extensions/simplepath.py b/share/extensions/simplepath.py
index a83cbb4529..0ee958b9f3 100644
--- a/share/extensions/simplepath.py
+++ b/share/extensions/simplepath.py
@@ -86,7 +86,7 @@ def parsePath(d):
     
     while 1:
         try:
-            token, isCommand = lexer.next()
+            token, isCommand = next(lexer)
         except StopIteration:
             break
         params = []
@@ -111,7 +111,7 @@ def parsePath(d):
         while numParams > 0:
             if needParam:
                 try: 
-                    token, isCommand = lexer.next()
+                    token, isCommand = next(lexer)
                     if isCommand:
                         raise Exception('Invalid number of parameters')
                 except StopIteration:
diff --git a/share/extensions/tar_layers.py b/share/extensions/tar_layers.py
index 3ba5aa55e1..186e3c4689 100755
--- a/share/extensions/tar_layers.py
+++ b/share/extensions/tar_layers.py
@@ -29,6 +29,9 @@ import StringIO
 import calendar
 import time
 
+if sys.version_info[0] > 2:
+    basestring = str
+
 # Inkscape Libraries
 import inkex
 import simplestyle
diff --git a/share/extensions/voronoi.py b/share/extensions/voronoi.py
index ac2c13f8fa..272f074dd9 100644
--- a/share/extensions/voronoi.py
+++ b/share/extensions/voronoi.py
@@ -700,7 +700,7 @@ class SiteList(object):
         def __iter__(this):      return this
         def next(this): 
             try:
-                return this.generator.next()
+                return next(this.generator)
             except StopIteration:
                 return None
 
-- 
2.21.0


From 13d4f99f073be2228f1fb15b4434579896480818 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 09:44:31 +0100
Subject: [PATCH 03/17] extensions 2to3: print

---
 share/extensions/bezmisc.py               |  2 +-
 share/extensions/dm2svg.py                | 16 ++++---
 share/extensions/dpiswitcher.py           | 18 ++++----
 share/extensions/dxf_outlines.py          |  2 +-
 share/extensions/eqtexsvg.py              | 10 +++--
 share/extensions/export_gimp_palette.py   |  4 +-
 share/extensions/hpgl_output.py           |  2 +-
 share/extensions/pixelsnap.py             |  7 +--
 share/extensions/render_barcode.py        |  4 +-
 share/extensions/render_barcode_qrcode.py |  4 +-
 share/extensions/voronoi.py               | 52 ++++++++++++-----------
 11 files changed, 65 insertions(+), 56 deletions(-)

diff --git a/share/extensions/bezmisc.py b/share/extensions/bezmisc.py
index c36e8e1b4e..274f87a854 100755
--- a/share/extensions/bezmisc.py
+++ b/share/extensions/bezmisc.py
@@ -268,7 +268,7 @@ if __name__ == '__main__':
         print s, st
     '''
     for curve in curves:
-        print beziertatlength(curve,0.5)
+        print(beziertatlength(curve,0.5))
 
 
 # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
diff --git a/share/extensions/dm2svg.py b/share/extensions/dm2svg.py
index 74afe6adf8..a8784a3002 100755
--- a/share/extensions/dm2svg.py
+++ b/share/extensions/dm2svg.py
@@ -21,13 +21,15 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 '''
 
+from __future__ import print_function
+
 import struct
 
 def process_file(filename):
     try:
         f = open(filename, 'rb')
     except IOError as e:
-        print >> sys.stderr, 'Unable to open %s: %s' % (filename, e)
+        print('Unable to open %s: %s' % (filename, e), file=sys.stderr)
         return
 
     with f:
@@ -73,10 +75,10 @@ def process_file(filename):
                     points = ' '.join(','.join(map(str, e)) for e in coords)
                     svg_element = '<polyline points="%s" dm:timestamp="%s" />' % (points, timestamp)
             else:
-                print >> sys.stderr, 'Unsupported tag: %s\n' % tag
+                print('Unsupported tag: %s\n' % tag, file=sys.stderr)
 
         # Emit the footer to finish it off
-        print '\n</svg>\n'
+        print('\n</svg>\n')
 
 
 def read_point(f, ymax):
@@ -90,7 +92,7 @@ def read_point(f, ymax):
 def emit_header(f):
     id, version, width, height, page_type = struct.unpack('<32sBHHBxx', f.read(40))
 
-    print '''
+    print('''
 <svg viewBox="0 0 %(width)s %(height)s" fill="none" stroke="black" stroke-width="10" stroke-linecap="round" stroke-linejoin="round"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:svg="http://www.w3.org/2000/svg"
@@ -107,14 +109,14 @@ def emit_header(f):
       </dm:page>
     </metadata>
     <rect width="%(width)s" height="%(height)s" fill="aliceblue"/>
-''' % locals()
+''' % locals())
 
     return height
 
 
 def emit_element(message):
     if message:
-        print '%s\n' % message
+        print('%s\n' % message)
 
 
 if __name__ == '__main__':
@@ -123,6 +125,6 @@ if __name__ == '__main__':
     if len(sys.argv) == 2:
         process_file(sys.argv[1])
     else:
-        print >> sys.stderr, 'Usage: %s <dhw-file>' % sys.argv[0]
+        print('Usage: %s <dhw-file>' % sys.argv[0], file=sys.stderr)
         
 # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py
index dcffa202db..47bb4458b6 100644
--- a/share/extensions/dpiswitcher.py
+++ b/share/extensions/dpiswitcher.py
@@ -373,34 +373,34 @@ class DPISwitcher(inkex.Effect):
         sys.stdout = sys.stderr
         svg = self.document.getroot()
         if self.options.action == '"page_info"':
-            print ":::SVG document related info:::"
-            print "version: " + str(svg.get(inkex.addNS('version',u'inkscape')))
+            print(":::SVG document related info:::")
+            print("version: " + str(svg.get(inkex.addNS('version',u'inkscape'))))
             width = svg.get('width')
             if width:
-                print "width: " + width
+                print("width: " + width)
             height = svg.get('height')
             if height:
-                print "height: " + height
+                print("height: " + height)
             viewBox = svg.get('viewBox')
             if viewBox:
-                print "viewBox: " + viewBox
+                print("viewBox: " + viewBox)
             namedview = svg.find(inkex.addNS('namedview', 'sodipodi'))
             docunits= namedview.get(inkex.addNS('document-units', 'inkscape'))
             if docunits:
-                print "document-units: " + docunits
+                print("document-units: " + docunits)
             units = namedview.get('units')
             if units:
-                print "units: " + units
+                print("units: " + units)
             xpathStr = '//sodipodi:guide'
             guides = svg.xpath(xpathStr, namespaces=inkex.NSS)
             xpathStr = '//inkscape:grid'
             if guides:
                 numberGuides = len(guides)
-                print "Document has " + str(numberGuides) + " guides"
+                print("Document has " + str(numberGuides) + " guides")
             grids = svg.xpath(xpathStr, namespaces=inkex.NSS)
             i = 1
             for grid in grids:
-                print "Grid number " + str(i) + ": Units: " + grid.get("units")
+                print("Grid number " + str(i) + ": Units: " + grid.get("units"))
                 i = i+1
         else:
             if self.options.switcher == "0":
diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py
index 876f41f5f9..59b136d09c 100755
--- a/share/extensions/dxf_outlines.py
+++ b/share/extensions/dxf_outlines.py
@@ -99,7 +99,7 @@ class MyEffect(inkex.Effect):
         self.d = array([0], float)              # knot vector
         self.poly = [[0.0,0.0]]                 # LWPOLYLINE data
     def output(self):
-        print ''.join(self.dxf)
+        print(''.join(self.dxf))
     def dxf_add(self, str):
         self.dxf.append(str.encode(self.options.char_encode))
     def dxf_line(self,csp):
diff --git a/share/extensions/eqtexsvg.py b/share/extensions/eqtexsvg.py
index 99d3c06601..d67004d468 100755
--- a/share/extensions/eqtexsvg.py
+++ b/share/extensions/eqtexsvg.py
@@ -28,6 +28,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 
 """
 
+from __future__ import print_function
+
 import inkex, os, tempfile, sys, xml.dom.minidom
 
 def parse_pkgs(pkgstring):
@@ -119,7 +121,7 @@ class EQTEXSVG(inkex.Effect):
             os.rmdir(base_dir)
 
         if self.options.formula == "":
-            print >>sys.stderr, "empty LaTeX input.  Nothing to be done"
+            print("empty LaTeX input.  Nothing to be done", file=sys.stderr)
             return
 
         add_header = parse_pkgs(self.options.packages)
@@ -129,9 +131,9 @@ class EQTEXSVG(inkex.Effect):
         try:
             os.stat(dvi_file)
         except OSError:
-            print >>sys.stderr, "invalid LaTeX input:"
-            print >>sys.stderr, self.options.formula
-            print >>sys.stderr, "temporary files were left in:", base_dir
+            print("invalid LaTeX input:", file=sys.stderr)
+            print(self.options.formula, file=sys.stderr)
+            print("temporary files were left in:", base_dir, file=sys.stderr)
             sys.exit(1)
 
         os.system('dvips -q -f -E -D 600 -y 5000 -o "%s" "%s"' % (ps_file, dvi_file))
diff --git a/share/extensions/export_gimp_palette.py b/share/extensions/export_gimp_palette.py
index 9c04d6e34c..eaf08781ce 100755
--- a/share/extensions/export_gimp_palette.py
+++ b/share/extensions/export_gimp_palette.py
@@ -47,10 +47,10 @@ stream = open(sys.argv[-1:][0],'r')
 dom = parse(stream)
 stream.close()
 walk(dom)
-print 'GIMP Palette\nName: %s\n#' % (dom.getElementsByTagName('svg')[0].getAttribute(DOCNAME).split('.')[0])
+print('GIMP Palette\nName: %s\n#' % (dom.getElementsByTagName('svg')[0].getAttribute(DOCNAME).split('.')[0]))
 
 for k,v in sorted(colors.items()):
-    print k+v
+    print(k+v)
 
 
 # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py
index 20ec363fde..812bc693fe 100755
--- a/share/extensions/hpgl_output.py
+++ b/share/extensions/hpgl_output.py
@@ -70,7 +70,7 @@ class HpglOutput(inkex.Effect):
     def output(self):
         # print to file
         if self.hpgl != '':
-            print self.hpgl
+            print(self.hpgl)
 
 if __name__ == '__main__':
     # start extension
diff --git a/share/extensions/pixelsnap.py b/share/extensions/pixelsnap.py
index 2d2ccf834a..96a8617e2f 100755
--- a/share/extensions/pixelsnap.py
+++ b/share/extensions/pixelsnap.py
@@ -59,6 +59,7 @@ Note: Paths that have curves & arcs on some sides of the bounding box won't
 """
 
 from __future__ import division
+from __future__ import print_function
 
 import sys
 # *** numpy causes issue #4 on Mac OS 10.6.2. I use it for
@@ -471,7 +472,7 @@ class PixelSnapEffect(inkex.Effect):
                 try:
                     self.pixel_snap(e, transform)
                 except TransformError as e:
-                    print >>sys.stderr, e
+                    print(e, file=sys.stderr)
             return
 
         if not elemtype(elem, ('path', 'rect', 'image')):
@@ -481,7 +482,7 @@ class PixelSnapEffect(inkex.Effect):
         try:
             self.snap_stroke(elem, parent_transform)
         except TransformError as e:
-            print >>sys.stderr, e
+            print(e, file=sys.stderr)
 
         if elemtype(elem, 'path'):
             self.snap_path_scale(elem, parent_transform)
@@ -499,7 +500,7 @@ class PixelSnapEffect(inkex.Effect):
             try:
                 self.pixel_snap(elem)
             except TransformError as e:
-                print >>sys.stderr, e
+                print(e, file=sys.stderr)
 
 
 if __name__ == '__main__':
diff --git a/share/extensions/render_barcode.py b/share/extensions/render_barcode.py
index 63436f03c0..e08ec663b4 100755
--- a/share/extensions/render_barcode.py
+++ b/share/extensions/render_barcode.py
@@ -78,12 +78,12 @@ def test_barcode():
         ('Upca', '12345678911'),
         ('Upce', '123456'),
       ):
-        print "RENDER TEST: %s" % kind
+        print("RENDER TEST: %s" % kind)
         bargen = getBarcode(kind, text=text)
         if bargen is not None:
             barcode = bargen.generate()
             if barcode is not None:
-                print inkex.etree.tostring(barcode, pretty_print=True)
+                print(inkex.etree.tostring(barcode, pretty_print=True))
 
 
 if __name__ == '__main__':
diff --git a/share/extensions/render_barcode_qrcode.py b/share/extensions/render_barcode_qrcode.py
index 062488ca1d..d829eb0604 100755
--- a/share/extensions/render_barcode_qrcode.py
+++ b/share/extensions/render_barcode_qrcode.py
@@ -1,5 +1,7 @@
 #!/usr/bin/env python
 
+from __future__ import print_function
+
 import math, sys
 import inkex
 from simpletransform import computePointInNode
@@ -1008,7 +1010,7 @@ class QRBitBuffer:
     def get(self, index):
         bufIndex = math.floor(index / 8)
         val = ( (self.buffer[bufIndex] >> (7 - index % 8) ) & 1) == 1
-        print "get ", val
+        print("get ", val)
         return ( (self.buffer[bufIndex] >> (7 - index % 8) ) & 1) == 1
     def put(self, num, length):
         for i in range(length):
diff --git a/share/extensions/voronoi.py b/share/extensions/voronoi.py
index 272f074dd9..af83007f1a 100644
--- a/share/extensions/voronoi.py
+++ b/share/extensions/voronoi.py
@@ -29,8 +29,10 @@
 #
 #############################################################################
 
+from __future__ import print_function
+
 def usage():
-    print """
+    print("""
 voronoi - compute Voronoi diagram or Delaunay triangulation
 
 voronoi [-t -p -d]  [filename]
@@ -67,7 +69,7 @@ On unsorted data uniformly distributed in the unit square, voronoi uses about
 AUTHOR
 Steve J. Fortune (1987) A Sweepline Algorithm for Voronoi Diagrams,
 Algorithmica 2, 153-174.
-"""
+""")
 
 #############################################################################
 #
@@ -123,39 +125,39 @@ class Context(object):
 
     def outSite(self,s):
         if(self.debug):
-            print "site (%d) at %f %f" % (s.sitenum, s.x, s.y)
+            print("site (%d) at %f %f" % (s.sitenum, s.x, s.y))
         elif(self.triangulate):
             pass
         elif(self.plot):
             self.circle (s.x, s.y, cradius)
         elif(self.doPrint):
-            print "s %f %f" % (s.x, s.y)
+            print("s %f %f" % (s.x, s.y))
 
     def outVertex(self,s):
         self.vertices.append((s.x,s.y))
         if(self.debug):
-            print  "vertex(%d) at %f %f" % (s.sitenum, s.x, s.y)
+            print("vertex(%d) at %f %f" % (s.sitenum, s.x, s.y))
         elif(self.triangulate):
             pass
         elif(self.doPrint and not self.plot):
-            print "v %f %f" % (s.x,s.y)
+            print("v %f %f" % (s.x,s.y))
 
     def outTriple(self,s1,s2,s3):
         self.triangles.append((s1.sitenum, s2.sitenum, s3.sitenum))
         if(self.debug):
-            print "circle through left=%d right=%d bottom=%d" % (s1.sitenum, s2.sitenum, s3.sitenum)
+            print("circle through left=%d right=%d bottom=%d" % (s1.sitenum, s2.sitenum, s3.sitenum))
         elif(self.triangulate and self.doPrint and not self.plot):
-            print "%d %d %d" % (s1.sitenum, s2.sitenum, s3.sitenum)
+            print("%d %d %d" % (s1.sitenum, s2.sitenum, s3.sitenum))
 
     def outBisector(self,edge):
         self.lines.append((edge.a, edge.b, edge.c))
         if(self.debug):
-            print "line(%d) %gx+%gy=%g, bisecting %d %d" % (edge.edgenum, edge.a, edge.b, edge.c, edge.reg[0].sitenum, edge.reg[1].sitenum)
+            print("line(%d) %gx+%gy=%g, bisecting %d %d" % (edge.edgenum, edge.a, edge.b, edge.c, edge.reg[0].sitenum, edge.reg[1].sitenum))
         elif(self.triangulate):
             if(self.plot):
                 self.line(edge.reg[0].x, edge.reg[0].y, edge.reg[1].x, edge.reg[1].y)
         elif(self.doPrint and not self.plot):
-            print "l %f %f %f" % (edge.a, edge.b, edge.c)
+            print("l %f %f %f" % (edge.a, edge.b, edge.c))
 
     def outEdge(self,edge):
         sitenumL = -1
@@ -169,9 +171,9 @@ class Context(object):
             if self.plot:
                 self.clip_line(edge)
             elif(self.doPrint): 
-                print "e %d" % edge.edgenum,
-                print " %d " % sitenumL,
-                print "%d" % sitenumR
+                print("e %d" % edge.edgenum, end=' ')
+                print(" %d " % sitenumL, end=' ')
+                print("%d" % sitenumR)
 
 #------------------------------------------------------------------
 def voronoi(siteList,context):
@@ -325,7 +327,7 @@ class Site(object):
         self.sitenum = sitenum
 
     def dump(self):
-        print "Site #%d (%g, %g)" % (self.sitenum,self.x,self.y)
+        print("Site #%d (%g, %g)" % (self.sitenum,self.x,self.y))
 
     def __cmp__(self,other):
         if self.y < other.y:
@@ -360,9 +362,9 @@ class Edge(object):
         self.edgenum = 0
 
     def dump(self):
-        print "(#%d a=%g, b=%g, c=%g)" % (self.edgenum,self.a,self.b,self.c)
-        print "ep",self.ep
-        print "reg",self.reg
+        print("(#%d a=%g, b=%g, c=%g)" % (self.edgenum,self.a,self.b,self.c))
+        print("ep",self.ep)
+        print("reg",self.reg)
 
     def setEndpoint(self, lrFlag, site):
         self.ep[lrFlag] = site
@@ -417,15 +419,15 @@ class Halfedge(object):
         self.ystar  = BIG_FLOAT
 
     def dump(self):
-        print "Halfedge--------------------------"
-        print "left: ",    self.left  
-        print "right: ",   self.right 
-        print "edge: ",    self.edge  
-        print "pm: ",      self.pm    
-        print "vertex: ",
+        print("Halfedge--------------------------")
+        print("left: ",    self.left)
+        print("right: ",   self.right)
+        print("edge: ",    self.edge)
+        print("pm: ",      self.pm)
+        print("vertex: ", end=' ')
         if self.vertex: self.vertex.dump()
-        else: print "None"
-        print "ystar: ",   self.ystar 
+        else: print("None")
+        print("ystar: ",   self.ystar)
 
 
     def __cmp__(self,other):
-- 
2.21.0


From d95b05882ab7e7cb3cd8d1d65a8471018424e892 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 10:15:40 +0100
Subject: [PATCH 04/17] extensions 2to3: tuple_params

---
 share/extensions/addnodes.py                  |  4 +-
 share/extensions/bezmisc.py                   | 34 ++++++++++----
 share/extensions/convert2dashes.py            |  4 +-
 share/extensions/cspsubdiv.py                 |  3 +-
 share/extensions/draw_from_triangle.py        | 15 ++++--
 share/extensions/dxf_outlines.py              |  4 +-
 share/extensions/gcodetools.py                | 46 ++++++++++++++-----
 share/extensions/interp.py                    |  8 +++-
 share/extensions/jitternodes.py               |  3 +-
 share/extensions/measure.py                   |  8 +++-
 share/extensions/motion.py                    |  3 +-
 share/extensions/polyhedron_3d.py             | 10 ++--
 share/extensions/pturtle.py                   |  6 ++-
 share/extensions/render_barcode_datamatrix.py | 10 ++--
 share/extensions/straightseg.py               |  4 +-
 share/extensions/summersnight.py              |  3 +-
 share/extensions/triangle.py                  | 10 +++-
 share/extensions/wireframe_sphere.py          |  4 +-
 18 files changed, 130 insertions(+), 49 deletions(-)

diff --git a/share/extensions/addnodes.py b/share/extensions/addnodes.py
index 4e57f0185a..a2f70c885f 100755
--- a/share/extensions/addnodes.py
+++ b/share/extensions/addnodes.py
@@ -27,7 +27,9 @@ import cubicsuperpath, simplestyle, copy, math, re, bezmisc
 
 def numsegs(csp):
     return sum([len(p)-1 for p in csp])
-def tpoint((x1,y1), (x2,y2), t = 0.5):
+def tpoint(_x1_y1, _x2_y2, t = 0.5):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return [x1+t*(x2-x1),y1+t*(y2-y1)]
 def cspbezsplit(sp1, sp2, t = 0.5):
     m1=tpoint(sp1[1],sp1[2],t)
diff --git a/share/extensions/bezmisc.py b/share/extensions/bezmisc.py
index 274f87a854..a563178868 100755
--- a/share/extensions/bezmisc.py
+++ b/share/extensions/bezmisc.py
@@ -55,8 +55,9 @@ def rootWrapper(a,b,c,d):
         return 1.0*(-d/c),
     return ()
 
-def bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3))):
+def bezierparameterize(xxx_todo_changeme):
     #parametric bezier
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme
     x0=bx0
     y0=by0
     cx=3*(bx1-x0)
@@ -69,8 +70,10 @@ def bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3))):
     return ax,ay,bx,by,cx,cy,x0,y0
     #ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
 
-def linebezierintersect(((lx1,ly1),(lx2,ly2)),((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3))):
+def linebezierintersect(xxx_todo_changeme1, xxx_todo_changeme2):
     #parametric line
+    ((lx1,ly1),(lx2,ly2)) = xxx_todo_changeme1
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme2
     dd=lx1
     cc=lx2-lx1
     bb=ly1
@@ -99,19 +102,23 @@ def linebezierintersect(((lx1,ly1),(lx2,ly2)),((bx0,by0),(bx1,by1),(bx2,by2),(bx
             retval.append(bezierpointatt(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),i))
     return retval
 
-def bezierpointatt(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),t):
+def bezierpointatt(xxx_todo_changeme3,t):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme3
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     x=ax*(t**3)+bx*(t**2)+cx*t+x0
     y=ay*(t**3)+by*(t**2)+cy*t+y0
     return x,y
 
-def bezierslopeatt(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),t):
+def bezierslopeatt(xxx_todo_changeme4,t):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme4
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     dx=3*ax*(t**2)+2*bx*t+cx
     dy=3*ay*(t**2)+2*by*t+cy
     return dx,dy
 
-def beziertatslope(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),(dy,dx)):
+def beziertatslope(xxx_todo_changeme5, xxx_todo_changeme6):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme5
+    (dy,dx) = xxx_todo_changeme6
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     #quadratic coefficents of slope formula
     if dx:
@@ -136,9 +143,12 @@ def beziertatslope(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),(dy,dx)):
             retval.append(i)
     return retval
 
-def tpoint((x1,y1),(x2,y2),t):
+def tpoint(_x1_y1, _x2_y2, t):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return x1+t*(x2-x1),y1+t*(y2-y1)
-def beziersplitatt(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),t):
+def beziersplitatt(xxx_todo_changeme9,t):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme9
     m1=tpoint((bx0,by0),(bx1,by1),t)
     m2=tpoint((bx1,by1),(bx2,by2),t)
     m3=tpoint((bx2,by2),(bx3,by3),t)
@@ -167,7 +177,9 @@ Jens Gravesen <gravesen@mat.dth.dk>
 mat-report no. 1992-10, Mathematical Institute, The Technical
 University of Denmark. 
 '''
-def pointdistance((x1,y1),(x2,y2)):
+def pointdistance(_x1_y1, _x2_y2):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return math.sqrt(((x2 - x1) ** 2) + ((y2 - y1) ** 2))
 def Gravesen_addifclose(b, len, error = 0.001):
     box = 0
@@ -214,13 +226,15 @@ def Simpson(f, a, b, n_limit, tolerance):
     #print multiplier, endsum, interval, asum, bsum, est1, est0
     return est1
 
-def bezierlengthSimpson(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)), tolerance = 0.001):
+def bezierlengthSimpson(xxx_todo_changeme12, tolerance = 0.001):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme12
     global balfax,balfbx,balfcx,balfay,balfby,balfcy
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     balfax,balfbx,balfcx,balfay,balfby,balfcy = 3*ax,2*bx,cx,3*ay,2*by,cy
     return Simpson(balf, 0.0, 1.0, 4096, tolerance)
 
-def beziertatlength(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)), l = 0.5, tolerance = 0.001):
+def beziertatlength(xxx_todo_changeme13, l = 0.5, tolerance = 0.001):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme13
     global balfax,balfbx,balfcx,balfay,balfby,balfcy
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     balfax,balfbx,balfcx,balfay,balfby,balfcy = 3*ax,2*bx,cx,3*ay,2*by,cy
diff --git a/share/extensions/convert2dashes.py b/share/extensions/convert2dashes.py
index 44241c2548..f0feee790b 100755
--- a/share/extensions/convert2dashes.py
+++ b/share/extensions/convert2dashes.py
@@ -26,7 +26,9 @@ import cubicsuperpath
 import bezmisc
 import simplestyle
 
-def tpoint((x1,y1), (x2,y2), t = 0.5):
+def tpoint(_x1_y1, _x2_y2, t = 0.5):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return [x1+t*(x2-x1),y1+t*(y2-y1)]
 def cspbezsplit(sp1, sp2, t = 0.5):
     m1=tpoint(sp1[1],sp1[2],t)
diff --git a/share/extensions/cspsubdiv.py b/share/extensions/cspsubdiv.py
index c34236afec..c44e50ce49 100755
--- a/share/extensions/cspsubdiv.py
+++ b/share/extensions/cspsubdiv.py
@@ -2,7 +2,8 @@
 from bezmisc import *
 from ffgeom import *
 
-def maxdist(((p0x,p0y),(p1x,p1y),(p2x,p2y),(p3x,p3y))):
+def maxdist(xxx_todo_changeme):
+    ((p0x,p0y),(p1x,p1y),(p2x,p2y),(p3x,p3y)) = xxx_todo_changeme
     p0 = Point(p0x,p0y)
     p1 = Point(p1x,p1y)
     p2 = Point(p2x,p2y)
diff --git a/share/extensions/draw_from_triangle.py b/share/extensions/draw_from_triangle.py
index fd966b1d19..3b519fe759 100755
--- a/share/extensions/draw_from_triangle.py
+++ b/share/extensions/draw_from_triangle.py
@@ -70,7 +70,9 @@ def draw_SVG_tri(vert_mat, params, style, name, parent):
     inkex.etree.SubElement(parent, inkex.addNS('path','svg'), tri_attribs )
 
 #draw an SVG line segment between the given (raw) points
-def draw_SVG_line( (x1, y1), (x2, y2), style, name, parent):
+def draw_SVG_line(_x1_y1, _x2_y2, style, name, parent):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     line_style   = { 'stroke': style.l_col, 'stroke-width':str(style.l_th), 'fill': style.l_fill }
     line_attribs = {'style':simplestyle.formatStyle(line_style),
                     inkex.addNS('label','inkscape'):name,
@@ -85,10 +87,14 @@ def draw_vertex_lines( vert_mat, params, width, name, parent):
         
 #MATHEMATICAL ROUTINES
 
-def distance( (x0,y0),(x1,y1)):#find the pythagorean distance
+def distance(_x0_y0, _x1_y1):#find the pythagorean distance
+    (x0, y0) = _x0_y0
+    (x1, y1) = _x1_y1
     return sqrt( (x0-x1)*(x0-x1) + (y0-y1)*(y0-y1) )
 
-def vector_from_to( (x0,y0),(x1,y1) ):#get the vector from (x0,y0) to (x1,y1)
+def vector_from_to(_x0_y0, _x1_y1 ):#get the vector from (x0,y0) to (x1,y1)
+    (x0, y0) = _x0_y0
+    (x1, y1) = _x1_y1
     return (x1-x0, y1-y0)
 
 def get_cartesian_pt( t, p):#get the cartesian coordinates from a trilinear set
@@ -97,7 +103,8 @@ def get_cartesian_pt( t, p):#get the cartesian coordinates from a trilinear set
     c2 = p[0][2]*t[2]/denom
     return ( c1*p[2][1][0]+c2*p[2][0][0], c1*p[2][1][1]+c2*p[2][0][1] )
 
-def get_cartesian_tri( ((t11,t12,t13),(t21,t22,t23),(t31,t32,t33)), params):#get the cartesian points from a trilinear vertex matrix
+def get_cartesian_tri(xxx_todo_changeme6, params):#get the cartesian points from a trilinear vertex matrix
+    ((t11,t12,t13),(t21,t22,t23),(t31,t32,t33)) = xxx_todo_changeme6
     p1=get_cartesian_pt( (t11,t12,t13), params )
     p2=get_cartesian_pt( (t21,t22,t23), params )
     p3=get_cartesian_pt( (t31,t32,t33), params )
diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py
index 59b136d09c..8d87576b06 100755
--- a/share/extensions/dxf_outlines.py
+++ b/share/extensions/dxf_outlines.py
@@ -49,7 +49,9 @@ except:
     inkex.errormsg(_("Failed to import the numpy or numpy.linalg modules. These modules are required by this extension. Please install them and try again."))
     inkex.sys.exit()
 
-def pointdistance((x1,y1),(x2,y2)):
+def pointdistance(_x1_y1, _x2_y2):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return math.sqrt(((x2 - x1) ** 2) + ((y2 - y1) ** 2))
 
 def get_fit(u, csp, col):
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index 27fedd9a5f..8c312784fa 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -99,7 +99,8 @@ except:
     exit()
 
 
-def bezierslopeatt(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),t):
+def bezierslopeatt(xxx_todo_changeme20,t):
+	((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme20
 	ax,ay,bx,by,cx,cy,x0,y0=bezmisc.bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
 	dx=3*ax*(t**2)+2*bx*t+cx
 	dy=3*ay*(t**2)+2*by*t+cy
@@ -1349,7 +1350,9 @@ def bounds_intersect(a, b) :
 	return not ( (a[0]>b[2]) or (b[0]>a[2]) or (a[1]>b[3]) or (b[1]>a[3]) )
 
 
-def tpoint((x1,y1),(x2,y2),t):
+def tpoint(_x1_y1, _x2_y2, t):
+	(x1, y1) = _x1_y1
+	(x2, y2) = _x2_y2
 	return [x1+t*(x2-x1),y1+t*(y2-y1)]
 
 
@@ -1383,7 +1386,8 @@ def bez_normalized_slope(bez,t):
 ###	Some vector functions
 ################################################################################
 	
-def normalize((x,y)) :
+def normalize(_x_y) :
+	(x, y) = _x_y
 	l = math.sqrt(x**2+y**2)
 	if l == 0 : return [0.,0.]
 	else : 		return [x/l, y/l]
@@ -5189,7 +5193,7 @@ class Gcodetools(inkex.Effect):
 		eye_dist = 100 #3D constant. Try varying it for your eyes
 
 
-		def bisect((nx1,ny1),(nx2,ny2)) :
+		def bisect(_nx1_ny1, _nx2_ny2) :
 			"""LT Find angle bisecting the normals n1 and n2
 
 			Parameters: Normalised normals
@@ -5199,6 +5203,8 @@ class Gcodetools(inkex.Effect):
 			Note that bisect(n1,n2) and bisect(n2,n1) give opposite sinBis2 results
 			If sinturn is less than the user's requested angle tolerance, I return 0
 			"""
+			(nx1, ny1) = _nx1_ny1
+			(nx2, ny2) = _nx2_ny2
 			#We can get absolute value of cos(bisector vector)
 			#Note: Need to use max in case of rounding errors
 			cosBis = math.sqrt(max(0,(1.0+nx1*nx2-ny1*ny2)/2.0))
@@ -5219,7 +5225,7 @@ class Gcodetools(inkex.Effect):
 			return (cosBis/costurn,sinBis/costurn, sinturn)
 			#end bisect
 
-		def get_radius_to_line((x1,y1),(nx1,ny1), (nx2,ny2),(x2,y2),(nx23,ny23),(x3,y3),(nx3,ny3)):
+		def get_radius_to_line(_x1_y1, _nx1_ny1, _nx2_ny2, _x2_y2, _nx23_ny23, _x3_y3, _nx3_ny3):
 			"""LT find biggest circle we can engrave here, if constrained by line 2-3
 
 			Parameters:
@@ -5245,7 +5251,13 @@ class Gcodetools(inkex.Effect):
 			# Algorithm uses dot products of normals to find radius
 			# and hence coordinates of centre
 			"""
-
+			(x1, y1) = _x1_y1
+			(nx1, ny1) = _nx1_ny1
+			(nx2, ny2) = _nx2_ny2
+			(x2, y2) = _x2_y2
+			(nx23, ny23) = _nx23_ny23
+			(x3, y3) = _x3_y3
+			(nx3, ny3) = _nx3_ny3
 			global max_dist
 
 			#Start by converting coordinates to be relative to x1,y1
@@ -5279,7 +5291,7 @@ class Gcodetools(inkex.Effect):
 			return min(r, max_dist)
 			#end of get_radius_to_line
 
-		def get_radius_to_point((x1,y1),(nx,ny), (x2,y2)):
+		def get_radius_to_point(_x1_y1, _nx_ny, _x2_y2):
 			"""LT find biggest circle we can engrave here, constrained by point x2,y2
 
 			This function can be used in three ways:
@@ -5293,7 +5305,9 @@ class Gcodetools(inkex.Effect):
 			It turns out that finding a circle touching a point is harder than a circle
 			touching a line.
 			"""
-
+			(x1, y1) = _x1_y1
+			(nx, ny) = _nx_ny
+			(x2, y2) = _x2_y2
 			global max_dist
 
 			#Start by converting coordinates to be relative to x1,y1
@@ -5356,7 +5370,7 @@ class Gcodetools(inkex.Effect):
 			return bez_divide(a,[abx,aby],[abcx,abcy],m) + bez_divide(m,[bcdx,bcdy],[cdx,cdy],d)
 			#end of bez_divide
 
-		def get_biggest((x1,y1),(nx,ny)):
+		def get_biggest(_x1_y1, _nx_ny):
 			"""LT Find biggest circle we can draw inside path at point x1,y1 normal nx,ny
 
 			Parameters:
@@ -5366,6 +5380,8 @@ class Gcodetools(inkex.Effect):
 				tuple (j,i,r)
 				..where j and i are indices of limiting segment, r is radius
 			"""
+			(x1, y1) = _x1_y1
+			(nx, ny) = _nx_ny
 			global max_dist, nlLT, i, j
 			n1 = nlLT[j][i-1] #current node
 			jjmin = -1
@@ -5414,7 +5430,7 @@ class Gcodetools(inkex.Effect):
 			return (jjmin,iimin,r)
 			#end of get_biggest
 
-		def line_divide((x0,y0),j0,i0,(x1,y1),j1,i1,(nx,ny),length):
+		def line_divide(_x0_y0, j0, i0, _x1_y1, j1, i1, _nx_ny, length):
 			"""LT recursively divide a line as much as necessary
 
 			NOTE: This function is not currently used
@@ -5429,6 +5445,9 @@ class Gcodetools(inkex.Effect):
 					each a list of 3 reals: x, y coordinates, radius
 
 			"""
+			(x0, y0) = _x0_y0
+			(x1, y1) = _x1_y1
+			(nx, ny) = _nx_ny
 			global nlLT, i, j, lmin
 			x2=(x0+x1)/2
 			y2=(y0+y1)/2
@@ -5441,12 +5460,13 @@ class Gcodetools(inkex.Effect):
 			return [ line_divide((x0,y0),j0,i0,(x2,y2),j2,i2,(nx,ny),length/2), line_divide((x2,y2),j2,i2,(x1,y1),j1,i1,(nx,ny),length/2)]
 			#end of line_divide()
 
-		def save_point((x,y),w,i,j,ii,jj):
+		def save_point(_x_y,w,i,j,ii,jj):
 			"""LT Save this point and delete previous one if linear
 
 			The point is, we generate tons of points but many may be in a straight 3D line.
 			There is no benefit in saving the imtermediate points.
 			"""
+			(x, y) = _x_y
 			global wl, cspm
 			x=round(x,4) #round to 4 decimals
 			y=round(y,4) #round to 4 decimals
@@ -5474,13 +5494,15 @@ class Gcodetools(inkex.Effect):
 			wl+=[w]
 			#end of save_point
 
-		def draw_point((x0,y0),(x,y),w,t):
+		def draw_point(_x0_y0, _x_y,w,t):
 			"""LT Draw this point as a circle with a 1px dot in the middle (x,y) 
 			and a 3D line from (x0,y0) down to x,y. 3D line thickness should be t/2 
 
 			Note that points that are subsequently erased as being unneeded do get
 			displayed, but this helps the user see the total area covered.
 			"""
+			(x0, y0) = _x0_y0
+			(x, y) = _x_y
 			global gcode_3Dleft ,gcode_3Dright
 			if self.options.engraving_draw_calculation_paths :
 				inkex.etree.SubElement(	engraving_group, inkex.addNS('path','svg'), 
diff --git a/share/extensions/interp.py b/share/extensions/interp.py
index 1754e82c55..ea0889743a 100755
--- a/share/extensions/interp.py
+++ b/share/extensions/interp.py
@@ -24,11 +24,15 @@ def interpcoord(v1,v2,p):
     return v1+((v2-v1)*p)
 def interppoints(p1,p2,p):
     return [interpcoord(p1[0],p2[0],p),interpcoord(p1[1],p2[1],p)]
-def pointdistance((x1,y1),(x2,y2)):
+def pointdistance(_x1_y1, _x2_y2):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return math.sqrt(((x2 - x1) ** 2) + ((y2 - y1) ** 2))
 def bezlenapprx(sp1, sp2):
     return pointdistance(sp1[1], sp1[2]) + pointdistance(sp1[2], sp2[0]) + pointdistance(sp2[0], sp2[1])
-def tpoint((x1,y1), (x2,y2), t = 0.5):
+def tpoint(_x1_y1, _x2_y2, t = 0.5):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return [x1+t*(x2-x1),y1+t*(y2-y1)]
 def cspbezsplit(sp1, sp2, t = 0.5):
     m1=tpoint(sp1[1],sp1[2],t)
diff --git a/share/extensions/jitternodes.py b/share/extensions/jitternodes.py
index d6f5ce36d1..b8c20d1046 100755
--- a/share/extensions/jitternodes.py
+++ b/share/extensions/jitternodes.py
@@ -19,7 +19,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 '''
 import random, math, inkex, cubicsuperpath
 
-def randomize((x, y), rx, ry, dist):
+def randomize(_x_y, rx, ry, dist):
+    (x, y) = _x_y
 
     if dist == "Gaussian":
         r1 = random.gauss(0.0,rx)
diff --git a/share/extensions/measure.py b/share/extensions/measure.py
index d025f142c6..f6ce082752 100755
--- a/share/extensions/measure.py
+++ b/share/extensions/measure.py
@@ -73,11 +73,15 @@ def interpcoord(v1,v2,p):
     return v1+((v2-v1)*p)
 def interppoints(p1,p2,p):
     return [interpcoord(p1[0],p2[0],p),interpcoord(p1[1],p2[1],p)]
-def pointdistance((x1,y1),(x2,y2)):
+def pointdistance(_x1_y1, _x2_y2):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return math.sqrt(((x2 - x1) ** 2) + ((y2 - y1) ** 2))
 def bezlenapprx(sp1, sp2):
     return pointdistance(sp1[1], sp1[2]) + pointdistance(sp1[2], sp2[0]) + pointdistance(sp2[0], sp2[1])
-def tpoint((x1,y1), (x2,y2), t = 0.5):
+def tpoint(_x1_y1, _x2_y2, t = 0.5):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return [x1+t*(x2-x1),y1+t*(y2-y1)]
 def cspbezsplit(sp1, sp2, t = 0.5):
     m1=tpoint(sp1[1],sp1[2],t)
diff --git a/share/extensions/motion.py b/share/extensions/motion.py
index 3af80d5c13..6046665dcb 100755
--- a/share/extensions/motion.py
+++ b/share/extensions/motion.py
@@ -30,7 +30,8 @@ class Motion(inkex.Effect):
                         dest="magnitude", default=100.0,
                         help="magnitude of the motion vector")    
 
-    def makeface(self,last,(cmd, params)):
+    def makeface(self,last, xxx_todo_changeme):
+        (cmd, params) = xxx_todo_changeme
         a = []
         a.append(['M',last[:]])
         a.append([cmd, params[:]])
diff --git a/share/extensions/polyhedron_3d.py b/share/extensions/polyhedron_3d.py
index a74a64e694..c39d351749 100755
--- a/share/extensions/polyhedron_3d.py
+++ b/share/extensions/polyhedron_3d.py
@@ -139,7 +139,8 @@ def get_obj_data(obj, name):
 
 #RENDERING AND SVG OUTPUT FUNCTIONS
 
-def draw_SVG_dot((cx, cy), st, name, parent):
+def draw_SVG_dot(_cx_cy, st, name, parent):
+    (cx, cy) = _cx_cy
     style = { 'stroke': '#000000', 'stroke-width':str(st.th), 'fill': st.fill, 'stroke-opacity':st.s_opac, 'fill-opacity':st.f_opac}
     circ_attribs = {'style':simplestyle.formatStyle(style),
                     inkex.addNS('label','inkscape'):name,
@@ -147,7 +148,9 @@ def draw_SVG_dot((cx, cy), st, name, parent):
                     'cx':str(cx), 'cy':str(-cy)}
     inkex.etree.SubElement(parent, inkex.addNS('circle','svg'), circ_attribs )
     
-def draw_SVG_line((x1, y1),(x2, y2), st, name, parent):
+def draw_SVG_line(_x1_y1, _x2_y2, st, name, parent):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     style = { 'stroke': '#000000', 'stroke-width':str(st.th), 'stroke-linecap':st.linecap}
     line_attribs = {'style':simplestyle.formatStyle(style),
                     inkex.addNS('label','inkscape'):name,
@@ -186,8 +189,9 @@ def draw_faces( faces_data, pts, obj, shading, fill_col,st, parent):
         face_no = face[3]#the number of the face to draw
         draw_SVG_poly(pts, obj.fce[ face_no ], st, 'Face:'+str(face_no), parent)
 
-def get_darkened_colour( (r,g,b), factor):
+def get_darkened_colour(_r_g_b, factor):
 #return a hex triplet of colour, reduced in lightness proportionally to a value between 0 and 1
+    (r, g, b) = _r_g_b
     return  '#' + "%02X" % floor( factor*r ) \
                 + "%02X" % floor( factor*g ) \
                 + "%02X" % floor( factor*b ) #make the colour string
diff --git a/share/extensions/pturtle.py b/share/extensions/pturtle.py
index a4925bf4ca..d3cc3e90ff 100755
--- a/share/extensions/pturtle.py
+++ b/share/extensions/pturtle.py
@@ -55,7 +55,8 @@ class pTurtle:
     def clear(self):
         self.clean()
         self.home()
-    def setpos(self,(x,y)):
+    def setpos(self, _x_y):
+        (x, y) = _x_y
         if self.__new:
             self.__path += "M"+",".join([str(i) for i in self.__pos])
             self.__new = False
@@ -68,7 +69,8 @@ class pTurtle:
         self.__heading = deg
     def getheading(self):
         return self.__heading
-    def sethome(self,(x,y)):
+    def sethome(self, _x_y):
+        (x, y) = _x_y
         self.__home = [x, y]
     def getPath(self):
         return self.__path
diff --git a/share/extensions/render_barcode_datamatrix.py b/share/extensions/render_barcode_datamatrix.py
index 659e74de6a..a012db9412 100755
--- a/share/extensions/render_barcode_datamatrix.py
+++ b/share/extensions/render_barcode_datamatrix.py
@@ -95,8 +95,9 @@ symbols = {
 #=====================================================================
     
 #create a 2d list corresponding to the 1's and 0s of the DataMatrix
-def encode(text, (nrow, ncol) ):
+def encode(text, xxx_todo_changeme ):
     #retreive the parameters of this size of DataMatrix
+    (nrow, ncol) = xxx_todo_changeme
     data_nrow, data_ncol, reg_row, reg_col, nd, nc, inter = get_parameters( nrow, ncol )
 
     if not ((nrow == 144) and (ncol == 144)):   #we have a regular datamatrix
@@ -510,8 +511,9 @@ def utah(array, nrow, ncol, row, col, char):
 
 #"place_bits" fills an nrow x ncol array with the bits from the 
 # codewords in data. 
-def place_bits(data, (nrow, ncol)): 
+def place_bits(data, xxx_todo_changeme1): 
 # First, fill the array[] with invalid entries */ 
+    (nrow, ncol) = xxx_todo_changeme1
     INVALID = 2
     array = [[INVALID] * ncol for i in xrange(nrow)]   #initialise and fill with -1's (invalid value)
 # Starting in the correct location for character #1, bit 8,...
@@ -609,7 +611,9 @@ def add_finder_pattern( array, data_nrow, data_ncol, reg_row, reg_col ):
 #=====================================================================
 
 #SVG element generation routine
-def draw_SVG_square((w,h), (x,y), parent):
+def draw_SVG_square(_w_h, _x_y, parent):
+    (w, h) = _w_h
+    (x, y) = _x_y
 
     style = {   'stroke'        : 'none',
                 'stroke-width'  : '1',
diff --git a/share/extensions/straightseg.py b/share/extensions/straightseg.py
index 9222ed5b5c..d477dbdf07 100755
--- a/share/extensions/straightseg.py
+++ b/share/extensions/straightseg.py
@@ -18,7 +18,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 '''
 import math, inkex, simplepath, sys
 
-def pointAtPercent((x1, y1), (x2, y2), percent):
+def pointAtPercent(_x1_y1, _x2_y2, percent):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     percent /= 100.0
     x = x1 + (percent * (x2 - x1))
     y = y1 + (percent * (y2 - y1))
diff --git a/share/extensions/summersnight.py b/share/extensions/summersnight.py
index abc9327e54..3714e47e5f 100755
--- a/share/extensions/summersnight.py
+++ b/share/extensions/summersnight.py
@@ -116,7 +116,8 @@ class Project(inkex.Effect):
         simpletransform.applyTransformToPath(mat, p)
         path.set('d',cubicsuperpath.formatPath(p))
 
-    def trafopoint(self,(x,y)):
+    def trafopoint(self, _x_y):
+        (x, y) = _x_y
         #Transform algorithm thanks to Jose Hevia (freon)
         vector = Segment(Point(self.q['x'],self.q['y']),Point(x,y))
         xratio = abs(vector.delta_x())/self.q['width']
diff --git a/share/extensions/triangle.py b/share/extensions/triangle.py
index 32bd2a1db8..19e0177d7c 100755
--- a/share/extensions/triangle.py
+++ b/share/extensions/triangle.py
@@ -37,7 +37,11 @@ import simplestyle, sys
 from simpletransform import computePointInNode
 from math import *
 
-def draw_SVG_tri( (x1, y1), (x2, y2), (x3, y3), (ox,oy), width, name, parent):
+def draw_SVG_tri(_x1_y1, _x2_y2, _x3_y3, _ox_oy, width, name, parent):
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
+    (x3, y3) = _x3_y3
+    (ox, oy) = _ox_oy
     style = { 'stroke': '#000000', 'stroke-width':str(width), 'fill': 'none' }
     tri_attribs = {'style':simplestyle.formatStyle(style),
                     inkex.addNS('label','inkscape'):name,
@@ -63,7 +67,9 @@ def pt_on_circ(radius, angle): #return the x,y coordinate of the polar coordinat
     y = radius * sin(angle)
     return [x, y]
 
-def v_add( (x1,y1),(x2,y2) ):#add an offset to coordinates
+def v_add(_x1_y1, _x2_y2):#add an offset to coordinates
+    (x1, y1) = _x1_y1
+    (x2, y2) = _x2_y2
     return [x1+x2, y1+y2]
 
 def is_valid_tri_from_sides(a,b,c):#check whether triangle with sides a,b,c is valid
diff --git a/share/extensions/wireframe_sphere.py b/share/extensions/wireframe_sphere.py
index 9a8d646e31..870b75413b 100755
--- a/share/extensions/wireframe_sphere.py
+++ b/share/extensions/wireframe_sphere.py
@@ -63,7 +63,9 @@ from simpletransform import computePointInNode
 
 
 #SVG OUTPUT FUNCTIONS ================================================
-def draw_SVG_ellipse((rx, ry), (cx, cy), width, parent, start_end=(0,2*pi),transform='' ):
+def draw_SVG_ellipse(_rx_ry, _cx_cy, width, parent, start_end=(0,2*pi),transform='' ):
+    (rx, ry) = _rx_ry
+    (cx, cy) = _cx_cy
 
     style = {   'stroke'        : '#000000',
                 'stroke-width'  : str(width),
-- 
2.21.0


From 0cf86ada6273eaa5820db5563fe97061e9140f2f Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 10:42:04 +0100
Subject: [PATCH 05/17] extensions 2to3: imports urllib

---
 share/extensions/dxf_input.py                | 9 +++++++--
 share/extensions/embedimage.py               | 9 +++++++--
 share/extensions/gcodetools.py               | 9 ++++++---
 share/extensions/hpgl_decoder.py             | 7 ++++++-
 share/extensions/hpgl_input.py               | 1 -
 share/extensions/svg_and_media_zip_output.py | 9 +++++++--
 share/extensions/tar_layers.py               | 5 ++++-
 7 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py
index cd0e508b59..65a6963528 100755
--- a/share/extensions/dxf_input.py
+++ b/share/extensions/dxf_input.py
@@ -23,8 +23,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 '''
 
 import inkex, simplestyle, math
-from StringIO import StringIO
-from urllib import quote
+import sys
+if sys.version_info[0] < 3:
+    from StringIO import StringIO
+    from urllib import quote
+else:
+    from io import StringIO
+    from urllib.parse import quote
 
 
 def export_MTEXT():
diff --git a/share/extensions/embedimage.py b/share/extensions/embedimage.py
index 9ebe084a32..4f8db2fd03 100755
--- a/share/extensions/embedimage.py
+++ b/share/extensions/embedimage.py
@@ -20,8 +20,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 import base64
 import os
 import sys
-import urllib
-import urlparse
+if sys.version_info[0] < 3:
+    import urllib
+    import urlparse
+else:
+    import urllib.request as urllib
+    import urllib.parse as urlparse
+
 # local library
 import inkex
 
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index 8c312784fa..d1656bae1c 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -6322,9 +6322,12 @@ G01 Z1 (going to cutting z)\n""",
 	
 	def update(self) :
 		try :
-			import urllib
-			f = urllib.urlopen("http://www.cnc-club.ru/gcodetools_latest_version", proxies = urllib.getproxies())
-			a = f.read()
+			if sys.version_info[0] < 3:
+				import urllib2
+			else:
+				import urllib.request as urllib2
+			f = urllib2.urlopen("http://www.cnc-club.ru/gcodetools_latest_version")
+			a = f.read().decode()
 			for s in a.split("\n") :
 				r = re.search(r"Gcodetools\s+latest\s+version\s*=\s*(.*)",s)
 				if r : 
diff --git a/share/extensions/hpgl_decoder.py b/share/extensions/hpgl_decoder.py
index 8f3c18e420..bbedf9f225 100644
--- a/share/extensions/hpgl_decoder.py
+++ b/share/extensions/hpgl_decoder.py
@@ -19,7 +19,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 # standard libraries
 import math
-from StringIO import StringIO
+import sys
+if sys.version_info[0] < 3:
+    from StringIO import StringIO
+else:
+    from io import StringIO
+
 # local library
 import inkex
 
diff --git a/share/extensions/hpgl_input.py b/share/extensions/hpgl_input.py
index 37607358bc..f9b8465dd3 100755
--- a/share/extensions/hpgl_input.py
+++ b/share/extensions/hpgl_input.py
@@ -20,7 +20,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 # standard libraries
 import sys
-from StringIO import StringIO
 # local libraries
 import hpgl_decoder
 import inkex
diff --git a/share/extensions/svg_and_media_zip_output.py b/share/extensions/svg_and_media_zip_output.py
index 1a148f8a8a..51887e5b53 100755
--- a/share/extensions/svg_and_media_zip_output.py
+++ b/share/extensions/svg_and_media_zip_output.py
@@ -37,8 +37,6 @@ TODOs
 - consider switching to lzma in order to allow cross platform compression with no encoding problem...
 '''
 # standard library
-import urlparse
-import urllib
 import os, os.path
 import string
 import zipfile
@@ -50,6 +48,13 @@ import locale
 import inkex
 import simplestyle
 
+if sys.version_info[0] < 3:
+    import urllib
+    import urlparse
+else:
+    import urllib.request as urllib
+    import urllib.parse as urlparse
+
 locale.setlocale(locale.LC_ALL, '')
 inkex.localize()  # TODO: test if it's still needed now that localize is called from inkex.
 
diff --git a/share/extensions/tar_layers.py b/share/extensions/tar_layers.py
index 186e3c4689..8b60d889d1 100755
--- a/share/extensions/tar_layers.py
+++ b/share/extensions/tar_layers.py
@@ -25,7 +25,10 @@ import os
 import sys
 import copy
 import tarfile
-import StringIO
+if sys.version_info[0] < 3:
+    import StringIO
+else:
+    import io as StringIO
 import calendar
 import time
 
-- 
2.21.0


From b0aea05e7a287fb6be8b18a3fec812b367310dd5 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 11:10:14 +0100
Subject: [PATCH 06/17] extensions 2to3: unicode

---
 share/extensions/dxf_input.py                |  1 +
 share/extensions/embedimage.py               |  6 +--
 share/extensions/gcodetools.py               |  4 ++
 share/extensions/inkex.py                    |  3 ++
 share/extensions/jessyInk_transitions.py     |  4 ++
 share/extensions/render_barcode_qrcode.py    |  4 ++
 share/extensions/svg_and_media_zip_output.py |  4 ++
 share/extensions/svgcalendar.py              |  4 ++
 share/extensions/text_braille.py             | 52 ++++++++++----------
 9 files changed, 52 insertions(+), 30 deletions(-)

diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py
index 65a6963528..91e7a02e21 100755
--- a/share/extensions/dxf_input.py
+++ b/share/extensions/dxf_input.py
@@ -30,6 +30,7 @@ if sys.version_info[0] < 3:
 else:
     from io import StringIO
     from urllib.parse import quote
+    unicode = lambda s, enc: s.decode(enc) if isinstance(s, bytes) else s
 
 
 def export_MTEXT():
diff --git a/share/extensions/embedimage.py b/share/extensions/embedimage.py
index 4f8db2fd03..4e5ce585de 100755
--- a/share/extensions/embedimage.py
+++ b/share/extensions/embedimage.py
@@ -79,10 +79,8 @@ class Embedder(inkex.Effect):
                 if (absref != None):
                     path=absref
 
-            try:
-                path=unicode(path, "utf-8")
-            except TypeError:
-                path=path
+            if isinstance(path, bytes):
+                path = path.decode("utf-8")
                 
             if (not os.path.isfile(path)):
                 inkex.errormsg(_('No xlink:href or sodipodi:absref attributes found, or they do not point to an existing file! Unable to embed image.'))
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index d1656bae1c..dc38eaa796 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -80,6 +80,10 @@ import time
 import cmath
 import codecs
 import random
+
+if sys.version_info[0] >= 3:
+    unicode = lambda s: s.decode() if isinstance(s, bytes) else str(s)
+
 # local library
 import inkex
 import simplestyle
diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py
index 9d3bb0c6dc..8a94c55cc1 100755
--- a/share/extensions/inkex.py
+++ b/share/extensions/inkex.py
@@ -35,6 +35,9 @@ import re
 import sys
 from math import *
 
+if sys.version_info[0] >= 3:
+    unicode = str
+
 # a dictionary of all of the xmlns prefixes in a standard inkscape doc
 NSS = {
 u'sodipodi' :u'http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd',
diff --git a/share/extensions/jessyInk_transitions.py b/share/extensions/jessyInk_transitions.py
index f463b2fb5d..9997799a19 100755
--- a/share/extensions/jessyInk_transitions.py
+++ b/share/extensions/jessyInk_transitions.py
@@ -16,6 +16,10 @@
 # These lines are only needed if you don't put the script directly into
 # the installation directory
 import sys
+
+if sys.version_info[0] >= 3:
+    unicode = lambda s, enc: s
+
 # Unix
 sys.path.append('/usr/share/inkscape/extensions')
 # OS X
diff --git a/share/extensions/render_barcode_qrcode.py b/share/extensions/render_barcode_qrcode.py
index d829eb0604..9e86296077 100755
--- a/share/extensions/render_barcode_qrcode.py
+++ b/share/extensions/render_barcode_qrcode.py
@@ -3,6 +3,10 @@
 from __future__ import print_function
 
 import math, sys
+
+if sys.version_info[0] >= 3:
+    unicode = lambda s, enc: s.decode(enc) if isinstance(s, bytes) else s
+
 import inkex
 from simpletransform import computePointInNode
 
diff --git a/share/extensions/svg_and_media_zip_output.py b/share/extensions/svg_and_media_zip_output.py
index 51887e5b53..f3df1d9908 100755
--- a/share/extensions/svg_and_media_zip_output.py
+++ b/share/extensions/svg_and_media_zip_output.py
@@ -44,6 +44,10 @@ import shutil
 import sys
 import tempfile
 import locale
+
+if sys.version_info[0] >= 3:
+    unicode = lambda s, enc: s.decode(enc) if isinstance(s, bytes) else s
+
 # local library
 import inkex
 import simplestyle
diff --git a/share/extensions/svgcalendar.py b/share/extensions/svgcalendar.py
index 29dee262bb..b0f9d1a2b4 100755
--- a/share/extensions/svgcalendar.py
+++ b/share/extensions/svgcalendar.py
@@ -34,6 +34,10 @@ import calendar
 import re
 from datetime import *
 
+import sys
+if sys.version_info[0] >= 3:
+    unicode = lambda s, enc: s.decode(enc) if isinstance(s, bytes) else s
+
 import inkex
 import simplestyle
 
diff --git a/share/extensions/text_braille.py b/share/extensions/text_braille.py
index d778f19eac..2a220bbeee 100755
--- a/share/extensions/text_braille.py
+++ b/share/extensions/text_braille.py
@@ -4,32 +4,32 @@
 import chardataeffect, inkex, string
 
 convert_table = {\
-'a': unicode("⠁", "utf-8"),\
-'b': unicode("⠃", "utf-8"),\
-'c': unicode("⠉", "utf-8"),\
-'d': unicode("⠙", "utf-8"),\
-'e': unicode("⠑", "utf-8"),\
-'f': unicode("⠋", "utf-8"),\
-'g': unicode("⠛", "utf-8"),\
-'h': unicode("⠓", "utf-8"),\
-'i': unicode("⠊", "utf-8"),\
-'j': unicode("⠚", "utf-8"),\
-'k': unicode("⠅", "utf-8"),\
-'l': unicode("⠇", "utf-8"),\
-'m': unicode("⠍", "utf-8"),\
-'n': unicode("⠝", "utf-8"),\
-'o': unicode("⠕", "utf-8"),\
-'p': unicode("⠏", "utf-8"),\
-'q': unicode("⠟", "utf-8"),\
-'r': unicode("⠗", "utf-8"),\
-'s': unicode("⠎", "utf-8"),\
-'t': unicode("⠞", "utf-8"),\
-'u': unicode("⠥", "utf-8"),\
-'v': unicode("⠧", "utf-8"),\
-'w': unicode("⠺", "utf-8"),\
-'x': unicode("⠭", "utf-8"),\
-'y': unicode("⠽", "utf-8"),\
-'z': unicode("⠵", "utf-8"),\
+'a': u'\u2801',
+'c': u'\u2809',
+'b': u'\u2803',
+'e': u'\u2811',
+'d': u'\u2819',
+'g': u'\u281b',
+'f': u'\u280b',
+'i': u'\u280a',
+'h': u'\u2813',
+'k': u'\u2805',
+'j': u'\u281a',
+'m': u'\u280d',
+'l': u'\u2807',
+'o': u'\u2815',
+'n': u'\u281d',
+'q': u'\u281f',
+'p': u'\u280f',
+'s': u'\u280e',
+'r': u'\u2817',
+'u': u'\u2825',
+'t': u'\u281e',
+'w': u'\u283a',
+'v': u'\u2827',
+'y': u'\u283d',
+'x': u'\u282d',
+'z': u'\u2835',
 }
 
 class C(chardataeffect.CharDataEffect):
-- 
2.21.0


From 7edcb7389e9abc1c09bf2b03002f167451b609b3 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 11:26:00 +0100
Subject: [PATCH 07/17] extensions 2to3: xrange

---
 share/extensions/addnodes.py                  |  4 ++--
 share/extensions/bezmisc.py                   |  2 +-
 share/extensions/gcodetools.py                | 10 +++++++---
 share/extensions/interp.py                    |  2 +-
 share/extensions/measure.py                   |  2 +-
 share/extensions/render_barcode_datamatrix.py |  5 +++++
 6 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/share/extensions/addnodes.py b/share/extensions/addnodes.py
index a2f70c885f..bd1440102a 100755
--- a/share/extensions/addnodes.py
+++ b/share/extensions/addnodes.py
@@ -51,7 +51,7 @@ def csplength(csp):
     lengths = []
     for sp in csp:
         lengths.append([])
-        for i in xrange(1,len(sp)):
+        for i in range(1,len(sp)):
             l = cspseglength(sp[i-1],sp[i])
             lengths[-1].append(l)
             total += l            
@@ -102,7 +102,7 @@ class SplitIt(inkex.Effect):
                         else:
                             splits = math.ceil(length/self.options.max)
 
-                        for s in xrange(int(splits),1,-1):
+                        for s in range(int(splits),1,-1):
                             new[-1][-1], next, sub[i] = cspbezsplitatlength(new[-1][-1], sub[i], 1.0/s)
                             new[-1].append(next[:])
                         new[-1].append(sub[i])
diff --git a/share/extensions/bezmisc.py b/share/extensions/bezmisc.py
index a563178868..359db54213 100755
--- a/share/extensions/bezmisc.py
+++ b/share/extensions/bezmisc.py
@@ -220,7 +220,7 @@ def Simpson(f, a, b, n_limit, tolerance):
         asum += bsum
         bsum = 0.0
         est0 = est1
-        for i in xrange(1, n, 2):
+        for i in range(1, n, 2):
             bsum += f(a + (i * interval))
             est1 = multiplier * (endsum + (2.0 * asum) + (4.0 * bsum))
     #print multiplier, endsum, interval, asum, bsum, est1, est0
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index dc38eaa796..590aa2209e 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -83,6 +83,10 @@ import random
 
 if sys.version_info[0] >= 3:
     unicode = lambda s: s.decode() if isinstance(s, bytes) else str(s)
+    xrange = range
+    range_list = lambda *a: list(range(*a))
+else:
+    range_list = range
 
 # local library
 import inkex
@@ -3036,7 +3040,7 @@ class Arangement_Genetic:
 	def add_random_species(self,count):
 		for i in range(count):
 			specimen = []
-			order = range(self.genes_count)
+			order = range_list(self.genes_count)
 			random.shuffle(order)
 			for j in order:
 				specimen += [ [j, random.random(), random.random()] ]
@@ -3125,7 +3129,7 @@ class Arangement_Genetic:
 				specimen[i] = [parent1[i][0], parent1[i][1]*tr+parent2[i][1]*(1-tr),parent1[i][2]*tp+parent2[i][2]*(1-tp)]
 				genes_order += [ parent1[i][0] ]
 
-			for i in range(0,start_gene)+range(end_gene,self.genes_count) : 
+			for i in range_list(0,start_gene)+range_list(end_gene,self.genes_count) : 
 				tr = 0. #rotation_mutate_param
 				tp = 0. #xposition_mutate_param
 				j = i 
@@ -3727,7 +3731,7 @@ class Gcodetools(inkex.Effect):
 			
 
 			### Sort to reduce Rapid distance	
-			k = range(1,len(p))
+			k = range_list(1,len(p))
 			keys = [0]
 			while len(k)>0:
 				end = p[keys[-1]][-1][1]
diff --git a/share/extensions/interp.py b/share/extensions/interp.py
index ea0889743a..7d6b6fa454 100755
--- a/share/extensions/interp.py
+++ b/share/extensions/interp.py
@@ -54,7 +54,7 @@ def csplength(csp):
     lengths = []
     for sp in csp:
         lengths.append([])
-        for i in xrange(1,len(sp)):
+        for i in range(1,len(sp)):
             l = cspseglength(sp[i-1],sp[i])
             lengths[-1].append(l)
             total += l            
diff --git a/share/extensions/measure.py b/share/extensions/measure.py
index f6ce082752..7a8bf96e15 100755
--- a/share/extensions/measure.py
+++ b/share/extensions/measure.py
@@ -103,7 +103,7 @@ def csplength(csp):
     lengths = []
     for sp in csp:
         lengths.append([])
-        for i in xrange(1,len(sp)):
+        for i in range(1,len(sp)):
             l = cspseglength(sp[i-1],sp[i])
             lengths[-1].append(l)
             total += l
diff --git a/share/extensions/render_barcode_datamatrix.py b/share/extensions/render_barcode_datamatrix.py
index a012db9412..7c6c333459 100755
--- a/share/extensions/render_barcode_datamatrix.py
+++ b/share/extensions/render_barcode_datamatrix.py
@@ -51,6 +51,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
     0.50    2009-10-25  Full functionality, up to 144x144.
                         ASCII and compressed digit encoding only.
 '''
+
+import sys
+if sys.version_info[0] >= 3:
+    xrange = range
+
 # local library
 import inkex
 import simplestyle
-- 
2.21.0


From 9fcc4c63563521e68abb69e77efcdfc7e4fd4507 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 11:38:21 +0100
Subject: [PATCH 08/17] extensions 2to3: map

---
 share/extensions/layout_nup.py | 2 +-
 share/extensions/restack.py    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/share/extensions/layout_nup.py b/share/extensions/layout_nup.py
index 022aa0d3f4..19e126d080 100755
--- a/share/extensions/layout_nup.py
+++ b/share/extensions/layout_nup.py
@@ -155,7 +155,7 @@ class Nup(inkex.Effect):
         pgSize = self.expandTuple(unit, pgSize, length = 2)
     #    num = tuple(map(lambda ev: eval(str(ev)), num))
 
-        pgEdge = map(sum,zip(pgMargin, pgPadding))
+        pgEdge = list(map(sum,zip(pgMargin, pgPadding)))
 
         top, right, bottom, left = 0,1,2,3
         width, height = 0,1
diff --git a/share/extensions/restack.py b/share/extensions/restack.py
index d38e18b525..79a7565e7f 100755
--- a/share/extensions/restack.py
+++ b/share/extensions/restack.py
@@ -112,7 +112,7 @@ class Restack(inkex.Effect):
         dimen = dict()
         for line in reader:
             if len(line) > 0:
-                dimen[line[0]] = map( float, line[1:])
+                dimen[line[0]] = list(map( float, line[1:]))
 
         if not bsubprocess: #close file if opened using os.popen3
             f.close
-- 
2.21.0


From a46a6cafe06ae9fd991560191e83cb83d1dab770 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 12:05:56 +0100
Subject: [PATCH 09/17] extensions 2to3: dict

---
 share/extensions/addnodes.py               |  2 +-
 share/extensions/chardataeffect.py         |  2 +-
 share/extensions/coloreffect.py            |  2 +-
 share/extensions/convert2dashes.py         |  2 +-
 share/extensions/dimension.py              |  2 +-
 share/extensions/dots.py                   |  2 +-
 share/extensions/dpiswitcher.py            |  4 ++--
 share/extensions/draw_from_triangle.py     |  2 +-
 share/extensions/edge3d.py                 |  2 +-
 share/extensions/embedimage.py             |  2 +-
 share/extensions/extractimage.py           |  2 +-
 share/extensions/extrude.py                |  2 +-
 share/extensions/flatten.py                |  2 +-
 share/extensions/fractalize.py             |  2 +-
 share/extensions/funcplot.py               |  2 +-
 share/extensions/gcodetools.py             |  6 +++---
 share/extensions/handles.py                |  2 +-
 share/extensions/image_attributes.py       |  6 +++---
 share/extensions/inkscape_follow_link.py   |  2 +-
 share/extensions/interp.py                 |  6 +++---
 share/extensions/interp_att_g.py           |  2 +-
 share/extensions/jitternodes.py            |  2 +-
 share/extensions/lorem_ipsum.py            |  2 +-
 share/extensions/markers_strokepaint.py    |  2 +-
 share/extensions/measure.py                |  2 +-
 share/extensions/merge_styles.py           |  8 ++++----
 share/extensions/motion.py                 |  2 +-
 share/extensions/new_glyph_layer.py        |  2 +-
 share/extensions/param_curves.py           |  2 +-
 share/extensions/pathalongpath.py          |  4 ++--
 share/extensions/pathmodifier.py           | 14 +++++++-------
 share/extensions/pathscatter.py            |  4 ++--
 share/extensions/pixelsnap.py              |  2 +-
 share/extensions/replace_font.py           |  2 +-
 share/extensions/restack.py                |  8 ++++----
 share/extensions/simplestyle.py            |  2 +-
 share/extensions/split.py                  |  2 +-
 share/extensions/straightseg.py            |  2 +-
 share/extensions/synfig_fileformat.py      |  2 +-
 share/extensions/text_extract.py           |  6 +++---
 share/extensions/text_merge.py             |  6 +++---
 share/extensions/ungroup_deep.py           |  2 +-
 share/extensions/webslicer_create_group.py |  4 ++--
 share/extensions/whirl.py                  |  2 +-
 44 files changed, 70 insertions(+), 70 deletions(-)

diff --git a/share/extensions/addnodes.py b/share/extensions/addnodes.py
index bd1440102a..1970f330f7 100755
--- a/share/extensions/addnodes.py
+++ b/share/extensions/addnodes.py
@@ -82,7 +82,7 @@ class SplitIt(inkex.Effect):
 
     def effect(self):
 
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 p = cubicsuperpath.parsePath(node.get('d'))
                 
diff --git a/share/extensions/chardataeffect.py b/share/extensions/chardataeffect.py
index f81de6b801..25b0a14e9d 100755
--- a/share/extensions/chardataeffect.py
+++ b/share/extensions/chardataeffect.py
@@ -32,7 +32,7 @@ class CharDataEffect(inkex.Effect):
     if len(self.selected)==0:
       self.recurse(self.document.getroot())
     else:
-      for id,node in self.selected.iteritems():
+      for id,node in self.selected.items():
         self.recurse(node)
 
   def recurse(self,node):
diff --git a/share/extensions/coloreffect.py b/share/extensions/coloreffect.py
index 94e909a728..fbed3c931f 100755
--- a/share/extensions/coloreffect.py
+++ b/share/extensions/coloreffect.py
@@ -36,7 +36,7 @@ class ColorEffect(inkex.Effect):
     if len(self.selected)==0:
       self.getAttribs(self.document.getroot())
     else:
-      for id,node in self.selected.iteritems():
+      for id,node in self.selected.items():
         self.getAttribs(node)
 
   def getAttribs(self,node):
diff --git a/share/extensions/convert2dashes.py b/share/extensions/convert2dashes.py
index f0feee790b..1590c9183f 100755
--- a/share/extensions/convert2dashes.py
+++ b/share/extensions/convert2dashes.py
@@ -52,7 +52,7 @@ class SplitIt(inkex.Effect):
         self.not_converted = []
 
     def effect(self):
-        for i, node in self.selected.iteritems():
+        for i, node in self.selected.items():
             self.convert2dash(node)
         if len(self.not_converted):
             inkex.errormsg(_('Total number of objects not converted: {}\n').format(len(self.not_converted)))
diff --git a/share/extensions/dimension.py b/share/extensions/dimension.py
index e6b2d8f85a..1b3678b66c 100755
--- a/share/extensions/dimension.py
+++ b/share/extensions/dimension.py
@@ -171,7 +171,7 @@ class Dimension(pathmodifier.PathModifier):
         line.set('stroke-width', str(0.5*scale))
         group.append(line)
 
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             group.append(node)
         
         layer.append(group)
diff --git a/share/extensions/dots.py b/share/extensions/dots.py
index 296a56dfc4..d803153d96 100755
--- a/share/extensions/dots.py
+++ b/share/extensions/dots.py
@@ -46,7 +46,7 @@ class Dots(inkex.Effect):
     def effect(self):
         selection = self.selected
         if (selection):
-            for id, node in selection.iteritems():
+            for id, node in selection.items():
                 if node.tag == inkex.addNS('path','svg'):
                     self.addDot(node)
         else:
diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py
index 47bb4458b6..0f8fd4c048 100644
--- a/share/extensions/dpiswitcher.py
+++ b/share/extensions/dpiswitcher.py
@@ -237,9 +237,9 @@ class DPISwitcher(inkex.Effect):
     def parse_length(self, length, percent=False):
         """Parse SVG length."""
         if self.options.switcher == "0":  # dpi90to96
-            known_units = self.__uuconvLegacy.keys()
+            known_units = list(self.__uuconvLegacy.keys())
         else:  # dpi96to90
-            known_units = self.__uuconv.keys()
+            known_units = list(self.__uuconv.keys())
         if percent:
             unitmatch = re.compile('(%s)$' % '|'.join(known_units + ['%']))
         else:
diff --git a/share/extensions/draw_from_triangle.py b/share/extensions/draw_from_triangle.py
index 3b519fe759..3fd0ebb3ff 100755
--- a/share/extensions/draw_from_triangle.py
+++ b/share/extensions/draw_from_triangle.py
@@ -316,7 +316,7 @@ class Draw_From_Triangle(inkex.Effect):
         so = self.options #shorthand
         
         pts = [] #initialise in case nothing is selected and following loop is not executed
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 pts = get_n_points_from_path( node, 3 ) #find the (x,y) coordinates of the first 3 points of the path
 
diff --git a/share/extensions/edge3d.py b/share/extensions/edge3d.py
index 86df529088..513d50a958 100755
--- a/share/extensions/edge3d.py
+++ b/share/extensions/edge3d.py
@@ -72,7 +72,7 @@ class Edge3d(inkex.Effect):
            for the current shade.  shade is a floating point 0-1 white-black"""
         # size of a wedge for shade i, wedges come in pairs
         delta = 360. / self.options.shades / 2.
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 d = node.get('d')
                 p = simplepath.parsePath(d)
diff --git a/share/extensions/embedimage.py b/share/extensions/embedimage.py
index 4e5ce585de..cafe3f1db7 100755
--- a/share/extensions/embedimage.py
+++ b/share/extensions/embedimage.py
@@ -51,7 +51,7 @@ class Embedder(inkex.Effect):
         self.document=document
         self.selected=selected
         if (self.options.ids):
-            for id, node in selected.iteritems():
+            for id, node in selected.items():
                 if node.tag == inkex.addNS('image','svg'):
                     self.embedImage(node)
 
diff --git a/share/extensions/extractimage.py b/share/extensions/extractimage.py
index 031a01560f..87ba6d6422 100755
--- a/share/extensions/extractimage.py
+++ b/share/extensions/extractimage.py
@@ -44,7 +44,7 @@ class MyEffect(inkex.Effect):
         path = self.options.filepath
         if (path != ''):
             if (self.options.ids):
-                for id, node in self.selected.iteritems():
+                for id, node in self.selected.items():
                     if node.tag == inkex.addNS('image','svg'):
                         xlink = node.get(inkex.addNS('href','xlink'))
                         if (xlink[:4]=='data'):
diff --git a/share/extensions/extrude.py b/share/extensions/extrude.py
index b11d0d36c7..2a4d14ff79 100755
--- a/share/extensions/extrude.py
+++ b/share/extensions/extrude.py
@@ -35,7 +35,7 @@ class Extrude(inkex.Effect):
 
     def effect(self):
         paths = []
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == '{http://www.w3.org/2000/svg}path':
                 paths.append(node)
         if len(paths) < 2:
diff --git a/share/extensions/flatten.py b/share/extensions/flatten.py
index 7b4d2a7d62..ccd0373db2 100755
--- a/share/extensions/flatten.py
+++ b/share/extensions/flatten.py
@@ -26,7 +26,7 @@ class MyEffect(inkex.Effect):
                         dest="flat", default=10.0,
                         help="Minimum flatness of the subdivided curves")
     def effect(self):
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 d = node.get('d')
                 p = cubicsuperpath.parsePath(d)
diff --git a/share/extensions/fractalize.py b/share/extensions/fractalize.py
index c6bbe397ac..68ad698026 100755
--- a/share/extensions/fractalize.py
+++ b/share/extensions/fractalize.py
@@ -55,7 +55,7 @@ class PathFractalize(inkex.Effect):
                         dest="smooth", default="4.0",
                         help="Smoothness of the subdivision")
     def effect(self):
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 d = node.get('d')
                 p = simplepath.parsePath(d)
diff --git a/share/extensions/funcplot.py b/share/extensions/funcplot.py
index 557aac302b..3f0e9989d9 100755
--- a/share/extensions/funcplot.py
+++ b/share/extensions/funcplot.py
@@ -251,7 +251,7 @@ class FuncPlot(inkex.Effect):
 
     def effect(self):
         newpath = None
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('rect','svg'):
                 # create new path with basic dimensions of selected rectangle
                 newpath = inkex.etree.Element(inkex.addNS('path','svg'))
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index 590aa2209e..e639310f6d 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -3018,7 +3018,7 @@ class Polygon:
 			self.polygon += [ poly ]
 			# Remove all edges that are intersects new poly (any vertex inside new poly)
 			poly_ = Polygon([poly])
-			for p in edges.keys()[:] : 
+			for p in list(edges.keys()) : 
 				if poly_.point_inside(list(p)) : del edges[p]
 		self.draw(color="Green", width=1)	
 
@@ -4545,7 +4545,7 @@ class Gcodetools(inkex.Effect):
 		self.check_dir() 
 		gcode = ""
 		
-		biarc_group = inkex.etree.SubElement( self.selected_paths.keys()[0] if len(self.selected_paths.keys())>0 else self.layers[0], inkex.addNS('g','svg') )
+		biarc_group = inkex.etree.SubElement( list(self.selected_paths.keys())[0] if len(self.selected_paths)>0 else self.layers[0], inkex.addNS('g','svg') )
 		print_(("self.layers=",self.layers))
 		print_(("paths=",paths))
 		colors = {}
@@ -6038,7 +6038,7 @@ G01 Z1 (going to cutting z)\n""",
 		else :
 			paths = self.selected_paths
 		#	Set group
-		group = inkex.etree.SubElement( self.selected_paths.keys()[0] if len(self.selected_paths.keys())>0 else self.layers[0], inkex.addNS('g','svg') )
+		group = inkex.etree.SubElement( list(self.selected_paths.keys())[0] if len(self.selected_paths)>0 else self.layers[0], inkex.addNS('g','svg') )
 		trans_ = [[1,0.3,0],[0,0.5,0]]	
 
 		self.set_markers()
diff --git a/share/extensions/handles.py b/share/extensions/handles.py
index 6987a3bb22..ffede1cf57 100755
--- a/share/extensions/handles.py
+++ b/share/extensions/handles.py
@@ -20,7 +20,7 @@ import inkex, simplepath, simplestyle
 
 class Handles(inkex.Effect):
     def effect(self):
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 p = simplepath.parsePath(node.get('d'))
                 a =[]
diff --git a/share/extensions/image_attributes.py b/share/extensions/image_attributes.py
index 98cc5204ff..a0bf13daa0 100755
--- a/share/extensions/image_attributes.py
+++ b/share/extensions/image_attributes.py
@@ -105,13 +105,13 @@ class SetAttrImage(inkex.Effect):
 
     def change_selected_only(self, selected, attribute):
         if selected:
-            for node_id, node in selected.iteritems():
+            for node_id, node in selected.items():
                 if node.tag == inkex.addNS('image', 'svg'):
                     self.change_attribute(node, attribute)
 
     def change_in_selection(self, selected, attribute):
         if selected:
-            for node_id, node in selected.iteritems():
+            for node_id, node in selected.items():
                 self.change_all_images(node, attribute)
 
     def change_in_document(self, selected, attribute):
@@ -119,7 +119,7 @@ class SetAttrImage(inkex.Effect):
 
     def change_on_parent_group(self, selected, attribute):
         if selected:
-            for node_id, node in selected.iteritems():
+            for node_id, node in selected.items():
                 self.change_attribute(node.getparent(), attribute)
 
     def change_on_root_only(self, selected, attribute):
diff --git a/share/extensions/inkscape_follow_link.py b/share/extensions/inkscape_follow_link.py
index bf19cb84f4..48e8b8bb57 100755
--- a/share/extensions/inkscape_follow_link.py
+++ b/share/extensions/inkscape_follow_link.py
@@ -19,7 +19,7 @@ class FollowLink(inkex.Effect):
 
     def effect(self):
         if (self.options.ids):
-            for id, node in self.selected.iteritems():
+            for id, node in self.selected.items():
                 if node.tag == inkex.addNS('a','svg'):
                     self.url = node.get(inkex.addNS('href','xlink'))
                     vwswli = VisitWebSiteWithoutLockingInkscape(self.url)
diff --git a/share/extensions/interp.py b/share/extensions/interp.py
index 7d6b6fa454..e7e2fa2dc4 100755
--- a/share/extensions/interp.py
+++ b/share/extensions/interp.py
@@ -134,7 +134,7 @@ class Interp(inkex.Effect):
 
         if self.options.zsort:
             # work around selection order swapping with Live Preview
-            sorted_ids = pathmodifier.zSort(self.document.getroot(),self.selected.keys())
+            sorted_ids = pathmodifier.zSort(self.document.getroot(),list(self.selected.keys()))
         else:
             # use selection order (default)
             sorted_ids = self.options.ids
@@ -209,9 +209,9 @@ class Interp(inkex.Effect):
                         t += l / etotal
                         lengths.setdefault(t,0)
                         lengths[t] += -1
-                sadd = [k for (k,v) in lengths.iteritems() if v < 0]
+                sadd = [k for (k,v) in lengths.items() if v < 0]
                 sadd.sort()
-                eadd = [k for (k,v) in lengths.iteritems() if v > 0]
+                eadd = [k for (k,v) in lengths.items() if v > 0]
                 eadd.sort()
 
                 t = 0
diff --git a/share/extensions/interp_att_g.py b/share/extensions/interp_att_g.py
index 8718caf41f..74abb64344 100755
--- a/share/extensions/interp_att_g.py
+++ b/share/extensions/interp_att_g.py
@@ -121,7 +121,7 @@ class InterpAttG(inkex.Effect):
       if len( self.selected ) > 1:
         # multiple selection
         if self.options.zsort:
-            sorted_ids = zSort(self.document.getroot(),self.selected.keys())
+            sorted_ids = zSort(self.document.getroot(),list(self.selected.keys()))
         else:
             sorted_ids = self.options.ids
         self.collection = list(sorted_ids)
diff --git a/share/extensions/jitternodes.py b/share/extensions/jitternodes.py
index b8c20d1046..a1b1bd83d6 100755
--- a/share/extensions/jitternodes.py
+++ b/share/extensions/jitternodes.py
@@ -83,7 +83,7 @@ class JitterNodes(inkex.Effect):
                         help="The selected UI-tab when OK was pressed")
 
     def effect(self):
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 d = node.get('d')
                 p = cubicsuperpath.parsePath(d)
diff --git a/share/extensions/lorem_ipsum.py b/share/extensions/lorem_ipsum.py
index efb2361ea2..18ee104dd5 100755
--- a/share/extensions/lorem_ipsum.py
+++ b/share/extensions/lorem_ipsum.py
@@ -217,7 +217,7 @@ class MyEffect(inkex.Effect):
   
   def effect(self):
     found=0
-    for id, node in self.selected.iteritems():
+    for id, node in self.selected.items():
       if node.tag == inkex.addNS('flowRoot','svg'):
         found+=1
         if found==1:
diff --git a/share/extensions/markers_strokepaint.py b/share/extensions/markers_strokepaint.py
index 34e2216de1..e685232a0b 100755
--- a/share/extensions/markers_strokepaint.py
+++ b/share/extensions/markers_strokepaint.py
@@ -74,7 +74,7 @@ class MyEffect(inkex.Effect):
         if defs == None:
             defs = inkex.etree.SubElement(self.document.getroot(),inkex.addNS('defs','svg'))
 
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             mprops = ['marker','marker-start','marker-mid','marker-end']
             try:
                 style = simplestyle.parseStyle(node.get('style'))
diff --git a/share/extensions/measure.py b/share/extensions/measure.py
index 7a8bf96e15..faf2d5463e 100755
--- a/share/extensions/measure.py
+++ b/share/extensions/measure.py
@@ -227,7 +227,7 @@ class Length(inkex.Effect):
             self.options.fontsize /= factor
         factor *= scale/self.unittouu('1'+self.options.unit)
         # loop over all selected paths
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 mat = simpletransform.composeParents(node, [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]])
                 p = cubicsuperpath.parsePath(node.get('d'))
diff --git a/share/extensions/merge_styles.py b/share/extensions/merge_styles.py
index d76333ae04..9bdacbb549 100755
--- a/share/extensions/merge_styles.py
+++ b/share/extensions/merge_styles.py
@@ -38,7 +38,7 @@ class Style(dict):
             self[name.strip()] = value.strip()
 
     def entries(self):
-        return [ "%s:%s;" % (n,v) for (n,v) in self.iteritems() ]
+        return [ "%s:%s;" % (n,v) for (n,v) in self.items() ]
 
     def to_str(self, sep="\n    "):
         return "    " + "\n    ".join(self.entries())
@@ -55,7 +55,7 @@ class Style(dict):
 
     def add(self, c, el):
         self.total.append( (c, el) )
-        for name,value in c.iteritems():
+        for name,value in c.items():
             if name not in self:
                 self[name] = value
             if self[name] == value:
@@ -63,7 +63,7 @@ class Style(dict):
 
     def clean(self, threshold):
         """Removes any elements that aren't the same using a weighted threshold"""
-        for attr in self.keys():
+        for attr in list(self.keys()):
             if self.weights[attr] < len(self.total) - threshold:
                 self.pop(attr)
 
@@ -119,7 +119,7 @@ class MergeStyles(inkex.Effect):
         styles.text = (styles.text or "") + "\n" + common.css( newclass )
 
         for (st, el) in common.all_matches():
-            st.remove(common.keys())
+            st.remove(list(common.keys()))
             el.attrib['style'] = st.to_str("")
             
             olds = 'class' in el.attrib and el.attrib['class'].split() or []
diff --git a/share/extensions/motion.py b/share/extensions/motion.py
index 6046665dcb..47e3c36f02 100755
--- a/share/extensions/motion.py
+++ b/share/extensions/motion.py
@@ -59,7 +59,7 @@ class Motion(inkex.Effect):
     def effect(self):
         self.vx = math.cos(math.radians(self.options.angle))*self.options.magnitude
         self.vy = math.sin(math.radians(self.options.angle))*self.options.magnitude
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 group = inkex.etree.SubElement(node.getparent(),inkex.addNS('g','svg'))
                 self.facegroup = inkex.etree.SubElement(group, inkex.addNS('g','svg'))
diff --git a/share/extensions/new_glyph_layer.py b/share/extensions/new_glyph_layer.py
index d6622cc620..4bd35b6a65 100755
--- a/share/extensions/new_glyph_layer.py
+++ b/share/extensions/new_glyph_layer.py
@@ -51,7 +51,7 @@ class NewGlyphLayer(inkex.Effect):
 
 			#TODO: make it optional ("Use current selection as template glyph")
 			# Move selection to the newly created layer
-			for id,node in self.selected.iteritems():
+			for id,node in self.selected.items():
 				layer.append(node)
 
 if __name__ == '__main__':
diff --git a/share/extensions/param_curves.py b/share/extensions/param_curves.py
index e38d5208ae..b436ea45e0 100755
--- a/share/extensions/param_curves.py
+++ b/share/extensions/param_curves.py
@@ -198,7 +198,7 @@ class ParamCurves(inkex.Effect):
                         help="dummy")
 
     def effect(self):
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('rect','svg'):
                 # create new path with basic dimensions of selected rectangle
                 newpath = inkex.etree.Element(inkex.addNS('path','svg'))
diff --git a/share/extensions/pathalongpath.py b/share/extensions/pathalongpath.py
index 8c3d420162..83eb3eef1c 100755
--- a/share/extensions/pathalongpath.py
+++ b/share/extensions/pathalongpath.py
@@ -232,7 +232,7 @@ class PathAlongPath(pathmodifier.Diffeo):
         if dx < 0.01:
             exit(_("The total length of the pattern is too small :\nPlease choose a larger object or set 'Space between copies' > 0"))
 
-        for id, node in self.patterns.iteritems():
+        for id, node in self.patterns.items():
             if node.tag == inkex.addNS('path','svg') or node.tag=='path':
                 d = node.get('d')
                 p0 = cubicsuperpath.parsePath(d)
@@ -240,7 +240,7 @@ class PathAlongPath(pathmodifier.Diffeo):
                     flipxy(p0)
 
                 newp=[]
-                for skelnode in self.skeletons.itervalues(): 
+                for skelnode in self.skeletons.values(): 
                     self.curSekeleton=cubicsuperpath.parsePath(skelnode.get('d'))
                     if self.options.vertical:
                         flipxy(self.curSekeleton)
diff --git a/share/extensions/pathmodifier.py b/share/extensions/pathmodifier.py
index 01c9a63845..8d4b2b8f18 100755
--- a/share/extensions/pathmodifier.py
+++ b/share/extensions/pathmodifier.py
@@ -65,7 +65,7 @@ class PathModifier(inkex.Effect):
 
     def duplicateNodes(self, aList):
         clones={}
-        for id,node in aList.iteritems():
+        for id,node in aList.items():
             clone=copy.deepcopy(node)
             #!!!--> should it be given an id?
             #seems to work without this!?!
@@ -82,7 +82,7 @@ class PathModifier(inkex.Effect):
         return(id)
 
     def expandGroups(self,aList,transferTransform=True):
-        for id, node in aList.items():      
+        for id, node in list(aList.items()):      
             if node.tag == inkex.addNS('g','svg') or node.tag=='g':
                 mat=parseTransform(node.get("transform"))
                 for child in node:
@@ -95,7 +95,7 @@ class PathModifier(inkex.Effect):
         return(aList)
 
     def expandGroupsUnlinkClones(self,aList,transferTransform=True,doReplace=True):
-        for id in aList.keys()[:]:     
+        for id in list(aList.keys()):     
             node=aList[id]
             if node.tag == inkex.addNS('g','svg') or node.tag=='g':
                 self.expandGroups(aList,transferTransform)
@@ -223,7 +223,7 @@ class PathModifier(inkex.Effect):
             return(self.groupToPath(node,doReplace))
         elif node.tag == inkex.addNS('path','svg') or node.tag == 'path':
             #remove inkscape attributes, otherwise any modif of 'd' will be discarded!
-            for attName in node.attrib.keys():
+            for attName in list(node.attrib.keys()):
                 if ("sodipodi" in attName) or ("inkscape" in attName):
                     del node.attrib[attName]
             fuseTransform(node)
@@ -237,7 +237,7 @@ class PathModifier(inkex.Effect):
 
     def objectsToPaths(self,aList,doReplace=True):
         newSelection={}
-        for id,node in aList.items():
+        for id,node in list(aList.items()):
             newnode=self.objectToPath(node,doReplace)
             del aList[id]
             aList[newnode.get('id')]=newnode
@@ -253,7 +253,7 @@ class PathModifier(inkex.Effect):
         #self.expandGroupsUnlinkClones(self.selected, True)
         self.objectsToPaths(self.selected, True)
         self.bbox=computeBBox(self.selected.values())
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg'):
                 d = node.get('d')
                 p = cubicsuperpath.parsePath(d)
@@ -298,7 +298,7 @@ class Diffeo(PathModifier):
         self.expandGroups(self.selected, True)
         self.objectsToPaths(self.selected, True)
         self.bbox=computeBBox(self.selected.values())
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path','svg') or node.tag=='path':
                 d = node.get('d')
                 p = cubicsuperpath.parsePath(d)
diff --git a/share/extensions/pathscatter.py b/share/extensions/pathscatter.py
index 361e8f8e17..363c69280b 100755
--- a/share/extensions/pathscatter.py
+++ b/share/extensions/pathscatter.py
@@ -168,7 +168,7 @@ class PathScatter(pathmodifier.Diffeo):
 
         if self.options.copymode=="copy":
             duplist=self.duplicateNodes({id:self.patternNode})
-            self.patternNode = duplist.values()[0]
+            self.patternNode = list(duplist.values())[0]
 
         #TODO: allow 4th option: duplicate the first copy and clone the next ones.
         if "%s"%self.options.copymode=="clone":
@@ -251,7 +251,7 @@ class PathScatter(pathmodifier.Diffeo):
         #inkex.debug(patternList)
                 
         counter=0
-        for skelnode in self.skeletons.itervalues(): 
+        for skelnode in self.skeletons.values(): 
             self.curSekeleton=cubicsuperpath.parsePath(skelnode.get('d'))
             for comp in self.curSekeleton:
                 self.skelcomp,self.lengths=linearize(comp)
diff --git a/share/extensions/pixelsnap.py b/share/extensions/pixelsnap.py
index 96a8617e2f..49de6ec827 100755
--- a/share/extensions/pixelsnap.py
+++ b/share/extensions/pixelsnap.py
@@ -496,7 +496,7 @@ class PixelSnapEffect(inkex.Effect):
         
         self.document_offset = self.unittouu(svg.attrib['height']) % 1       # although SVG units are absolute, the elements are positioned relative to the top of the page, rather than zero
 
-        for id, elem in self.selected.iteritems():
+        for id, elem in self.selected.items():
             try:
                 self.pixel_snap(elem)
             except TransformError as e:
diff --git a/share/extensions/replace_font.py b/share/extensions/replace_font.py
index 06d8a8661f..41ac863cda 100755
--- a/share/extensions/replace_font.py
+++ b/share/extensions/replace_font.py
@@ -187,7 +187,7 @@ class ReplaceFont(inkex.Effect):
         to_return = []
         if scope == "selection_only":
             self.selected_items = []
-            for item in self.selected.iteritems():
+            for item in self.selected.items():
                 self.find_child_text_items(item[1])
             items = self.selected_items
             if len(items) == 0:
diff --git a/share/extensions/restack.py b/share/extensions/restack.py
index 79a7565e7f..a1dabc9bad 100755
--- a/share/extensions/restack.py
+++ b/share/extensions/restack.py
@@ -118,13 +118,13 @@ class Restack(inkex.Effect):
             f.close
 
         #find the center of all selected objects **Not the average!
-        x,y,w,h = dimen[objects.keys()[0]]
+        x,y,w,h = dimen[list(objects.keys())[0]]
         minx = x
         miny = y
         maxx = x + w
         maxy = y + h
 
-        for id, node in objects.iteritems():
+        for id, node in objects.items():
             # get the bounding box
             x,y,w,h = dimen[id]
             if x < minx:
@@ -140,7 +140,7 @@ class Restack(inkex.Effect):
         midy = (miny + maxy) / 2
 
         #calculate distances for each selected object
-        for id, node in objects.iteritems():
+        for id, node in objects.items():
             # get the bounding box
             x,y,w,h = dimen[id]
 
@@ -194,7 +194,7 @@ class Restack(inkex.Effect):
                     objects.append(child)
         else:
             parentnode = self.current_layer
-            for id_ in zSort(self.document.getroot(), self.selected.keys()):
+            for id_ in zSort(self.document.getroot(), list(self.selected.keys())):
                 objects.append(self.selected[id_])
         if self.options.zsort == "rev":
             objects.reverse()
diff --git a/share/extensions/simplestyle.py b/share/extensions/simplestyle.py
index 32328a40d8..75a809713c 100644
--- a/share/extensions/simplestyle.py
+++ b/share/extensions/simplestyle.py
@@ -180,7 +180,7 @@ def parseStyle(s):
 
 def formatStyle(a):
     """Format an inline style attribute from a dictionary"""
-    return ";".join([att+":"+str(val) for att,val in a.iteritems()])
+    return ";".join([att+":"+str(val) for att,val in a.items()])
 
 def isColor(c):
     """Determine if its a color we can use. If not, leave it unchanged."""
diff --git a/share/extensions/split.py b/share/extensions/split.py
index 4e83b3d334..538fc41ab9 100755
--- a/share/extensions/split.py
+++ b/share/extensions/split.py
@@ -194,7 +194,7 @@ class Split(inkex.Effect):
         preserve = self.options.preserve
        
         #checks if the selected elements are text nodes
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if not (node.tag == inkex.addNS("text", "svg") or node.tag == inkex.addNS("flowRoot", "svg")):
                 inkex.debug("Please select only text elements.")
                 break
diff --git a/share/extensions/straightseg.py b/share/extensions/straightseg.py
index d477dbdf07..67b37a52fb 100755
--- a/share/extensions/straightseg.py
+++ b/share/extensions/straightseg.py
@@ -38,7 +38,7 @@ class SegmentStraightener(inkex.Effect):
                         dest="behave", default=1,
                         help="straightening behavior for cubic segments")
     def effect(self):
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             if node.tag == inkex.addNS('path', 'svg'):
                 d = node.get('d')
                 p = simplepath.parsePath(d)
diff --git a/share/extensions/synfig_fileformat.py b/share/extensions/synfig_fileformat.py
index 41e6bee38c..59ec990edc 100755
--- a/share/extensions/synfig_fileformat.py
+++ b/share/extensions/synfig_fileformat.py
@@ -195,7 +195,7 @@ blend_method_names = {
     19 : "alpha over"      #deprecated
     }
 
-blend_methods = dict((v, k) for (k, v) in blend_method_names.iteritems())
+blend_methods = dict((v, k) for (k, v) in blend_method_names.items())
 
 ###### Functions ##########################################
 def paramType(layer, param, value=None):
diff --git a/share/extensions/text_extract.py b/share/extensions/text_extract.py
index b6b575dfc3..71e02108ab 100755
--- a/share/extensions/text_extract.py
+++ b/share/extensions/text_extract.py
@@ -91,13 +91,13 @@ class Extract(inkex.Effect):
                 f.close
 
             #find the center of all selected objects **Not the average!
-            x,y,w,h = dimen[self.selected.keys()[0]]
+            x,y,w,h = dimen[list(self.selected.keys())[0]]
             minx = x
             miny = y
             maxx = x + w
             maxy = y + h
 
-            for id, node in self.selected.iteritems():
+            for id, node in self.selected.items():
                 # get the bounding box
                 x,y,w,h = dimen[id]
                 if x < minx:
@@ -113,7 +113,7 @@ class Extract(inkex.Effect):
             midy = (miny + maxy) / 2
 
             #calculate distances for each selected object
-            for id, node in self.selected.iteritems():
+            for id, node in self.selected.items():
                 # get the bounding box
                 x,y,w,h = dimen[id]
 
diff --git a/share/extensions/text_merge.py b/share/extensions/text_merge.py
index a3ba29022d..ac67a01bbb 100755
--- a/share/extensions/text_merge.py
+++ b/share/extensions/text_merge.py
@@ -99,13 +99,13 @@ class Merge(inkex.Effect):
                 f.close
 
             #find the center of all selected objects **Not the average!
-            x,y,w,h = dimen[self.selected.keys()[0]]
+            x,y,w,h = dimen[list(self.selected.keys())[0]]
             minx = x
             miny = y
             maxx = x + w
             maxy = y + h
 
-            for id, node in self.selected.iteritems():
+            for id, node in self.selected.items():
                 # get the bounding box
                 x,y,w,h = dimen[id]
                 if x < minx:
@@ -121,7 +121,7 @@ class Merge(inkex.Effect):
             midy = (miny + maxy) / 2
 
             #calculate distances for each selected object
-            for id, node in self.selected.iteritems():
+            for id, node in self.selected.items():
                 # get the bounding box
                 x,y,w,h = dimen[id]
 
diff --git a/share/extensions/ungroup_deep.py b/share/extensions/ungroup_deep.py
index 359232007d..2eb212752d 100644
--- a/share/extensions/ungroup_deep.py
+++ b/share/extensions/ungroup_deep.py
@@ -270,7 +270,7 @@ class Ungroup(inkex.Effect):
 
     def effect(self):
         if len(self.selected):
-            for elem in self.selected.itervalues():
+            for elem in self.selected.values():
                 self._deep_ungroup(elem)
         else:
             for elem in self.document.getroot():
diff --git a/share/extensions/webslicer_create_group.py b/share/extensions/webslicer_create_group.py
index 567c911aa9..7a447d8807 100755
--- a/share/extensions/webslicer_create_group.py
+++ b/share/extensions/webslicer_create_group.py
@@ -69,7 +69,7 @@ class WebSlicer_CreateGroup(WebSlicer_Effect):
         if len(self.selected) == 0:
             inkex.errormsg(_('You must to select some "Slicer rectangles" or other "Layout groups".'))
             exit(1)
-        for id,node in self.selected.iteritems():
+        for id,node in self.selected.items():
             if node not in self.layer_descendants:
                 inkex.errormsg(_('Oops... The element "%s" is not in the Web Slicer layer') % id)
                 exit(2)
@@ -81,7 +81,7 @@ class WebSlicer_CreateGroup(WebSlicer_Effect):
               'width_unity', 'height_unity',
               'bg_color' ] )
 
-        for id,node in self.selected.iteritems():
+        for id,node in self.selected.items():
             group.insert( 1, node )
 
 
diff --git a/share/extensions/whirl.py b/share/extensions/whirl.py
index 93e04c60da..d132ba1499 100755
--- a/share/extensions/whirl.py
+++ b/share/extensions/whirl.py
@@ -32,7 +32,7 @@ class Whirl(inkex.Effect):
                         help="direction of rotation")
     def effect(self):
         view_center = computePointInNode(list(self.view_center), self.current_layer)
-        for id, node in self.selected.iteritems():
+        for id, node in self.selected.items():
             rotation = -1
             if self.options.rotation == True:
                 rotation = 1
-- 
2.21.0


From 22a042c74443cc15ce1b3cd6300b0f76ddac7a53 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 12:14:00 +0100
Subject: [PATCH 10/17] extensions 2to3: string (module)

---
 share/extensions/dpiswitcher.py         | 3 +--
 share/extensions/hpgl_encoder.py        | 5 ++---
 share/extensions/interp_att_g.py        | 5 ++---
 share/extensions/render_alphabetsoup.py | 3 +--
 4 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py
index 0f8fd4c048..5a3f6e429f 100644
--- a/share/extensions/dpiswitcher.py
+++ b/share/extensions/dpiswitcher.py
@@ -43,7 +43,6 @@ TODO:
 # standard libraries
 import sys
 import re
-import string
 import math
 from lxml import etree
 # local libraries
@@ -347,7 +346,7 @@ class DPISwitcher(inkex.Effect):
         xpathStr = '//sodipodi:guide'
         guides = svg.xpath(xpathStr, namespaces=inkex.NSS)
         for guide in guides:
-            point = string.split(guide.get("position"), ",")
+            point = guide.get("position").split(",")
             guide.set("position", str(float(point[0].strip()) * self.factor_a ) + "," + str(float(point[1].strip()) * self.factor_a ))
     
     def scaleGrid(self, svg):
diff --git a/share/extensions/hpgl_encoder.py b/share/extensions/hpgl_encoder.py
index b9975215f9..075683d4aa 100644
--- a/share/extensions/hpgl_encoder.py
+++ b/share/extensions/hpgl_encoder.py
@@ -21,7 +21,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 # standard libraries
 import math
 import re
-import string
 # local libraries
 import bezmisc
 import cspsubdiv
@@ -95,9 +94,9 @@ class hpglEncoder:
             self.debugValues['viewBoxHeight'] = "-"
         viewBox = self.doc.get('viewBox')
         if viewBox:
-            viewBox2 = string.split(viewBox, ',')
+            viewBox2 = viewBox.split(',')
             if len(viewBox2) < 4:
-                viewBox2 = string.split(viewBox, ' ')
+                viewBox2 = viewBox.split(' ')
             if self.options.debug:
                 self.debugValues['viewBoxWidth'] = viewBox2[2]
                 self.debugValues['viewBoxHeight'] = viewBox2[3]
diff --git a/share/extensions/interp_att_g.py b/share/extensions/interp_att_g.py
index 74abb64344..547bb33e63 100755
--- a/share/extensions/interp_att_g.py
+++ b/share/extensions/interp_att_g.py
@@ -19,7 +19,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 # standard library
 import math
 import re
-import string
 # local library
 import inkex
 import simplestyle
@@ -68,8 +67,8 @@ class InterpAttG(inkex.Effect):
                         help="The selected UI-tab when OK was pressed")
 
     def getColorValues(self):
-      sv = string.replace( self.options.start_val, '#', '' )
-      ev = string.replace( self.options.end_val, '#', '' )
+      sv = self.options.start_val.replace('#', '' )
+      ev = self.options.end_val.replace('#', '' )
       if re.search('\s|,', sv):
         # There are separators. That must be a integer RGB color definition.
         sv = re.split( '[\s,]+', sv )
diff --git a/share/extensions/render_alphabetsoup.py b/share/extensions/render_alphabetsoup.py
index c529e6202c..4666ef55f5 100755
--- a/share/extensions/render_alphabetsoup.py
+++ b/share/extensions/render_alphabetsoup.py
@@ -22,7 +22,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 import copy
 import math
 import cmath
-import string
 import random
 import os
 import sys
@@ -332,7 +331,7 @@ def randomize_input_string(tokens, zoom ):					   # generate a glyph starting fr
 			if ((i > 0) and (char == tokens[i-1])):		 # if this letter matches previous letter
 				imagelist.append(imagelist[len(stack)-1])# make them the same image
 			else:										# generate image for letter
-				stack = string.split( alphabet[char][random.randint(0,(len(alphabet[char])-1))] , "." )
+				stack = alphabet[char][random.randint(0,(len(alphabet[char])-1))].split(".")
 				#stack = string.split( alphabet[char][random.randint(0,(len(alphabet[char])-2))] , "." ) 
 				imagelist.append( draw_crop_scale( stack, zoom ))
 		elif( char == " "):							  # add a " " space to the image list
-- 
2.21.0


From 76fb3d5a19403af08823a725bdd95d5fe4005d33 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 12:55:49 +0100
Subject: [PATCH 11/17] extensions 2to3: Barcode

---
 share/extensions/Barcode/Code39.py    |  4 ++--
 share/extensions/Barcode/Code39Ext.py | 10 +++++-----
 share/extensions/Barcode/Code93.py    | 10 +++++-----
 share/extensions/Barcode/Rm4scc.py    |  6 +++---
 4 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/share/extensions/Barcode/Code39.py b/share/extensions/Barcode/Code39.py
index 0d4d445b1e..63ed0a8e70 100644
--- a/share/extensions/Barcode/Code39.py
+++ b/share/extensions/Barcode/Code39.py
@@ -19,7 +19,7 @@
 Python barcode renderer for Code39 barcodes. Designed for use with Inkscape.
 """
 
-from Base import Barcode
+from .Base import Barcode
 
 ENCODE = {
     '0': '000110100',
@@ -77,7 +77,7 @@ class Code39(Barcode):
         # into full ascii, but this feature is
         # not enabled here
         for char in '*' + self.text + '*':
-            if not ENCODE.has_key(char):
+            if char not in ENCODE:
                 char = '-'
             result = result + ENCODE[char] + '0'
 
diff --git a/share/extensions/Barcode/Code39Ext.py b/share/extensions/Barcode/Code39Ext.py
index 3edf82d2e4..99d7ce5f7d 100644
--- a/share/extensions/Barcode/Code39Ext.py
+++ b/share/extensions/Barcode/Code39Ext.py
@@ -19,7 +19,7 @@
 Python barcode renderer for Code39 Extended barcodes. Designed for Inkscape.
 """
 
-from Code39 import Code39
+from .Code39 import Code39
 
 encode = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
 
@@ -51,13 +51,13 @@ class Code39Ext(Code39):
         # We are only going to extend the Code39 barcodes
         result = ''
         for char in text:
-            if mapA.has_key(char):
+            if char in mapA:
                 char = '%' + mapA[char]
-            elif mapB.has_key(char):
+            elif char in mapB:
                 char = '$' + mapB[char]
-            elif mapC.has_key(char):
+            elif char in mapC:
                 char = '/' + mapC[char]
-            elif mapD.has_key(char):
+            elif char in mapD:
                 char = '+' + mapD[char]
             result = result + char
 
diff --git a/share/extensions/Barcode/Code93.py b/share/extensions/Barcode/Code93.py
index 939a739dd8..76a74bccd3 100644
--- a/share/extensions/Barcode/Code93.py
+++ b/share/extensions/Barcode/Code93.py
@@ -95,18 +95,18 @@ class Code93(Barcode):
     def encode_ascii(self, text):
         result = []
         for char in text:
-            if MAP.has_key(char):
+            if char in MAP:
                 result.append(char)
-            elif MAP_A.has_key(char):
+            elif char in MAP_A:
                 result.append('(%)')
                 result.append(MAP_A[char])
-            elif MAP_B.has_key(char):
+            elif char in MAP_B:
                 result.append('($)')
                 result.append(MAP_B[char])
-            elif MAP_C.has_key(char):
+            elif char in MAP_C:
                 result.append('(/)')
                 result.append(MAP_C[char])
-            elif MAP_D.has_key(char):
+            elif char in MAP_D:
                 result.append('(+)')
                 result.append(MAP_D[char])
         return result
diff --git a/share/extensions/Barcode/Rm4scc.py b/share/extensions/Barcode/Rm4scc.py
index 7c36f26ee3..6f9e8aaa57 100644
--- a/share/extensions/Barcode/Rm4scc.py
+++ b/share/extensions/Barcode/Rm4scc.py
@@ -19,7 +19,7 @@
 Python barcode renderer for RM4CC barcodes. Designed for use with Inkscape.
 """
 
-from Base import Barcode
+from .Base import Barcode
 
 map = {
     '(' : '25',
@@ -79,7 +79,7 @@ class Rm4scc(Barcode):
 
         i = 0
         for char in text:
-            if map.has_key(char):
+            if char in map:
                 result = result + map[char]
                 i = i + 1
 
@@ -90,7 +90,7 @@ class Rm4scc(Barcode):
         total_lower = 0
         total_upper = 0
         for char in text:
-            if map.has_key(char):
+            if char in map:
                 bars = map[char][0:8:2]
                 lower = 0
                 upper = 0
-- 
2.21.0


From 6600a8f300676d88024d19964024cfa1e20d4b22 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 12:57:07 +0100
Subject: [PATCH 12/17] extensions 2to3: run tests with Python 3.7

---
 share/extensions/color_randomize.py          | 4 ++--
 share/extensions/guides_creator.py           | 8 ++++----
 share/extensions/inkex.py                    | 8 +++++---
 share/extensions/polyhedron_3d.py            | 2 ++
 share/extensions/svg_and_media_zip_output.py | 6 ++++--
 share/extensions/test/render_barcode.test.py | 2 +-
 6 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/share/extensions/color_randomize.py b/share/extensions/color_randomize.py
index 93abcf1742..eb46ba6dc0 100755
--- a/share/extensions/color_randomize.py
+++ b/share/extensions/color_randomize.py
@@ -20,7 +20,7 @@ class C(coloreffect.ColorEffect):
             action="store", type="int", 
             dest="lightness_range", default=0,
             help="Lightness range")
-	self.OptionParser.add_option("-o", "--opacity_range",
+        self.OptionParser.add_option("-o", "--opacity_range",
             action="store", type="int", 
             dest="opacity_range", default=0,
             help="Opacity range")
@@ -51,7 +51,7 @@ class C(coloreffect.ColorEffect):
         if self.options.lightness_range > 0:
             hsl[2] = self.randomize_hsl(self.options.lightness_range, hsl[2])
         rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-        return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+        return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
     def opacmod(self, opacity):
         if self.options.opacity_range > 0:
diff --git a/share/extensions/guides_creator.py b/share/extensions/guides_creator.py
index 70144d9dd8..ecc0008872 100755
--- a/share/extensions/guides_creator.py
+++ b/share/extensions/guides_creator.py
@@ -140,7 +140,7 @@ class Guides_Creator(inkex.Effect):
                 inkex.Effect.__init__(self)
 
                 # Define option for the tab.
-		self.OptionParser.add_option("--tab",
+                self.OptionParser.add_option("--tab",
                         action="store",type="string",
                         dest="tab", default="regular_guides",
                         help="")
@@ -486,8 +486,8 @@ class Guides_Creator(inkex.Effect):
                                 drawVerticalGuides(v_subdiv,rectangle_width,rectangle_height,0,nv,begin_from)
 
 if __name__ == '__main__':
-	# Create effect instance and apply it.
-	effect = Guides_Creator()
-	effect.affect()
+        # Create effect instance and apply it.
+        effect = Guides_Creator()
+        effect.affect()
 
 ## end of file guide_creator.py ##
diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py
index 8a94c55cc1..d31e467f9c 100755
--- a/share/extensions/inkex.py
+++ b/share/extensions/inkex.py
@@ -35,9 +35,6 @@ import re
 import sys
 from math import *
 
-if sys.version_info[0] >= 3:
-    unicode = str
-
 # a dictionary of all of the xmlns prefixes in a standard inkscape doc
 NSS = {
 u'sodipodi' :u'http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd',
@@ -106,6 +103,11 @@ def errormsg(msg):
     else:
         sys.stderr.write((unicode(msg, "utf-8", errors='replace') + "\n").encode("utf-8"))
 
+if sys.version_info[0] >= 3:
+    def errormsg(msg):
+        if isinstance(msg, bytes):
+            msg = msg.decode(errors='replace')
+        sys.stderr.write(msg + "\n")
 
 def are_near_relative(a, b, eps):
     return (a-b <= a*eps) and (a-b >= -a*eps)
diff --git a/share/extensions/polyhedron_3d.py b/share/extensions/polyhedron_3d.py
index c39d351749..265900e76b 100755
--- a/share/extensions/polyhedron_3d.py
+++ b/share/extensions/polyhedron_3d.py
@@ -137,6 +137,8 @@ def get_obj_data(obj, name):
     if obj.name == '':#no name was found, use filename, without extension (.obj)
         obj.name = name[0:-4]
 
+    infile.close()
+
 #RENDERING AND SVG OUTPUT FUNCTIONS
 
 def draw_SVG_dot(_cx_cy, st, name, parent):
diff --git a/share/extensions/svg_and_media_zip_output.py b/share/extensions/svg_and_media_zip_output.py
index f3df1d9908..927bbdcc42 100755
--- a/share/extensions/svg_and_media_zip_output.py
+++ b/share/extensions/svg_and_media_zip_output.py
@@ -145,10 +145,12 @@ class CompressedMediaOutput(inkex.Effect):
         and add it to the temporary compressed file
         '''
         dst_file = os.path.join(self.tmp_dir, docstripped)
-        stream = open(dst_file,'w')
+        stream = open(dst_file,'wb')
         self.document.write(stream)
         stream.close()
-        z.write(dst_file,docstripped.encode(self.encoding)+'.svg')
+        if sys.version_info[0] < 3:
+            docstripped = docstripped.encode(self.encoding)
+        z.write(dst_file, docstripped + '.svg')
 
     def is_text(self, node):
         '''
diff --git a/share/extensions/test/render_barcode.test.py b/share/extensions/test/render_barcode.test.py
index f2ce23873b..a346b601c5 100755
--- a/share/extensions/test/render_barcode.test.py
+++ b/share/extensions/test/render_barcode.test.py
@@ -25,7 +25,7 @@ class InsertBarcodeBasicTest(unittest.TestCase):
     for line in fhl:
       line = line.replace('\n', '').replace('\r', '')
       (btype, text, code) = line.split(':')
-      if not self.data.has_key(btype):
+      if btype not in self.data:
         self.data[btype] = []
       self.data[btype].append( [ text, code ] )
     fhl.close()
-- 
2.21.0


From 68f934181d5e630293b6dc20cfd7a7339ea4e238 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 13:30:11 +0100
Subject: [PATCH 13/17] extensions 2to3: '%x' int

---
 share/extensions/color_HSL_adjust.py     | 2 +-
 share/extensions/color_lesshue.py        | 2 +-
 share/extensions/color_lesslight.py      | 2 +-
 share/extensions/color_lesssaturation.py | 2 +-
 share/extensions/color_morehue.py        | 2 +-
 share/extensions/color_morelight.py      | 2 +-
 share/extensions/color_moresaturation.py | 2 +-
 7 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/share/extensions/color_HSL_adjust.py b/share/extensions/color_HSL_adjust.py
index 473c4bd1e2..3dbb660315 100755
--- a/share/extensions/color_HSL_adjust.py
+++ b/share/extensions/color_HSL_adjust.py
@@ -61,7 +61,7 @@ class C(coloreffect.ColorEffect):
             hsl[2] = self.clamp(0.0, lightval, 1.0)
         #inkex.debug("hsl new: " + str(hsl[0]) + ", " + str(hsl[1]) + ", " + str(hsl[2]))
         rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-        return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+        return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
 c = C()
 c.affect()
diff --git a/share/extensions/color_lesshue.py b/share/extensions/color_lesshue.py
index d34a75019d..b67a7cfafe 100755
--- a/share/extensions/color_lesshue.py
+++ b/share/extensions/color_lesshue.py
@@ -9,7 +9,7 @@ class C(coloreffect.ColorEffect):
     if hsl[0] < 0.0:
         hsl[0] = 1.0 + hsl[0]
     rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-    return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+    return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
 c = C()
 c.affect()
diff --git a/share/extensions/color_lesslight.py b/share/extensions/color_lesslight.py
index 94dfb412d0..4466a37268 100755
--- a/share/extensions/color_lesslight.py
+++ b/share/extensions/color_lesslight.py
@@ -9,7 +9,7 @@ class C(coloreffect.ColorEffect):
     if hsl[2] < 0.0:
         hsl[2] = 0.0
     rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-    return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+    return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
 c = C()
 c.affect()
diff --git a/share/extensions/color_lesssaturation.py b/share/extensions/color_lesssaturation.py
index 1d3702c767..b01b38d420 100755
--- a/share/extensions/color_lesssaturation.py
+++ b/share/extensions/color_lesssaturation.py
@@ -9,7 +9,7 @@ class C(coloreffect.ColorEffect):
     if hsl[1] < 0.0:
         hsl[1] = 0.0
     rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-    return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+    return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
 c = C()
 c.affect()
diff --git a/share/extensions/color_morehue.py b/share/extensions/color_morehue.py
index 7d3406ec0e..40dd8bef5b 100755
--- a/share/extensions/color_morehue.py
+++ b/share/extensions/color_morehue.py
@@ -9,7 +9,7 @@ class C(coloreffect.ColorEffect):
     if hsl[0] > 1.0:
         hsl[0] = hsl[0] - 1.0
     rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-    return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+    return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
 c = C()
 c.affect()
diff --git a/share/extensions/color_morelight.py b/share/extensions/color_morelight.py
index bbc418c3f7..44ab29efce 100755
--- a/share/extensions/color_morelight.py
+++ b/share/extensions/color_morelight.py
@@ -9,7 +9,7 @@ class C(coloreffect.ColorEffect):
     if hsl[2] > 1.0:
         hsl[2] = 1.0
     rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-    return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+    return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
 c = C()
 c.affect()
diff --git a/share/extensions/color_moresaturation.py b/share/extensions/color_moresaturation.py
index 4ecb4987c0..a8248437f9 100755
--- a/share/extensions/color_moresaturation.py
+++ b/share/extensions/color_moresaturation.py
@@ -9,7 +9,7 @@ class C(coloreffect.ColorEffect):
     if hsl[1] > 1.0:
         hsl[1] = 1.0
     rgb = self.hsl_to_rgb(hsl[0], hsl[1], hsl[2])
-    return '%02x%02x%02x' % (rgb[0]*255, rgb[1]*255, rgb[2]*255)
+    return '%02x%02x%02x' % tuple(int(i * 0xFF) for i in rgb)
 
 c = C()
 c.affect()
-- 
2.21.0


From 305d561f00382731079049371e5f8b443b9b4b49 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 16:53:13 +0100
Subject: [PATCH 14/17] extensions 2to3: Popen(universal_newlines=True)

---
 share/extensions/inkex.py        | 3 ++-
 share/extensions/restack.py      | 3 ++-
 share/extensions/text_extract.py | 5 +++--
 share/extensions/text_merge.py   | 5 +++--
 4 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py
index d31e467f9c..44d3b1252f 100755
--- a/share/extensions/inkex.py
+++ b/share/extensions/inkex.py
@@ -274,7 +274,8 @@ class Effect:
         original = etree.tostring(self.original_document)        
         result = etree.tostring(self.document)        
         if original != result:
-            self.document.write(sys.stdout)
+            out = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+            self.document.write(out)
 
     def affect(self, args=sys.argv[1:], output=True):
         """Affect an SVG document with a callback effect"""
diff --git a/share/extensions/restack.py b/share/extensions/restack.py
index a1dabc9bad..855a53c47e 100755
--- a/share/extensions/restack.py
+++ b/share/extensions/restack.py
@@ -95,7 +95,8 @@ class Restack(inkex.Effect):
         #get all bounding boxes in file by calling inkscape again with the --query-all command line option
         #it returns a comma separated list structured id,x,y,w,h
         if bsubprocess:
-            p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE)
+            p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE,
+                    universal_newlines=True)
             err = p.stderr
             f = p.communicate()[0]
             try:
diff --git a/share/extensions/text_extract.py b/share/extensions/text_extract.py
index 71e02108ab..6d6b156544 100755
--- a/share/extensions/text_extract.py
+++ b/share/extensions/text_extract.py
@@ -68,7 +68,8 @@ class Extract(inkex.Effect):
             # get all bounding boxes in file by calling inkscape again with the --query-all command line option
             # it returns a comma separated list structured id,x,y,w,h
             if bsubprocess:
-                p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE)
+                p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE,
+                        universal_newlines=True)
                 err = p.stderr
                 f = p.communicate()[0]
                 try:
@@ -85,7 +86,7 @@ class Extract(inkex.Effect):
             dimen = dict()
             for line in reader:
                 if len(line) > 0:
-                    dimen[line[0]] = map( float, line[1:])
+                    dimen[line[0]] = list(map( float, line[1:]))
 
             if not bsubprocess: #close file if opened using os.popen3
                 f.close
diff --git a/share/extensions/text_merge.py b/share/extensions/text_merge.py
index ac67a01bbb..f79367b27f 100755
--- a/share/extensions/text_merge.py
+++ b/share/extensions/text_merge.py
@@ -76,7 +76,8 @@ class Merge(inkex.Effect):
             # get all bounding boxes in file by calling inkscape again with the --query-all command line option
             # it returns a comma separated list structured id,x,y,w,h
             if bsubprocess:
-                p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE)
+                p = Popen('inkscape --query-all "%s"' % (file), shell=True, stdout=PIPE, stderr=PIPE,
+                        universal_newlines=True)
                 err = p.stderr
                 f = p.communicate()[0]
                 try:
@@ -93,7 +94,7 @@ class Merge(inkex.Effect):
             dimen = dict()
             for line in reader:
                 if len(line) > 0:
-                    dimen[line[0]] = map( float, line[1:])
+                    dimen[line[0]] = list(map( float, line[1:]))
 
             if not bsubprocess: #close file if opened using os.popen3
                 f.close
-- 
2.21.0


From ebb4c8eb90eede6f2015b228b776710d0c1a56d7 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 18:09:28 +0100
Subject: [PATCH 15/17] extensions 2to3: TabError

---
 share/extensions/gcodetools.py              | 98 ++++++++++-----------
 share/extensions/setup_typography_canvas.py | 10 +--
 2 files changed, 54 insertions(+), 54 deletions(-)

diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index e639310f6d..c2b7898c91 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -288,25 +288,25 @@ def point_inside_csp(p,csp, on_the_path = True) :
 		for i in range(1, len(subpath)) :
 			sp1, sp2 = subpath[i-1], subpath[i]
 			ax,ay,bx,by,cx,cy,dx,dy = csp_parameterize(sp1,sp2)
-		 	if  ax==0 and bx==0 and cx==0 and dx==x : 
+			if  ax==0 and bx==0 and cx==0 and dx==x :
 		 		#we've got a special case here
-		 		b = csp_true_bounds( [[sp1,sp2]])
-		 		if  b[1][1]<=y<=b[3][1] :
+				b = csp_true_bounds( [[sp1,sp2]])
+				if  b[1][1]<=y<=b[3][1] :
 		 			# points is on the path 
-			 		return on_the_path
-			 	else :
+					return on_the_path
+				else :
 			 		# we can skip this segment because it wont influence the answer.
-			 		pass	
-		 	else: 
-	 			for t in csp_line_intersection([x,y],[x,y+5],sp1,sp2) :
-	 				if t == 0 or t == 1 :
+					pass
+			else:
+				for t in csp_line_intersection([x,y],[x,y+5],sp1,sp2) :
+					if t == 0 or t == 1 :
 	 					#we've got another special case here
-		 				x1,y1 = csp_at_t(sp1,sp2,t)
-		 				if y1==y : 
+						x1,y1 = csp_at_t(sp1,sp2,t)
+						if y1==y :
 		 					# the point is on the path 
-		 					return on_the_path
+							return on_the_path
 	 					# if t == 0 we should have considered this case previously. 
-	 					if t == 1 :
+						if t == 1 :
 							# we have to check the next segmant if it is on the same side of the ray
 							st_d = csp_normalized_slope(sp1,sp2,1)[0]
 							if st_d == 0 : st_d = csp_normalized_slope(sp1,sp2,0.99)[0]
@@ -315,20 +315,20 @@ def point_inside_csp(p,csp, on_the_path = True) :
 								if (i+j) % len(subpath) == 0  : continue # skip the closing segment 
 								sp11,sp22 = subpath[(i-1+j) % len(subpath)], subpath[(i+j) % len(subpath)]
 								ax1,ay1,bx1,by1,cx1,cy1,dx1,dy1 = csp_parameterize(sp1,sp2)
-		 						if  ax1==0 and bx1==0 and cx1==0 and dx1==x : continue # this segment parallel to the ray, so skip it 
+								if  ax1==0 and bx1==0 and cx1==0 and dx1==x : continue # this segment parallel to the ray, so skip it
 								en_d = csp_normalized_slope(sp11,sp22,0)[0]
 								if en_d == 0 : en_d = csp_normalized_slope(sp11,sp22,0.01)[0]
 								if st_d*en_d <=0 : 
-			 						ray_intersections_count += 1
-			 						break 
-	 				else :	
-		 				x1,y1 = csp_at_t(sp1,sp2,t)
-		 				if y1==y : 
+									ray_intersections_count += 1
+									break
+					else :
+						x1,y1 = csp_at_t(sp1,sp2,t)
+						if y1==y :
 		 					# the point is on the path 
-		 					return on_the_path
-		 				else :
-		 					if y1>y and 3*ax*t**2 + 2*bx*t + cx !=0 : # if it's 0 the path only touches the ray
-		 						ray_intersections_count += 1 	
+							return on_the_path
+						else :
+							if y1>y and 3*ax*t**2 + 2*bx*t + cx !=0 : # if it's 0 the path only touches the ray
+								ray_intersections_count += 1
 	return ray_intersections_count%2 == 1 				
 
 def csp_close_all_subpaths(csp, tolerance = 0.000001):
@@ -1162,10 +1162,10 @@ def csp_seg_bound_to_csp_seg_bound_max_min_distance(sp1,sp2,sp3,sp4) :
 
 def csp_reverse(csp) :
 	for i in range(len(csp)) :
-	 	n = []
-	 	for j in csp[i] :
+		n = []
+		for j in csp[i] :
 			n = [  [j[2][:],j[1][:],j[0][:]]  ] + n
-	 	csp[i] = n[:]
+		csp[i] = n[:]
 	return csp			
 
 
@@ -1221,9 +1221,9 @@ def csp_concat_subpaths(*s):
 		if s1 == [] : return s2
 		if s2 == [] : return s1
 		if (s1[-1][1][0]-s2[0][1][0])**2 + (s1[-1][1][1]-s2[0][1][1])**2 > 0.00001 :
-	 		return s1[:-1]+[ [s1[-1][0],s1[-1][1],s1[-1][1]],  [s2[0][1],s2[0][1],s2[0][2]] ] + s2[1:]		
-	 	else :
-	 		return s1[:-1]+[ [s1[-1][0],s2[0][1],s2[0][2]] ] + s2[1:]		
+			return s1[:-1]+[ [s1[-1][0],s1[-1][1],s1[-1][1]],  [s2[0][1],s2[0][1],s2[0][2]] ] + s2[1:]
+		else :
+			return s1[:-1]+[ [s1[-1][0],s2[0][1],s2[0][2]] ] + s2[1:]
 	 		
 	if len(s) == 0 : return []
 	if len(s) ==1 : return s[0]
@@ -1568,7 +1568,7 @@ def draw_pointer(x,color = "#f00", figure = "cross", group = None, comment = "",
 
 
 def straight_segments_intersection(a,b, true_intersection = True) : # (True intersection means check ta and tb are in [0,1])
- 	ax,bx,cx,dx, ay,by,cy,dy = a[0][0],a[1][0],b[0][0],b[1][0], a[0][1],a[1][1],b[0][1],b[1][1] 
+	ax,bx,cx,dx, ay,by,cy,dy = a[0][0],a[1][0],b[0][0],b[1][0], a[0][1],a[1][1],b[0][1],b[1][1]
 	if (ax==bx and ay==by) or (cx==dx and cy==dy) : return False, 0, 0
 	if (bx-ax)*(dy-cy)-(by-ay)*(dx-cx)==0 :	# Lines are parallel
 		ta = (ax-cx)/(dx-cx) if cx!=dx else (ay-cy)/(dy-cy)
@@ -4030,7 +4030,7 @@ class Gcodetools(inkex.Effect):
 			trans = numpy.linalg.inv(trans).tolist()[:2]		
 			return trans
 		else :
-		 return transform
+			return transform
 		
 
 	def apply_transforms(self,g,csp, reverse=False):
@@ -4380,9 +4380,9 @@ class Gcodetools(inkex.Effect):
 				if value == None or key == None: continue
 				#print_("Found tool parameter '%s':'%s'" % (key,value))
 				if key in self.default_tool.keys() :
-					 try :
+					try :
 						tool[key] = type(self.default_tool[key])(value)
-					 except :
+					except :
 						tool[key] = self.default_tool[key]
 						self.error(_("Warning! Tool's and default tool's parameter's (%s) types are not the same ( type('%s') != type('%s') ).") % (key, value, self.default_tool[key]), "tools_warning")
 				else :
@@ -4732,7 +4732,7 @@ class Gcodetools(inkex.Effect):
 						if  (bounds[2]-bounds[0])**2+(bounds[3]-bounds[1])**2 < self.options.area_find_artefacts_diameter**2:
 							if self.options.area_find_artefacts_action == "mark with an arrow" :
 								arrow =  cubicsuperpath.parsePath( 'm %s,%s 2.9375,-6.343750000001 0.8125,1.90625 6.843748640396,-6.84374864039 0,0 0.6875,0.6875 -6.84375,6.84375 1.90625,0.812500000001 z' % (subpath[0][1][0],subpath[0][1][1]) )
- 								arrow = self.apply_transforms(path,arrow,True)
+								arrow = self.apply_transforms(path,arrow,True)
 								inkex.etree.SubElement(parent, inkex.addNS('path','svg'), 
 										{
 											'd': cubicsuperpath.formatPath(arrow),
@@ -4794,26 +4794,26 @@ class Gcodetools(inkex.Effect):
 						# Reverse path if needed.
 						if min_y!=float("-inf") :
 							# Move outline subpath to the beginning of csp
-	 					 	subp = csp[min_i]
-	 					 	del csp[min_i]
-	 					 	j = min_j
+							subp = csp[min_i]
+							del csp[min_i]
+							j = min_j
 	 					 	# Split by the topmost point and join again
-	 					 	if min_t in [0,1]:
-	 					 		if min_t == 0: j=j-1
-		 					 	subp[-1][2], subp[0][0] = subp[-1][1], subp[0][1]
-	 					 		subp = [ [subp[j][1], subp[j][1], subp[j][2]] ] + subp[j+1:] + subp[:j] + [ [subp[j][0], subp[j][1], subp[j][1]] ]
+							if min_t in [0,1]:
+								if min_t == 0: j=j-1
+								subp[-1][2], subp[0][0] = subp[-1][1], subp[0][1]
+								subp = [ [subp[j][1], subp[j][1], subp[j][2]] ] + subp[j+1:] + subp[:j] + [ [subp[j][0], subp[j][1], subp[j][1]] ]
 							else: 					 		
-		 						sp1,sp2,sp3 = csp_split(subp[j-1],subp[j],min_t)
-		 						subp[-1][2], subp[0][0] = subp[-1][1], subp[0][1]
+								sp1,sp2,sp3 = csp_split(subp[j-1],subp[j],min_t)
+								subp[-1][2], subp[0][0] = subp[-1][1], subp[0][1]
 								subp = [ [ sp2[1], sp2[1],sp2[2] ] ] + [sp3] + subp[j+1:] + subp[:j-1] + [sp1] + [[ sp2[0], sp2[1],sp2[1] ]] 					 	  
-	 					 	csp = [subp] + csp
+							csp = [subp] + csp
 							# reverse path if needed
 							if csp_subpath_ccw(csp[0]) :
 								for i in range(len(csp)):
-								 	n = []
-								 	for j in csp[i]:
-								 		n = [  [j[2][:],j[1][:],j[0][:]]  ] + n
-								 	csp[i] = n[:]
+									n = []
+									for j in csp[i]:
+										n = [  [j[2][:],j[1][:],j[0][:]]  ] + n
+									csp[i] = n[:]
 
 	 					 	
 						d = cubicsuperpath.formatPath(csp)
@@ -6479,7 +6479,7 @@ G01 Z1 (going to cutting z)\n""",
 							self.graffiti_reference_points[layer] = self.graffiti_reference_points[self.layers[i]]
 							break
 					if reference_points == None :
-					 	self.error('There are no graffiti reference points for layer %s'%layer,"error")
+						self.error('There are no graffiti reference points for layer %s'%layer,"error")
 					 	
 				# Transform reference points
 				for i in range(len(self.graffiti_reference_points[layer])):
diff --git a/share/extensions/setup_typography_canvas.py b/share/extensions/setup_typography_canvas.py
index 209c9757f1..55758ee331 100755
--- a/share/extensions/setup_typography_canvas.py
+++ b/share/extensions/setup_typography_canvas.py
@@ -69,7 +69,7 @@ class SetupTypographyCanvas(inkex.Effect):
 		self.svg = self.document.getroot()
 		self.svg.set("width", str(emsize))
 		self.svg.set("height", str(emsize))
-                self.svg.set("viewBox", "0 0 " + str(emsize) + " " + str(emsize) )
+		self.svg.set("viewBox", "0 0 " + str(emsize) + " " + str(emsize) )
 
 		baseline = descender
 		# Create guidelines
@@ -79,10 +79,10 @@ class SetupTypographyCanvas(inkex.Effect):
 		self.create_horizontal_guideline("xheight", baseline+xheight)
 		self.create_horizontal_guideline("descender", baseline-descender)
 
-                namedview = self.svg.find(inkex.addNS('namedview', 'sodipodi'))
-                namedview.set(inkex.addNS('document-units', 'inkscape'), 'px')
-                namedview.set(inkex.addNS('cx', 'inkscape'), str(emsize/2.0 ))
-                namedview.set(inkex.addNS('cy', 'inkscape'), str(emsize/2.0 ))
+		namedview = self.svg.find(inkex.addNS('namedview', 'sodipodi'))
+		namedview.set(inkex.addNS('document-units', 'inkscape'), 'px')
+		namedview.set(inkex.addNS('cx', 'inkscape'), str(emsize/2.0 ))
+		namedview.set(inkex.addNS('cy', 'inkscape'), str(emsize/2.0 ))
 
 
 if __name__ == '__main__':
-- 
2.21.0


From a0f105a3b501c4f68ca4a3e3bc4a7b21923833b2 Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Mon, 4 Mar 2019 23:16:38 +0100
Subject: [PATCH 16/17] extensions 2to3: // stdout.buffer sort(key)

---
 share/extensions/Barcode/Code25i.py           |  2 +-
 share/extensions/dm2svg.py                    |  2 +-
 share/extensions/dxf_input.py                 |  3 ++-
 share/extensions/dxf_outlines.py              |  2 +-
 share/extensions/gcodetools.py                |  2 +-
 share/extensions/gimp_xcf.py                  |  3 ++-
 share/extensions/guillotine.py                | 11 ++---------
 share/extensions/hpgl_input.py                |  3 ++-
 share/extensions/jessyInk_export.py           |  3 ++-
 share/extensions/jessyInk_video.py            |  5 +++--
 share/extensions/new_glyph_layer.py           |  4 +++-
 share/extensions/render_barcode_datamatrix.py | 12 ++++++------
 share/extensions/render_barcode_qrcode.py     |  2 +-
 share/extensions/run_command.py               |  3 ++-
 share/extensions/scour.inkscape.py            |  5 +++--
 share/extensions/svg_and_media_zip_output.py  |  3 ++-
 share/extensions/synfig_output.py             |  3 ++-
 share/extensions/tar_layers.py                | 14 ++++++--------
 share/extensions/uniconv_output.py            |  3 ++-
 share/extensions/wireframe_sphere.py          |  2 +-
 20 files changed, 45 insertions(+), 42 deletions(-)

diff --git a/share/extensions/Barcode/Code25i.py b/share/extensions/Barcode/Code25i.py
index 2c751559cf..b2265d2135 100644
--- a/share/extensions/Barcode/Code25i.py
+++ b/share/extensions/Barcode/Code25i.py
@@ -49,7 +49,7 @@ class Code25i(Barcode):
             number = '0' + number
 
         # Number is encoded by pairs of 2 figures
-        size = len(number) / 2
+        size = len(number) // 2
         encoded = '1010'
         for i in range(size):
             # First in the pair is encoded in black (1), second in white (0)
diff --git a/share/extensions/dm2svg.py b/share/extensions/dm2svg.py
index a8784a3002..d9b7d81ff5 100755
--- a/share/extensions/dm2svg.py
+++ b/share/extensions/dm2svg.py
@@ -41,7 +41,7 @@ def process_file(filename):
 
         while True:
             tag = f.read(1)
-            if tag == '':
+            if tag == b'':
                 break
 
             if ord(tag) > 128:
diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py
index 91e7a02e21..3e15c0b8fd 100755
--- a/share/extensions/dxf_input.py
+++ b/share/extensions/dxf_input.py
@@ -534,6 +534,7 @@ while line[0] and (line[1] != 'ENDSEC' or not inENTITIES):
 
 if polylines:
     inkex.errormsg(_('%d ENTITIES of type POLYLINE encountered and ignored. Please try to convert to Release 13 format using QCad.') % polylines)
-doc.write(inkex.sys.stdout)
+out = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+doc.write(out)
 
 # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py
index 8d87576b06..63d813f94c 100755
--- a/share/extensions/dxf_outlines.py
+++ b/share/extensions/dxf_outlines.py
@@ -101,7 +101,7 @@ class MyEffect(inkex.Effect):
         self.d = array([0], float)              # knot vector
         self.poly = [[0.0,0.0]]                 # LWPOLYLINE data
     def output(self):
-        print(''.join(self.dxf))
+        print(b''.join(self.dxf))
     def dxf_add(self, str):
         self.dxf.append(str.encode(self.options.char_encode))
     def dxf_line(self,csp):
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index c2b7898c91..a46cbd4ae2 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -1552,7 +1552,7 @@ def draw_pointer(x,color = "#f00", figure = "cross", group = None, comment = "",
 		draw_text(text,x[0]+size*2.2,x[1]-size, group = group, font_size = font_size) 
 	if figure  == "line" :
 		s = ""
-		for i in range(1,len(x)/2) :
+		for i in range(1,len(x) // 2) :
 			s+= " %s, %s " %(x[i*2],x[i*2+1])
 		attrib.update({"d": "M %s,%s L %s"%(x[0],x[1],s), "style":"fill:none;stroke:%s;stroke-width:%f;"%(color,width),"comment":str(comment)})			
 		inkex.etree.SubElement( group, inkex.addNS('path','svg'), attrib)
diff --git a/share/extensions/gimp_xcf.py b/share/extensions/gimp_xcf.py
index d79717828e..e771ff813a 100755
--- a/share/extensions/gimp_xcf.py
+++ b/share/extensions/gimp_xcf.py
@@ -273,7 +273,8 @@ class MyEffect(inkex.Effect):
                 except:
                     pass
             try:
-                sys.stdout.write(x.read())
+                stdout = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+                stdout.write(x.read())
             finally:
                 x.close()
                 self.clear_tmp()
diff --git a/share/extensions/guillotine.py b/share/extensions/guillotine.py
index ee7ae39fa2..7ce53143f8 100755
--- a/share/extensions/guillotine.py
+++ b/share/extensions/guillotine.py
@@ -52,13 +52,6 @@ import simplestyle
 
 locale.setlocale(locale.LC_ALL, '')
 
-def float_sort(a, b):
-    '''
-    This is used to sort the horizontal and vertical guide positions,
-    which are floating point numbers, but which are held as text.
-    '''
-    return cmp(float(a), float(b))
-
 class Guillotine(inkex.Effect):
     """Exports slices made using guides"""
     def __init__(self):
@@ -131,7 +124,7 @@ class Guillotine(inkex.Effect):
             if h >= 0 and float(h) <= float(height):
                 horizontals.append(h)
         horizontals.append(height)
-        horizontals.sort(cmp=float_sort)
+        horizontals.sort(key=float)
         return horizontals
 
     def get_vertical_slice_positions(self):
@@ -147,7 +140,7 @@ class Guillotine(inkex.Effect):
             if v >= 0 and float(v) <= float(width):
                 verticals.append(v)
         verticals.append(width)
-        verticals.sort(cmp=float_sort)
+        verticals.sort(key=float)
         return verticals
 
     def get_slices(self):
diff --git a/share/extensions/hpgl_input.py b/share/extensions/hpgl_input.py
index f9b8465dd3..f7edb9dcb2 100755
--- a/share/extensions/hpgl_input.py
+++ b/share/extensions/hpgl_input.py
@@ -65,6 +65,7 @@ if 'UNKNOWN_COMMANDS' in warnings:
     inkex.errormsg(_("The HPGL data contained unknown (unsupported) commands, there is a possibility that the drawing is missing some content."))
 
 # deliver document to inkscape
-doc.write(inkex.sys.stdout)
+out = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+doc.write(out)
 
 # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
diff --git a/share/extensions/jessyInk_export.py b/share/extensions/jessyInk_export.py
index a08cfb6ddb..98cd897551 100755
--- a/share/extensions/jessyInk_export.py
+++ b/share/extensions/jessyInk_export.py
@@ -122,7 +122,8 @@ class MyEffect(inkex.Effect):
 			msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
 
 		# Output the file.
-		sys.stdout.write(out.read())
+		stdout = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+		stdout.write(out.read())
 		sys.stdout.close()
 		out.close()
 
diff --git a/share/extensions/jessyInk_video.py b/share/extensions/jessyInk_video.py
index cf5052c446..ea86b30d80 100755
--- a/share/extensions/jessyInk_video.py
+++ b/share/extensions/jessyInk_video.py
@@ -57,7 +57,7 @@ class JessyInk_Effects(inkex.Effect):
 			inkex.errormsg(_("Could not obtain the selected layer for inclusion of the video element.\n\n"))
 
 		# Parse template file.
-		tmplFile = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'jessyInk_video.svg'), 'r')
+		tmplFile = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'jessyInk_video.svg'), 'rb')
 		tmplRoot = etree.fromstring(tmplFile.read())
 		tmplFile.close()
 
@@ -83,7 +83,8 @@ class JessyInk_Effects(inkex.Effect):
 		layer[0].append(elem)
 
 def findInternalLinks(node, docRoot, nodeDict = {}):
-	for entry in re.findall("url\(#.*\)", etree.tostring(node)):
+	for entry in re.findall(b"url\(#.*\)", etree.tostring(node)):
+		entry = entry.decode()
 		linkId = entry[5:len(entry) - 1]
 
 		if linkId not in nodeDict:
diff --git a/share/extensions/new_glyph_layer.py b/share/extensions/new_glyph_layer.py
index 4bd35b6a65..b5cb164560 100755
--- a/share/extensions/new_glyph_layer.py
+++ b/share/extensions/new_glyph_layer.py
@@ -35,7 +35,9 @@ class NewGlyphLayer(inkex.Effect):
 
 	def effect(self):
 		# Get all the options
-		unicode_chars = self.options.unicodechars.decode(self.encoding)
+		unicode_chars = self.options.unicodechars
+		if sys.version_info[0] < 3:
+			unicode_chars = unicode_chars.decode(self.encoding)
 
 		#TODO: remove duplicate chars
 
diff --git a/share/extensions/render_barcode_datamatrix.py b/share/extensions/render_barcode_datamatrix.py
index 7c6c333459..891a65975e 100755
--- a/share/extensions/render_barcode_datamatrix.py
+++ b/share/extensions/render_barcode_datamatrix.py
@@ -267,7 +267,7 @@ def interleave( blocks, inter):
     else:
         result = []
         for block in blocks:    #for each codeword block in the stream
-            block_length = len(block)/inter    #length of each interleaved block
+            block_length = len(block) // inter    #length of each interleaved block
             inter_blocks = [[0] * block_length for i in xrange(inter)]   #the interleaved blocks
             
             for i in range(block_length):   #for each element in the interleaved blocks
@@ -287,7 +287,7 @@ def combine_interleaved( blocks, inter, nd, nc, size144):
         return blocks
     else:
         result = []
-        for i in range( len(blocks) / inter ):  #for each group of "inter" blocks -> one full datamatrix
+        for i in range( len(blocks) // inter ):  #for each group of "inter" blocks -> one full datamatrix
             data_codewords = [] #interleaved data blocks
             
             if size144:
@@ -298,10 +298,10 @@ def combine_interleaved( blocks, inter, nd, nc, size144):
                 nc_range = nc*inter
             
             for j in range(nd_range):  #for each codeword in the final list
-                data_codewords.append( blocks[i*inter + j%inter][j/inter] )
+                data_codewords.append( blocks[i*inter + j%inter][j // inter] )
 
             for j in range(nc_range):  #for each block, add the ecc codewords
-                data_codewords.append( blocks[i*inter + j%inter][nd + j/inter] )
+                data_codewords.append( blocks[i*inter + j%inter][nd + j // inter] )
 
             result.append(data_codewords)
         return result
@@ -603,8 +603,8 @@ def add_finder_pattern( array, data_nrow, data_ncol, reg_row, reg_col ):
             
     for i in range( data_nrow*reg_row ):
         for j in range( data_ncol* reg_col ):
-            dest_col = j + 1 + 2*(j/(data_ncol)) #offset by 1, plus two for every addition block
-            dest_row = i + 1 + 2*(i/(data_nrow))
+            dest_col = j + 1 + 2*(j // data_ncol) #offset by 1, plus two for every addition block
+            dest_row = i + 1 + 2*(i // data_nrow)
             
             datamatrix[dest_row][dest_col] = array[i][j]    #transfer from the plain bit array
             
diff --git a/share/extensions/render_barcode_qrcode.py b/share/extensions/render_barcode_qrcode.py
index 9e86296077..e81a216f55 100755
--- a/share/extensions/render_barcode_qrcode.py
+++ b/share/extensions/render_barcode_qrcode.py
@@ -977,7 +977,7 @@ class QRRSBlock:
         if rsBlock == None:
             raise Exception("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel)
 
-        length = len(rsBlock) / 3
+        length = len(rsBlock) // 3
 
         list = []
 
diff --git a/share/extensions/run_command.py b/share/extensions/run_command.py
index d760567a19..0c19d44fe7 100755
--- a/share/extensions/run_command.py
+++ b/share/extensions/run_command.py
@@ -77,7 +77,8 @@ def run(command_format, prog_name):
         try:
             f = open(svgfile, "rb")
             data = f.read()
-            sys.stdout.write(data)
+            stdout = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+            stdout.write(data)
             f.close()
         except IOError as inst:
             msg = "Error reading temporary file: %s" % str(inst)
diff --git a/share/extensions/scour.inkscape.py b/share/extensions/scour.inkscape.py
index bf60b9617b..6ec280f6ae 100755
--- a/share/extensions/scour.inkscape.py
+++ b/share/extensions/scour.inkscape.py
@@ -55,9 +55,10 @@ class ScourInkscape (inkex.Effect):
 
     def effect(self):
         try:
-            input = file(self.args[0], "r")
+            input = open(self.args[0], "r")
             self.options.infilename = self.args[0]
-            sys.stdout.write(scourString(input.read(), self.options).encode("UTF-8"))
+            stdout = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+            stdout.write(scourString(input.read(), self.options).encode("UTF-8"))
             input.close()
             sys.stdout.close()
         except Exception as e:
diff --git a/share/extensions/svg_and_media_zip_output.py b/share/extensions/svg_and_media_zip_output.py
index 927bbdcc42..8fd7b7ebad 100755
--- a/share/extensions/svg_and_media_zip_output.py
+++ b/share/extensions/svg_and_media_zip_output.py
@@ -99,7 +99,8 @@ class CompressedMediaOutput(inkex.Effect):
                 msvcrt.setmode(1, os.O_BINARY)
             except:
                 pass
-        sys.stdout.write(out.read())
+        stdout = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+        stdout.write(out.read())
         out.close()
         shutil.rmtree(self.tmp_dir)
 
diff --git a/share/extensions/synfig_output.py b/share/extensions/synfig_output.py
index 5a36934aae..60d2653ea8 100755
--- a/share/extensions/synfig_output.py
+++ b/share/extensions/synfig_output.py
@@ -1072,7 +1072,8 @@ class SynfigExport(SynfigPrep):
         for layer in layers:
             root_canvas.append(layer)
 
-        d.get_root_tree().write(sys.stdout)
+        out = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+        d.get_root_tree().write(out)
 
     def convert_node(self, node, d):
         """Convert an SVG node to a list of Synfig layers"""
diff --git a/share/extensions/tar_layers.py b/share/extensions/tar_layers.py
index 8b60d889d1..f6586326c9 100755
--- a/share/extensions/tar_layers.py
+++ b/share/extensions/tar_layers.py
@@ -25,10 +25,7 @@ import os
 import sys
 import copy
 import tarfile
-if sys.version_info[0] < 3:
-    import StringIO
-else:
-    import io as StringIO
+import io
 import calendar
 import time
 
@@ -89,17 +86,18 @@ class LayersOutput(inkex.Effect):
         return node.tag == GROUP and node.attrib.get(GROUPMODE,'').lower() == 'layer'
 
     def io_document(self, name, doc):
-        string = StringIO.StringIO()
+        string = io.BytesIO()
         doc.write(string)
-        string.seek(0)
         info = tarfile.TarInfo(name=name+'.svg')
         info.mtime = calendar.timegm(time.gmtime())
-        info.size  = len(string.buf)
+        info.size  = string.tell()
+        string.seek(0)
         return dict(tarinfo=info, fileobj=string)
 
     def effect(self):
         # open output tar file as a stream (to stdout)
-        tar = tarfile.open(fileobj=sys.stdout, mode='w|')
+        out = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+        tar = tarfile.open(fileobj=out, mode='w|')
 
         # Switch stdout to binary on Windows.
         if sys.platform == "win32":
diff --git a/share/extensions/uniconv_output.py b/share/extensions/uniconv_output.py
index 170477540a..d5a8b9405c 100755
--- a/share/extensions/uniconv_output.py
+++ b/share/extensions/uniconv_output.py
@@ -74,7 +74,8 @@ def run(command_format, prog_name, uniconv_format):
         try:
             f = open(outfile, "rb")
             data = f.read()
-            sys.stdout.write(data)
+            stdout = sys.stdout if sys.version_info[0] < 3 else sys.stdout.buffer
+            stdout.write(data)
             f.close()
         except IOError as inst:
             msg = "Error reading temporary file: %s" % str(inst)
diff --git a/share/extensions/wireframe_sphere.py b/share/extensions/wireframe_sphere.py
index 870b75413b..e8428f48ba 100755
--- a/share/extensions/wireframe_sphere.py
+++ b/share/extensions/wireframe_sphere.py
@@ -149,7 +149,7 @@ class Wireframe_Sphere(inkex.Effect):
                 
                 delta_long = 360.0/so.NUM_LONG      #angle between neighbouring lines of longitude in degrees
                 
-                for i in range(0,so.NUM_LONG/2):
+                for i in range(0,so.NUM_LONG // 2):
                     long_angle = so.ROT_OFFSET + (i*delta_long)*(pi/180.0); #The longitude of this particular line in radians
                     if long_angle > pi:
                         long_angle -= 2*pi
-- 
2.21.0


From 6e5fe7edb9ac3db28874e9fb4f859482bf3d05fe Mon Sep 17 00:00:00 2001
From: Thomas Holder <thomas@thomas-holder.de>
Date: Wed, 6 Mar 2019 09:43:26 +0100
Subject: [PATCH 17/17] extensions 2to3: rename xxx_todo_changeme

---
 share/extensions/bezmisc.py                   | 36 +++++++++----------
 share/extensions/cspsubdiv.py                 |  4 +--
 share/extensions/draw_from_triangle.py        |  4 +--
 share/extensions/gcodetools.py                |  4 +--
 share/extensions/motion.py                    |  4 +--
 share/extensions/render_barcode_datamatrix.py |  8 ++---
 6 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/share/extensions/bezmisc.py b/share/extensions/bezmisc.py
index 359db54213..36c28fd81e 100755
--- a/share/extensions/bezmisc.py
+++ b/share/extensions/bezmisc.py
@@ -55,9 +55,9 @@ def rootWrapper(a,b,c,d):
         return 1.0*(-d/c),
     return ()
 
-def bezierparameterize(xxx_todo_changeme):
+def bezierparameterize(arg):
     #parametric bezier
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
     x0=bx0
     y0=by0
     cx=3*(bx1-x0)
@@ -70,10 +70,10 @@ def bezierparameterize(xxx_todo_changeme):
     return ax,ay,bx,by,cx,cy,x0,y0
     #ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
 
-def linebezierintersect(xxx_todo_changeme1, xxx_todo_changeme2):
+def linebezierintersect(arg_a, arg_b):
     #parametric line
-    ((lx1,ly1),(lx2,ly2)) = xxx_todo_changeme1
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme2
+    ((lx1,ly1),(lx2,ly2)) = arg_a
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg_b
     dd=lx1
     cc=lx2-lx1
     bb=ly1
@@ -102,23 +102,23 @@ def linebezierintersect(xxx_todo_changeme1, xxx_todo_changeme2):
             retval.append(bezierpointatt(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)),i))
     return retval
 
-def bezierpointatt(xxx_todo_changeme3,t):
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme3
+def bezierpointatt(arg, t):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     x=ax*(t**3)+bx*(t**2)+cx*t+x0
     y=ay*(t**3)+by*(t**2)+cy*t+y0
     return x,y
 
-def bezierslopeatt(xxx_todo_changeme4,t):
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme4
+def bezierslopeatt(arg, t):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     dx=3*ax*(t**2)+2*bx*t+cx
     dy=3*ay*(t**2)+2*by*t+cy
     return dx,dy
 
-def beziertatslope(xxx_todo_changeme5, xxx_todo_changeme6):
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme5
-    (dy,dx) = xxx_todo_changeme6
+def beziertatslope(arg, d):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
+    (dy,dx) = d
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     #quadratic coefficents of slope formula
     if dx:
@@ -147,8 +147,8 @@ def tpoint(_x1_y1, _x2_y2, t):
     (x1, y1) = _x1_y1
     (x2, y2) = _x2_y2
     return x1+t*(x2-x1),y1+t*(y2-y1)
-def beziersplitatt(xxx_todo_changeme9,t):
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme9
+def beziersplitatt(arg, t):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
     m1=tpoint((bx0,by0),(bx1,by1),t)
     m2=tpoint((bx1,by1),(bx2,by2),t)
     m3=tpoint((bx2,by2),(bx3,by3),t)
@@ -226,15 +226,15 @@ def Simpson(f, a, b, n_limit, tolerance):
     #print multiplier, endsum, interval, asum, bsum, est1, est0
     return est1
 
-def bezierlengthSimpson(xxx_todo_changeme12, tolerance = 0.001):
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme12
+def bezierlengthSimpson(arg, tolerance = 0.001):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
     global balfax,balfbx,balfcx,balfay,balfby,balfcy
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     balfax,balfbx,balfcx,balfay,balfby,balfcy = 3*ax,2*bx,cx,3*ay,2*by,cy
     return Simpson(balf, 0.0, 1.0, 4096, tolerance)
 
-def beziertatlength(xxx_todo_changeme13, l = 0.5, tolerance = 0.001):
-    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme13
+def beziertatlength(arg, l = 0.5, tolerance = 0.001):
+    ((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
     global balfax,balfbx,balfcx,balfay,balfby,balfcy
     ax,ay,bx,by,cx,cy,x0,y0=bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
     balfax,balfbx,balfcx,balfay,balfby,balfcy = 3*ax,2*bx,cx,3*ay,2*by,cy
diff --git a/share/extensions/cspsubdiv.py b/share/extensions/cspsubdiv.py
index c44e50ce49..8187beac71 100755
--- a/share/extensions/cspsubdiv.py
+++ b/share/extensions/cspsubdiv.py
@@ -2,8 +2,8 @@
 from bezmisc import *
 from ffgeom import *
 
-def maxdist(xxx_todo_changeme):
-    ((p0x,p0y),(p1x,p1y),(p2x,p2y),(p3x,p3y)) = xxx_todo_changeme
+def maxdist(arg):
+    ((p0x,p0y),(p1x,p1y),(p2x,p2y),(p3x,p3y)) = arg
     p0 = Point(p0x,p0y)
     p1 = Point(p1x,p1y)
     p2 = Point(p2x,p2y)
diff --git a/share/extensions/draw_from_triangle.py b/share/extensions/draw_from_triangle.py
index 3fd0ebb3ff..2a44659a57 100755
--- a/share/extensions/draw_from_triangle.py
+++ b/share/extensions/draw_from_triangle.py
@@ -103,8 +103,8 @@ def get_cartesian_pt( t, p):#get the cartesian coordinates from a trilinear set
     c2 = p[0][2]*t[2]/denom
     return ( c1*p[2][1][0]+c2*p[2][0][0], c1*p[2][1][1]+c2*p[2][0][1] )
 
-def get_cartesian_tri(xxx_todo_changeme6, params):#get the cartesian points from a trilinear vertex matrix
-    ((t11,t12,t13),(t21,t22,t23),(t31,t32,t33)) = xxx_todo_changeme6
+def get_cartesian_tri(arg, params):#get the cartesian points from a trilinear vertex matrix
+    ((t11,t12,t13),(t21,t22,t23),(t31,t32,t33)) = arg
     p1=get_cartesian_pt( (t11,t12,t13), params )
     p2=get_cartesian_pt( (t21,t22,t23), params )
     p3=get_cartesian_pt( (t31,t32,t33), params )
diff --git a/share/extensions/gcodetools.py b/share/extensions/gcodetools.py
index a46cbd4ae2..54b53cf867 100755
--- a/share/extensions/gcodetools.py
+++ b/share/extensions/gcodetools.py
@@ -107,8 +107,8 @@ except:
     exit()
 
 
-def bezierslopeatt(xxx_todo_changeme20,t):
-	((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = xxx_todo_changeme20
+def bezierslopeatt(arg, t):
+	((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)) = arg
 	ax,ay,bx,by,cx,cy,x0,y0=bezmisc.bezierparameterize(((bx0,by0),(bx1,by1),(bx2,by2),(bx3,by3)))
 	dx=3*ax*(t**2)+2*bx*t+cx
 	dy=3*ay*(t**2)+2*by*t+cy
diff --git a/share/extensions/motion.py b/share/extensions/motion.py
index 47e3c36f02..6ff24047ba 100755
--- a/share/extensions/motion.py
+++ b/share/extensions/motion.py
@@ -30,8 +30,8 @@ class Motion(inkex.Effect):
                         dest="magnitude", default=100.0,
                         help="magnitude of the motion vector")    
 
-    def makeface(self,last, xxx_todo_changeme):
-        (cmd, params) = xxx_todo_changeme
+    def makeface(self, last, arg):
+        (cmd, params) = arg
         a = []
         a.append(['M',last[:]])
         a.append([cmd, params[:]])
diff --git a/share/extensions/render_barcode_datamatrix.py b/share/extensions/render_barcode_datamatrix.py
index 891a65975e..881640f462 100755
--- a/share/extensions/render_barcode_datamatrix.py
+++ b/share/extensions/render_barcode_datamatrix.py
@@ -100,9 +100,9 @@ symbols = {
 #=====================================================================
     
 #create a 2d list corresponding to the 1's and 0s of the DataMatrix
-def encode(text, xxx_todo_changeme ):
+def encode(text, n_row_col):
     #retreive the parameters of this size of DataMatrix
-    (nrow, ncol) = xxx_todo_changeme
+    (nrow, ncol) = n_row_col
     data_nrow, data_ncol, reg_row, reg_col, nd, nc, inter = get_parameters( nrow, ncol )
 
     if not ((nrow == 144) and (ncol == 144)):   #we have a regular datamatrix
@@ -516,9 +516,9 @@ def utah(array, nrow, ncol, row, col, char):
 
 #"place_bits" fills an nrow x ncol array with the bits from the 
 # codewords in data. 
-def place_bits(data, xxx_todo_changeme1): 
+def place_bits(data, n_row_col):
 # First, fill the array[] with invalid entries */ 
-    (nrow, ncol) = xxx_todo_changeme1
+    (nrow, ncol) = n_row_col
     INVALID = 2
     array = [[INVALID] * ncol for i in xrange(nrow)]   #initialise and fill with -1's (invalid value)
 # Starting in the correct location for character #1, bit 8,...
-- 
2.21.0

openSUSE Build Service is sponsored by