from Translator import *
import SelectorList
import Object, pdb
class SSSStyleRule(Object.SSSObject):
def __init__(self, rule = ''):
super(SSSStyleRule, self).__init__()
self._declared_selectors = SelectorList.SSSSelectorList('', self)
self._computed_selectors = SelectorList.SSSSelectorList('', self)
self._inherited_selectors = SelectorList.SSSSelectorList('', self)
if rule: self._parse(rule)
def _parse(self, text):
text = trim(text)
matches = preg_match(r'^([^\{]*)\{([\w|\W]*)\}$', text)
if (matches):
self._declared_selectors = SelectorList.SSSSelectorList(matches[0][0], self)
super(SSSStyleRule, self)._parse(matches[0][1])
self._computed_selectors = SelectorList.SSSSelectorList( self.get_computedSelector(), self)
def get_computedSelector(self):
com_selectors = self._declared_selectors.selectorArrayToString(self.get_computedSelectorAsArray())
return com_selectors
def get_finalSelector(self):
final_selector = self._computed_selectors.selectorText
if not self._inherited_selectors.selectorText == '':
#pdb.set_trace()
final_selector += ', ' + self._inherited_selectors.selectorText
return final_selector
selectorText = property(get_finalSelector)
#def get_computedSelectorAsArray(self):
#if get_class(self.parentObject) == 'SSSStyleRule':
#computedSelector = []
#for parentSelector in self.parentObject.get_computedSelectorAsArray():
#for selector in self._declared_selectors.selectors:
#computedSelector.append( parentSelector + ' ' + trim( selector ) )
#return computedSelector
#else:
#return self._declared_selectors.selectors
def get_computedSelectorAsArray(self):
if self.parentObject.get_computedSelectorAsArray() != []:
#if get_class(self.parentObject) == 'SSSIncludeRule' or get_class(self.parentObject) == 'SSSStyleRule':
#if ( (get_class(self.parentObject) == 'SSSStyleRule') or (get_class(self.parentObject) == 'SSSIncludeRule')):
# pdb.set_trace()
computedSelector = []
for parentSelector in self.parentObject.get_computedSelectorAsArray():
for selector in self._declared_selectors.selectors:
computedSelector.append( parentSelector + ' ' + trim( selector ) )
return computedSelector
else:
return self._declared_selectors.selectors
def prependToAllSelectors(self, args):
return self._declared_selectors.prependToAllSelectors(args)
def set_cssText(self, value):
return self._parse(value)
def get_cssText(self):
return self.__str__()
cssText = property(get_cssText, set_cssText)
def get_type(self):
return SSSObject.STYLE_RULE
type = property(get_type)
def get_style(self):
return self.declaration.cssText
style = property(get_style)
def get_styleDeclaration(self):
return self.declaration
styleDeclaration = property(get_styleDeclaration)
def get_selectorText(self):
return self.get_finalSelector()
#def get_selectorList(self):
#return self._computed_selectors
#selectorList = property(get_selectorList)
def __str__(self):
#// output current rule...
string = preg_replace(r'\, ', ",\n", self.selectorText) + " {\n"
#pdb.set_trace()
string += self.getCssTextFromArray(self.getNonStyleRulesAsArray())
#pdb.set_trace()
string += "}\n\n"
# string += "/* stylerules..." + self.selectorText + "...*/"
string += self.getCssTextFromArray(self.getStyleRulesAsArray())
return string
def appendInheritedSelector( self, selector ):
return self._inherited_selectors.appendSelector(selector)
#def appendSelector(self, selector):
#return self._declared_selectors.appendSelector(selector)
def hasSelector(self, target_selector ):
for selector in self._computed_selectors:
if ( selector == target_selector ):
return True
for selector in self._inherited_selectors:
if ( selector == target_selector ):
return True
return False
def addInheritRule(self, cssText):
import InheritRule
inherit_rule = InheritRule.SSSInheritRule()
self.addDeclaration(inherit_rule)
inherit_rule.cssText = cssText
if (self.hostStyleSheet):
inherit_rule_selectors = inherit_rule.selectorList.getSelectorsAsArray( inherit_rule.selectorText )
for inherit_rule_selector in inherit_rule_selectors:
superclass_rules = self.hostStyleSheet.getRulesWithSelector(inherit_rule_selector)
for superclass_rule in superclass_rules:
#superclass_rule_selectors = superclass_rule.get_computedSelectorAsArray()
superclass_rule_selectors = superclass_rule._computed_selectors.selectors
for superclass_rule_selector in superclass_rule_selectors:
self_rule_selectors = self.get_computedSelectorAsArray()
for self_rule_selector in self_rule_selectors:
if (preg_match(' ' + inherit_rule_selector + ' ', ' ' + superclass_rule_selector + ' ')):
additional_selector = preg_replace(' ' + inherit_rule_selector + ' ', ' ' + self_rule_selector + ' ', ' ' + superclass_rule_selector + ' ')
#if not superclass_rule.hasSelector( additional_selector ):
superclass_rule.appendInheritedSelector(additional_selector)
superclass_rule.parentObject.addSelectorReference( additional_selector, superclass_rule )
return inherit_rule