とりあえず、一通り作り終えて、おおよそは使えるハズになったので公開:
これは何をするライブラリか
一言で言えば、
[[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 っぽいの作りました!
- → [[GopherJS で hyperapp.js.org っぽい事をするライブラリ作った]]
それと、今回作ったライブラリでは、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 ベース]] なのが、 [[個人的にはポイントが高い]] です。はい。