2010-07-19 2 views
1

Я пытаюсь создать модуль cpan, который интегрирует Text :: Haml в Template Toolkit. Я думаю, что Haml - интересный язык шаблонов, но ограниченный, он не поддерживает циклы или условные обозначения, не говоря уже о более продвинутых вещах. Но я не могу показаться, что у меня очень простая версия для работы. Ниже приведены некоторые тестовые сценарии, которые работают, чтобы убедиться, что моя логика работает.Пытается создать шаблон :: Plugin :: Фильтр для Haml

Вот моя попытка модуля фильтра с помощью Template::Plugin::Filter документации

use strict; 
use warnings; 
package Template::Plugin::Haml; 

use Template::Plugin::Filter; 

use parent 'Template::Plugin::Filter'; 

sub filter { 
    my ($self, $text) = @_; 

# thes aren't actually the problem 
# my $haml = Text::Haml->new; 
# my $html = $haml->render($text); 
# return $html; 

    return $text; 
} 
1; 

и код, чтобы использовать его

#!/usr/bin/perl 
# test0.pl 
use strict; 
use warnings; 

use Template; 

my $tt = Template->new; 

my $vars = {}; 
my $output = \do{my $i}; 

$tt->process(\*DATA, $vars, $output); 

print $$output; 
__DATA__ 
[% USE Haml %] 
[% FILTER Haml %] 
#profile 
[% END %] 

, но я получаю это предупреждение Use of uninitialized value in print at test0.pl line 15, <DATA> line 1.

Я знаю, что это ошибка значит ... но я не уверен, почему фильтр вызывает это. Любая помощь будет оценена

Ниже приведены некоторые тестовые сценарии, которые работают в других частях моей логики, поэтому мы не рассматриваем неправильный код, чтобы исправить проблему. В противном случае они не являются действительно необходимыми для задачи

Это показывает, как использовать Template :: Toolkit

#!/usr/bin/perl 
# test1.pl - show how to use tt 
use strict; 
use warnings; 

use Template; 

my $tt = Template->new; 

my $vars = {}; 
my $output = \do{my $i}; 

$tt->process(\*DATA, $vars, $output); 

print $$output; # #profile 
__DATA__ 
#profile 

это показывает нам, как использовать Text :: Haml

#!/usr/bin/perl 
# test2.pl 
use 5.010; 
use strict; 
use warnings; 

use Text::Haml; 

my $text = '#profile'; 
my $haml = Text::Haml->new; 
my $html = $haml->render($text); 
say $html; # <div id='profile'></div> 

UPDATE 1

Я пробовал это (это почти идентично плагину уценки и почти идентично плагину Textile)

use strict; 
use warnings; 
package Template::Plugin::Haml; 

use parent 'Template::Plugin::Filter'; 
use 'Text::Haml'; 

sub init { 
    my $self = shift; 
    $self->{_DYNAMIC} = 1; 
    $self->install_filter($self->{_ARGS}->[0] || 'haml'); 
    $self; 
} 

sub filter { 
    my ($self, $text, $args, $config) = @_; 

    my $haml = Text::Haml->new; 
    return $haml->render($text); 
} 
1; 

UPDATE 2 выход от включения DEBUG => 'all', при инициализации TT

