示例#1
0
 def __get_prefixed_prop(self, prefix=None):
     name = self.prop.name
     if prefix:
         name = '-%s-%s' % (prefix, self.prop.name)
     newValues = []
     for value in self.prop.value.split(','):
         parts = value.strip().split(' ')
         parts[0] = prefixRegex.sub('', parts[0])
         if parts[0] in rules and prefix and rules[
                 parts[0]].should_prefix():
             parts[0] = '-%s-%s' % (prefix, parts[0])
         newValues.append(' '.join(parts))
     return cssutils.css.Property(name=name,
                                  value=', '.join(newValues),
                                  priority=self.prop.priority)
示例#2
0
 def __get_prefixed_prop(self, prefix=None):
     name = self.prop.name
     if prefix:
         name = '-%s-%s' % (prefix, self.prop.name)
     newValues = []
     for value in self.prop.value.split(','):
         parts = value.strip().split(' ')
         parts[0] = prefixRegex.sub('', parts[0])
         if parts[0] in rules and prefix and rules[parts[0]].should_prefix():
             parts[0] = '-%s-%s' % (prefix, parts[0])
         newValues.append(' '.join(parts))
     return cssutils.css.Property(
             name=name,
             value=', '.join(newValues),
             priority=self.prop.priority
             )
示例#3
0
def magic(ruleset, debug, minify):
    if hasattr(ruleset, 'style'): # Comments don't
        ruleSet = set(); rules = list()
        children = list(ruleset.style.children())
        ruleset.style = cssutils.css.CSSStyleDeclaration()#clear out the styles that were there
        for rule in children:
            if not hasattr(rule, 'name'):#comments don't have name
                rules.append(rule)
                continue
            name = prefixRegex.sub('', rule.name)
            if name in tr_rules:
                rule.name = name
            if rule.cssText in ruleSet:
                continue
            ruleSet.add(rule.cssText)
            rules.append(rule)

        ruleset.style.seq._readonly = False
        for rule in rules:
            if not hasattr(rule, 'name'):
                ruleset.style.seq.append(rule, 'Comment')
                continue
            processor = None
            try:#try except so if anything goes wrong we don't lose the original property
                if rule.name in tr_rules:
                    processor = tr_rules[rule.name](rule)
                    [ruleset.style.seq.append(prop, 'Property') for prop in processor.get_prefixed_props() if prop]
                #always add the original rule
                if processor and hasattr(processor, 'get_base_prop'):
                    ruleset.style.seq.append(processor.get_base_prop(), 'Property')
                else:
                    ruleset.style.seq.append(rule, 'Property')
            except:
                if debug:
                    print 'warning with ' + str(rule)
                ruleset.style.seq.append(rule, 'Property')
        ruleset.style.seq._readonly = True
    elif hasattr(ruleset, 'cssRules'):
        for subruleset in ruleset:
            magic(subruleset, debug, minify)
    cssText = ruleset.cssText
    if not cssText:#blank rules return None so return an empty string
        return
    if minify or not hasattr(ruleset, 'style'):
        return unicode(cssText)
    return unicode(cssText)+'\n'
示例#4
0
 def __iter_values(self):
     valueSplit = self.prop.value.split(',')
     index = 0
     # currentString = ''
     while(True):
         if index >= len(valueSplit):
             break
         rawValue = valueSplit[index].strip()
         snip = prefixRegex.sub('', rawValue)
         if snip.startswith('linear-gradient'):
             values = [re.sub('^linear-gradient\(', '', snip)]
             if valueSplit[index + 1].strip().endswith(')'):
                 values.append(re.sub('\)+$', '', valueSplit[index + 1].strip()))
             else:
                 values.append(valueSplit[index + 1].strip())
                 values.append(re.sub('\)+$', '', valueSplit[index + 2].strip()))
             if len(values) == 2:
                 yield {
                     'start': values[0],
                     'end': values[1]
                     }
             else:
                 yield {
                     'pos': values[0],
                     'start': values[1],
                     'end': values[2]
                     }
             index += len(values)
         elif snip.startswith('gradient'):
             yield {
                 'start': re.sub('\)+$', '', valueSplit[index + 4].strip()),
                 'end': re.sub('\)+$', '', valueSplit[index + 6].strip()),
                 }
             index += 7
         else:
             # not a gradient so just yield the raw string
             yield rawValue
             index += 1
