@cardenelabs/dragon 0.18.3 → 0.20.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 +3 -0
- package/dist/index.cjs +706 -149
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +59 -1
- package/dist/index.d.ts +59 -1
- package/dist/index.js +706 -149
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/compile.ts +104 -9
- package/src/json-parser.ts +41 -0
- package/src/keywords.ts +38 -0
- package/src/schemas/diagram.json +586 -140
- package/src/types.ts +15 -1
- package/src/v05/parser.ts +79 -3
package/src/types.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
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
|
+
import type { DslDirection, DslPalette } from "./keywords";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* 記法が書ける箱の種類 (#1420)。
|
|
@@ -178,6 +178,16 @@ export type DslDocument = {
|
|
|
178
178
|
direction?: DslDirection;
|
|
179
179
|
/** `direction:` を書いた行。 効かない時の知らせで、書いた場所を指すために持つ */
|
|
180
180
|
directionPos?: { line: number };
|
|
181
|
+
/**
|
|
182
|
+
* 図の配色 (`palette:`、 #1553)。
|
|
183
|
+
*
|
|
184
|
+
* 名前だけを持つ。 実際の色は消費側 (`cdl-theme.css`) が決めるので、ここには値を書かない。
|
|
185
|
+
* ER 図とクラス図は書かなくても `kinari` (生成りに茶) になる。 どちらも箱の作りが同じ
|
|
186
|
+
* (行頭の印 + 左に名前 + 右に型) で、名前と型が離れて並ぶため、行を横に追う目印
|
|
187
|
+
* (行の縞) が要る。 縞の色は配色からしか来ないので、既定が無いと縞が箱の面と同じ色に
|
|
188
|
+
* 落ちて 1 本も出ない。 書き手が `palette:` を書いた時はそちらが勝つ。
|
|
189
|
+
*/
|
|
190
|
+
palette?: DslPalette;
|
|
181
191
|
groups?: Record<string, DslGroup>;
|
|
182
192
|
/**
|
|
183
193
|
* 値を見せる部品 (`readouts:`、 #1374)。 割合の輪や数え上げを図の脇に出す。
|
|
@@ -480,6 +490,10 @@ export type DslStep = {
|
|
|
480
490
|
* `kind` にしないのは、箱の種類 (`DslActor.kind`) と同じ語が別の意味を持つため。
|
|
481
491
|
*/
|
|
482
492
|
msgKind?: SequenceMessageKind;
|
|
493
|
+
/** 辺の役目 (cdl#618)。 `main` を書いた辺だけ「いま」 の色で引く */
|
|
494
|
+
role?: "main";
|
|
495
|
+
/** 名前の下地を敷くか (cdl#618)。 書かなければ敷く */
|
|
496
|
+
labelPlate?: boolean;
|
|
483
497
|
labelOffsetX?: number;
|
|
484
498
|
labelOffsetY?: number;
|
|
485
499
|
/** true で説明文を矢印の線の上に重ねる。 分岐図の条件ラベル用。 */
|
package/src/v05/parser.ts
CHANGED
|
@@ -44,7 +44,8 @@
|
|
|
44
44
|
import type { NodeKind, Tone, EdgeStyle, EdgeHead, EdgeHeadFill, ClassRelationType, SequenceMessageKind } from "@cardenelabs/cdl";
|
|
45
45
|
import { TONES, NODE_KINDS, EDGE_HEADS, EDGE_HEAD_FILLS, EDGE_STYLES, EDGE_REVEALS, CLASS_RELATION_LOOK, SEQUENCE_MESSAGE_LOOK, parseFormula } from "@cardenelabs/cdl";
|
|
46
46
|
import type { EdgeReveal } from "@cardenelabs/cdl";
|
|
47
|
-
import { TONE_ALIAS, NODE_KIND_ALIAS, DIRECTIONS, resolveDirection } from "../keywords";
|
|
47
|
+
import { TONE_ALIAS, NODE_KIND_ALIAS, DIRECTIONS, resolveDirection, PALETTES, resolvePalette } from "../keywords";
|
|
48
|
+
import type { DslPalette } from "../keywords";
|
|
48
49
|
import type { DslDirection } from "../keywords";
|
|
49
50
|
import { parseRelativePos, orderByDependency } from "../relative-pos";
|
|
50
51
|
import {
|
|
@@ -96,6 +97,22 @@ export const EDGE_HEAD_VALUES: readonly string[] = EDGE_HEADS;
|
|
|
96
97
|
/** 端の印の塗り方 (#1466)。 描画側の一覧から導く = 描画側が増やせば書ける */
|
|
97
98
|
export const EDGE_HEAD_FILL_VALUES: readonly string[] = EDGE_HEAD_FILLS;
|
|
98
99
|
|
|
100
|
+
/**
|
|
101
|
+
* 辺の役目として書ける語 (#1559)。
|
|
102
|
+
*
|
|
103
|
+
* 読み手と公開 schema の両方がここを見る。 語を 2 か所に書くと、記法では通るのに JSON では
|
|
104
|
+
* 弾かれる (逆も) 形が黙って生まれる。
|
|
105
|
+
*/
|
|
106
|
+
export const EDGE_ROLE_VALUES = ["main"] as const;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 図形の向きとして書ける語 (#1561)。
|
|
110
|
+
*
|
|
111
|
+
* 読み手と、読めなかった時の案内と、公開 schema の 3 か所がここを見る。 値を直に書くと、
|
|
112
|
+
* 語を足した時にどれかが取り残される (実測 = 読み手と案内で同じ 4 語を 2 度書いていた)。
|
|
113
|
+
*/
|
|
114
|
+
export const SHAPE_ORIENT_VALUES = ["up", "down", "left", "right"] as const;
|
|
115
|
+
|
|
99
116
|
/**
|
|
100
117
|
* クラス図の関係の種類 (#1466)。 描画側の表 (`CLASS_RELATION_LOOK`) の key から導く。
|
|
101
118
|
*
|
|
@@ -153,6 +170,18 @@ export const TOP_LEVEL_KEYS = [
|
|
|
153
170
|
* 日本語で書けるので、書き手が自然に言う語 (`縦` / `横`) を残せる。
|
|
154
171
|
*/
|
|
155
172
|
"direction",
|
|
173
|
+
/*
|
|
174
|
+
* 図の配色 (#1553)。
|
|
175
|
+
*
|
|
176
|
+
* cdl は色を持たないので、名前だけを図に載せる。 消費側 (`cdl-theme.css`) が名前を見て
|
|
177
|
+
* 7 つの口 (台 / 行の面 / 縞 / 枠 / 字 / 型名 / 線) に色を当てる。
|
|
178
|
+
*
|
|
179
|
+
* ER 図とクラス図は書かなくても `kinari` (生成りに茶) になる。 どちらも箱の作りが同じ
|
|
180
|
+
* (行頭の印 + 左に名前 + 右に型) で、名前と型が離れて並ぶため、行を横に追う目印
|
|
181
|
+
* (行の縞) が要る。 縞の色は配色からしか来ないので、既定が無いと縞が箱の面と同じ色に
|
|
182
|
+
* 落ちて 1 本も出ない。 書き手が `palette:` を書いた時はそちらが勝つ。
|
|
183
|
+
*/
|
|
184
|
+
"palette",
|
|
156
185
|
] as const;
|
|
157
186
|
|
|
158
187
|
/**
|
|
@@ -440,6 +469,7 @@ export function parseTextDslV05(src: string): V05ParseResult {
|
|
|
440
469
|
let reveal: EdgeReveal | null = null;
|
|
441
470
|
let direction: DslDirection | null = null;
|
|
442
471
|
let directionLine = 0;
|
|
472
|
+
let palette: DslPalette | null = null;
|
|
443
473
|
let axes: DslAxes | undefined = undefined;
|
|
444
474
|
let axesLine = 0;
|
|
445
475
|
let actors: DslActor[] = [];
|
|
@@ -532,6 +562,29 @@ export function parseTextDslV05(src: string): V05ParseResult {
|
|
|
532
562
|
i += 1;
|
|
533
563
|
continue;
|
|
534
564
|
}
|
|
565
|
+
if (head.key === "palette") {
|
|
566
|
+
/*
|
|
567
|
+
* 図の配色 (#1553)。
|
|
568
|
+
*
|
|
569
|
+
* 読めない語はその場で知らせる。 黙って既定に落とすと、書き手には「書いたのに効かない」
|
|
570
|
+
* としか見えず、書き間違いか未対応かを分けられない。
|
|
571
|
+
*/
|
|
572
|
+
const v = (head.value ?? "").trim();
|
|
573
|
+
if (v.length > 0) {
|
|
574
|
+
const 解けた = resolvePalette(v);
|
|
575
|
+
if (解けた !== null) {
|
|
576
|
+
palette = 解けた;
|
|
577
|
+
} else {
|
|
578
|
+
errors.push({
|
|
579
|
+
line: line.no,
|
|
580
|
+
message: `palette が読めません (書いた値: ${v})`,
|
|
581
|
+
hint: `使える語 = ${PALETTES.join(" / ")} / 生成り / 青磁`,
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
i += 1;
|
|
586
|
+
continue;
|
|
587
|
+
}
|
|
535
588
|
if (head.key === "eyebrow") {
|
|
536
589
|
// 空で書いた形 (`eyebrow:`) は「書かなかった」 と同じにする。 空文字を残すと
|
|
537
590
|
// 描画側が中身のない帯を出す
|
|
@@ -1007,6 +1060,7 @@ export function parseTextDslV05(src: string): V05ParseResult {
|
|
|
1007
1060
|
...(eyebrow !== null ? { eyebrow, eyebrowPos: { line: eyebrowLine } } : {}),
|
|
1008
1061
|
...(reveal !== null ? { reveal } : {}),
|
|
1009
1062
|
...(direction !== null ? { direction, directionPos: { line: directionLine } } : {}),
|
|
1063
|
+
...(palette !== null ? { palette } : {}),
|
|
1010
1064
|
...(axes !== undefined ? { axes, axesPos: { line: axesLine } } : {}),
|
|
1011
1065
|
actors,
|
|
1012
1066
|
flow,
|
|
@@ -1655,12 +1709,12 @@ function 表に従って読む(
|
|
|
1655
1709
|
});
|
|
1656
1710
|
}
|
|
1657
1711
|
} else if (形 === "向き") {
|
|
1658
|
-
if (
|
|
1712
|
+
if ((SHAPE_ORIENT_VALUES as readonly string[]).includes(値)) out[欄] = 値;
|
|
1659
1713
|
else {
|
|
1660
1714
|
errors.push({
|
|
1661
1715
|
line,
|
|
1662
1716
|
message: `${接頭}${欄} の向きが読めません: "${値}"`,
|
|
1663
|
-
hint:
|
|
1717
|
+
hint: `使える値 = ${SHAPE_ORIENT_VALUES.join(", ")}`,
|
|
1664
1718
|
});
|
|
1665
1719
|
}
|
|
1666
1720
|
} else {
|
|
@@ -3129,6 +3183,23 @@ const FLOW_INLINE_READERS = {
|
|
|
3129
3183
|
sub: (v: string | undefined) => v,
|
|
3130
3184
|
guard: (v: string | undefined) => v,
|
|
3131
3185
|
cardinality: (v: string | undefined) => v,
|
|
3186
|
+
/*
|
|
3187
|
+
* 辺の役目 (cdl#618)。 `main` を書いた辺だけ「いま」 の色で引く。
|
|
3188
|
+
*
|
|
3189
|
+
* 図の中に道が 2 種 (主となる 1 本と、そこから枝分かれする先) ある時、どちらも同じ色だと
|
|
3190
|
+
* どこから読むかが決まらない。 主となる 1 本 (または 1 続き) にだけ書く。
|
|
3191
|
+
*/
|
|
3192
|
+
role: (v: string | undefined) =>
|
|
3193
|
+
v !== undefined && (EDGE_ROLE_VALUES as readonly string[]).includes(v)
|
|
3194
|
+
? (v as "main")
|
|
3195
|
+
: undefined,
|
|
3196
|
+
/*
|
|
3197
|
+
* 名前の下地を敷くか (cdl#618)。 書かなければ敷く。
|
|
3198
|
+
*
|
|
3199
|
+
* 丸い下地は箱と同じ形なので、罫の細い図では名前が小さな箱に見える。
|
|
3200
|
+
*/
|
|
3201
|
+
labelPlate: (v: string | undefined) =>
|
|
3202
|
+
v === undefined ? undefined : v !== "false" && v !== "なし",
|
|
3132
3203
|
// 矢印がどの辺から出るか (#1385)。 描画側は 4 方向を取り、書かなければ自動で選ぶ
|
|
3133
3204
|
side: (v: string | undefined) =>
|
|
3134
3205
|
v !== undefined && (EDGE_SIDE_VALUES as readonly string[]).includes(v)
|
|
@@ -3448,6 +3519,9 @@ function parseFlowStep(line: Line, no: number, errors: DslError[]): DslStep | nu
|
|
|
3448
3519
|
const tailHeadFill = 中括弧.tailHeadFill as EdgeHeadFill | undefined;
|
|
3449
3520
|
const relation = 中括弧.relation as ClassRelationType | undefined;
|
|
3450
3521
|
const msgKind = 中括弧.kind as SequenceMessageKind | undefined;
|
|
3522
|
+
// 辺の役目と名前の下地 (cdl#618)
|
|
3523
|
+
const role = 中括弧.role as "main" | undefined;
|
|
3524
|
+
const labelPlate = 中括弧.labelPlate as boolean | undefined;
|
|
3451
3525
|
// 値に追随する 3 欄 (#1396)。 空は捨てずに知らせる = 描画側は空文字を既定値へ落とさず
|
|
3452
3526
|
// そのまま置換に使うため、書き忘れが「線が消えた」 形で出る
|
|
3453
3527
|
const widthBind = 追随する大きさとして読む(
|
|
@@ -3534,6 +3608,8 @@ function parseFlowStep(line: Line, no: number, errors: DslError[]): DslStep | nu
|
|
|
3534
3608
|
tailHeadFill,
|
|
3535
3609
|
relation,
|
|
3536
3610
|
msgKind,
|
|
3611
|
+
role,
|
|
3612
|
+
labelPlate,
|
|
3537
3613
|
widthBind,
|
|
3538
3614
|
strokeBind,
|
|
3539
3615
|
dashOffsetBind,
|