]>
git.p6c8.net - selfforum.git/blob - selfforum-cgi/shared/Template.pm
e74d1d24dcad70a7b2c8ba9b64bd0935fd3eafcb
3 # ====================================================
4 # Autor: n.d.p. / 2001-01-06
5 # lm : n.d.p. / 2001-01-25
6 # ====================================================
8 # Ausfuellen von Templates
9 # ====================================================
15 use autouse
'Carp' => qw(croak confess);
18 # ====================================================
20 # ====================================================
22 ################################
26 ################################
30 my $class=(ref($instance) or $instance);
33 $self = bless $self,$class;
35 $self -> file
(+shift);
41 ################################
44 # Datei zuweisen und parsen
45 ################################
49 my $old = $self -> {file
};
52 $self -> {file
} = $new if (defined $new);
58 ################################
61 # Bezeichner in Metazeichen
62 # eingeschlossen zurueckgeben
63 ################################
67 croak
"no template file specified" unless (defined $self -> {file
});
72 $self -> {metaon
} . $name . $self -> {metaoff
};
75 ################################
78 # komplette Liste einsetzen
79 ################################
85 croak
"no template file specified" unless (defined $self->{file
});
87 my $list = join '', map { ${ $self -> scrap
($name, $_) } } @
{ +shift };
93 ################################
96 # Schnipsel ausfuellen
97 ################################
103 croak
"no template file specified" unless (defined $self->{file
});
108 # Als Values werden nur die Referenzen gespeichert
109 %params = map { my $ref = $_; map { ($_ => ( (ref ($ref -> {$_} ) )?
$ref -> {$_}: \
($ref -> {$_} ) ) ) } keys %$ref } splice @_;
112 my $scrap=$self->{parsed
}->{$name};
113 my $qmon=quotemeta $self->{metaon
};
114 my $qmoff=quotemeta $self->{metaoff
};
116 # und zwar solange, bis nichts mehr da ist
117 while ($scrap =~ s
<$qmon\s
*([_a
-zA
-Z
]\S
*)\s
*$qmoff>[
119 if ( exists ( $params{$1} ) ) { $x = ${$params{$1}} }
120 elsif (exists ( $self -> {parsed
} -> {$1} ) ) { $x = $self -> {parsed
} -> {$1}}
123 $self -> parse_if
(\
$scrap,\
%params);
129 # ====================================================
130 # Private Funktionen/Methoden
131 # ====================================================
133 ################################
136 # Template einlesen & parsen
137 ################################
142 if (-f
$self -> {file
}) {
143 my $filename = $self -> {file
};
146 new XML
::DOM
::Parser
-> parsefile
($filename);
148 croak
"error in template file '$filename': $@" if ($@
);
150 my $template = $xml -> getElementsByTagName
('Template', 0) -> item
(0);
153 $self -> {metaon
} = $template -> getAttribute
('metaon');
154 $self -> {metaoff
} = $template -> getAttribute
('metaoff');
156 croak
"missing meta defintion(s) in template file '$filename'." unless ($self -> {metaon
} and $self -> {metaoff
});
158 $self -> {parsed
} = {};
159 foreach ($template -> getElementsByTagName
('Scrap', 0)) {
160 my $name = $_ -> getAttribute
('id');
162 croak
"Element 'Scrap' requires attribute 'id' in template file '$filename'." unless (length ($name));
163 croak
"double defined id '$name' in template file '$filename'." if (exists ($self -> {parsed
} -> {$name}));
164 croak
"use '/^[_a-zA-Z]\\S*\$/' for 'Scrap'-ids in template file '$filename' (wrong: '$name')." unless ($name =~ /^[_a-zA-Z]\S*$/);
166 $self -> {parsed
} -> {$name} = $_ -> getFirstChild
-> getData
;
167 $self -> {parsed
} -> {$name} =~ s/^\s+|\s+$//g;}
169 return 1; # alles klar
175 ################################
178 # %IF - Anweisungen parsen
179 ################################
183 my ($scrap, $params) = @_;
185 my $qmon = quotemeta $self -> {metaon
};
186 my $qmoff = quotemeta $self -> {metaoff
};
188 # der folgende Regex ist ein bisschen fies ...
189 # ... aber er funktioniert :-)
191 # pfff - rekursive Strukturen iterativ parsen ist nicht wirklich witzig
194 1 while ($$scrap =~ s
{
195 ($qmon\s
*%(?
:IF
|ELSE
)\s
+.+?\s
*$qmoff.*?
) # Wenn IF oder ELSE von
196 (?
=$qmon\s
*%IF\s
+.+?\s
*$qmoff) # IF gefolgt werden, soll
197 # dieses Stueck uebersprungen
198 # werden und erstmal mit der
199 # naechsten Ebene weitergemacht
203 $qmon\s
*%IF\s
+(.+?
)\s
*$qmoff # IF
206 $qmon\s
*%ENDIF\s
*$qmoff # gefolgt von ENDIF
208 $qmon\s
*%ELSE\s
*$qmoff # von ELSE... ($4 ELSE $5)
210 $qmon\s
*%ENDIF\s
*$qmoff # und ENDIF
216 my ($t3, $t4, $t5) = ($3, $4, $5);
218 for (split /\s+/,$t3) {
220 exists($params->{$_})
221 and length ${$params->{$_}}
227 $ret = $t5 || '' unless (defined $ret);
244 ### end of Template ############################################################
patrick-canterino.de