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