2009-04-23 7 views
5

Jungs, ich brauche ein Werkzeug zu entwickeln, die folgenden Anforderungen erfüllen würde:CSS-Parser + XHTML Generator, Beratung erforderlich

  1. Input: XHTML-Dokument mit CSS-Regeln innerhalb head Abschnitts.
  2. Output: XHTML-Dokument mit CSS-Regeln in Tag berechnet Attribute

Der beste Weg, um das Verhalten Ich möchte zu zeigen, wie folgt ist.

Beispiel Eingabe:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
    <style type="text/css" media="screen"> 
    .a { color: red; } 
     p { font-size: 12px; } 
    </style> 
</head> 
<body> 
    <p class="a">Lorem Ipsum</p> 
    <div class="a"> 
     <p>Oh hai</p> 
    </div> 
</body> 
</html> 

Beispiel Ausgabe:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<body> 
    <p style="color: red; font-size: 12px;">Lorem Ipsum</p> 
    <div style="color: red;"> 
     <p style="font-size: 12px;">Oh hai</p> 
    </div> 
</body> 
</html> 

Welche Tools/Bibliotheken für diese Aufgabe am besten passen? Ich bin mir nicht sicher, ob BeautifulSoup und cssutils dazu in der Lage sind.

Python ist keine Voraussetzung. Alle Empfehlungen werden sehr geschätzt.

+1

Sind Sie sicher, dass Sie das tun möchten? Ich sehe keinen Grund, warum das nützlich wäre ... – chills42

+0

Meine erste Frage wäre warum? – roryf

+1

Ich wollte dir Hintergrund davon ersparen :). Kurz gesagt, es geht darum, CSS-getriebene E-Mails zu versenden. Es ist also ein Werkzeug, um die Entwicklung solcher Nachrichten zu erleichtern. Und nein, es geht nicht darum, Spam zu versenden. – ohnoes

Antwort

0

Hängt davon ab, wie kompliziert Ihr CSS sein wird. Wenn es eine einfache Frage von Elementen ("p {}", "a {}"), IDs/Klassen (#test {}) ist, dann ist es wahrscheinlich am einfachsten, reguläre Ausdrücke zu verwenden. Sie müssten einen haben, um alle Stildefinitionen zu finden und diese dann zu analysieren. Verwenden Sie dann regulärere Ausdrücke, um nach passenden übereinstimmenden Tags zu suchen.

Für zum Beispiel, wenn Sie gefunden haben Sie einen Stil für eine Tags, Sie einen regulären Ausdruck wie verwenden:

<a\b[^>]*>(.*?)</a> 

sich zu bekommen, dann würden Sie ein zu tun haben, zu ersetzen hinzufügen der Style. Natürlich sollte die Regex das Tag als Parameter akzeptieren (in diesem Fall das A-Tag).

Wenn Sie in Kinderauswahl oder irgendetwas mehr als nur Root-Elemente und ID/Klassen bekommen, könnte dies schnell chaotisch werden.

Denken Sie nur daran, die Stile inline zu definieren?

1

Während ich ein bestimmtes Werkzeug weiß nicht, dies zu tun, hier ist der grundlegende Ansatz, den ich nehmen würde:

Als XML-Dokument laden
Extrahieren Sie die CSS-Klassen und -Stile aus Dokument
Für jedes Paar von CSS-Klasse und Stil
    Baukonstruktion XPath-Abfrage von CSS-Klasse
    Für jeden passenden Knoten
        das Attributs style Set für diese Klasse
entfernen Stil Knoten aus dem Dokument Convert Dokument zu string