LanX!: Perlsyntax für HTML nutzen

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:

  • der Block würde nicht im lokalen Namensraum von table laufen
  • man könnte table() nicht schachteln, weil das globale $table
    durcheinanderkäme.

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.

  1. 你好 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

    --
    <zentrum> wie war noch mal die option in make.conf fuer das benutzen von pipes um das compile zu beschluenigen?
    <CK1> CFLAGS="-pipe"
    <torsten> Oder man frage einen Gentooer seiner Wahl, wie man 2 km Compilerswitches fuer seine CPU hinbekommt ;)
    http://wwwtech.de/
    1. 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...

      1. 你好 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

        --
        Fortune: Let's say the docs present a simplified view of reality...    :-)
                     -- Larry Wall in  6940@jpl-devvax.JPL.NASA.GOV
        http://wwwtech.de/
        1. 你好 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

  2. 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.

    1. 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