8

寻找像 HTML::Mason(或 Mason)这样的模板引擎,所以什么将源组件“编译”成 perl 代码,而不是 perl-code 将“编译”组件成 JavaScript 代码并在使用 Javascript::V8 运行/执行它们之后perl 模块。

动机:寻找安全模板语言的解决方案,什么可以在不影响服务器安全的情况下编辑用户。JavaScript 是功能齐全的语言,因此使用它可能比一些“迷你语言”(如 TT 或类似语言)更好/更快。对我来说最好的是 Mason 的扩展(重写),用于编译成 Joose/JavaScript 而不是 Moose/Perl。;)

是的,想要使用 Javascript::V8 从 perl 执行此操作,因为这种方式可以通过 Javascript::V8 $context->bind_function 以非常安全的方式获得所有 perl 的功能。

问题:

  • 有人知道类似的东西吗?(在 CPAN 中一无所获)...

编辑:在梅森你可以写例如

% #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 编写的,而不是用“迷你语言”编写的……</p>

4

2 回答 2

9

多年后重新访问和编辑:)

这是EJS::Template。它完全符合您的要求 - 将模板编译成 JS 并使用V8(甚至JE)引擎进行评估。不幸的是,还没有Javascript::Duktape引擎支持。

此外,这里有一个片段如何使用来自伟大的@ysth 的答案中的Jemplate(服务器端)与 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 引擎中加载和评估它。

请注意:在我的笔记本上,使用原始TemplateToolkit我得到了 10k/秒。以上 Jemplate/Duktape 仅 5k/秒。

我原来的答案:

这是从天神模板系统派生出来的书天神(perl Tenjin 在这里

Shotenjin 是基于 joose 的,因此可以通过一些额外的工作来使用来自 perl 和 Javascript::V8 的 Shotenjin。但它仍然不完全符合您的要求。

编辑:对于您正在寻找的东西已经完成 - 不幸的是,对于 RUBY。https://github.com/elado/isotope

EDIT2:刚刚发现:这里是Template::JavaScript TT 编译成 JS 并在 v8 服务器端执行...

于 2011-07-10T18:55:45.767 回答
4

模板

(也就是说,我完全不同意您的前提“Javascript 是全功能语言,因此使用它可能比某些“迷你语言”(如 TT 或类似语言)更好/更快” - IMO 绝对没有理由做您要求的事情。 )

于 2011-07-10T16:37:52.647 回答