@md

CSVDoc/TSVDoc: 新しい軽量マークアップ記法を考えてみた

2025-05-12 12:27

#マークアップ #markdown #csv #tsv

はじめに

AIとの親和性によりMarkdown記法が持て囃される昨今だが、あえてCSV/TSVによる新しい軽量マークアップ記法を考えてみた。

CSVDoc/TSVDoc

パーサーはVibe Codingで雑に実装している。

なぜ考えようと思ったのか

主に2つの理由から。

Markdownのテーブルがつらい

Markdownのテーブル記法は入力するのも列を修正するのも面倒すぎる。実際のところ動機はこれだけと言っても良い。

すべての情報はRDBのレコードであるべき

すべての情報は、可能な限り、正規化されたRDBのレコードとして扱われるべきだと思っている。HTMLやJSONなど階層構造が前提のデータ形式は、人間にとっての可読性に寄り添うための妥協の産物に過ぎない。

CSVDoc/TSVDocの基本的な考え方

ドキュメントを構成する各ブロック要素がCSVまたはTSVの1行(1レコード)に対応し、

  • 1列目: HTMLタグ(またはそのエイリアス)
  • 2列目: コンテンツ
  • 3列目: 属性

となる。

1列目にはエイリアスを使うことができ、例えば #<h1>-<ul>|<table> に変換される。

コンテンツの列を可変にすればテーブルが書きやすくなるが、RDBの思想に反すると思い3列に固定した。

CSVDocの例

#,CSVDocについて

##,見出し

,CSVDocにおいて、見出しのレベルは `#` の数またはHTMLタグで表現されます。

##,リスト

-,Item 1
-,Item 2
_-,Subitem

##,テーブル

[,First name
[,Last name
|0,John
|0,Smith
|1,Jane
|1,Doe

TSVDocの例

#	TSVDocについて

##	見出し

	TSVDocにおいて、見出しのレベルは `#` の数またはHTMLタグで表現されます。

##	リスト

-	Item 1
-	Item 2
_-	Subitem

##	テーブル

[	First name
[	Last name
|0	John
|0	Smith
|1	Jane
|1	Doe

詳しい 仕様 はGitHubにある。

良いところ

CSV/TSVのフォーマットをそのまま利用できる

記法とは言いつつもただのCSV/TSVであり、独自のデータフォーマットにロックインされることはない。MarkdownやHTMLへの変換も簡単。

ファイルがそのままデータベースになる

これは結構便利なのではないかと思う。すべてのブロック要素がそれぞれ1つのレコードになっているため、NotionのようにリッチなUIで直接データベースをいじるようなサービスと相性が良さそう。

見た目が割とシンプル

特にTSVは意外とすっきりしていて、見た目のシンプルさはMarkdownと遜色ない。エディターによってはインデントが揃ってきれいに見える。

悪いところ

CSVではダブルクォートを多用する必要がある

CSVはカンマ区切りのため、カンマを含むテキストはダブルクォートで囲む必要がある。また、ダブルクォートはエスケープする必要がある。

TSVでは不可視のタブの扱いが難しい

タブの表示は環境に依存する上、不可視のため取り扱いが難しい。 インデントにはスペースが好まれ、 TSVよりCSVを目にする機会が多いのはそういうことなのだろう。

前後の行に依存している

テーブルやリスト、コードブロック等は前後の行に強く依存している。それぞれを独立したレコードとして扱うには、前後の行へのポインターを持たせるなどの工夫が必要かもしれない。

さいごに

構造化されたテキストがフラットなテーブルであるのは気持ちが良く、個人的には好感触。ただCSV/TSVをプレーンテキストとして編集するのはプログラマーくらいなので、一般的には受け入れられなさそう。

CSVDoc/TSVDoc: 新しい軽量マークアップ記法を考えてみた | Maku ja aalto