reStructured Text から Markdownへ移行の検討

カテゴリー:  Tech タグ:  markdown nikola restuctured text
/images/nikola.webp

このWeblogはNikolaを使ってreStructured Text(以下、"reST”と記載)していますが、Markdown記法に移行する事を検討しています。

reStructured TextからMarkdownへの移行を検討している理由

きっかけは、少し前からInkDropを導入していて、Markdownでブログネタを書いてPandocでreSTに変換すればいいと思っていたのですが、よく考えると NikolaはMarkdownにも対応しているので、「Markdownでもいいんじゃないか」と思えてきたわけです。

reSTのほうが構造化した文書を書くには向いているのですが、以下のような点ではMarkdownのほうが優れています。

  • reSTは扱える処理系が限られていますがMarkdownを扱える処理系は至る所にあるので、InkDropからNikolaになど情報を移動させる時にMarkdownの方が楽。

  • reSTほうが高機能ですがそのため記述が面倒な面があり、Markdownの方が直感的に記述できる。

そう考えると、 InkDropの作者の方が書いていることが なんだかすっきりと理解できます。

Markdownは規格化されたプレーンテキストのフォーマットです。企業独自のシステムはもとより、World-Wide-Webにすら依存しません。その読みやすく書きやすいシンタックスによって、今日ではMarkdownは様々な目的で利用されています。ドキュメント作成、ブログ執筆、そしてもちろん、ノートテイキングなど。例えば、Gatsbyのような静的サイトジェネレータを使えば、Markdownファイルからウェブサイトを構築できます。Markdownが .md のファイル形式としてある時、Markdownのポータビリティを最大限に活用することが出来るのです。

Inkdrop のロードマップ vol.4より抜粋

reStructured TextからMarkdownへの置き換え

普段ブログで使うような記述だと、ほとんどMarkdownに置き換えができそうです。 以下は主に移行で問題になりそうな記述方法について確認したことを、Markdownに移行した時の自分への備忘としてまとめておきます。

また以下はNikoa上での確認した内容で、NikolaではMarkdown ExtensionsによりMarkdownを拡張して実現しているものもがあります。

Inline Elements

リンク

リンクは Markdownのほうが直感的で分かりやすいですね。 これがMarkdownに移行したモチベーションの一つです。

以下はreSTの記述です。

`Google <https://google.com>`_

Markdownにすると以下のようになります。

[Google](https://google.com)

脚注

脚注は reStructured Textのほうが柔軟なのですが、それほど複雑なことをしなければMarkdownで大丈夫でそうです。

reSTです。

アクセスしているユーザーのローカルフォント [#f1]_
...

.. rubric:: 脚注

.. [#f1] Macならヒラギノ角ゴ、Windowsならメイリオなどです。

Markdownだとよりシンプルです。

アクセスしているユーザーのローカルフォント[^1]。

...

[^1]: Macならヒラギノ角ゴ、Windowsならメイリオなどです。

Block

Listブロック

リストも書き方は多少違いますが、ほぼ同じように記述できます。 定義リストについてはMarkdownは標準ではサポートしていないと思っていたのですが、Nikolaでは以下のような記述で定義リストをサポートしているようです。

以下はreSTです。

一般的なリスト

1. Apple
2. Orange

* Banana
* Grape

Apple
   Pomaceous fruit of plants of the genus Malus in
   the family Rosaceae.

Markdownに書き換えると以下のようになります。

1. Apple
2. Orange

* Banana
* Grape

Apple
:   Pomaceous fruit of plants of the genus Malus in
    the family Rosaceae.

ほとんど違いがありませんが、定義リストの部分が若干異なります。

Code Block

コードソースなどの記述は、Markdownのほうがシンプルでインデントも不要なので書きやすいです。Nikolaの場合 Syntax Highlightにはどちらも Pygmentを使っているようなで差はなさそうです。

reSTは以下のようになります。

.. code-block:: python

  for path, dirs, files in os.walk('posts'):
      for f in files:
          if f.endswith('.md') or f.endswith('.markdown') or f.endswith('.rst'):
              fpath = os.path.join(path, f)
              print('path={0}'.format(fpath))
              convert_file(fpath)

Markdownです。

```python
for path, dirs, files in os.walk('posts'):
    for f in files:
        if f.endswith('.md') or f.endswith('.markdown') or f.endswith('.rst'):
            fpath = os.path.join(path, f)
            print('path={0}'.format(fpath))
            convert_file(fpath)
```

Markdownはシンプルですが、バッククォートで括るためバッククォートの扱いが難しい場合もありそうです。今回Markdownの中でMarkdownのコードを書こうとしたら展開されてしまいちょっと困りました。

キャプション付き画像

キャプション付き画像を記事に入れたい時はreSTでは以下のように記載します。

.. figure:: https://hogehoge.or.jp/images/image.webp
    :alt: Alt Text

    Caption

すると以下のようなHTMLに変換されます。

<figure>
  <img alt="Alt Text" src="https://hogehoge.or.jp/images/image.webp">
  <figcaption>
    <p>Caption</p>
  </figcaption>
</figure>

Markdownもキャプションは以下のようなコードで書けそうです。

![Alt Text](https://hogehoge.or.jp/images/image.webp "Caption")

しかし、実際に変換してみると以下のようなHTMLになります。

<img alt="Alt Text" src="https://hogehoge.or.jp/images/image/webp", title="Caption">

このためキャプション付き画像については、Markdownで行いたい場合はHTMを直接記述する必要がありそうです。

Markdownにしかできない記述

Markdownは文書内に気軽にHTMLを記述できます。

基本的はあまりやらないと思いますが,以下のような長いソースコードを折り畳んで見せる際には良さそうです。 [1] 以下はMarkdownでの記述例です。

<details><summary>一覧</summary>

rust
  fn main() {
    // 世界よ、こんにちは
    println!("Hello, world!");
}

</details>

Markdownといっても、details要素をHTMLでベタ打ちしてるんですが。

Nikols Extensionsへの対応

以下はNikolaで拡張された独自の記述への対応です。ただし、厳密にはこれまで説明した内容も Markdown Extensionsで拡張された記述方法も含んでいます。

ポストリスト

これはNikolaの拡張機能です。関連する記事一覧を表示するの便利です。Markdownにも同様の拡張がされているので、以下の記述をすれば使えるようです。

reSTでは以下のように記述します。

.. post-list::
  :stop: 5
  :tags: nikola

Markdownでは以下のように記述します。

/images/2023/05/15/post-list.webp

「続きを読む」

indexページへの出力を抑止して、「続きを読む」で全ページを見せたい場合はreSTでは以下の通りです。

.. TEASER_END

Markdownでは以下の通りです。

<!-- TEASER_END -->

コメントで括るので、Markdownのほうが面倒です。

目次

それほど長い記事を書かないのであまり使用しませんが、Nikolaには目次生成機能もあります。

reSTでは以下のように記述します。

.. contents::

Markdownでは以下のように記述します。大文字でなければ成らない点は注意が必要です。

[TOC]

まとめ

こうして確認すると,移行する問題はほとんど問題なさそうです。

NikolaでMarkdownで記事を書きたい時は以下のように新規記事作成時にフォーマットを指定すれば大丈夫です。

$ nikola new_post -e -f markdown

関連記事

脚注

コメント

Comments powered by Disqus