とりあえず、一通り作り終えて、おおよそは使えるハズになったので公開:
これは何をするライブラリか
一言で言えば、
Golang で Hyperscript っぽい事をする ライブラリ
なんだけども、まぁこれについては、実際のサンプルを README.md から転載して貼った方が早いので、以下に貼り付けて置きます:
package main import ( "log" "strings" "golang.org/x/net/html" . "github.com/nyarla/hypercode/dsl" ) func main() { desc := H(`p`, A{`id`: `msg`}, T(`hello, world!`)) node := new(html.Node) if err := desc.Describe(node); err != nil { log.Fatal(err) } b := new(strings.Builder) html.Render(b, node) log.Println(b.String()) // => <p id="msg">hello, world!</p> }
何故、このライブラリを作ったか
これもまぁ一言で言えば、
Golang で hyperscript っぽく HTML as code な感じで HTML 生成 がしたかった
と言う理由なんだけど、 なんでそういう事をしたかったか 、と言うと、これは、
- golang で個人的に Google App Engine /Go な Web Application を作っていた
- が、作ってる途中で、 HTML のテンプレートを書いて golang の ファイルに bundle して云々 ……が面倒に感じた
- なので、 HTML ファイルを直接は記載しない、hyperscript っぽいライブラリが欲しくなった。 が、無かったので作った
という感じです。はい。
あと細かい話
今回作ったライブラリは、
golang.org/x/net/html
でツリー構造を作って、 それをgolang.org/x/net/html#Render
でio.Writer
に書き出す
みたいな構造になっているので、例えば GopherJS やなんかで、golang.org/x/net/html
のツリーから JavaScript の DOM を生成したりするライブラリが有れば、 仮想 DOM とか Incremental DOM とか morphdom とか、そう言った事が出来る……かもしれません。
追記: 2018-04-20 仮想 DOM っぽいの作りました!
それと、今回作ったライブラリでは、golang.org/x/net/html#Node
を直接ポインタを介して使っているけれども、html#Node
を作る DSL の内部的な実装については、
package describers import ( "golang.org/x/net/html" ) type Describer interface { Describe(target *html.Node) error } type DescriberFunc func(target *html.Node) error func (d DescriberFunc) Describe(target *html.Node) error { return d(target) }
と言う感じで分離してあるので、上記の describers#Describer
の interface をサポートしている関数であれば、自由に DSL を拡張出来たりもするハズなので、まぁ、その辺りで便利かな、と個人的には思っています。
以上
と言う事で、
というライブラリを作ったって話でした。
あと今回、このライブラリを CI なテストするのに、
を使ったため、今回、初めて GitLab を使ったんですが、この GitLab 、結構 太っ腹 な感じに機能が開放されているのと、あと、有料 プランの Pricing も結構、払い易い価格体系をしていたので、正直、
もし GitHub に課金する事を考えているのなら、GitLab に課金した方が嬉しいかなー
なんてコトを思いました。あと GitLab 自体も OSS ベース なのが、 個人的にはポイントが高い です。はい。