Новости | 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); }