@cardenelabs/dragon 0.16.0 → 0.18.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 +593 -374
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +207 -16
- package/dist/index.d.ts +207 -16
- package/dist/index.js +594 -376
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/compile.ts +539 -719
- package/src/index.ts +1 -0
- package/src/json-parser.ts +130 -1
- package/src/keywords.ts +28 -0
- package/src/schemas/diagram.json +62 -1
- package/src/tokenize.ts +5 -5
- package/src/types.ts +67 -1
- package/src/v05/parser.ts +217 -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,12 @@ 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;
|
|
190
|
+
/** 図の並ぶ向き (#1494)。 記法の最上位 `direction:` と同じ。 JSON は英語の語で書く */
|
|
191
|
+
direction?: "vertical" | "horizontal";
|
|
175
192
|
}
|
|
176
193
|
|
|
177
194
|
export interface JsonActor {
|
|
@@ -294,6 +311,8 @@ export interface JsonActor {
|
|
|
294
311
|
* 読めない項目名として知らせる)。
|
|
295
312
|
*/
|
|
296
313
|
scale?: number;
|
|
314
|
+
/** 行頭の印 (#1466)。 行と対で読む。 語の意味は図の種類が決める */
|
|
315
|
+
marks?: string[];
|
|
297
316
|
}
|
|
298
317
|
|
|
299
318
|
/** 2 軸で仕分ける図の軸の名前 (#1294)。 記法の `axes:` と同じ形 */
|
|
@@ -317,6 +336,21 @@ export interface JsonStep {
|
|
|
317
336
|
sub?: string;
|
|
318
337
|
/** 矢印がどの辺から出るか (#1385)。 記法の `side:` と同じ */
|
|
319
338
|
side?: "top" | "right" | "bottom" | "left";
|
|
339
|
+
/**
|
|
340
|
+
* 矢印の先の形 (#1462)。 記法の `{ head: triangle }` と同じ。
|
|
341
|
+
*
|
|
342
|
+
* 三角 (継ぐ) / 菱 (持つ) / 開いた矢 (使う) / 鳥の足 (多)。
|
|
343
|
+
* 書かなければ従来どおり塗った三角になる。
|
|
344
|
+
*/
|
|
345
|
+
head?: EdgeHead;
|
|
346
|
+
/** 出どころ側の端の形と、両端の塗り (#1466)。 記法の `{ tailHead: diamond }` 等と同じ */
|
|
347
|
+
tailHead?: EdgeHead;
|
|
348
|
+
headFill?: EdgeHeadFill;
|
|
349
|
+
tailHeadFill?: EdgeHeadFill;
|
|
350
|
+
/** クラス図の関係の語 (#1466)。 書くと端の形 / 塗り / 線種がまとめて決まる */
|
|
351
|
+
relation?: ClassRelationType;
|
|
352
|
+
/** 順序図の言づての種類 (#1466)。 `call` / `return` / `fire` */
|
|
353
|
+
kind?: SequenceMessageKind;
|
|
320
354
|
/**
|
|
321
355
|
* 矢印の色 (#1304)。 記法の `(成功)` と同じく別名 (`成功` / `neutral` 等) も受ける。
|
|
322
356
|
*
|
|
@@ -451,6 +485,12 @@ export const ACCEPTED_KEYS = {
|
|
|
451
485
|
// 押下などの出来事で動く仕掛けと、巻き上げに応じて進む値 (#1393)
|
|
452
486
|
"events",
|
|
453
487
|
"scrolls",
|
|
488
|
+
// 順序図で面が動いている間の帯 (#1466)
|
|
489
|
+
"bands",
|
|
490
|
+
// 矢印をいつ出すか (#1470)
|
|
491
|
+
"reveal",
|
|
492
|
+
// 図の並ぶ向き (#1494)
|
|
493
|
+
"direction",
|
|
454
494
|
],
|
|
455
495
|
actor: [
|
|
456
496
|
"name",
|
|
@@ -491,6 +531,8 @@ export const ACCEPTED_KEYS = {
|
|
|
491
531
|
"opacity",
|
|
492
532
|
"renderOffsetX",
|
|
493
533
|
"renderOffsetY",
|
|
534
|
+
// 行頭の印 (#1466)。 行ごとに 1 つ、図の種類ごとの語で書く
|
|
535
|
+
"marks",
|
|
494
536
|
],
|
|
495
537
|
step: [
|
|
496
538
|
"from",
|
|
@@ -499,6 +541,14 @@ export const ACCEPTED_KEYS = {
|
|
|
499
541
|
"sub",
|
|
500
542
|
// 矢印がどの辺から出るか (#1385)
|
|
501
543
|
"side",
|
|
544
|
+
// 矢印の先の形 (#1462)
|
|
545
|
+
"head",
|
|
546
|
+
// 端の印の残り 3 欄と、関係の語 / 言づての種類 (#1466)
|
|
547
|
+
"tailHead",
|
|
548
|
+
"headFill",
|
|
549
|
+
"tailHeadFill",
|
|
550
|
+
"relation",
|
|
551
|
+
"kind",
|
|
502
552
|
"tone",
|
|
503
553
|
"style",
|
|
504
554
|
"guard",
|
|
@@ -561,6 +611,7 @@ export type 欄の型 =
|
|
|
561
611
|
| "色"
|
|
562
612
|
| "線種"
|
|
563
613
|
| "辺"
|
|
614
|
+
| "端の形"
|
|
564
615
|
| "色か色番号"
|
|
565
616
|
| "描くもの"
|
|
566
617
|
| "必須の図種"
|
|
@@ -592,6 +643,12 @@ export const 欄の型表 = {
|
|
|
592
643
|
// 押下と巻き上げ (#1393)。 中身は下の検査が 1 件ずつ見る
|
|
593
644
|
events: "並び",
|
|
594
645
|
scrolls: "object",
|
|
646
|
+
// 順序図で面が動いている間の帯 (#1466)
|
|
647
|
+
bands: "並び",
|
|
648
|
+
// 矢印をいつ出すか (#1470)
|
|
649
|
+
reveal: "非空の文字列",
|
|
650
|
+
// 図の並ぶ向き (#1494)
|
|
651
|
+
direction: "非空の文字列",
|
|
595
652
|
},
|
|
596
653
|
actor: {
|
|
597
654
|
name: "必須の非空文字列",
|
|
@@ -631,6 +688,8 @@ export const 欄の型表 = {
|
|
|
631
688
|
opacity: "数か文字列",
|
|
632
689
|
renderOffsetX: "数か文字列",
|
|
633
690
|
renderOffsetY: "数か文字列",
|
|
691
|
+
// 行頭の印 (#1466)
|
|
692
|
+
marks: "文字列の並び",
|
|
634
693
|
},
|
|
635
694
|
step: {
|
|
636
695
|
from: "必須の文字列",
|
|
@@ -639,6 +698,13 @@ export const 欄の型表 = {
|
|
|
639
698
|
sub: "文字列",
|
|
640
699
|
// 矢印がどの辺から出るか (#1385)
|
|
641
700
|
side: "辺",
|
|
701
|
+
head: "端の形",
|
|
702
|
+
// 端の印の残り 3 欄と、関係の語 / 言づての種類 (#1466)
|
|
703
|
+
tailHead: "端の形",
|
|
704
|
+
headFill: "非空の文字列",
|
|
705
|
+
tailHeadFill: "非空の文字列",
|
|
706
|
+
relation: "非空の文字列",
|
|
707
|
+
kind: "非空の文字列",
|
|
642
708
|
tone: "色",
|
|
643
709
|
style: "線種",
|
|
644
710
|
guard: "文字列",
|
|
@@ -890,6 +956,18 @@ function 値を検査(
|
|
|
890
956
|
});
|
|
891
957
|
}
|
|
892
958
|
return;
|
|
959
|
+
case "端の形":
|
|
960
|
+
if (v === undefined) return;
|
|
961
|
+
// 受ける語は記法と同じ一覧を見る (`EDGE_HEAD_VALUES`)。 写すと描画側が形を増やした時に
|
|
962
|
+
// 片方だけ古くなる
|
|
963
|
+
if (typeof v !== "string" || !EDGE_HEAD_VALUES.includes(v)) {
|
|
964
|
+
errors.push({
|
|
965
|
+
path,
|
|
966
|
+
message: `${名前} must be one of: ${EDGE_HEAD_VALUES.join(", ")}`,
|
|
967
|
+
hint: typeof v === "string" ? `got "${v}"` : `got ${typeof v}`,
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
return;
|
|
893
971
|
case "描くもの":
|
|
894
972
|
if (v === undefined) return;
|
|
895
973
|
// 受ける語は記法と同じ一覧を見る (`DRAW_WORDS`)。 写すと語が増えた時に片方だけ古くなる
|
|
@@ -1202,6 +1280,40 @@ function 表で中身を検査する(
|
|
|
1202
1280
|
* 委ねる作りなので (`checkFieldType` の `case "並び"`)、ここで見ないと `readouts: 1` が
|
|
1203
1281
|
* 素通りする。
|
|
1204
1282
|
*/
|
|
1283
|
+
/**
|
|
1284
|
+
* 順序図の帯の並びを検査する (#1466)。
|
|
1285
|
+
*
|
|
1286
|
+
* **外側の形もここで見る**。 `欄の型表` は「並び」 とだけ宣言し、中身の検査は専用の検査に
|
|
1287
|
+
* 委ねる作りなので、ここで見ないと `bands: 1` が素通りする。
|
|
1288
|
+
*/
|
|
1289
|
+
function validateBands(v: unknown, errors: JsonDslError[]): void {
|
|
1290
|
+
if (v === undefined) return;
|
|
1291
|
+
if (!Array.isArray(v)) {
|
|
1292
|
+
errors.push({
|
|
1293
|
+
path: "$.bands",
|
|
1294
|
+
message: "bands must be an array of band objects",
|
|
1295
|
+
hint: `got ${v === null ? "null" : typeof v}`,
|
|
1296
|
+
});
|
|
1297
|
+
return;
|
|
1298
|
+
}
|
|
1299
|
+
v.forEach((b, i) => {
|
|
1300
|
+
const path = `$.bands[${i}]`;
|
|
1301
|
+
if (typeof b !== "object" || b === null || Array.isArray(b)) {
|
|
1302
|
+
errors.push({ path, message: "band must be an object", hint: "{ actor, from, to } の形で書く" });
|
|
1303
|
+
return;
|
|
1304
|
+
}
|
|
1305
|
+
const o = b as Record<string, unknown>;
|
|
1306
|
+
if (typeof o.actor !== "string" || o.actor === "") {
|
|
1307
|
+
errors.push({ path: `${path}.actor`, message: "band.actor must be a non-empty string" });
|
|
1308
|
+
}
|
|
1309
|
+
for (const k of ["from", "to"] as const) {
|
|
1310
|
+
if (typeof o[k] !== "number" || !Number.isInteger(o[k]) || (o[k] as number) < 0) {
|
|
1311
|
+
errors.push({ path: `${path}.${k}`, message: `band.${k} must be a non-negative integer` });
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
});
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1205
1317
|
function validateReadouts(v: unknown, errors: JsonDslError[]): void {
|
|
1206
1318
|
if (v === undefined) return;
|
|
1207
1319
|
if (!Array.isArray(v)) {
|
|
@@ -1879,6 +1991,7 @@ function validateJson(
|
|
|
1879
1991
|
checkUnknownKeys(j, "root", "$", errors);
|
|
1880
1992
|
// 値を見せる部品の中身を、記法と同じ表で見る (#1374)
|
|
1881
1993
|
validateReadouts(j.readouts, errors);
|
|
1994
|
+
validateBands(j.bands, errors);
|
|
1882
1995
|
// 読む人が動かすつまみの中身も、記法と同じ表で見る (#1389)
|
|
1883
1996
|
validateInputs(j.inputs, errors);
|
|
1884
1997
|
// 式は描画側の parser に通す (#1391)
|
|
@@ -2181,6 +2294,8 @@ export function jsonToDoc(json: DragonJson): DslDocument {
|
|
|
2181
2294
|
value: a.value,
|
|
2182
2295
|
previous: a.previous,
|
|
2183
2296
|
rows: a.rows,
|
|
2297
|
+
// 行頭の印 (#1466)。 行と対で読む
|
|
2298
|
+
marks: a.marks,
|
|
2184
2299
|
lane: a.lane,
|
|
2185
2300
|
stack: a.stack,
|
|
2186
2301
|
initial: a.initial,
|
|
@@ -2240,6 +2355,14 @@ export function jsonToDoc(json: DragonJson): DslDocument {
|
|
|
2240
2355
|
label: s.label,
|
|
2241
2356
|
sub: s.sub,
|
|
2242
2357
|
side: s.side as "top" | "right" | "bottom" | "left" | undefined,
|
|
2358
|
+
// 矢印の先の形 (#1462)。 読めない語は組み立てが落とす
|
|
2359
|
+
head: s.head,
|
|
2360
|
+
// 端の印の残り 3 欄と、関係の語 / 言づての種類 (#1466)
|
|
2361
|
+
tailHead: s.tailHead,
|
|
2362
|
+
headFill: s.headFill,
|
|
2363
|
+
tailHeadFill: s.tailHeadFill,
|
|
2364
|
+
relation: s.relation,
|
|
2365
|
+
msgKind: s.kind,
|
|
2243
2366
|
// 箱と同じ読み替えを通す (#1304)。 通さないと `tone: "成功"` が色名として解決されないまま
|
|
2244
2367
|
// 図に届き、同じ値が箱では色になり矢印では色にならない
|
|
2245
2368
|
tone: resolveTone(s.tone),
|
|
@@ -2373,6 +2496,12 @@ export function jsonToDoc(json: DragonJson): DslDocument {
|
|
|
2373
2496
|
formulas,
|
|
2374
2497
|
events,
|
|
2375
2498
|
scrolls,
|
|
2499
|
+
// 順序図で面が動いている間の帯 (#1466)
|
|
2500
|
+
bands: json.bands,
|
|
2501
|
+
// 矢印をいつ出すか (#1470)
|
|
2502
|
+
reveal: json.reveal,
|
|
2503
|
+
// 図の並ぶ向き (#1494)。 JSON は英語で書くので、記法と同じ語に直してから渡す
|
|
2504
|
+
...(json.direction !== undefined ? { direction: json.direction === "horizontal" ? ("横" as const) : ("縦" as const) } : {}),
|
|
2376
2505
|
pos: p0,
|
|
2377
2506
|
};
|
|
2378
2507
|
}
|
package/src/keywords.ts
CHANGED
|
@@ -17,6 +17,34 @@ export const HEADERS = {
|
|
|
17
17
|
/** preset 名 */
|
|
18
18
|
export const PRESET_NAMES = ["sequence", "flow", "swimlane", "er", "state", "topology"] as const;
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* 図の並ぶ向き (`direction:`、 #1494)。
|
|
22
|
+
*
|
|
23
|
+
* 縦列 (`lane`) は横、段 (`stack`) は縦に置かれるので、向きは「1 つの縦列に積む」 か
|
|
24
|
+
* 「1 人ずつ縦列を作る」 かの選択になる。 どちらも組み立て側に既にある経路で、
|
|
25
|
+
* 記法から名指しできる言葉が無かった。
|
|
26
|
+
*/
|
|
27
|
+
export const DIRECTIONS = ["縦", "横"] as const;
|
|
28
|
+
export type DslDirection = (typeof DIRECTIONS)[number];
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 向きの別名。 色 (`色` / `color` / `tone`) と同じく日本語と英語の両方で書ける。
|
|
32
|
+
*
|
|
33
|
+
* 正規の語を鍵にも入れておく = 引く側が別名かどうかを気にせず 1 度で解決できる。
|
|
34
|
+
*/
|
|
35
|
+
export const DIRECTION_ALIAS: Record<string, DslDirection> = {
|
|
36
|
+
縦: "縦",
|
|
37
|
+
横: "横",
|
|
38
|
+
vertical: "縦",
|
|
39
|
+
horizontal: "横",
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/** 書いた向きを正規の語に直す。 読めない語は `null`。 */
|
|
43
|
+
export function resolveDirection(s: string): DslDirection | null {
|
|
44
|
+
const k = s.trim().toLowerCase();
|
|
45
|
+
return Object.hasOwn(DIRECTION_ALIAS, k) ? DIRECTION_ALIAS[k]! : null;
|
|
46
|
+
}
|
|
47
|
+
|
|
20
48
|
/** NodeKind 別名 (日本語 → English) */
|
|
21
49
|
export const NODE_KIND_ALIAS: Record<string, NodeKind> = {
|
|
22
50
|
// 日本語
|
package/src/schemas/diagram.json
CHANGED
|
@@ -123,6 +123,13 @@
|
|
|
123
123
|
},
|
|
124
124
|
"description": "storage 内の column 列 (kind: storage 用)"
|
|
125
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
|
+
},
|
|
126
133
|
"lane": {
|
|
127
134
|
"type": "string",
|
|
128
135
|
"description": "swimlane / topology で属する lane id"
|
|
@@ -457,7 +464,7 @@
|
|
|
457
464
|
},
|
|
458
465
|
"style": {
|
|
459
466
|
"type": "string",
|
|
460
|
-
"enum": ["solid", "dotted-flow"],
|
|
467
|
+
"enum": ["solid", "dotted-flow", "dashed"],
|
|
461
468
|
"description": "矢印の線種"
|
|
462
469
|
},
|
|
463
470
|
"guard": {
|
|
@@ -473,6 +480,36 @@
|
|
|
473
480
|
"enum": ["top", "right", "bottom", "left"],
|
|
474
481
|
"description": "矢印がどの辺から出るか。 書かなければ描画側が自動で選ぶ。"
|
|
475
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
|
+
},
|
|
476
513
|
"labelOffsetX": {
|
|
477
514
|
"type": "number",
|
|
478
515
|
"description": "ラベル位置 x 調整"
|
|
@@ -1759,6 +1796,30 @@
|
|
|
1759
1796
|
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
1760
1797
|
}
|
|
1761
1798
|
},
|
|
1799
|
+
"direction": {
|
|
1800
|
+
"type": "string",
|
|
1801
|
+
"enum": ["vertical", "horizontal"],
|
|
1802
|
+
"description": "図の並ぶ向き。 vertical = 1 つの縦列に積む。 horizontal = 1 人ずつ縦列を作る。 効くのは flow と swimlane だけ。"
|
|
1803
|
+
},
|
|
1804
|
+
"reveal": {
|
|
1805
|
+
"type": "string",
|
|
1806
|
+
"enum": ["phase", "all"],
|
|
1807
|
+
"description": "矢印をいつ出すか。 phase (既定) = 段が名指しする矢印はその段が来るまで描かない。 all = 段に関わらず最初から全部描く。"
|
|
1808
|
+
},
|
|
1809
|
+
"bands": {
|
|
1810
|
+
"type": "array",
|
|
1811
|
+
"description": "順序図で面が動いている間の帯。 書かなければ面ごとに「最初に関わった段から最後まで」 の 1 本になる。",
|
|
1812
|
+
"items": {
|
|
1813
|
+
"type": "object",
|
|
1814
|
+
"required": ["actor", "from", "to"],
|
|
1815
|
+
"additionalProperties": false,
|
|
1816
|
+
"properties": {
|
|
1817
|
+
"actor": { "type": "string", "description": "帯を出す面の名前" },
|
|
1818
|
+
"from": { "type": "integer", "minimum": 0, "description": "始まりの言づての番号 (0 起点)" },
|
|
1819
|
+
"to": { "type": "integer", "minimum": 0, "description": "終わりの言づての番号 (0 起点)" }
|
|
1820
|
+
}
|
|
1821
|
+
}
|
|
1822
|
+
},
|
|
1762
1823
|
"events": {
|
|
1763
1824
|
"type": "array",
|
|
1764
1825
|
"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,8 +3,9 @@
|
|
|
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
|
+
import type { DslDirection } from "./keywords";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* 記法が書ける箱の種類 (#1420)。
|
|
@@ -152,6 +153,31 @@ export type DslDocument = {
|
|
|
152
153
|
/** v0.5+ 拡張 ... viewport / lanes / groups */
|
|
153
154
|
viewport?: DslViewport;
|
|
154
155
|
lanes?: Record<string, DslLane>;
|
|
156
|
+
/**
|
|
157
|
+
* 動いている間の帯 (#1466)。 順序図だけが読む。
|
|
158
|
+
*
|
|
159
|
+
* 書かなければ面ごとに「最初に関わった段から最後まで」 の 1 本。 途中で手が空く面を
|
|
160
|
+
* 分けたい図だけ書く = どこで手が空くかは言づての並びからは決まらない。
|
|
161
|
+
*/
|
|
162
|
+
bands?: DslBand[];
|
|
163
|
+
/**
|
|
164
|
+
* 矢印をいつ出すか (`reveal:`、 #1470)。
|
|
165
|
+
*
|
|
166
|
+
* 既定 (`phase`) は「段が名指しする矢印は、その段が来るまで描かない」。 `all` と書くと
|
|
167
|
+
* 段に関わらず最初から全部描く。 描き手の `CdlDiagram.edgeReveal` にそのまま渡る。
|
|
168
|
+
*/
|
|
169
|
+
reveal?: EdgeReveal;
|
|
170
|
+
/**
|
|
171
|
+
* 図の並ぶ向き (`direction:`、 #1494)。
|
|
172
|
+
*
|
|
173
|
+
* `縦` は 1 つの縦列に積み、`横` は 1 人ずつ縦列を作る。 効くのは流れ図と泳法図だけで、
|
|
174
|
+
* 他の図種は並び方そのものが読み方を担うため書いても効かない (知らせを出す)。
|
|
175
|
+
*
|
|
176
|
+
* 全ての箱が縦列を書いた形では、書いた縦列が勝つ (同じく知らせを出す)。
|
|
177
|
+
*/
|
|
178
|
+
direction?: DslDirection;
|
|
179
|
+
/** `direction:` を書いた行。 効かない時の知らせで、書いた場所を指すために持つ */
|
|
180
|
+
directionPos?: { line: number };
|
|
155
181
|
groups?: Record<string, DslGroup>;
|
|
156
182
|
/**
|
|
157
183
|
* 値を見せる部品 (`readouts:`、 #1374)。 割合の輪や数え上げを図の脇に出す。
|
|
@@ -230,6 +256,14 @@ export type DslActor = {
|
|
|
230
256
|
*/
|
|
231
257
|
previous?: string;
|
|
232
258
|
rows?: string[];
|
|
259
|
+
/**
|
|
260
|
+
* 行頭の印 (#1466)。 `rows` と同じ並びで、空文字はその行に印を付けない。
|
|
261
|
+
*
|
|
262
|
+
* **語の意味は図の種類が決める**。 ER は `pk` / `fk` / `opt`、状態遷移は
|
|
263
|
+
* `entry` / `exit` / `do` / `internal`。 印の 2 軸 (形 × 塗り) は共通だが、その軸が
|
|
264
|
+
* 何を指すかは種類ごとに違う。
|
|
265
|
+
*/
|
|
266
|
+
marks?: string[];
|
|
233
267
|
/**
|
|
234
268
|
* 箱の中に描く図形 (`shape:`、 #1374)。 水位や角度を状態で動かせる。
|
|
235
269
|
*
|
|
@@ -417,6 +451,35 @@ export type DslStep = {
|
|
|
417
451
|
dashOffsetBind?: string;
|
|
418
452
|
/** 矢印がどの辺から出るか (#1385)。 書かなければ描画側が自動で選ぶ */
|
|
419
453
|
side?: "top" | "right" | "bottom" | "left";
|
|
454
|
+
/**
|
|
455
|
+
* 矢印の先の形 (#1462)。 書かなければ従来どおり塗った三角。
|
|
456
|
+
*
|
|
457
|
+
* 4 図の設計は **端の形で関係の種類を示す** = 三角 (継ぐ) / 菱 (持つ) /
|
|
458
|
+
* 開いた矢 (使う) / 鳥の足 (多)。 書けないと 4 種とも同じ三角になり、
|
|
459
|
+
* 線の種類 (実線 / 点線) だけで 6 種の関係を区別することになる。
|
|
460
|
+
*
|
|
461
|
+
* 受ける語は描画側の `EDGE_HEADS` から導く = 描画側が増やせば書けるようになる。
|
|
462
|
+
*/
|
|
463
|
+
head?: EdgeHead;
|
|
464
|
+
/** 出どころ側の端の形 (#1466)。 ER は端ごとに違う個数を示すので両端に要る */
|
|
465
|
+
tailHead?: EdgeHead;
|
|
466
|
+
/** 端の印の塗り (#1466)。 白抜きの菱が「持つ」、塗った菱が「抱える」 */
|
|
467
|
+
headFill?: EdgeHeadFill;
|
|
468
|
+
/** 出どころ側の印の塗り (#1466) */
|
|
469
|
+
tailHeadFill?: EdgeHeadFill;
|
|
470
|
+
/**
|
|
471
|
+
* クラス図の関係の種類 (#1466)。 書くと線と端の形と塗りと付く側がまとめて決まる。
|
|
472
|
+
*
|
|
473
|
+
* 4 つを個別に書かせないのは、組合せが 6 通りしか無く、1 つでも書き違えると読み手に
|
|
474
|
+
* 別の意味で伝わるため (菱を逆に置くと持ち主が入れ替わる)。
|
|
475
|
+
*/
|
|
476
|
+
relation?: ClassRelationType;
|
|
477
|
+
/**
|
|
478
|
+
* 言づての種類 (#1466)。 順序図で線と矢の形がまとめて決まる。
|
|
479
|
+
*
|
|
480
|
+
* `kind` にしないのは、箱の種類 (`DslActor.kind`) と同じ語が別の意味を持つため。
|
|
481
|
+
*/
|
|
482
|
+
msgKind?: SequenceMessageKind;
|
|
420
483
|
labelOffsetX?: number;
|
|
421
484
|
labelOffsetY?: number;
|
|
422
485
|
/** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
|
|
@@ -541,6 +604,9 @@ export type DslValue = {
|
|
|
541
604
|
);
|
|
542
605
|
|
|
543
606
|
/** ステップ (phase) */
|
|
607
|
+
/** 動いている間の帯 (#1466)。 順序図で、面がいつ動いているかを段の番号で持つ */
|
|
608
|
+
export type DslBand = { actor: string; from: number; to: number };
|
|
609
|
+
|
|
544
610
|
export type DslPhase = {
|
|
545
611
|
name: string;
|
|
546
612
|
durationMs: number;
|