cssparser

Code-Stücke können hier veröffentlicht werden.
Antworten
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

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]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
stuhlbein
User
Beiträge: 89
Registriert: Freitag 9. Januar 2009, 16:08

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. ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten