git.fiddlerwoaroof.com
jsc.py
050ef009
 class Variable(object):
 	def __init__(self, name):
 		self.name = name
 	def __lshift__(self, value):
 		return Assignment(self, value)
 	def __str__(self):
 		result = self.name
 		return result
 	def __repr__(self):
 		return 'Variable: %s' % self
 	def __getattr__(self, name):
 		if name.startswith('__') or name.endswith('__'): raise AttributeError
 		return Variable('.'.join([self.name, name]))
 	def __call__(self, *args):
 		return FuncCall(self, *args)
 
 class FuncCall(object):
 	def __init__(self, name, *args):
 		self.name = str(name)
 		self.args = ', '.join(str(x) for x in args)
 	def __repr__(self):
 		return 'FuncCall: %s(%s)' % (self.name, self.args)
 	def __str__(self):
 		return '%s(%s)' % (self.name, self.args)
 
 
 class Expression(object):
 	def __init__(self, expr):
 		self.expr = expr
 	def __repr__(self):
 		return 'Expression: %s' % self.expr
 	def __rshift__(self, args):
 		if not hasattr(args, '__iter__'): args = (args,)
 		return self.apply(*args)
 	def apply(self, *args):
 		return self.expr % args
 
 class Assignment(object):
 	template = 'var %s = %s'
 	def __init__(self, name, value):
 		self.name = name
 		self.value = value
 	def __repr__(self):
 		return 'Assignment: %s, %s' % (self.name, self.value)
 	def __str__(self):
 		return self.template % (self.name, self.value)
 
 class Return(object):
 	template = 'return %s'
 	def __init__(self, var):
 		self.var = var
 	def __str__(self):
 		return self.template % self.var
 	def __repr__(self):
 		return 'Return: %s' % self
 
 class Block(object):
 	template = '{\n%s\n}'
 	def __init__(self, *lines):
 		self.lines = lines
 	def __repr__(self): return 'Block: %d lines' % len(self.lines)
 	def __str__(self):
 		return self.template % ';\n'.join(str(x) for x in self.lines)
 
 class Closure(object):
 	template = '''function(%s)'''
 	def __init__(self, args, *code):
 		self.args = ', '.join(str(x) for x in args)
 		self.code = Block(*code)
 	def __str__(self):
 		out = ['(',
 				self.template % self.args,
 				str(self.code),
 				')'
 			]
 		return '\n'.join(out)
 	def __repr__(self):
 		return 'Closure: %s' % (self.template % self.args)
 	def __call__(self, *args):
 		return FuncCall(self, *args)
 
 class Field(object):
 	template = '''%s: %s'''
 	def __init__(self, name, closure):
 		self.name = name
 		self.closure = closure
 	def __repr__(self):
 		return 'Method: %s' % self.name
 	def __str__(self):
 		return self.template % (self.name, self.closure)
 
 class Object(object):
 	template = '''{\n%s\n}'''
 	def __init__(self, *methods):
 		self.methods = methods
 	def __repr__(self):
 		return 'Object at %x: %d methods' % (id(self), len(self.methods))
 	def __str__(self):
 		methods = ',\n'.join(str(x) for x in self.methods)
 		return self.template % methods
 
 widg = Variable('widg')
 jq = Variable('$')
 this = Variable('this')
 arguments = Variable('arguments')
 print Closure((jq,),
 	widg << jq.widget('"ui.captionator"', Object(
 		Field('options', Object()),
 		Field('_create', Closure(())),
 		Field('destroy', Closure(())),
 		Field('_setOption', Closure(('option', 'value'),
 			jq.Widget.prototype._setOption.apply( this, arguments )
 		))
 	)),
 	Return(widg)
 )('jQuery')