寻找像 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 的功能。
问题:
编辑:在梅森你可以写例如
% #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 编写的,而不是用“迷你语言”编写的……
最佳答案
多年后重新访问和编辑:)
这里是 EJS::Template .
它完全符合您的要求 - 将模板编译成 JS 并使用 V8
(甚至 JE
)用于评估的引擎。可惜没有Javascript::Duktape引擎支持(尚未)。
此外,这里是如何使用 Jemplate
的片段。 (服务器端)来自 很棒 @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 引擎中对其进行评估。请注意:在我的笔记本上,使用原始的 TemplateToolkit我得到了 10k/秒。以上 Jemplate/Duktape 仅 5k/秒。
我原来的答案:
这里是 Shotenjin源自 Tenjin 模板系统的东西。 (perl Tenjin is here 。
Shotenjin 是基于 joose 的,因此可以通过一些额外的工作来使用来自 perl 和 Javascript::V8 的 Shotenjin。但它仍然不完全符合您的要求。
编辑:对于您正在寻找的东西已经完成 - 不幸的是,对于 RUBY。 https://github.com/elado/isotope
EDIT2:刚刚发现:这里是Template::JavaScript什么是TT编译成JS并用v8服务器端执行...
关于Perl:Javascript::V8 模板 - 来自 perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642108/