
dnfolioのコードフォーマッターにdprintを使ってみた
- 日本語
- dprint
- Prettier
普段はPrettierユーザー
私の利用しているNeovim環境では、coc.nvim をIDEとして利用しているが、そのプラグインである coc-prettier もよく利用している。
ただ、他の競合ツールも使ってみたいので個人サイト環境で好き放題使ってみよう。dprintを。
dprintってなんだ
A pluggable and configurable code formatting platform written in Rust.
Rust製らしい。
噂ではDenoの内部でも利用されているとか?
.dprint.json | GitHub denoland/deno
dprintの導入
公式ドキュメントに手順が書いてあるのでなぞっていく。
私はWindows環境で scoop を利用しているが、今回はプロジェクトのローカルでDenoを使って利用することにした。
deno.json を作成して以下の内容を書く。
{ "tasks": { "fmt": "deno task dprint fmt", "fmt:check": "deno task dprint check", "dprint": "deno run -A npm:dprint" } }
初期化を行う。
deno task dprint init
dprintはフォーマッターを拡張して利用するスタイルっぽいので、今回はHTMLのフォーマッターである markup_fmt と SASSに対応している malva 、あとは TOML と JSON と Markdown に対応しているプラグインを導入した。
"plugins": [ "https://plugins.dprint.dev/json-0.19.4.wasm", "https://plugins.dprint.dev/markdown-0.17.8.wasm", "https://plugins.dprint.dev/toml-0.6.4.wasm", "https://plugins.dprint.dev/g-plane/malva-v0.11.1.wasm", "https://plugins.dprint.dev/g-plane/markup_fmt-v0.18.0.wasm" ]
あとは、 deno.json に設定している tasks を実行すれば良い。
deno task fmt Task fmt deno task dprint fmt Task dprint deno run -A npm:dprint "fmt" Formatted 2 files.
Teraを利用している場合はちょっと工夫が必要
Tera というHTMLテンプレートエンジンを利用しているが、dprintやPrettier実行時にエラーが発生していた。
例えば、dnfolioの templates/base.html ではこのように書いていた。
<link rel="icon" href="{{get_url(path="/icons/favicon.ico") | safe}}" sizes="any" />
これに対してdprintでフォーマットした場合エラーが発生する。
deno task fmt Task fmt deno task dprint fmt Task dprint deno run -A npm:dprint "fmt" Error formatting D:\dev\personal\zola\dnfolio\templates\base.html. Message: syntax error 'expected self close tag' at line 11, column 46 Had 1 error formatting.
なのでちょっと工夫した。
HTML内でTera専用の構文を使うとフォーマッターが反応しない説があったので以下のように templates/base.html を修正。
{% set url = get_url(path="/icons/favicon.ico") | safe %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>dnfolio</title> <link rel="stylesheet" href="/style.css" /> <link rel="icon" href="{{url}}" sizes="any" /> </head> <body> {% include "components/header.html" %} <section class="section"> <div class="container">{% block content %} {% endblock %}</div> </section> <footer> <span>© 2024 - 2025 dnfolio</span> </footer> </body> </html>
そして実行してみたら
deno task fmt Task fmt deno task dprint fmt Task dprint deno run -A npm:dprint "fmt"
問題無さそう。
工夫ポイント
get_url や safe を直接linkタグ内で定義していたが変数として切り出した。
{% set url = get_url(path="/icons/favicon.ico") | safe %}
そして、 url という変数をlinkタグで使用する。全体のコードはこちら。
{% set url = get_url(path="/icons/favicon.ico") | safe %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>dnfolio</title> <link rel="stylesheet" href="/style.css" /> <link rel="icon" href="{{url}}" sizes="any" /> </head> <body> {% include "components/header.html" %} <section class="section"> <div class="container">{% block content %} {% endblock %}</div> </section> <footer> <span>© 2024 - 2025 dnfolio</span> </footer> </body> </html>
コードフォーマットはやっておきたいので解決して嬉しかった。