MarkdownリンクをHTML形式に置換する

年数回開催されて、私もそれなりの頻度で参加している東京Emacs勉強会ですが、2019年に入って発表者に ivy-mode ユーザが多いように思い、移行してみようかな?とそれまで helm-mode を使ってきた私の気持ちが揺らぎました。

そんな迷いと試験的な設定を Twitter に投稿すると、徐々に移行するのを期待されている雰囲気が出てきたので(気の迷い)、せっかくならば記録を付けながらということで、記事を書く前提で helm-mode から ivy-mode に移行しました。

移行で得られた知見は、Qiita にhelm を背に ivy の門を叩く - Qiitaと題して書かせいただきました。まとまった文章を書く時は、人前でお話したくなるのが自然なことですから、Emacs勉強会でもさよならhelm、ようこそivy/counsel - Speaker Deckとしてお話しました。個人的には最高のオチだったと思います(オチはスライドから削除してあります。版権の問題で…)。

結果として、記事をきっかけに ivy-mode に移行した方も複数いらっしゃるようで、少しは役に立てたかと安堵しています。

さて、Qiitaへの記事の投稿ですけども、Markdownを書くなんて野暮なことはしていません。もちろんOrg modeで書き、ox-qmdを使って Qiita 用の Markdown を生成するわけです。ただ、同じソースを使って ox-html で出力する時に少々手間取りました。通常の文字列とコードは問題ないのですが、Qiita用に生成した画像リンクを通常のHTMLに書き出す時にひと手間が必要でした。

まず基本的な作業フローとしては、

  1. org-mode でローカル執筆する(org fileを更新)
  2. ox-qmd で書き出したドラフトを、Qiita のオンラインエディタでコピペする
  3. 画像等メディアが必要な場合、オンラインエディタにD&Dして、リンクを得る
  4. 取得したリンクを org file の begin_export html なソースブロック内にコピペする

この繰り返しです。

Qiita のオンラインエディタでは、画像をD&Dすると ![filename](uri) な Markdown の記法でリンクが生成されます。それをそのまま begin_export html のソースブロックに保存すれば、Qiita では正しくレンダリングされます。

#+begin_export html
![filename](uri)
#+end_export

しかし、そうして作成した org file から通常のHTMLをエクスポートすると、HTMLリンクに正しく変換されません。そこで、 ox-qmd でエクスポートしても、 ox-html でエクスポートしても、どちらでも成立する状態になるようにソースブロックの中身を書き換えます。要は、HTMLコードに置換しておくのです。

次の関数をコールして、どちらの環境でも正しく読み込まれるHTMLコードを生成しています。org file を表示中に M-x my-convert-md-link-to-html するだけです。必要ならば、バッファ保存時に毎度走らせても良さそうです。

(defvar md-link-format "^!\\[\\(.+\\)\\](\\(.+\\))$")
(defun my-convert-md-link-to-html ()
    (interactive)
    (goto-char (point-min))
    (while (re-search-forward md-link-format nil :noerror)
      (let* ((prev (match-string-no-properties 0))
             (alt (match-string-no-properties 1))
             (src (match-string-no-properties 2))
             (new (concat "<p><img src=\"" src "\" alt=\"" alt "\" /></p>")))
        (replace-match new)
        (message "====\ninput:\t%s\noutput:\t%s" prev new)))
    (message "--- done."))

M-x my-convert-md-link-to-html でリンクを書き換えることで、次の2つのサイトに並列エクスポートできるようになりました。ワンソース・マルチユースです(懐かしい)。

  1. helm を背に ivy の門を叩く - Qiita
  2. helm を背に ivy の門を叩く (takaxp.github.io)

個人的には、後者のように見出しが独立してアクセスしやすい記事が好きです。なお、画像の使い回しについては、利用規約的にどうかな?と思うところはありますが、とりあえず大丈夫そうです。問題がありそうなら、画像コンテンツを回収して適切な場所に置こうと思います。その場合であっても、リンクの張替えだけで済みます。

amazon_banner_large
amazon_banner_small