Slobodan: Perl-HTML-JavaScript-HTML

Hi Leute,

wie in dem Titel gesagt ist ein wenig kompliziert das ganze:

Ein Perl-Script soll ein HTML-Code ausgeben der einen Java-Script-Teil hat mit wiederum eine Funktion die HTML-Code ausgeben soll.
Das alles sieht wie folg. aus:

...
------------------------------
print "parent.frames[0].document.open();\n";
print "parent.frames[0].document.writeln ("<html><head>");\n";
print "parent.frames[0].document.writeln ("<script language=\"JavaScript\">");\n";
-- hier kommt javascript-code (natürlich angepasst) --
print "parent.frames[0].document.writeln ("</script>");\n";
print "parent.frames[0].document.writeln ("</head>");\n";
------------------------------
usw...

Nun meldet der Browser ein JavaScript-Fehler bei dem Tag </script>.

Was mache ich falsch und auf was sollte man grundsätzlich achten bei sollchen vielschichtigen Befehlen (Stichwort: Maskieren)?

Viel Dank

Slobo

  1. Nun meldet der Browser ein JavaScript-Fehler bei dem Tag </script>.

    Und der lautet:

    IE:

    Nichtabgeschlossene Zeichenfolgenkonstante

    NS:

    Unterminated String Literal

    CU
    Slobo

    1. Ich denke da fehlt einfach ein abschliessendes "

      Und der lautet:

      IE:

      Nichtabgeschlossene Zeichenfolgenkonstante

      NS:

      Unterminated String Literal

      CU
      Slobo

    2. Das wird ja ein schönes Monolog werden:

      Ich habe Lösung. Zwar nicht logische aber immerhin.

      print "parent.frames[0].document.writeln ("<\/script>");\n";

      Fragen Sie mich nicht wieso das funktioniert. Ich weis es nicht.

      Vieleicht weis es jemand ?

      Slobo

      1. Das wird ja ein schönes Monolog werden:

        Halb so wild! Ich bin ja auch noch da ...

        Ich habe Lösung. Zwar nicht logische aber immerhin.

        print "parent.frames[0].document.writeln ("<\/script>");\n";

        Fragen Sie mich nicht wieso das funktioniert. Ich weis es nicht.

        Vieleicht weis es jemand ?

        Das ursprüngliche Problem ist, daß der Browser das </script> aus

        print "parent.frames[0].document.writeln ("</script>");\n";

        als Script-Ende erkennt - und anschließend dann seine Probleme bekommt ...
        Im HTML-Text steht:
        parent.frames[0].document.writeln ("</script>");

        Der Trick ist nun, im JS auch einen Teil zu maskieren, so daß der Browser hier
        kein Script-Ende sieht - die Ausgabe jedoch korrekt bleibt. Bsp.:
        parent.frames[0].document.writeln ("</script>");

        Um das '' durch Perl auszugeben muß dieses dort auch maskiert werden:
        print "parent.frames[0].document.writeln ("<\/script>");\n";

        Jörk

        1. Danke Jörk (und andere)!

          Ich werde also in Zukunft mehr auf maskieren aufpassen,
          und (schon ausprobiert) die print <<"ETWAS"; mehr benutzen. Ist eine feine Sache. Und jemand sagte das es nicht in Perl-Dokumentation steht: Stimmt nicht - habe es in der Kamel-Bibel gefunden (im Index nur nach "<<" suchen).

          Viel Spass noch ...

          CU
          Slobo

          1. Hallo!

            Danke Jörk (und andere)!

            gern geschehen ...

            Ich werde also in Zukunft mehr auf maskieren aufpassen,

            Meisten ist es sogar das Beste, sich hier die Arbeit abnehmen zu lassen - per

            quotemeta()

            und (schon ausprobiert) die print <<"ETWAS"; mehr benutzen. Ist eine feine Sache. Und jemand sagte das es nicht in Perl-Dokumentation steht: Stimmt nicht - habe es in der Kamel-Bibel gefunden (im Index nur nach "<<" suchen).

            Richtig! Wie ich schon schrieb steht das in der alten und in der neuen unter 'here-documents'

            Um noch mal auf das ursprüngliche Problem zu kommen: Eine Kombination von here-documents und automatischen 'quotes' wäre hier wohl das pfiffigste. Zumal man bei Änderungen des HTML-Textes sich nicht jedesmal erneut mit den Problemen rumschlagen muss.

            ---------------------------------------------------------------------------------------
            print &JSDocument( <<'EndOfDocument' );
            <html><head>
            <script language="JavaScript">
            -- hier kommt javascript-code (natürlich angepasst) --
            </script>
            </head>
            [...]
            EndOfDocument

            sub JSDocument {
                my ($doc) = @_;

            #-----------------------------------------------
                # Jetzt jede einzelne Zeile mit einem JS-writeln
                # erweitern

            $doc =~ s/^(.*)$/'parent.frames[0].document.writeln ("' . quotemeta($1) . ')";'/em;

            #-----------------------------------------------------------
                # Als Rückgabewert können wir nun noch ein paar Anweisungen
                # um die Ausgabe herumstricken ...

            return <<"EndOfJS";
            parent.frames[0].document.open();
            $doc
            [...]
            EndOfJS
            }
            ---------------------------------------------------------------------------------------

            Auch bei here-document ist zu unterscheiden - zwischen einfachen und doppelten Anführungszeichen.

            Viel Spaß noch,
               Jörk

  2. print "parent.frames[0].document.writeln ("</script>");\n";

    Nun meldet der Browser ein JavaScript-Fehler bei dem Tag </script>.

    Probier mal, </script> zu teilen, also nicht als einen String, sondern mit mit zwei Anweisungen auszugeben - z.B. </scr  und  ipt>

    Christine

  3. hi!

    print "parent.frames[0].document.open();\n";
    print "parent.frames[0].document.writeln ("<html><head>");\n";
    print "parent.frames[0].document.writeln ("<script language=\"JavaScript\">");\n";
    -- hier kommt javascript-code (natürlich angepasst) --
    print "parent.frames[0].document.writeln ("</script>");\n";

    Warum maskierst du hier das ">"?

    print "parent.frames[0].document.writeln ("</head>");\n";

    Soweit ich weiß sind ";" für Perl keine Sonderzeichen und müssen in Strings nicht maskiert werden.

    auf was sollte man grundsätzlich achten bei sollchen vielschichtigen Befehlen (Stichwort: Maskieren)?

    Nicht zuviele (vermeintliche Sonder-)Zeichen maskieren

    Einfache ' verwenden statt den doppelten ", wenn möglich. Ein " ist nur nötig, wenn entweder Variablen/Skalare interpoliert werden sollen, oder wenn du diese Sonderzeichen wie \n etc. verwendest. Im obigen Fall wäre es - zumindest bei den angegebenen Zeilen - möglich, das zu nutzen und du hast viel Arbeit gespart.

    Wenn lange Texte ausgegeben werden am besten gleich einen ganzen Block ausgeben, statt vor jede Zeile "print" zu schreiben, zb:
    print <<'EOT';
    <html><head>
    ...
    EOT
    EOT ist frei wählbar, muss am Anfang der Zeile stehen und danach muss mindestens ein Zeilenumbruch folgen. Die Art der Anführungszeichen beim "print" entspricht der bei einer Ausgabe von nur einer einzigen Zeile.

    bye, Frank!

    1. Wenn lange Texte ausgegeben werden am besten gleich einen ganzen Block ausgeben, statt vor jede Zeile "print" zu schreiben, zb:
      print <<'EOT';
      <html><head>
      ...
      EOT

      Aber dann konsequent sein, bitte :-)
      Fuer den JS-Teil ist es auch besser, statt lauter
      document.write('kurzer String');
      einen laengeren String zusammenzubauen. Die Ausgabe geht schneller, merkt der Besucher, wenn es viel ist.
      Ich mache das meistens so:
      var Ausgabe = '';
      Ausgabe += 'Jetzt geht es los. ';
      Ausgabe += 'Und hier kommt noch mehr';
      ...
      document.writeln(Ausgabe)

      Christine

    2. Hallo Frank,

      print <<'EOT';
      <html><head>
      ...
      EOT

      Weisst Du eigentlich, seit welcher Version des Perl-Interpreters das so funktioniert? In aelteren Buechern findet man das naemlich nie, und dabei ist es doch so praktich...

      viele Gruesse
        Stefan Muenz

      1. hi!

        print <<'EOT';
        <html><head>
        ...
        EOT
        Weisst Du eigentlich, seit welcher Version des Perl-Interpreters das so funktioniert? In
        aelteren Buechern findet man das naemlich nie, und dabei ist es doch so praktich...

        Leider nicht. Aber auch im aktuellen Kamelbuch über Perl5 ist das nicht zu finden, zumindest habe ich es noch nicht bemerkt.

        bye, Frank!

        1. Hallo auch!

          print <<'EOT';
          <html><head>
          ...
          EOT
          Weisst Du eigentlich, seit welcher Version des Perl-Interpreters das so funktioniert? In
          aelteren Buechern findet man das naemlich nie, und dabei ist es doch so praktich...

          Leider nicht. Aber auch im aktuellen Kamelbuch über Perl5 ist das nicht zu finden, zumindest habe ich es noch nicht bemerkt.

          Es steht sowohl im aktuellen als auch im alten Kamelbuch. Das Feature schimpft sich
          'here-documents' oder im deutschen 'Hier-Dokumente' ;-)

          Gruß,
             Jörk

          1. hi!

            Leider nicht. Aber auch im aktuellen Kamelbuch über Perl5 ist das nicht zu finden,
            zumindest habe ich es noch nicht bemerkt.
            Es steht sowohl im aktuellen als auch im alten Kamelbuch. Das Feature schimpft sich
            'here-documents' oder im deutschen 'Hier-Dokumente' ;-)

            Tatsache. Wie kommt jemand darauf, dem einen so lächerlichen Namen zu geben? Wer soll denn darauf kommen?

            bye, Frank!

            1. Hallo Frank,

              Es steht sowohl im aktuellen als auch im alten Kamelbuch. Das Feature schimpft sich
              'here-documents' oder im deutschen 'Hier-Dokumente' ;-)

              Tatsache. Wie kommt jemand darauf, dem einen so lächerlichen Namen zu geben? Wer soll denn darauf kommen?

              Das ist dann wieder so eine Sache von gewußt wie (oder wo)! Die Bezeichnung so jedenfalls
              sagen, daß man über diese Anweisung die Möglichkeit hat, Textmehrzeiler (Dokument ;-)
              direkt in den Source-Code einzugeben. Ein Statement, welches nun auf dieses Dokument
              zurückgreift, besagt dann soetwas wie 'print' das Dokument hier <stammel>.

              ciao,
                 Jörk

      2. Hallo Stefan,

        Frage dieses theads ist schon ne vertractkte Sache, aber ich denke Jörk hat die Antwort gefunden. (Sowas hat mich auch lange mal beschaeftigt).

        Kannst Du es an die Web-Weisheits-Dokumentationsstelle weitergeben.

        Tschuess
        Olaf