@cardenelabs/dragon 0.15.0 → 0.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/README.md +10 -0
- package/dist/index.cjs +628 -379
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +217 -7
- package/dist/index.d.ts +217 -7
- package/dist/index.js +629 -381
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/compile.ts +567 -725
- package/src/index.ts +1 -0
- package/src/json-parser.ts +145 -2
- package/src/schemas/diagram.json +74 -3
- package/src/tokenize.ts +5 -5
- package/src/types.ts +84 -1
- package/src/v05/parser.ts +216 -6
package/src/index.ts
CHANGED
package/src/json-parser.ts
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
import {
|
|
22
22
|
DRAW_WORDS,
|
|
23
23
|
EDGE_SIDE_VALUES,
|
|
24
|
+
EDGE_HEAD_VALUES,
|
|
24
25
|
NODE_KIND_VALID,
|
|
25
26
|
PRESET_TYPES,
|
|
26
27
|
STYLE_VALID,
|
|
@@ -36,7 +37,17 @@ import {
|
|
|
36
37
|
type 図形の定義,
|
|
37
38
|
} from "./v05/parser";
|
|
38
39
|
import type { CompileToCdlOpts } from "./compile";
|
|
39
|
-
import type {
|
|
40
|
+
import type {
|
|
41
|
+
CdlDiagram,
|
|
42
|
+
NodeKind,
|
|
43
|
+
Tone,
|
|
44
|
+
EdgeStyle,
|
|
45
|
+
EdgeHead,
|
|
46
|
+
EdgeHeadFill,
|
|
47
|
+
EdgeReveal,
|
|
48
|
+
ClassRelationType,
|
|
49
|
+
SequenceMessageKind,
|
|
50
|
+
} from "@cardenelabs/cdl";
|
|
40
51
|
import { extractIdentifiers, parseFormula } from "@cardenelabs/cdl";
|
|
41
52
|
import type {
|
|
42
53
|
DslDocument,
|
|
@@ -172,6 +183,10 @@ export interface DragonJson {
|
|
|
172
183
|
lanes: string[];
|
|
173
184
|
}
|
|
174
185
|
>;
|
|
186
|
+
/** 順序図で面が動いている間の帯 (#1466)。 記法の最上位 `bands:` と同じ */
|
|
187
|
+
bands?: { actor: string; from: number; to: number }[];
|
|
188
|
+
/** 矢印をいつ出すか (#1470)。 記法の最上位 `reveal:` と同じ */
|
|
189
|
+
reveal?: EdgeReveal;
|
|
175
190
|
}
|
|
176
191
|
|
|
177
192
|
export interface JsonActor {
|
|
@@ -212,6 +227,13 @@ export interface JsonActor {
|
|
|
212
227
|
subtitle?: string;
|
|
213
228
|
eyebrow?: string;
|
|
214
229
|
value?: string;
|
|
230
|
+
/**
|
|
231
|
+
* 前の時点の値 (#1450)。 記法の `{ value: "320", previous: "280" }` と同じ。
|
|
232
|
+
*
|
|
233
|
+
* 内訳の変化を帯で示す図 (`type: stacked`) が 2 本目の帯として描き、
|
|
234
|
+
* 値 1 つを大きく示す図 (`type: stat`) が差として出す。 書かない図は 1 本のまま。
|
|
235
|
+
*/
|
|
236
|
+
previous?: string;
|
|
215
237
|
rows?: string[];
|
|
216
238
|
lane?: string;
|
|
217
239
|
stack?: number;
|
|
@@ -287,6 +309,8 @@ export interface JsonActor {
|
|
|
287
309
|
* 読めない項目名として知らせる)。
|
|
288
310
|
*/
|
|
289
311
|
scale?: number;
|
|
312
|
+
/** 行頭の印 (#1466)。 行と対で読む。 語の意味は図の種類が決める */
|
|
313
|
+
marks?: string[];
|
|
290
314
|
}
|
|
291
315
|
|
|
292
316
|
/** 2 軸で仕分ける図の軸の名前 (#1294)。 記法の `axes:` と同じ形 */
|
|
@@ -310,6 +334,21 @@ export interface JsonStep {
|
|
|
310
334
|
sub?: string;
|
|
311
335
|
/** 矢印がどの辺から出るか (#1385)。 記法の `side:` と同じ */
|
|
312
336
|
side?: "top" | "right" | "bottom" | "left";
|
|
337
|
+
/**
|
|
338
|
+
* 矢印の先の形 (#1462)。 記法の `{ head: triangle }` と同じ。
|
|
339
|
+
*
|
|
340
|
+
* 三角 (継ぐ) / 菱 (持つ) / 開いた矢 (使う) / 鳥の足 (多)。
|
|
341
|
+
* 書かなければ従来どおり塗った三角になる。
|
|
342
|
+
*/
|
|
343
|
+
head?: EdgeHead;
|
|
344
|
+
/** 出どころ側の端の形と、両端の塗り (#1466)。 記法の `{ tailHead: diamond }` 等と同じ */
|
|
345
|
+
tailHead?: EdgeHead;
|
|
346
|
+
headFill?: EdgeHeadFill;
|
|
347
|
+
tailHeadFill?: EdgeHeadFill;
|
|
348
|
+
/** クラス図の関係の語 (#1466)。 書くと端の形 / 塗り / 線種がまとめて決まる */
|
|
349
|
+
relation?: ClassRelationType;
|
|
350
|
+
/** 順序図の言づての種類 (#1466)。 `call` / `return` / `fire` */
|
|
351
|
+
kind?: SequenceMessageKind;
|
|
313
352
|
/**
|
|
314
353
|
* 矢印の色 (#1304)。 記法の `(成功)` と同じく別名 (`成功` / `neutral` 等) も受ける。
|
|
315
354
|
*
|
|
@@ -354,6 +393,13 @@ export interface JsonPhase {
|
|
|
354
393
|
* 受ける 8 語は `DRAW_WORDS` が持つ。 語と同じ図種で、その段の間に図が起点から現れる。
|
|
355
394
|
*/
|
|
356
395
|
draw?: string;
|
|
396
|
+
/**
|
|
397
|
+
* 描き終えるまでに段の何割を使うか (#1441)。 記法の `draw: line 0.4` の後半と同じ。
|
|
398
|
+
*
|
|
399
|
+
* 0 より大きく 1 以下。 書かなければ段の終わりに描き終わる。 `draw` が無い段に書いても
|
|
400
|
+
* 何も起きない (描く相手が決まらないため、写す時に外す)。
|
|
401
|
+
*/
|
|
402
|
+
drawRatio?: number;
|
|
357
403
|
/**
|
|
358
404
|
* 段の中で値を動かす (#1186)。 記法の `tween: name 100 -> 90` と同じ。
|
|
359
405
|
*
|
|
@@ -437,6 +483,10 @@ export const ACCEPTED_KEYS = {
|
|
|
437
483
|
// 押下などの出来事で動く仕掛けと、巻き上げに応じて進む値 (#1393)
|
|
438
484
|
"events",
|
|
439
485
|
"scrolls",
|
|
486
|
+
// 順序図で面が動いている間の帯 (#1466)
|
|
487
|
+
"bands",
|
|
488
|
+
// 矢印をいつ出すか (#1470)
|
|
489
|
+
"reveal",
|
|
440
490
|
],
|
|
441
491
|
actor: [
|
|
442
492
|
"name",
|
|
@@ -444,6 +494,8 @@ export const ACCEPTED_KEYS = {
|
|
|
444
494
|
"subtitle",
|
|
445
495
|
"eyebrow",
|
|
446
496
|
"value",
|
|
497
|
+
// 前の時点の値 (#1450)。 内訳の変化を帯で示す図と、値 1 つを大きく示す図が読む
|
|
498
|
+
"previous",
|
|
447
499
|
"rows",
|
|
448
500
|
"lane",
|
|
449
501
|
"stack",
|
|
@@ -475,6 +527,8 @@ export const ACCEPTED_KEYS = {
|
|
|
475
527
|
"opacity",
|
|
476
528
|
"renderOffsetX",
|
|
477
529
|
"renderOffsetY",
|
|
530
|
+
// 行頭の印 (#1466)。 行ごとに 1 つ、図の種類ごとの語で書く
|
|
531
|
+
"marks",
|
|
478
532
|
],
|
|
479
533
|
step: [
|
|
480
534
|
"from",
|
|
@@ -483,6 +537,14 @@ export const ACCEPTED_KEYS = {
|
|
|
483
537
|
"sub",
|
|
484
538
|
// 矢印がどの辺から出るか (#1385)
|
|
485
539
|
"side",
|
|
540
|
+
// 矢印の先の形 (#1462)
|
|
541
|
+
"head",
|
|
542
|
+
// 端の印の残り 3 欄と、関係の語 / 言づての種類 (#1466)
|
|
543
|
+
"tailHead",
|
|
544
|
+
"headFill",
|
|
545
|
+
"tailHeadFill",
|
|
546
|
+
"relation",
|
|
547
|
+
"kind",
|
|
486
548
|
"tone",
|
|
487
549
|
"style",
|
|
488
550
|
"guard",
|
|
@@ -496,7 +558,7 @@ export const ACCEPTED_KEYS = {
|
|
|
496
558
|
"overlay",
|
|
497
559
|
"pos",
|
|
498
560
|
],
|
|
499
|
-
phase: ["step", "duration", "focus", "body", "badge", "tween", "set", "draw"],
|
|
561
|
+
phase: ["step", "duration", "focus", "body", "badge", "tween", "set", "draw", "drawRatio"],
|
|
500
562
|
viewport: ["width", "height", "scale", "laneWidth", "gap", "laneGap", "nodeGap", "labelMargin"],
|
|
501
563
|
lane: ["x", "width", "label", "contain", "lifeline", "pos"],
|
|
502
564
|
group: ["label", "lanes"],
|
|
@@ -545,6 +607,7 @@ export type 欄の型 =
|
|
|
545
607
|
| "色"
|
|
546
608
|
| "線種"
|
|
547
609
|
| "辺"
|
|
610
|
+
| "端の形"
|
|
548
611
|
| "色か色番号"
|
|
549
612
|
| "描くもの"
|
|
550
613
|
| "必須の図種"
|
|
@@ -576,6 +639,10 @@ export const 欄の型表 = {
|
|
|
576
639
|
// 押下と巻き上げ (#1393)。 中身は下の検査が 1 件ずつ見る
|
|
577
640
|
events: "並び",
|
|
578
641
|
scrolls: "object",
|
|
642
|
+
// 順序図で面が動いている間の帯 (#1466)
|
|
643
|
+
bands: "並び",
|
|
644
|
+
// 矢印をいつ出すか (#1470)
|
|
645
|
+
reveal: "非空の文字列",
|
|
579
646
|
},
|
|
580
647
|
actor: {
|
|
581
648
|
name: "必須の非空文字列",
|
|
@@ -583,6 +650,7 @@ export const 欄の型表 = {
|
|
|
583
650
|
subtitle: "文字列",
|
|
584
651
|
eyebrow: "文字列",
|
|
585
652
|
value: "文字列",
|
|
653
|
+
previous: "文字列",
|
|
586
654
|
rows: "文字列の並び",
|
|
587
655
|
lane: "文字列",
|
|
588
656
|
stack: "数",
|
|
@@ -614,6 +682,8 @@ export const 欄の型表 = {
|
|
|
614
682
|
opacity: "数か文字列",
|
|
615
683
|
renderOffsetX: "数か文字列",
|
|
616
684
|
renderOffsetY: "数か文字列",
|
|
685
|
+
// 行頭の印 (#1466)
|
|
686
|
+
marks: "文字列の並び",
|
|
617
687
|
},
|
|
618
688
|
step: {
|
|
619
689
|
from: "必須の文字列",
|
|
@@ -622,6 +692,13 @@ export const 欄の型表 = {
|
|
|
622
692
|
sub: "文字列",
|
|
623
693
|
// 矢印がどの辺から出るか (#1385)
|
|
624
694
|
side: "辺",
|
|
695
|
+
head: "端の形",
|
|
696
|
+
// 端の印の残り 3 欄と、関係の語 / 言づての種類 (#1466)
|
|
697
|
+
tailHead: "端の形",
|
|
698
|
+
headFill: "非空の文字列",
|
|
699
|
+
tailHeadFill: "非空の文字列",
|
|
700
|
+
relation: "非空の文字列",
|
|
701
|
+
kind: "非空の文字列",
|
|
625
702
|
tone: "色",
|
|
626
703
|
style: "線種",
|
|
627
704
|
guard: "文字列",
|
|
@@ -644,6 +721,7 @@ export const 欄の型表 = {
|
|
|
644
721
|
tween: "object",
|
|
645
722
|
set: "object",
|
|
646
723
|
draw: "描くもの",
|
|
724
|
+
drawRatio: "数",
|
|
647
725
|
},
|
|
648
726
|
viewport: {
|
|
649
727
|
width: "数",
|
|
@@ -872,6 +950,18 @@ function 値を検査(
|
|
|
872
950
|
});
|
|
873
951
|
}
|
|
874
952
|
return;
|
|
953
|
+
case "端の形":
|
|
954
|
+
if (v === undefined) return;
|
|
955
|
+
// 受ける語は記法と同じ一覧を見る (`EDGE_HEAD_VALUES`)。 写すと描画側が形を増やした時に
|
|
956
|
+
// 片方だけ古くなる
|
|
957
|
+
if (typeof v !== "string" || !EDGE_HEAD_VALUES.includes(v)) {
|
|
958
|
+
errors.push({
|
|
959
|
+
path,
|
|
960
|
+
message: `${名前} must be one of: ${EDGE_HEAD_VALUES.join(", ")}`,
|
|
961
|
+
hint: typeof v === "string" ? `got "${v}"` : `got ${typeof v}`,
|
|
962
|
+
});
|
|
963
|
+
}
|
|
964
|
+
return;
|
|
875
965
|
case "描くもの":
|
|
876
966
|
if (v === undefined) return;
|
|
877
967
|
// 受ける語は記法と同じ一覧を見る (`DRAW_WORDS`)。 写すと語が増えた時に片方だけ古くなる
|
|
@@ -1184,6 +1274,40 @@ function 表で中身を検査する(
|
|
|
1184
1274
|
* 委ねる作りなので (`checkFieldType` の `case "並び"`)、ここで見ないと `readouts: 1` が
|
|
1185
1275
|
* 素通りする。
|
|
1186
1276
|
*/
|
|
1277
|
+
/**
|
|
1278
|
+
* 順序図の帯の並びを検査する (#1466)。
|
|
1279
|
+
*
|
|
1280
|
+
* **外側の形もここで見る**。 `欄の型表` は「並び」 とだけ宣言し、中身の検査は専用の検査に
|
|
1281
|
+
* 委ねる作りなので、ここで見ないと `bands: 1` が素通りする。
|
|
1282
|
+
*/
|
|
1283
|
+
function validateBands(v: unknown, errors: JsonDslError[]): void {
|
|
1284
|
+
if (v === undefined) return;
|
|
1285
|
+
if (!Array.isArray(v)) {
|
|
1286
|
+
errors.push({
|
|
1287
|
+
path: "$.bands",
|
|
1288
|
+
message: "bands must be an array of band objects",
|
|
1289
|
+
hint: `got ${v === null ? "null" : typeof v}`,
|
|
1290
|
+
});
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1293
|
+
v.forEach((b, i) => {
|
|
1294
|
+
const path = `$.bands[${i}]`;
|
|
1295
|
+
if (typeof b !== "object" || b === null || Array.isArray(b)) {
|
|
1296
|
+
errors.push({ path, message: "band must be an object", hint: "{ actor, from, to } の形で書く" });
|
|
1297
|
+
return;
|
|
1298
|
+
}
|
|
1299
|
+
const o = b as Record<string, unknown>;
|
|
1300
|
+
if (typeof o.actor !== "string" || o.actor === "") {
|
|
1301
|
+
errors.push({ path: `${path}.actor`, message: "band.actor must be a non-empty string" });
|
|
1302
|
+
}
|
|
1303
|
+
for (const k of ["from", "to"] as const) {
|
|
1304
|
+
if (typeof o[k] !== "number" || !Number.isInteger(o[k]) || (o[k] as number) < 0) {
|
|
1305
|
+
errors.push({ path: `${path}.${k}`, message: `band.${k} must be a non-negative integer` });
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
});
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1187
1311
|
function validateReadouts(v: unknown, errors: JsonDslError[]): void {
|
|
1188
1312
|
if (v === undefined) return;
|
|
1189
1313
|
if (!Array.isArray(v)) {
|
|
@@ -1861,6 +1985,7 @@ function validateJson(
|
|
|
1861
1985
|
checkUnknownKeys(j, "root", "$", errors);
|
|
1862
1986
|
// 値を見せる部品の中身を、記法と同じ表で見る (#1374)
|
|
1863
1987
|
validateReadouts(j.readouts, errors);
|
|
1988
|
+
validateBands(j.bands, errors);
|
|
1864
1989
|
// 読む人が動かすつまみの中身も、記法と同じ表で見る (#1389)
|
|
1865
1990
|
validateInputs(j.inputs, errors);
|
|
1866
1991
|
// 式は描画側の parser に通す (#1391)
|
|
@@ -2161,7 +2286,10 @@ export function jsonToDoc(json: DragonJson): DslDocument {
|
|
|
2161
2286
|
subtitle: a.subtitle,
|
|
2162
2287
|
eyebrow: a.eyebrow,
|
|
2163
2288
|
value: a.value,
|
|
2289
|
+
previous: a.previous,
|
|
2164
2290
|
rows: a.rows,
|
|
2291
|
+
// 行頭の印 (#1466)。 行と対で読む
|
|
2292
|
+
marks: a.marks,
|
|
2165
2293
|
lane: a.lane,
|
|
2166
2294
|
stack: a.stack,
|
|
2167
2295
|
initial: a.initial,
|
|
@@ -2221,6 +2349,14 @@ export function jsonToDoc(json: DragonJson): DslDocument {
|
|
|
2221
2349
|
label: s.label,
|
|
2222
2350
|
sub: s.sub,
|
|
2223
2351
|
side: s.side as "top" | "right" | "bottom" | "left" | undefined,
|
|
2352
|
+
// 矢印の先の形 (#1462)。 読めない語は組み立てが落とす
|
|
2353
|
+
head: s.head,
|
|
2354
|
+
// 端の印の残り 3 欄と、関係の語 / 言づての種類 (#1466)
|
|
2355
|
+
tailHead: s.tailHead,
|
|
2356
|
+
headFill: s.headFill,
|
|
2357
|
+
tailHeadFill: s.tailHeadFill,
|
|
2358
|
+
relation: s.relation,
|
|
2359
|
+
msgKind: s.kind,
|
|
2224
2360
|
// 箱と同じ読み替えを通す (#1304)。 通さないと `tone: "成功"` が色名として解決されないまま
|
|
2225
2361
|
// 図に届き、同じ値が箱では色になり矢印では色にならない
|
|
2226
2362
|
tone: resolveTone(s.tone),
|
|
@@ -2286,6 +2422,9 @@ export function jsonToDoc(json: DragonJson): DslDocument {
|
|
|
2286
2422
|
badge: p.badge,
|
|
2287
2423
|
// 書いた段だけが欄を持つ。 空文字を置くと「書いた」 と「書いていない」 が同じ形になる
|
|
2288
2424
|
...(p.draw !== undefined ? { draw: p.draw, drawPos: p0 } : {}),
|
|
2425
|
+
// 割合は `draw` がある段にだけ写す。 単独で書いても描く相手が決まらず何も起きないので、
|
|
2426
|
+
// 記法側 (同じ行に書かせる形) と同じ状態に揃える
|
|
2427
|
+
...(p.draw !== undefined && p.drawRatio !== undefined ? { drawRatio: p.drawRatio } : {}),
|
|
2289
2428
|
// 段の中で動かす分 (#1186)。 記法側の `tweens` / `sets` と同じ形に写す。
|
|
2290
2429
|
// 空の配列を置かないのは、記法側が「無ければ field ごと持たない」 形だから
|
|
2291
2430
|
...(p.tween && Object.keys(p.tween).length > 0
|
|
@@ -2351,6 +2490,10 @@ export function jsonToDoc(json: DragonJson): DslDocument {
|
|
|
2351
2490
|
formulas,
|
|
2352
2491
|
events,
|
|
2353
2492
|
scrolls,
|
|
2493
|
+
// 順序図で面が動いている間の帯 (#1466)
|
|
2494
|
+
bands: json.bands,
|
|
2495
|
+
// 矢印をいつ出すか (#1470)
|
|
2496
|
+
reveal: json.reveal,
|
|
2354
2497
|
pos: p0,
|
|
2355
2498
|
};
|
|
2356
2499
|
}
|
package/src/schemas/diagram.json
CHANGED
|
@@ -27,6 +27,11 @@
|
|
|
27
27
|
"pie",
|
|
28
28
|
"bar",
|
|
29
29
|
"line",
|
|
30
|
+
"gauge",
|
|
31
|
+
"radial",
|
|
32
|
+
"stat",
|
|
33
|
+
"waffle",
|
|
34
|
+
"stacked",
|
|
30
35
|
"funnel",
|
|
31
36
|
"tree",
|
|
32
37
|
"journey",
|
|
@@ -34,11 +39,11 @@
|
|
|
34
39
|
"c4",
|
|
35
40
|
"mind"
|
|
36
41
|
],
|
|
37
|
-
"description": "図の種類。 型ごとに actors の書き方が違う。 [関係を描く] sequence (時系列の呼び出し) / flow (処理の流れ) / swimlane (責務ごとの流れ) / er (DB の schema) / state (状態の遷移) / topology (network) / solidity (contract) / class (UML の class) / c4 (architecture) / mind (発想の枝分かれ) は actors に名前を並べ flow に矢印を書く。 [値を描く] pie (割合) / bar (棒の高さ) / line (線の高さ、 書いた順に並ぶ) は actors に `- 名前: \"45\"` の形で数を書く。 funnel (段ごとに減る数) も同じ形。 [語を描く] journey (体験の起伏) は `- 登録: \"不満\"` の形で 最高 / 満足 / 普通 / 不満 / 怒り のどれかを書く。 quadrant (2 軸の仕分け) は `- 重複削除: \"左上\"` の形で 左上 / 右上 / 左下 / 右下 のどれかを書く。 [時期を描く] gantt (工程の並び) は `- 設計: \"1月\"` の形で始まりの時期を書き、 flow の矢印で前後関係を書く。 [親子を描く] tree (親子の入れ子) は actors に名前を並べ flow の矢印で親子を書く (矢印の先が子)"
|
|
42
|
+
"description": "図の種類。 型ごとに actors の書き方が違う。 [関係を描く] sequence (時系列の呼び出し) / flow (処理の流れ) / swimlane (責務ごとの流れ) / er (DB の schema) / state (状態の遷移) / topology (network) / solidity (contract) / class (UML の class) / c4 (architecture) / mind (発想の枝分かれ) は actors に名前を並べ flow に矢印を書く。 [値を描く] pie (割合) / bar (棒の高さ) / line (線の高さ、 書いた順に並ぶ) / gauge (合計を半円で示す) / radial (弧の長さで比べる) / stat (値 1 つを大きく示す) / waffle (割合を 100 個の印で示す) / stacked (内訳を帯で示す) は actors に `- 名前: \"45\"` の形で数を書く。 stat と stacked は `- 名前: { value: \"320\", previous: \"280\" }` の形で前の時点の値も書ける。 funnel (段ごとに減る数) も同じ形。 [語を描く] journey (体験の起伏) は `- 登録: \"不満\"` の形で 最高 / 満足 / 普通 / 不満 / 怒り のどれかを書く。 quadrant (2 軸の仕分け) は `- 重複削除: \"左上\"` の形で 左上 / 右上 / 左下 / 右下 のどれかを書く。 [時期を描く] gantt (工程の並び) は `- 設計: \"1月\"` の形で始まりの時期を書き、 flow の矢印で前後関係を書く。 [親子を描く] tree (親子の入れ子) は actors に名前を並べ flow の矢印で親子を書く (矢印の先が子)"
|
|
38
43
|
},
|
|
39
44
|
"eyebrow": {
|
|
40
45
|
"type": "string",
|
|
41
|
-
"description": "図表の箱の上に出す小見出し (省略可)。 効くのは図全体を 1 箱にする型 (pie / bar / line / funnel / tree / journey / quadrant / mind / gantt) だけ。 箱ごとに分かれる型では相手が決まらないため、 actors[].eyebrow に書く"
|
|
46
|
+
"description": "図表の箱の上に出す小見出し (省略可)。 効くのは図全体を 1 箱にする型 (pie / bar / line / gauge / radial / stat / waffle / stacked / funnel / tree / journey / quadrant / mind / gantt) だけ。 箱ごとに分かれる型では相手が決まらないため、 actors[].eyebrow に書く"
|
|
42
47
|
},
|
|
43
48
|
"axes": {
|
|
44
49
|
"type": "object",
|
|
@@ -107,6 +112,10 @@
|
|
|
107
112
|
"type": "string",
|
|
108
113
|
"description": "actor 数値表示 (kind: actor 用)"
|
|
109
114
|
},
|
|
115
|
+
"previous": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"description": "前の時点の値。 type: stacked が 2 本目の帯として描き、type: stat が差として出す。 書かない図は 1 本のまま"
|
|
118
|
+
},
|
|
110
119
|
"rows": {
|
|
111
120
|
"type": "array",
|
|
112
121
|
"items": {
|
|
@@ -114,6 +123,13 @@
|
|
|
114
123
|
},
|
|
115
124
|
"description": "storage 内の column 列 (kind: storage 用)"
|
|
116
125
|
},
|
|
126
|
+
"marks": {
|
|
127
|
+
"type": "array",
|
|
128
|
+
"items": {
|
|
129
|
+
"type": "string"
|
|
130
|
+
},
|
|
131
|
+
"description": "行頭の印。 rows と同じ数だけ並べる。 語の意味は図の種類が決める = er は pk / fk / opt、class は + / - と () の有無、state は entry / do / exit / internal"
|
|
132
|
+
},
|
|
117
133
|
"lane": {
|
|
118
134
|
"type": "string",
|
|
119
135
|
"description": "swimlane / topology で属する lane id"
|
|
@@ -448,7 +464,7 @@
|
|
|
448
464
|
},
|
|
449
465
|
"style": {
|
|
450
466
|
"type": "string",
|
|
451
|
-
"enum": ["solid", "dotted-flow"],
|
|
467
|
+
"enum": ["solid", "dotted-flow", "dashed"],
|
|
452
468
|
"description": "矢印の線種"
|
|
453
469
|
},
|
|
454
470
|
"guard": {
|
|
@@ -464,6 +480,36 @@
|
|
|
464
480
|
"enum": ["top", "right", "bottom", "left"],
|
|
465
481
|
"description": "矢印がどの辺から出るか。 書かなければ描画側が自動で選ぶ。"
|
|
466
482
|
},
|
|
483
|
+
"head": {
|
|
484
|
+
"type": "string",
|
|
485
|
+
"enum": ["none", "triangle", "diamond", "open", "crow", "one", "zero-one", "many", "zero-many"],
|
|
486
|
+
"description": "着き先側の端の形。 端の形で関係の種類を示す = triangle (継ぐ) / diamond (持つ) / open (使う) / crow (多) / one / zero-one / many / zero-many (個数)。 書かなければ塗った三角になる。"
|
|
487
|
+
},
|
|
488
|
+
"tailHead": {
|
|
489
|
+
"type": "string",
|
|
490
|
+
"enum": ["none", "triangle", "diamond", "open", "crow", "one", "zero-one", "many", "zero-many"],
|
|
491
|
+
"description": "出どころ側の端の形。 両端に別々の印を立てる時に書く。"
|
|
492
|
+
},
|
|
493
|
+
"headFill": {
|
|
494
|
+
"type": "string",
|
|
495
|
+
"enum": ["solid", "hollow"],
|
|
496
|
+
"description": "着き先側の端の塗り。 中空は「弱い関係」 を表す。"
|
|
497
|
+
},
|
|
498
|
+
"tailHeadFill": {
|
|
499
|
+
"type": "string",
|
|
500
|
+
"enum": ["solid", "hollow"],
|
|
501
|
+
"description": "出どころ側の端の塗り。"
|
|
502
|
+
},
|
|
503
|
+
"relation": {
|
|
504
|
+
"type": "string",
|
|
505
|
+
"enum": ["extends", "implements", "aggregates", "composes", "associates", "uses"],
|
|
506
|
+
"description": "クラス図の関係の語。 書くと端の形 / 塗り / 線種がまとめて決まる。"
|
|
507
|
+
},
|
|
508
|
+
"kind": {
|
|
509
|
+
"type": "string",
|
|
510
|
+
"enum": ["call", "return", "fire"],
|
|
511
|
+
"description": "順序図の言づての種類。 call (返事を待つ) / return (返し) / fire (返事を待たない)。"
|
|
512
|
+
},
|
|
467
513
|
"labelOffsetX": {
|
|
468
514
|
"type": "number",
|
|
469
515
|
"description": "ラベル位置 x 調整"
|
|
@@ -584,6 +630,12 @@
|
|
|
584
630
|
"enum": ["line", "bar", "pie", "journey", "mind", "tree", "gantt", "funnel"],
|
|
585
631
|
"description": "この phase で起点から描くもの。 語は図種と揃える。 line / journey = 線が左端から右へ伸びる / bar = 棒が横軸から上へ伸びる / pie = 扇が 12 時から時計回りに開く / mind = 枝が中心から外へ伸びる / tree = 枝が根から下へ伸びる / gantt = 帯が各始端から右へ伸びる / funnel = 段が上端から順に積まれる"
|
|
586
632
|
},
|
|
633
|
+
"drawRatio": {
|
|
634
|
+
"type": "number",
|
|
635
|
+
"exclusiveMinimum": 0,
|
|
636
|
+
"maximum": 1,
|
|
637
|
+
"description": "描き終えるまでに phase の何割を使うか。 0.4 なら進みが 0.4 に達した時点で描き終わり、残りは描き終わった姿のまま値だけが動く。 書かなければ phase の終わりに描き終わる。 draw と一緒に書く (draw が無いと何も起きない)"
|
|
638
|
+
},
|
|
587
639
|
"tween": {
|
|
588
640
|
"type": "object",
|
|
589
641
|
"description": "この phase で補間する状態。 状態名 -> [開始値, 終了値]。 名前は英字か _ で始め、 英数字と _ だけを使う",
|
|
@@ -1744,6 +1796,25 @@
|
|
|
1744
1796
|
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
1745
1797
|
}
|
|
1746
1798
|
},
|
|
1799
|
+
"reveal": {
|
|
1800
|
+
"type": "string",
|
|
1801
|
+
"enum": ["phase", "all"],
|
|
1802
|
+
"description": "矢印をいつ出すか。 phase (既定) = 段が名指しする矢印はその段が来るまで描かない。 all = 段に関わらず最初から全部描く。"
|
|
1803
|
+
},
|
|
1804
|
+
"bands": {
|
|
1805
|
+
"type": "array",
|
|
1806
|
+
"description": "順序図で面が動いている間の帯。 書かなければ面ごとに「最初に関わった段から最後まで」 の 1 本になる。",
|
|
1807
|
+
"items": {
|
|
1808
|
+
"type": "object",
|
|
1809
|
+
"required": ["actor", "from", "to"],
|
|
1810
|
+
"additionalProperties": false,
|
|
1811
|
+
"properties": {
|
|
1812
|
+
"actor": { "type": "string", "description": "帯を出す面の名前" },
|
|
1813
|
+
"from": { "type": "integer", "minimum": 0, "description": "始まりの言づての番号 (0 起点)" },
|
|
1814
|
+
"to": { "type": "integer", "minimum": 0, "description": "終わりの言づての番号 (0 起点)" }
|
|
1815
|
+
}
|
|
1816
|
+
}
|
|
1817
|
+
},
|
|
1747
1818
|
"events": {
|
|
1748
1819
|
"type": "array",
|
|
1749
1820
|
"description": "押下などの出来事で動く仕掛け。 相手は名前で指す (box / lane / arrow / diagram のどれか 1 つ)。",
|
package/src/tokenize.ts
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
* 分割して返す = 参照だけ別の色にできる。
|
|
34
34
|
*/
|
|
35
35
|
import { TONE_ALIAS, ARROW_PATTERNS } from "./keywords";
|
|
36
|
-
import { TONES } from "@cardenelabs/cdl";
|
|
36
|
+
import { TONES, EDGE_STYLES } from "@cardenelabs/cdl";
|
|
37
37
|
import type { Tone } from "@cardenelabs/cdl";
|
|
38
38
|
|
|
39
39
|
/** 分解した部分の種類 (#1310) */
|
|
@@ -49,12 +49,12 @@ export type トークン = {
|
|
|
49
49
|
};
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
|
-
* 線種の一覧 (#1310)。
|
|
52
|
+
* 線種の一覧 (#1310 → #1466)。
|
|
53
53
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
54
|
+
* 描画側 (`EDGE_STYLES`) から導く。 手で並べると、描画側が線種を増やした時に書けないままになる
|
|
55
|
+
* (実測 = `dashed` を足した時に 3 箇所のうち 2 箇所が古いままだった)。
|
|
56
56
|
*/
|
|
57
|
-
const 線種 =
|
|
57
|
+
const 線種 = EDGE_STYLES;
|
|
58
58
|
|
|
59
59
|
/** 色名として読める語 (小文字で引く)。 正規の色名と別名の両方 */
|
|
60
60
|
const 色名の表 = new Map<string, Tone>([
|
package/src/types.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* docs/cdl/text-dsl-spec.md の文法を AST に変換した中間表現
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { CdlDiagram, NodeKind, Tone, EdgeStyle } from "@cardenelabs/cdl";
|
|
6
|
+
import type { CdlDiagram, NodeKind, Tone, EdgeStyle, EdgeHead, EdgeHeadFill, EdgeReveal, ClassRelationType, SequenceMessageKind } from "@cardenelabs/cdl";
|
|
7
7
|
import type { DslOnlyKind } from "./v05/parser";
|
|
8
8
|
|
|
9
9
|
/**
|
|
@@ -71,6 +71,11 @@ export type PresetType =
|
|
|
71
71
|
| "pie"
|
|
72
72
|
| "bar"
|
|
73
73
|
| "line"
|
|
74
|
+
| "gauge"
|
|
75
|
+
| "radial"
|
|
76
|
+
| "stat"
|
|
77
|
+
| "waffle"
|
|
78
|
+
| "stacked"
|
|
74
79
|
| "funnel"
|
|
75
80
|
| "tree"
|
|
76
81
|
| "journey"
|
|
@@ -147,6 +152,20 @@ export type DslDocument = {
|
|
|
147
152
|
/** v0.5+ 拡張 ... viewport / lanes / groups */
|
|
148
153
|
viewport?: DslViewport;
|
|
149
154
|
lanes?: Record<string, DslLane>;
|
|
155
|
+
/**
|
|
156
|
+
* 動いている間の帯 (#1466)。 順序図だけが読む。
|
|
157
|
+
*
|
|
158
|
+
* 書かなければ面ごとに「最初に関わった段から最後まで」 の 1 本。 途中で手が空く面を
|
|
159
|
+
* 分けたい図だけ書く = どこで手が空くかは言づての並びからは決まらない。
|
|
160
|
+
*/
|
|
161
|
+
bands?: DslBand[];
|
|
162
|
+
/**
|
|
163
|
+
* 矢印をいつ出すか (`reveal:`、 #1470)。
|
|
164
|
+
*
|
|
165
|
+
* 既定 (`phase`) は「段が名指しする矢印は、その段が来るまで描かない」。 `all` と書くと
|
|
166
|
+
* 段に関わらず最初から全部描く。 描き手の `CdlDiagram.edgeReveal` にそのまま渡る。
|
|
167
|
+
*/
|
|
168
|
+
reveal?: EdgeReveal;
|
|
150
169
|
groups?: Record<string, DslGroup>;
|
|
151
170
|
/**
|
|
152
171
|
* 値を見せる部品 (`readouts:`、 #1374)。 割合の輪や数え上げを図の脇に出す。
|
|
@@ -214,7 +233,25 @@ export type DslActor = {
|
|
|
214
233
|
subtitle?: string;
|
|
215
234
|
eyebrow?: string;
|
|
216
235
|
value?: string;
|
|
236
|
+
/**
|
|
237
|
+
* 前の時点の値 (#1450)。
|
|
238
|
+
*
|
|
239
|
+
* 内訳の変化を帯で示す図 (`type: stacked`) が 2 本目の帯として描き、値 1 つを大きく示す図
|
|
240
|
+
* (`type: stat`) が差として出す。 書かない図は 1 本のまま (従来と同じ)。
|
|
241
|
+
*
|
|
242
|
+
* **3 時点以上は持たない**。 描画側が 2 時点で設計されており (`cdl#551`)、足すなら欄の形ごと
|
|
243
|
+
* 決め直すことになる。
|
|
244
|
+
*/
|
|
245
|
+
previous?: string;
|
|
217
246
|
rows?: string[];
|
|
247
|
+
/**
|
|
248
|
+
* 行頭の印 (#1466)。 `rows` と同じ並びで、空文字はその行に印を付けない。
|
|
249
|
+
*
|
|
250
|
+
* **語の意味は図の種類が決める**。 ER は `pk` / `fk` / `opt`、状態遷移は
|
|
251
|
+
* `entry` / `exit` / `do` / `internal`。 印の 2 軸 (形 × 塗り) は共通だが、その軸が
|
|
252
|
+
* 何を指すかは種類ごとに違う。
|
|
253
|
+
*/
|
|
254
|
+
marks?: string[];
|
|
218
255
|
/**
|
|
219
256
|
* 箱の中に描く図形 (`shape:`、 #1374)。 水位や角度を状態で動かせる。
|
|
220
257
|
*
|
|
@@ -402,6 +439,35 @@ export type DslStep = {
|
|
|
402
439
|
dashOffsetBind?: string;
|
|
403
440
|
/** 矢印がどの辺から出るか (#1385)。 書かなければ描画側が自動で選ぶ */
|
|
404
441
|
side?: "top" | "right" | "bottom" | "left";
|
|
442
|
+
/**
|
|
443
|
+
* 矢印の先の形 (#1462)。 書かなければ従来どおり塗った三角。
|
|
444
|
+
*
|
|
445
|
+
* 4 図の設計は **端の形で関係の種類を示す** = 三角 (継ぐ) / 菱 (持つ) /
|
|
446
|
+
* 開いた矢 (使う) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
|
|
447
|
+
* 線の種類 (実線 / 点線) だけで 6 種の関係を区別することになる。
|
|
448
|
+
*
|
|
449
|
+
* 受ける語は描画側の `EDGE_HEADS` から導く = 描画側が増やせば書けるようになる。
|
|
450
|
+
*/
|
|
451
|
+
head?: EdgeHead;
|
|
452
|
+
/** 出どころ側の端の形 (#1466)。 ER は端ごとに違う個数を示すので両端に要る */
|
|
453
|
+
tailHead?: EdgeHead;
|
|
454
|
+
/** 端の印の塗り (#1466)。 白抜きの菱が「持つ」、塗った菱が「抱える」 */
|
|
455
|
+
headFill?: EdgeHeadFill;
|
|
456
|
+
/** 出どころ側の印の塗り (#1466) */
|
|
457
|
+
tailHeadFill?: EdgeHeadFill;
|
|
458
|
+
/**
|
|
459
|
+
* クラス図の関係の種類 (#1466)。 書くと線と端の形と塗りと付く側がまとめて決まる。
|
|
460
|
+
*
|
|
461
|
+
* 4 つを個別に書かせないのは、組合せが 6 通りしか無く、1 つでも書き違えると読み手に
|
|
462
|
+
* 別の意味で伝わるため (菱を逆に置くと持ち主が入れ替わる)。
|
|
463
|
+
*/
|
|
464
|
+
relation?: ClassRelationType;
|
|
465
|
+
/**
|
|
466
|
+
* 言づての種類 (#1466)。 順序図で線と矢の形がまとめて決まる。
|
|
467
|
+
*
|
|
468
|
+
* `kind` にしないのは、箱の種類 (`DslActor.kind`) と同じ語が別の意味を持つため。
|
|
469
|
+
*/
|
|
470
|
+
msgKind?: SequenceMessageKind;
|
|
405
471
|
labelOffsetX?: number;
|
|
406
472
|
labelOffsetY?: number;
|
|
407
473
|
/** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
|
|
@@ -526,6 +592,9 @@ export type DslValue = {
|
|
|
526
592
|
);
|
|
527
593
|
|
|
528
594
|
/** ステップ (phase) */
|
|
595
|
+
/** 動いている間の帯 (#1466)。 順序図で、面がいつ動いているかを段の番号で持つ */
|
|
596
|
+
export type DslBand = { actor: string; from: number; to: number };
|
|
597
|
+
|
|
529
598
|
export type DslPhase = {
|
|
530
599
|
name: string;
|
|
531
600
|
durationMs: number;
|
|
@@ -546,6 +615,20 @@ export type DslPhase = {
|
|
|
546
615
|
* 相手の名前は書かせない = 対象の 8 図種はいずれも図全体を 1 箱で描くため相手が決まる。
|
|
547
616
|
*/
|
|
548
617
|
draw?: string;
|
|
618
|
+
/**
|
|
619
|
+
* 描き終えるまでに段の何割を使うか (#1441)。
|
|
620
|
+
*
|
|
621
|
+
* `draw: line 0.4` のように語の後ろに書く。 0 より大きく 1 以下。
|
|
622
|
+
* 書かなければ段の終わりに描き終わる (従来どおり)。
|
|
623
|
+
*
|
|
624
|
+
* **段の長さと描く速さを切り離すための欄**。 伸び具合は段の進みそのものなので、
|
|
625
|
+
* これが無いと「線はゆっくり引きたいが値の移りは短くしたい」 が書けず、描く速さのために
|
|
626
|
+
* 段の長さを動かすことになる。 段の長さを動かすと同じ段の `tween` まで遅くなる。
|
|
627
|
+
*
|
|
628
|
+
* **`draw` と同じ行に書かせる**。 別の項目にすると「割合だけ書いて `draw` が無い段」 が
|
|
629
|
+
* 書けてしまい、何も起きない指定になる。 同じ行なら書けない。
|
|
630
|
+
*/
|
|
631
|
+
drawRatio?: number;
|
|
549
632
|
/**
|
|
550
633
|
* `draw` を書いた行 (#1312)。 知らせの行番号に使う。
|
|
551
634
|
*
|