示例#5
0
 def __iter_values(self):
     valueSplit = self.prop.value.split(',')
     index = 0
     # currentString = ''
     while (True):
         if index >= len(valueSplit):
             break
         rawValue = valueSplit[index].strip()
         snip = prefixRegex.sub('', rawValue)
         if snip.startswith('linear-gradient'):
             values = [re.sub('^linear-gradient\(', '', snip)]
             if valueSplit[index + 1].strip().endswith(')'):
                 values.append(
                     re.sub('\)+$', '', valueSplit[index + 1].strip()))
             else:
                 values.append(valueSplit[index + 1].strip())
                 values.append(
                     re.sub('\)+$', '', valueSplit[index + 2].strip()))
             if len(values) == 2:
                 yield {'start': values[0], 'end': values[1]}
             else:
                 yield {
                     'pos': values[0],
                     'start': values[1],
                     'end': values[2]
                 }
             index += len(values)
         elif snip.startswith('gradient'):
             yield {
                 'start': re.sub('\)+$', '', valueSplit[index + 4].strip()),
                 'end': re.sub('\)+$', '', valueSplit[index + 6].strip()),
             }
             index += 7
         else:
             # not a gradient so just yield the raw string
             yield rawValue
             index += 1
示例#6
0
def magic(ruleset, debug, minify, filt, parser):
    if isinstance(ruleset, cssutils.css.CSSUnknownRule):
        if ruleset.cssText.startswith('@keyframes'):
            inner = parser.parseString(keyframesRegex.split(ruleset.cssText.replace('\n', ''))[1])
            # BUG: doesn't work when minified
            s = '' if minify else '\n'
            return '@-webkit-keyframes {' + s + \
            ''.join([magic(rs, debug, minify, ['webkit'], parser) for rs in inner]) \
            + '}' + s + '@-moz-keyframes {' + s + \
            ''.join([magic(rs, debug, minify, ['moz'], parser) for rs in inner]) \
            + '}' + s + ruleset.cssText
        elif ruleset.cssText.startswith('from') or ruleset.cssText.startswith('to'):
            return ''.join([magic(rs, debug, minify, filt, parser)
                for rs in parser.parseString(blockRegex.sub(r'\1', ruleset.cssText.replace('\n', ''))[1])])
        else:
            return
    elif hasattr(ruleset, 'style'): # Comments don't
        ruleSet = set()
        rules = list()
        children = list(ruleset.style.children())
        ruleset.style = cssutils.css.CSSStyleDeclaration() # clear out the styles that were there
        for rule in children:
            if not hasattr(rule, 'name'): # comments don't have name
                rules.append(rule)
                continue
            name = prefixRegex.sub('', rule.name)
            if name in tr_rules:
                rule.name = name
            if rule.cssText in ruleSet:
                continue
            ruleSet.add(rule.cssText)
            rules.append(rule)

        ruleset.style.seq._readonly = False
        for rule in rules:
            if not hasattr(rule, 'name'):
                ruleset.style.seq.append(rule, 'Comment')
                continue
            processor = None
            try: # try except so if anything goes wrong we don't lose the original property
                if rule.name in tr_rules:
                    processor = tr_rules[rule.name](rule)
                    [ruleset.style.seq.append(prop, 'Property') for prop in processor.get_prefixed_props(filt) if prop]
                # always add the original rule
                if processor and hasattr(processor, 'get_base_prop'):
                    ruleset.style.seq.append(processor.get_base_prop(), 'Property')
                else:
                    ruleset.style.seq.append(rule, 'Property')
            except:
                if debug:
                    print 'warning with ' + str(rule)
                ruleset.style.seq.append(rule, 'Property')
        ruleset.style.seq._readonly = True
    elif hasattr(ruleset, 'cssRules'):
        for subruleset in ruleset:
            magic(subruleset, debug, minify, filt, parser)
    cssText = ruleset.cssText
    if not cssText: # blank rules return None so return an empty string
        return
    if minify or not hasattr(ruleset, 'style'):
        return unicode(cssText)
    return unicode(cssText) + '\n'
