parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Просто нечем хвастаться

moko 27.02.2008 15:45

Parser2 развивался эволюционно, код в процессе не переписывался.
C нашей точки зрения он просто недостаточно хорош, чтобы его открывать.

Судя по конспирологическим теориям, трава у вас действительно хорошая. Правда если вам действительно нужен только процессор страниц, то вот вам почти готовый макропроцессор на perl.
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);
}