Markdown
Markdown とは、文書を書くためのフォーマットの1つです。HTML に変換することを想定していますが、HTML よりも書きやすいため、人気があります。
ここでは、Markdown での記事の書き方を説明していきます。
なお、NKSSG では、Markdown から HTML へ変換するための処理に Python-Markdown というパッケージを使っています。以下の説明は、このパッケージを使う前提の説明です。
Markdownについての注意
いきなりですが、Markdown について注意点があります。
Markdown には、方言があります。
もともと、Markdown は「HTML より簡単に書けて、 HTML に変換できるフォーマット」として使われてきましたが、HTML のすべての機能に対応しているわけではありません。そのため、多くのシステムやサービスでは、おおもとの Markdown の仕様に独自の拡張を追加しています。
そのため、もしあなたがすでに Markdown で記事を書いたことがあったとしても、別のサービスでは同じように書けないかもしれません。
NKSSG では Markdown に対して独自の拡張機能は用意していません。Python-Markdown に拡張機能を追加する形で使うことを想定しています。
基本的なMarkdown記法
以下では、Python-Markdown でデフォルトの状態で使えるものを中心に、Markdown 記法の説明をしていきます。
段落と改行
文章を空行で分けると、段落として扱われます。
【変換前】
文章1
文章2
【変換後】
<p>文章1</p>
<p>文章2</p>
なお、改行をしただけでは、改行は反映されません。改行の後に半角スペースを2個入れると、改行が反映されます。
【変換前】
文1
文2
文3
文4(文3の後には、半角スペースが2個入っている)
【変換後】
<p>文1
文2</p>
<p>文3<br/>
文4(文3の後には、半角スペースが2個入っている)</p>
見出し
#(シャープ)を使って、見出しを書くことができます。# の数が、見出しのレベルと対応します。# と文字の間には、半角スペースが必要です。
【変換前】
# h1
## h2
### h3
#### h4
##### h5
###### h6
【変換後】
<h1>h1</h1>
<h2>h2</h2>
<h3>h3</h3>
<h4>h4</h4>
<h5>h5</h5>
<h6>h6</h6>
箇条書きリスト
半角のハイフン、プラス、アスタリスクを使うと、箇条書きリストを書くことができます。記号は3つのうちどれを使っても構いません。記号と文字の間には、半角スペースが必要です。
【変換前】
- list 1
- list 1-1
- list 1-1-1
- list 1-2
- list 2
- list 3
【変換後】
<ul>
<li>list 1<ul>
<li>list 1-1<ul>
<li>list 1-1-1</li>
</ul>
</li>
<li>list 1-2</li>
</ul>
</li>
<li>list 2</li>
<li>list 3</li>
</ul>
半角4文字のインデントを入れると、入れ子にすることもできます。(わかりやすいように変換後にはインデントを追加しました)
番号付きリスト
数値と半角ドットを使うと、番号付き書きリストを書くことができます。数値は何でもいいので、「1. 文字」と書いておけばいいです。
ドットと文字の間には、半角スペースが必要です。
【変換前】
1. list 1
1. list 1-1
1. list 1-1-1
1. list 1-2
1. list 2
1. list 3
【変換後】
<ol>
<li>list 1<ol>
<li>list 1-1<ol>
<li>list 1-1-1</li>
</ol>
</li>
<li>list 1-2</li>
</ol>
</li>
<li>list 2</li>
<li>list 3</li>
</ol>
半角4文字のインデントを入れると、入れ子にすることもできます。(わかりやすいように変換後にはインデントを追加しました)
引用
半角の > で、引用を表すことができます。記号と文字の間には半角スペースが必要です。
【変換前】
> This is blockquote.
【変換後】
<blockquote>
<p>This is blockquote.</p>
</blockquote>
引用の中に、さらに引用を含めたい場合は、 >> と2個続けて書きます。また、他の要素(リストなど)を引用の中に入れることもできます。
コードブロック
コードブロックを追加するには、半角4文字でインデントをつけます。
【変換前】
int i = 0;
【変換後】
<pre><code>int i = 0;
</code></pre>
他の書き方として、コードブロックを「バッククォート3つで囲む」方法も、一般的によく使われます。
【変換前】
```
int i = 0;
```
実は、この書き方は本来の Markdown の仕様には入っていません。Python-Markdown でも、デフォルトの状態では使えません。しかし、後述する拡張機能を使って、次のようにnkssg.yml
ファイル内で拡張機能の設定を行えば、使うことができます。
markdown:
- fenced_code
なお、NKSSG のインストール直後は、この設定が追加されているので、「バッククォート3つで囲む」書き方も使えます。この設定を消すと使えなくなります。
水平線
半角のハイフン、アスタリスク、アンダースコアを3個以上書くと、hr
タグに変換されます。
【変換前】
---
【変換後】
<hr/>
リンク
リンクしたいテキストを半角の角カッコで囲み、リンク先の URL を半角の丸カッコで囲むと、リンクを表すことができます。
【変換前】
[sample](http://example.com)
【変換後】
<a href="http://example.com">sample</a>
target
などの設定はできません。
画像
画像は、半角のエクスクラメーションマークをつけて、リンクと同じように書きます。どのように変換されるかは、サンプルを見るとわかるでしょう。
【変換前】
![Alt text](/path/to/img.jpg)
![Alt text](/path/to/img.jpg "Optional title")
【変換後】
<img alt="Alt text" src="/path/to/img.jpg"/>
<img alt="Alt text" src="/path/to/img.jpg" title="Optional title"/>
角カッコがalt
に、丸カッコに書いたパスがsrc
に反映されます。パスのあとに半角スペースをあけて文字を追加すると、title
を設定することができます。
強調
半角のアスタリスクやアンダースコアで文字を囲むと、em
タグに変換されます。2個で囲むとstrong
タグに、3個で囲むとこの2つで囲まれるように変換されます。
【変換前】
*em*
**strong**
***em + strong***
【変換後】
<em>em</em>
<strong>strong</strong>
<strong><em>em + strong</em></strong>
VSCodeでは、テキストを選択した状態で半角のアスタリスクやアンダースコアを入力すると、テキストの前後を囲ってくれます。
コード
文章中にコードを入れたい場合は、バッククォートで囲みます。
【変換前】
This is `code` tag.
【変換後】
This is <code>code</code> tag.
コードブロックは拡張機能を使わないといけませんでしたが、このコードはデフォルトの機能に含まれています。
公式の拡張機能
Python-Markdown には、公式にサポートしている拡張機能があります。公式サポートの拡張機能の一覧はこちら にありますが、以下ではその中でよく使いそうなものと、それを NKSSG でどう使うかを説明していきます。
コードブロック
コードブロックのところでも書きましたが、本来、Markdown でコードブロックを書くには、行頭に半角スペース4つが必要です。しかし、Fenced Code Blocks という拡張機能を使えば、バックスラッシュ3つで囲むことで、コードブロックを表現することができるようになります。リンク先には、言語やクラス、ID を指定する方法も載っているので、確認してみましょう。
この機能を NKSSG で使うためには、nkssg.yml
で次のように設定します。
markdown:
- fenced_code
デフォルトではこの拡張機能は有効になっています。
目次
本文中に目次を追加することができます。Table of Contents という拡張機能を使います。NKSSG では、次のようにnkssg.yml
で設定されているので、デフォルトの状態で使えるようになっています。
markdown:
- toc:
marker: "[toc]"
この拡張機能には、値を設定することができます。拡張機能に何かを設定する場合は、上のように書きます。拡張名toc
の後にコロンをつけ、次の行にインデントをつけて「設定項目: 値」とします。上の例であれば、[toc]
と書いたところが目次に代わる、という設定をしていることになります。
Table of Contents の下の方に、設定できる項目が記載されています。
他の拡張機能を使うには
拡張機能の一覧 には、他にもたくさんの拡張機能がサポートされています。この中から使いたいものがあれば、次のように設定しましょう(上2つの例を見ればわかると思いますが)。
nkssg.yml
の中で、次の場所を探します。
markdown:
この次の行に、拡張機能の名前をリスト形式で追加していきます。拡張機能のページの一番下にある Usage のところに、拡張機能の名前が載っているので、次のようにします。
markdown:
- {ext-name}
もし、拡張機能に設定項目があって、何か値を設定したい場合は次のようにします。
markdown:
- {ext-name}:
{setting-name1}: {value1}
{setting-name2}: {value2}
{ext-name}
の後にコロンがいること、設定項目はインデントをつけることに注意しましょう。
その他のこまごましたこと
上で紹介した Markdown 記法の一覧には、table がありません。実は、table も本来の仕様には含まれていません。table を使いたい場合は、次のようにnkssg.yml
で設定する必要があります。
markdown:
- tables
Markdown でどのように書くかは、Tables を参考にしてください。
拡張機能の中で、属性を追加できる機能があります。
markdown:
- attr_list
これを使うと、例えば次のような使い方ができます。「#」 で始めれば id に、「.」で始めれば class になります。
【変換前】
# h1 { #main-title .header }
[with target](http://example.com){ target=_blank rel="noopener noreferrer" }
![](http://example.com/sample.png){ lazy=loading width=300 }
【変換後】
<h1 class="header" id="main-title">h1</h1>
<p><a href="http://example.com" rel="noopener noreferrer" target="_blank">with target</a></p>
<p><img alt="" lazy="loading" src="http://example.com/sample.png" width="300"/></p>
波かっこの中が追加されます。このようにして、id や class を追加したり、リンクを別タブで開くようにしたリ Lazy loading を実現することができます。
サードパーティーの拡張機能
Python-Markdown というパッケージには、外部の拡張機能を使う機能があります。ここでは、そのようなサードパーティーの拡張機能を使う方法について見ていきます。
例として、PyMdown Extensions という拡張機能を見ていきます。
インストール
NKSSG をインストールした時点で、Python-Markdown はインストールされていますが、サードパーティーの拡張機能を使いたい場合は、個別にインストールする必要があります。インストールの方法は、拡張機能によってバラバラですが、今考えている例では次のように行います。
pip install pymdown-extensions
仮想環境をアクティベートしている場合は、仮想環境にインストールされます。
設定
インストールした拡張機能を使うには、NKSSG のnkssg.yml
で設定しないといけません。設定項目は機能によって違いますが、ここでは、MagicLink を使ってみます。この機能には、URL を打ち込んだら、自動的にリンクが設定される、という機能(Auto-Linking) などが含まれています。
設定は次のように行います。MagicLink の上の方に書いてある拡張機能の名前をそのまま入力します。
markdown:
- pymdownx.magiclink
こうしてから、Markdown ファイル内に、URL を追加してみましょう。URL にリンクが追加されていることがわかります。
このサードパーティーの拡張機能に対しても、設定を行うことができます。リンク先のページの下の方に設定項目の一覧が載っています。例えば、プロトコル(http:// など)を隠すための hide_protocol
という設定をしてみます。
markdown:
- pymdownx.magiclink:
hide_protocol: True
こうすると、たしかに URL にリンクがついて、しかもテキストからはプロトコルが消えていることがわかります。
おわりに
ここでは、Markdown 形式でのテキストの書き方、そして、拡張機能の設定方法や使い方を見てきました。拡張機能はたくさんあるので、便利なものを取り入れれば、より簡単に NKSSG で記事を書くことができるようになります。