Seite 1 von 1

cssparser

Verfasst: Donnerstag 1. Oktober 2009, 20:10
von stuhlbein
Ein wirklich vollkommen idiotischer, und extrem simpler css parser, den ich vor geschätzten 10 minuten in 14 zeilen schrieb.
Und vermutlich wäre das zum parsen einer sehr simplen Konfigurations-beschreibungssprache besser geeignet als für CSS. aber er *funktioniert*! :D
Und nein, reguläre ausdrücke sind nicht grad meine stärke. :P

Code: Alles auswählen

def cssparse(string):
    parts = re.findall(
        r'(?P<cssgroup>(.*?)\{(.*?)\})', string, re.MULTILINE | re.DOTALL)
    cssdata = {}
    for item in parts:
        blockname, content = item[0].split('{')
        blockname = blockname.strip()
        content = content[:-1]
        cssdata[blockname] = {}
        for pair in content.split(';'):
            if pair and ':' in pair:
                key, value = pair.split(':')
                cssdata[blockname][key.strip()] = value.strip()
    return cssdata
[/code]

Verfasst: Samstag 3. Oktober 2009, 11:19
von sma
Du kannst deinen regulären Ausdruck noch etwas kürzen:

Code: Alles auswählen

def cssparse(s): 
    rules = {} 
    for m in re.finditer(r'(?ms)\s*(.*?)\s*\{\s*(.*?)\s*\}', s):
        names, decls = m.groups()
        exprs = {}
        for name in re.split(r'\s*,\s*', names):
            rules[name] = exprs
        for decl in re.split(r'\s*;\s*', decls):
            if decl and ':' in decl: 
                prop, expr = re.split(r"\s*:\s*", decl, 1)
                exprs[prop] = expr
    return rules
Ich habe mir erlaubt, die Namen noch an "," zu trennen. Zum Teilen würden ich übrigens auch die Funktion aus re benutzen, denn dann muss man nicht nachträglich noch ein strip aufrufen.

Ich würde das ganze allerdings keinen CSS-Parser nennen, denn die Sprache ist doch etwas komplizierter. Beachte auch, dass die Reihenfolge der Regeln, die du durch `cssdata` verlierst, eigentlich wichtig ist. Ein } oder ; innerhalb eines String-Ausdrucks bringt deinen Parser durcheinander. Du erkennt auch keine Escape-Zeichen.

Stefan

Verfasst: Samstag 3. Oktober 2009, 21:18
von stuhlbein
sma hat geschrieben: Ich würde das ganze allerdings keinen CSS-Parser nennen, denn die Sprache ist doch etwas komplizierter. Beachte auch, dass die Reihenfolge der Regeln, die du durch `cssdata` verlierst, eigentlich wichtig ist. Ein } oder ; innerhalb eines String-Ausdrucks bringt deinen Parser durcheinander. Du erkennt auch keine Escape-Zeichen.
"Ein wirklich vollkommen idiotischer, und extrem simpler css parser" ....
Für den professionellen einsatz würde ich ohnehin zu Webkit's CSS Parser raten, das hier ist eher ein proof of concept :D

Ich find deine version allerdings tatsächlich besser. ;)

Verfasst: Sonntag 4. Oktober 2009, 10:13
von jens
btw. ich würde die REs vorher compilieren, das macht es etwas schneller ;)

Vielleicht könnte man das ganze verwenden um CSS Dateien automatisch zu formatieren. Allerdings ist i.d.R. die Reihenfolge ganz entscheidend ;)