annotate src/layout/suffixLabels.ts @ 106:2468f2227d22

make src/layout/ and src/render/ separation
author drewp@bigasterisk.com
date Sun, 13 Mar 2022 22:00:30 -0700
parents src/suffixLabels.ts@26c55d5d5202
children 5a1a79f54779
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
1 import { Term } from "n3";
11
1988ad250036 suffixLabels test runswith 'inv test'
drewp@localhost
parents: 3
diff changeset
2
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
3 type SuffixesNode = { usedBy?: string; children: Map<string, SuffixesNode> };
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
4 type DisplayNode = { label?: string; link?: string };
97
26c55d5d5202 WIP on views & joins
drewp@bigasterisk.com
parents: 36
diff changeset
5
26c55d5d5202 WIP on views & joins
drewp@bigasterisk.com
parents: 36
diff changeset
6 export class SuffixLabels {
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
7 displayNodes: Map<string, DisplayNode>;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
8 usedSuffixes: SuffixesNode;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
9 constructor() {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
10 this.displayNodes = new Map();
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
11 this.usedSuffixes = { usedBy: undefined, children: new Map() };
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
12 }
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
13
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
14 planDisplayForNode(node: Term) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
15 const uri = node.value;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
16 this._planDisplayForUri(uri);
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
17 }
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
18
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
19 _planDisplayForUri(uri: string) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
20 if (this.displayNodes.has(uri)) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
21 return;
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
22 }
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
23
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
24 const segments = uri.split("/");
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
25 let curs = this.usedSuffixes;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
26 let label: string | undefined = undefined;
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
27
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
28 for (let i = segments.length - 1; i >= 0; i--) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
29 const seg = segments[i];
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
30 if (curs.usedBy && curs.usedBy != uri) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
31 this._prependClashingUri(curs);
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
32 }
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
33
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
34 if (!curs.children.has(seg)) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
35 const child: SuffixesNode = { usedBy: undefined, children: new Map() };
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
36 curs.children.set(seg, child);
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
37
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
38 if (label === undefined) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
39 label = SuffixLabels._tailSegments(uri, segments.length - i);
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
40 child.usedBy = uri;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
41 }
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
42 }
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
43 curs = curs.children.get(seg)!;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
44 }
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
45 this.displayNodes.set(uri, { label: label });
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
46 }
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
47
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
48 _prependClashingUri(curs: SuffixesNode) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
49 // Claim: When a clash is discovered, only 1 uri needs to
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
50 // change its length, and there will be only one child node to
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
51 // follow, and the clashing uri can be changed to prepend that
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
52 // one child (since we'll see it again if that one wasn't
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
53 // enough).
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
54 const clashNode: DisplayNode = this.displayNodes.get(curs.usedBy!)!;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
55 const nextLeftSeg = curs.children.entries().next().value;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
56 if (nextLeftSeg[1].usedBy) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
57 throw new Error("unexpected");
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
58 }
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
59
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
60 clashNode.label = nextLeftSeg[0] + "/" + clashNode.label;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
61 nextLeftSeg[1].usedBy = curs.usedBy;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
62 curs.usedBy = undefined;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
63 }
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
64
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
65 // a substring to show for this uri
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
66 getLabelForNode(node: string) {
97
26c55d5d5202 WIP on views & joins
drewp@bigasterisk.com
parents: 36
diff changeset
67 const dn = this.displayNodes.get(node);
26c55d5d5202 WIP on views & joins
drewp@bigasterisk.com
parents: 36
diff changeset
68 if (dn === undefined) {
26c55d5d5202 WIP on views & joins
drewp@bigasterisk.com
parents: 36
diff changeset
69 throw new Error(`you never called planDisplayForNode on ${node}`);
26c55d5d5202 WIP on views & joins
drewp@bigasterisk.com
parents: 36
diff changeset
70 }
26c55d5d5202 WIP on views & joins
drewp@bigasterisk.com
parents: 36
diff changeset
71 return dn.label;
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
72 }
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
73
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
74 static _tailSegments(uri: string, n: number) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
75 let i = uri.length;
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
76 for (let rep = 0; rep < n; rep++) {
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
77 i = uri.lastIndexOf("/", i - 1);
3
a7ba8627a7b6 still trying to make imports work. add other files too
drewp@bigasterisk.com
parents:
diff changeset
78 }
36
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
79 return uri.substr(i + 1);
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
80 }
8b4dc9e87b56 reindent to 2-spaces with prettier
drewp@bigasterisk.com
parents: 35
diff changeset
81 }