カラクリスタ

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

Golang で Hyperscript っぽい事をするライブラリを作った

とりあえず、一通り作り終えて、おおよそは使えるハズになったので公開:

これは何をするライブラリか

一言で言えば、

GolangHyperscript っぽい事をする ライブラリ

なんだけども、まぁこれについては、実際のサンプルを 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>
}

何故、このライブラリを作ったか

これもまぁ一言で言えば、

Golanghyperscript っぽく HTML as code な感じで HTML 生成 がしたかった

と言う理由なんだけど、 なんでそういう事をしたかったか 、と言うと、これは、

  1. golang で個人的に Google App Engine /Go な Web Application を作っていた
  2. が、作ってる途中で、 HTML のテンプレートを書いて golang の ファイルに bundle して云々 ……が面倒に感じた
  3. なので、 HTML ファイルを直接は記載しない、hyperscript っぽいライブラリが欲しくなった。 が、無かったので作った

という感じです。はい。

あと細かい話

今回作ったライブラリは、

golang.org/x/net/html でツリー構造を作って、 それを golang.org/x/net/html#Renderio.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 CI/CD

を使ったため、今回、初めて GitLab を使ったんですが、この GitLab 、結構 太っ腹 な感じに機能が開放されているのと、あと、有料 プランの Pricing も結構、払い易い価格体系をしていたので、正直、

もし GitHub に課金する事を考えているのなら、GitLab に課金した方が嬉しいかなー

なんてコトを思いました。あと GitLab 自体も OSS ベース なのが、 個人的にはポイントが高い です。はい。