@tuprolog/arg2p-ui 0.0.0-stage → 0.1.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.
Files changed (71) hide show
  1. package/README.md +48 -2
  2. package/dist/components/arg2p-editor.d.ts +73 -0
  3. package/dist/components/arg2p-editor.js +244 -0
  4. package/dist/components/arg2p-editor.js.map +1 -0
  5. package/dist/components/arg2p-flags.d.ts +58 -0
  6. package/dist/components/arg2p-flags.js +358 -0
  7. package/dist/components/arg2p-flags.js.map +1 -0
  8. package/dist/components/arg2p-framework.d.ts +102 -0
  9. package/dist/components/arg2p-framework.js +513 -0
  10. package/dist/components/arg2p-framework.js.map +1 -0
  11. package/dist/components/arg2p-graph.d.ts +112 -0
  12. package/dist/components/arg2p-graph.js +577 -0
  13. package/dist/components/arg2p-graph.js.map +1 -0
  14. package/dist/components/arg2p-solutions.d.ts +75 -0
  15. package/dist/components/arg2p-solutions.js +391 -0
  16. package/dist/components/arg2p-solutions.js.map +1 -0
  17. package/dist/data.d.ts +9 -0
  18. package/dist/data.js +11 -0
  19. package/dist/data.js.map +1 -0
  20. package/dist/editor/language.d.ts +9 -0
  21. package/dist/editor/language.js +78 -0
  22. package/dist/editor/language.js.map +1 -0
  23. package/dist/engine.d.ts +94 -0
  24. package/dist/engine.js +2 -0
  25. package/dist/engine.js.map +1 -0
  26. package/dist/flags/schema.d.ts +50 -0
  27. package/dist/flags/schema.js +195 -0
  28. package/dist/flags/schema.js.map +1 -0
  29. package/dist/flags/text.d.ts +18 -0
  30. package/dist/flags/text.js +85 -0
  31. package/dist/flags/text.js.map +1 -0
  32. package/dist/formats/declarations.d.ts +9 -0
  33. package/dist/formats/declarations.js +193 -0
  34. package/dist/formats/declarations.js.map +1 -0
  35. package/dist/formats/frameworks.d.ts +23 -0
  36. package/dist/formats/frameworks.js +130 -0
  37. package/dist/formats/frameworks.js.map +1 -0
  38. package/dist/graph/canvas.d.ts +21 -0
  39. package/dist/graph/canvas.js +76 -0
  40. package/dist/graph/canvas.js.map +1 -0
  41. package/dist/graph/drawing.d.ts +24 -0
  42. package/dist/graph/drawing.js +64 -0
  43. package/dist/graph/drawing.js.map +1 -0
  44. package/dist/graph/layout.d.ts +28 -0
  45. package/dist/graph/layout.js +167 -0
  46. package/dist/graph/layout.js.map +1 -0
  47. package/dist/graph/levels.d.ts +6 -0
  48. package/dist/graph/levels.js +25 -0
  49. package/dist/graph/levels.js.map +1 -0
  50. package/dist/graph/positions.d.ts +24 -0
  51. package/dist/graph/positions.js +43 -0
  52. package/dist/graph/positions.js.map +1 -0
  53. package/dist/index.d.ts +8 -0
  54. package/dist/index.js +11 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/js/engine.d.ts +35 -0
  57. package/dist/js/engine.js +110 -0
  58. package/dist/js/engine.js.map +1 -0
  59. package/dist/js/host.d.ts +75 -0
  60. package/dist/js/host.js +237 -0
  61. package/dist/js/host.js.map +1 -0
  62. package/dist/js/index.d.ts +2 -0
  63. package/dist/js/index.js +4 -0
  64. package/dist/js/index.js.map +1 -0
  65. package/dist/js/worker.d.ts +1 -0
  66. package/dist/js/worker.js +7 -0
  67. package/dist/js/worker.js.map +1 -0
  68. package/dist/theme.d.ts +5 -0
  69. package/dist/theme.js +48 -0
  70. package/dist/theme.js.map +1 -0
  71. package/package.json +65 -4