示例#7
0
def magic(ruleset, debug, minify, filt, parser):
    if isinstance(ruleset, cssutils.css.CSSUnknownRule):
        if ruleset.cssText.startswith('@keyframes'):
            inner = parser.parseString(
                keyframesRegex.split(ruleset.cssText.replace('\n', ''))[1])
            # BUG: doesn't work when minified
            s = '' if minify else '\n'
            return '@-webkit-keyframes {' + s + \
            ''.join([magic(rs, debug, minify, ['webkit'], parser) for rs in inner]) \
            + '}' + s + '@-moz-keyframes {' + s + \
            ''.join([magic(rs, debug, minify, ['moz'], parser) for rs in inner]) \
            + '}' + s + ruleset.cssText
        elif ruleset.cssText.startswith('from') or ruleset.cssText.startswith(
                'to'):
            return ''.join([
                magic(rs, debug, minify, filt,
                      parser) for rs in parser.parseString(
                          blockRegex.sub(r'\1',
                                         ruleset.cssText.replace('\n', ''))[1])
            ])
        else:
            return
    elif hasattr(ruleset, 'style'):  # Comments don't
        ruleSet = set()
        rules = list()
        children = list(ruleset.style.children())
        ruleset.style = cssutils.css.CSSStyleDeclaration(
        )  # clear out the styles that were there
        for rule in children:
            if not hasattr(rule, 'name'):  # comments don't have name
                rules.append(rule)
                continue
            name = prefixRegex.sub('', rule.name)
            if name in tr_rules:
                rule.name = name
            if rule.cssText in ruleSet:
                continue
            ruleSet.add(rule.cssText)
            rules.append(rule)

        ruleset.style.seq._readonly = False
        for rule in rules:
            if not hasattr(rule, 'name'):
                ruleset.style.seq.append(rule, 'Comment')
                continue
            processor = None
            try:  # try except so if anything goes wrong we don't lose the original property
                if rule.name in tr_rules:
                    processor = tr_rules[rule.name](rule)
                    [
                        ruleset.style.seq.append(prop, 'Property')
                        for prop in processor.get_prefixed_props(filt) if prop
                    ]
                # always add the original rule
                if processor and hasattr(processor, 'get_base_prop'):
                    ruleset.style.seq.append(processor.get_base_prop(),
                                             'Property')
                else:
                    ruleset.style.seq.append(rule, 'Property')
            except:
                if debug:
                    print 'warning with ' + str(rule)
                ruleset.style.seq.append(rule, 'Property')
        ruleset.style.seq._readonly = True
    elif hasattr(ruleset, 'cssRules'):
        for subruleset in ruleset:
            magic(subruleset, debug, minify, filt, parser)
    cssText = ruleset.cssText
    if not cssText:  # blank rules return None so return an empty string
        return
    if minify or not hasattr(ruleset, 'style'):
        return unicode(cssText)
    return unicode(cssText) + '\n'
示例#8
0
def magic(ruleset, debug, minify, filt, parser):
    if isinstance(ruleset, cssutils.css.CSSUnknownRule):
        if ruleset.cssText.startswith("@keyframes"):
            inner = parser.parseString(re.split(r"@keyframes\s?\w+\s?{(.*)}", ruleset.cssText.replace("\n", ""))[1])
            # TODO: DRY, un-mess this up
            # BUG: doesn't work when minified
            s = "" if minify else "\n"
            return (
                "@-webkit-keyframes {"
                + s
                + "".join([magic(rs, debug, minify, ["webkit"], parser) for rs in inner])
                + "}"
                + s
                + "@-moz-keyframes {"
                + s
                + "".join([magic(rs, debug, minify, ["moz"], parser) for rs in inner])
                + "}"
                + s
                + ruleset.cssText
            )
        elif ruleset.cssText.startswith("from") or ruleset.cssText.startswith("to"):
            return "".join(
                [
                    magic(rs, debug, minify, filt, parser)
                    for rs in parser.parseString(re.sub(r"\w+\s?\{(.*)\}", r"\1", ruleset.cssText.replace("\n", ""))[1])
                ]
            )
        else:
            return
    elif hasattr(ruleset, "style"):  # Comments don't
        ruleSet = set()
        rules = list()
        children = list(ruleset.style.children())
        ruleset.style = cssutils.css.CSSStyleDeclaration()  # clear out the styles that were there
        for rule in children:
            if not hasattr(rule, "name"):  # comments don't have name
                rules.append(rule)
                continue
            name = prefixRegex.sub("", rule.name)
            if name in tr_rules:
                rule.name = name
            if rule.cssText in ruleSet:
                continue
            ruleSet.add(rule.cssText)
            rules.append(rule)

        ruleset.style.seq._readonly = False
        for rule in rules:
            if not hasattr(rule, "name"):
                ruleset.style.seq.append(rule, "Comment")
                continue
            processor = None
            try:  # try except so if anything goes wrong we don't lose the original property
                if rule.name in tr_rules:
                    processor = tr_rules[rule.name](rule)
                    [ruleset.style.seq.append(prop, "Property") for prop in processor.get_prefixed_props(filt) if prop]
                # always add the original rule
                if processor and hasattr(processor, "get_base_prop"):
                    ruleset.style.seq.append(processor.get_base_prop(), "Property")
                else:
                    ruleset.style.seq.append(rule, "Property")
            except:
                if debug:
                    print "warning with " + str(rule)
                ruleset.style.seq.append(rule, "Property")
        ruleset.style.seq._readonly = True
    elif hasattr(ruleset, "cssRules"):
        for subruleset in ruleset:
            magic(subruleset, debug, minify, filt, parser)
    cssText = ruleset.cssText
    if not cssText:  # blank rules return None so return an empty string
        return
    if minify or not hasattr(ruleset, "style"):
        return unicode(cssText)
    return unicode(cssText) + "\n"