]>
git.p6c8.net - devedit.git/blob - modules/Template.pm
4 # Template (Version 1.3)
6 # Klasse zum Parsen von Templates
8 # Autor: Patrick Canterino <patshaping@gmx.net>
9 # Letzte Aenderung: 11.4.2004
22 # Rueckgabe: Template-Objekt
27 my $self = {template
=> ''};
28 return bless($self,$class);
33 # Kompletten Vorlagentext zurueckgeben
37 # Rueckgabe: Kompletter Vorlagentext (String)
41 return shift->{'template'};
46 # Kompletten Vorlagentext aendern
48 # Parameter: Vorlagentext
50 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
56 my ($self,$template) = @_;
57 $self->{'template'} = $template;
62 # Vorlagentext ans Template-Objekt anhaengen
64 # Parameter: Vorlagentext
66 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
70 my ($self,$text) = @_;
71 $self->set_template($self->get_template.$text);
76 # Einlesen einer Vorlagendatei und {INCLUDE}-Anweisungen ggf. verarbeiten
77 # (Text wird an bereits vorhandenen Text angehaengt)
79 # Parameter: 1. Datei zum Einlesen
80 # 2. Status-Code (Boolean):
81 # true => {INCLUDE}-Anweisungen nicht verarbeiten
82 # false => {INCLUDE}-Anweisungen verarbeiten (Standard)
84 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
88 my ($self,$tfile,$not_include) = @_;
91 open(FILE
,"<$tfile") or croak
"Open $tfile: $!";
92 read(FILE
, my $content, -s
$tfile);
93 close(FILE
) or croak
"Closing $tfile: $!";
95 $self->add_text($content);
96 $self->parse_includes unless($not_include);
101 # Variablen durch Text ersetzen
103 # Parameter: 1. Variable zum Ersetzen
104 # 2. Text, durch den die Variable ersetzt werden soll
106 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
110 my ($self,$var,$text) = @_;
112 $var = quotemeta($var);
113 $text = "" unless defined $text; # Um Fehler zu vermeiden
115 my $template = $self->get_template;
116 $template =~ s/\{$var\}/$text/g;
118 $self->set_template($template);
123 # Variable durch Array ersetzen
125 # Parameter: 1. Variable zum Ersetzen
126 # 2. Array-Referenz, durch die die Variable ersetzt werden soll
127 # 3. Zeichenkette, mit der das Array verbunden werden soll
130 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
132 sub fillin_array
($$;$)
134 my ($self,$var,$array,$glue) = @_;
135 $glue = "" unless defined $glue;
137 $self->fillin($var,join($glue,@
$array));
142 # Template in Datei schreiben
144 # Parameter: Datei-Handle
146 # Rueckgabe: Status-Code (Boolean)
150 my ($self,$handle) = @_;
151 return print $handle $self->get_template;
156 # IF-Bloecke verarbeiten
158 # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht)
159 # 2. Status-Code (true => Inhalt anzeigen
160 # false => Inhalt nicht anzeigen
162 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
164 sub parse_if_block
($$)
166 my ($self,$name,$state) = @_;
167 my $template = $self->get_template;
169 while(index($template,"{IF ".$name."}") >= 0)
171 # Das alles hier ist nicht wirklich elegant geloest...
172 # ... aber solange es funktioniert... ;-)
174 my $start = index($template,"{IF ".$name."}");
175 my $tpl_tmp = substr($template,$start);
176 my @splitted = split(/\{ENDIF\}/,$tpl_tmp);
178 my $block = ""; # Kompletter bedingter Block
179 my $ifs = 0; # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt)
183 for(my $x=0;$x<@splitted;$x++)
185 $ifs += substr_count
($splitted[$x],"{IF"); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen
186 $ifs--; # Zaehler um 1 erniedrigen
187 $block .= $splitted[$x]."{ENDIF}"; # Daten zum Block hinzufuegen
191 # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-))
197 my $if_block = substr($block,length($name)+5,-7); # Alles zwischen {IF} und {ENDIF}
201 my $else_block = ""; # Alles ab {ELSE}
202 $ifs = 0; # IF-Zaehler
204 @splitted = split(/\{ELSE\}/,$if_block);
206 for(my $x=0;$x<@splitted;$x++)
208 $ifs += substr_count
($splitted[$x],"{IF"); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen
209 $ifs -= substr_count
($splitted[$x],"{ENDIF}"); # Vom Zaehler jedes Vorkommen von ENDIF abziehen
213 # Zaehler 0, also haben wir das Ende des IF-Abschnitts gefunden
215 # Aus dem Rest den ELSE-Block zusammenbauen
217 for(my $y=$x+1;$y<@splitted;$y++)
219 $else_block .= "{ELSE}".$splitted[$y];
224 $if_block = substr($if_block,0,length($if_block)-length($else_block));
225 $else_block = (length($else_block) > 6) ?
substr($else_block,6) : ""; # Ansonsten gibt es Fehler
232 my $replacement = ($state) ?
$if_block : $else_block;
234 my $qmblock = quotemeta($block);
236 $template =~ s/$qmblock/$replacement/;
239 $self->set_template($template);
244 # Bedingungstags in einem Vorlagentext verarbeiten
246 # Parameter: 1. Tagname
247 # 2. Status-Code (true => Tag-Inhalt anzeigen
248 # false => Tag-Inhalt nicht anzeigen
250 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
252 sub parse_condtag
($$)
254 my ($self,$condtag,$state) = @_;
256 my $template = $self->get_template;
258 while(index($template,"<$condtag>") >= 0)
260 my $start = index($template,"<$condtag>"); # Beginn des Blocks
261 my $end = index($template,"</$condtag>")+length($condtag)+3; # Ende des Blocks
263 my $extract = substr($template,$start,$end-$start); # Kompletten Bedingungsblock extrahieren...
265 my $replacement = ($state) ?
substr($extract,length($condtag)+2,0-length($condtag)-3) : "";
267 $extract = quotemeta($extract);
269 $template =~ s/$extract/$replacement/g; # Block durch neue Daten ersetzen
271 $self->set_template($template);
276 # {INCLUDE}-Anweisungen verarbeiten
278 # Parameter: -nichts-
280 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
285 my $template = $self->get_template;
287 while($template =~ /(\{INCLUDE (\S+?)\})/)
289 my ($directive,$file) = ($1,$2);
290 my $qm_directive = quotemeta($directive);
291 my $replacement = "";
297 open(FILE
,"<$file") or croak
"Open $file: $!";
298 read(FILE
, $replacement, -s
$file);
299 close(FILE
) or croak
"Closing $file: $!";
302 $template =~ s/$qm_directive/$replacement/g;
305 $self->set_template($template);
314 # Zaehlt, wie oft ein String in einem String vorkommt
315 # (Emulation der PHP-Funktion substr_count())
317 # Parameter: 1. Zu durchsuchender String
318 # 2. Zu suchender String
320 # Rueckgabe: Anzahl der Vorkommnisse (Integer)
324 my ($haystack,$needle) = @_;
325 my $qmneedle = quotemeta($needle);
329 $count++ while($haystack =~ /$qmneedle/g);
340 shift->add_text(shift);
345 return shift->get_template;
350 shift->parse_condtag(@_);
355 shift->read_file(shift);
358 # it's true, baby ;-)
patrick-canterino.de