AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CSS Parser

Ein Thema von MasterEvil · begonnen am 22. Feb 2005 · letzter Beitrag vom 23. Feb 2005
Antwort Antwort
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#1

CSS Parser

  Alt 22. Feb 2005, 13:55
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
  Mit Zitat antworten Zitat
gekmihesg
(Gast)

n/a Beiträge
 
#2

Re: CSS Parser

  Alt 22. Feb 2005, 14:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: CSS Parser

  Alt 22. Feb 2005, 14:34
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
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#4

Re: CSS Parser

  Alt 22. Feb 2005, 14:54
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
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
bttb930

Registriert seit: 6. Okt 2003
372 Beiträge
 
#5

Re: CSS Parser

  Alt 22. Feb 2005, 14:56
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.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#6

Re: CSS Parser

  Alt 22. Feb 2005, 17:26
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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: CSS Parser

  Alt 22. Feb 2005, 17:51
Wenn du nicht alles durchgehen möchtest, könntest du auch Delphi-Referenz durchsuchenPosEx verwenden, das ist bestimmt schneller, als alles einzelnd durchzugehen.
  Mit Zitat antworten Zitat
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: CSS Parser

  Alt 23. Feb 2005, 07:37
Vielen dank für eure Antworten.

Ich werd mir mal ein paar Gedanken machen.

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 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:07 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