8

HTML :: Mason(またはMason)のようなテンプレートエンジンを探しているので、ソースコンポーネントをperlコードに「コンパイル」しますが、perl-codeの代わりにコンポーネントをJavaScriptコードに「コンパイル」し、Javascript::V8で実行/実行しますperlモジュール。

動機:安全なテンプレート言語の解決策を探しています。サーバーのセキュリティを損なうことなくユーザーを編集できるものです。JavaScriptはフル機能の言語であるため、それを使用することは、TTなどの一部の「ミニ言語」よりもおそらく優れています。私にとって最良の方法は、Moose/PerlではなくJoose/JavaScriptにコンパイルするためのMasonの拡張(書き直し)です。;)

そして、はい、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エンジンは(まだ)サポートされていません。

また、これは、Duktapeエンジンでのすばらしい@ysthの回答からの(サーバー側)の使用方法概要ですJemplate

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/秒です。

私の最初の答え:

これが天神テンプレートシステムから派生した商店神です。(perlTenjinはここにあります

Shotenjinはjooseベースであるため、いくつかのプラスの作業で、Javascript::V8を使用してperlから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 に答える