2011-07-10 21 views
8

Buscando motor de plantillas como HTML :: Mason (o Mason), entonces lo que "compila" los componentes fuente en el código perl, pero en lugar de código perl "compilarán" componentes en código JavaScript y después de ejecutar/ejecutarlos con Javascript :: V8 perl module.Perl: Javascript :: Plantillas V8 - del perl

motivación: Buscando solución para segura lenguaje plantilla, lo que puede editar los usuarios sin comprometer la seguridad del servidor. JavaScript es un lenguaje completo, por lo que su uso es probablemente mejor/más rápido que algunos "mini idiomas" como TT o similar. Lo mejor para mí sería una extensión (reescritura) de Mason para compilar en Joose/JavaScript en lugar de Moose/Perl. ;)

Y sí, quiero hacer esto desde perl con Javascript :: V8 porque de esta manera es posible tener toda la potencia de Perl disponible a través de Javascript :: V8 $ context-> bind_function de una manera muy segura.

Preguntas:

  • Alguien sabe algo así? (Encontrado nada en CPAN) ...

EDIT: en Mason se puede escribir por ejemplo

% #perl version 
% my(@list) = qw(Jane John Doe); 
<ul> 
% foreach my $item (@list) { 
    <li><% uc($item) %></li> 
% } 
</ul> 

sería bueno tener posibilidad de escribir lo anterior en JS, como:

% //javascript version 
% var list = ["Jane", "John", "Doe"]; 
<ul> 
% for(var i in list) { 
    <li><% perl_uc($list[i]) %></li> 
    <!-- the "perl_uc" is the real perl uc() what is binded 
     with Javascript::V8::bind_function(perl_uc => sub { return uc(@_) } 
    --> 
% } 
</ul> 

La fuente anterior debe ser "compilada" en JavaScript (Joose) y ejecutada con Javascript :: V8. (Como en Mason - la fuente se compila en Perl objeto/alces y ejecutada con Perl) ...

Como se puede ver, el for(var i in list) está escrito en puro JS, y no en "mini-lenguaje" ...

+2

Dijiste " Javascript es un lenguaje con todas las funciones, por lo que su uso es probablemente mejor/más rápido que algunos 'min i idiomas '". Realmente crees que un mini lenguaje como TT (que es un subconjunto de Perl y se compila en Perl, lo que significa que las plantillas compiladas son solo subrutinas) va a ser más lento que transformar tu plantilla en Javascript, invocando a otro intérprete completamente diferente, enviando datos a ese intérprete, ejecutándolo y luego recogiendo datos de ese intérprete? Eso suena lento como melaza. Si bien creo que este es un proyecto ordenado, no creo que sea tan práctico. – mpeters

+1

Err, ¿por qué no permitirlo con TT? Creo que puedes estar bajo una mala impresión. TT está diseñado para la separación de MVC, no como Embperl o Mason o similar. – ysth

+0

siempre que no tenga habilitado EVAL_PERL, ¿qué posible problema de seguridad ve? Estoy desconcertado. – ysth

Respuesta

9

Revisado y editado después de años :)

Aquí está el EJS::Template. Hace exactamente lo que pidió: compila las plantillas en JS y usa los motores V8 (o incluso JE) para evaluar. Lamentablemente, no tiene soporte para motor Javascript::Duktape (todavía).

Además, aquí hay una snipet cómo utilizar el (lado del servidor) Jemplate del gran @ respuesta de ysth con el motor Duktape.

use strict; 
use warnings; 

use Jemplate; 
use JavaScript::Duktape; 

# can omit these steps - see bellow 
# Get the lite runtime js-source without the unnecessary AJAX (we are server side) 
my $jemp_runtime = Jemplate::runtime_source_code('lite'); 

# The Template::Toolkit template 
my $template = q{ 
[%- FOREACH pope IN perlmonks -%] 
pope: [% pope.name %] = [% pope.experience %] 
[% END -%] 
}; 

# compile the Template source using Jemplate and name it 
my $jemp_template = Jemplate->compile_template_content($template, 'monkstemplate'); 

# the data 
my $data = { 
    'perlmonks' => [ 
     { 'name' => 'vroom', 'experience' => '1007479', }, 
     { 'name' => 'BrowserUk','experience' => '167247', }, 
     { 'name' => 'Corion', 'experience' => '133975', }, 
     { 'name' => 'ikegami', 'experience' => '128977', } 
    ] 
}; 

# init 
my $js = JavaScript::Duktape->new(); 
$js->set('write' => sub { print $_[0]; }); 
$js->eval($jemp_runtime); # eval the runtime code 
$js->eval($jemp_template); # the Template code compiled into JS 
$js->set("monkdata", $data);# bind the data 

# finally eval the template processing code 
$js->eval(q! 
    write(
     Jemplate.process('monkstemplate', monkdata) 
    ); 
!); 

produce

pope: vroom = 1007479 
pope: BrowserUk = 167247 
pope: Corion = 133975 
pope: ikegami = 128977 

Se puede omitir toda Jemplate llama, mediante la compilación de las plantillas de antemano con el comando jemplate, como:

jemplate --runtime=lite --compile /path/to/templates > jemplate_source.js 

Y justo cargar el jemplate_source.js y eval en el motor JS.

Solo para la nota: en mi noteboook, usando el TemplateToolkit original obtuve 10k/seg. El Jemplate/Duktape anterior solo mide 5k/seg.

La mi primera respuesta:

Aquí es Shotenjin lo que se deriva de un sistema de plantillas Tenjin. (Perl Tenjin is here

Shotenjin se basa Joose, así que con un poco de trabajo, más será posible el uso de una Shotenjin Perl con Javascript V8 :: Pero todavía no es exacly para lo que usted está buscando

EDITAR...: por lo que estás buscando ya está hecho - por desgracia, por el rubí https://github.com/elado/isotope

Edit2:. Acaba de descubrir: aquí es lo que se Template::JavaScript TT compilado en JS y ejecutado con el lado del servidor v8 ...

+0

Probablemente aquí no haya hecho nada más, así que acepte esto como la solución más actualizada. – kobame

+0

@kobame extendió mi respuesta original – jm666

4

Jemplate

(dicho esto, no estoy de acuerdo del todo con su premisa de "Javascript es un lenguaje ofrecido completo lo que su uso es probablemente mejor/más rápido que algunos 'mini lenguas' como TT o similares" - OMI no hay absolutamente ninguna razón para hacer lo que está pidiendo)

+0

@kobame: entonces no obtengo lo que quieres; ¿Dice que quiere usar javascript directamente, pero también que desea compilar una plantilla para javascript? – ysth

+0

@ysth: he editado mi pregunta con el ejemplo – kobame

+0

Just checked Jemplate - desafortunadamente (si lo entiendo bien) es para la ejecución lateral del broswer, no del lado del servidor. Estoy buscando la ejecución del lado del servidor, como con Javascript :: V8. – kobame