flatmarkdown 0.3.1

Flat Markdown parser — outline format with blank-line-delimited blocks
Documentation
# 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" }
          ]
        }
      ]
    }
  ]
}
```