Mailinglist Archive: opensuse-de (2461 mails)
| < Previous | Next > |
Re: OT: HTML-Problem
- From: David Haller <david@xxxxxxxxxx>
- Date: Wed, 15 Jun 2005 07:47:47 +0200
- Message-id: <20050615054747.GA7138@xxxxxxxxxxxxxxxxxx>
Hallo,
Am Wed, 15 Jun 2005, Mario van der Linde schrieb:
>Am Mittwoch, 15. Juni 2005 04:06 schrieb David Haller:
>[...]
>>
>> Hast du den Pfad zum CSS und bleibt der gleich?
>
>Jep.
Gut. Dann ist die Loesung ueber eine Kommandozeilenoption wohl
passend.
>> Achtung: das script habe ich nur geringfuegig und mit einer Datei /
>> einem CSS getestet...
>
>[Script]
>
>Hui, das muss ich mir jetzt erst mal zu Gemüte führen - das sieht so
>aus, als würde es mir tatsächlich viel Tipp-Arbeit abnehmen...
*g*
>Dafür muss ich das aber erst mal verstehen (reguläre Ausdrücke
>verursachen bei mir immer ein gewisses Unbehagen, um es vorsichtig zu
>formulieren).
Die verwendeten auch schon recht "fies", was eben an der sgml/html
Syntax liegt, auch wenn fast alle dem gleichen Schema folgen.
Generell hilft es, die REs "auseinanderzunehmen", d.h. Stueck fuer
Stueck zu betrachten (und man perlre nebendran). Betrachte die erste
RE z.B. mal so (und schreibe dir die Erklaerung dahinter):
^
(.*)
<(\w+)
(\s+[^>]+)?
\s+
id=
"?
([^"\s]+)
"?
(.*)
$
Die anderen REs sind aehnlich.
BTW: ich habe nicht getestet, was passiert, wenn mehrere Elemente auf
einer Zeile sind (also z.B. <foo class="bar"><baz class="fubar">).
Da muss man evtl. noch etwas basteln. HTML zu parsen ist aber extrem
eklig, deswegen nur die einfache Version.
>Wenn ich das beim ersten Überfliegen richtig sehe muss ich noch etwas
>erweitern - Styles von HTML-Elementen die weder über eine id noch
>über class identifiziert werden, sondern alleine über das Element
>selbst (z.B. Dokumentweit geltende Listenformatierungen) werden durch
>das Script nicht berücksichtigt, oder?
Stimmt. Da musst du schauen, mit welcher RE du die faengst und wie das
CSS aussieht (d.h. wie die Elemente im Hash %css landen).
Wo du ein weiteres "if" platzierst ist relativ egal, mehrfache style="..."
attribute werden ja durch
if ( /\s+style=/ ) {
s/\s+style="([^"]+)"(.*)style="([^"]+)"/ style="$1 $3" $2/g;
}
zu einem einzigen zusammengesetzt ;)
Hm. UNGETESTET(!):
if( /^(.*)<(tagname1|foo|bar|tagname4)([\s\/>]+.*)$/ ) {
if( $css{$2} ) {
$_ = "$1<$2 style=" . $css{$2} . "$3";
} else {
print STDERR "Warning: style for tag `$2' not found.\n";
}
}
HTH,
-dnh
--
Qual Qual oh Qual wo bist Du oh Qual oh Qual
-- B. Brodesser in suse-talk
Am Wed, 15 Jun 2005, Mario van der Linde schrieb:
>Am Mittwoch, 15. Juni 2005 04:06 schrieb David Haller:
>[...]
>>
>> Hast du den Pfad zum CSS und bleibt der gleich?
>
>Jep.
Gut. Dann ist die Loesung ueber eine Kommandozeilenoption wohl
passend.
>> Achtung: das script habe ich nur geringfuegig und mit einer Datei /
>> einem CSS getestet...
>
>[Script]
>
>Hui, das muss ich mir jetzt erst mal zu Gemüte führen - das sieht so
>aus, als würde es mir tatsächlich viel Tipp-Arbeit abnehmen...
*g*
>Dafür muss ich das aber erst mal verstehen (reguläre Ausdrücke
>verursachen bei mir immer ein gewisses Unbehagen, um es vorsichtig zu
>formulieren).
Die verwendeten auch schon recht "fies", was eben an der sgml/html
Syntax liegt, auch wenn fast alle dem gleichen Schema folgen.
Generell hilft es, die REs "auseinanderzunehmen", d.h. Stueck fuer
Stueck zu betrachten (und man perlre nebendran). Betrachte die erste
RE z.B. mal so (und schreibe dir die Erklaerung dahinter):
^
(.*)
<(\w+)
(\s+[^>]+)?
\s+
id=
"?
([^"\s]+)
"?
(.*)
$
Die anderen REs sind aehnlich.
BTW: ich habe nicht getestet, was passiert, wenn mehrere Elemente auf
einer Zeile sind (also z.B. <foo class="bar"><baz class="fubar">).
Da muss man evtl. noch etwas basteln. HTML zu parsen ist aber extrem
eklig, deswegen nur die einfache Version.
>Wenn ich das beim ersten Überfliegen richtig sehe muss ich noch etwas
>erweitern - Styles von HTML-Elementen die weder über eine id noch
>über class identifiziert werden, sondern alleine über das Element
>selbst (z.B. Dokumentweit geltende Listenformatierungen) werden durch
>das Script nicht berücksichtigt, oder?
Stimmt. Da musst du schauen, mit welcher RE du die faengst und wie das
CSS aussieht (d.h. wie die Elemente im Hash %css landen).
Wo du ein weiteres "if" platzierst ist relativ egal, mehrfache style="..."
attribute werden ja durch
if ( /\s+style=/ ) {
s/\s+style="([^"]+)"(.*)style="([^"]+)"/ style="$1 $3" $2/g;
}
zu einem einzigen zusammengesetzt ;)
Hm. UNGETESTET(!):
if( /^(.*)<(tagname1|foo|bar|tagname4)([\s\/>]+.*)$/ ) {
if( $css{$2} ) {
$_ = "$1<$2 style=" . $css{$2} . "$3";
} else {
print STDERR "Warning: style for tag `$2' not found.\n";
}
}
HTH,
-dnh
--
Qual Qual oh Qual wo bist Du oh Qual oh Qual
-- B. Brodesser in suse-talk
| < Previous | Next > |