예제 #1
0
    def append(self, val, typ=None, space=True, keepS=False, indent=False, 
               lineSeparator=False):
        """Appends val. Adds a single S after each token except as follows:
        
        - typ COMMENT
            uses cssText depending on self.ser.prefs.keepComments
        - typ "Property", cssutils.css.CSSRule.UNKNOWN_RULE
            uses cssText
        - typ STRING
            escapes helper.string
        - typ S
            ignored except ``keepS=True``
        - typ URI
            calls helper.uri
        - val ``{``
            adds LF after
        - val ``;``
            removes S before and adds LF after
        - val ``, :``
            removes S before
        - val ``+ > ~``
            encloses in prefs.selectorCombinatorSpacer
        - some other vals
            add ``*spacer`` except ``space=False``
        """
        prefspace = self.ser.prefs.spacer
        
        if val or typ in ('STRING', 'URI'):
            # PRE
            if 'COMMENT' == typ:
                if self.ser.prefs.keepComments:
                    val = val.cssText
                else: 
                    return
            elif hasattr(val, 'cssText'):
                val = val.cssText
#            elif typ in ('Property', cssutils.css.CSSRule.UNKNOWN_RULE):
#                val = val.cssText
            elif 'S' == typ and not keepS:
                return
            elif 'S' == typ and keepS:
                val = u' '
            elif typ in ('NUMBER', 'DIMENSION', 'PERCENTAGE') and val == '0':
                # remove sign + or - if value is zero
                # TODO: only for lenghts!
                if self.out and self.out[-1] in u'+-':
                    del self.out[-1]
            elif 'STRING' == typ:
                # may be empty but MUST not be None
                if val is None: 
                    return
                val = helper.string(val) 
                if not prefspace:
                    self._remove_last_if_S()
            elif 'URI' == typ:
                val = helper.uri(val)
            elif 'HASH' == typ:
                val = self.ser._hash(val)
            elif val in u'+>~,:{;)]/':
                self._remove_last_if_S()
                
            # APPEND
            if indent:
                self.out.append(self.ser._indentblock(val, self.ser._level+1))
            else:
                self.out.append(val)
            # POST
            if lineSeparator:
                # Property , ...
                pass
            elif val in u'+>~': # enclose selector combinator
                self.out.insert(-1, self.ser.prefs.selectorCombinatorSpacer)
                self.out.append(self.ser.prefs.selectorCombinatorSpacer)
            elif u',' == val: # list
                self.out.append(self.ser.prefs.listItemSpacer)
            elif u':' == val: # prop
                self.out.append(self.ser.prefs.propertyNameSpacer)
            elif u'{' == val: # block start
                self.out.insert(-1, self.ser.prefs.paranthesisSpacer)
                self.out.append(self.ser.prefs.lineSeparator)
            elif u';' == val: # end or prop or block
                self.out.append(self.ser.prefs.lineSeparator)
            elif val not in u'}[]()/' and typ != 'FUNCTION' and space:
                self.out.append(self.ser.prefs.spacer)
                if typ != 'STRING' and not self.ser.prefs.spacer and \
                   self.out and not self.out[-1].endswith(u' '):
                    self.out.append(u' ')
예제 #2
0
파일: serialize.py 프로젝트: mozilla/spade
    def append(self, val, type_=None, space=True, keepS=False, indent=False):
        """Appends val. Adds a single S after each token except as follows:

        - typ COMMENT
            uses cssText depending on self.ser.prefs.keepComments
        - typ "Property", cssutils.css.CSSRule.UNKNOWN_RULE
            uses cssText
        - typ STRING
            escapes helper.string
        - typ S
            ignored except ``keepS=True``
        - typ URI
            calls helper.uri
        - val ``{``
            adds LF after
        - val ``;``, typ 'styletext'
            removes S before and adds LF after
        - val ``, :``
            removes S before
        - val ``+ > ~``
            encloses in prefs.selectorCombinatorSpacer
        - some other vals
            add ``*spacer`` except ``space=False``
        """
        prefspace = self.ser.prefs.spacer
        if val or type_ in ('STRING', 'URI'):
            # PRE
            if 'COMMENT' == type_:
                if self.ser.prefs.keepComments:
                    val = val.cssText
                else:
                    return
            elif hasattr(val, 'cssText'):
                val = val.cssText
#            elif type_ in ('Property', cssutils.css.CSSRule.UNKNOWN_RULE):
#                val = val.cssText
            elif 'S' == type_ and not keepS:
                return
            elif 'S' == type_ and keepS:
                val = u' '


#            elif type_ in ('NUMBER', 'DIMENSION', 'PERCENTAGE') and val == u'0':
#                # remove sign + or - if value is zero
#                # TODO: only for lenghts!
#                if self.out and self.out[-1] in u'+-':
#                    del self.out[-1]
            elif 'STRING' == type_:
                # may be empty but MUST not be None
                if val is None:
                    return
                val = helper.string(val)
                if not prefspace:
                    self._remove_last_if_S()
            elif 'URI' == type_:
                val = helper.uri(val)
            elif 'HASH' == type_:
                val = self.ser._hash(val)
            elif val in u'+>~,:{;)]/=}':
                self._remove_last_if_S()

            # APPEND

            if indent or (val == u'}' and self.ser.prefs.indentClosingBrace):
                self.out.append(self.ser._indentblock(val,
                                                      self.ser._level + 1))
            else:
                if val.endswith(u' '):
                    self._remove_last_if_S()
                self.out.append(val)

            # POST
            if val in u'+>~':  # enclose selector combinator
                self.out.insert(-1, self.ser.prefs.selectorCombinatorSpacer)
                self.out.append(self.ser.prefs.selectorCombinatorSpacer)
            elif u')' == val and not keepS:  # CHAR funcend
                # TODO: pref?
                self.out.append(u' ')
            elif u',' == val:  # list
                self.out.append(self.ser.prefs.listItemSpacer)
            elif u':' == val:  # prop
                self.out.append(self.ser.prefs.propertyNameSpacer)
            elif u'{' == val:  # block start
                self.out.insert(-1, self.ser.prefs.paranthesisSpacer)
                self.out.append(self.ser.prefs.lineSeparator)
            elif u';' == val or 'styletext' == type_:  # end or prop or block
                self.out.append(self.ser.prefs.lineSeparator)
            elif val not in u'}[]()/=' and space and type_ != 'FUNCTION':
                self.out.append(self.ser.prefs.spacer)
                if type_ != 'STRING' and not self.ser.prefs.spacer and \
                   self.out and not self.out[-1].endswith(u' '):
                    self.out.append(u' ')