2011-07-10 21 views
8

Poszukuję silnika szablonów takich jak HTML :: Mason (lub Mason), więc co "kompiluje" komponenty źródłowe w kodzie perl, ale zamiast perl-code skompiluje komponenty do kodu JavaScript i po uruchomieniu/uruchomieniu ich z modułem perlera Javascript :: V8.Perl: JavaScript :: Szablony V8 - od perl

Motywacja: Szukasz rozwiązania dla bezpiecznego języku szablonu, co może edytować użytkowników bez narażania bezpieczeństwa serwera. JavaScript jest w pełni funkcjonalnym językiem, więc używanie go jest prawdopodobnie lepsze/szybsze niż niektóre "języki mini", takie jak TT lub podobne. Najlepsze dla mnie byłoby rozszerzenie (przepisanie) Mason'a na kompilację Joose/JavaScript zamiast Moose/Perl. ;)

A tak, zrób to z Perl z Javascript :: V8, ponieważ w ten sposób możliwe jest posiadanie całej mocy perla dostępnej przez JavaScript :: V8 $ context-> bind_function w bardzo bezpieczny sposób.

Pytania:

  • ktoś wie coś podobnego? (Znaleziono nic w CPAN) ...

EDIT: w Mason można napisać na przykład

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

byłoby miło mieć możliwość napisać powyżej w JS, jak:

% //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> 

Powyższe źródło powinno zostać "skompilowane" do JavaScript (Joose) i wykonane przy pomocy Javascript :: V8. (Podobnie jak w Mason - źródło jest kompilowany do Perl/obiektu Moose i wykonany z Perl) ...

Jak widać, for(var i in list) jest napisany w czystym JS, a nie w „mini-język” ...

+2

Mówiłeś " JavaScript jest w pełni funkcjonalnym językiem, więc używanie go jest prawdopodobnie lepsze/szybsze niż niektóre "min i języki "". Naprawdę myślisz, że język mini, taki jak TT (który jest podzbiorem Perla i jest skompilowany do Perla, co oznacza, że ​​skompilowane szablony są tylko podprogramami) będzie wolniejszy niż przekształcenie twojego szablonu w JavaScript, wywołanie innego zupełnie innego tłumacza, wysyłanie dane do tego tłumacza, uruchamiając go, a następnie zbierając dane z tego tłumacza? Brzmi to wolno jak melasa. Chociaż myślę, że to zgrabny projekt, nie sądzę, że to wszystko jest tak praktyczne. – mpeters

+1

Err, dlaczego nie pozwolić na TT? Myślę, że możesz być pod wpływem jakiegoś nieporozumienia. TT jest zaprojektowany do separacji MVC, a nie jak Embperl, Mason czy tym podobne. – ysth

+0

, o ile nie masz włączonego EVAL_PERL, jaki jest możliwy problem z bezpieczeństwem? Jestem oszołomiony. – ysth

Odpowiedz

9

Powtórka i edycja po latach :)

Oto EJS::Template. Wykonuje dokładnie to, o co prosiłeś - kompiluje szablony do JS i używa silników V8 (lub nawet JE) do oceny. Niestety, nie ma wsparcia dla silnika Javascript::Duktape (jeszcze).

Również tutaj jest snipet jak używać Jemplate (po stronie serwera) od wielkiej @ odpowiedź ysth jest z silnikiem 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) 
    ); 
!); 

produkuje

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

Można pominąć wszystkie Jemplate nazywa, kompilując szablony wcześniej za pomocą polecenia z jemplate, jak:

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

I właśnie załadować jemplate_source.js i eval go w silnik JS.

Tylko dla uwaga: na moim notesie, używając oryginalnego TemplateToolkit mam 10k/sek. Powyższy Jemplate/Duktape tylko 5k/sek.

Mój oryginalny odpowiedź:

Oto Shotenjin co pochodzi od Tenjin systemu szablonów. (Perl Tenjin is here

Shotenjin opiera Joose, więc z pewną pracę plus będzie możliwe użycie Shotenjin z Perl z JavaScript :: V8 Ale to jeszcze nie jest exacly co szukacie

EDIT...: do czego szukasz już jest zrobione - niestety, dla Ruby https://github.com/elado/isotope

EDIT2. Właśnie odkryłem: oto Template::JavaScript co TT kompilowane do JS i wykonywane po stronie serwera z v8 ...

+0

Prawdopodobnie tutaj nie ma nic innego, więc zaakceptuj to jako najbardziej upragnione rozwiązanie. – kobame

+0

@kobame rozszerzyła moją odpowiedź początkową – jm666

4

Jemplate

(powiedział, że nie zgadzam się całkowicie z założeniem „Javascript jest pełna język funkcjonalny więc stosując to chyba lepiej/szybciej niż niektóre«języków mini», jak TT lub podobne” - IMO nie ma absolutnie żadnego powodu, robić to, o co prosisz.)

+0

@kobame: wtedy nie dostaję tego, co chcesz; mówisz, że chcesz bezpośrednio używać javascript, ale także chcesz skompilować szablon do javascript? – ysth

+0

@ysth: Edytowałem moje pytanie z przykładem – kobame

+0

Właśnie sprawdziłem Jemplate - niestety (jeśli rozumiem, że jest ok) do wykonania strony broswer, nie po stronie serwera. Szukam wykonania po stronie serwera - tak jak w Javascript :: V8. – kobame