@@ -0,0 +1,193 @@
1
+ const NAME = '([a-z][a-zA-Z0-9_]*)';
2
+ const ARGUMENT_FACT = new RegExp(`^${NAME}$`);
3
+ const ARGUMENT_ARG = new RegExp(`^arg\\s*\\(\\s*${NAME}\\s*\\)$`);
4
+ const ATTACK_ARROW = new RegExp(`^${NAME}\\s*->\\s*${NAME}$`);
5
+ const ATTACK_ATT = new RegExp(`^att\\s*\\(\\s*${NAME}\\s*,\\s*${NAME}\\s*\\)$`);
6
+ const MUTUAL = new RegExp(`^${NAME}\\s*<->\\s*${NAME}$`);
7
+ /** The framework [theory] declares: its arguments in the order they are met, with those its attacks name */
8
+ export function declaredFramework(theory) {
9
+ const args = [];
10
+ const attacks = [];
11
+ const argument = (name) => {
12
+ if (!args.includes(name))
13
+ args.push(name);
14
+ };
15
+ const attack = (from, to) => {
16
+ argument(from);
17
+ argument(to);
18
+ if (!attacks.some(it => it.from === from && it.to === to))
19
+ attacks.push({ from, to });
20
+ };
21
+ declarations(theory).forEach(({ declaration }) => {
22
+ if (declaration.kind === 'argument')
23
+ argument(declaration.name);
24
+ else if (declaration.kind === 'attack')
25
+ attack(declaration.from, declaration.to);
26
+ else {
27
+ attack(declaration.a, declaration.b);
28
+ attack(declaration.b, declaration.a);
29
+ }
30
+ });
31
+ return { arguments: args, attacks };
32
+ }
33
+ /**
34
+ * [theory] declaring [framework] instead of what it declares: the declarations no longer drawn removed (half a mutual
35
+ * attack left as a plain one), the new ones added after the last declaration, one per line. [renamed] are arguments
36
+ * renamed in the drawing, renamed where they are declared.
37
+ */
38
+ export function redrawn(theory, framework, renamed = new Map()) {
39
+ const name = (it) => renamed.get(it) ?? it;
40
+ const wantedArguments = new Set(framework.arguments);
41
+ const wantedAttacks = new Set(framework.attacks.map(it => key(it.from, it.to)));
42
+ const declaredArguments = new Set();
43
+ const declaredAttacks = new Set();
44
+ const edits = [];
45
+ let after = -1;
46
+ declarations(theory).forEach(({ clause, declaration }) => {
47
+ after = clause.end;
48
+ let text;
49
+ if (declaration.kind === 'argument') {
50
+ const argument = name(declaration.name);
51
+ text = wantedArguments.has(argument) && !declaredArguments.has(argument) ? argumentText(argument, declaration.form) : null;
52
+ if (text !== null)
53
+ declaredArguments.add(argument);
54
+ }
55
+ else if (declaration.kind === 'attack') {
56
+ const [from, to] = [name(declaration.from), name(declaration.to)];
57
+ text = wantedAttacks.has(key(from, to)) && !declaredAttacks.has(key(from, to)) ? attackText(from, to, declaration.form) : null;
58
+ if (text !== null)
59
+ declaredAttacks.add(key(from, to));
60
+ }
61
+ else {
62
+ const [a, b] = [name(declaration.a), name(declaration.b)];
63
+ const ab = wantedAttacks.has(key(a, b)) && !declaredAttacks.has(key(a, b));
64
+ const ba = wantedAttacks.has(key(b, a)) && !declaredAttacks.has(key(b, a));
65
+ text = ab && ba ? `${a} <-> ${b}` : ab ? attackText(a, b, 'arrow') : ba ? attackText(b, a, 'arrow') : null;
66
+ if (ab)
67
+ declaredAttacks.add(key(a, b));
68
+ if (ba)
69
+ declaredAttacks.add(key(b, a));
70
+ }
71
+ if (text === null)
72
+ edits.push(removal(theory, clause));
73
+ else if (`${text}.` !== clause.text)
74
+ edits.push({ start: clause.start, end: clause.end, text: `${text}.` });
75
+ });
76
+ // an attack declares the arguments it names
77
+ framework.attacks.filter(it => declaredAttacks.has(key(it.from, it.to))).forEach(it => declaredArguments.add(it.from).add(it.to));
78
+ const added = [
79
+ ...framework.arguments.filter(it => !declaredArguments.has(it)).map(it => `${it}.`),
80
+ ...framework.attacks.filter(it => !declaredAttacks.has(key(it.from, it.to))).map(it => `${it.from} -> ${it.to}.`),
81
+ ];
82
+ if (added.length > 0) {
83
+ if (after >= 0)
84
+ edits.push({ start: after, end: after, text: added.map(it => `\n${it}`).join('') });
85
+ else {
86
+ // a theory with no declaration yet: they go at its end, under the profile when it is a new theory
87
+ const blank = theory.trim() === '';
88
+ const head = blank ? 'graphBuildMode(abstract).\n\n' : theory.endsWith('\n') ? '' : '\n';
89
+ edits.push({ start: theory.length, end: theory.length, text: `${head}${added.join('\n')}\n` });
90
+ }
91
+ }
92
+ return edits
93
+ .sort((a, b) => b.start - a.start)
94
+ .reduce((text, edit) => text.slice(0, edit.start) + edit.text + text.slice(edit.end), theory);
95
+ }
96
+ function key(from, to) {
97
+ return `${from}->${to}`;
98
+ }
99
+ function argumentText(name, form) {
100
+ return form === 'arg' ? `arg(${name})` : name;
101
+ }
102
+ function attackText(from, to, form) {
103
+ return form === 'att' ? `att(${from}, ${to})` : `${from} -> ${to}`;
104
+ }
105
+ // A clause taken out, with its line when nothing else is on it
106
+ function removal(theory, clause) {
107
+ const lineStart = theory.lastIndexOf('\n', clause.start - 1) + 1;
108
+ const newline = theory.indexOf('\n', clause.end);
109
+ const lineEnd = newline === -1 ? theory.length : newline;
110
+ const alone = theory.slice(lineStart, clause.start).trim() === '' && theory.slice(clause.end, lineEnd).trim() === '';
111
+ if (!alone)
112
+ return { start: clause.start, end: clause.end, text: '' };
113
+ return { start: lineStart, end: newline === -1 ? lineEnd : lineEnd + 1, text: '' };
114
+ }
115
+ function declarations(theory) {
116
+ return clausesOf(theory).flatMap(clause => {
117
+ const declaration = declarationOf(clause.text.slice(0, -1).trim());
118
+ return declaration === null ? [] : [{ clause, declaration }];
119
+ });
120
+ }
121
+ function declarationOf(text) {
122
+ let match;
123
+ if ((match = ARGUMENT_FACT.exec(text)))
124
+ return { kind: 'argument', name: match[1], form: 'fact' };
125
+ if ((match = ARGUMENT_ARG.exec(text)))
126
+ return { kind: 'argument', name: match[1], form: 'arg' };
127
+ if ((match = ATTACK_ARROW.exec(text)))
128
+ return { kind: 'attack', from: match[1], to: match[2], form: 'arrow' };
129
+ if ((match = ATTACK_ATT.exec(text)))
130
+ return { kind: 'attack', from: match[1], to: match[2], form: 'att' };
131
+ if ((match = MUTUAL.exec(text)))
132
+ return { kind: 'mutual', a: match[1], b: match[2] };
133
+ return null;
134
+ }
135
+ // The clauses of a Prolog text: up to a full stop followed by a blank (or the end), outside comments and quotes. A
136
+ // clause starts at its first character that is not blank nor comment; comments inside it are left in its text, so it
137
+ // does not match a declaration and is kept as written.
138
+ function clausesOf(theory) {
139
+ const clauses = [];
140
+ let start = -1;
141
+ let i = 0;
142
+ while (i < theory.length) {
143
+ const char = theory[i];
144
+ if (char === '%') {
145
+ const end = theory.indexOf('\n', i);
146
+ i = end === -1 ? theory.length : end;
147
+ continue;
148
+ }
149
+ if (char === '/' && theory[i + 1] === '*') {
150
+ const end = theory.indexOf('*/', i + 2);
151
+ i = end === -1 ? theory.length : end + 2;
152
+ continue;
153
+ }
154
+ if (/\s/.test(char)) {
155
+ i++;
156
+ continue;
157
+ }
158
+ if (start === -1)
159
+ start = i;
160
+ if (char === "'" || char === '"' || char === '`') {
161
+ i = closing(theory, i);
162
+ continue;
163
+ }
164
+ if (char === '0' && theory[i + 1] === "'") {
165
+ // a character code, 0'c
166
+ i += 3;
167
+ continue;
168
+ }
169
+ if (char === '.' && (i + 1 === theory.length || /[\s%]/.test(theory[i + 1])) && !/[#$&*+\-./:<=>?@^~\\]/.test(theory[i - 1] ?? '')) {
170
+ clauses.push({ start, end: i + 1, text: theory.slice(start, i + 1) });
171
+ start = -1;
172
+ }
173
+ i++;
174
+ }
175
+ return clauses;
176
+ }
177
+ // Past the quote closing the one at [at] (a doubled quote stands for itself)
178
+ function closing(text, at) {
179
+ const quote = text[at];
180
+ let i = at + 1;
181
+ while (i < text.length) {
182
+ if (text[i] === '\\')
183
+ i += 2;
184
+ else if (text[i] === quote && text[i + 1] === quote)
185
+ i += 2;
186
+ else if (text[i] === quote)
187
+ return i + 1;
188
+ else
189
+ i++;
190
+ }
191
+ return text.length;
192
+ }
193
+ //# sourceMappingURL=declarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declarations.js","sourceRoot":"","sources":["../../src/formats/declarations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { GraphData } from '../engine.js';
2
+ export interface Framework {
3
+ readonly arguments: readonly string[];
4
+ readonly attacks: readonly {
5
+ readonly from: string;
6
+ readonly to: string;
7
+ }[];
8
+ }
9
+ /** A framework read, with the names made atoms: `renamed` lists those that changed (`1` -> `a1`) */
10
+ export interface ReadFramework extends Framework {
11
+ readonly renamed: readonly {
12
+ readonly from: string;
13
+ readonly to: string;
14
+ }[];
15
+ }
16
+ /** The theory of [framework], in the profile abstract */
17
+ export declare function toTheory(framework: Framework): string;
18
+ /** The framework of [graph], an abstract one: its arguments by name */
19
+ export declare function frameworkOf(graph: GraphData): Framework;
20
+ export declare function toApx(framework: Framework): string;
21
+ export declare function toTgf(framework: Framework): string;
22
+ /** A framework in any of the three formats (an Error says where it is not) */
23
+ export declare function parseFramework(text: string): ReadFramework;
@@ -0,0 +1,130 @@
1
+ // Names have to be Prolog atoms: a lowercase letter, then letters, digits or underscores
2
+ const ATOM = /^[a-z][a-zA-Z0-9_]*$/;
3
+ /** The theory of [framework], in the profile abstract */
4
+ export function toTheory(framework) {
5
+ return [
6
+ 'graphBuildMode(abstract).',
7
+ '',
8
+ ...framework.arguments.map(it => `${it}.`),
9
+ ...framework.attacks.map(it => `${it.from} -> ${it.to}.`),
10
+ ].join('\n') + '\n';
11
+ }
12
+ /** The framework of [graph], an abstract one: its arguments by name */
13
+ export function frameworkOf(graph) {
14
+ const names = new Map(graph.arguments.map(it => [it.id, it.conclusion]));
15
+ return {
16
+ arguments: graph.arguments.map(it => it.conclusion),
17
+ attacks: graph.attacks
18
+ .filter(it => names.has(it.from) && names.has(it.to))
19
+ .map(it => ({ from: names.get(it.from), to: names.get(it.to) })),
20
+ };
21
+ }
22
+ export function toApx(framework) {
23
+ return [...framework.arguments.map(it => `arg(${it}).`), ...framework.attacks.map(it => `att(${it.from},${it.to}).`)].join('\n') + '\n';
24
+ }
25
+ export function toTgf(framework) {
26
+ return [...framework.arguments, '#', ...framework.attacks.map(it => `${it.from} ${it.to}`)].join('\n') + '\n';
27
+ }
28
+ /** A framework in any of the three formats (an Error says where it is not) */
29
+ export function parseFramework(text) {
30
+ const lines = text.split(/\r?\n/).map(it => it.replace(/%.*$/, '').trim());
31
+ const content = lines.filter(it => (it !== '' && !it.startsWith('#')) || it === '#');
32
+ if (content.some(it => /^(arg|att)\s*\(/.test(it)))
33
+ return named(parseApx(content));
34
+ if (content.length > 0 && /^p\s+af\s+\d+$/.test(content[0]))
35
+ return named(parseIccma23(content));
36
+ return named(parseTgf(content));
37
+ }
38
+ function parseApx(lines) {
39
+ const args = [];
40
+ const attacks = [];
41
+ lines.forEach((line, index) => {
42
+ line.split(/(?<=\))\s*\.\s*/)
43
+ .filter(it => it.trim() !== '')
44
+ .forEach(fact => {
45
+ const arg = /^arg\s*\(\s*([^,()]+?)\s*\)\s*\.?$/.exec(fact);
46
+ const att = /^att\s*\(\s*([^,()]+?)\s*,\s*([^,()]+?)\s*\)\s*\.?$/.exec(fact);
47
+ if (arg)
48
+ args.push(arg[1]);
49
+ else if (att)
50
+ attacks.push({ from: att[1], to: att[2] });
51
+ else
52
+ throw new Error(`Line ${index + 1}: expected arg(a). or att(a,b)., found "${fact}"`);
53
+ });
54
+ });
55
+ return { arguments: args, attacks };
56
+ }
57
+ function parseTgf(lines) {
58
+ const separator = lines.indexOf('#');
59
+ if (separator === -1) {
60
+ throw new Error("Not an APX, TGF or ICCMA'23 framework: a TGF file has a line # between arguments and attacks");
61
+ }
62
+ // a node line may carry a label after the id: the id is the name
63
+ const args = lines.slice(0, separator).map(it => it.split(/\s+/)[0]);
64
+ const attacks = lines
65
+ .slice(separator + 1)
66
+ .filter(it => it !== '#')
67
+ .map((line, index) => {
68
+ const parts = line.split(/\s+/);
69
+ if (parts.length < 2)
70
+ throw new Error(`Attack ${index + 1}: expected two arguments, found "${line}"`);
71
+ return { from: parts[0], to: parts[1] };
72
+ });
73
+ return { arguments: args, attacks };
74
+ }
75
+ function parseIccma23(lines) {
76
+ const count = parseInt(lines[0].split(/\s+/)[2]);
77
+ const args = Array.from({ length: count }, (_, i) => `${i + 1}`);
78
+ const attacks = lines.slice(1).map((line, index) => {
79
+ const parts = line.split(/\s+/);
80
+ if (parts.length !== 2 || parts.some(it => !/^\d+$/.test(it) || +it < 1 || +it > count)) {
81
+ throw new Error(`Attack ${index + 1}: expected two arguments between 1 and ${count}, found "${line}"`);
82
+ }
83
+ return { from: parts[0], to: parts[1] };
84
+ });
85
+ return { arguments: args, attacks };
86
+ }
87
+ // Every name made an atom, the same way everywhere it appears, and the arguments only mentioned by attacks added
88
+ function named(framework) {
89
+ const names = new Map();
90
+ const used = new Set(framework.arguments.filter(it => ATOM.test(it)));
91
+ const atom = (raw) => {
92
+ const known = names.get(raw);
93
+ if (known !== undefined)
94
+ return known;
95
+ let name = ATOM.test(raw) ? raw : candidate(raw);
96
+ if (name !== raw) {
97
+ const base = name;
98
+ for (let n = 2; used.has(name); n++)
99
+ name = `${base}_${n}`;
100
+ used.add(name);
101
+ }
102
+ names.set(raw, name);
103
+ return name;
104
+ };
105
+ const args = [];
106
+ const add = (name) => {
107
+ if (!args.includes(name))
108
+ args.push(name);
109
+ };
110
+ framework.arguments.forEach(it => add(atom(it)));
111
+ const attacks = [];
112
+ framework.attacks.forEach(it => {
113
+ const attack = { from: atom(it.from), to: atom(it.to) };
114
+ add(attack.from);
115
+ add(attack.to);
116
+ if (!attacks.some(a => a.from === attack.from && a.to === attack.to))
117
+ attacks.push(attack);
118
+ });
119
+ const renamed = [...names].filter(([raw, name]) => raw !== name).map(([from, to]) => ({ from, to }));
120
+ return { arguments: args, attacks, renamed };
121
+ }
122
+ function candidate(raw) {
123
+ const cleaned = raw.replace(/[^a-zA-Z0-9_]/g, '_');
124
+ if (/^[a-z]/.test(cleaned))
125
+ return cleaned;
126
+ if (/^[A-Z]/.test(cleaned))
127
+ return cleaned[0].toLowerCase() + cleaned.slice(1);
128
+ return `a${cleaned}`;
129
+ }
130
+ //# sourceMappingURL=frameworks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frameworks.js","sourceRoot":"","sources":["../../src/formats/frameworks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type Core, type StylesheetJson } from 'cytoscape';
2
+ export declare const NODE_FONT: {
3
+ family: string;
4
+ size: number;
5
+ };
6
+ /** A Cytoscape instance drawing in [container], or a headless one where nothing can be drawn */
7
+ export declare function drawing(container: HTMLElement, style: StylesheetJson): Core;
8
+ /** [cy] fitted to its area, no closer than FIT_ZOOM */
9
+ export declare function fit(cy: Core): void;
10
+ /** The size of an ellipse that holds [label] (lines split at \n) */
11
+ export declare function nodeSize(label: string): {
12
+ width: number;
13
+ height: number;
14
+ };
15
+ /** The whole drawing as a PNG picture, as a data URL, on [background] */
16
+ export declare function png(cy: Core, background: string): string;
17
+ /**
18
+ * Keeps [cy] the size of [container] (a page may hide it, or lay it out again), fitting the drawing once it is shown
19
+ * after being hidden. Gives what stops it.
20
+ */
21
+ export declare function followSize(cy: Core, container: HTMLElement): () => void;
@@ -0,0 +1,76 @@
1
+ import cytoscape from 'cytoscape';
2
+ // What the components draw on: a Cytoscape instance in their container. Where nothing can be drawn (no canvas, as in
3
+ // a simulated DOM), it is headless: it keeps the elements, their positions and their events alike, and draws nothing.
4
+ // The font the nodes are written in, and how their size follows from what they say
5
+ export const NODE_FONT = { family: 'arial, sans-serif', size: 14 };
6
+ const LINE_HEIGHT = 20;
7
+ const PADDING_X = 24;
8
+ const PADDING_Y = 14;
9
+ const CHARACTER_WIDTH = 8;
10
+ let measure;
11
+ function canvas() {
12
+ if (measure === undefined) {
13
+ try {
14
+ measure = document.createElement('canvas').getContext('2d');
15
+ }
16
+ catch {
17
+ measure = null;
18
+ }
19
+ if (measure)
20
+ measure.font = `${NODE_FONT.size}px ${NODE_FONT.family}`;
21
+ }
22
+ return measure;
23
+ }
24
+ /** A Cytoscape instance drawing in [container], or a headless one where nothing can be drawn */
25
+ export function drawing(container, style) {
26
+ const headless = canvas() === null;
27
+ return cytoscape({
28
+ ...(headless ? { headless: true, styleEnabled: true } : { container }),
29
+ style,
30
+ minZoom: 0.1,
31
+ maxZoom: 4,
32
+ });
33
+ }
34
+ // A small drawing fitted to its area is not blown up past this zoom
35
+ const FIT_ZOOM = 1.25;
36
+ /** [cy] fitted to its area, no closer than FIT_ZOOM */
37
+ export function fit(cy) {
38
+ cy.fit(undefined, 30);
39
+ if (cy.zoom() > FIT_ZOOM) {
40
+ cy.zoom(FIT_ZOOM);
41
+ cy.center();
42
+ }
43
+ }
44
+ /** The size of an ellipse that holds [label] (lines split at \n) */
45
+ export function nodeSize(label) {
46
+ const lines = label.split('\n');
47
+ const context = canvas();
48
+ const text = Math.max(...lines.map(it => context?.measureText(it).width ?? it.length * CHARACTER_WIDTH));
49
+ const height = lines.length * LINE_HEIGHT + PADDING_Y * 2;
50
+ return { width: Math.max(height, text + PADDING_X * 2), height };
51
+ }
52
+ /** The whole drawing as a PNG picture, as a data URL, on [background] */
53
+ export function png(cy, background) {
54
+ if (cy.container() === null)
55
+ return '';
56
+ return cy.png({ full: true, bg: background, scale: 2, output: 'base64uri' });
57
+ }
58
+ /**
59
+ * Keeps [cy] the size of [container] (a page may hide it, or lay it out again), fitting the drawing once it is shown
60
+ * after being hidden. Gives what stops it.
61
+ */
62
+ export function followSize(cy, container) {
63
+ if (typeof ResizeObserver === 'undefined' || cy.container() === null)
64
+ return () => { };
65
+ let hidden = container.clientWidth === 0 || container.clientHeight === 0;
66
+ const observer = new ResizeObserver(() => {
67
+ const nowHidden = container.clientWidth === 0 || container.clientHeight === 0;
68
+ cy.resize();
69
+ if (hidden && !nowHidden && cy.elements().nonempty())
70
+ fit(cy);
71
+ hidden = nowHidden;
72
+ });
73
+ observer.observe(container);
74
+ return () => observer.disconnect();
75
+ }
76
+ //# sourceMappingURL=canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/graph/canvas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ArgumentData, AttackData, GraphData } from '../engine.js';
2
+ /** Whether the arguments of [graph] are those of an abstract framework: named by the theory, with no structure */
3
+ export declare function isAbstract(graph: GraphData): boolean;
4
+ /** The name [argument] is shown by: its identifier (A0, ...), or in an abstract framework the name the theory gives it */
5
+ export declare function nameOf(argument: ArgumentData, abstract: boolean): string;
6
+ /** What the node of [argument] says: its name, and its conclusion under it when [conclusions] are shown */
7
+ export declare function nodeLabel(argument: ArgumentData, abstract: boolean, conclusions: boolean): string;
8
+ /** `caFa(closedReg, damages)` -> ["caFa(closedReg,", "damages)"]: lines broken after commas, the last cut short */
9
+ export declare function wrapTerm(term: string): string[];
10
+ /** The roundness of an attack from [from] to [to]: less for long ones */
11
+ export declare function curveOf(from: {
12
+ x: number;
13
+ y: number;
14
+ }, to: {
15
+ x: number;
16
+ y: number;
17
+ }): number;
18
+ /** The kind of [argument]: an assumption (ABA), a premise (no top rule), or one built by its top rule */
19
+ export declare function kindOf(argument: ArgumentData, abstract: boolean): 'abstract' | 'assumption' | 'premise' | 'rule';
20
+ /** The attacks [graph] has on and by [id], with the arguments they come from or go to */
21
+ export declare function attacksAround(graph: GraphData, id: string): {
22
+ by: AttackData[];
23
+ on: AttackData[];
24
+ };
@@ -0,0 +1,64 @@
1
+ // What a graph is drawn from, apart from the canvas that draws it: the names of the arguments, what their nodes say,
2
+ // and how their edges bend.
3
+ // Conclusions on the nodes are wrapped at their commas into lines of about this length, and cut after a few lines:
4
+ // the popup has the full text
5
+ const CONCLUSION_LINE = 18;
6
+ const CONCLUSION_LINES = 3;
7
+ // Attacks are curved, so that mutual attacks do not overlap; long ones are curved less, or they would arc across the
8
+ // whole drawing
9
+ const CURVE = 0.25;
10
+ const CURVE_LENGTH = 160;
11
+ const MIN_CURVE = 0.06;
12
+ /** Whether the arguments of [graph] are those of an abstract framework: named by the theory, with no structure */
13
+ export function isAbstract(graph) {
14
+ return graph.profile === 'abstract';
15
+ }
16
+ /** The name [argument] is shown by: its identifier (A0, ...), or in an abstract framework the name the theory gives it */
17
+ export function nameOf(argument, abstract) {
18
+ return abstract ? argument.conclusion : argument.id;
19
+ }
20
+ /** What the node of [argument] says: its name, and its conclusion under it when [conclusions] are shown */
21
+ export function nodeLabel(argument, abstract, conclusions) {
22
+ const name = nameOf(argument, abstract);
23
+ // an abstract argument is its conclusion
24
+ if (abstract || !conclusions)
25
+ return name;
26
+ return [name, ...wrapTerm(argument.conclusion)].join('\n');
27
+ }
28
+ /** `caFa(closedReg, damages)` -> ["caFa(closedReg,", "damages)"]: lines broken after commas, the last cut short */
29
+ export function wrapTerm(term) {
30
+ const lines = [];
31
+ term.split(/(?<=,) /).forEach(part => {
32
+ const last = lines.length - 1;
33
+ if (last >= 0 && `${lines[last]} ${part}`.length <= CONCLUSION_LINE)
34
+ lines[last] += ` ${part}`;
35
+ else
36
+ lines.push(part);
37
+ });
38
+ if (lines.length <= CONCLUSION_LINES)
39
+ return lines;
40
+ return [...lines.slice(0, CONCLUSION_LINES - 1), `${lines[CONCLUSION_LINES - 1]} …`];
41
+ }
42
+ /** The roundness of an attack from [from] to [to]: less for long ones */
43
+ export function curveOf(from, to) {
44
+ const length = Math.hypot(to.x - from.x, to.y - from.y);
45
+ if (length === 0)
46
+ return CURVE;
47
+ return Math.max(MIN_CURVE, Math.min(CURVE, (CURVE * CURVE_LENGTH) / length));
48
+ }
49
+ /** The kind of [argument]: an assumption (ABA), a premise (no top rule), or one built by its top rule */
50
+ export function kindOf(argument, abstract) {
51
+ if (abstract)
52
+ return 'abstract';
53
+ if (/ : asm\(/.test(argument.descriptor))
54
+ return 'assumption';
55
+ return argument.topRule === 'none' ? 'premise' : 'rule';
56
+ }
57
+ /** The attacks [graph] has on and by [id], with the arguments they come from or go to */
58
+ export function attacksAround(graph, id) {
59
+ return {
60
+ by: graph.attacks.filter(it => it.to === id),
61
+ on: graph.attacks.filter(it => it.from === id),
62
+ };
63
+ }
64
+ //# sourceMappingURL=drawing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawing.js","sourceRoot":"","sources":["../../src/graph/drawing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface Link {
2
+ readonly from: string;
3
+ readonly to: string;
4
+ }
5
+ export interface Point {
6
+ x: number;
7
+ y: number;
8
+ }
9
+ export interface Size {
10
+ readonly width: number;
11
+ readonly height: number;
12
+ }
13
+ export interface LayoutOptions {
14
+ /** The room per node, without [sizes] */
15
+ spacing?: number;
16
+ /** The least distance between rows */
17
+ levelSeparation?: number;
18
+ attacks?: readonly Link[];
19
+ /** height / width of the area the drawing is shown in: rows are moved apart for the drawing to fill it */
20
+ aspect?: number | null;
21
+ /** Rows with more nodes than this are drawn zig-zag (every other node lower), packing about twice as tight */
22
+ staggerFrom?: number;
23
+ /** The sizes of the drawn nodes: neighbours are kept [gap] apart edge to edge, rows make room for tall nodes */
24
+ sizes?: ReadonlyMap<string, Size> | null;
25
+ gap?: number;
26
+ }
27
+ /** The position of every argument of [levels] */
28
+ export declare function layeredLayout(levels: ReadonlyMap<string, number>, links: readonly Link[], options?: LayoutOptions): Map<string, Point>;