Skip to content

Commit 3be4273

Browse files
committed
attach data-name attributes to SVG shapes for interactive diagrams
1 parent dafd9a8 commit 3be4273

File tree

5 files changed

+50
-10
lines changed

5 files changed

+50
-10
lines changed

dist/nomnoml.js

+24-5
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ var nomnoml;
486486
g.setLineDash([dash, dash]);
487487
}
488488
var drawNode = nomnoml.visualizers[style.visual] || nomnoml.visualizers["class"];
489+
g.setData('name', node.name);
489490
drawNode(node, x, y, config, g);
490491
g.setLineDash([]);
491492
g.save();
@@ -733,6 +734,7 @@ var nomnoml;
733734
measureText: function () { return ctx.measureText.apply(ctx, arguments); },
734735
moveTo: function () { return ctx.moveTo.apply(ctx, arguments); },
735736
restore: function () { return ctx.restore.apply(ctx, arguments); },
737+
setData: function (name, value) { },
736738
save: function () { return ctx.save.apply(ctx, arguments); },
737739
scale: function () { return ctx.scale.apply(ctx, arguments); },
738740
setLineDash: function () { return ctx.setLineDash.apply(ctx, arguments); },
@@ -766,7 +768,8 @@ var nomnoml;
766768
fill: 'none',
767769
textAlign: 'left',
768770
font: 'Helvetica, Arial, sans-serif',
769-
fontSize: 12
771+
fontSize: 12,
772+
attributes: {}
770773
};
771774
var states = [initialState];
772775
var elements = [];
@@ -803,7 +806,18 @@ var nomnoml;
803806
};
804807
}
805808
function State(dx, dy) {
806-
return { x: dx, y: dy, stroke: null, strokeWidth: null, fill: null, textAlign: null, dashArray: 'none', font: null, fontSize: null };
809+
return {
810+
x: dx,
811+
y: dy,
812+
stroke: null,
813+
strokeWidth: null,
814+
fill: null,
815+
textAlign: null,
816+
dashArray: 'none',
817+
font: null,
818+
fontSize: null,
819+
attributes: null
820+
};
807821
}
808822
function trans(coord, axis) {
809823
states.forEach(function (t) { coord += t[axis]; });
@@ -828,6 +842,10 @@ var nomnoml;
828842
}
829843
function newElement(type, attr, content) {
830844
var element = Element(type, attr, content);
845+
var extraData = lastDefined('attributes');
846+
for (var key in extraData) {
847+
element.attr['data-' + key] = extraData[key];
848+
}
831849
elements.push(element);
832850
return element;
833851
}
@@ -836,9 +854,7 @@ var nomnoml;
836854
height: function () { return 0; },
837855
clear: function () { },
838856
circle: function (p, r) {
839-
var element = Element('circle', { r: r, cx: tX(p.x), cy: tY(p.y) });
840-
elements.push(element);
841-
return element;
857+
return newElement('circle', { r: r, cx: tX(p.x), cy: tY(p.y) });
842858
},
843859
ellipse: function (center, w, h, start, stop) {
844860
if (stop) {
@@ -929,6 +945,9 @@ var nomnoml;
929945
save: function () {
930946
states.push(State(0, 0));
931947
},
948+
setData: function (name, value) {
949+
lastDefined('attributes')[name] = value;
950+
},
932951
scale: function () { },
933952
setLineDash: function (d) {
934953
last(states).dashArray = (d.length === 0) ? 'none' : d[0] + ' ' + d[1];

src/Graphics.ts

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ interface Graphics {
3434
moveTo(x: number, y: number): void
3535
restore(): void
3636
save(): void
37+
setData(name: string, value: string): void
3738
scale(x: number, y: number): void
3839
setLineDash(d: number[]): void
3940
stroke(): void

src/renderer.ts

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ namespace nomnoml {
4141
g.setLineDash([dash, dash])
4242
}
4343
var drawNode = nomnoml.visualizers[style.visual] || nomnoml.visualizers.class
44+
g.setData('name', node.name)
4445
drawNode(node, x, y, config, g)
4546
g.setLineDash([])
4647

src/skanaar.canvas.ts

+1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ namespace nomnoml.skanaar {
133133
measureText: function (){ return ctx.measureText.apply(ctx, arguments) },
134134
moveTo: function (){ return ctx.moveTo.apply( ctx, arguments) },
135135
restore: function (){ return ctx.restore.apply( ctx, arguments) },
136+
setData: function (name: string, value: string) {},
136137
save: function (){ return ctx.save.apply( ctx, arguments) },
137138
scale: function (){ return ctx.scale.apply( ctx, arguments) },
138139
setLineDash: function (){ return ctx.setLineDash.apply(ctx, arguments) },

src/skanaar.svg.ts

+23-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace nomnoml.skanaar {
1010
textAlign: string|null
1111
font: string|null
1212
fontSize: number|null
13+
attributes: any|null
1314
}
1415

1516
interface SvgGraphics extends Graphics {
@@ -37,7 +38,8 @@ namespace nomnoml.skanaar {
3738
fill: 'none',
3839
textAlign: 'left',
3940
font: 'Helvetica, Arial, sans-serif',
40-
fontSize: 12
41+
fontSize: 12,
42+
attributes: {}
4143
}
4244
var states = [initialState]
4345
var elements: any[] = []
@@ -77,7 +79,18 @@ namespace nomnoml.skanaar {
7779
}
7880

7981
function State(dx: number, dy: number): SvgState {
80-
return { x: dx, y: dy, stroke: null, strokeWidth: null, fill: null, textAlign: null, dashArray:'none', font: null, fontSize: null }
82+
return {
83+
x: dx,
84+
y: dy,
85+
stroke: null,
86+
strokeWidth: null,
87+
fill: null,
88+
textAlign: null,
89+
dashArray:'none',
90+
font: null,
91+
fontSize: null,
92+
attributes: null
93+
}
8194
}
8295

8396
function trans(coord: number, axis: 'x'|'y'){
@@ -106,6 +119,10 @@ namespace nomnoml.skanaar {
106119

107120
function newElement(type: string, attr: any, content?: string) {
108121
var element = Element(type, attr, content)
122+
var extraData = lastDefined('attributes')
123+
for(var key in extraData) {
124+
element.attr['data-'+key] = extraData[key]
125+
}
109126
elements.push(element)
110127
return element
111128
}
@@ -115,9 +132,7 @@ namespace nomnoml.skanaar {
115132
height: function (){ return 0 },
116133
clear: function (){},
117134
circle: function (p: Vec, r: number){
118-
var element = Element('circle', {r: r, cx: tX(p.x), cy: tY(p.y)})
119-
elements.push(element)
120-
return element
135+
return newElement('circle', {r: r, cx: tX(p.x), cy: tY(p.y)})
121136
},
122137
ellipse: function (center, w, h, start, stop){
123138
if (stop) {
@@ -213,6 +228,9 @@ namespace nomnoml.skanaar {
213228
save: function (){
214229
states.push(State(0, 0))
215230
},
231+
setData: function (name: string, value: string) {
232+
lastDefined('attributes')[name] = value
233+
},
216234
scale: function (){},
217235
setLineDash: function (d){
218236
last(states).dashArray = (d.length === 0) ? 'none' : d[0] + ' ' + d[1]

0 commit comments

Comments
 (0)