@markuplint/html-spec 4.16.1 → 4.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.ja.md +285 -0
- package/ARCHITECTURE.md +196 -0
- package/CHANGELOG.md +22 -2
- package/README.md +11 -259
- package/SKILL.md +358 -0
- package/docs/build-pipeline.ja.md +170 -0
- package/docs/build-pipeline.md +171 -0
- package/docs/element-spec-format.ja.md +952 -0
- package/docs/element-spec-format.md +521 -0
- package/docs/maintenance.ja.md +359 -0
- package/docs/maintenance.md +397 -0
- package/index.json +370 -42
- package/package.json +5 -5
|
@@ -0,0 +1,952 @@
|
|
|
1
|
+
# 要素仕様フォーマット
|
|
2
|
+
|
|
3
|
+
`@markuplint/html-spec` パッケージにおける要素仕様 JSON ファイルの包括的なリファレンスガイドです。各 `src/spec.*.json` ファイルは 1 つの HTML または SVG 要素の仕様を定義し、コンテンツモデル、属性、ARIA マッピングなどの情報を含みます。
|
|
4
|
+
|
|
5
|
+
## ファイル命名規則
|
|
6
|
+
|
|
7
|
+
### HTML 要素
|
|
8
|
+
|
|
9
|
+
ファイル名パターン: `src/spec.<tag>.json`
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
spec.div.json # <div> 要素
|
|
13
|
+
spec.table.json # <table> 要素
|
|
14
|
+
spec.input.json # <input> 要素
|
|
15
|
+
spec.a.json # <a> 要素
|
|
16
|
+
spec.p.json # <p> 要素
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
タグ名はそのままファイル名に使用されます。
|
|
20
|
+
|
|
21
|
+
### SVG 要素
|
|
22
|
+
|
|
23
|
+
ファイル名パターン: `src/spec.svg_<local>.json`
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
spec.svg_text.json # <svg:text> 要素
|
|
27
|
+
spec.svg_circle.json # <svg:circle> 要素
|
|
28
|
+
spec.svg_rect.json # <svg:rect> 要素
|
|
29
|
+
spec.svg_path.json # <svg:path> 要素
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
ファイル名のプレフィックス `svg_` から、要素名は `svg:<local>` として推論されます(例: `spec.svg_text.json` は `svg:text` に対応)。
|
|
33
|
+
|
|
34
|
+
### 共通定義ファイル
|
|
35
|
+
|
|
36
|
+
| ファイル | 内容 |
|
|
37
|
+
| ----------------------------- | -------------------------------------------------- |
|
|
38
|
+
| `spec-common.attributes.json` | グローバル属性カテゴリ定義(19 カテゴリ) |
|
|
39
|
+
| `spec-common.contents.json` | コンテンツモデルカテゴリマクロ(HTML 10 + SVG 19) |
|
|
40
|
+
|
|
41
|
+
## 要素仕様の構造
|
|
42
|
+
|
|
43
|
+
各仕様ファイルは JSON オブジェクトです。`strip-json-comments` によるコメント(`//` 形式)に対応しており、ファイル先頭に仕様の参照 URL を記載するのが慣例です。
|
|
44
|
+
|
|
45
|
+
トップレベルフィールドは以下の 4 つです。
|
|
46
|
+
|
|
47
|
+
| フィールド | 型 | 説明 |
|
|
48
|
+
| -------------- | -------- | ------------------------------------------ |
|
|
49
|
+
| `contentModel` | `object` | 許可されるコンテンツの定義 |
|
|
50
|
+
| `globalAttrs` | `object` | 使用するグローバル属性カテゴリのマッピング |
|
|
51
|
+
| `attributes` | `object` | 要素固有の属性定義 |
|
|
52
|
+
| `aria` | `object` | ARIA 統合仕様(暗黙ロール、許可ロール等) |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## `contentModel`
|
|
57
|
+
|
|
58
|
+
コンテンツモデルは要素が許可する子要素のパターンを定義します。
|
|
59
|
+
|
|
60
|
+
### `contents`
|
|
61
|
+
|
|
62
|
+
`contents` フィールドは許可されるコンテンツを記述します。取りうる値は以下の 3 種類です。
|
|
63
|
+
|
|
64
|
+
- **`false`** -- void 要素(子要素を持てない)。例: `<input>`, `<br>`, `<img>`
|
|
65
|
+
- **`true`** -- 任意のコンテンツを許可(主に廃止要素に使用)
|
|
66
|
+
- **配列** -- コンテンツモデルパターンの配列
|
|
67
|
+
|
|
68
|
+
```jsonc
|
|
69
|
+
// void 要素(子要素不可)
|
|
70
|
+
"contents": false
|
|
71
|
+
|
|
72
|
+
// 任意のコンテンツ許可
|
|
73
|
+
"contents": true
|
|
74
|
+
|
|
75
|
+
// パターン指定
|
|
76
|
+
"contents": [
|
|
77
|
+
{ "oneOrMore": ":model(phrasing)" }
|
|
78
|
+
]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### `conditional`
|
|
82
|
+
|
|
83
|
+
コンテキスト依存のコンテンツモデルオーバーライドの配列です。要素の親要素や祖先要素の構造に応じて、異なるコンテンツモデルを適用する場合に使用します。
|
|
84
|
+
|
|
85
|
+
各エントリは以下のフィールドを持ちます。
|
|
86
|
+
|
|
87
|
+
| フィールド | 型 | 説明 |
|
|
88
|
+
| ----------- | -------- | -------------------------------------------- |
|
|
89
|
+
| `condition` | `string` | CSS セレクタ形式の条件式 |
|
|
90
|
+
| `contents` | `array` | 条件に合致した場合のコンテンツモデルパターン |
|
|
91
|
+
|
|
92
|
+
```jsonc
|
|
93
|
+
"conditional": [
|
|
94
|
+
{
|
|
95
|
+
"condition": "dl > div",
|
|
96
|
+
"contents": [
|
|
97
|
+
{
|
|
98
|
+
"oneOrMore": [
|
|
99
|
+
{ "zeroOrMore": ":model(script-supporting)" },
|
|
100
|
+
{ "oneOrMore": "dt" },
|
|
101
|
+
{ "zeroOrMore": ":model(script-supporting)" },
|
|
102
|
+
{ "oneOrMore": "dd" },
|
|
103
|
+
{ "zeroOrMore": ":model(script-supporting)" }
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
]
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
上記の例では、`<div>` が `<dl>` の直接の子である場合、通常のフローコンテンツではなく `<dt>` と `<dd>` のペアを要求します。
|
|
112
|
+
|
|
113
|
+
### 他パッケージとの関連
|
|
114
|
+
|
|
115
|
+
ここで定義するコンテンツモデルは、複数のパッケージにまたがるエコシステムの一部です。
|
|
116
|
+
|
|
117
|
+
- **スキーマ検証** -- `@markuplint/ml-spec` の `content-models.schema.json` がコンテンツモデルパターン(`require`、`optional`、`oneOrMore`、`zeroOrMore`、`choice`、`transparent`)の有効な構造を定義しています。テスト時にソース JSON ファイルがこのスキーマに対して検証されます。
|
|
118
|
+
- **TypeScript 型** -- `@markuplint/ml-spec` がスキーマから `ContentModel`、`PermittedContentPattern`、`Category` 等の型を自動生成し(`types/permitted-structures.ts`)、コードベース全体で型安全なアクセスを提供します。
|
|
119
|
+
- **ランタイムアルゴリズム** -- `@markuplint/ml-spec` の `getContentModel()` が条件付きコンテンツモデルを実行時に評価し、`contentModelCategoryToTagNames()` がカテゴリ名(例: `#flow`)を本パッケージの `spec-common.contents.json` の `def["#contentModels"]` を用いて具体的な要素リストに解決します。
|
|
120
|
+
- **リントルール** -- `@markuplint/rules` の `permitted-contents` ルールが子要素をコンテンツモデルパターンに対して検証し、`no-empty-palpable-content` ルールが `#palpable` カテゴリデータを使用して空のパルパブル要素を検出します。
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## コンテンツモデルパターン
|
|
125
|
+
|
|
126
|
+
コンテンツモデルの `contents` 配列内で使用可能なパターンタイプの一覧です。
|
|
127
|
+
|
|
128
|
+
### 量指定パターン
|
|
129
|
+
|
|
130
|
+
| パターン | 説明 |
|
|
131
|
+
| -------------------------------- | ------------------------------- |
|
|
132
|
+
| `{ "require": "<selector>" }` | 必須要素(ちょうど 1 つ) |
|
|
133
|
+
| `{ "optional": "<selector>" }` | オプション要素(0 または 1 つ) |
|
|
134
|
+
| `{ "oneOrMore": "<selector>" }` | 1 つ以上 |
|
|
135
|
+
| `{ "zeroOrMore": "<selector>" }` | 0 個以上 |
|
|
136
|
+
|
|
137
|
+
`oneOrMore` と `zeroOrMore` は、文字列(単一セレクタ)またはパターン配列(シーケンス)を値として受け取ります。
|
|
138
|
+
|
|
139
|
+
```jsonc
|
|
140
|
+
// 単一セレクタ
|
|
141
|
+
{ "oneOrMore": "li" }
|
|
142
|
+
|
|
143
|
+
// シーケンス(順序付き複数パターン)
|
|
144
|
+
{
|
|
145
|
+
"oneOrMore": [
|
|
146
|
+
{ "oneOrMore": "dt" },
|
|
147
|
+
{ "oneOrMore": "dd" }
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 構造パターン
|
|
153
|
+
|
|
154
|
+
| パターン | 説明 |
|
|
155
|
+
| --------------------------------- | -------------------------------------------------- |
|
|
156
|
+
| `{ "choice": [...] }` | 選択肢の中から 1 つを許可 |
|
|
157
|
+
| `{ "interleave": [...] }` | インターリーブ(任意の順序で混在可能) |
|
|
158
|
+
| `{ "transparent": "<selector>" }` | 透過コンテンツモデル(親のコンテンツモデルを継承) |
|
|
159
|
+
|
|
160
|
+
`transparent` は、要素自体がコンテンツモデルを定義せず、親要素のコンテンツモデルを「透過的に」引き継ぐことを示します。値にはセレクタが指定され、透過コンテンツから除外される要素を記述します。
|
|
161
|
+
|
|
162
|
+
```jsonc
|
|
163
|
+
// <a> 要素の透過コンテンツモデル
|
|
164
|
+
// インタラクティブコンテンツと <a> 自身、tabindex 付き要素を除外
|
|
165
|
+
{
|
|
166
|
+
"transparent": ":not(:model(interactive), a, [tabindex], :has(:model(interactive), a, [tabindex]))",
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### セレクタの種類
|
|
171
|
+
|
|
172
|
+
コンテンツモデルパターンのセレクタとして使用可能な形式です。
|
|
173
|
+
|
|
174
|
+
| セレクタ形式 | 説明 | 例 |
|
|
175
|
+
| -------------- | ----------------------------------- | -------------------------------------- |
|
|
176
|
+
| タグ名 | HTML 要素名 | `"dt"`, `"dd"`, `"li"`, `"option"` |
|
|
177
|
+
| カテゴリ参照 | `:model()` 擬似クラスによるカテゴリ | `":model(flow)"`, `":model(phrasing)"` |
|
|
178
|
+
| 否定セレクタ | `:not()` との組み合わせ | `":not(:model(interactive), a)"` |
|
|
179
|
+
| テキストノード | テキストコンテンツ | `"#text"` |
|
|
180
|
+
| カスタム要素 | カスタム要素のワイルドカード | `"#custom"` |
|
|
181
|
+
| SVG 名前空間 | パイプ記法による名前空間指定 | `"svg\|a"`, `"svg\|circle"` |
|
|
182
|
+
| 属性セレクタ | 属性条件付き要素 | `"a[href]"`, `"link[itemprop]"` |
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## `globalAttrs`
|
|
187
|
+
|
|
188
|
+
グローバル属性カテゴリ名から、そのカテゴリの属性をどのようにインクルードするかを定義するマッピングオブジェクトです。
|
|
189
|
+
|
|
190
|
+
### インクルードルール
|
|
191
|
+
|
|
192
|
+
| 値 | 説明 |
|
|
193
|
+
| ---------- | ---------------------------------- |
|
|
194
|
+
| `true` | カテゴリの全属性を含む |
|
|
195
|
+
| `false` | カテゴリを除外する |
|
|
196
|
+
| `string[]` | カテゴリから指定した属性のみを含む |
|
|
197
|
+
|
|
198
|
+
```jsonc
|
|
199
|
+
"globalAttrs": {
|
|
200
|
+
// 全属性を含む
|
|
201
|
+
"#HTMLGlobalAttrs": true,
|
|
202
|
+
"#GlobalEventAttrs": true,
|
|
203
|
+
"#ARIAAttrs": true,
|
|
204
|
+
|
|
205
|
+
// カテゴリから特定の属性のみ選択
|
|
206
|
+
"#HTMLLinkAndFetchingAttrs": ["href", "target", "download", "ping", "rel", "hreflang", "type", "referrerpolicy"],
|
|
207
|
+
|
|
208
|
+
// SVG 要素でのプレゼンテーション属性の選択的インクルード
|
|
209
|
+
"#SVGPresentationAttrs": ["fill", "stroke", "opacity", "transform"]
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### 利用可能なグローバル属性カテゴリ(19 カテゴリ)
|
|
214
|
+
|
|
215
|
+
#### HTML カテゴリ
|
|
216
|
+
|
|
217
|
+
| カテゴリ | 説明 |
|
|
218
|
+
| ---------------------------------- | --------------------------------------------------------------------------------------------- |
|
|
219
|
+
| `#HTMLGlobalAttrs` | 標準 HTML グローバル属性(`accesskey`, `class`, `id`, `dir`, `lang`, `style`, `tabindex` 等) |
|
|
220
|
+
| `#GlobalEventAttrs` | イベントハンドラ属性(`onclick`, `onload`, `onchange`, `oninput` 等) |
|
|
221
|
+
| `#ARIAAttrs` | ARIA 属性(`aria-*`, `role`) |
|
|
222
|
+
| `#HTMLLinkAndFetchingAttrs` | リンク/フェッチ関連属性(`href`, `target`, `download`, `rel`, `referrerpolicy` 等) |
|
|
223
|
+
| `#HTMLEmbededAndMediaContentAttrs` | 埋め込みコンテンツ属性(`src`, `height`, `width`, `alt` 等) |
|
|
224
|
+
| `#HTMLFormControlElementAttrs` | フォームコントロール属性(`autocomplete`, `disabled`, `name`, `form`, `required` 等) |
|
|
225
|
+
| `#HTMLTableCellElementAttrs` | テーブルセル属性(`colspan`, `rowspan`, `headers` 等) |
|
|
226
|
+
|
|
227
|
+
#### SVG カテゴリ
|
|
228
|
+
|
|
229
|
+
| カテゴリ | 説明 |
|
|
230
|
+
| ----------------------------------- | ------------------------------------------------------------------------- |
|
|
231
|
+
| `#SVGAnimationAdditionAttrs` | SVG アニメーション加算属性 |
|
|
232
|
+
| `#SVGAnimationAttributeTargetAttrs` | SVG アニメーション属性ターゲット |
|
|
233
|
+
| `#SVGAnimationEventAttrs` | SVG アニメーションイベント属性 |
|
|
234
|
+
| `#SVGAnimationTargetElementAttrs` | SVG アニメーションターゲット要素 |
|
|
235
|
+
| `#SVGAnimationTimingAttrs` | SVG アニメーションタイミング属性 |
|
|
236
|
+
| `#SVGAnimationValueAttrs` | SVG アニメーション値属性 |
|
|
237
|
+
| `#SVGConditionalProcessingAttrs` | SVG 条件付き処理属性(`requiredExtensions`, `systemLanguage`) |
|
|
238
|
+
| `#SVGCoreAttrs` | SVG コア属性(`id`, `tabindex`, `lang`, `class`, `style` 等) |
|
|
239
|
+
| `#SVGFilterPrimitiveAttrs` | SVG フィルタプリミティブ属性 |
|
|
240
|
+
| `#SVGPresentationAttrs` | SVG プレゼンテーション属性(`fill`, `stroke`, `opacity`, `transform` 等) |
|
|
241
|
+
| `#SVGTransferFunctionAttrs` | SVG 転送関数属性 |
|
|
242
|
+
| `#XLinkAttrs` | XLink 属性(非推奨) |
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## `attributes`
|
|
247
|
+
|
|
248
|
+
要素固有の属性定義です。属性名をキーとし、属性定義オブジェクトを値とするマッピングです。
|
|
249
|
+
|
|
250
|
+
### 属性定義フィールド
|
|
251
|
+
|
|
252
|
+
| フィールド | 型 | 説明 |
|
|
253
|
+
| -------------- | -------------------- | -------------------------------------- |
|
|
254
|
+
| `type` | 後述 | 属性値の型制約 |
|
|
255
|
+
| `condition` | `string \| string[]` | 属性が有効となる条件(CSS セレクタ) |
|
|
256
|
+
| `required` | `boolean` | 必須属性かどうか |
|
|
257
|
+
| `defaultValue` | `string` | デフォルト値 |
|
|
258
|
+
| `description` | `string` | 属性の説明 |
|
|
259
|
+
| `experimental` | `boolean` | 実験的な属性(後述) |
|
|
260
|
+
| `obsolete` | `boolean` | 廃止された属性(後述) |
|
|
261
|
+
| `deprecated` | `boolean` | 非推奨の属性(後述) |
|
|
262
|
+
| `nonStandard` | `boolean` | 非標準の属性(後述) |
|
|
263
|
+
| `animatable` | `boolean` | アニメーション可能か(SVG 属性で使用) |
|
|
264
|
+
|
|
265
|
+
### ステータスフラグ
|
|
266
|
+
|
|
267
|
+
属性の標準化状態を示す真偽値フラグ:
|
|
268
|
+
|
|
269
|
+
| フラグ | 意味 |
|
|
270
|
+
| -------------- | ---------------------------------------------------------------------------------------------------- |
|
|
271
|
+
| `experimental` | まだ安定していない新興の仕様の一部。ブラウザのサポートが部分的またはプレフィックス付きの場合がある。 |
|
|
272
|
+
| `deprecated` | 仕様で公式に非推奨とされている。ブラウザでは認識されるが、新しいコードでは使用すべきでない。 |
|
|
273
|
+
| `obsolete` | 仕様から完全に削除された。モダンブラウザでは認識されない可能性がある。 |
|
|
274
|
+
| `nonStandard` | W3C や WHATWG の仕様に含まれない。ベンダー固有またはプロプライエタリ。 |
|
|
275
|
+
|
|
276
|
+
**`deprecated` と `obsolete` の違い:** `deprecated` は仕様が属性を定義しつつも使用を
|
|
277
|
+
非推奨としている状態(例: `<table border>`)。`obsolete` は仕様から完全に削除された状態
|
|
278
|
+
(例: 完全に廃止された要素のレガシーなプレゼンテーション属性)。実際の動作として、
|
|
279
|
+
`deprecated` な属性は通常ブラウザで動作するが、`obsolete` な属性は動作しない場合がある。
|
|
280
|
+
|
|
281
|
+
**フラグの優先順位(仕様ファイル > MDN):** 手動仕様ファイル(`src/spec.*.json`)で
|
|
282
|
+
フラグを設定した場合、MDN スクレイピングの値よりも優先される。これにより、MDN データが
|
|
283
|
+
不正確または仕様に追いついていない場合を修正できる。MDN のフラグは、手動仕様に属性定義が
|
|
284
|
+
ない場合、または該当フラグが設定されていない場合にのみ使用される。
|
|
285
|
+
|
|
286
|
+
**フラグを手動設定する場面:**
|
|
287
|
+
|
|
288
|
+
- MDN が `experimental` としているが仕様が安定した場合 -- 仕様ファイルで
|
|
289
|
+
`"experimental": false` を設定(または省略)してオーバーライド
|
|
290
|
+
- 仕様で非推奨だが MDN が未更新の場合 -- 仕様ファイルで `"deprecated": true` を設定
|
|
291
|
+
- ベンダー固有の属性をマークする場合 -- `"nonStandard": true` を設定
|
|
292
|
+
|
|
293
|
+
### 属性値の型 (`type`)
|
|
294
|
+
|
|
295
|
+
属性の値の型は複数の形式で指定できます。
|
|
296
|
+
|
|
297
|
+
#### 単純文字列型
|
|
298
|
+
|
|
299
|
+
よく使用される型名を文字列で指定します。
|
|
300
|
+
|
|
301
|
+
| 型名 | 説明 |
|
|
302
|
+
| ------------ | ------------ |
|
|
303
|
+
| `"String"` | 任意の文字列 |
|
|
304
|
+
| `"URL"` | URL |
|
|
305
|
+
| `"Boolean"` | 真偽値属性 |
|
|
306
|
+
| `"DOMID"` | DOM ID 参照 |
|
|
307
|
+
| `"Any"` | 任意の値 |
|
|
308
|
+
| `"DateTime"` | 日時文字列 |
|
|
309
|
+
| `"Number"` | 数値 |
|
|
310
|
+
|
|
311
|
+
```jsonc
|
|
312
|
+
"alt": {
|
|
313
|
+
"type": "Any",
|
|
314
|
+
"condition": "[type='image' i]"
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
#### 列挙型オブジェクト
|
|
319
|
+
|
|
320
|
+
有効な値の列挙を定義します。
|
|
321
|
+
|
|
322
|
+
| フィールド | 型 | 説明 |
|
|
323
|
+
| ---------------------------- | ---------- | ------------------------------------ |
|
|
324
|
+
| `enum` | `string[]` | 有効な値のリスト |
|
|
325
|
+
| `invalidValueDefault` | `string` | 無効な値が指定された場合のデフォルト |
|
|
326
|
+
| `missingValueDefault` | `string` | 属性が省略された場合のデフォルト |
|
|
327
|
+
| `disallowToSurroundBySpaces` | `boolean` | 値の前後の空白を許可しない |
|
|
328
|
+
| `sameStates` | `object` | 同じ状態を表す別名のマッピング |
|
|
329
|
+
|
|
330
|
+
```jsonc
|
|
331
|
+
"lengthAdjust": {
|
|
332
|
+
"type": {
|
|
333
|
+
"enum": ["spacing", "spacingAndGlyphs"],
|
|
334
|
+
"disallowToSurroundBySpaces": false
|
|
335
|
+
},
|
|
336
|
+
"defaultValue": "spacing",
|
|
337
|
+
"animatable": true
|
|
338
|
+
}
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
#### トークンリスト型
|
|
342
|
+
|
|
343
|
+
スペースまたはカンマ区切りのトークンリストを定義します。
|
|
344
|
+
|
|
345
|
+
| フィールド | 型 | 説明 |
|
|
346
|
+
| ----------------- | -------------------- | ----------------------------- |
|
|
347
|
+
| `token` | `string` | トークンの型名 |
|
|
348
|
+
| `separator` | `"space" \| "comma"` | 区切り文字 |
|
|
349
|
+
| `unique` | `boolean` | 重複を許可しない |
|
|
350
|
+
| `caseInsensitive` | `boolean` | 大文字小文字を区別しない |
|
|
351
|
+
| `ordered` | `boolean` | 順序が重要 |
|
|
352
|
+
| `number` | `string` | 個数制約(`"zeroOrMore"` 等) |
|
|
353
|
+
|
|
354
|
+
```jsonc
|
|
355
|
+
"accept": {
|
|
356
|
+
"type": {
|
|
357
|
+
"token": "Accept",
|
|
358
|
+
"caseInsensitive": true,
|
|
359
|
+
"unique": true,
|
|
360
|
+
"separator": "comma"
|
|
361
|
+
},
|
|
362
|
+
"condition": "[type='file' i]"
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
#### 数値制約型
|
|
367
|
+
|
|
368
|
+
数値範囲の制約を定義します。
|
|
369
|
+
|
|
370
|
+
```jsonc
|
|
371
|
+
"type": {
|
|
372
|
+
"type": "integer",
|
|
373
|
+
"gt": 0
|
|
374
|
+
}
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
#### 型の配列
|
|
378
|
+
|
|
379
|
+
複数の有効な型がある場合、配列で指定します。
|
|
380
|
+
|
|
381
|
+
```jsonc
|
|
382
|
+
"max": {
|
|
383
|
+
"type": ["DateTime", "Number"],
|
|
384
|
+
"condition": ["[type='date' i]", "[type='number' i]", "[type='range' i]"]
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
#### CSS/SVG 型
|
|
389
|
+
|
|
390
|
+
SVG 属性で使用される CSS やSVG 固有の型を山括弧記法で指定します。
|
|
391
|
+
|
|
392
|
+
```jsonc
|
|
393
|
+
"x": {
|
|
394
|
+
"type": "<text-coordinate>",
|
|
395
|
+
"defaultValue": "0",
|
|
396
|
+
"animatable": true
|
|
397
|
+
},
|
|
398
|
+
"textLength": {
|
|
399
|
+
"type": ["<svg-length>", "<percentage>"],
|
|
400
|
+
"animatable": true
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### 条件付き属性 (`condition`)
|
|
405
|
+
|
|
406
|
+
`condition` フィールドは、属性が有効となる条件を CSS セレクタ形式で指定します。文字列(単一条件)または文字列の配列(OR 条件)を受け取ります。
|
|
407
|
+
|
|
408
|
+
```jsonc
|
|
409
|
+
// 単一条件: type="file" の場合のみ有効
|
|
410
|
+
"accept": {
|
|
411
|
+
"condition": "[type='file' i]"
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// 複数条件(OR): いずれかの type の場合に有効
|
|
415
|
+
"checked": {
|
|
416
|
+
"type": "Boolean",
|
|
417
|
+
"condition": ["[type='checkbox' i]", "[type='radio' i]"]
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
---
|
|
422
|
+
|
|
423
|
+
## `aria`
|
|
424
|
+
|
|
425
|
+
ARIA(Accessible Rich Internet Applications)統合仕様を定義します。
|
|
426
|
+
|
|
427
|
+
### 基本フィールド
|
|
428
|
+
|
|
429
|
+
| フィールド | 型 | 説明 |
|
|
430
|
+
| ------------------ | ----------------- | ---------------------------------------------- |
|
|
431
|
+
| `implicitRole` | `string \| false` | 暗黙の ARIA ロール。`false` はロールなし |
|
|
432
|
+
| `permittedRoles` | 後述 | 許可される明示的ロール |
|
|
433
|
+
| `namingProhibited` | `boolean` | アクセシブル名が禁止されている場合 `true` |
|
|
434
|
+
| `properties` | `object` | ARIA プロパティの制約 |
|
|
435
|
+
| `conditions` | `object` | CSS セレクタによる条件付き ARIA オーバーライド |
|
|
436
|
+
|
|
437
|
+
### `permittedRoles` の形式
|
|
438
|
+
|
|
439
|
+
| 値 | 説明 |
|
|
440
|
+
| ---------- | ------------------------------------- |
|
|
441
|
+
| `true` | 任意のロールを許可 |
|
|
442
|
+
| `false` | 明示的ロールの指定不可 |
|
|
443
|
+
| `string[]` | 指定されたロールのみ許可 |
|
|
444
|
+
| `object` | AAM(Accessibility API Mappings)参照 |
|
|
445
|
+
|
|
446
|
+
```jsonc
|
|
447
|
+
// 任意のロールを許可
|
|
448
|
+
"permittedRoles": true
|
|
449
|
+
|
|
450
|
+
// 特定のロールのみ許可
|
|
451
|
+
"permittedRoles": ["button", "checkbox", "menuitem", "tab"]
|
|
452
|
+
|
|
453
|
+
// AAM 参照(SVG 要素で使用)
|
|
454
|
+
"permittedRoles": {
|
|
455
|
+
"core-aam": true,
|
|
456
|
+
"graphics-aam": true
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### `conditions`
|
|
461
|
+
|
|
462
|
+
CSS セレクタをキーとし、そのセレクタに合致する場合の ARIA オーバーライドを値とするオブジェクトです。
|
|
463
|
+
|
|
464
|
+
```jsonc
|
|
465
|
+
"aria": {
|
|
466
|
+
"implicitRole": "link",
|
|
467
|
+
"permittedRoles": ["button", "checkbox", "menuitem"],
|
|
468
|
+
"conditions": {
|
|
469
|
+
// href 属性がない場合のオーバーライド
|
|
470
|
+
":not([href])": {
|
|
471
|
+
"implicitRole": "generic",
|
|
472
|
+
"permittedRoles": true,
|
|
473
|
+
"namingProhibited": true
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### `properties`
|
|
480
|
+
|
|
481
|
+
ARIA プロパティの使用制約を定義します。
|
|
482
|
+
|
|
483
|
+
```jsonc
|
|
484
|
+
"properties": {
|
|
485
|
+
"global": true,
|
|
486
|
+
"role": true,
|
|
487
|
+
"without": [
|
|
488
|
+
{
|
|
489
|
+
"type": "not-recommended",
|
|
490
|
+
"name": "aria-disabled",
|
|
491
|
+
"value": "true",
|
|
492
|
+
"alt": {
|
|
493
|
+
"method": "remove-attr",
|
|
494
|
+
"target": "href"
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
]
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
`without` 配列の各エントリは、推奨されない、または禁止された ARIA プロパティの使用を定義し、代替手段を `alt` で提示します。
|
|
502
|
+
|
|
503
|
+
### バージョン固有オーバーライド
|
|
504
|
+
|
|
505
|
+
ARIA 仕様のバージョンごとに異なるマッピングを定義できます。キーには ARIA バージョン番号(`"1.1"`, `"1.2"` 等)を使用します。
|
|
506
|
+
|
|
507
|
+
```jsonc
|
|
508
|
+
"aria": {
|
|
509
|
+
"implicitRole": "paragraph",
|
|
510
|
+
"permittedRoles": true,
|
|
511
|
+
"namingProhibited": true,
|
|
512
|
+
// ARIA 1.1 ではロールが定義されていない
|
|
513
|
+
"1.1": {
|
|
514
|
+
"implicitRole": false
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
---
|
|
520
|
+
|
|
521
|
+
## コンテンツモデルカテゴリ
|
|
522
|
+
|
|
523
|
+
`spec-common.contents.json` に定義されるカテゴリマクロです。コンテンツモデルパターンのセレクタで `:model(<category>)` の形式で参照されます。
|
|
524
|
+
|
|
525
|
+
### HTML カテゴリ(10)
|
|
526
|
+
|
|
527
|
+
| カテゴリ | 説明 | 代表的な要素 |
|
|
528
|
+
| -------------------- | ---------------------------------------- | ------------------------------------------------------------- |
|
|
529
|
+
| `#metadata` | ドキュメントメタデータ要素 | `base`, `link`, `meta`, `script`, `style`, `title` |
|
|
530
|
+
| `#flow` | 本文レベルの大半の要素 | `div`, `p`, `table`, `form`, `a`, `span` 等 |
|
|
531
|
+
| `#sectioning` | セクショニング要素 | `article`, `aside`, `nav`, `section` |
|
|
532
|
+
| `#heading` | 見出し要素 | `h1`-`h6`, `hgroup` |
|
|
533
|
+
| `#phrasing` | フレージング(インラインレベル)要素 | `a`, `em`, `strong`, `span`, `img`, `input` 等 |
|
|
534
|
+
| `#embedded` | 埋め込みコンテンツ | `audio`, `canvas`, `iframe`, `img`, `video`, `svg\|svg` |
|
|
535
|
+
| `#interactive` | インタラクティブコンテンツ | `a[href]`, `button`, `details`, `input`, `select`, `textarea` |
|
|
536
|
+
| `#palpable` | 実質的なコンテンツをレンダリングする要素 | `a`, `div`, `p`, `img`, `table` 等 |
|
|
537
|
+
| `#script-supporting` | スクリプトサポート要素 | `script`, `template` |
|
|
538
|
+
|
|
539
|
+
### SVG カテゴリ(19)
|
|
540
|
+
|
|
541
|
+
| カテゴリ | 説明 | 代表的な要素 |
|
|
542
|
+
| -------------------------- | ------------------------ | -------------------------------------------------------------- |
|
|
543
|
+
| `#SVGAnimation` | アニメーション要素 | `svg\|animate`, `svg\|animateMotion`, `svg\|set` |
|
|
544
|
+
| `#SVGBasicShapes` | 基本図形要素 | `svg\|circle`, `svg\|rect`, `svg\|line`, `svg\|polygon` |
|
|
545
|
+
| `#SVGContainer` | コンテナ要素 | `svg\|a`, `svg\|defs`, `svg\|g`, `svg\|svg`, `svg\|symbol` |
|
|
546
|
+
| `#SVGDescriptive` | 記述要素 | `svg\|desc`, `svg\|metadata`, `svg\|title` |
|
|
547
|
+
| `#SVGFilterPrimitive` | フィルタプリミティブ要素 | `svg\|feBlend`, `svg\|feGaussianBlur`, `svg\|feImage` |
|
|
548
|
+
| `#SVGFont` | フォント要素 | `svg\|font`, `svg\|font-face`, `svg\|glyph` |
|
|
549
|
+
| `#SVGGradient` | グラデーション要素 | `svg\|linearGradient`, `svg\|radialGradient`, `svg\|stop` |
|
|
550
|
+
| `#SVGGraphics` | グラフィック要素 | `svg\|circle`, `svg\|image`, `svg\|path`, `svg\|text` |
|
|
551
|
+
| `#SVGGraphicsReferencing` | グラフィック参照要素 | `svg\|use` |
|
|
552
|
+
| `#SVGLightSource` | 光源要素 | `svg\|feDistantLight`, `svg\|fePointLight`, `svg\|feSpotLight` |
|
|
553
|
+
| `#SVGNeverRendered` | 非レンダリング要素 | `svg\|clipPath`, `svg\|defs`, `svg\|mask`, `svg\|symbol` |
|
|
554
|
+
| `#SVGPaintServer` | ペイントサーバ要素 | `svg\|linearGradient`, `svg\|pattern`, `svg\|radialGradient` |
|
|
555
|
+
| `#SVGRenderable` | レンダリング可能要素 | `svg\|a`, `svg\|g`, `svg\|svg`, `svg\|text`, `svg\|use` |
|
|
556
|
+
| `#SVGShape` | シェイプ要素 | `svg\|circle`, `svg\|path`, `svg\|rect`, `svg\|line` |
|
|
557
|
+
| `#SVGStructural` | 構造要素 | `svg\|defs`, `svg\|g`, `svg\|svg`, `svg\|symbol`, `svg\|use` |
|
|
558
|
+
| `#SVGStructurallyExternal` | 外部構造要素 | (現在空) |
|
|
559
|
+
| `#SVGTextContent` | テキストコンテンツ要素 | `svg\|text`, `svg\|textPath`, `svg\|tspan` |
|
|
560
|
+
| `#SVGTextContentChild` | テキストコンテンツ子要素 | `svg\|textPath`, `svg\|tref`, `svg\|tspan` |
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
## 共通定義ファイル
|
|
565
|
+
|
|
566
|
+
### `spec-common.attributes.json`
|
|
567
|
+
|
|
568
|
+
19 個のグローバル属性カテゴリの定義ファイルです。各カテゴリはキーに `#` プレフィックス付きの名前を持ち、値は属性名から属性定義へのマッピングです。
|
|
569
|
+
|
|
570
|
+
```jsonc
|
|
571
|
+
{
|
|
572
|
+
"#HTMLGlobalAttrs": {
|
|
573
|
+
"accesskey": {
|
|
574
|
+
"type": {
|
|
575
|
+
"token": "OneCodePointChar",
|
|
576
|
+
"ordered": true,
|
|
577
|
+
"unique": true,
|
|
578
|
+
"number": "zeroOrMore",
|
|
579
|
+
"separator": "space",
|
|
580
|
+
},
|
|
581
|
+
},
|
|
582
|
+
"autocapitalize": {
|
|
583
|
+
"type": {
|
|
584
|
+
"enum": ["off", "on", "none", "sentences", "words", "characters"],
|
|
585
|
+
"invalidValueDefault": "sentences",
|
|
586
|
+
"missingValueDefault": "default",
|
|
587
|
+
},
|
|
588
|
+
},
|
|
589
|
+
"autofocus": {
|
|
590
|
+
"type": "Boolean",
|
|
591
|
+
},
|
|
592
|
+
// ... 他の属性
|
|
593
|
+
},
|
|
594
|
+
"#GlobalEventAttrs": {
|
|
595
|
+
/* ... */
|
|
596
|
+
},
|
|
597
|
+
"#ARIAAttrs": {
|
|
598
|
+
/* ... */
|
|
599
|
+
},
|
|
600
|
+
// ... 他のカテゴリ
|
|
601
|
+
}
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
要素仕様の `globalAttrs` フィールドでカテゴリ名を参照し、`true`(全属性)、`false`(除外)、または文字列配列(選択的インクルード)で使用方法を指定します。
|
|
605
|
+
|
|
606
|
+
### `spec-common.contents.json`
|
|
607
|
+
|
|
608
|
+
コンテンツモデルカテゴリマクロの定義ファイルです。`models` キーの下にカテゴリ名と所属要素の配列が定義されます。
|
|
609
|
+
|
|
610
|
+
```jsonc
|
|
611
|
+
{
|
|
612
|
+
"models": {
|
|
613
|
+
"#metadata": ["base", "link", "meta", "noscript", "script", "style", "template", "title"],
|
|
614
|
+
"#flow": ["a", "abbr", "address", "article", "aside", /* ... */ "#custom", "#text"],
|
|
615
|
+
"#sectioning": ["article", "aside", "nav", "section"],
|
|
616
|
+
"#SVGAnimation": ["svg|animate", "svg|animateMotion", "svg|set" /* ... */],
|
|
617
|
+
"#SVGBasicShapes": ["svg|circle", "svg|ellipse", "svg|line", "svg|polygon", "svg|polyline", "svg|rect"],
|
|
618
|
+
// ... 他のカテゴリ
|
|
619
|
+
},
|
|
620
|
+
}
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
## 例
|
|
626
|
+
|
|
627
|
+
### 最小限の要素(`<p>`)
|
|
628
|
+
|
|
629
|
+
```jsonc
|
|
630
|
+
// https://html.spec.whatwg.org/multipage/grouping-content.html#the-p-element
|
|
631
|
+
{
|
|
632
|
+
"contentModel": {
|
|
633
|
+
"contents": [
|
|
634
|
+
{
|
|
635
|
+
"oneOrMore": ":model(phrasing)",
|
|
636
|
+
},
|
|
637
|
+
],
|
|
638
|
+
},
|
|
639
|
+
"globalAttrs": {
|
|
640
|
+
"#HTMLGlobalAttrs": true,
|
|
641
|
+
"#GlobalEventAttrs": true,
|
|
642
|
+
"#ARIAAttrs": true,
|
|
643
|
+
},
|
|
644
|
+
"attributes": {},
|
|
645
|
+
"aria": {
|
|
646
|
+
"implicitRole": "paragraph",
|
|
647
|
+
"permittedRoles": true,
|
|
648
|
+
"namingProhibited": true,
|
|
649
|
+
"1.1": {
|
|
650
|
+
"implicitRole": false,
|
|
651
|
+
},
|
|
652
|
+
},
|
|
653
|
+
}
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
`<p>` 要素はフレージングコンテンツを 1 つ以上含むことができます。標準の HTML グローバル属性、イベント属性、ARIA 属性を持ち、要素固有の属性はありません。暗黙のロールは `paragraph` ですが、ARIA 1.1 ではロールが定義されていません。
|
|
657
|
+
|
|
658
|
+
### 複雑な要素(`<a>`)
|
|
659
|
+
|
|
660
|
+
```jsonc
|
|
661
|
+
// https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element
|
|
662
|
+
{
|
|
663
|
+
"contentModel": {
|
|
664
|
+
"contents": [
|
|
665
|
+
{
|
|
666
|
+
"transparent": ":not(:model(interactive), a, [tabindex], :has(:model(interactive), a, [tabindex]))",
|
|
667
|
+
},
|
|
668
|
+
],
|
|
669
|
+
},
|
|
670
|
+
"globalAttrs": {
|
|
671
|
+
"#HTMLGlobalAttrs": true,
|
|
672
|
+
"#GlobalEventAttrs": true,
|
|
673
|
+
"#ARIAAttrs": true,
|
|
674
|
+
"#HTMLLinkAndFetchingAttrs": ["href", "target", "download", "ping", "rel", "hreflang", "type", "referrerpolicy"],
|
|
675
|
+
},
|
|
676
|
+
"attributes": {},
|
|
677
|
+
"aria": {
|
|
678
|
+
"implicitRole": "link",
|
|
679
|
+
"permittedRoles": [
|
|
680
|
+
"button",
|
|
681
|
+
"checkbox",
|
|
682
|
+
"menuitem",
|
|
683
|
+
"menuitemcheckbox",
|
|
684
|
+
"menuitemradio",
|
|
685
|
+
"option",
|
|
686
|
+
"radio",
|
|
687
|
+
"switch",
|
|
688
|
+
"tab",
|
|
689
|
+
"treeitem",
|
|
690
|
+
],
|
|
691
|
+
"properties": {
|
|
692
|
+
"global": true,
|
|
693
|
+
"role": true,
|
|
694
|
+
"without": [
|
|
695
|
+
{
|
|
696
|
+
"type": "not-recommended",
|
|
697
|
+
"name": "aria-disabled",
|
|
698
|
+
"value": "true",
|
|
699
|
+
"alt": {
|
|
700
|
+
"method": "remove-attr",
|
|
701
|
+
"target": "href",
|
|
702
|
+
},
|
|
703
|
+
},
|
|
704
|
+
],
|
|
705
|
+
},
|
|
706
|
+
"conditions": {
|
|
707
|
+
":not([href])": {
|
|
708
|
+
"implicitRole": "generic",
|
|
709
|
+
"permittedRoles": true,
|
|
710
|
+
"namingProhibited": true,
|
|
711
|
+
},
|
|
712
|
+
},
|
|
713
|
+
"1.1": {
|
|
714
|
+
"conditions": {
|
|
715
|
+
":not([href])": {
|
|
716
|
+
"implicitRole": false,
|
|
717
|
+
},
|
|
718
|
+
},
|
|
719
|
+
},
|
|
720
|
+
},
|
|
721
|
+
}
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
`<a>` 要素は透過コンテンツモデルを持ち、インタラクティブコンテンツと `<a>` 自身を除いた親のコンテンツモデルを継承します。`#HTMLLinkAndFetchingAttrs` カテゴリから選択的に属性をインクルードしています。`href` 属性の有無で暗黙ロールが変化する条件付き ARIA 定義があります。
|
|
725
|
+
|
|
726
|
+
### 条件付きコンテンツモデル(`<div>`)
|
|
727
|
+
|
|
728
|
+
```jsonc
|
|
729
|
+
// https://html.spec.whatwg.org/multipage/grouping-content.html#the-div-element
|
|
730
|
+
{
|
|
731
|
+
"contentModel": {
|
|
732
|
+
"contents": [
|
|
733
|
+
{
|
|
734
|
+
"oneOrMore": ":model(flow)",
|
|
735
|
+
},
|
|
736
|
+
],
|
|
737
|
+
"conditional": [
|
|
738
|
+
{
|
|
739
|
+
"condition": "dl > div",
|
|
740
|
+
"contents": [
|
|
741
|
+
{
|
|
742
|
+
"oneOrMore": [
|
|
743
|
+
{ "zeroOrMore": ":model(script-supporting)" },
|
|
744
|
+
{ "oneOrMore": "dt" },
|
|
745
|
+
{ "zeroOrMore": ":model(script-supporting)" },
|
|
746
|
+
{ "oneOrMore": "dd" },
|
|
747
|
+
{ "zeroOrMore": ":model(script-supporting)" },
|
|
748
|
+
],
|
|
749
|
+
},
|
|
750
|
+
],
|
|
751
|
+
},
|
|
752
|
+
],
|
|
753
|
+
},
|
|
754
|
+
"globalAttrs": {
|
|
755
|
+
"#HTMLGlobalAttrs": true,
|
|
756
|
+
"#GlobalEventAttrs": true,
|
|
757
|
+
"#ARIAAttrs": true,
|
|
758
|
+
},
|
|
759
|
+
"attributes": {},
|
|
760
|
+
"aria": {
|
|
761
|
+
"implicitRole": "generic",
|
|
762
|
+
"permittedRoles": true,
|
|
763
|
+
"namingProhibited": true,
|
|
764
|
+
"conditions": {
|
|
765
|
+
"dl > div": {
|
|
766
|
+
"permittedRoles": ["presentation", "none"],
|
|
767
|
+
},
|
|
768
|
+
},
|
|
769
|
+
"1.1": {
|
|
770
|
+
"implicitRole": false,
|
|
771
|
+
"permittedRoles": true,
|
|
772
|
+
},
|
|
773
|
+
},
|
|
774
|
+
}
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
`<div>` 要素は通常フローコンテンツを許可しますが、`<dl>` の直接の子として使用される場合は `<dt>` と `<dd>` のペアのみを許可します。ARIA マッピングも同様にコンテキスト依存で、`<dl>` 内では `presentation` と `none` ロールのみが許可されます。
|
|
778
|
+
|
|
779
|
+
### SVG 要素(`<svg:text>`)
|
|
780
|
+
|
|
781
|
+
```jsonc
|
|
782
|
+
// https://svgwg.org/svg2-draft/text.html#TextElement
|
|
783
|
+
{
|
|
784
|
+
"contentModel": {
|
|
785
|
+
"contents": [
|
|
786
|
+
{
|
|
787
|
+
"zeroOrMore": [
|
|
788
|
+
"#text",
|
|
789
|
+
":model(SVGAnimation)",
|
|
790
|
+
":model(SVGDescriptive)",
|
|
791
|
+
":model(SVGPaintServer)",
|
|
792
|
+
":model(SVGTextContentChild)",
|
|
793
|
+
"svg|a",
|
|
794
|
+
"svg|clipPath",
|
|
795
|
+
"svg|marker",
|
|
796
|
+
"svg|mask",
|
|
797
|
+
"svg|script",
|
|
798
|
+
"svg|style",
|
|
799
|
+
],
|
|
800
|
+
},
|
|
801
|
+
],
|
|
802
|
+
},
|
|
803
|
+
"globalAttrs": {
|
|
804
|
+
"#HTMLGlobalAttrs": true,
|
|
805
|
+
"#GlobalEventAttrs": true,
|
|
806
|
+
"#ARIAAttrs": true,
|
|
807
|
+
"#SVGConditionalProcessingAttrs": ["requiredExtensions", "systemLanguage"],
|
|
808
|
+
"#SVGCoreAttrs": ["id", "tabindex", "autofocus", "lang", "xml:space", "class", "style"],
|
|
809
|
+
"#SVGPresentationAttrs": [
|
|
810
|
+
"alignment-baseline",
|
|
811
|
+
"baseline-shift",
|
|
812
|
+
"fill",
|
|
813
|
+
"font-family",
|
|
814
|
+
"font-size",
|
|
815
|
+
"opacity",
|
|
816
|
+
"stroke",
|
|
817
|
+
"text-anchor",
|
|
818
|
+
"transform",
|
|
819
|
+
// ... 他のプレゼンテーション属性
|
|
820
|
+
],
|
|
821
|
+
},
|
|
822
|
+
"attributes": {
|
|
823
|
+
"lengthAdjust": {
|
|
824
|
+
"type": {
|
|
825
|
+
"enum": ["spacing", "spacingAndGlyphs"],
|
|
826
|
+
"disallowToSurroundBySpaces": false,
|
|
827
|
+
},
|
|
828
|
+
"defaultValue": "spacing",
|
|
829
|
+
"animatable": true,
|
|
830
|
+
},
|
|
831
|
+
"x": {
|
|
832
|
+
"type": "<text-coordinate>",
|
|
833
|
+
"defaultValue": "0",
|
|
834
|
+
"animatable": true,
|
|
835
|
+
},
|
|
836
|
+
"y": {
|
|
837
|
+
"type": "<text-coordinate>",
|
|
838
|
+
"defaultValue": "0",
|
|
839
|
+
"animatable": true,
|
|
840
|
+
},
|
|
841
|
+
"dx": { "type": "<text-coordinate>", "animatable": true },
|
|
842
|
+
"dy": { "type": "<text-coordinate>", "animatable": true },
|
|
843
|
+
"rotate": { "type": "<list-of-numbers>", "animatable": true },
|
|
844
|
+
"textLength": {
|
|
845
|
+
"type": ["<svg-length>", "<percentage>"],
|
|
846
|
+
"animatable": true,
|
|
847
|
+
},
|
|
848
|
+
},
|
|
849
|
+
"aria": {
|
|
850
|
+
"implicitRole": "group",
|
|
851
|
+
"permittedRoles": {
|
|
852
|
+
"core-aam": true,
|
|
853
|
+
"graphics-aam": true,
|
|
854
|
+
},
|
|
855
|
+
},
|
|
856
|
+
}
|
|
857
|
+
```
|
|
858
|
+
|
|
859
|
+
SVG 要素は HTML 要素と比較して以下の特徴があります。
|
|
860
|
+
|
|
861
|
+
- **コンテンツモデル**: SVG カテゴリ(`:model(SVGAnimation)` 等)とパイプ記法による名前空間指定(`svg|a`)を使用
|
|
862
|
+
- **グローバル属性**: SVG 固有のカテゴリ(`#SVGCoreAttrs`, `#SVGPresentationAttrs` 等)を選択的にインクルード
|
|
863
|
+
- **属性**: SVG/CSS 型(`<text-coordinate>`, `<svg-length>` 等)と `animatable` フラグを使用
|
|
864
|
+
- **ARIA**: `permittedRoles` で AAM 参照オブジェクト(`core-aam`, `graphics-aam`)を使用
|
|
865
|
+
|
|
866
|
+
### void 要素(`<input>` -- 簡略版)
|
|
867
|
+
|
|
868
|
+
```jsonc
|
|
869
|
+
// https://html.spec.whatwg.org/multipage/input.html#the-input-element
|
|
870
|
+
{
|
|
871
|
+
"contentModel": {
|
|
872
|
+
"contents": false,
|
|
873
|
+
},
|
|
874
|
+
"globalAttrs": {
|
|
875
|
+
"#HTMLGlobalAttrs": true,
|
|
876
|
+
"#GlobalEventAttrs": true,
|
|
877
|
+
"#ARIAAttrs": true,
|
|
878
|
+
"#HTMLEmbededAndMediaContentAttrs": ["src", "height", "width"],
|
|
879
|
+
"#HTMLFormControlElementAttrs": [
|
|
880
|
+
"autocomplete",
|
|
881
|
+
"dirname",
|
|
882
|
+
"disabled",
|
|
883
|
+
"form",
|
|
884
|
+
"formaction",
|
|
885
|
+
"formenctype",
|
|
886
|
+
"formmethod",
|
|
887
|
+
"formnovalidate",
|
|
888
|
+
"formtarget",
|
|
889
|
+
"name",
|
|
890
|
+
"maxlength",
|
|
891
|
+
"minlength",
|
|
892
|
+
"readonly",
|
|
893
|
+
"required",
|
|
894
|
+
],
|
|
895
|
+
},
|
|
896
|
+
"attributes": {
|
|
897
|
+
"accept": {
|
|
898
|
+
"type": {
|
|
899
|
+
"token": "Accept",
|
|
900
|
+
"caseInsensitive": true,
|
|
901
|
+
"unique": true,
|
|
902
|
+
"separator": "comma",
|
|
903
|
+
},
|
|
904
|
+
"condition": "[type='file' i]",
|
|
905
|
+
},
|
|
906
|
+
"checked": {
|
|
907
|
+
"type": "Boolean",
|
|
908
|
+
"condition": ["[type='checkbox' i]", "[type='radio' i]"],
|
|
909
|
+
},
|
|
910
|
+
"max": {
|
|
911
|
+
"type": ["DateTime", "Number"],
|
|
912
|
+
"condition": [
|
|
913
|
+
"[type='date' i]",
|
|
914
|
+
"[type='month' i]",
|
|
915
|
+
"[type='week' i]",
|
|
916
|
+
"[type='time' i]",
|
|
917
|
+
"[type='datetime-local' i]",
|
|
918
|
+
"[type='number' i]",
|
|
919
|
+
"[type='range' i]",
|
|
920
|
+
],
|
|
921
|
+
},
|
|
922
|
+
"multiple": {
|
|
923
|
+
"type": "Boolean",
|
|
924
|
+
"condition": ["[type='email' i]", "[type='file' i]"],
|
|
925
|
+
},
|
|
926
|
+
// ... 他の属性(実際のファイルには多数の属性定義が含まれる)
|
|
927
|
+
},
|
|
928
|
+
"aria": {
|
|
929
|
+
// ... type 属性の値に応じた複雑な条件付き ARIA マッピング
|
|
930
|
+
},
|
|
931
|
+
}
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
`<input>` 要素は void 要素であり、`contents: false` でコンテンツを持てないことを示しています。複数のグローバル属性カテゴリから選択的に属性をインクルードし、要素固有の属性は `condition` フィールドで `type` 属性の値に応じた条件付き定義を持ちます。
|
|
935
|
+
|
|
936
|
+
---
|
|
937
|
+
|
|
938
|
+
## まとめ
|
|
939
|
+
|
|
940
|
+
要素仕様 JSON ファイルの主要なパターンを以下にまとめます。
|
|
941
|
+
|
|
942
|
+
| パターン | フィールド | 使用場面 |
|
|
943
|
+
| ---------------------- | ---------------------------- | ----------------------------- |
|
|
944
|
+
| void 要素 | `contents: false` | `<input>`, `<br>`, `<img>` 等 |
|
|
945
|
+
| 透過コンテンツ | `transparent` + 除外セレクタ | `<a>`, `<del>`, `<ins>` 等 |
|
|
946
|
+
| 条件付きコンテンツ | `conditional` 配列 | `<div>`(`<dl>` 内)等 |
|
|
947
|
+
| 選択的属性インクルード | `globalAttrs` で文字列配列 | `<a>`、`<input>` 等 |
|
|
948
|
+
| 条件付き属性 | `condition` フィールド | `<input>` の type 依存属性 |
|
|
949
|
+
| 条件付き ARIA | `conditions` オブジェクト | `<a>` の href 依存ロール |
|
|
950
|
+
| バージョン固有 ARIA | `"1.1"`, `"1.2"` キー | ARIA バージョン間の差異 |
|
|
951
|
+
| SVG 名前空間 | `svg\|` プレフィックス | SVG 要素のコンテンツモデル |
|
|
952
|
+
| カテゴリ参照 | `:model()` 擬似クラス | コンテンツモデルパターン |
|