@ts-graphviz/ast 0.0.0-pr956-20240225073457 → 0.0.0-pr956-20240225160253

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.
Files changed (71) hide show
  1. package/CHANGELOG.md +291 -3
  2. package/lib/ast.cjs +25 -60
  3. package/lib/ast.js +25 -60
  4. package/package.json +43 -24
  5. package/src/ast.ts +0 -8
  6. package/src/builder/__snapshots__/create-element.test.ts.snap +0 -166
  7. package/src/builder/builder.test.ts +0 -36
  8. package/src/builder/builder.ts +0 -44
  9. package/src/builder/create-element.test.ts +0 -110
  10. package/src/builder/create-element.ts +0 -13
  11. package/src/builder/index.ts +0 -3
  12. package/src/builder/types.ts +0 -226
  13. package/src/dot-shim/index.ts +0 -2
  14. package/src/dot-shim/parser/__snapshots__/parse.test.ts.snap +0 -2613
  15. package/src/dot-shim/parser/dot.peggy +0 -396
  16. package/src/dot-shim/parser/index.ts +0 -1
  17. package/src/dot-shim/parser/parse.test.ts +0 -263
  18. package/src/dot-shim/parser/parse.ts +0 -121
  19. package/src/dot-shim/parser/peggy.options.json +0 -15
  20. package/src/dot-shim/printer/index.ts +0 -6
  21. package/src/dot-shim/printer/plugins/AttributeListPrintPlugin.ts +0 -22
  22. package/src/dot-shim/printer/plugins/AttributePrintPlugin.ts +0 -11
  23. package/src/dot-shim/printer/plugins/CommentPrintPlugin.ts +0 -40
  24. package/src/dot-shim/printer/plugins/DotPrintPlugin.ts +0 -12
  25. package/src/dot-shim/printer/plugins/EdgePrintPlugin.ts +0 -27
  26. package/src/dot-shim/printer/plugins/GraphPrintPlugin.ts +0 -32
  27. package/src/dot-shim/printer/plugins/LiteralPrintPlugin.ts +0 -24
  28. package/src/dot-shim/printer/plugins/NodePrintPlugin.ts +0 -24
  29. package/src/dot-shim/printer/plugins/NodeRefGroupPrintPlugin.ts +0 -17
  30. package/src/dot-shim/printer/plugins/NodeRefPrintPlugin.ts +0 -18
  31. package/src/dot-shim/printer/plugins/SubgraphPrintPlugin.ts +0 -27
  32. package/src/dot-shim/printer/plugins/index.ts +0 -26
  33. package/src/dot-shim/printer/plugins/utils/index.ts +0 -1
  34. package/src/dot-shim/printer/plugins/utils/tokens.ts +0 -51
  35. package/src/dot-shim/printer/printer.ts +0 -46
  36. package/src/dot-shim/printer/stringify.test.ts +0 -823
  37. package/src/dot-shim/printer/stringify.ts +0 -19
  38. package/src/dot-shim/printer/types.ts +0 -74
  39. package/src/model-shim/from-model/converter.ts +0 -43
  40. package/src/model-shim/from-model/from-model.ts +0 -19
  41. package/src/model-shim/from-model/index.ts +0 -3
  42. package/src/model-shim/from-model/plugins/AttributeListPlugin.ts +0 -19
  43. package/src/model-shim/from-model/plugins/EdgePlugin.ts +0 -140
  44. package/src/model-shim/from-model/plugins/GraphPlugin.ts +0 -36
  45. package/src/model-shim/from-model/plugins/NodePlugin.ts +0 -33
  46. package/src/model-shim/from-model/plugins/SubraphPlugin.ts +0 -28
  47. package/src/model-shim/from-model/plugins/index.ts +0 -13
  48. package/src/model-shim/from-model/plugins/utils/convert-attribute.ts +0 -47
  49. package/src/model-shim/from-model/plugins/utils/convert-cluster-children.ts +0 -44
  50. package/src/model-shim/from-model/plugins/utils/convert-comment.ts +0 -16
  51. package/src/model-shim/from-model/plugins/utils/index.ts +0 -3
  52. package/src/model-shim/from-model/types.ts +0 -62
  53. package/src/model-shim/index.ts +0 -2
  54. package/src/model-shim/to-model/converter.ts +0 -42
  55. package/src/model-shim/to-model/index.ts +0 -3
  56. package/src/model-shim/to-model/plugins/DotPlugin.ts +0 -25
  57. package/src/model-shim/to-model/plugins/EdgePlugin.ts +0 -26
  58. package/src/model-shim/to-model/plugins/GraphPlugin.ts +0 -15
  59. package/src/model-shim/to-model/plugins/NodePlugin.ts +0 -25
  60. package/src/model-shim/to-model/plugins/SubgraphPlugin.ts +0 -14
  61. package/src/model-shim/to-model/plugins/index.ts +0 -13
  62. package/src/model-shim/to-model/plugins/utils/apply-statments.ts +0 -96
  63. package/src/model-shim/to-model/plugins/utils/comment-holder.ts +0 -31
  64. package/src/model-shim/to-model/plugins/utils/convert-to-edge-target-tuple.ts +0 -21
  65. package/src/model-shim/to-model/to-model.test.ts +0 -34
  66. package/src/model-shim/to-model/to-model.ts +0 -16
  67. package/src/model-shim/to-model/types.ts +0 -71
  68. package/src/types.ts +0 -370
  69. package/tsconfig.json +0 -8
  70. package/typedoc.json +0 -4
  71. package/vite.config.ts +0 -22
