CGI-Embedder
view release on metacpan or search on metacpan
Embedder.pm view on Meta::CPAN
my $c0=chr(1); # ñèìâîë äëÿ qw
my %ExpandCache=(); # êýø
# string Compile(string $Content [string \&filter_func(string $st)])
# Ïðåîáðàçóåò âåñü òåêñò â ñòðîêå $Content ÂÍÅ òýãîâ <? è ?> â ñåðèþ print.
# Ñàìè òýãè <? è ?>, êîíå÷íî, óäàëÿþòñÿ. Åñëè çàòåì ïðîðàáîòàòü ðåçóëüòàò
# eval-îì, íàïå÷àòàåòñÿ "ðàçâåðíóòûé" øàáëîí â ÷èñòîì âèäå. Åñëè çàäàí
# ïàðàìåòð &filter_func, òî ýòà ôóíêöèÿ âûçûâàåòñÿ äëÿ êàæäîé ïîäñòðîêè
# âíå <? è ?>. Îíà äîëæíà âîçâðàùàòü îáðàáîòàííóþ ñòðîêó. Íî åñëè â
# íåé ïîÿâÿòñÿ <? è ?>, îíè óæå íå áóäóò îáðàáîòàíû!
sub Compile($;$)
{ my ($Cont,$filter)=@_;
$Cont =~ s{^\t*}{}mgo;
$Cont="?>$Cont<?";
$Cont=~s{<\?=}{<?print }sgo;
if(!$filter) {
$Cont=~s{\?>(\n?)(.*?)<\?}{"$1;print(qq$c0"._Slash($2)."$c0);"}sgeo;
} else {
$Cont=~s{\?>(\n?)(.*?)<\?}{"$1;print(qq$c0"._Slash(&$filter($2))."$c0);"}sgeo;
}
$Cont=~s{print qq$c0$c0}{}sgo;
Embedder.pm view on Meta::CPAN
}
# void Expand(string $Templ [,string $CacheId] [,string $Filename])
# "Ðàçâîðà÷èâàåò" øàáëîí $Templ. Ðåçóëüòàò ïå÷àòàåòñÿ ñ ïîìîùüþ print.
# Ïîòîì åãî ìîæíî ïåðåõâàòèòü ñ ïîìîùüþ ìîäóëÿ CGI::WebOut. Óäîáíî
# èñïîëüçîâàòü â "ïî÷òîâûõ" öåëÿõ. Åñëè çàäàí ïàðàìåòð $CacheId, òî
# øàáëîí êýøèðóåòñÿ, è äëÿ ñëåäóþùåãî âûçîâà ExpandTemplate()
# ñ òàêèì æå $CacheId êîìïèëèðîâàíèå øàáëîíà óæå íå ïðîèçîéäåò.
# Ïàðàìåòð $Filename âëèÿåò òîëüêî íå ñîîáùåíèÿ îá îøèáêàõ, êîòîðûå
# ìîãóò âîçíèêíóòü â øàáëîíå $Templ.
sub Expand($;$;$;$)
{ my ($Templ,$CacheId,$Filename,$pkg)=@_;
my $Compiled;
if(defined($CacheId) && exists($ExpandCache{$CacheId})) {
$Compiled=$ExpandCache{$CacheId};
} else {
$Compiled=Compile($Templ);
if(defined($CacheId)) { $ExpandCache{$CacheId}=$Compiled; }
}
$pkg||=caller;
$Filename||="template";
$@=undef;
eval("package $pkg; no strict;\n#line 1 \"$Filename\"\n$Compiled;");
die $@ if $@;
return;
}
# string ExpandFile($fname)
# Òî æå, ÷òî è Expand(), òîëüêî ñ÷èòûâàåò ôàéë ñ äèñêà.
sub ExpandFile($)
{ my ($fname)=@_;
local *F;
if(!open(F,$fname)) {
require Carp;
Carp::croak("Could not open the file $fname");
}
binmode(F);
local ($/,$\);
return Expand(<F>,$fname,$fname,caller);
}
# string _Slash(string $st)
# Ïðîñòàâëÿåò ñëýøè ïåðåä ñïåöèàëüíûìè ñèìâîëàìè, à òàêæå îáðàáàòûâàåò
# âõîæäåíèÿ ñèìâîëîâ-ðàçäåëèòåëåé.
sub _Slash($)
{ my ($st)=@_;
$st=~s/$c0/$c0."$c0".qq$c0/g;
$st=~s/(\r?\n\s*#line\s*\d[^\n]*\r?\n)/$c0;$1print qq$c0/gs;
$st=~s/\\(?!\$)/\\\\/g;
$st=~s/\@/\\\@/g;
$st=~s/\%/\\\%/g;
return $st;
}
return 1;
( run in 1.146 second using v1.01-cache-2.11-cpan-65fba6d93b7 )