@cardenelabs/dragon 0.9.0 → 0.11.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/dist/index.cjs +33 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -9
- package/dist/index.d.ts +24 -9
- package/dist/index.js +33 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/compile.ts +30 -22
- package/src/index.ts +1 -1
- package/src/json-parser.ts +2 -3
- package/src/schemas/diagram.json +2 -2
- package/src/types.ts +5 -5
- package/src/v05/parser.ts +38 -5
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/dragon",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Dragon — Mermaid 感覚で animated SVG を生成する Text DSL。 cdl engine を内部利用。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "cardene777",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"prepublishOnly": "pnpm run typecheck && pnpm run test && pnpm run build"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@cardenelabs/cdl": "^0.
|
|
59
|
+
"@cardenelabs/cdl": "^0.13.1"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
62
|
"react": "^19.0.0",
|
package/src/compile.ts
CHANGED
|
@@ -560,10 +560,10 @@ function reportDocEyebrowNotHonored(doc: DslDocument, onNotice?: (n: CompileNoti
|
|
|
560
560
|
}
|
|
561
561
|
|
|
562
562
|
/**
|
|
563
|
-
*
|
|
563
|
+
* 起点から描く動きを持たない図種で段に `draw:` を書いた時に伝える (#1312 / #1318)。
|
|
564
564
|
*
|
|
565
|
-
*
|
|
566
|
-
*
|
|
565
|
+
* 対応する 8 図種以外では書いても何も起きないため、黙って捨てると
|
|
566
|
+
* 「書いたのに現れない」 が手掛かりなしで起きる。
|
|
567
567
|
*
|
|
568
568
|
* 段ごとに知らせる = 5 段のうち 1 段だけに書いた形で、どの段が効いていないかを読めるようにする。
|
|
569
569
|
*/
|
|
@@ -598,10 +598,10 @@ function reportDrawNotHonored(doc: DslDocument, onNotice?: (n: CompileNotice) =>
|
|
|
598
598
|
}
|
|
599
599
|
|
|
600
600
|
/**
|
|
601
|
-
* 段の `draw:` が効く図種 (#1312 / #1314)。
|
|
601
|
+
* 段の `draw:` が効く図種 (#1312 / #1314 / #1318)。
|
|
602
602
|
*
|
|
603
603
|
* **語と図種の対応表から導く** (`DRAW_TARGETS`)。 一覧を写すと、語を足した時に片方だけ
|
|
604
|
-
* 古いまま残る。 描画側 (`cdl` の `CdlPhase.draw`) が対応する
|
|
604
|
+
* 古いまま残る。 描画側 (`cdl` の `CdlPhase.draw`) が対応する 8 種と一致する。
|
|
605
605
|
*/
|
|
606
606
|
const DRAWABLE_DOC_TYPES: ReadonlySet<PresetType> = new Set<PresetType>(DRAW_TARGETS.values());
|
|
607
607
|
|
|
@@ -4645,7 +4645,9 @@ function compileTree(doc: DslDocument, onNotice?: (n: CompileNotice) => void): C
|
|
|
4645
4645
|
const data: NonNullable<CdlDiagram["nodes"][number]["treeData"]> = doc.actors.map((a) => {
|
|
4646
4646
|
const id = slugify(a.name);
|
|
4647
4647
|
const p3 = 親.get(id);
|
|
4648
|
-
|
|
4648
|
+
// 木も放射と同じく名前と補足を分けて渡す (#1332)。 分けないと補足が捨てられ、
|
|
4649
|
+
// 書いた文字が図に出ない
|
|
4650
|
+
return { id, ...放射に出す文字(a), ...(p3 !== undefined ? { parent: p3 } : {}) };
|
|
4649
4651
|
});
|
|
4650
4652
|
b.node(`${slugify(doc.title) || "tree"}-chart`, {
|
|
4651
4653
|
lane: "chart", stack: 0, kind: "tree-hierarchy", title: doc.title, ...図の小見出し(doc), w: W, h: H, treeData: data,
|
|
@@ -4997,14 +4999,13 @@ type 放射で描ける欄 =
|
|
|
4997
4999
|
/** 中心の名前 / 枝の名前になる */
|
|
4998
5000
|
| "name"
|
|
4999
5001
|
/**
|
|
5000
|
-
*
|
|
5002
|
+
* 名前とは分けて補足に出す 2 欄。
|
|
5001
5003
|
*
|
|
5002
5004
|
* `- 描く量を減らす: "{draw} ms"` の形は副題として解析されるため、 値の欄だけを見ると
|
|
5003
5005
|
* 記法で最も普通な書き方が届かない (#1230 で実測)。 明示的に書いた値の欄も同じ場所へ出す。
|
|
5004
5006
|
*
|
|
5005
|
-
*
|
|
5006
|
-
*
|
|
5007
|
-
* (`resolveMindData`)。 届ける先が他に無いため名前と同じ欄へ載せる。
|
|
5007
|
+
* 描画側は枝の `subtitle` と中心の `rootSubtitle` を名前とは別の行に描く。 2 欄を
|
|
5008
|
+
* `放射に出す文字` で 1 つの補足にまとめ、 名前とは分けて渡す。
|
|
5008
5009
|
*/
|
|
5009
5010
|
| "subtitle"
|
|
5010
5011
|
| "value"
|
|
@@ -5115,18 +5116,17 @@ function 放射で描けない欄を書いたか(a: DslActor, 欄: 放射で描
|
|
|
5115
5116
|
}
|
|
5116
5117
|
|
|
5117
5118
|
/**
|
|
5118
|
-
*
|
|
5119
|
+
* 放射と木の箱に出す名前と補足 (#1332)。
|
|
5119
5120
|
*
|
|
5120
|
-
*
|
|
5121
|
-
*
|
|
5121
|
+
* **連結しない**。 描画側は名前と補足を別々に受け取れば箱の中で 2 行に積む。 1 つの文字列に
|
|
5122
|
+
* すると 1 行に全部入り、箱幅を超えて末尾が切られる (実測 = 箱 120px に対し文字 163px)。
|
|
5122
5123
|
*
|
|
5123
|
-
*
|
|
5124
|
-
*
|
|
5125
|
-
* `title` と `rootTitle` に限る (`resolveMindData`)。 値を別の欄へ渡しても絵に出ない。
|
|
5124
|
+
* `subtitle` と `value` の両方が書かれた場合は空白で繋いで 1 つの補足にする。 描画側の
|
|
5125
|
+
* 補足は 1 行なので、2 つを別々の行にはできない。
|
|
5126
5126
|
*/
|
|
5127
|
-
function 放射に出す文字(a: DslActor): string {
|
|
5127
|
+
function 放射に出す文字(a: DslActor): { title: string; subtitle?: string } {
|
|
5128
5128
|
const 続き = [a.subtitle, a.value].map((x) => x?.trim()).filter((x): x is string => !!x);
|
|
5129
|
-
return 続き.length > 0 ?
|
|
5129
|
+
return { title: a.name, ...(続き.length > 0 ? { subtitle: 続き.join(" ") } : {}) };
|
|
5130
5130
|
}
|
|
5131
5131
|
|
|
5132
5132
|
function compileMind(doc: DslDocument, onNotice?: (n: CompileNotice) => void): CdlDiagram {
|
|
@@ -5246,7 +5246,7 @@ function compileMind(doc: DslDocument, onNotice?: (n: CompileNotice) => void): C
|
|
|
5246
5246
|
// 枝は色を持てる (`MindBranchNode.tone`)
|
|
5247
5247
|
branches.push({
|
|
5248
5248
|
id,
|
|
5249
|
-
|
|
5249
|
+
...放射に出す文字(a),
|
|
5250
5250
|
parent: 親.get(id) ?? rootId,
|
|
5251
5251
|
...(a.tone ? { tone: a.tone } : {}),
|
|
5252
5252
|
});
|
|
@@ -5269,7 +5269,15 @@ function compileMind(doc: DslDocument, onNotice?: (n: CompileNotice) => void): C
|
|
|
5269
5269
|
...図の小見出し(doc),
|
|
5270
5270
|
w: W,
|
|
5271
5271
|
h: H,
|
|
5272
|
-
mindData:
|
|
5272
|
+
mindData: (() => {
|
|
5273
|
+
const 中心 = 放射に出す文字(root);
|
|
5274
|
+
return {
|
|
5275
|
+
rootId,
|
|
5276
|
+
rootTitle: 中心.title,
|
|
5277
|
+
...(中心.subtitle === undefined ? {} : { rootSubtitle: 中心.subtitle }),
|
|
5278
|
+
branches,
|
|
5279
|
+
};
|
|
5280
|
+
})(),
|
|
5273
5281
|
});
|
|
5274
5282
|
return b.build();
|
|
5275
5283
|
}
|
|
@@ -5615,8 +5623,8 @@ function injectPhasesFallback(diagram: CdlDiagram, doc: DslDocument): void {
|
|
|
5615
5623
|
// phase 注入。 CdlPhase.tweens[].stateId / sets[].stateId で state 参照 (state ではない)。
|
|
5616
5624
|
for (const p of doc.animate.phases) {
|
|
5617
5625
|
const activateIds: string[] = [...resolveIds(p.highlight ?? [])];
|
|
5618
|
-
// `draw
|
|
5619
|
-
//
|
|
5626
|
+
// `draw:` を描画側の欄へ写す (#1312 / #1314 / #1318)。 相手は 1 箱で図全体を描く
|
|
5627
|
+
// 対象 8 種の箱で、必ず 1 つに決まるため名前を書かせずに引ける。
|
|
5620
5628
|
//
|
|
5621
5629
|
// **`activate` と兼ねない**。 描画側は焦点と別集合で持つ (`cdl#512`) = 焦点が当たり
|
|
5622
5630
|
// 続ける図で毎段引き直しになるため。 書いた段だけが欄を持つ
|
package/src/index.ts
CHANGED
|
@@ -13,7 +13,7 @@ export { compileToCdl } from "./compile";
|
|
|
13
13
|
export type { CompileNotice } from "./compile";
|
|
14
14
|
export { parseTextDslV05 } from "./v05";
|
|
15
15
|
// 記法一覧が「実際に受け付ける値」 を実装から引くための公開。 手書きすると説明と実装がずれる。
|
|
16
|
-
export { DRAW_TARGETS, DRAW_WORDS, PRESET_TYPES, TOP_LEVEL_KEYS } from "./v05/parser";
|
|
16
|
+
export { DRAW_TARGETS, DRAW_WORDS, PHASE_ITEM_WORDS, PRESET_TYPES, TOP_LEVEL_KEYS } from "./v05/parser";
|
|
17
17
|
export { TONE_ALIAS, NODE_KIND_ALIAS } from "./keywords";
|
|
18
18
|
export { lintDiagram, autoFix } from "./notation-lint";
|
|
19
19
|
export type { LintIssue, LintReport, LintSeverity } from "./notation-lint";
|
package/src/json-parser.ts
CHANGED
|
@@ -268,10 +268,9 @@ export interface JsonPhase {
|
|
|
268
268
|
/** badge label */
|
|
269
269
|
badge?: string;
|
|
270
270
|
/**
|
|
271
|
-
*
|
|
271
|
+
* その段で起点から描くもの (#1312 / #1314 / #1318)。 記法の `draw:` と同じ。
|
|
272
272
|
*
|
|
273
|
-
*
|
|
274
|
-
* 右へ伸びる。
|
|
273
|
+
* 受ける 8 語は `DRAW_WORDS` が持つ。 語と同じ図種で、その段の間に図が起点から現れる。
|
|
275
274
|
*/
|
|
276
275
|
draw?: string;
|
|
277
276
|
/**
|
package/src/schemas/diagram.json
CHANGED
|
@@ -373,8 +373,8 @@
|
|
|
373
373
|
},
|
|
374
374
|
"draw": {
|
|
375
375
|
"type": "string",
|
|
376
|
-
"enum": ["line", "bar", "pie"],
|
|
377
|
-
"description": "この phase で起点から描くもの。 語は図種と揃える。 line =
|
|
376
|
+
"enum": ["line", "bar", "pie", "journey", "mind", "tree", "gantt", "funnel"],
|
|
377
|
+
"description": "この phase で起点から描くもの。 語は図種と揃える。 line / journey = 線が左端から右へ伸びる / bar = 棒が横軸から上へ伸びる / pie = 扇が 12 時から時計回りに開く / mind = 枝が中心から外へ伸びる / tree = 枝が根から下へ伸びる / gantt = 帯が各始端から右へ伸びる / funnel = 段が上端から順に積まれる"
|
|
378
378
|
},
|
|
379
379
|
"tween": {
|
|
380
380
|
"type": "object",
|
package/src/types.ts
CHANGED
|
@@ -394,15 +394,15 @@ export type DslPhase = {
|
|
|
394
394
|
body?: string;
|
|
395
395
|
badge?: string;
|
|
396
396
|
/**
|
|
397
|
-
*
|
|
397
|
+
* その段で起点から描くもの (#1312 / #1314 / #1318)。
|
|
398
398
|
*
|
|
399
|
-
*
|
|
400
|
-
*
|
|
399
|
+
* 受ける語は `line` / `bar` / `pie` / `journey` / `mind` / `tree` / `gantt` / `funnel`。
|
|
400
|
+
* 語と同じ図種で、その段の間に線・棒・扇・枝・帯・段が各図の起点から現れる。
|
|
401
401
|
*
|
|
402
402
|
* **最上位ではなく段に置く**。 記法は動き (`tween` / `set` / `focus` / `badge`) を段に、
|
|
403
|
-
* 静的な性質 (`eyebrow` / `axes`) を最上位に書く分け方を既に持つ。
|
|
403
|
+
* 静的な性質 (`eyebrow` / `axes`) を最上位に書く分け方を既に持つ。 起点から描くのは動き。
|
|
404
404
|
*
|
|
405
|
-
* 相手の名前は書かせない =
|
|
405
|
+
* 相手の名前は書かせない = 対象の 8 図種はいずれも図全体を 1 箱で描くため相手が決まる。
|
|
406
406
|
*/
|
|
407
407
|
draw?: string;
|
|
408
408
|
/**
|
package/src/v05/parser.ts
CHANGED
|
@@ -2174,6 +2174,18 @@ function ensureAnimate(a: DslAnimate | undefined, lineNo: number): DslAnimate {
|
|
|
2174
2174
|
return { states: [], phases: [], pos: { line: lineNo } };
|
|
2175
2175
|
}
|
|
2176
2176
|
|
|
2177
|
+
/**
|
|
2178
|
+
* 段に書ける項目の英語名。 `parsePhase` が受け付ける名前の入口でも使う。
|
|
2179
|
+
*
|
|
2180
|
+
* 誤りの案内で使うほか、**見本が値の名前にこの語を使っていないか** を見るのにも使う
|
|
2181
|
+
* (#1330)。 段の項目と値は階層が違うので衝突しないが、同じ語が 2 つの意味で並ぶと
|
|
2182
|
+
* 見本を読む人が階層から意味を判断することになる。
|
|
2183
|
+
*/
|
|
2184
|
+
export const PHASE_ITEM_WORDS = ["focus", "badge", "body", "description", "tween", "set", "draw"] as const;
|
|
2185
|
+
|
|
2186
|
+
const 段の項目の英語 = PHASE_ITEM_WORDS;
|
|
2187
|
+
const 段の項目の集合: ReadonlySet<string> = new Set(PHASE_ITEM_WORDS);
|
|
2188
|
+
|
|
2177
2189
|
function parsePhase(block: Line[], errors: DslError[]): DslPhase | null {
|
|
2178
2190
|
// block[0]!: `step: "request" 1.5s`
|
|
2179
2191
|
const head = block[0]!;
|
|
@@ -2220,6 +2232,17 @@ function parsePhase(block: Line[], errors: DslError[]): DslPhase | null {
|
|
|
2220
2232
|
}
|
|
2221
2233
|
const key = (propMatch[1] ?? "").toLowerCase();
|
|
2222
2234
|
const value = (propMatch[2] ?? "").trim();
|
|
2235
|
+
// 一覧を parse の入口にも使う。 分岐だけを増やして一覧を更新し忘れると、見本の名前との
|
|
2236
|
+
// 重なり検査が新しい項目を見落とすため、一覧にない語は各分岐へ到達させない。
|
|
2237
|
+
if (!段の項目の集合.has(key)) {
|
|
2238
|
+
errors.push({
|
|
2239
|
+
line: ln.no,
|
|
2240
|
+
message: `段の項目名が読めません: "${propMatch[1] ?? ""}"`,
|
|
2241
|
+
hint: 段の項目のヒント(propMatch[1] ?? ""),
|
|
2242
|
+
});
|
|
2243
|
+
i += 1;
|
|
2244
|
+
continue;
|
|
2245
|
+
}
|
|
2223
2246
|
if (key === "focus") {
|
|
2224
2247
|
phase.highlight = parseFocusList(value);
|
|
2225
2248
|
i += 1;
|
|
@@ -2304,8 +2327,8 @@ function parsePhase(block: Line[], errors: DslError[]): DslPhase | null {
|
|
|
2304
2327
|
i = j;
|
|
2305
2328
|
continue;
|
|
2306
2329
|
}
|
|
2307
|
-
//
|
|
2308
|
-
//
|
|
2330
|
+
// ここに来るのは一覧へ語を足したのに処理分岐を足していない時だけ。 黙って捨てると
|
|
2331
|
+
// 「一覧にはあるのに段が変わらない」 が手掛かりなしで起きる。
|
|
2309
2332
|
errors.push({
|
|
2310
2333
|
line: ln.no,
|
|
2311
2334
|
message: `段の項目名が読めません: "${propMatch[1] ?? ""}"`,
|
|
@@ -2329,9 +2352,6 @@ function 段の項目のヒント(書いた名前: string): string {
|
|
|
2329
2352
|
: `使える項目 = ${段の項目の英語.join(", ")}`;
|
|
2330
2353
|
}
|
|
2331
2354
|
|
|
2332
|
-
/** 段に書ける項目の英語名。 `parsePhase` の分岐から導く一覧 */
|
|
2333
|
-
const 段の項目の英語 = ["focus", "badge", "body", "description", "tween", "set", "draw"] as const;
|
|
2334
|
-
|
|
2335
2355
|
/**
|
|
2336
2356
|
* `draw:` に書ける語と、その語が効く図種 (#1312 / #1314)。
|
|
2337
2357
|
*
|
|
@@ -2344,6 +2364,14 @@ const 段の項目の英語 = ["focus", "badge", "body", "description", "tween",
|
|
|
2344
2364
|
* | `line` | `line` | 左端から右へ線が伸びる |
|
|
2345
2365
|
* | `bar` | `bar` | 横軸から上へ棒が伸びる |
|
|
2346
2366
|
* | `pie` | `pie` | 12 時から時計回りに扇が開く |
|
|
2367
|
+
* | `journey` | `journey` | 左端から右へ気持ちの線が伸びる |
|
|
2368
|
+
* | `mind` | `mind` | 中心から外へ枝が伸びる |
|
|
2369
|
+
* | `tree` | `tree` | 根から下へ枝が伸びる |
|
|
2370
|
+
* | `gantt` | `gantt` | 各帯の始端から右へ帯が伸びる |
|
|
2371
|
+
* | `funnel` | `funnel` | 上端から順に段が積まれる |
|
|
2372
|
+
*
|
|
2373
|
+
* `quadrant` は入れない。 4 つの区画に項目を置く図で **項目に順序が無く**、起点を決められない
|
|
2374
|
+
* (順番を書いた順で決めると、動きが図の意味を持たない)。
|
|
2347
2375
|
*
|
|
2348
2376
|
* いまは語と図種が同じ綴りだが、**同じものとして扱わない**。 語は書き手が書く名前で、
|
|
2349
2377
|
* 図種は `type:` が取る値。 片方だけ別名を足したくなった時に、対応が表に残っている形にする。
|
|
@@ -2352,6 +2380,11 @@ export const DRAW_TARGETS: ReadonlyMap<string, PresetType> = new Map<string, Pre
|
|
|
2352
2380
|
["line", "line"],
|
|
2353
2381
|
["bar", "bar"],
|
|
2354
2382
|
["pie", "pie"],
|
|
2383
|
+
["journey", "journey"],
|
|
2384
|
+
["mind", "mind"],
|
|
2385
|
+
["tree", "tree"],
|
|
2386
|
+
["gantt", "gantt"],
|
|
2387
|
+
["funnel", "funnel"],
|
|
2355
2388
|
]);
|
|
2356
2389
|
|
|
2357
2390
|
/** `draw:` に書ける語。 表から導く (#1314) */
|