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.007 second using v1.01-cache-2.11-cpan-65fba6d93b7 )