EmacsのOrg-modeでは、バージョン8から、組み込みの機能でMarkdownをexport出来ます。ただし、出来上がるのは標準の規格に準拠したMarkdownなので、Qiita用には少し都合が悪いです。例えば、コードブロックは、文頭にスペースが四つ置かれる形式になってしまって、シンタックスハイライトが効きません。そこで、Qiita準拠のMarkdownを吐き出せるようなパッケージを作ってみました。
作る前に試したもの
QiitaのMarkdownでは、コードに関する記法はGitHub Flavored Markdownに準拠とのことなので、まず、Github向けのパッケージを探してみました。
ありました。
ox-gfmというパッケージです。使ってみたところ、GithubのREADME.mdを書くのは十分にサポートしてくれました。ただ、Qiita用に使い回すためには、少しだけ追加で欲しい機能が有りました。
欲しかった機能
- コードブロックに名前を付けたい。
- コードブロックの言語の指定に使う文字列を変換したい。
- パラグラフ中の改行を取り除きたい。
- 目次の生成を止めたい。
ということで作ってみました。
導入方法
package.el
MEPLAに登録いただきましたので(@takaxp さんありがとうございました)、組み込みのpackage.el
を使って導入いただけます。
手動
コードがここにありますので、ox-qmd.elをダウンロードするか、 git clone
するなどして、ロードパスの通った場所におきます。
セットアップ
init.el
や.emacs
などinitファイルに、以下のコードを記述します。
(require 'ox-qmd)
使用方法
Org-mode標準のexport用メニュー( C-c C-e
)から実行できます。
欲しかった機能1の名前付きコードブロックは、 #+name:
を利用します。
Orgファイルで
#+name: .emacs
#+begin_src emacs-lisp
(require 'ox-qmd)
#+end_src
と書けば、
```el:.emacs
(require 'ox-qmd)
```
とexportされます。
設定方法
欲しかった機能2に関しては、変換を行う言語の追加が行えます(デフォルトでは、変換が行われるのは、"emacs-lisp"->"el"のみです)。
(add-to-list 'ox-qmd-language-keyword-alist '("shell-script" . "sh"))
を.emacsに記述すると、Orgファイル中の
#+begin_src shell-script
$ echo hello
#+end_src
が、
```sh
$ echo hello
```
とexportされるようになります。
欲しかった機能3に関しては、on/offを切り替えることが出来ます。デフォルトでは、パラグラフ中の改行は取り除かれる設定になっています。この動作をoffにしたい場合は、以下のコードを.emacsに記述します。
(setq ox-qmd-unfill-paragraph nil)
欲しかった機能についての補足
3. パラグラフ中の改行の除去
QiitaのMarkdownでは、Githubでコメントを書くときなどと同様に、改行は無視されないようです。この挙動は、エディタの画面幅で改行をしながら文章を書いていく場合には、都合があまりよろしくないです(Org-modeのデフォルトでは、行の折り返し表示がoffになっているため、私はこういう書き方をしていました)。今までの文章の書き方を変えずに、パラグラフは詰めて表示をして欲しかったので、改行の除去を実装しました。
なお、Org-modeのソースで文末に連続する2個のバックスラッシュを置いた場合(Markdownでは、文末に連続する2個のスペースを置くことに相当します)は、改行の除去は行いません。
4. 目次の生成の停止
Org-modeでexportを行うと、ファイルの頭あたりにマジックコメント
#+OPTIONS: toc:nil
を記述しない限り、目次が生成されます。
Qiitaでは、目次が自動的に付加されるので、こうした目次、および目次用のアンカータグは無駄になります。無駄なものがあるのは忍びないので、最初から出ないようにしました。
その後の追加機能
テーブルの変換
従来テーブルはHTMLで出力されてしまっておりましたが、markdownで出力されるようにしました。テーブルの先頭行がそのまま表のヘッドラインとして使われ、水平線は無視されます。列の左・中央・右揃えは、それぞれ<l>
、<c>
、<r>
を配置すれば指定できます。指定がなければ右揃えになります。
| a | b | c | d |
|-----+-----+-----+---|
| <l> | <c> | <r> | |
|-----+-----+-----+---|
| 1 | 2 | 3 | 4 |
| a | b | c | d |
|:----|:---:|----:|--:|
| 1 | 2 | 3 | 4 |
Noteのサポート
Noteは、スペシャルブロックで記述することができます。
#+begin_note-info
ノートの本文
#+end_note-info
:::note info
ノートの本文
:::
info
の部分は、適宜warn
、alert
に置き換えられます。省略も可能です。
インライン画像のアップロード
実験的に、別featureとして作成、公開しました。別記事にまとめましたので、よろしければご覧ください。