# flatmarkdown AST 仕様書
`markdown_to_ast(input)` は Markdown を解析し、JSON 形式の AST 文字列を返す。
## ノード構造
すべてのノードは最低限 `type` フィールドを持つ JSON オブジェクトである。子要素を持つノードには `children` 配列が含まれる。ノード固有の属性は同じオブジェクトにフラットに格納される。
```json
{
"type": "<ノードタイプ>",
"<属性>": "<値>",
"children": [ ... ]
}
```
- `type` (string) — 常に存在
- `children` (array) — 子ノードが1つ以上ある場合のみ存在
## ノードタイプ一覧
### ブロックノード
#### `document`
ルートノード。AST の最上位に必ず1つ存在する。
#### `paragraph`
段落ブロック。子要素はインラインノード。
#### `heading`
見出し。
| `level` | integer | 見出しレベル(1〜6) |
| `setext` | boolean | setext 形式の見出しなら `true` |
#### `code_block`
フェンスまたはインデントによるコードブロック。子要素は持たず、内容は `literal` に格納される。
| `fenced` | boolean | フェンスコードブロック(`` ``` `` や `~~~`)なら `true` |
| `info` | string | 開始フェンス後の情報文字列(例: `"rust"`) |
| `literal` | string | コード内容 |
注: 情報文字列が未指定の場合、`info` はデフォルトで `"text"` となる(`default_info_string` による設定)。
#### `block_quote`
`>` による引用ブロック。子要素はブロックノード。
#### `multiline_block_quote`
`>>>` による複数行引用ブロック。
#### `list`
リスト。
| `list_type` | string | `"bullet"`(箇条書き)または `"ordered"`(番号付き) |
| `start` | integer | 開始番号(番号付きリストの場合) |
| `tight` | boolean | タイトリストなら `true`(`<p>` で囲まない)|
| `delimiter` | string | `"period"`(`.`)または `"paren"`(`)`) |
#### `item`
リスト項目。
| `list_type` | string | `"bullet"` または `"ordered"` |
| `start` | integer | この項目の序数 |
| `tight` | boolean | 親リストがタイトなら `true` |
#### `task_item`
タスクリスト項目(チェックボックス)。
| `symbol` | string \| null | 括弧内の文字(例: `"x"`)。未チェックの場合は `null` |
#### `table`
テーブル。
| `alignments` | string[] | 列ごとの配置: `"none"`, `"left"`, `"center"`, `"right"` |
| `num_columns` | integer | 列数 |
| `num_rows` | integer | 行数 |
#### `table_row`
テーブル行。
| `header` | boolean | ヘッダー行なら `true` |
#### `table_cell`
テーブルセル。子要素はインラインノード。
#### `thematic_break`
水平線(`---`, `***`, `___`)。属性・子要素なし。
#### `html_block`
生の HTML ブロック。
| `block_type` | integer | HTML ブロックタイプ(1〜7) |
| `literal` | string | 生の HTML 内容 |
#### `footnote_definition`
脚注定義。
| `name` | string | 脚注ラベル |
#### `alert`
GitHub スタイルのアラート(例: `> [!NOTE]`)。
| `alert_type` | string | `"note"`, `"tip"`, `"important"`, `"warning"`, `"caution"` |
| `title` | string \| null | カスタムタイトル。デフォルトの場合は `null` |
#### `subtext`
ブロックレベルの下付きテキスト(`<sub>` ブロック)。
### インラインノード
#### `text`
テキスト内容。
| `value` | string | テキスト内容 |
#### `softbreak`
Flatmarkdownでは、ASTにsoftbreakは出力されず、必ず`linebreak`となる。
#### `linebreak`
ハード改行(末尾の `\` または2つのスペース)。加えて、Flatmarkdownでは、改行コードも必ず`linebreak`となる。
#### `emph`
強調(`*text*` または `_text_`)。子要素はインラインノード。
#### `strong`
太字強調(`**text**`)。子要素はインラインノード。
#### `strikethrough`
取り消し線(`~~text~~`)。子要素はインラインノード。
#### `underline`
下線(`__text__`)。子要素はインラインノード。
#### `highlight`
ハイライト(`==text==`)。子要素はインラインノード。
#### `superscript`
上付き文字(`^text^`)。子要素はインラインノード。
#### `subscript`
下付き文字(`~text~`)。子要素はインラインノード。
#### `spoilered_text`
スポイラー(`||text||`)。子要素はインラインノード。
#### `code`
インラインコード。
| `literal` | string | コード内容 |
#### `link`
リンク。子要素はリンクテキスト(インラインノード)。
| `url` | string | リンク先 URL |
| `title` | string | リンクタイトル |
#### `image`
画像。子要素は代替テキスト(インラインノード)。
| `url` | string | 画像ソース URL |
| `title` | string | 画像タイトル |
#### `footnote_reference`
脚注参照。
| `name` | string | 脚注ラベル |
| `ref_num` | integer | 同一脚注への参照インデックス |
| `ix` | integer | 文書内での脚注インデックス |
#### `shortcode`
絵文字ショートコード(例: `:rabbit:` → 🐰)。
| `code` | string | ショートコード名(例: `"rabbit"`) |
| `emoji` | string | 解決された絵文字(例: `"🐰"`) |
#### `math`
コードスタイル数式(`` ```math ``)。`math_dollars` は無効のため、`dollar_math` は常に `false`。
| `dollar_math` | boolean | 常に `false`(`math_dollars` 無効) |
| `display_math` | boolean | コードスタイル数式では常に `false` |
| `literal` | string | 数式内容 |
#### `html_inline`
生のインライン HTML。
| `value` | string | 生の HTML 内容 |
#### `raw`
そのまま出力される内容。
| `value` | string | 生の内容 |
#### `escaped`
エスケープされた文字。
#### `escaped_tag`
エスケープされた HTML タグ(tagfilter による)。
| `value` | string | タグ名 |
#### `hashtag`
ハッシュタグ(例: `#tag`, `#日記`)。AST後処理で `text` ノードから抽出される。
`#` は文字列先頭またはホワイトスペース直後に位置する必要がある(単語途中の `#` はタグとして認識されない)。タグ名はUnicode英数字、`_`、`-`、`/` で構成され、それ以外の文字(句読点、空白、文字列末尾など)でタグが終了する。`/` はタグ名の先頭および末尾に使用できない。
| `value` | string | `#` を除いたタグ名(例: `"日記"`) |
## 例
入力:
```markdown
## Hello **world**
```
出力:
```json
{
"type": "document",
"children": [
{
"type": "heading",
"level": 2,
"setext": false,
"children": [
{ "type": "text", "value": "Hello " },
{
"type": "strong",
"children": [
{ "type": "text", "value": "world" }
]
}
]
}
]
}
```