[Template::Provider] creating cache of unlimited slots for [ . ] 
[Template::Service] process(GLOB(0x1719608), HASH(0x16f1650)) 
[Template::Context] template(GLOB(0x1719608)) 
[Template::Context] asking providers for [GLOB(0x1719608)] [] 
[Template::Provider] _load(GLOB(0x1719608), <no alias>) 
[Template::Provider] _compile(HASH(0x1a947a0), <no compfile>) 
[Template::Parser] compiled main template document block: 
sub { 
    my $context = shift || die "template sub called without context\n"; 
    my $stash = $context->stash; 
    my $output = ''; 
    my $_tt_error; 

    eval { BLOCK: { 
#line 1 "input file handle" 
$output .= $context->debugging('msg', { 'line' => '1', 'text' => 'USE Haml', 'file' => 'input file handle' }); ## DEBUG ## 
#line 1 "input file handle" 
# USE 
$stash->set('Haml', 
      $context->plugin('Haml')); 
#line 2 "input file handle" 
$output .= $context->debugging('msg', { 'line' => '2', 'text' => 'FILTER haml', 'file' => 'input file handle' }); ## DEBUG ## 
#line 4 "input file handle" 

# FILTER 
$output .= do { 
    my $output = ''; 
    my $_tt_filter = $context->filter('haml') 
       || $context->throw($context->error); 

$output .= "#profile"; 
#line 4 "input file handle" 
$output .= $context->debugging('msg', { 'line' => '4', 'text' => 'END', 'file' => 'input file handle' }); ## DEBUG ## 

    &$_tt_filter($output); 
}; 

    } }; 
    if ([email protected]) { 
     $_tt_error = $context->catch([email protected], \$output); 
     die $_tt_error unless $_tt_error->type eq 'return'; 
    } 

    return $output; 
} 
[Template::Service] PROCESS: Template::Document=HASH(0x1c69ba0) 
[Template::Context] process([ Template::Document=HASH(0x1c69ba0) ], <no params>, <unlocalized>) 
[Template::Context] template(Template::Document=HASH(0x1c69ba0)) 
[Template::Context] plugin(Haml, [ ]) 
[Template::Plugins] fetch(Haml, <no args>, Template::Context=HASH(0x1972040)) 
[Template::Plugins] loading Template/Plugin/Haml.pm (PLUGIN_BASE) 
[Template::Plugins] calling Template::Plugin::Haml->load() 
[Template::Plugins] Haml => Template::Plugin::Haml 
[Template::Filters] store(haml, ARRAY(0x1c1f4d8)) 
[Template::Context] filter(haml, [ ]<no alias>) 
[Template::Filters] fetch(haml, <no args>, Template::Context=HASH(0x1972040)) 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in string eq at /usr/share/perl5/vendor_perl/Text/Haml.pm line 452, <DATA> line 1. 
Use of uninitialized value in concatenation (.) or string at /usr/share/perl5/vendor_perl/Text/Haml.pm line 674, <DATA> line 1. 
Use of uninitialized value in concatenation (.) or string at /usr/share/perl5/vendor_perl/Text/Haml.pm line 683, <DATA> line 1. 

## input file handle line 1 : [% USE Haml %] ## 

## input file handle line 2 : [% FILTER haml %] ## 
<div id='profile'></div> 
<>## input file handle line 4 : [% END %] ##</> 
+0

'use Template :: Plugin :: Filter' является избыточным,' use parent ... 'сам по себе отлично – singingfish

+0

Я тоже подумал, что тоже ... dunno, почему у документов это так. – xenoterracide

+0

хорошо, похоже, что документы ошибочны. Я буду поддерживать поддержку канала IRC, чтобы посмотреть на это (#tt on irc.perl.org btw) – singingfish

ответ

1

Вот ссылка на конечный продукт на CPAN Template::Plugin::Haml

Понял

use strict; 
use warnings; 
package Template::Plugin::Haml; 

use parent 'Template::Plugin::Filter'; 
use Text::Haml; 

sub init { 
    my $self = shift; 
    $self->{_DYNAMIC} = 1; 
    $self->install_filter($self->{_ARGS}->[0] || 'haml'); 
    $self; 
} 

sub filter { 
    my ($self, $text, $args, $config) = @_; 

    my $haml = Text::Haml->new; 
    return $haml->render($text); 
} 
1; 

и test0.пл

#!/usr/bin/perl 
# test0.pl 
use strict; 
use warnings; 

use Template; 

my $tt = Template->new; #or die $Template::Error, "\n"; 

my $vars = {}; 
my $output = \do{my $i}; 

$tt->process(\*DATA, $vars, $output); 

print $$output; # \n\n<div id='profile'></div>\n\n 
__DATA__ 
[% USE Haml %] 
[% FILTER haml %] 
#profile 
[% END %] 

кажется, что я процитировал use 'Text::Haml' и что мне нужно немного кода инициализации.

0

ОК, я не могу получить эту работу либо.

Доработка тестовый скрипт несколько, чтобы удалить возможные отвлекающие:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use FindBin qw/$Bin/; 
use lib "$Bin/../lib"; 

use Template; 
my $tt = Template->new(
    STRICT => 1, 
    PLUGINS => { MyFilter => 'Template::Plugin::Haml'}, 
    ); 

$tt->process(\*DATA, {}); 

__DATA__ 
Some non haml stuff 
[% USE Haml %] 
[% FILTER Haml %] 
%h1. some haml stuff 
[% END %] 

И когда я запускаю его с perl -Ilib t/01-test.t (водрузив на CPAN расст) Я не получаю никакого вывода. Однако, если я запускаю это без блока Haml в шаблоне я получаю вывод:

Some non haml stuff 

(Если я закомментируйте фильтр HAML и END немного, то я получаю полную мощность, как ожидается, тоже)

Смежные вопросы