css-Datei in String kopieren

Für Fragen von Einsteigern und Programmieranfängern...
Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

css-Datei in String kopieren

Beitrag von Andromeda »

Hallo,

ich möchte den Text einer css-Datei manipulieren. Genauer gesagt, möchte ich einen ganzen Textabschnitt mit einem anderen Textabschnitt ersetzen. Ich mache das mit POS, COPY, DELETE und INSERT. Solange es sich um normalen Text handelt, funktioniert das auch ganz gut, aber Zeilenumbrüche und die geschweifte Klammer machen mir Probleme. Einen Textabschnitt mit einem Zeilenumbruch kann ich beispielsweise nicht in einen String kopieren.

Ich wäre sehr dankbar, wenn mir jemand sagen würde, wie ich das vielleicht trotzdem hinbekommen könnte.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: css-Datei in String kopieren

Beitrag von wp_xyz »

Was ist denn das Problem? Wieso solle man keinen Zeilenumbruch (#13#10, oder #13, oder #10, je nach Betriebssystem - oder allgemein LineEnding als Konstante) nicht in einen anderen String einfügen können? Und was ist das Problem mit der geschweiften Klammer? Wenn sie schön in Anführungszeichen steht, kann sie vom Compiler nicht als Kommentarzeichen missverstanden werden.

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: css-Datei in String kopieren

Beitrag von Andromeda »

Vielen Dank,

ich möchte die Stelle finden, an der folgendes steht:
a {
color: #08c;

Das habe ich jetzt so versucht:

Code: Alles auswählen

 
procedure TFormHaupt.Button1Click(Sender: TObject);
var
  t : TStringList;
  X, Y : String;
  i, j : Integer;
begin
  if FileExists('template.css') then
    begin
      t := TStringList.Create;
      t.LoadFromFile('template.css');
      X := t.Text;
      i := POS('a "{"',X);             
      Label1.Caption:='Position: ' +IntToStr(i);
    end;
end;
 
Aber das Programm findet die Stelle nicht, auch wenn ich die 2. Zeile weglasse. Wenn ich die geschweifte Klammer in Anführungszeichen setze, wird die Stelle nicht gefunden, und wenn ich die Anführungszeichen weglasse, meldet Lazarus einen Fehler.

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: css-Datei in String kopieren

Beitrag von theo »

Andromeda hat geschrieben: und wenn ich die Anführungszeichen weglasse, meldet Lazarus einen Fehler.
Wieso das denn und welchen Fehler?

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: css-Datei in String kopieren

Beitrag von wp_xyz »

Wieso geht das nicht? Ich meinte natürlich die einfachen Anführungszeichen, mit denen man einen String kennzeichnet. Falls mit diesem Code die Stelle nicht gefunden wird, ist vielleicht kein oder mehrere Leerzeichen oder ein Tabulator (#9) zwischen "a" und "{" (wobei letzterer Fall hier auch geprüft wird - aber es gibt sehr viele Möglichkeiten, in diesem Fall musst du dir etwas anderes überlegen...):

Code: Alles auswählen

procedure TFormHaupt.Button1Click(Sender: TObject);
var
  t : TStringList;
  X, Y : String;
  i, j : Integer;
begin
  if FileExists('template.css') then
    begin
      t := TStringList.Create;
      t.LoadFromFile('template.css');
      X := t.Text;
      i := POS('a {',X);              // ohne die doppelten Anführungszeichen! 
      if i = 0 then i := POS('a'#9'{', X);  // Tabulator statt Leerzeichen?
      Label1.Caption:='Position: ' +IntToStr(i);
    end;
end; 

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: css-Datei in String kopieren

Beitrag von Andromeda »

Gibt es vielleicht eine Möglichkeit, womit ich die unsichtbaren Zeichen (Leerzeichen, Zeilenumbrüche usw.) sichtbar machen kann?

Möglicherweise auch außerhalb von Lazarus. Nur damit ich mal sehen kann, was da noch so alles verborgenes drin steht.

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: css-Datei in String kopieren

Beitrag von wp_xyz »

In Lazarus: Rechtsklick auf Editor --> "Einstellungen" --> "Editor" --> "Allgemein" --> "Verschiedenes" --> Rechts oben "Sonderzeichen anzeigen"

Achtzig
Beiträge: 90
Registriert: Mo 15. Okt 2007, 13:09
OS, Lazarus, FPC: Debian
CPU-Target: xxBit

Re: css-Datei in String kopieren

Beitrag von Achtzig »

Ich nutze unter Debian den Bless HexEditor. Unter Windows wird als Vergleichbares geben.

Ein HexEditor bietet sich nicht nur für Textdateien, sondern auch für Binärdateien an.

Epcop
Beiträge: 159
Registriert: Di 29. Mai 2012, 09:36

Re: css-Datei in String kopieren

Beitrag von Epcop »

Verstehe was du meinst... aber das ist eher ein schwieriges Unterfangen. Prinzipiell ist Pos gut. Doch du hast nie die Garantie wie die CSS Datei wirklich aussieht. Nach dem "a" und dem "{" gibt es zig Möglichkeiten: Eine oder mehrere Leerzeichen, eine oder mehrere Zeilenumbrüchee, Einrückungen, usw. Das wird mit einer einzelnen Pos nicht möglich sein.

Entweder du durchläufst das alles Zeichen für Zeichen (evtl. kombiniert mit Pos). Oder, und das würde ich dir eher raten, ist die Nutzung von Regulären Ausdrücken.

Eine weitere Idee ist, dass du vor dem Suchen versucht die CSS selbst zu formatieren - aber auch das ist eher eine Unsichere Variante.

Wenn die CSS Datei immer gleich ist und du weißt wo du was austauschen willst, dann kannst du auch - ganz ungeachtet was dort steht - den Text oder die Zeilen austauschen.

LG

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: css-Datei in String kopieren

Beitrag von Andromeda »

Epcop hat geschrieben: Oder, und das würde ich dir eher raten, ist die Nutzung von Regulären Ausdrücken.
Und was heißt das bitte?

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: css-Datei in String kopieren

Beitrag von Socke »

Andromeda hat geschrieben:
Epcop hat geschrieben: Oder, und das würde ich dir eher raten, ist die Nutzung von Regulären Ausdrücken.
Und was heißt das bitte?
Hier findest du allgemeine Informationen zu dem Thema
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6782
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: css-Datei in String kopieren

Beitrag von af0815 »

Andromeda hat geschrieben:
Epcop hat geschrieben: Oder, und das würde ich dir eher raten, ist die Nutzung von Regulären Ausdrücken.
Und was heißt das bitte?
Google sagt dazu: https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck und http://wiki.freepascal.org/Regexpr/de

Siehe auch fpc Sourcen, package/regexpr und dort examples
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: css-Datei in String kopieren

Beitrag von pluto »

Ich hatte mir mal dafür ein Parser geschrieben. Zugegeben, der wurde nie 100% Fertig, aber einfache CSS Dateien konnte ich damit schon einlesen oder sagen wir einfach: Die hälfte der CSS Möglichkeiten konnte ich bereits "Parsen".

Ich denke, dir wird nichts anderes übrig bleiben, als eine EIGENE Datenstruktur zu erstellen und einen Parser zu schreiben.
Das klingt aufwendig, aber so schwer ist CSS auch wieder nicht, auch wenn es viel Ausnahmen gibt und Sachen die zu beachten sind z.b. parsen verschiedene Browser CSS Dateien auf ihre art und weise.

Wenn ich meine letzte Version wieder finden sollte, kann ich sie ja mal hochladen.

Du könntest dir mal das HTML Panel anschauen, der CSS Parser dort ist noch einfacher gehalten. Zeig aber sehr gut, wie sowas gehen könnte, auch wenn man diesen Weg vielleicht nicht gehen möchte.
MFG
Michael Springwald

Epcop
Beiträge: 159
Registriert: Di 29. Mai 2012, 09:36

Re: css-Datei in String kopieren

Beitrag von Epcop »

Wenn man es noch einfach halten will:

Mit pos nach "a" suchen, danach das erste { und dann das nächste } . Und dann hat man eigentlich schon den Bereich.

Nur bei "a" muss man dann auch noch aufpassen. Bin nicht ganz so Fit in CSS. Aber da gäbe es ja auch noch a:link a:visit #a .a usw. Da müsste man evtl. noch differenzieren und extra prüfungen machen. Wenn es aber eine kleine überschaubere CSS ist, wäre das eine einfache Option.

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: css-Datei in String kopieren

Beitrag von Andromeda »

Vielen Dank an Alle,

dass das Ganze am Anfang nicht so richtig funktioniert hat, liegt nur daran, dass ich mich zu doof angestellt habe. Inzwischen klappt das mit POS, COPY usw. recht gut. Ich taste mich in drei Stufen an die gesuchte Stelle heran. Mit dem Programm möchte ich die Farben in der template.css austauschen. Es handelt sich um das Joomla-Template Protostar. Die Schwierigkeit liegt darin, dass die Datei über 7.000 Zeilen lang ist und die Farben manchmal 3-stellig und manchmal 6-stellig eingetragen sind. Außerdem gibt es ständig Updates, so dass man sich auch nicht auf die Zeilennummern verlassen kann. Aber jetzt funktioniert das Ganze im Prinzip und alles Weitere ist nur noch Fleißarbeit.

Antworten