@kubohiroya/turbowarp-structured-data 0.6.3 → 0.7.1

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.
@@ -0,0 +1,553 @@
1
+ <!doctype html>
2
+ <html lang="ja">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta name="theme-color" content="#0b0912">
7
+ <meta name="description" content="TurboWarp機能拡張Structured Dataの使い方:JSONやYAMLを名前付きの値として読み込み、パスで読み書きし、繰り返し処理して、テキストに戻します。">
8
+ <meta property="og:type" content="website">
9
+ <meta property="og:title" content="Structured Data — ユーザーガイド">
10
+ <meta property="og:description" content="TurboWarpでJSONとYAMLを扱う:名前付きの値、安全なパス、上限付きの繰り返し。">
11
+ <meta property="og:url" content="https://kubohiroya.github.io/turbowarp-structured-data/ja/">
12
+ <link rel="canonical" href="https://kubohiroya.github.io/turbowarp-structured-data/ja/">
13
+ <link rel="alternate" hreflang="en" href="https://kubohiroya.github.io/turbowarp-structured-data/">
14
+ <link rel="alternate" hreflang="ja" href="https://kubohiroya.github.io/turbowarp-structured-data/ja/">
15
+ <link rel="alternate" hreflang="x-default" href="https://kubohiroya.github.io/turbowarp-structured-data/">
16
+ <link rel="stylesheet" href="../assets/site.css">
17
+ <title>Structured Data — ユーザーガイド</title>
18
+ <style>h1,h2,h3{word-break:auto-phrase}</style>
19
+ </head>
20
+ <body>
21
+ <a class="skip-link" href="#content">本文へスキップ</a>
22
+ <header class="site-header">
23
+ <div class="header-inner">
24
+ <a class="brand" href="./" aria-label="Structured Data ホーム">
25
+ <span class="brand-mark" aria-hidden="true">{ }</span>
26
+ <span class="brand-name">Structured Data</span>
27
+ </a>
28
+ <nav class="main-nav" aria-label="ガイドの目次">
29
+ <a href="#start">はじめに</a>
30
+ <a href="#flow">しくみ</a>
31
+ <a href="#paths">パス</a>
32
+ <a href="#loops">繰り返し</a>
33
+ <a href="#blocks">ブロック</a>
34
+ <a href="#help">困ったとき</a>
35
+ <a href="../#extension-block-reference" lang="en" hreflang="en">Reference</a>
36
+ </nav>
37
+ <a
38
+ class="github-link"
39
+ href="https://github.com/kubohiroya/turbowarp-structured-data"
40
+ aria-label="GitHubでソースコードを見る"
41
+ >
42
+ <img src="../assets/github-mark.svg" width="24" height="24" alt="">
43
+ <span class="github-link-label">GitHub</span>
44
+ </a>
45
+ <nav class="language-nav" aria-label="言語">
46
+ <a href="../" lang="en" hreflang="en">English</a>
47
+ <a href="./" lang="ja" hreflang="ja" aria-current="page">日本語</a>
48
+ </nav>
49
+ </div>
50
+ </header>
51
+
52
+ <main id="content" class="page-shell">
53
+ <section class="hero" aria-labelledby="hero-title">
54
+ <div>
55
+ <p class="eyebrow">TurboWarp カスタム機能拡張</p>
56
+ <h1 id="hero-title">文字列の切り貼りなしで、本物のデータを。</h1>
57
+ <p class="lede">
58
+ JSONやYAMLを一度読み込んで名前を付ければ、あとはそのまま扱えます。項目を1つ読む、値を1つ書き換える、リストを順に処理する、そして結果をテキストに戻す。文字列の分割や、複数のリストの同期に悩む必要はありません。
59
+ </p>
60
+ <div class="hero-actions">
61
+ <a class="button button-primary" href="#start">準備する</a>
62
+ <a class="button button-secondary" href="#recipes">使用例を見る</a>
63
+ </div>
64
+ </div>
65
+ <div class="hero-visual" aria-label="例:YAMLをcfgとして読み込み、値を1つ変更し、JSONに戻す">
66
+ <div class="visual-window">
67
+ <div class="window-bar" aria-hidden="true">
68
+ <i></i><i></i><i></i><span>Structured Data</span>
69
+ </div>
70
+ <div class="scratch-stack">
71
+ <div class="scratch-block">
72
+ parse YAML <code>speed: 4</code> as <code>cfg</code>
73
+ </div>
74
+ <div class="scratch-block">
75
+ set <code>cfg</code> at path <code>$.speed</code> to JSON <code>6</code>
76
+ </div>
77
+ <div class="result-line">
78
+ <span>to JSON <code>cfg</code></span>
79
+ <span aria-hidden="true">→</span>
80
+ <span class="result-pill">{"speed":6}</span>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ </section>
86
+
87
+ <section id="start" class="section" aria-labelledby="start-title">
88
+ <div class="section-heading">
89
+ <div>
90
+ <p class="eyebrow">01 · はじめに</p>
91
+ <h2 id="start-title">3ステップで準備完了。</h2>
92
+ </div>
93
+ <p>
94
+ Structured Dataは明示的に有効にして使うプレビュー機能です。拡張を読み込む前に起動時フラグを設定したときだけブロックが表示されるので、既存のプロジェクトに意図せず影響することはありません。
95
+ </p>
96
+ </div>
97
+
98
+ <div class="step-grid">
99
+ <article class="step">
100
+ <span class="step-number">1</span>
101
+ <h3>機能フラグをオンにする</h3>
102
+ <p>
103
+ TurboWarpを動かしているページ(ブラウザーのコンソールや独自のホストページなど)で、拡張を読み込む<em>前に</em> <code>globalThis.STRUCTURED_DATA_MVP = true</code>
104
+ を実行します。
105
+ </p>
106
+ </article>
107
+ <article class="step">
108
+ <span class="step-number">2</span>
109
+ <h3>拡張を読み込む</h3>
110
+ <p>
111
+ 下のURLをカスタム拡張機能として追加し、
112
+ <strong>サンドボックスなしで実行する</strong>を選びます。
113
+ </p>
114
+ </article>
115
+ <article class="step">
116
+ <span class="step-number">3</span>
117
+ <h3>最初の値を読み込む</h3>
118
+ <p>
119
+ <code>parse JSON [ ] as [data]</code> または
120
+ <code>parse YAML [ ] as [data]</code> をスクリプトに置いてクリックします。これで名前 <code>data</code> に値が入ります。
121
+ </p>
122
+ </article>
123
+ </div>
124
+
125
+ <div class="code-card" style="margin-top: 1rem">
126
+ <span class="code-label">バージョン固定の拡張URL</span>
127
+ <pre><code>https://cdn.jsdelivr.net/npm/@kubohiroya/turbowarp-structured-data@0.6.2/dist/structured-data.js</code></pre>
128
+ </div>
129
+
130
+ <div class="callout" role="note" style="margin-top: 1rem">
131
+ <span class="callout-mark" aria-hidden="true">!</span>
132
+ <p>
133
+ <strong>サンドボックスなしの実行が必要です。</strong>スプライトとステージがそれぞれ自分の名前付きの値を持ち、繰り返しが実行中のスクリプトを追跡するため、TurboWarp VMへの直接アクセスが必要です。この拡張はネットワーク通信をせず、実行中のプロジェクト以外には何も保存しません。拡張ファイルは信頼できる配布元からのみ読み込んでください。
134
+ </p>
135
+ </div>
136
+ </section>
137
+
138
+ <section id="flow" class="section" aria-labelledby="flow-title">
139
+ <div class="section-heading">
140
+ <div>
141
+ <p class="eyebrow">02 · しくみ</p>
142
+ <h2 id="flow-title">一度読み込み、名前で扱い、必要なときだけテキストに。</h2>
143
+ </div>
144
+ <p>
145
+ テキストを読み込むと、名前付きの値がスプライトの中に保持され、求めたときだけテキストに戻ります。その間、すべてのブロックはオブジェクト、配列、数値、文字列、真偽値、
146
+ <code>null</code> という実際の構造をそのまま扱います。
147
+ </p>
148
+ </div>
149
+
150
+ <figure class="diagram" aria-labelledby="flow-diagram-title">
151
+ <figcaption id="flow-diagram-title" class="diagram-title">
152
+ 名前付きの値の一生
153
+ </figcaption>
154
+ <div class="flow">
155
+ <div class="flow-node">
156
+ <strong>JSON / YAML テキスト</strong>
157
+ <small>変数、リストの項目、ファイル、Webの応答など</small>
158
+ </div>
159
+ <div class="flow-arrow" aria-hidden="true">→</div>
160
+ <div class="flow-node flow-node-accent">
161
+ <strong>名前付きの値</strong>
162
+ <small><code>$.path</code> で読む・確かめる・書く・消す・繰り返す</small>
163
+ </div>
164
+ <div class="flow-arrow" aria-hidden="true">→</div>
165
+ <div class="flow-node flow-node-result">
166
+ <strong>JSON / YAML テキスト</strong>
167
+ <small>キーの順序が一定で、保存や送信にそのまま使える</small>
168
+ </div>
169
+ </div>
170
+ </figure>
171
+
172
+ <div class="two-column" style="margin-top: 1rem">
173
+ <article class="card">
174
+ <h3>名前はスプライトごと</h3>
175
+ <p>
176
+ スプライト1の <code>config</code> とステージの <code>config</code> は別の値です。同じ名前でもう一度読み込むと、値が置き換わります。
177
+ </p>
178
+ </article>
179
+ <article class="card">
180
+ <h3>値は停止するまで</h3>
181
+ <p>
182
+ 名前付きの値はプロジェクトの実行中だけ存在します。停止ボタンで消え、プロジェクトファイルにも保存されません。後で使う場合は元のテキストを変数に残してください。
183
+ </p>
184
+ </article>
185
+ </div>
186
+
187
+ <div id="recipes" class="recipe-grid" style="margin-top: 1rem">
188
+ <article class="recipe">
189
+ <h3>設定値を読む</h3>
190
+ <div class="code-card">
191
+ <span class="code-label">ブロック</span>
192
+ <pre><code>parse JSON [{"level":{"speed":4}}] as [cfg]
193
+ get JSON from [cfg] at path [$.level.speed]
194
+ → 4</code></pre>
195
+ </div>
196
+ <p>数値やテキストを入れる場所なら、どこでもこのレポーターを使えます。</p>
197
+ </article>
198
+ <article class="recipe">
199
+ <h3>書き換えて保存する</h3>
200
+ <div class="code-card">
201
+ <span class="code-label">ブロック</span>
202
+ <pre><code>set [save] at path [$.score] to JSON [120]
203
+ set [save] at path [$.name] to JSON ["Mio"]
204
+ [saved text] を (to JSON [save]) にする</code></pre>
205
+ </div>
206
+ <p>値はJSONなので、文字列には引用符が必要です。<code>Mio</code> ではなく <code>"Mio"</code>。</p>
207
+ </article>
208
+ <article class="recipe">
209
+ <h3>読む前に確かめる</h3>
210
+ <div class="code-card">
211
+ <span class="code-label">ブロック</span>
212
+ <pre><code>もし &lt;structured data [save] has path [$.items]?&gt; なら(length of array in [save] at path [$.items]) と言う</code></pre>
213
+ </div>
214
+ <p>先に確かめれば、データやパスがないことによるエラーを避けられます。</p>
215
+ </article>
216
+ </div>
217
+ </section>
218
+
219
+ <section id="paths" class="section" aria-labelledby="paths-title">
220
+ <div class="section-heading">
221
+ <div>
222
+ <p class="eyebrow">03 · パス</p>
223
+ <h2 id="paths-title">ちょうど1か所を指す。</h2>
224
+ </div>
225
+ <p>
226
+ パスは値全体を表す <code>$</code> から始まり、キーまたは添字を1つずつたどります。どのパスも必ず1か所だけを指すように、あえて単純にしてあります。意図した以上の場所をブロックが変更することはありません。
227
+ </p>
228
+ </div>
229
+
230
+ <div class="table-wrap">
231
+ <table>
232
+ <thead>
233
+ <tr>
234
+ <th scope="col">パス</th>
235
+ <th scope="col">指す場所</th>
236
+ </tr>
237
+ </thead>
238
+ <tbody>
239
+ <tr>
240
+ <td><code>$</code></td>
241
+ <td>値全体。</td>
242
+ </tr>
243
+ <tr>
244
+ <td><code>$.player.name</code></td>
245
+ <td>キー <code>player</code> の中のキー <code>name</code>。ドットで書けるキーは英字・数字・<code>_</code> からなり、数字で始まらないものです。</td>
246
+ </tr>
247
+ <tr>
248
+ <td><code>$.items[0]</code></td>
249
+ <td>配列 <code>items</code> の最初の項目。添字は0から数えます。</td>
250
+ </tr>
251
+ <tr>
252
+ <td><code>$["キー.ドット 入り"]</code></td>
253
+ <td>空白・ドット・日本語を含む任意のキー。引用符と角かっこで囲みます。</td>
254
+ </tr>
255
+ </tbody>
256
+ </table>
257
+ </div>
258
+
259
+ <div class="syntax-layout" style="margin-top: 1rem">
260
+ <article class="syntax-list supported">
261
+ <h3><code>set</code> と <code>delete path</code> でできること</h3>
262
+ <ul>
263
+ <li><code>set</code> は値全体の置き換え、既存の配列項目の置き換え、既存オブジェクトのキーの追加・置き換えができます。</li>
264
+ <li>配列の項目を削除すると、後ろの項目が1つずつ前に詰まります。</li>
265
+ <li>変更は完全に成功したときだけ反映されます。失敗したブロックは値を変えません。</li>
266
+ </ul>
267
+ </article>
268
+ <article class="syntax-list rejected">
269
+ <h3>できないこと</h3>
270
+ <ul>
271
+ <li>存在しない親のオブジェクトや配列の自動作成。</li>
272
+ <li>配列の末尾より後ろへの追加。</li>
273
+ <li><code>$</code> の削除(代わりに <code>delete structured data</code> を使います)。</li>
274
+ <li>ワイルドカード、スライス、フィルター、再帰検索、式。</li>
275
+ </ul>
276
+ </article>
277
+ </div>
278
+ </section>
279
+
280
+ <section id="loops" class="section" aria-labelledby="loops-title">
281
+ <div class="section-heading">
282
+ <div>
283
+ <p class="eyebrow">04 · 繰り返し</p>
284
+ <h2 id="loops-title">すべての項目を、決まった順番で。</h2>
285
+ </div>
286
+ <p>
287
+ <code>for each in [ ] at path [ ] max [ ]</code> は、配列の項目またはオブジェクトのキーごとに中のブロックを1回ずつ実行します。ループの中では3つのレポーターで現在位置がわかります。
288
+ </p>
289
+ </div>
290
+
291
+ <div class="two-column">
292
+ <div class="code-card">
293
+ <span class="code-label">ブロック</span>
294
+ <pre><code>parse JSON [{"items":["apple","pear"]}] as [shop]
295
+ for each in [shop] at path [$.items] max [100]
296
+ ((current index) と (current value JSON)) と言う
297
+ → 0"apple" 1"pear"</code></pre>
298
+ </div>
299
+ <div class="table-wrap">
300
+ <table>
301
+ <thead>
302
+ <tr>
303
+ <th scope="col">レポーター</th>
304
+ <th scope="col">ループの中で返す値</th>
305
+ </tr>
306
+ </thead>
307
+ <tbody>
308
+ <tr>
309
+ <td><code>current key</code></td>
310
+ <td>オブジェクトのキー、または配列の添字(文字列)。</td>
311
+ </tr>
312
+ <tr>
313
+ <td><code>current index</code></td>
314
+ <td>0から始まる回数。</td>
315
+ </tr>
316
+ <tr>
317
+ <td><code>current value JSON</code></td>
318
+ <td>現在の項目(JSON)。</td>
319
+ </tr>
320
+ </tbody>
321
+ </table>
322
+ </div>
323
+ </div>
324
+
325
+ <div class="card-grid" style="margin-top: 1rem">
326
+ <article class="card">
327
+ <h3>いつも同じ順番</h3>
328
+ <p>配列は添字順、オブジェクトはUnicodeのコードポイント順にソートしたキーの順です。元のテキストの書き方に結果が左右されません。</p>
329
+ </article>
330
+ <article class="card">
331
+ <h3><code>max</code> は安全のための上限</h3>
332
+ <p>1〜1000の整数を指定します(既定は100)。項目数がこれを超えると、黙って一部を飛ばすのではなくエラーになります。</p>
333
+ </article>
334
+ <article class="card">
335
+ <h3>入れ子にできる</h3>
336
+ <p>ループの中に別のループを置けます。レポーターは常に、実行中のいちばん内側のループを表します。</p>
337
+ </article>
338
+ </div>
339
+ </section>
340
+
341
+ <section id="blocks" class="section" aria-labelledby="blocks-title">
342
+ <div class="section-heading">
343
+ <div>
344
+ <p class="eyebrow">05 · ブロックの選び方</p>
345
+ <h2 id="blocks-title">やりたいことからブロックを選ぶ。</h2>
346
+ </div>
347
+ <p>
348
+ どのブロックも <code>NAME</code> で値を指定します。各引数と既定値は
349
+ <a href="../#extension-block-reference" lang="en" hreflang="en">Complete block reference</a>(英語)にあります。
350
+ </p>
351
+ </div>
352
+
353
+ <div class="table-wrap">
354
+ <table>
355
+ <thead>
356
+ <tr>
357
+ <th scope="col">やりたいこと</th>
358
+ <th scope="col">使うブロック</th>
359
+ </tr>
360
+ </thead>
361
+ <tbody>
362
+ <tr>
363
+ <td>テキストを名前付きの値として読み込む</td>
364
+ <td><a href="../#block-parseJson"><code>parse JSON [ ] as [ ]</code></a>、<a href="../#block-parseYaml"><code>parse YAML [ ] as [ ]</code></a></td>
365
+ </tr>
366
+ <tr>
367
+ <td>値全体をテキストに戻す</td>
368
+ <td><a href="../#block-toJson"><code>to JSON [ ]</code></a>、<a href="../#block-toYaml"><code>to YAML [ ]</code></a></td>
369
+ </tr>
370
+ <tr>
371
+ <td>名前付きの値の有無を調べる・消す</td>
372
+ <td><a href="../#block-hasStructuredData"><code>structured data [ ] exists?</code></a>、<a href="../#block-deleteStructuredData"><code>delete structured data [ ]</code></a></td>
373
+ </tr>
374
+ <tr>
375
+ <td>1か所を読む・確かめる</td>
376
+ <td><a href="../#block-getJsonAtPath"><code>get JSON from [ ] at path [ ]</code></a>、<a href="../#block-hasPath"><code>structured data [ ] has path [ ]?</code></a></td>
377
+ </tr>
378
+ <tr>
379
+ <td>1か所を変更する</td>
380
+ <td><a href="../#block-setJsonAtPath"><code>set [ ] at path [ ] to JSON [ ]</code></a>、<a href="../#block-deleteAtPath"><code>delete path [ ] from [ ]</code></a></td>
381
+ </tr>
382
+ <tr>
383
+ <td>コレクションを調べる</td>
384
+ <td><a href="../#block-keysAtPath"><code>keys in [ ] at path [ ]</code></a>(ソート済み、JSON配列)、<a href="../#block-lengthAtPath"><code>length of array in [ ] at path [ ]</code></a></td>
385
+ </tr>
386
+ <tr>
387
+ <td>項目ごとに繰り返す</td>
388
+ <td><a href="../#block-forEachAtPath"><code>for each in [ ] at path [ ] max [ ]</code></a> と <a href="../#block-currentKey"><code>current key</code></a>、<a href="../#block-currentIndex"><code>current index</code></a>、<a href="../#block-currentValueJson"><code>current value JSON</code></a></td>
389
+ </tr>
390
+ </tbody>
391
+ </table>
392
+ </div>
393
+ </section>
394
+
395
+ <section id="safety" class="section" aria-labelledby="safety-title">
396
+ <div class="section-heading">
397
+ <div>
398
+ <p class="eyebrow">06 · 制限と安全性</p>
399
+ <h2 id="safety-title">入力は厳格に、出力は予測どおりに。</h2>
400
+ </div>
401
+ <p>
402
+ Structured Dataは純粋なデータだけを受け付け、推測せずにはっきりと失敗します。大きな入力や特殊な入力でプロジェクトが固まったり、意味が変わったりするのを防ぎます。
403
+ </p>
404
+ </div>
405
+
406
+ <div class="card-grid">
407
+ <article class="card">
408
+ <h3>サイズの上限</h3>
409
+ <p>1回の読み込みで、テキストは256 KiBまで、入れ子は64段まで、値の総数は50,000個までです。</p>
410
+ </article>
411
+ <article class="card">
412
+ <h3>安全なYAML</h3>
413
+ <p>エイリアス、未知のタグ、重複キー、文字列以外のキー、未対応のスカラー型、パーサーの警告は拒否します。</p>
414
+ </article>
415
+ <article class="card">
416
+ <h3>安定した出力</h3>
417
+ <p><code>to JSON</code> と <code>to YAML</code> は常にキーをソートします。同じデータからは同じテキストが得られるので、比較・保存・送信が簡単です。</p>
418
+ </article>
419
+ </div>
420
+ </section>
421
+
422
+ <section id="editors" class="section" aria-labelledby="editors-title">
423
+ <div class="section-heading">
424
+ <div>
425
+ <p class="eyebrow">07 · オプションの連携機能</p>
426
+ <h2 id="editors-title">編集フォームと共有Named Data。</h2>
427
+ </div>
428
+ <p>
429
+ 以下の機能は既定でオフで、通常の利用には必要ありません。対応したTurboWarpビルドやホストでのみ有効にしてください。
430
+ </p>
431
+ </div>
432
+
433
+ <div class="card-grid">
434
+ <article class="card">
435
+ <h3>Source/Formエディター</h3>
436
+ <p>
437
+ GUIの起動オプション <code>blockEditorDialogs=1</code> と
438
+ <code>blockEditorSourceForms=1</code> を指定すると、<code>parse JSON</code>、
439
+ <code>parse YAML</code>、<code>set … to JSON</code> のJSON/YAML入力を、ソーステキストとフォームを切り替えられるエディターで編集できます。変更していないテキストは書いたとおりに保たれ、ブロックが拒否する入力は保存できません。
440
+ </p>
441
+ </article>
442
+ <article class="card">
443
+ <h3><code>max</code> の固定入力エディター</h3>
444
+ <p>
445
+ <code>blockEditorDialogs</code> と <code>blockEditorFixedInputs</code> の両方をオンにして再読み込みすると、<code>for each</code> の <code>max</code> を1〜1000の整数で編集するフォームが使えます。入力途中・空白・有限でない新しい値は保存できず、NAMEとPATHは変更しません。既存の値は編集しない限り書き換えず、接続したレポーターは評価しません。
446
+ </p>
447
+ </article>
448
+ <article class="card">
449
+ <h3>Named Dataプロバイダー</h3>
450
+ <p>
451
+ <code>globalThis.NAMED_DATA_REGISTRY_MVP = true</code> を設定すると、名前付きの値が共有の <a href="https://kubohiroya.github.io/turbowarp-named-data/">Named Data</a>
452
+ レジストリを通じて <code>structured</code> データとして他の拡張にも提供されます。
453
+ <code>__TW_NAMED_DATA_FEATURE_FLAGS__ = {NAMED_DATA_SCHEMA_REF: true}</code>
454
+ を加えると、Schemaの識別情報も受け渡します。
455
+ </p>
456
+ </article>
457
+ </div>
458
+ </section>
459
+
460
+ <section id="help" class="section" aria-labelledby="help-title">
461
+ <div class="section-heading">
462
+ <div>
463
+ <p class="eyebrow">08 · 困ったとき</p>
464
+ <h2 id="help-title">ブロックが期待どおりに動かないとき。</h2>
465
+ </div>
466
+ <p>
467
+ 多くの問題は、起動時フラグ、JSONの引用符、停止による値の消去が原因です。ブロックが失敗すると下の安定したエラーコードのいずれかを報告し、名前付きの値は元のまま残ります。
468
+ </p>
469
+ </div>
470
+
471
+ <div class="card-grid">
472
+ <article class="card">
473
+ <h3>パレットが空になっている</h3>
474
+ <p>
475
+ 先に <code>globalThis.STRUCTURED_DATA_MVP = true</code> を設定してから、拡張を読み込み直してください。フラグは起動時に1回だけ読み取られます。
476
+ </p>
477
+ </article>
478
+ <article class="card">
479
+ <h3>文字列が引用符付きで返ってくる</h3>
480
+ <p>
481
+ <code>get JSON</code> はJSONを返すため、文字列 <code>Mio</code> は
482
+ <code>"Mio"</code> として返ります。保存するときも引用符を付けます:
483
+ <code>set … to JSON ["Mio"]</code>。
484
+ </p>
485
+ </article>
486
+ <article class="card">
487
+ <h3>停止後に「DATA_NOT_FOUND」</h3>
488
+ <p>
489
+ 停止するとすべての名前付きの値が消えます。<em>緑の旗が押されたとき</em>のスクリプトでもう一度読み込んでください。
490
+ </p>
491
+ </article>
492
+ <article class="card">
493
+ <h3>別のスプライトからデータが見えない</h3>
494
+ <p>
495
+ 名前は読み込みを実行したスプライトまたはステージに属します。必要なスプライトごとに読み込むか、JSONテキストを全体用の変数で受け渡してください。
496
+ </p>
497
+ </article>
498
+ <article class="card">
499
+ <h3>set で「PATH_NOT_FOUND」</h3>
500
+ <p>
501
+ <code>set</code> は存在しない親を作りません。先に親を作ってから(例:
502
+ <code>$.player</code> を <code>{}</code> に)、<code>$.player.name</code> を設定します。
503
+ </p>
504
+ </article>
505
+ <article class="card">
506
+ <h3>「ITERATION_LIMIT_EXCEEDED」</h3>
507
+ <p>
508
+ コレクションが <code>max</code> より大きいためです。<code>max</code> を(1000まで)増やすか、データのより小さな部分を対象にしてください。
509
+ </p>
510
+ </article>
511
+ </div>
512
+
513
+ <div class="table-wrap" style="margin-top: 1rem">
514
+ <table>
515
+ <thead>
516
+ <tr>
517
+ <th scope="col">エラーコード</th>
518
+ <th scope="col">意味</th>
519
+ </tr>
520
+ </thead>
521
+ <tbody>
522
+ <tr><td><code>INVALID_JSON</code> / <code>INVALID_YAML</code></td><td>テキストを解析できないか、許可されていないYAMLの機能を使っています。</td></tr>
523
+ <tr><td><code>PARSE_LIMIT_EXCEEDED</code></td><td>テキストのサイズ、深さ、値の数が上限を超えています。</td></tr>
524
+ <tr><td><code>INVALID_NAME</code></td><td>名前が空か、空白だけです。</td></tr>
525
+ <tr><td><code>DATA_NOT_FOUND</code></td><td>このスプライトにその名前の値がありません。</td></tr>
526
+ <tr><td><code>INVALID_PATH</code></td><td>パスが対応している書き方になっていません。</td></tr>
527
+ <tr><td><code>PATH_NOT_FOUND</code></td><td>パス、またはその親が存在しません。</td></tr>
528
+ <tr><td><code>TYPE_MISMATCH</code></td><td>配列を期待した場所に数値があるなど、型が異なります。</td></tr>
529
+ <tr><td><code>INDEX_OUT_OF_RANGE</code></td><td>配列の添字が末尾を超えています。</td></tr>
530
+ <tr><td><code>ITERATION_LIMIT_EXCEEDED</code></td><td>コレクションの項目数が <code>max</code> を超えています。</td></tr>
531
+ <tr><td><code>ITERATION_CONTEXT_REQUIRED</code></td><td><code>current …</code> レポーターを <code>for each</code> ループの外で使いました。</td></tr>
532
+ </tbody>
533
+ </table>
534
+ </div>
535
+ </section>
536
+ </main>
537
+
538
+ <footer class="site-footer">
539
+ <div class="footer-inner">
540
+ <p>Structured Data 0.6.2 · MPL-2.0</p>
541
+ <div class="footer-links">
542
+ <a href="https://www.npmjs.com/package/@kubohiroya/turbowarp-structured-data">npm</a>
543
+ <a href="https://github.com/kubohiroya/turbowarp-structured-data/blob/main/docs/architecture.ja.md">アーキテクチャ</a>
544
+ <a href="https://github.com/kubohiroya/turbowarp-structured-data/issues">問題を報告する</a>
545
+ </div>
546
+ </div>
547
+ </footer>
548
+ <!-- The shared TurboWarp Plus header. It inserts itself at the top of the
549
+ page in a shadow root, so it cannot disturb the styles below. -->
550
+ <script type="module"
551
+ src="https://kubohiroya.github.io/turbowarp-plus-site-header/dist/auto.js"></script>
552
+ </body>
553
+ </html>
@@ -21,5 +21,5 @@ export declare const extensionConfig: {
21
21
  readonly license: "MPL-2.0";
22
22
  readonly unsandboxed: true;
23
23
  readonly docsURI: "https://kubohiroya.github.io/turbowarp-structured-data/";
24
- readonly blockIconURI: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHJlY3QgeD0iNCIgeT0iOCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE0IiByeD0iMyIgZmlsbD0iIzRDOTdGRiIvPjxyZWN0IHg9IjI2IiB5PSI4IiB3aWR0aD0iMTgiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjNTlDMDU5Ii8+PHJlY3QgeD0iMTUiIHk9IjI2IiB3aWR0aD0iMTgiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjRkZBQjE5Ii8+PC9zdmc+";
24
+ readonly blockIconURI: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHJlY3QgeD0iNCIgeT0iOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjMyIiByeD0iNiIgZmlsbD0iIzhBNTVENyIvPjxwYXRoIGQ9Ik0xOSAxNWMtMyAwLTIgNy01IDkgMyAyIDIgOSA1IDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48cGF0aCBkPSJNMjkgMTVjMyAwIDIgNyA1IDktMyAyLTIgOS01IDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48Y2lyY2xlIGN4PSIyNCIgY3k9IjI0IiByPSIyLjIiIGZpbGw9IiNmZmYiLz48L3N2Zz4=";
25
25
  };
