| Conditions | 6 | 
| Total Lines | 55 | 
| Code Lines | 29 | 
| Lines | 0 | 
| Ratio | 0 % | 
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | from SCons.Script import *  | 
            ||
| 5 | def svg2pgf_shape(filename):  | 
            ||
| 6 | '''  | 
            ||
| 7 | Convert given SVG file to TiKZ code.  | 
            ||
| 8 | '''  | 
            ||
| 9 | xml = parseXml(filename)  | 
            ||
| 10 | # determine size of the picture from SVG source  | 
            ||
| 11 |     svg = xml.getElementsByTagName('svg')[0] | 
            ||
| 12 | name = svg.attributes['id'].value  | 
            ||
| 13 | height = int(svg.attributes['height'].value)  | 
            ||
| 14 | width = int(svg.attributes['width'].value)  | 
            ||
| 15 | # Define shape anchors, based on image size  | 
            ||
| 16 | # We need double backslashes since the output is Python again  | 
            ||
| 17 | # The SVG coordinate system is mirrored on the horizon axis, so we add a rotation command and a positional compensation  | 
            ||
| 18 | result = '''  | 
            ||
| 19 | \\\\pgfdeclareshape{%(name)s}{ | 
            ||
| 20 |     \\\\anchor{center}{\pgfpoint{%(halfwidth)u}{%(halfheight)u}} | 
            ||
| 21 |     \\\\anchor{north}{\pgfpoint{%(halfwidth)u}{%(height)u}} | 
            ||
| 22 |     \\\\anchor{south}{\pgfpoint{%(halfwidth)u}{0}} | 
            ||
| 23 |     \\\\anchor{west}{\pgfpoint{0}{%(halfheight)u}} | 
            ||
| 24 |     \\\\anchor{east}{\pgfpoint{%(width)u}{%(halfheight)u}} | 
            ||
| 25 |     \\\\foregroundpath{ | 
            ||
| 26 |         \\\\pgfsetlinewidth{1.4} | 
            ||
| 27 |         \\\\pgftransformshift{\pgfpoint{%(width)u}{%(height)u}} | 
            ||
| 28 |         \\\\pgftransformrotate{180}  | 
            ||
| 29 |         \\\\pgfsetfillcolor{white} | 
            ||
| 30 | '''%{'name':name, 'height':height, 'halfheight':height/2, 'width':width, 'halfwidth':width/2} | 
            ||
| 31 | # add all SVG path  | 
            ||
| 32 |     pathCommands = xml.getElementsByTagName('path') | 
            ||
| 33 | for p in pathCommands:  | 
            ||
| 34 | # The path may have styling. We ignore everything but dashing.  | 
            ||
| 35 |         if p.attributes.has_key('style'): | 
            ||
| 36 | if 'stroke-dasharray' in p.attributes['style'].value:  | 
            ||
| 37 | # http://stuff.mit.edu/afs/athena/contrib/tex-contrib/beamer/pgf-1.01/doc/generic/pgf/version-for-tex4ht/en/pgfmanualse23.html  | 
            ||
| 38 |                 result += "        \\\\pgfsetdash{{4.2}{1.4}}{0}\n" | 
            ||
| 39 | # Add the SVG path  | 
            ||
| 40 |         result +="        \\\\pgfpathsvg{%s}\n"%p.attributes['d'].value | 
            ||
| 41 | # add all SVG rectangle definitions  | 
            ||
| 42 | # Add usepath after each rectangle, in order to get overlayed filled rects correctly generated  | 
            ||
| 43 |     rectCommands = xml.getElementsByTagName('rect') | 
            ||
| 44 | for r in rectCommands:  | 
            ||
| 45 | rheight = float(r.attributes['height'].value)  | 
            ||
| 46 | rwidth = float(r.attributes['width'].value)  | 
            ||
| 47 | x = float(r.attributes['x'].value)  | 
            ||
| 48 | y = float(r.attributes['y'].value)  | 
            ||
| 49 |         result += "        \\\\pgfrect{\pgfpoint{%f}{%f}}{\pgfpoint{%f}{%f}}\n\\\\pgfusepath{stroke, fill}\n"%(x, y, rwidth, rheight) | 
            ||
| 50 | # add all SVG circle definitions  | 
            ||
| 51 |     circleCommands = xml.getElementsByTagName('circle') | 
            ||
| 52 | for c in circleCommands:  | 
            ||
| 53 | x = float(c.attributes['cx'].value)  | 
            ||
| 54 | y = float(c.attributes['cy'].value)  | 
            ||
| 55 | radius = float(c.attributes['r'].value)  | 
            ||
| 56 |         result += "        \\\\pgfcircle{\pgfpoint{%f}{%f}}{%f}\n\\\\pgfusepath{stroke, fill}\n"%(x,y,radius) | 
            ||
| 57 | # finalize TiKZ shape definition  | 
            ||
| 58 |     result += '        \\\\pgfusepath{stroke}\n}}' | 
            ||
| 59 | return result  | 
            ||
| 60 | |||
| 91 |