Perlsyntax für HTML nutzen
LanX!
- perl
1 Christian Kruse0 LanX!1 Christian Kruse0 LanX
0 Struppi0 LanX
Hi
ich fummle grad an nem Problem rum das vielleicht etwas exotisch/akademisch ist... :)
Ich möchte Code an eine Funktion übergeben der in der Funktion evaluiert wird. Dabei soll dieser interne Code im Editor entsprechend eingerückt udn gehighlightet werden. Einfach den Code als String zu übergeben reicht also nicht.
Der Bezug zu HTML ergibt sich aus folgendem Beispiel:
seinen table(),tr(),td() subroutinen, dann soll
table("tableopt",
tr("rowopt",
td("eintrag11"),
td("eintrag12"),
td("eintrag13")
)
tr("rowopt",
td("eintrag21"),
td("eintrag22"),
td("eintrag23")
)
)
dazu führen dass eine Tabelle ausgegeben wird und im Perlcode
sollen die Einrückungen die Struktur des HTML-Codes wiederspiegeln.
In obigem Beispiel werden zuerst die td() evaluiert, dann die
tr() und zuletzt das table()...
Ok damit könnte man leben, mir wäre aber lieber wenn ich in table() lokale variablen setzen könnte die das verhalten der tr() und td() steuern, z.B. sowas wie ein $align="right" das sich vererbt, oder auch ein nachträgliches Anpassen der Zeilen und Spaltenzahl.
(Ich hoffe jmd versteht mich ...)
ein Ansatz wäre z.B.
while (table()){
tr();
tr();
};
wobei table() abwechselnd 1 und 0 zurückgibt (über eine globale Variable $table gesteuert), würde also
jeweils einmal vor und nach dem Block ausgeführt.
sub table(){
$table=1-$table;
if ($x){
print "<table>";
}else{
print "</table>";
}
return $table;
}
2 Probleme:
Bevor ich mir weiter das Hirn zermartere, weiß jemand mit ne elegante Lösung???
Tschau
rolf
PS: Um Missverständnisse zu vermeiden, Table ist nur ein Beispiel, die Funktionen sollen dann schon komplexer sein.
你好 LanX!,
Bevor ich mir weiter das Hirn zermartere, weiß jemand mit ne elegante
Lösung???
Mir ist nicht so recht klar, was du eigentlich willst. Vielleicht kannst du
das mal genauer beschreiben?
Wenn es dir nur um einfach Einrueckungsschemata geht, kannst du auf
einfache Rekursion zurueckgreifen, ansonsten hoert es sich fuer mich nach
Syntaxbaeumen an; aber um das genauer sagen zu koennen musst du etwas
besser erklaeren, was du eigentlich willst :)
再见,
CK
Hi Christian,
OK mir war klar dass es nicht leicht zu vermittel ist...
ich will elegant den HTML-Syntaktischen Verscjhachtelungen mit seinen Abschlusstags in Perl Rechnung tragen...
Ich zeig mal wie ichs _nicht_ machen möchte (abgekürzt):
sub table(){
$tabopt=shift;
$code=shift;
print "<table $tabopt>";
eval $code;
print "</table>";
}
#sub tr(){} und sub table(){} analog
sowas wie
table("tabopt","tr('tropt',td('tdopt','text11'));tr(...)");
kann aber kein mensch mehr lesen, händisch umzubrechen und die Einrückungen einzufügen macht auch keinen Spass und mit den "und ' kommt man schnell durcheinander.
Wenn es dir nur um einfach Einrueckungsschemata geht, kannst du auf
einfache Rekursion zurueckgreifen,
wie genau?
Syntaxbaeumen an; aber um das genauer sagen zu koennen musst du etwas
besser erklaeren, was du eigentlich willst :)
Verstanden? ?:)
tschau
rolf
PS: ich hab grad noch so ne Idee für nen Workaround, indem die Funktionen rekursiv ihren eigenen Aufrufstring zurückgeben, der später evaluiert wird.
sub td() {
if (!$execute) {
return "td(@_);";
}else{
print "<td $_[0]> $_[1] </td>"
}
}
analog für die anderen Funktionen, und zuletzt macht man
$execute=0;
$code=table(...);
$execute=1;
eval $code;
aber wenn jmd nen eleganteren Weg weiß bin ich sehr aufgeschlossen. Es muss doch nen Weg geben einen Block an eine
Funktion zur übergeben der nicht sofort evaluiert wird...
你好 Rolf,
sub table(){
$tabopt=shift;
$code=shift;print "<table $tabopt>";
eval $code;
print "</table>";
}#sub tr(){} und sub table(){} analog
sowas wie
table("tabopt","tr('tropt',td('tdopt','text11'));tr(...)");
kann aber kein mensch mehr lesen, händisch umzubrechen und die
Einrückungen einzufügen macht auch keinen Spass und mit den "und '
kommt man schnell durcheinander.
Warum benutzt du nicht Perl-Boardmittel? Z. B. so:
table(
"tabopt",
[
tr(
'tropt',
[
td('tdopt','text1.1'),
td('tdopt','text1.2'),
td('tdopt','text1.3')
]
),
tr(
'tropt',
[
td('tdopt','text2.1'),
td('tdopt','text2.2'),
td('tdopt','text2.3')
]
)
]
);
So kannst du das “schoen” schreiben und das trotzdem ganz einfach
auswerten, mit trivialer Rekursion zum auswerten der Referenzen und so
weiter.
再见,
CK
你好 CK,
mein ziel:
sub table(){
$tabopt=shift;
$code=shift;print "<table $tabopt>";
eval $code;
print "</table>";
}#sub tr(){} und sub table(){} analog
dein Vorschlag:
Warum benutzt du nicht Perl-Boardmittel? Z. B. so:
weil ich nicht drauf gekommen bin :)
(und weil ich früher zuviel Schindluder mit Macroassemblern getrieben habe;)
table(
"tabopt",
[
tr(
'tropt',
[
td('tdopt','text1.1'),
td('tdopt','text1.2'),
td('tdopt','text1.3')
]
),
tr(
'tropt',
[
td('tdopt','text2.1'),
td('tdopt','text2.2'),
td('tdopt','text2.3')
]
)
]
);
also was es genau macht kann ich nicht beurteilen weil ichs nicht zum laufen kriege (Syntaxerror) und emacs beim einrücken in die Knie geht.
Allerdings siehts für mich so aus als werden anonyme Arrays übergeben, mit den Rückgabewerten der Funktionen, also Call-By-Value. Ich möchte aber ein Call By Reference wobei auch die Parameter mitgegeben werden!
Hab gerade Megastress und kümmere mich am Wochenende drum, meine Ahnung geht momentan dahin anonyme Subs zu benutzen, und die Referenzen zu übergeben:
table(
"tabopt",
sub{
tr(
'tropt',
sub {
usw...
Tschau
Rolf
seinen table(),tr(),td() subroutinen, dann soll
table("tableopt",
tr("rowopt",
td("eintrag11"),
td("eintrag12"),
td("eintrag13")
)
tr("rowopt",
td("eintrag21"),
td("eintrag22"),
td("eintrag23")
))
dazu führen dass eine Tabelle ausgegeben wird und im Perlcode
sollen die Einrückungen die Struktur des HTML-Codes wiederspiegeln.In obigem Beispiel werden zuerst die td() evaluiert, dann die
tr() und zuletzt das table()...
Ich versteh zwar nicht so ganz was du wirklich willst, aber du weißt, dass CGI.pm diese ganzen Funktionen schon hat und auch mehrere Möglichkeiten Tabellen zu erzeugen? (z.b. auch so wie ich deinen Ansatz verstehe)
Struppi.
Hi
Ich versteh zwar nicht so ganz was du wirklich willst, aber du weißt, dass CGI.pm diese ganzen Funktionen schon hat und auch mehrere Möglichkeiten Tabellen zu erzeugen? (z.b. auch so wie ich deinen Ansatz verstehe)
Also es geht um das Verfahren, und nur am Rande um Tabellen, ist halt ein eingängiges Beispiel!
Ich hab mir CGI.pm Beispielcode angeschaut und auf den ersten Blick sah das anders aus, aber sehrschön Objektorientiert...
Tschau
rolf