Perl:Javascript::V8 模板 - 来自 perl

标签 perl v8 mason embedded-v8 joose

寻找像 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 编写的,而不是用“迷你语言”编写的……

    最佳答案

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

    这里是 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/

    相关文章:

    perl - 从另一个递归调用一个匿名子程序是否安全?

    ajax - 我如何使用 JSON 和 Perl (HTML::Mason) 通过 AJAX 创建动态网页?

    javascript - 深入了解 v8 最大堆栈帧/大小

    javascript - 如何在 NodeJS 中向 JSON、Date 或其他 'native' 对象全局添加方法?

    mysql - 从perl将阿拉伯语插入mysql

    Perl:调用模块子例程的符号子引用的正确方法?

    javascript - 如何将 DOM API 合并或实现到 v8?

    javascript - 在 JavaScript 中访问 Perl 数组

    regex - 将包含连续段落的字符串拆分为左对齐的行列

    oracle - perl + DBD::Oracle + mod_perl + oracle LDAP 名称解析器 = 崩溃?