@@ -8,7 +8,7 @@ var extensionConfig = {
8
8
  license: "MPL-2.0",
9
9
  unsandboxed: true,
10
10
  docsURI: "https://kubohiroya.github.io/turbowarp-structured-data/",
11
- blockIconURI: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHJlY3QgeD0iNCIgeT0iOCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE0IiByeD0iMyIgZmlsbD0iIzRDOTdGRiIvPjxyZWN0IHg9IjI2IiB5PSI4IiB3aWR0aD0iMTgiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjNTlDMDU5Ii8+PHJlY3QgeD0iMTUiIHk9IjI2IiB3aWR0aD0iMTgiIGhlaWdodD0iMTQiIHJ4PSIzIiBmaWxsPSIjRkZBQjE5Ii8+PC9zdmc+"
11
+ blockIconURI: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+PHJlY3QgeD0iNCIgeT0iOCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjMyIiByeD0iNiIgZmlsbD0iIzhBNTVENyIvPjxwYXRoIGQ9Ik0xOSAxNWMtMyAwLTIgNy01IDkgMyAyIDIgOSA1IDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48cGF0aCBkPSJNMjkgMTVjMyAwIDIgNyA1IDktMyAyLTIgOS01IDkiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48Y2lyY2xlIGN4PSIyNCIgY3k9IjI0IiByPSIyLjIiIGZpbGw9IiNmZmYiLz48L3N2Zz4="
12
12
  };
13
13
  function canonicalBundle(ownerId, contractId, document, ownerSource) {
14
14
  const source = {
@@ -0,0 +1,7 @@
1
+ import { StructuredDataExtension } from './extension.js';
2
+ import type { ExtensionModuleMetadata, ScratchApi } from './runtime-api.js';
3
+ export type { TurboWarpExtension, ScratchTranslate, ScratchBlockUtility, ScratchApi, ExtensionModuleMetadata } from './runtime-api.js';
4
+ /** Static contract: importing this entry never creates or registers an extension. */
5
+ export declare const bundleModuleMetadata: ExtensionModuleMetadata;
6
+ /** The caller supplies the member host and owns registration and lifetime. */
7
+ export declare function createExtension(scratch: ScratchApi): StructuredDataExtension;