megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

ruby-handlebarsのプレースホルダーに日本語を使いたい

handlebarsって便利ですよね。
さてプレースホルダ{{hoge}} に日本語を使いたい場面などありませんか?
ありませんか。まあ普通はそうです。
しかし私にはそんなタイミングがあったのです。

handlebars.rbでは使えたのですが、さすがにこれはもう古すぎですし、V8エンジンが必要だとかでRails7で使うには面倒です。
そこでruby-handlebarsを使いたいわけですが、こちらは何と日本語に対応していません。

例えば{{名前}}等を使うと、下記エラーが発生します。

Extra input after last repetition at line 1 char 1. (Parslet::ParseFailed)

そこで何とかしていきたいと思います。

環境

Service Version
Ruby 3.2.2
Ruby on Rails 7.0.8
ruby-handlebars 0.4.1

原因

ruby-HandlebarsではParslet::Parserを継承したHandlebars::Parserにルールを定義してparseしています。
しかしここに日本語用のルールが無いためエラーが発生しています。

対応

日本語のルールが無いのであれば、追加すればよいのです。
ということでモンキーパッチを当てていきます。

config/initialize/handlebars.rb

module Handlebars
  class Parser
    # 日本語を含む識別子のための新しいルール
    # \p{Han} は漢字、\p{Hiragana} はひらがな、\p{Katakana} はカタカナを表します
    rule(:japanese_identifier) { match['\p{Han}\p{Hiragana}\p{Katakana}\-a-zA-Z0-9_\?'].repeat(1) }

    # 既存のidentifierルールを拡張
    rule(:identifier) { (else_kw >> space? >> dccurly).absent? >> japanese_identifier }
  end
end

以上デース