umd 0.1.0

Universal Markdown - A post-Markdown superset with Bootstrap 5 integration and extensible syntax
Documentation
# テンプレートエンジン機能(将来構想)仕様

**最終更新**: 2026年3月3日

このドキュメントは、テンプレートエンジン機能(将来構想)の詳細仕様です。概要は [planned-features.md](planned-features.md) を参照してください。

> 🚧 **将来構想**  
> この機能は正式バージョンリリース後の仕様策定段階です。現時点ではアイデアレベルであり、実装時期や詳細は未定です。

## 概要(テンプレートエンジン)

フロントマターで定義した変数をMarkdown本文中で展開できるテンプレートエンジン機能を提供します。既存のプラグイン構文をマクロとして転用することで、統一的な記法を実現します。

## 設計方針

**責務の分離**:

- **UMDパーサー**: テンプレート構文を特殊なHTML要素として出力
- **バックエンド**: 実際の変数展開・マクロ実行を担当(Nuxt/Laravel/その他)

このアプローチにより、UMDパーサーは言語非依存のまま、各バックエンドが最適な方法でテンプレート処理を実装できます。

## フロントマター変数定義

```umd
---
title: "ページタイトル"
author: "著者名"
date: 2026-02-13
is_template: true  # テンプレートエンジン機能を有効化
config:
  theme: "dark"
  version: "1.0.0"
items:
  - "アイテム1"
  - "アイテム2"
  - "アイテム3"
---

# {{ title }}

著者: {{ author }}
日付: {{ date }}
```

**テンプレートモードの有効化**:

- `is_template: true` を設定することで、if文やfor文などの制御構造のサポートを有効化します。
- このフラグがない場合、基本的な変数展開のみが機能し、制御構造は無視されます。

## 変数展開構文

### 基本的な変数展開

**構文**:

```umd
{{ variable }}
```

**UMDパーサー出力**:

```html
<data class="umd-var" value="variable">{{ variable }}</data>
```

または、フロントマターで定義された全変数を一覧として出力する場合:

```html
<datalist id="umd-frontmatter-vars">
  <option value="title">ページタイトル</option>
  <option value="author">著者名</option>
  <option value="date">2026-02-13</option>
</datalist>
```

**特徴**:

- 各変数展開箇所は `<data>` 要素で表現
- `value` 属性に変数名を格納
- 元の構文をテキストとして保持(バックエンドでの処理を想定)
- フロントマターのトップレベル変数を参照
- ドット記法でネストされた値にアクセス: `{{ config.theme }}`

### 配列・オブジェクトのアクセス

```umd
{{ items.0 }}          <!-- 配列のインデックスアクセス -->
{{ config.theme }}     <!-- オブジェクトのプロパティアクセス -->
```

## マクロ機能(プラグイン構文の転用)

既存のプラグイン構文をマクロとして再利用します。

### マクロ定義(フロントマター)

```yaml
---
macros:
  note: |
    @callout(info){{
      📝 **注意**: {content}
    }}
  button: |
    &link(btn btn-primary){{[{text}]({url})}}
---
```

### マクロ呼び出し

```umd
@macro(note, content="これは重要な情報です");
@macro(button, text="クリック", url="/page");
```

**バックエンドでの展開イメージ**:

```umd
@callout(info){{
  📝 **注意**: これは重要な情報です
}}

&link(btn btn-primary){{[クリック](/page)}}
```

## 条件分岐(提案)

```umd
@if(theme == "dark"){{
  ダークモード用コンテンツ
}}

@if(version >= "1.0.0"){{
  新バージョンの機能説明
}}
```

**UMDパーサー出力**:

```html
<template class="umd-plugin umd-plugin-if" data-condition="theme == 'dark'">
  ダークモード用コンテンツ
</template>
```

## 繰り返し処理(提案)

```umd
@for(item in items){{
  - {{ item }}
}}
```

**期待される出力** (バックエンド処理後):

```markdown
- アイテム1
- アイテム2
- アイテム3
```

## セキュリティ考慮事項

**XSS対策**:

- 変数展開時は自動的にHTMLエスケープを適用
- 生のHTMLを挿入する場合は明示的なマーカーが必要(例: `{{{ raw_html }}}`- バックエンド側で適切なサニタイゼーションを実装

**インジェクション対策**:

- フロントマターのYAML/TOML解析は信頼できるライブラリを使用
- マクロ定義の再帰呼び出しを制限(無限ループ防止)
- 変数名の検証(予約語・特殊文字のチェック)

## 実装の段階的アプローチ

**Phase 1**: 基本変数展開

- フロントマター変数の定義
- `{{ variable }}` 構文のHTML要素化
- バックエンドでの単純な変数置換

**Phase 2**: マクロ機能

- `@macro()` 構文のサポート
- フロントマターでのマクロ定義
- プラグイン構文への展開

**Phase 3**: 制御構文

- `@if()`, `@for()` のサポート
- 条件評価エンジンの実装
- ネストされた制御構文

## Twigとの比較

| 機能       | Twig               | UMD提案            | 備考              |
| ---------- | ------------------ | ------------------ | ----------------- |
| 変数展開   | `{{ var }}`        | `{{ var }}`        | 同じ構文          |
| フィルター | `{{ var\|upper }}` | 未定               | バックエンド依存  |
| 条件分岐   | `{% if %}`         | `@if(){{}}`        | UMDプラグイン形式 |
| ループ     | `{% for %}`        | `@for(){{}}`       | UMDプラグイン形式 |
| マクロ     | `{% macro %}`      | フロントマター定義 | YAML/TOML形式     |
| 継承       | `{% extends %}`    | 未対応             | バックエンド責務  |

## 利用シーン

1. **ドキュメント生成**: バージョン番号、日付、著者情報の一括管理
2. **多言語対応**: フロントマターで言語を指定し、コンテンツを切り替え
3. **条件付きコンテンツ**: ターゲット環境(開発/本番)に応じた表示
4. **再利用可能なスニペット**: 頻出するコンテンツをマクロ化

## 未解決の課題

- **パフォーマンス**: 大量の変数展開・マクロ処理の最適化
- **エラーハンドリング**: 未定義変数、構文エラーの報告方法
- **ツールサポート**: エディタでのシンタックスハイライト、補完機能
- **キャッシング戦略**: テンプレート展開結果のキャッシュ方法
- **型システム**: 変数の型チェック(文字列、数値、配列など)