Skip to content
Go back

ルビ記法の正規表現

  • 以前に青空文庫式ルビ記法を置換するHugoテンプレートを作ったさいにはのない記法には対応していなかったが、今ならできそうな気がするのでやってみよう
  • ルビ記法は以下のような規則になっている:
    • 《》で囲まれた文字列はその直前の以降の文字列にルビとして付く
      • |ルビが付く文字列《ルビになる文字列》
    • がない場合、直前の連続する同一文字種の文字列にルビとして付く
      • 注記一覧に『ルビのかかる文字が、漢字、平仮名、片仮名、アルファベットなど、一つの文字種のみからなるときは、「|」はいりません』とある
    • 仝々〆〇ヶは漢字扱い
  • 正規表現で文字種にマッチするには、Unicode文字クラスエスケープを使って文字体系を指定する
    • アルファベットはLatin、ひらがなはHiragana、カタカナはKatakana、漢字はHan
      • \p{sc=Hiragana}と書く
    • 文字体系のひらがな・カタカナには長音が含まれないので、別途指定する必要がある
  • Go言語の正規表現エンジンであるRE2の場合、\pにUnicode文字クラスを直接指定する
    • \p{Hiragana}と書くと、\p{sc=Hiragana}相当になる
  • 結果、テンプレートを以下のように修正した
    • 棒ありと棒なしを統合するのは難しそうだったので、棒あり記法の置換の後に棒なし記法の置換を行うようにした
{{- .Content | replaceRE `|(.*?)《(.*?)》` "<ruby>$1<rt>$2</rt></ruby>" | replaceRE `((?:[\p{Latin}]+?)|(?:[\p{Hiragana}ー]+?)|(?:[\p{Katakana}ー]+?)|(?:[\p{Han}仝々〆〇ヶ]+?))《(.*?)》` "<ruby>$1<rt>$2</rt></ruby>" | safeHTML -}}

棒付きぼうつき

Alphabetアルファベット

棒ナシひらがなhiragana

棒なしカタカナkatakana

棒なし漢字かんじ

Japanese Novel Rubyプラグイン

  • ObsidianのJapanese Novel Rubyプラグインは青空文庫方式に準拠していないみたい
    • ひらがな・カタカナになしでルビを付けてくれない
      • こういうの《ko yu no》がルビにならない
    • 漢字では問題なく動作するが、々〆〇ヶを特別扱いしていない
  • スクリプトなので個人的に改造してしまうこともできる
    • やっていることは正規表現による置換なので、パターンをいじってしまえば表示の方はなんとかなりそう
      • (?:(?:[||]?(?<body1>[一-龠]+?))|(?:[||](?<body2>[^||]+?)))(?:(?:|(?<body2>.*?))|(?<body1>(?:[\\p{sc=Latin}]+?)|(?:[\\p{sc=Hiragana}ー]+?)|(?:[\\p{sc=Katakana}ー]+?)|(?:[\\p{sc=Han}仝々〆〇ヶ]+?)))で置き換えて、そこの引数の"gm""gmu"にする
    • ソースコードはMITライセンス

参考資料