今すぐMarkdownをやめてDjotを使え
Markdown、便利ですよね。いまやWindowsの「メモ帳」すら対応し、ちょっとした構造を持ったドキュメントを書くのにもってこいの言語です。
そんなMarkdownが誕生したのは2004年。当時は厳密な仕様が定義されておらず、方言が乱立し、パーサによって出力が違うことも当たり前でした。そこで、Markdownの標準規格となるべく2014年に生まれたのが、CommonMarkです。
CommonMarkは2004年のオリジナル版Markdownをできるだけ尊重する形で制作されました。その結果、CommonMarkの仕様は複雑なものとなり、さらに表や脚注、上付き、下付き、挿入、打ち消しといった記法は含まれませんでした。そのため、そのような表現をしたければCommonMarkを拡張しなければならず、多数のCommonMark方言が生まれることとなってしまいます。
2026年現在、多くのMarkdown実装はCommonMarkを基にしており、CommonMarkは確かに標準規格になったと言えるでしょう。しかし、今もなおMarkdownの方言は乱立しており、CommonMark準拠でないものも依然として存在します(DiscordのMarkdownが最たる例です)。CommonMarkは少なくとも失敗はしていないでしょうが、100%の成功とは決して言えないのが現状です。
では、CommonMarkが過去に縛られていなかったら?次世代の軽量マークアップ言語として、未来を見据えた設計で作られていたら?
そういった設計思想の下、CommonMark仕様の策定者の一人でもあり、かの有名なPandocの作者でもあるJohn MacFarlane氏によって作成されたのが、Djot (ジョット)です。
前置きが長くなりましたが、これはそんなDjotの良さを語る記事です。
Fuller-featured
Djotの魅力として、まず「記法が充実している」ということが挙げられます。
Djotの記法は、CommonMark拡張であるPandoc Markdownがベースになっています。
そのため、DjotにはPandoc MarkdownにあってCommonMarkにない表現、いくつか例を挙げると
ハイライト
テキストに{=ハイライト=}をつけます→テキストにハイライトをつけます
上付き/下付き
テキストを^上付きに^したり~下付き~にしたり→テキストを上付きにしたり下付きにしたり
挿入/打ち消し
{-削除された部分-}{+挿入された部分+}→
削除された部分挿入された部分定義リスト
: 用語 用語の説明↓
- 用語
用語の説明
などが存在し、CommonMarkとは比べものにならない表現力を有します。
大事なのは、これらが拡張ではなく標準であるということです。これらと同等の機能は一部のMarkdown処理系にも存在しますが、Djotならば全ての処理系が対応しています。「ここの処理系はこの機能に対応しているけどあっちの処理系は対応していない代わりにこれが使えて……」みたいなことは起こりません。
「盲点」がない
さて、突然ですが、問題です。CommonMarkで、Raw HTML (HTMLを直書きする機能)を使用せずに、以下のHTMLを得るためにはどうしたらよいでしょうか?
<p>Can you emphasize just a question mark<em>?</em></p>
<p>ここにある<strong>「鉤括弧」</strong>を強調するには?</p>
……正解は、「できない」です。CommonMarkの仕様上、記号の前の装飾は閉じ側にしかなれず、記号の後の装飾は開き側にしかなれません。そのため、CommonMarkで上記のようなHTMLを出力することは不可能です(DjotのREADMEではこのようなケースを「盲点」と呼んでいるようです)。
最近いたるところで聞く「LLMが剥き出しのMarkdown記法を使ってくる」問題も、ほぼ間違いなくこれが原因です。
一方、Djotにこのような制約はありません。Djotで
Can you emphasize just a question mark_?_
ここにある*「鉤括弧」*を強調するには?
と書けば、上に示したHTMLを得ることができます。
また、これはMarkdownがダメというよりはDjotが上手くやっているという例ですが、
<p><em>ネストされた<em>強調</em>を書きましょう</em></p>
というようなHTMLも、Markdownでは表現できずDjotなら表現できます。
Djotには装飾の開き/閉じを明示する機能があり、これを利用して
_ネストされた{_強調_}を書きましょう_
というように書くと、上記のHTMLを得られます。
HTML以外への変換が想定されている
Markdownは、HTMLへの変換を考慮して設計されています。HTMLタグを直接記述できるのもそのためです。
では、Djotではどうでしょうか。以下のMarkdownを考えてみます。
**こんにちは!**これは<abbr>HTML</abbr>を埋め込む例です。
これと等価なDjotは以下です。
*こんにちは!*これは`<abbr>HTML</abbr>`{=html}を埋め込む例です。
{=html}という、謎の情報が追加されています。お察しの良い方ならもうおわかりと思いますが、これはつまりHTML以外への変換が考慮されている、ということです。例えば
*こんにちは!*これは`\LaTeX `{=latex}を埋め込む例です。
とすればLaTeXを直接記述でき、
*こんにちは!*これは`#box(text(fill: gradient.linear(..color.map.rainbow))[Typst])`{=typst}を埋め込む例です。
とすればTypstを直接記述できるわけですね。
実際に上記の例をPandocに通してHTML, LaTeX, Typstに変換すると
<p><strong>こんにちは!</strong>これは<abbr>HTML</abbr>を埋め込む例です。</p>
\textbf{こんにちは!}これは\LaTeX を埋め込む例です。
#strong[こんにちは!]これは#box(text(fill: gradient.linear(..color.map.rainbow))[Typst])を埋め込む例です。
という結果を得ることができます。実用性はなんとも言えませんが、これは我々に「軽量マークアップ言語はHTMLに変換するもの」という偏見があるせいかもしれません。
Smart Punctuation
一部のMarkdown処理系は、Smart Punctuationと呼ばれる機能を有しています。
「...」と書いたら「…」になったり、「---」と書いたら「—」になったり、「"foo"」と書いたら「“foo”」になったりするやつですね。
Djotは、この機能を言語レベルで搭載しています。たとえば
"Hello, World!"
とすると
<p>“Hello, World!”</p>
となります。
「……だから?」と思われるかもしれませんが、さきほど「Djotには装飾の開き/閉じを明示する機能がある」という話をしたのを覚えているでしょうか。
この機能はSmart Punctuationでも使えます。そのため、
"foo"や"bar"
と書くと
<p>“foo”や“bar”</p>
となる一方、
"foo{"や"}bar"
と書けば
<p>“foo“や”bar”</p>
となる、といった具合にネストされた引用などを正しく表現することができます。
なんなら
"}{""}"}{""}{"
と書けば
<p>”“””“”“</p>
みたいなことも可能です。素の"という記号を出したければ、
\"
のようにエスケープすればOKです。
仕様がシンプル
最初に述べたとおり、CommonMarkは2004年のオリジナル版のMarkdownをできるだけ尊重する形で制作されました。結果、「このときはこうなってほしい」「でもこの場合に限ってはああなるべきだ」といったことが組み込まれ、必要以上に複雑な仕様となってしまいました。
この反省を踏まえ、Djotの仕様は11の原則を念頭に策定されました。この中には「線形時間でパースできること」「Unicodeの文字クラス等を気にすることなくパースできること」などが含まれ、パーサ開発者、そしてパーサそのものへの負荷がより少なくなるよう意識されています。
Closing
そんなわけで、わたしが個人的に感じたDjotの良さをただ書いていくだけの記事でした。釣りっぽいタイトルになっていましましたが、Djotの良さを一人でも多くの人に伝えたいと思った結果こうなりました。許してください。
実際のところ、いくら良いモノでも、普及しなければ意味がないのです。この記事を読んでDjotに興味が湧いたなら、ぜひ使ってみてください。構文の一覧やWeb上で試せるデモページが公式で提供されています。日本語の資料としては『Djot Japanese Docs』や『次世代のMarkdownみたいなDjotの話』あたりがおすすめです。そして、実際に使ってみて良いと感じたのなら、積極的に布教していきましょう。
ちなみにですが、当サイトの記事はすべてDjotで記述されており、jotdownという処理系でHTMLに変換された後、Soupaultという静的サイトジェネレータで処理され公開されています。