@@ -1,396 +0,0 @@
1
- /*
2
- * Grammar to parse the graphviz dot/xdot language.
3
- *
4
- * This file is based on https://github.com/anvaka/dotparser
5
- */
6
-
7
- {
8
- function dedent(value: string): string {
9
- const str = value.trim();
10
- const matches = str.match(/\n([\t ]+|(?!\s).)/g);
11
- if (matches) {
12
- const indentLengths = matches.map((match) => match.match(/[\t ]/g)?.length ?? 0);
13
- const pattern = new RegExp(`\n[\t ]{${Math.min(...indentLengths)}}`, 'g');
14
- return str.replace(pattern, '\n');
15
- }
16
- return str;
17
- }
18
-
19
- const edgeops: { operator: '--' | '->', location: FileRange }[] = [];
20
-
21
- const b = new Builder({
22
- locationFunction: location,
23
- });
24
- }
25
-
26
- start = Dot
27
-
28
- Dot = __ v:_dot __ { return v; }
29
-
30
- Graph = __ v:_graph __ { return v; }
31
-
32
- Node = __ v:_node __ { return v; }
33
-
34
- AttributeList = __ v:_attributes __ { return v; }
35
-
36
- Attribute = __ v:_attribute __ { return v; }
37
-
38
- Edge = __ v:_edge __ { return v; }
39
-
40
- Subgraph = __ v:_subgraph __ { return v; }
41
-
42
- NodeRef = __ v:_node_ref __ { return v; }
43
-
44
- AttibutesItem = __ v:_attibutes_item __ { return v; }
45
-
46
- Comment = __ v:_comment __ { return v; }
47
-
48
- ClusterStatements = (Attribute / AttributeList / Edge / Subgraph / Node / Comment)*
49
-
50
- _dot = c1:Comment* graph:Graph c2:Comment* { return b.createElement('Dot', {}, [...c1, graph, ...c2]); }
51
-
52
- _graph
53
- = _strict:"strict"i? _ _kind:("graph"i / "digraph"i) _ id:_literal? __ "{" children:ClusterStatements __ "}" {
54
- const strict = !!_strict;
55
- const kind = _kind.toLowerCase();
56
- const directed = kind === 'digraph';
57
- for (const edgeop of edgeops) {
58
- if (directed) {
59
- if (edgeop.operator !== '->') {
60
- error(`In digraph, it's necessary to describe with "->" operator to create edge.`, edgeop.location);
61
- }
62
- } else {
63
- if (edgeop.operator !== '--') {
64
- error(`In graph, it's necessary to describe with "--" operator to create edge.`, edgeop.location);
65
- }
66
- }
67
- }
68
- return b.createElement(
69
- 'Graph',
70
- id !== null
71
- ? {
72
- id,
73
- directed,
74
- strict,
75
- }
76
- : {
77
- directed,
78
- strict,
79
- },
80
- children,
81
- );
82
- }
83
-
84
- _attribute
85
- = keyValue:_key_value _ ";"? {
86
- return b.createElement(
87
- 'Attribute',
88
- {
89
- ...keyValue,
90
- },
91
- [],
92
- );
93
- }
94
-
95
- _attributes
96
- = _kind:("graph"i / "node"i / "edge"i) children:_attribute_list _ ";"? {
97
- return b.createElement(
98
- 'AttributeList',
99
- {
100
- kind: `${_kind.slice(0, 1).toUpperCase()}${_kind.slice(1).toLowerCase()}`,
101
- },
102
- children,
103
- );
104
- }
105
-
106
- _edge
107
- = id:_edge_target rhs:_edge_rhs _children:_attribute_list? _ ";"? {
108
- // @ts-ignore
109
- return b.createElement(
110
- // @ts-ignore
111
- 'Edge',
112
- {
113
- targets: [id, ...rhs],
114
- },
115
- _children ?? [],
116
- );
117
- }
118
-
119
- _node
120
- = id:_literal _ _children:_attribute_list? _ ";"? {
121
- return b.createElement(
122
- 'Node',
123
- {
124
- id,
125
- },
126
- _children ?? [],
127
- );
128
- }
129
-
130
- _key_value = key:_literal _ "=" _ value:_literal { return { key, value }; }
131
-
132
- _attibutes_item
133
- = kv:_key_value _ ("," / ";")? {
134
- return b.createElement(
135
- 'Attribute',
136
- {
137
- ...kv,
138
- location: location(),
139
- },
140
- [],
141
- );
142
- }
143
-
144
- _attribute_list = _ "[" list:(AttibutesItem / Comment)* __ "]" { return list; }
145
-
146
- _edge_target_group
147
- = "{" id:NodeRef rest:(("," / ";")? v:NodeRef { return v; })* ("," / ";")? __ "}" {
148
- return b.createElement('NodeRefGroup', {}, [id, ...rest]);
149
- }
150
-
151
- _edge_target
152
- = _edge_target_group
153
- / NodeRef
154
-
155
- _edge_operator = operator:("->" / "--") { return { operator, location: location() }; }
156
-
157
- _edge_rhs
158
- = _ edgeop:_edge_operator _ id:_edge_target _ rest:_edge_rhs? {
159
- edgeops.push(edgeop);
160
- return [id].concat(rest || []);
161
- }
162
-
163
- _node_ref
164
- = id:_literal port:_port? {
165
- return b.createElement(
166
- 'NodeRef',
167
- {
168
- id,
169
- ...port,
170
- },
171
- [],
172
- );
173
- }
174
-
175
- _port "port"
176
- = ":" port:_literal compass:(":" compass:_compass { return compass; })? {
177
- if (['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'].includes(port)) {
178
- return { compass: port };
179
- } else if (compass) {
180
- return { port, compass };
181
- }
182
- return { port };
183
- }
184
-
185
- _subgraph_id = "subgraph"i _ id:_literal? _ { return id; }
186
-
187
- _subgraph
188
- = id:_subgraph_id? "{" _children:ClusterStatements? __ "}" {
189
- const children = _children ?? [];
190
- return b.createElement('Subgraph', id ? { id } : {}, children);
191
- }
192
-
193
- _compass_keyword
194
- = "n"
195
- / "ne"
196
- / "e"
197
- / "se"
198
- / "s"
199
- / "sw"
200
- / "w"
201
- / "nw"
202
-
203
- _compass
204
- = v:(
205
- value:_compass_keyword { return { value, quoted: false }; }
206
- / "\"" value:_compass_keyword "\"" { return { value, quoted: true }; }
207
- ) {
208
- return b.createElement(
209
- 'Literal',
210
- {
211
- ...v,
212
- },
213
- [],
214
- );
215
- }
216
-
217
- _literal
218
- = QUOTED_STRING
219
- / HTML_STRING
220
- / value:(STRING / NUMBER_STRING / NUMBER) {
221
- return b.createElement(
222
- 'Literal',
223
- {
224
- value,
225
- quoted: false,
226
- },
227
- [],
228
- );
229
- }
230
-
231
- _comment
232
- = _block_comment
233
- / _slash_comment
234
- / _macro_comment
235
-
236
- _block_comment
237
- = "/*" v:(!"*/" v:. { return v; })* "*/" {
238
- return b.createElement(
239
- 'Comment',
240
- {
241
- kind: 'Block',
242
- value: dedent(v.join('').replace(/[ \t]*\*/g, '')),
243
- },
244
- [],
245
- );
246
- }
247
-
248
- _slash_comment
249
- = lines:_slash_comment_line+ {
250
- return b.createElement(
251
- 'Comment',
252
- {
253
- kind: 'Slash',
254
- value: dedent(lines.join('\n')),
255
- },
256
- [],
257
- );
258
- }
259
-
260
- _slash_comment_line = _ "//" v:(!_newline v:. { return v; })* _newline? { return v.join(''); }
261
-
262
- _macro_comment
263
- = lines:_macro_comment_line+ {
264
- return b.createElement(
265
- 'Comment',
266
- {
267
- kind: 'Macro',
268
- value: dedent(lines.join('\n')),
269
- },
270
- [],
271
- );
272
- }
273
-
274
- _macro_comment_line = _ "#" v:(!_newline v:. { return v; })* _newline? { return v.join(''); }
275
-
276
- STRING "UNICODE_STRING" = first:StringStart rest:StringPart* { return first + rest.join(''); }
277
-
278
- NUMBER_STRING = first:NUMBER rest:STRING { return first + rest; }
279
-
280
- StringStart
281
- = UnicodeLetter
282
- / "$"
283
- / "_"
284
-
285
- StringPart
286
- = StringStart
287
- / UnicodeDigit
288
-
289
- NUMBER "NUMBER" = n:("-"? ("." [0-9]+ / [0-9]+ ("." [0-9]*)?)) { return text(); }
290
-
291
- /* html strings are enclosed in <>. The inside of those strings is xml. All we
292
- * care about is a balanced number of <'s and >'s, so we can simplify our life
293
- * a little by just matching balanced expressions, and then returning what's
294
- * inside the outermost <> pair
295
- */
296
- HTML_STRING
297
- = v:html_raw_string {
298
- return b.createElement(
299
- 'Literal',
300
- {
301
- value: v.slice(1, v.length - 1),
302
- quoted: 'html',
303
- },
304
- [],
305
- );
306
- }
307
-
308
- html_raw_string = "<" v:(html_char / html_raw_string)* ">" { return '<' + v.join('') + '>'; }
309
-
310
- html_char = v:(!(">" / "<") v:. { return v; })+ { return v.join(''); }
311
-
312
- QUOTED_STRING
313
- = "\"" chars:DoubleStringCharacter* "\"" {
314
- return b.createElement(
315
- 'Literal',
316
- {
317
- value: chars.join(''),
318
- quoted: true,
319
- },
320
- [],
321
- );
322
- }
323
-
324
- DoubleStringCharacter
325
- = QuoteEscape
326
- / !("\"" / LineTerminator) SourceCharacter { return text(); }
327
- / LineContinuation
328
-
329
- QuoteEscape = v:("\\" .) { return v[1] === '"' ? '"' : v[0] + v[1]; }
330
-
331
- LineContinuation = "\\" LineTerminatorSequence { return ''; }
332
-
333
- LineTerminator = [\n\r\u2028\u2029]
334
-
335
- LineTerminatorSequence "end of line"
336
- = "\n"
337
- / "\r\n"
338
- / "\r"
339
- / "\u2028"
340
- / "\u2029"
341
-
342
- SourceCharacter = .
343
-
344
- chars = chars:char+ { return chars.join(''); }
345
-
346
- char
347
- = [^"\\\0-\x1F\x7f]
348
- / "\\\"" { return '"'; }
349
- / "\\" _newlines { return ''; }
350
- / "\\" { return '\\'; }
351
-
352
- _ "whitespace" = _whitespace*
353
-
354
- __ "WHITESPACE" = (_whitespace / _newline)*
355
-
356
- _newline = [\n\r]
357
-
358
- _whitespace = [ \t]
359
-
360
- _newlines = _newline+
361
-
362
- UnicodeLetter
363
- = Lu
364
- / Ll
365
- / Lt
366
- / Lm
367
- / Lo
368
- / Nl
369
-
370
- UnicodeDigit = Nd
371
-
372
- // Letter, Lowercase
373
- Ll
374
- = [\u0061-\u007A\u00B5\u00DF-\u00F6\u00F8-\u00FF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0561-\u0587\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7FA\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]
375
-
376
- // Letter, Modifier
377
- Lm
378
- = [\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uAA70\uAADD\uAAF3-\uAAF4\uFF70\uFF9E-\uFF9F]
379
-
380
- // Letter, Other
381
- Lo
382
- = [\u00AA\u00BA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0977\u0979-\u097F\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58-\u0C59\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]
383
-
384
- // Letter, Titlecase
385
- Lt = [\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]
386
-
387
- // Letter, Uppercase
388
- Lu
389
- = [\u0041-\u005A\u00C0-\u00D6\u00D8-\u00DE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA\uFF21-\uFF3A]
390
-
391
- // Number, Letter
392
- Nl = [\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]
393
-
394
- // Number, Decimal Digit
395
- Nd
396
- = [\u0030-\u0039\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]
@@ -1 +0,0 @@
1
- export * from './parse.js';
@@ -1,263 +0,0 @@
1
- import { describe, expect, test } from 'vitest';
2
- import { parse } from './parse.js';
3
-
4
- describe('parse', () => {
5
- describe('attribute', () => {
6
- test('set value', () => {
7
- const result = parse('style=filled;', { startRule: 'Attribute' });
8
- expect(result).toMatchSnapshot();
9
- });
10
-
11
- test('set quoted value', () => {
12
- const result = parse('label = "example #1";', { startRule: 'Attribute' });
13
- expect(result).toMatchSnapshot();
14
- });
15
-
16
- test('set HTMLLike value', () => {
17
- const result = parse(
18
- `
19
- label = <
20
- <table border="0">
21
- <tr><td align="text">By default, td text is center-aligned</td></tr>
22
- <tr><td align="text">This td is left aligned<br align="left" /></td></tr>
23
- <tr><td align="text">this one centered<br align="center" /></td></tr>
24
- <tr><td align="text">and this one right aligned<br align="right" /><br align="right"/></td></tr>
25
- <tr><td align="text">The value of a closing<br align="left"/>&lt;br/&gt; tag<br align="center"/>refers to the preceeding text<br align="right"/></td></tr>
26
- </table>
27
- >`,
28
- { startRule: 'Attribute' },
29
- );
30
- expect(result).toMatchSnapshot();
31
- });
32
- });
33
-
34
- describe('AttributeList', () => {
35
- test('node', () => {
36
- const result = parse(
37
- `
38
- node [
39
- style=filled;
40
- color=lightgrey;
41
- label = "example #1";
42
- ]
43
- `,
44
- { startRule: 'AttributeList' },
45
- );
46
- expect(result).toMatchSnapshot();
47
- });
48
-
49
- test('edge', () => {
50
- const result = parse(
51
- `
52
- edge [
53
- color=red;
54
- label = "example example";
55
- ];`,
56
- { startRule: 'AttributeList' },
57
- );
58
- expect(result).toMatchSnapshot();
59
- });
60
-
61
- test('graph', () => {
62
- const result = parse(
63
- 'graph [ fillcolor=red, label = "example example"];',
64
- {
65
- startRule: 'AttributeList',
66
- },
67
- );
68
- expect(result).toMatchSnapshot();
69
- });
70
-
71
- test('with comment', () => {
72
- const result = parse(
73
- `
74
- node [
75
- # comment 1
76
- style=filled,
77
- ]
78
- `,
79
- { startRule: 'AttributeList' },
80
- );
81
- expect(result).toMatchSnapshot();
82
- });
83
- });
84
-
85
- describe('edge', () => {
86
- test('digraph edge', () => {
87
- const result = parse('a -> b;', { startRule: 'Edge' });
88
- expect(result).toMatchSnapshot();
89
- });
90
-
91
- test('graph edge', () => {
92
- const result = parse('a -- b;', { startRule: 'Edge' });
93
- expect(result).toMatchSnapshot();
94
- });
95
-
96
- test('edge with port', () => {
97
- const result = parse('a:p1 -> b:p2 -> c:p3:w -> d:w;', {
98
- startRule: 'Edge',
99
- });
100
- expect(result).toMatchSnapshot();
101
- });
102
-
103
- test('edge with attributes', () => {
104
- const result = parse(
105
- `
106
- a -> b [
107
- color=lightgrey;
108
- label = "example #1";
109
- ];
110
- `,
111
- { startRule: 'Edge' },
112
- );
113
- expect(result).toMatchSnapshot();
114
- });
115
-
116
- test('grouped edge targets', () => {
117
- const result = parse('{a1, a2} -> {b1, b2};', { startRule: 'Edge' });
118
- expect(result).toMatchSnapshot();
119
- });
120
-
121
- test('grouped ported edge targets', () => {
122
- const result = parse('{a1:p1, a2:p2:w} -> {b1:e, b2:p3};', {
123
- startRule: 'Edge',
124
- });
125
- expect(result).toMatchSnapshot();
126
- });
127
- });
128
-
129
- describe('subgraph', () => {
130
- test('named subgraph', () => {
131
- const result = parse('subgraph hoge {}', { startRule: 'Subgraph' });
132
- expect(result).toMatchSnapshot();
133
- });
134
-
135
- test('anonymous subgraph', () => {
136
- const result = parse('subgraph {}', { startRule: 'Subgraph' });
137
- expect(result).toMatchSnapshot();
138
- });
139
-
140
- test('no keyword anonymous', () => {
141
- const result = parse('{}', { startRule: 'Subgraph' });
142
- expect(result).toMatchSnapshot();
143
- });
144
- });
145
-
146
- describe('graph', () => {
147
- test('digraph named test', () => {
148
- const result = parse('digraph test {}', { startRule: 'Graph' });
149
- expect(result).toMatchSnapshot();
150
- });
151
-
152
- test('strict digraph named test', () => {
153
- const result = parse('strict digraph test {}', { startRule: 'Graph' });
154
- expect(result).toMatchSnapshot();
155
- });
156
-
157
- test('digraph named test(quoted)', () => {
158
- const result = parse('digraph "test" {}', { startRule: 'Graph' });
159
- expect(result).toMatchSnapshot();
160
- });
161
-
162
- test('anonymous digraph', () => {
163
- const result = parse('digraph {}', { startRule: 'Graph' });
164
- expect(result).toMatchSnapshot();
165
- });
166
-
167
- test('graph named test', () => {
168
- const result = parse('graph test {}', { startRule: 'Graph' });
169
- expect(result).toMatchSnapshot();
170
- });
171
-
172
- test('strict graph named test', () => {
173
- const result = parse('strict graph test {}', { startRule: 'Graph' });
174
- expect(result).toMatchSnapshot();
175
- });
176
-
177
- describe('invalid edge', () => {
178
- test('digraph have to use "->" operator in edge', () => {
179
- expect(() => {
180
- parse(
181
- `
182
- digraph {
183
- a -- b;
184
- }`,
185
- { startRule: 'Graph' },
186
- );
187
- }).toThrowErrorMatchingInlineSnapshot(
188
- `[DotSyntaxError: In digraph, it's necessary to describe with "->" operator to create edge.]`,
189
- );
190
- });
191
-
192
- test('graph have to use "--" operator in edge', () => {
193
- expect(() => {
194
- parse(
195
- `
196
- graph {
197
- a -> b;
198
- }`,
199
- { startRule: 'Graph' },
200
- );
201
- }).toThrowErrorMatchingInlineSnapshot(
202
- `[DotSyntaxError: In graph, it's necessary to describe with "--" operator to create edge.]`,
203
- );
204
- });
205
- });
206
- });
207
-
208
- describe('node', () => {
209
- test('simple node', () => {
210
- const result = parse('test;', { startRule: 'Node' });
211
- expect(result).toMatchSnapshot();
212
- });
213
-
214
- test('node with attributes', () => {
215
- const result = parse(
216
- `
217
- test [
218
- style=filled;
219
- color=lightgrey;
220
- label = "example #1";
221
- ];
222
- `,
223
- { startRule: 'Node' },
224
- );
225
- expect(result).toMatchSnapshot();
226
- });
227
- });
228
-
229
- describe('dot', () => {
230
- test('with comments', () => {
231
- const result = parse(
232
- `
233
- /** comment1 */
234
- digraph {}
235
- /** comment2 */
236
- `,
237
- { startRule: 'Dot' },
238
- );
239
- expect(result).toMatchSnapshot();
240
- });
241
- });
242
-
243
- describe('cluster_statements', () => {
244
- test('comments', () => {
245
- const result = parse(
246
- `
247
- // comment1
248
-
249
- // comment2
250
- // comment2
251
-
252
- # comment3
253
-
254
- # comment4
255
- # comment4
256
- /** comment 5*/
257
- `,
258
- { startRule: 'ClusterStatements' },
259
- );
260
- expect(result).toMatchSnapshot();
261
- });
262
- });
263
- });