#!/usr/bin/env python

# We will use the inkex module with the predefined Effect base class.
import inkex

import measure
import re
import cubicsuperpath
from simplepath import parsePath
# The simplestyle module provides functions for style parsing.
from simplestyle import *





def getArea(path):
	return abs(measure.csparea(cubicsuperpath.parsePath(path + "z")))


class LaserSort(inkex.Effect):
	def __init__(self):
		inkex.Effect.__init__(self)




		
	def effect(self):
		elements = self.document.xpath('//svg:path',namespaces=inkex.NSS)
		for el in elements:

			oldpathstring = el.attrib['d']

			nodes = parsePath(oldpathstring)

			currentSection = []
			sections = [currentSection]
			for node in nodes:
				command = node.pop(0)
				currentSection.append(command + ' ' + ' '.join(map(lambda c: ','.join(map(str, c)), node)))
				if command.lower() == 'z':
					currentSection = []
					sections.append(currentSection)
			
			sections = map(lambda n: ' '.join(n), filter(lambda n: len(n) > 0, sections))

			if (sections[-1][-2].lower() != 'z'):
				nonClosedSection = ' ' + sections.pop()
			else:
				nonClosedSection = ''

			sections = filter(lambda s: s[0].lower() != 'z', sections)

			
			sections = sorted(sections, key=getArea)

				
			newpathstring = "z ".join(sections) + nonClosedSection
			el.set('d', newpathstring)
		




# Create effect instance and apply it.
effect = LaserSort()
effect.affect()