にゃーん。これはねこの飼い主との思い出が詰まった投稿。
なお、画像は知人の飼い猫で、使用許可取ってない。
経緯
2011年11月にtornado.templateをJavaScriptに移植した。
使えはするけど、細かい機能まで作りきれてなかった。
ちょうど、今回の個人プロジェクトXで、
- JavaScriptで書かれた
- テンプレートエンジン
が必要になったので、メンテして使えるようにした。
前提の個人プロジェクトX
詳細は割愛。テンプレートエンジンに関して記載すると、
- X自体は外部のコード使いたくなかったので、巷で流行ってる?vanilla js。
- Closure Compilerは採用。
テンプレートエンジン
ざっくりと整理。
こんな感じで使える。
var loader = new DictLoader({ "base.html": '<title>{% block title %}default title{% end %}</title>\n' + '<body>{% block body %}default body{% end %}</body>', "page.html": '{% extends "base.html" %}' + '{% block title %}page title{% end %}' + '{% block body %}page body{% end %}' }); loader.load('page.html').generate();
- ソースはこれ。https://github.com/rokujyouhitoma/js-templateengine/blob/develop/src/template/template.js。ただしテストコードやユーザーコードは個人プロジェクトX側に置き去り。開発も個人プロジェクト側で行った。
- テストコード必要になったら、最新はこのあたり。
https://github.com/rokujyouhitoma/horse-racing-game/blob/master/src/js/lib/template_test.js (将来リンク切れになってもしらね)
- 個人プロジェクトXで使えればいい。(個人プロジェクトX以外では、むしろ既知の解決できていない不具合、問題点があるので使えない、使いたくない)。
- tornado.templateを元に、JavaScriptで再実装。テンプレート文法はコンパチではない。JavaScriptらしい文法にすべきところはJavaScriptらしくした。
- 実装コード自体は、PythonとJavaScript異なるので、JavaScript側でPythonっぽい薄いコードを設けてる。
- ついでに個人プロジェクトX側でClosureCompiler使っているので、ClosureCompilerでコンパイルされる前提でアノテーションをできるかぎり。(typed 90%くらい)
- Tornado4.5時点のテンプレートエンジンとだいぶ同じ。
- クリーンルーム開発してないので、ベースとなったtornado.templateのライセンスと同様にApache License v2で公開するのが妥当だろうと考えている。
既知の不具合、問題点
- 一部でテンプレートエンジン内部コードを構築するの面倒だったのでeval使ってる。
- テンプレート構文が部分的にバグってる。具体的には{{this}}でブラウザだとglobalオブジェクトにアクセスできちゃったり{{XXX}}で任意のオブジェクトにアクセスできてしまう。また自由な構文(内部的にはStatementBlockで評価するだけ)を許可してしまっている。