title: "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 を使ったんですが、この GitLab 、結構 太っ腹 な感じに機能が開放されているのと、あと、有料 プランの Pricing も結構、払い易い価格体系をしていたので、正直、

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

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

nyarla が大体

Scrapbox でコメントや意見を書く