]>
git.p6c8.net - selfforum.git/blob - selfforum-cgi/shared/Template.pm
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);
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
};
144 my $xml = new XML
::DOM
::Parser
-> parsefile
($filename);
145 my $template = $xml -> getElementsByTagName
('Template', 0) -> item
(0);
148 $self -> {metaon
} = $template -> getAttribute
('metaon');
149 $self -> {metaoff
} = $template -> getAttribute
('metaoff');
151 croak
"missing meta defintion(s) in template file '$filename'." unless ($self -> {metaon
} and $self -> {metaoff
});
153 $self -> {parsed
} = {};
154 foreach ($template -> getElementsByTagName
('Scrap', 0)) {
155 my $name = $_ -> getAttribute
('id');
157 croak
"Element 'Scrap' requires attribute 'id' in template file '$filename'." unless (length ($name));
158 croak
"double defined id '$name' in template file '$filename'." if (exists ($self -> {parsed
} -> {$name}));
159 croak
"use '/^[_a-zA-Z]\\S*\$/' for 'Scrap'-ids in template file '$filename' (wrong: '$name')." unless ($name =~ /^[_a-zA-Z]\S*$/);
161 $self -> {parsed
} -> {$name} = $_ -> getFirstChild
-> getData
;
162 $self -> {parsed
} -> {$name} =~ s/^\s+|\s+$//g;}
164 return 1; # alles klar
170 ################################
173 # %IF - Anweisungen parsen
174 ################################
178 my ($scrap,$params) = @_;
180 my $qmon = quotemeta $self -> {metaon
};
181 my $qmoff = quotemeta $self -> {metaoff
};
183 # der folgende Regex ist ein bisschen fies ...
184 # ... aber er funktioniert :-)
186 # pfff - rekursive Strukturen iterativ parsen ist nicht wirklich witzig
187 while ($$scrap=~s
[ ($qmon\s
*%(?
:IF
|ELSE
)\s
+.+?\s
*$qmoff.*?
) # Wenn IF oder ELSE von
188 (?
=$qmon\s
*%IF\s
+.+?\s
*$qmoff) # IF gefolgt werden, soll
189 # dieses Stueck uebersprungen
190 # werden und erstmal mit der
191 # naechsten Ebene weitergemacht
195 $qmon\s
*%IF\s
+(.+?
)\s
*$qmoff # IF
198 $qmon\s
*%ENDIF\s
*$qmoff # gefolgt von ENDIF
200 $qmon\s
*%ELSE\s
*$qmoff # von ELSE... ($4 ELSE $5) $5 $6
202 $qmon\s
*%ENDIF\s
*$qmoff # und ENDIF
208 my ($t4,$t5,$t6) = ($4,$5,$6);
210 foreach (split /\s+/,$3) {
211 if (exists($params->{$_}) and length(${$params->{$_}})) {$ret = $t4; $flag=1;last;}}
212 $ret = $t5 unless ($flag);}
220 # ====================================================
221 # Modulinitialisierung
222 # ====================================================
224 # making require happy
227 # ====================================================
229 # ====================================================
patrick-canterino.de