]>
git.p6c8.net - devedit.git/blob - modules/Template.pm
4 # Template (Version 1.5)
6 # Klasse zum Parsen von Templates
8 # Autor: Patrick Canterino <patrick@patshaping.de>
9 # Letzte Aenderung: 4.5.2005
22 # Rueckgabe: Template-Objekt
27 my $self = {file
=> '', 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,$file,$not_include) = @_;
91 $self->{'file'} = $file;
93 open(FILE
,'<'.$file) or croak
"Open $file: $!";
94 read(FILE
, my $content, -s
$file);
95 close(FILE
) or croak
"Closing $file: $!";
97 $self->add_text($content);
98 $self->parse_includes unless($not_include);
103 # Variablen durch Text ersetzen
105 # Parameter: 1. Variable zum Ersetzen
106 # 2. Text, durch den die Variable ersetzt werden soll
108 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
112 my ($self,$var,$text) = @_;
114 $var = quotemeta($var);
115 $text = '' unless defined $text; # Um Fehler zu vermeiden
117 my $template = $self->get_template;
118 $template =~ s/\{$var\}/$text/g;
120 $self->set_template($template);
125 # Variable durch Array ersetzen
127 # Parameter: 1. Variable zum Ersetzen
128 # 2. Array-Referenz, durch die die Variable ersetzt werden soll
129 # 3. Zeichenkette, mit der das Array verbunden werden soll
132 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
134 sub fillin_array
($$;$)
136 my ($self,$var,$array,$glue) = @_;
137 $glue = '' unless defined $glue;
139 $self->fillin($var,join($glue,@
$array));
144 # Template in Datei schreiben
146 # Parameter: Datei-Handle
148 # Rueckgabe: Status-Code (Boolean)
152 my ($self,$handle) = @_;
153 return print $handle $self->get_template;
158 # IF-Bloecke verarbeiten
160 # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht)
161 # 2. Status-Code (true => Inhalt anzeigen
162 # false => Inhalt nicht anzeigen
163 # 3. true => Verneinten Block nicht parsen
164 # false => Verneinten Block parsen (Standard)
166 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
168 sub parse_if_block
($$;$)
170 my ($self,$name,$state,$no_negate) = @_;
171 my $template = $self->get_template;
175 while(index($template,'{IF '.$name.'}') >= 0)
177 # Das alles hier ist nicht wirklich elegant geloest...
178 # ... aber solange es funktioniert... ;-)
182 my $start = index($template,'{IF '.$name.'}');
183 my $tpl_tmp = substr($template,$start);
184 my @splitted = split(/\{ENDIF\}/,$tpl_tmp);
186 # Wenn sich am Ende der Zeichenkette {ENDIF} befinden, werden diese
187 # von split() ignoriert, was zu einem Verschachtelungsfehler fuehrt
188 # Die fehlenden leeren Zeichenketten muessen von Hand eingefuegt werden
192 while(substr($tpl_tmp,-7*$x,7) eq '{ENDIF}')
198 my $block = ''; # Kompletter bedingter Block
199 my $ifs = 0; # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt)
203 for(my $x=0;$x<@splitted;$x++)
205 croak
'Nesting error found while parsing IF block "'.$name.'" nr. '.$count.' in template file "'.$self->{'file'}.'"' if($x == $#splitted);
207 $ifs += substr_count
($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen
208 $ifs--; # Zaehler um 1 erniedrigen
209 $block .= $splitted[$x].'{ENDIF}'; # Daten zum Block hinzufuegen
213 # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-))
219 my $if_block = substr($block,length($name)+5,-7); # Alles zwischen {IF} und {ENDIF}
223 my $else_block = ''; # Alles ab {ELSE}
224 $ifs = 0; # IF-Zaehler
226 @splitted = split(/\{ELSE\}/,$if_block);
228 for(my $x=0;$x<@splitted;$x++)
230 $ifs += substr_count
($splitted[$x],'{IF '); # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen
231 $ifs -= substr_count
($splitted[$x],'{ENDIF}'); # Vom Zaehler jedes Vorkommen von ENDIF abziehen
235 # Zaehler 0, also haben wir das Ende des IF-Abschnitts gefunden
237 # Aus dem Rest den ELSE-Block zusammenbauen
239 for(my $y=$x+1;$y<@splitted;$y++)
241 $else_block .= '{ELSE}'.$splitted[$y];
246 $if_block = substr($if_block,0,length($if_block)-length($else_block));
247 $else_block = (length($else_block) > 6) ?
substr($else_block,6) : ''; # Ansonsten gibt es Fehler
254 my $replacement = ($state) ?
$if_block : $else_block;
256 my $qmblock = quotemeta($block);
258 $template =~ s/$qmblock/$replacement/;
261 $self->set_template($template);
263 # Evtl. verneinte Form parsen
267 $self->parse_if_block('!'.$name,not($state),1);
273 # Bedingungstags in einem Vorlagentext verarbeiten
275 # Parameter: 1. Tagname
276 # 2. Status-Code (true => Tag-Inhalt anzeigen
277 # false => Tag-Inhalt nicht anzeigen
279 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
281 sub parse_condtag
($$)
283 my ($self,$condtag,$state) = @_;
285 my $template = $self->get_template;
287 while(index($template,'<'.$condtag.'>') >= 0)
289 my $start = index($template,'<'.$condtag.'>'); # Beginn des Blocks
290 my $end = index($template,'</'.$condtag.'>')+length($condtag)+3; # Ende des Blocks
292 my $extract = substr($template,$start,$end-$start); # Kompletten Bedingungsblock extrahieren...
294 my $replacement = ($state) ?
substr($extract,length($condtag)+2,0-length($condtag)-3) : '';
296 $extract = quotemeta($extract);
298 $template =~ s/$extract/$replacement/g; # Block durch neue Daten ersetzen
300 $self->set_template($template);
305 # {INCLUDE}-Anweisungen verarbeiten
307 # Parameter: -nichts-
309 # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)
314 my $template = $self->get_template;
316 while($template =~ /(\{INCLUDE (\S+?)\})/g)
318 my ($directive,$file) = ($1,$2);
319 my $qm_directive = quotemeta($directive);
323 my $inc = new Template
;
324 $inc->read_file($file);
326 $template =~ s/$qm_directive/$inc->get_template/eg;
330 $self->set_template($template);
339 # Zaehlt, wie oft ein String in einem String vorkommt
340 # (Emulation der PHP-Funktion substr_count())
342 # Parameter: 1. Zu durchsuchender String
343 # 2. Zu suchender String
345 # Rueckgabe: Anzahl der Vorkommnisse (Integer)
349 my ($haystack,$needle) = @_;
350 my $qmneedle = quotemeta($needle);
354 $count++ while($haystack =~ /$qmneedle/g);
363 *addtext
= \
&add_text
;
364 *as_string
= \
&get_template
;
365 *condtag
= \
&parse_condtag
;
366 *readin
= \
&read_file
;
368 # it's true, baby ;-)
patrick-canterino.de