]>
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 # ====================================================
17 # ====================================================
19 # ====================================================
21 ################################
25 ################################
29 my $class=(ref($instance) or $instance);
32 $self = bless $self,$class;
34 $self -> file
(+shift);
40 ################################
43 # Datei zuweisen und parsen
44 ################################
48 my $old = $self -> {file
};
51 $self -> {file
} = $new if (defined $new);
57 ################################
60 # Bezeichner in Metazeichen
61 # eingeschlossen zurueckgeben
62 ################################
66 die "no template file specified" unless (defined $self -> {file
});
71 $self -> {metaon
} . $name . $self -> {metaoff
};
74 ################################
77 # komplette Liste einsetzen
78 ################################
84 die "no template file specified" unless (defined $self->{file
});
86 my $list = join '', map { ${ $self -> scrap
($name, $_) } } @
{ +shift };
92 ################################
95 # Schnipsel ausfuellen
96 ################################
102 die "no template file specified" unless (defined $self->{file
});
107 # Als Values werden nur die Referenzen gespeichert
108 %params = map { my $ref = $_; map { ($_ => ( (ref ($ref -> {$_} ) )?
$ref -> {$_}: \
($ref -> {$_} ) ) ) } keys %$ref } splice @_;
111 my $scrap=$self->{parsed
}->{$name};
112 my $qmon=quotemeta $self->{metaon
};
113 my $qmoff=quotemeta $self->{metaoff
};
115 # und zwar solange, bis nichts mehr da ist
116 while ($scrap =~ s
<$qmon\s
*([_a
-zA
-Z
]\S
*)\s
*$qmoff>[
118 if ( exists ( $params{$1} ) ) { $x = ${$params{$1}} }
119 elsif (exists ( $self -> {parsed
} -> {$1} ) ) { $x = $self -> {parsed
} -> {$1}}
122 $self -> parse_if
(\
$scrap,\
%params);
128 # ====================================================
129 # Private Funktionen/Methoden
130 # ====================================================
132 ################################
135 # Template einlesen & parsen
136 ################################
141 if (-f
$self -> {file
}) {
142 my $filename = $self -> {file
};
143 my $xml = new XML
::DOM
::Parser
-> parsefile
($filename);
144 my $template = $xml -> getElementsByTagName
('Template', 0) -> item
(0);
147 $self -> {metaon
} = $template -> getAttribute
('metaon');
148 $self -> {metaoff
} = $template -> getAttribute
('metaoff');
150 die "missing meta defintion(s) in template file '$filename'." unless ($self -> {metaon
} and $self -> {metaoff
});
152 $self -> {parsed
} = {};
153 foreach ($template -> getElementsByTagName
('Scrap', 0)) {
154 my $name = $_ -> getAttribute
('id');
156 die "Element 'Scrap' requires attribute 'id' in template file '$filename'." unless (length ($name));
157 die "double defined id '$name' in template file '$filename'." if (exists ($self -> {parsed
} -> {$name}));
158 die "use '/^[_a-zA-Z]\\S*\$/' for 'Scrap'-ids in template file '$filename' (wrong: '$name')." unless ($name =~ /^[_a-zA-Z]\S*$/);
160 $self -> {parsed
} -> {$name} = $_ -> getFirstChild
-> getData
;
161 $self -> {parsed
} -> {$name} =~ s/^\s+|\s+$//g;}
163 return 1; # alles klar
169 ################################
172 # %IF - Anweisungen parsen
173 ################################
177 my ($scrap,$params) = @_;
179 my $qmon = quotemeta $self -> {metaon
};
180 my $qmoff = quotemeta $self -> {metaoff
};
182 # der folgende Regex ist ein bisschen fies ...
183 # ... aber er funktioniert :-)
185 # pfff - rekursive Strukturen iterativ parsen ist nicht wirklich witzig
186 while ($$scrap=~s
[ ($qmon\s
*%(?
:IF
|ELSE
)\s
+.+?\s
*$qmoff.*?
) # Wenn IF oder ELSE von
187 (?
=$qmon\s
*%IF\s
+.+?\s
*$qmoff) # IF gefolgt werden, soll
188 # dieses Stueck uebersprungen
189 # werden und erstmal mit der
190 # naechsten Ebene weitergemacht
194 $qmon\s
*%IF\s
+(.+?
)\s
*$qmoff # IF
197 $qmon\s
*%ENDIF\s
*$qmoff # gefolgt von ENDIF
199 $qmon\s
*%ELSE\s
*$qmoff # von ELSE... ($4 ELSE $5) $5 $6
201 $qmon\s
*%ENDIF\s
*$qmoff # und ENDIF
207 my ($t4,$t5,$t6) = ($4,$5,$6);
209 foreach (split /\s+/,$3) {
210 if (exists($params->{$_}) and length(${$params->{$_}})) {$ret = $t4; $flag=1;last;}}
211 $ret = $t5 unless ($flag);}
219 # ====================================================
220 # Modulinitialisierung
221 # ====================================================
223 # making require happy
226 # ====================================================
228 # ====================================================
patrick-canterino.de