Featured image of post 日本語Markdownの太字パース、Hugoでねじ伏せるのが最速だった

日本語Markdownの太字パース、Hugoでねじ伏せるのが最速だった

最近、ChatGPTやGeminiにブログの下書きを書いてもらうことが日常になりました。 でも、出力されたMarkdownをそのままHugoでビルドすると、 ある「違和感」 に直面します。

やたらと太字(Bold)の周りにスペースが空いているんですよね。

これは **「強調」** です。 みたいに。

「AIくん、なんでそんな余計なスペース入れるの?」 最初はそう思っていたのですが、実はこれ、AIのせいではありませんでした。 Markdownという規格そのものが、日本語と絶望的に相性が悪い のが原因なんです。

なぜAIの書く文章には「不自然な空白」が混ざるのか?

Markdownの仕様では、 **太字(**)の前後には半角スペースが必要** なケースが多いんです。 特に、日本語の括弧(「」)や句読点が隣接していると、パーサーが太字だと認識してくれません。

  • 認識されない例 : これこそが**「真実」**だ。
  • 確実に太字になる例 : これこそが **「真実」** だ。

エディタ上では強調されているのに、公開するとただのアスタリスクが表示される……。 この「パースエラー」を避けるために、AIたちは気を利かせてスペースを入れてくれているわけです。

でも、日本語の文章の中にポツンと半角スペースがあるのは、美しくありません。 組版の観点からも、これは看過できない問題です。

答えは「AIに自然に書かせて、システムで強制抽出する」という役割分担

ここで「AIに意地でも太字を認識させるために、スペースを入れさせる」という妥協案もありました。 しかし、これだとMarkdownのソースコードが不自然なスペースだらけになり、美しくありません。

おっしゃる通り、もっとスマートな解決策があります。 それは、「AIにはスペースなしで自然に書かせ、もしHugoがパースに失敗して生のまま残った『』があれば、テンプレート側で強引に強勢(strong)タグへ置換する」** という方法です。

Hugoのビルドプロセスで「太字」を強制再定義する

やり方は非常にシンプルです。 Hugoのテンプレートファイル(layouts/_default/single.htmlなど)で、本文を出力している部分(.Content)に対して、正規表現で「生のアスタリスク」を「HTMLタグ」に上書きしてしまいます。

1
2
3
4
{{/* 1. HTMLに変換された内容を取得 */}} {{- $content := .Content -}} {{/* 2.
パースされずに残った **強調** を <strong>強調</strong> に強制置換 */}} {{-
$content = $content | replaceRE `\*\*(.+?)\*\*` "<strong>$1</strong>" -}} {{/*
3. 安全なHTMLとして出力 */}} {{- $content | safeHTML -}}

このアプローチが最強である理由

この「ねじ伏せ」コードを導入すると、以下のような革命が起きます。

  1. AIへの指示がゼロになる : 「Bold前後にゼロ幅スペースを入れて」なんていう微細なプロンプトは不要。AIは普段通りに、自然な日本語の並びで **強調** と書くだけでよくなります。
  2. Markdownソースが美しい : 執筆中のエディタ上のテキストに不自然な空白が混じりません。
  3. 確実な表示保証 : パーサーがサボっても、最後のフィルターで確実に <strong> タグに変換されるため、強調漏れがゼロになります。

執筆時の美しさと、公開時の完璧なレンダリング。 この両方を「システムの裏側」だけで完結させるのが、AI時代のWeb屋の作法というものでしょう。

ただ……ソースがめっちゃ強そうになる

**を全部<strong>にするから、ソースコードに強さが産まれますね。 でもわりとSEO的にstrongタグは正解らしいので、AIらしさがある**を残して「あちゃー」となるよりはマシかと感じます。

ちなみに私は、半角スペースを前後に入れる指示でゴリ押してるし、今更変えるのも面倒だからと放置しています。

So, what’s next?

結局のところ、Markdownは英語圏の文化から生まれたツールです。 日本語特有の事情なんて、彼らは考慮してくれません。

だったら、ツールに自分を合わせるのではなく、 ツールを自分たちの言語に合わせる 。 それがWebに携わる者の「粋」というものではないでしょうか。

この設定を一度入れてしまえば、もうAIの出力に目くじらを立てる必要はありません。 AIにはのびのびと「正しいMarkdown」を書いてもらい、私たちはその成果を美味しくいただくだけ。 これこそが、AIと人間の心地よいパワーバランスなんだと思います。