Schrift
[thread]313[/thread]

Einfügen eines Wertes in Zeile 3 einer Datei: ...bei einem CMS



<< |< 1 2 >| >> 13 Einträge, 2 Seiten
cbxk1xg
 2004-07-03 19:28
#3020 #3020
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne,

ich habe ein klitze kleines Problem. Ich möchte meinem CMS erstens ein gewisses Branding und zweitens ein paar Informationen beim ausgeben der Seiten verpassen. Dafür möchte ich beim ausliefern der Seiten ein paar HTML Komentare einfügen.

Normalerweise ist das auch kein Problem, aber wenn der User in seinem Template z.B. so etwas stehen hat:

Code: (dl )
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">


oder so was:
Code: (dl )
1
2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
       "http://www.w3.org/TR/REC-html40/strict.dtd">


dann kann ich nicht einfach ab der ersten Zeile etwas einfügen, da die Seite dann nicht mehr W3C Konform ist.

Ich will die Komentare aber auch nicht am Ende der Datei einfügen.

Zu Verdeutlichung hier der verkürzte Teil meines Codes, der für die Ausgabe zuständig ist. Momentan wird das Template am Ende der Datei als Komentar ausgegeben.

Code (perl): (dl )
1
2
3
4
5
print "Content-type: text/html\n\n";

my (@TEMPLATE) = @_;
foreach $line (@TEMPLATE) { print "$line\n"; }
print "\n<;!-- Template: $VAR{'template'} -->;";
tomlong
 2004-07-03 21:19
#3021 #3021
User since
2003-08-04
93 Artikel
BenutzerIn
[default_avatar]
benutz am besten HTML::Template

ansonsten sollte es doch wohl kein Problem sein irgendwo in der Mitte des HTML Dokuments was einzufügen, da du es sowieso zeilenweise ausgibst!
Live long and prosper!
42;
steffenw
 2004-07-03 21:56
#3022 #3022
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Zeile 3 einer Datei ..., da paßt doch Tie::File wie die Faust auf's Auge.
$SIG{USER} = sub {love 'Perl' or die};
cbxk1xg
 2004-07-03 23:19
#3023 #3023
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Mein CMS funktioniert auch prima ohne das cryptische HTML::Template. :-)

Und da es sich um das Frontend handelt, will ich den Prozess des Zusammenbauens der Seite (trotz intelligentem Chaching) nicht mit einem Modul künstlich aufblasen. Das Modul Tie::File ist ja ganz gut, aber auch nicht gerade ein 3 Zeiler.

Gibt's nicht noch eine Lösung ohne Modul? Meine Idee wäre nämlich sonst nur noch, dass man dem User beim Anlegen eines Templates ein Formular ausgibt, in dem er wählen kann wie sein Doctype aussehen soll. Dann fangen die HTML Designer vieleicht auch mal an sauberen Code zu schreiben. ;-)
steffenw
 2004-07-03 23:40
#3024 #3024
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eine Zeile in ein File einfügen und das ohne Modul ist doch simpel:
Du überliest die ersten Zeilen des Files, welche bleiben sollen und fragst dann die Fileposition ab. Diese speicherst Du. Dann speicherst Du alle Zeilen, die danach kommen in ein temporäres File(vielleicht paßt es auch in den Speicher). Dann gehst Du an die gemerkte Fileposition zurück und schneidest das File ab. Dann schreibst Du die einzufügenden Zeilen. Zum Schluß hängst Du dann die Zeilen aus dem Tempfile wieder an. Danach löschst Du das Tempfile.

Aber warum nur das alles programmieren, wo es doch alles fertig gibt?
$SIG{USER} = sub {love 'Perl' or die};
cbxk1xg
 2004-07-04 00:03
#3025 #3025
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Falls es jemanden interessiert... Ich habe eine, wie ich finde, performate und einfache Lösung gefunden.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my $PMheader1 = "\n<;!-- Template: $VAR{'template'} -->;\n<html";
my $PMheader2 = "\n<;!-- Template: $VAR{'template'} -->;\n<HTML";

  print "Content-type: text/html\n\n";

  my (@TEMPLATE) = @_;

  foreach $line (@TEMPLATE)
  {
    $line =~ s/\<html/$PMheader1/;
    $line =~ s/\<html/$PMheader2/;
    print "$line\n";
  }


Es wird einfach das Array nach <html und <HTML durchsucht und entsprechend ersetzt. Damit habe ich meine TAGS an einer unkritischen Stelle plaziert und falls jemand z.B. so etwas hier schreibt:
Code: (dl )
<html lang="en">


oder so was
Code: (dl )
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">


Wird der Code nicht verschlimmbessert. Für den User sieht es dann so aus, als hätte ich sein Template nie "angefasst".
format_c
 2004-07-04 04:58
#3026 #3026
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Zwar eine sehr propreitäre Lösung aber wenns funkioniert ists ja ok

Gruß Alex
cbxk1xg
 2004-07-04 14:20
#3027 #3027
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Ja, ich weiss. Aber ich neige halt dazu pragmatische Lösungen zu bevorzugen. :-)
Dubu
 2004-07-05 01:01
#3028 #3028
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=cbxk1xg,03.07.2004, 22:03]Falls es jemanden interessiert... Ich habe eine, wie ich finde, performate und einfache Lösung gefunden.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my $PMheader1 = "
<;!-- Template: $VAR{'template'} -->;;;;
<html";
my $PMheader2 = "
<;!-- Template: $VAR{'template'} -->;;;;
<HTML";

  print "Content-type: text/html

";

  my (@TEMPLATE) = @_;

  foreach $line (@TEMPLATE)
  {
    $line =~ s/\<html/$PMheader1/;
    $line =~ s/\<html/$PMheader2/;
    print "$line
";
  }
[/quote]
Nett. Du hast allerdings zwei Templates für "HTML" und "html", aber die Ersetzung geht nur auf die kleingeschriebene Variante (Tippfehler?). Und was ist mit Schreibweisen wie "HtMl"?


Vielleicht eher so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my $PMheader = "
<;!-- Template: $VAR{'template'} -->;;;
";

print "Content-type: text/html

";

my (@TEMPLATE) = @_;

foreach $line (@TEMPLATE)
{
    $line =~ s/(<html)/$PMheader1$1/i;
    print $line;
}
\n\n

<!--EDIT|Dubu|1089122446-->
cbxk1xg
 2004-07-05 02:06
#3029 #3029
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Ja, war ein Schreibfehler.

Ich habe es in der letzten Fassung so gelöst:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my $header = <<EOT;
<!-- file info:
template: ------------ $template
last modified: ------- $date (MM.DD.YYYY | HH:MM)
author: -------------- $author
-->
EOT

print "Content-type: text/html\n\n";

 my (@TEMPLATE) = @_;

 foreach $line (@TEMPLATE)
 {
   $line =~ s/\<html/$header\<html/;
   $line =~ s/\<HTML/$header\<HTML/;
...


Ich will den "HTML" Tag nicht case insensitive behandeln, da es falsches HTML wäre. Wenn jemand ein Template anlegt, dann sollte er wenigstens in der Lage sein sich zu entscheiden ob er die Tags groß, oder klein schreibt. Vieleicht kann man die Webdesigner damit ein wenig erziehen. :-)

Obwohl deine Idee auch nicht schlecht ist. Leider habe ich es erst auf den zweiten Blick gesehen, da die Perlsyntax von deinem Posting etwas verunstaltet wurde. Ist das eine $1 hinter dem $PMheader? \n\n

<!--EDIT|cbxk1xg|1088979097-->
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-07-03 19:28.