from Translator import *
import ValueList, pdb
class SSSPrimitiveValue(object):
CSS_UNKNOWN = 0
CSS_NUMBER = 1
CSS_PERCENTAGE = 2
CSS_EMS = 3
CSS_EXS = 4
CSS_PX = 5
CSS_CM = 6
CSS_MM = 7
CSS_IN = 8
CSS_PT = 9
CSS_PC = 10
CSS_DEG = 11
CSS_RAD = 12
CSS_GRAD = 13
CSS_MS = 14
CSS_S = 15
CSS_HZ = 16
CSS_KHZ = 17
CSS_DIMENSION = 18
CSS_STRING = 19
CSS_URI = 20
CSS_IDENT = 21
CSS_ATTR = 22
CSS_COUNTER = 23
CSS_RECT = 24
CSS_RBGCOLOR = 25
#/* Extensions */
CSS_HEXCOLOR = 26
CSS_OPERATOR = 27
lookup = {}
unit = {}
parentObject = None
_primitiveType = None
def __init__(self, value = None, parentObject = None):
self.prop = {}
self.nonascii = r'[^\0-\177]'
self.uni = r'\\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])?'
self.escape = self.uni + r'|\\[^\n\r\f0-9a-f]'
self.nmstart = r'[_a-z]|' + self.nonascii + r'|' + self.escape
self.nmchar = r'[_a-z0-9-]|' + self.nonascii + r'|' + self.escape
self.name = self.nmchar + '+'
self.ident = r'[-]?' + self.nmstart + self.nmchar + '*'
self.num = r'[0-9]+|[0-9]*\.[0-9]+'
self.nl = r'\n|\r\n|\r|\f'
self.w = r'[ \t\r\n\f]*'
self.string1 = r'\"([^\n\r\f\\"]|\\' + self.nl + r'|' + self.nonascii + r'|' + self.escape + r')*\"'
self.string2 = r"\'([^\n\r\f\\']|\\" + self.nl + r'|' + self.nonascii + r'|' + self.escape + r')*\''
self.string = self.string1 + '|' + self.string2
self.invalid1 = r'\"([^\n\r\f\\"]|\\' + self.nl + r'|' + self.nonascii + r'|' + self.escape + r')*'
self.invalid2 = r"\'([^\n\r\f\\']|\\" + self.nl + r'|' + self.nonascii + r'|' + self.escape + r')*'
self.invalid = self.invalid1 + '|' + self.invalid2
self.parentObject = parentObject
#/* NOTE: NEED TO IMPLEMENT ALL KNOWN VALUE TYPES */
if value: self.parse(value)
def getPropertyValueBySelector(self, property_name, selector):
selector = trim(selector)
rules = self.parentObject.hostStyleSheet.getRulesBySelector(selector)
if (rules):
for key in rules:
property_value = key.getPropertyValue(property_name)
if (property_value):
return property_value
return None
def evaluate(self, text):
values = ValueList.SSSValueList(text, self.parentObject)
string_rep = ''
unit = ''
for i in xrange(len(values)):
string_rep += values.item(i).value
if (values.item(i).unit_string != ''):
unit = values.item(i).unit_string
#uh... not so sure about this one...!?!
return (eval("return " + string_rep + ";") + unit)
def floor(self, number):
number = eval("return floor(" + number + ");")
return number
def ceil(self, number):
number = eval("return ceil(" + number + ");")
return number
def parse(self, value):
value = value.strip()
if (value == ''): return
#/* maybe a constant? */
if self.parentObject:
constant_value = self.parentObject.getConstant(value)
if (constant_value):
value = constant_value
#/* maybe a variable? */
matches = preg_match(r'^(\$\w+)$', value)
if (matches): #// variable, look up in parent
if self.parentObject:
#pdb.set_trace()
var_value = self.parentObject.getVar(matches[0])
if (var_value):
value = var_value
else:
value = ''
matches = preg_match(r'^floor\((.*)\)$', value)
if (matches):
value = self.floor(self.evaluate(matches[0]))
matches = preg_match(r'^ceil\((.*)\)$', value)
if (matches):
value = self.ceil(self.evaluate(matches[0]))
matches = preg_match(r'^abs\((.*)\)$', value)
if (matches):
value = self.abs(self.evaluate(matches[0]))
matches = preg_match(r'^([-]?)\((.*)\)(%|em|ex|px|cm|mm}in|pt|pc){0,1}$', value)
if (matches):
computed_value = self.evaluate(matches[1])
if preg_match(r'(%|em|ex|px|cm|mm}in|pt|pc)$', computed_value, get_class(self)) and matches[1]:
value = preg_replace('(%|em|ex|px|cm|mm}in|pt|pc)$', matches[1], computed_value)
else:
value = matches[0] + computed_value + matches[1]
matches = preg_match(r'^prop\(([^\,]*)(\,[^\)]*)?\)$', value)
if (matches): #// prop()
#pdb.set_trace()
provided_prop_name = matches[0][0]
provided_selector = matches[0][1]
if not provided_selector: #// host object not defined, assuming self...
prop = self.parentObject.parentObject.getPropertyValue(provided_prop_name)
if (prop):
value = prop
else:
value = self.getPropertyValueBySelector(provided_prop_name, self.parentObject.parentObject.selectorText)
else: #// host object has been defined, use selector to find objects
value = self.getPropertyValueBySelector(provided_prop_name, trim(str_replace(',', '', provided_selector)))
self.unit[self.CSS_PERCENTAGE] = '%'
self.unit[self.CSS_EMS] = 'em'
self.unit[self.CSS_EXS] = 'ex'
self.unit[self.CSS_PX] = 'px'
self.unit[self.CSS_CM] = 'cm'
self.unit[self.CSS_MM] = 'mm'
self.unit[self.CSS_IN] = 'in'
self.unit[self.CSS_PT] = 'pt'
self.unit[self.CSS_PC] = 'pc'
#/* assuming unknown value */
#self.prop['value'] = value
#self.prop['primitiveValue'] = ''
#self.prop['valueType'] = self.CSS_UNKNOWN
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)\%$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_PERCENTAGE]
self.prop['valueType'] = self.CSS_PERCENTAGE
return
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)em$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_EMS]
self.prop['valueType'] = self.CSS_EMS
return
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)ex$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_EXS]
self.prop['valueType'] = self.CSS_EXS
return
matches = preg_match(r'^([-]?[0-9]+)px$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_PX]
self.prop['valueType'] = self.CSS_PX
return
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)cm$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_CM]
self.prop['valueType'] = self.CSS_CM
return
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)mm$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_MM]
self.prop['valueType'] = self.CSS_MM
return
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)in$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_IN]
self.prop['valueType'] = self.CSS_IN
return
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)pt$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_PT]
self.prop['valueType'] = self.CSS_PT
return
matches = preg_match(r'^([-]?[0-9]+|[0-9]*\.[0-9]+)pc$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = self.unit[self.CSS_PC]
self.prop['valueType'] = self.CSS_PC
return
matches = preg_match(r'^([-]?' + self.num + r')$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = ''
self.prop['valueType'] = self.CSS_NUMBER
return
#---------------------------------------------------------#
matches = preg_match(r'^url\(.{0,}\)$', value)
if matches:
string = ''.join(matches)
if "'" in string or '"' in string:
string = string.replace("'", "")
string = string.replace('"', '')
self.prop['value'] = string[4:-1]
self.prop['primitiveValue'] = ''
self.prop['valueType'] = self.CSS_URI
return
matches = preg_match(r'^rgb\([\w\W]+?\)$', value)
if matches:
string = ''.join(matches)
string = str_replace('rgb(', '', string)
string = str_replace(')', '', string)
self.prop['value'] = string
self.prop['primitiveValue'] = ''
self.prop['valueType'] = self.CSS_RBGCOLOR
return
matches = preg_match(r'^\#[a-fA-F0-9]{3,6}$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = ''
self.prop['valueType'] = self.CSS_HEXCOLOR
return
matches = preg_match(r'^[\-|\+|\*|\/|\%]$', value)
if matches:
self.prop['value'] = matches[0]
self.prop['primitiveValue'] = ''
self.prop['valueType'] = self.CSS_OPERATOR
return
self.prop['value'] = value
self.prop['primitiveValue'] = ''
self.prop['valueType'] = self.CSS_STRING
def set_cssText(self, text):
self.parse(text)
def get_cssText(self):
return self.__str__()
cssText = property(get_cssText, set_cssText)
def get_primitiveType(self):
return self.prop['valueType']
primitiveType = property(get_primitiveType)
def get_valueType(self):
return self.prop['valueType']
valueType = property(get_valueType)
def get_value(self):
return self.prop['value']
value = property(get_value)
def get(var):
if (var == 'cssValueType'): return SSSValue.CSS_PRIMITIVE_VALUE
if (var == 'unit_string'):
return self.unit[self.prop['primitiveType']]
def __str__(self):
if (self.prop['valueType'] == self.CSS_URI):
return 'url('+ self.prop['value'] + ')'
return self.prop['value'] + self.prop['primitiveValue']