| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
moko 27.02.2008 15:45
Parser2 развивался эволюционно, код в процессе не переписывался.sub process{
local $|=1;
my (@result);
foreach $_ (@_){
my $html=$_;
while ($html=~/\^([^\[]*)\[/isg){
my $name="macro_$1";
my $start=pos($html)-length($1)-2;
my @params=();
my $param=pos($html);
my $level=1;
while ($level>0 && $html=~/(;|\[|\])/isgx){
$level++ if ($1 eq '[');
$level-- if ($1 eq ']');
if ($level==0 || ($1 eq ';' && $level==1)){
push @params,substr($html,$param,pos($html)-$param-1);
$param=pos($html);
}
}
my $result=&$name(@params);
substr($html,$start,$param-$start)=$result;
pos($html)=$start+(defined($result)?length($result):0);
}
push @result,$html;
}
return wantarray ? @result : $result[0];
}
sub macro_load_cfg{
my $macro=read_file($_[0]);
$macro=~s/([^\n\r])@/$1~/g;
foreach my $macro (split(/@/,$macro)){
my ($name,$value);
next unless ($name,$value)= $macro=~ /^([^\n]+)\n+(.*?)\n*$/s;
$value=~s/~/@/g;
$MACRO{"$name-original"}=$MACRO{$name} if exists($MACRO{$name});
$MACRO{$name}=$value;
}
}
sub macro_macro{
my $macro=process($_[0]);
$macro=exists($MACRO{$macro}) ? $MACRO{$macro}:"";
$macro=~s/\$(\d+)/$_[int($1)]/mge;
return process($macro);
}