Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CSS Parser (https://www.delphipraxis.net/40876-css-parser.html)

MasterEvil 22. Feb 2005 13:55


CSS Parser
 
Hi leutz,

hab ein Problem und hoffe das hier jemand eine Idee hat.
Und zwar progge ich gerade an einem CSS Designer (siehe auch hier im Freeware-Forum von DP) und habe die CSS Parsing Routinen selber geschrieben.
Das klappt auch alles wunderbar. Nur eine Sache macht mir Kopfzerbrechen: Kommentare.

Ich finde keine vernünftige Lösung um Kommentare Vernünftig zu parsen.
Kommentare in CSS werden wie in C++ gemacht, mit /* */.

Um die CSS Datei zu parsen hangel ich mich an den Trennsymbolen entlang.
Sprich: { } : ;
Kommentare die keinen Quellcode einschließen kann ich ganz leicht parsen.
Das Problem machen mir Sachen wo Quellcode auskommentiert wurde:
/* font-family: sans-serif;*/

Ich kann auch nicht alle Kommentare einfach vorher herausparsen, da ich sie später wieder an der richtigen position brauche um die css datei wieder zusammen zu setzen. Und wenn ich sie vorher rausholen weiss ich nicht an welcher stelle sie standen.

Jemand ne ahnung? Wie wird sowas gemacht?
Danke schonmal.

greetz
Steffen

gekmihesg 22. Feb 2005 14:02

Re: CSS Parser
 
also wenn du die datei in ner schleife durchläufst musst du ja einfach nur ein flag setzen wenn /* kommt und wieder zurücksetzen wenn */ kommt. solange das flag gesetzt is darfst du halt dann einfach keinen code mehr parsen.

MasterEvil 22. Feb 2005 14:34

Re: CSS Parser
 
das würde aber vorraussetzen das ich die datei buchstabe für buchstabe durchgehe.
das tu ich nicht.
und so ist es sehr schwer rauszubekommen wo denn der anfang ist und wo das ende.

ich hole mir immer die einzelnen teile,
beginnen tu ich aussen.
hole mir erstmal alles vor dem ersten {
gucke ob da ganze kommentare drin sind und schneide sie raus
der rest ist der klassenname.
zu dem hole ich mir dann den inhalt, alles was zwischen { und } steht.
der inhalt wird in einer weitere methode übergeben.
dort geht das spiel wieder los:
hole erst alles vor dem ersten :
das is das property. schneide die kommentare aus.
hole alles zwischen : und ;
das is das value.

und so weiter ...
jedenfalls im groben.
vielleicht versteht man mein problem jetzt besser ;)

phlux 22. Feb 2005 14:54

Re: CSS Parser
 
Guck doch nach bevor du den Property namen ausliest ob die zeile mit /* beginnt, bzw mit */ endet diesen auszug kannst du dann wiederrum getrennt parsen

bttb930 22. Feb 2005 14:56

Re: CSS Parser
 
ich hab gerade ein ähnliches problem gehabt. nachdem ich auch erstmal nicht zeichen für zeichen parsen wollte, habe ich das letztendlich doch gemacht. Unter anderem weil das eine wesentlich höhere geschwindigkeit (bei riesigen dateien) möglich macht (denn man kopiert den string nicht mehr ständig im hauptspeicher, sondern lädt ihn einmal und läßt ihn dann dort liegen wo er ist).

css-dateien sind in der regel aber nicht besonders groß...

ich denke mal du solltest dir einen baum aufbauen (sowas macht man beim parsen fast immer). dann kannst du's auch an der richtigen stelle wieder einfügen.

mirage228 22. Feb 2005 17:26

Re: CSS Parser
 
Hi,

ich hatte bei meinem PHP Inspector (in der Open-Source Sparte) ein Ähnliches Problem. Da ging es auch um die Kommentare in PHP.

Ich habe dafür einen regulären Ausdruck verwendet, der alle Kommentare in einem Text gesucht hat.
Das ganze habe ich dann in eine TPHPComments Klasse gepackt, die einmalig mit dem SourceText gefüttert wird und dann eine Liste mit den Kommentaren erzeugt.

Bevor ich ein gefundenes Attribut, Klasse, oder was auch immer der entsprechenden Liste hinzugefügt habe, prüfe ich anhand der Position im Text, ob sich der Eintrag, den ich gefunden habe, innerhalb eines Kommentares befindet oder nicht.

Als Optimierung habe ich die Klasse für die Kommentare noch soweit umgebaut, dass Kommentare nur dann gesucht werden, falls nach einem Kommentar an einer bestimmten Stelle gefragt (es wird dann nur bis dahin geparsed).

Vielleicht hilft Dir dieser Ansatz weiter. Du kannst gerne auch mal im Quellcode meiner Unit schauen und Dich anregen lassen ;)

mfG
mirage228

Matze 22. Feb 2005 17:51

Re: CSS Parser
 
Wenn du nicht alles durchgehen möchtest, könntest du auch Delphi-Referenz durchsuchenPosEx verwenden, das ist bestimmt schneller, als alles einzelnd durchzugehen.

MasterEvil 23. Feb 2005 07:37

Re: CSS Parser
 
Vielen dank für eure Antworten.

Ich werd mir mal ein paar Gedanken machen.

Zitat:

Zitat von phlux
Guck doch nach bevor du den Property namen ausliest ob die zeile mit /* beginnt, bzw mit */ endet diesen auszug kannst du dann wiederrum getrennt parsen

Ich lese nicht nach zeilen aus. CSS ist es egal ob man den ganzen kram in einer zeile stehen hat oder das ganze aufteilt. Deswegen kann ich das nicht machen.

Zitat:

Zitat von Matze
Wenn du nicht alles durchgehen möchtest, könntest du auch Schau in die Delphi-HilfePosEx verwenden, das ist bestimmt schneller, als alles einzelnd durchzugehen.

Dann weiss ich aber auch nur beim wievielten Buchstaben er anfängt. Damit krieg ich es am Ende ja nicht wieder zusammen gesetzt.

@mirage228
Vielen Dank. Ich werd es mir mal anschauen und gucken ob ich dort Ansätze finde.

@bttb930
Mal sehen. Wenn es sich nicht anders lösen lässt muss ich es wohl so machen.
Dann schreib ich es halt nochmal neu ;)

greetz
Steffen


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz