2011-07-10 20 views
8

尋找像HTML :: Mason(或Mason)這樣的模板引擎,所以將源代碼組件「編譯」成Perl代碼,而不是Perl代碼將「編譯」組件轉換成JavaScript代碼,然後在Javascript/V8 perl模塊中運行/執行它們。Perl:JavaScript :: V8模板 - 來自perl

動機:尋找解決方案安全模板語言,什麼可以編輯的用戶不影響服務器安全。 JavaScript是全功能語言,因此使用它可能比TT或類似的一些「迷你語言」更好/更快。對我來說最好的是將Mason的擴展(重寫)編譯成Joose/JavaScript而不是Moose/Perl。 ;)

是的,想要從Perl :: Javascript中做到這一點,因爲這種方式有可能通過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執行。 (如在梅森 - 源被編譯成的Perl /穆斯對象,並用Perl執行)...

正如你所看到的,for(var i in list)是用純JS,而不是在「小語言」 ...

+2

你說「 Javascript是全功能語言,因此使用它可能比某些'min'更好/更快我的語言'「。你真的認爲像TT這樣的迷你語言(它是Perl的一個子集,被編譯成Perl,這意味着編譯模板只是子例程)比將模板轉換成Javascript更慢,調用另一個完全不同的解釋器,發送數據給解釋器,運行它,然後從解釋器中收集數據?這聽起來像糖漿一樣慢。 雖然我認爲這是一個整潔的項目,但我認爲這並不實際。 – mpeters

+1

錯誤,爲什麼不允許使用TT?我想你可能會受到一些誤會。 TT是爲MVC分離而設計​​的,不像Embperl或Mason等。 – ysth

+0

只要您沒有啓用EVAL_PERL,您看到了什麼可能的安全問題?我很困惑。 – ysth

回答

9

經過多年的重溫和編輯:)

這是EJS::Template。 它完全符合你的要求 - 將模板編譯成JS並使用V8(或甚至JE)引擎進行評估。不幸的是,目前還沒有Javascript::Duktape引擎支持。

此外,這裏是一個snipet如何使用(服務器端)偉大的 @ 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和eval它JS引擎。

只是爲了說明:在我的noteboook,使用原來的TemplateToolkit我得到了10k /秒。上面的Jemplate/Duktape只有5k /秒。

的我原來的答覆:

這裏是Shotenjin什麼是從天神模板系統的。 。Tenjin is here(perl的

Shotenjin是joose爲主,所以一些加工作將是使用JavaScript V8 ::一個perl可能使用Shotenjin但它仍然不是exacly什麼youre看

編輯。:對於你要找的內容已經完成 - 不幸的是,紅寶石https://github.com/elado/isotope

EDIT2:剛發現:這裏是Template::JavaScript什麼是TT編譯成JS與V8服務器端執行...

+0

也許這裏沒有其他任何工作,所以請接受它作爲最高優先級的解決方案。 – kobame

+0

@ kobame擴展了我的原始答案 – jm666

4

Jemplate

(這麼說,我同意你的前提下完全不同意「JavaScript是因此使用它可能是更好的功能齊全的語言/快一些‘小語言’像TT或類似的」 - IMO也絕對沒有理由做你在問什麼。)

+0

@ kobame:那我不明白你想要什麼;你說你想直接使用javascript,而且你想編譯一個模板到JavaScript? – ysth

+0

@ysth:我用示例編輯我的問題 – kobame

+0

剛剛檢查過的Jemplate - 不幸的是(如果我明白它可以)它用於執行broswer端,而不是服務器端。我正在尋找服務器端的執行 - 就像使用Javascript :: V8一樣。 – kobame