アドベントカレンダーに参加する予定です。僕はQiitaの記事を書く際には手元でMarkdownファイルを作ってそこに下書きするのですが、gofmtをかけるのが正直面倒でした。既存コードからコピペする分には良いかもしれませんが、記事向けにコードを修正したり補足を入れた時にgofmtがかかっていない状態になることがありました。かけてくれるツールを作ったので、ツールの紹介と作り方を記事にしました。かけてくれるツールです。下記のようにGoのコードブロックを検知してその中身だけにgofmtがかかります。書く時なんかも便利かもしれません。寄せるようにしました。-rをつけると引数で指定したファイルをそのまま上書きフォーマット。-wを使うと保存するファイルを指定できます。何もつけないとformatした結果が標準出力に流れます。ASTを取得する内部の実装を紹介します。これを使ってMarkdownのバイト列をASTに変換しています。blackfriday.WithExtensions(blackfriday.FencedCode)を渡しています。してくれるようになります。ASTをWalkするMarkdownのASTに対して何かしらの処理を帰納的に処理(トラバース)を実行するには。生えているメソッドを使います。Walkにノードごとに実行したい関数を渡してあげます。渡せる関数は下記の型を持っています。WalkStatus今回作ったツールではgenFmtWalkerという自作関数をWalkに渡しています。MarkdownのASTをトラバースしていき、Goのコードブロックを見つけたらGoが標準で用意してくれているフォーマット用関数のformat.Sourceに渡しています。型を満たす関数を返しています。戻す機能がないからです。するようにしています。エラーを返さないためエラーも同様に処理しています。いうステータスを返してトラバースを中断します。Markdown内のGoのコードをフォーマットした結果を返す関数が完成しました。主な実装はこれだけです。Walk内でformatしていく為、元のMarkdwonのポインタを渡してあげる。