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

読了まで:約2分


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

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

一言で言えば、

[[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 生成]] がしたかった

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

  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 っぽいの作りました!

  • → [[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 ベース]] なのが、 [[個人的にはポイントが高い]] です。はい。

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。