LoginSignup
46
39

More than 1 year has passed since last update.

Org-modeからQiita準拠のMarkdownをexportするパッケージを作ってみました

Last updated at Posted at 2015-01-26

EmacsのOrg-modeでは、バージョン8から、組み込みの機能でMarkdownをexport出来ます。ただし、出来上がるのは標準の規格に準拠したMarkdownなので、Qiita用には少し都合が悪いです。例えば、コードブロックは、文頭にスペースが四つ置かれる形式になってしまって、シンタックスハイライトが効きません。そこで、Qiita準拠のMarkdownを吐き出せるようなパッケージを作ってみました。

作る前に試したもの

QiitaのMarkdownでは、コードに関する記法はGitHub Flavored Markdownに準拠とのことなので、まず、Github向けのパッケージを探してみました。
ありました。
ox-gfmというパッケージです。使ってみたところ、GithubのREADME.mdを書くのは十分にサポートしてくれました。ただ、Qiita用に使い回すためには、少しだけ追加で欲しい機能が有りました。

欲しかった機能

  1. コードブロックに名前を付けたい。
  2. コードブロックの言語の指定に使う文字列を変換したい。
  3. パラグラフ中の改行を取り除きたい。
  4. 目次の生成を止めたい。

ということで作ってみました。

導入方法

package.el

MEPLAに登録いただきましたので(@takaxp さんありがとうございました)、組み込みのpackage.elを使って導入いただけます。

手動

コードがここにありますので、ox-qmd.elをダウンロードするか、 git clone するなどして、ロードパスの通った場所におきます。

セットアップ

init.el.emacsなどinitファイルに、以下のコードを記述します。

.emacs
(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>を配置すれば指定できます。指定がなければ右揃えになります。

org-mode
| a   |  b  |   c | d |
|-----+-----+-----+---|
| <l> | <c> | <r> |   |
|-----+-----+-----+---|
| 1   |  2  |   3 | 4 |
markdown
| a   |  b  |   c | d |
|:----|:---:|----:|--:|
|  1  |  2  |  3  | 4 |

Noteのサポート

Noteは、スペシャルブロックで記述することができます。

org-mode
#+begin_note-info
ノートの本文
#+end_note-info
markdown
:::note info
ノートの本文
:::

infoの部分は、適宜warnalertに置き換えられます。省略も可能です。

インライン画像のアップロード

実験的に、別featureとして作成、公開しました。別記事にまとめましたので、よろしければご覧ください。

46
39
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
39