CoffeeScript 1.5.0でliterateモードなるものが追加されたらしい。
「.litcoffee」という拡張子のファイルに対して適用されるもので、literateモードでは行頭にインデントがある行のみがCoffeeScriptコードとして解釈され、それ以外の行はすべて無視される。これにより、ドキュメント内に埋め込まれたCoffeeScriptコードを簡単に実行できるようになる。もちろん、.literate形式のファイルをJavaScriptにコンパイルすることも可能だ。
というわけで下のようなmarkdownを作って試してみました。
使用感なんかも書いてあります。
sample.litcoffee
# CoffeeScript 1.5.0 新機能 literateモード お試し
## インデントについて
* タブの場合は1個から、スペースの場合は4個目以降がコードとして扱われる模様。
* スペース2つでインデントする場合はリストのネストは1回までOK。
* Markdownの正式ルールでは1インデントはタブ1つもしくはスペース4つぽいからこの方法は邪道かもしれない。
* タブの場合はリストのネストは不可。
---
## 実行されるコード・実行されないコード
console.log 'これは実行される'
### クラスとか作ってみる
class Hoge
constructor: (@aaa) ->
print: () => console.log @aaa
### 上で作ったクラスを使って処理
fuga = new Hoge 'これも実行される'
fuga.print()
> 引用内なら(先頭に`>`があるので)コードブロックも使える。
>
> ### 実行されないコード
> console.log '実行されない'
### requireとかしてみる
fs = require 'fs'
### 自分自身を読み込んでnode-markdownで展開する
{Markdown} = require 'node-markdown'
html = Markdown fs.readFileSync(process.argv[1], 'utf8')
fs.writeFileSync process.argv[1].replace(/\.litcoffee$/i, '.html'), html, 'utf8'
---
## お試しで使ってみた感想
実行したコードをドキュメント内に展開するみたいなPHPチックな使い方はできない模様。
(上で試した**自分自身をMarkdownで展開**とか利用してがんばれば埋め込めるかもしれないけど素直にテンプレートエンジンとか使った方がマシだと思う)
あくまでドキュメント部分はコード実行時には無視されるだけ、といった感じだと思う。
## 何に使えるの?
Markdown形式に則って(かつ、リストのネストなどしないように気をつけて).litcoffeeでコードを組むと1ファイルでドキュメントもソースも完成!みたいな・・・?
小物ツール程度ならアリかもしれない。
## ちなみに
.litcoffeeをコンパイルするとドキュメント部分が消えた.jsが作成されました(そりゃそうか)。
このmarkdownをコピペしてsample.litcoffeeといったファイル名で保存して、
$ coffee sample.litcoffee
などとすると、sample.htmlが作成され、コンソールには以下の様に表示されます。
(node-markdownがインストールされている必要があります)
これは実行される
これも実行される
正直微妙な感はありますが、まあ「by -1」が結構うれしいのでそれで良しとします。
あとは、エラーが発生した時の行番号表示が.coffeeのものになってくれればと思うけど、まあ難しいだろうな・・・ (´・ω・`)