カラクリスタ

「輝かしい青春」なんて失かった人のブログ

PEG.js と hastscript の組合せがすごく良い感じ

最近、色々と開発途中に有るヤツをそっちのけで、人生で二回目ぐらいとなる、

  • HTML へ変換出来るオレオレ軽量記法

を開発しているのですが、その時に、

PEG.js

hastscript

を、組み合わせて使ってみたら、凄く簡単に軽量マークアップ言語が開発出来ているので、 今日はその辺りの話を書きます。

PEG.js と hastscript って何?

まず、PEG.js の方についてですが、これは、

PEG ( Parsing Expression Grammar ) の Javascript 実装の一つ

で、簡単に言えば、Javascript ベースでパーザを書く際に使うと便利なヤツです。 なお、PEG 自体については、Wikipedia

Parsing Expression Grammar - Wikipedia

辺りを読むと良いです。

それで、次に hastscript の方なんですが、まず、前提として HAST (Hypertext Abstract Syntax Tree format) と言う、

HTML DOM Tree を軽量に扱える様にするための AST 表現 が有り、コレの仕様が、

で公開されています。

そして、その HAST の Ast 表現を構築出来る様にした hyperscript 実装の一つが、 最初の方でリンクを貼った、hastscript 、という事になります。

それで、この HAST を含め、 色々なテキストの為の AST 表現や、それを弄るための Node.js ライブラリが、

で公開されているので、興味が有る方は色々見てみると良いと思います。

何故 hastscript と PEG.js の組み合わせが良い感じなのか

それで、この記事の最初の方で、僕は PEG.js と hastscript を組み合わせて軽量マークアップ言語を作っている、 と述べましたが、何故、この組み合わせが凄く楽か、と言うと、その理由としては、

  1. PEG.js を使うと正規表現ベースでパーザを書く大変さは無い
  2. パーザが直接 HAST を吐く様にすると、HAST 関連ライブラリをそのまま使える
  3. パーザが直接 HAST を吐くために、 hastscript を使うと凄いラク

と言う辺りです。

ま、基本的には PEG.js を使う事によって、暗号文の様な正規表現を書かなくて良い、 っていうのと、HAST に準拠した AST 表現を使うと、HAST 関連のライブラリがそのまま使えるので、 HAST を HTML に変換したりする部分を自前で実装しなくても良い、と言うのが、 僕としては気に入っている部分です。はい。

HAST やその他の AST 表現 (MDAST や UNIST 等) の開発は Active なの?

この辺りについて、僕は明言できるほどには開発状況がどうなっているのかは良く判ってないのですが、 少なくとも、

辺りで管理されている AST 表現は、

remark rehype retext

という辺りで使われている様ですし、また、上記の GitHub Organazation の Members を見てると、 textlint の開発者である azu さん や、あるいは Vim 界隈で割と良く名前を見かける Linda さん等が参加されているので、 恐らく品質の面でも問題ないのではないか、と僕は思います。

以上

と言う事で今日の話としては、そんな感じでした。

ちなみに、今作っているオレオレ軽量マークアップ言語は、

  • nytra - Ny arla's t ext fo r m a t

と言う名前を付けて開発していて、今の所、開発し始めてから二日目ぐらいで、 インライン系の表記がだいたい実装できた感じです。ただし、 テストとかは流石にまだ書いている途中だったりはしますが。

あと、ブロック系の記法については、そもそも文法をどうするか、 が、まだ固まってない感じなので、その辺りも手間取りそうな感じですが、 とりあえずモノが完成した時点で、 npm や GitHub で公開しようかな、と考えています。


と言う事で、以上です。はい。