Шаблоны Perl: Javascript :: V8 - от Perl - PullRequest
8 голосов
/ 10 июля 2011

Нужен механизм шаблонов, такой как HTML :: Mason (или Mason), и что «компилирует» исходные компоненты в код perl, но вместо perl-кода «скомпилирует» компоненты в код JavaScript и после запуска / выполнения их с помощью Javascript:: Perl модуль V8.

Мотивация: Ищите решение для безопасного языка шаблонов, , что может редактировать пользователей без ущерба для безопасности сервера .JavaScript - это полнофункциональный язык, поэтому его использование, вероятно, лучше / быстрее, чем некоторые «мини-языки», такие как TT или аналогичные.Лучшим для меня было бы расширение (переписывание) Mason для компиляции в Joose / JavaScript вместо Moose / Perl.;)

И да, хотите сделать это из perl с Javascript :: V8, потому что этот способ возможен, если вся мощь perl доступна через Javascript :: V8 $ context-> bind_function очень безопасным способом.

Вопросы:

  • Кто-нибудь знает что-нибудь подобное?(ничего не найдено в CPAN) ...

EDIT: в Mason вы можете написать, например,

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

, было бы неплохо иметь возможность написать выше в JS, например:

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

Приведенный выше источник должен быть "скомпилирован" в JavaScript (Joose) и выполнен с использованием Javascript :: V8.(как в Mason - исходный код компилируется в объект perl / Moose и выполняется с помощью perl) ...

Как видите, for(var i in list) написан на чистом JS, а не на "мини-языке"«...

Ответы [ 2 ]

9 голосов
/ 10 июля 2011

Пересмотрено и отредактировано через годы:)

Вот EJS :: Template . Он делает именно то, что вы просили - компилирует шаблоны в JS и использует V8 (или даже JE) механизмы для оценки. К сожалению, нет поддержки Javascript :: Duktape (пока).

Кроме того, здесь приведен фрагмент использования Jemplate (на стороне сервера) из ответа great @ ysth с движком 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)
    );
!);

производит

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

Вы можете опустить все вызовы Jemplate, предварительно скомпилировав шаблоны с помощью команды jemplate, например:

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

И просто загрузите jemplate_source.js и проверьте его в движке JS.

Только для заметки: на моем noteboook, используя оригинальный TemplateToolkit , я получил 10k / sec. Вышеуказанный Jemplate / Duktape только 5k / sec.

Мой оригинальный ответ:

Вот Shotenjin , полученный из системы шаблонов Tenjin. (Perl Tenjin здесь .

Shotenjin основан на joose, поэтому с некоторыми плюсами можно будет использовать Shotenjin из Perl с Javascript :: V8. Но это не совсем то, что вы ищете.

РЕДАКТИРОВАТЬ: То, что вы ищете, уже сделано - к сожалению, для рубина. https://github.com/elado/isotope

EDIT2: только что обнаружен: вот Template :: JavaScript что такое TT, скомпилированный в JS и выполненный на стороне сервера v8 ...

4 голосов
/ 10 июля 2011

Jemplate

(Тем не менее, я полностью не согласен с вашей посылкой: «Javascript - это полнофункциональный язык, поэтому его использование, вероятно, лучше / быстрее, чем некоторые« мини-языки », такие как TT или аналогичные»). У IMO нет абсолютно никаких причин делать то, что вы просят.)

...