mascot-vis 3.0.0 → 3.0.1
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/package.json +1 -2
- package/js/depGraphVis.js +0 -66
- package/src-new-ts/action/createElement.ts +0 -91
- package/src-new-ts/action/encode.js +0 -20
- package/src-new-ts/action/repeat.js +0 -128
- package/src-new-ts/action/traverseScene.js +0 -41
- package/src-new-ts/data/Network.js +0 -2
- package/src-new-ts/data/Scope.js +0 -135
- package/src-new-ts/data/Table.js +0 -263
- package/src-new-ts/data/Tree.js +0 -3
- package/src-new-ts/data/field.ts +0 -115
- package/src-new-ts/data/import.ts +0 -96
- package/src-new-ts/data/predicate.ts +0 -82
- package/src-new-ts/depgraph/DepGraph.js +0 -178
- package/src-new-ts/depgraph/Edge.js +0 -9
- package/src-new-ts/depgraph/SceneGraph2DepGraph.js +0 -110
- package/src-new-ts/depgraph/Signal.js +0 -12
- package/src-new-ts/depgraph/operator/BoundsEvaluator.js +0 -30
- package/src-new-ts/depgraph/operator/Dataflow.js +0 -41
- package/src-new-ts/depgraph/operator/DomainBuilder.js +0 -50
- package/src-new-ts/depgraph/updateDepGraph.js +0 -45
- package/src-new-ts/depgraph/variable/BoundsVar.js +0 -81
- package/src-new-ts/depgraph/variable/ChannelVar.js +0 -17
- package/src-new-ts/depgraph/variable/DataScopeVar.js +0 -12
- package/src-new-ts/depgraph/variable/DomainVar.js +0 -15
- package/src-new-ts/depgraph/variable/FieldVar.js +0 -17
- package/src-new-ts/depgraph/variable/LayoutParameter.js +0 -8
- package/src-new-ts/depgraph/variable/ScaleVar.js +0 -13
- package/src-new-ts/depgraph/variable/Variable.js +0 -39
- package/src-new-ts/element/gradient/LinearGradient.js +0 -37
- package/src-new-ts/element/group/Collection.js +0 -109
- package/src-new-ts/element/group/Group.js +0 -307
- package/src-new-ts/element/group/Scene.js +0 -98
- package/src-new-ts/element/mark/CircleMark.ts +0 -85
- package/src-new-ts/element/mark/Mark.ts +0 -233
- package/src-new-ts/element/mark/PathMark.js +0 -483
- package/src-new-ts/element/mark/Segment.js +0 -29
- package/src-new-ts/element/mark/Vertex.js +0 -118
- package/src-new-ts/encode/Scale.ts +0 -115
- package/src-new-ts/index.ts +0 -19
- package/src-new-ts/layout/Layout.ts +0 -3
- package/src-new-ts/render/CanvasRenderer.ts +0 -24
- package/src-new-ts/render/SVGRenderer.js +0 -316
- package/src-new-ts/util.ts +0 -3
- package/src-old/action/Classify.js +0 -53
- package/src-old/action/Densify.js +0 -199
- package/src-old/action/Partition.js +0 -531
- package/src-old/action/Repeat.js +0 -106
- package/src-old/action/Repopulate.js +0 -44
- package/src-old/action/Stratify.js +0 -156
- package/src-old/basic/Gradient.js +0 -37
- package/src-old/basic/Point.js +0 -51
- package/src-old/basic/Rectangle.js +0 -63
- package/src-old/bind/bindToAngle.js +0 -56
- package/src-old/bind/bindToAreaMark.js +0 -360
- package/src-old/bind/bindToColor.js +0 -114
- package/src-old/bind/bindToLink.js +0 -81
- package/src-old/bind/bindToPosition.js +0 -283
- package/src-old/bind/bindToRadialDistance.js +0 -62
- package/src-old/bind/bindToSize.js +0 -235
- package/src-old/bind/bindToText.js +0 -60
- package/src-old/bind/bindToThickness.js +0 -100
- package/src-old/constraint/AffixConstraint.js +0 -129
- package/src-old/constraint/AlignConstraint.js +0 -58
- package/src-old/core/Encoding.js +0 -336
- package/src-old/core/Scale.js +0 -322
- package/src-old/core/SceneLoader.js +0 -290
- package/src-old/core/SceneValidator.js +0 -232
- package/src-old/core/SpecExecutor.js +0 -113
- package/src-old/core/SpecGenerator.js +0 -350
- package/src-old/data/DataImporter.js +0 -64
- package/src-old/data/DataScope.js +0 -124
- package/src-old/data/DataTable.js +0 -338
- package/src-old/data/Network.js +0 -106
- package/src-old/data/Tree.js +0 -251
- package/src-old/data/transform/Bin.js +0 -46
- package/src-old/data/transform/Filter.js +0 -48
- package/src-old/data/transform/Groupby.js +0 -18
- package/src-old/data/transform/KDE.js +0 -58
- package/src-old/data/transform/Sort.js +0 -14
- package/src-old/data/transform/Split.js +0 -5
- package/src-old/data/transform/partition.js +0 -46
- package/src-old/history/UndoRedoStack +0 -0
- package/src-old/index.js +0 -271
- package/src-old/indexSVG.js +0 -259
- package/src-old/interaction/Interaction.js +0 -91
- package/src-old/interaction/MouseEvent.js +0 -8
- package/src-old/interaction/Selection.js +0 -9
- package/src-old/interaction/brush.js +0 -362
- package/src-old/item/Segment.js +0 -29
- package/src-old/item/Vertex.js +0 -118
- package/src-old/item/composite/Collection.js +0 -106
- package/src-old/item/composite/Glyph.js +0 -19
- package/src-old/item/composite/Group.js +0 -310
- package/src-old/item/composite/Scene.js +0 -1251
- package/src-old/item/mark/ArcPath.js +0 -181
- package/src-old/item/mark/AreaPath.js +0 -78
- package/src-old/item/mark/CirclePath.js +0 -102
- package/src-old/item/mark/EllipsePath.js +0 -5
- package/src-old/item/mark/Image.js +0 -101
- package/src-old/item/mark/LinkPath.js +0 -118
- package/src-old/item/mark/Mark.js +0 -163
- package/src-old/item/mark/Path.js +0 -494
- package/src-old/item/mark/PointText.js +0 -201
- package/src-old/item/mark/PolygonPath.js +0 -64
- package/src-old/item/mark/RectPath.js +0 -88
- package/src-old/item/mark/RingPath.js +0 -92
- package/src-old/item/refs/Axis.js +0 -362
- package/src-old/item/refs/EncodingAxis.js +0 -515
- package/src-old/item/refs/Gridlines.js +0 -144
- package/src-old/item/refs/LayoutAxis.js +0 -316
- package/src-old/item/refs/Legend.js +0 -273
- package/src-old/layout/Circular.js +0 -95
- package/src-old/layout/Force.js +0 -52
- package/src-old/layout/Grid.js +0 -423
- package/src-old/layout/Layout.js +0 -13
- package/src-old/layout/Packing.js +0 -56
- package/src-old/layout/Stack.js +0 -264
- package/src-old/layout/Strata.js +0 -88
- package/src-old/layout/Sugiyama.js +0 -59
- package/src-old/layout/TidyTree.js +0 -105
- package/src-old/layout/Treemap.js +0 -87
- package/src-old/renderer/SVGInteractionHandler.js +0 -241
- package/src-old/renderer/SVGRenderer.js +0 -325
- package/src-old/renderer/WebGLRenderer.js +0 -1097
- package/src-old/renderer/WebGLRenderer2.js +0 -249
- package/src-old/renderer/threejs/Line2.js +0 -18
- package/src-old/renderer/threejs/LineGeometry.js +0 -77
- package/src-old/renderer/threejs/LineMaterial.js +0 -605
- package/src-old/renderer/threejs/LineSegments2.js +0 -281
- package/src-old/renderer/threejs/LineSegmentsGeometry.js +0 -226
- package/src-old/renderer/threejs/Wireframe.js +0 -51
- package/src-old/renderer/threejs/WireframeGeometry2.js +0 -16
- package/src-old/scale/areaSize.js +0 -0
- package/src-old/scale/domain.js +0 -38
- package/src-old/util/Constants.js +0 -180
- package/src-old/util/DataUtil.js +0 -35
- package/src-old/util/ItemUtil.js +0 -586
- package/src-old/util/Numerical.js +0 -33
- package/tests/demo-tests/README.md +0 -80
- package/tests/demo-tests/SVG2PNG.js +0 -56
- package/tests/demo-tests/demos2CanvasPNGs.js +0 -69
- package/tests/demo-tests/demos2ScenesSVGs.js +0 -100
- package/tests/demo-tests/pathElementWorker.js +0 -91
- package/tests/demo-tests/pixelTest.js +0 -62
- package/tests/demo-tests/renderDemos.html +0 -132
- package/tests/demo-tests/serializationTest.js +0 -36
- package/tests/demo-tests/serializeDemos.html +0 -134
- package/tests/unit-tests/README.md +0 -4
- package/tests/unit-tests/jasmine-browser.json +0 -21
- package/tests/unit-tests/jasmine.json +0 -14
- package/tests/unit-tests/testSpec.js +0 -274
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import puppeteer from 'puppeteer';
|
|
2
|
-
import fs from 'fs/promises'
|
|
3
|
-
import path from 'path';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { fileURLToPath } from 'url';
|
|
7
|
-
import { dirname } from 'path';
|
|
8
|
-
|
|
9
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
-
const __dirname = dirname(__filename);
|
|
11
|
-
const ioPath = path.join(__dirname, '..', '..', 'io');
|
|
12
|
-
|
|
13
|
-
async function generatePNGs() {
|
|
14
|
-
const browser = await puppeteer.launch({ headless: "new" }); //"new"
|
|
15
|
-
const page = await browser.newPage();
|
|
16
|
-
const json = await fs.readFile("../../demos/static.json", 'utf8');
|
|
17
|
-
let demos = JSON.parse(json);
|
|
18
|
-
//let skip = ["IciclePlot", "Treemap", "TreemapBarChart", "Sunburst"];
|
|
19
|
-
|
|
20
|
-
await checkDirectory('../../io/svg_PNGs/');
|
|
21
|
-
for (const d in demos) {
|
|
22
|
-
if (demos[d].draft) continue;
|
|
23
|
-
if (d === "Isotype") continue;
|
|
24
|
-
//if (skip.includes(d)) continue;
|
|
25
|
-
console.log(d);
|
|
26
|
-
|
|
27
|
-
const s = await fs.readFile("../../io/scene/" + d + ".msc", 'utf8');
|
|
28
|
-
let scene = JSON.parse(s);
|
|
29
|
-
let wd = parseInt(scene.bounds.width/2 + scene.bounds.x) + 50,
|
|
30
|
-
ht = parseInt(scene.bounds.height/2 + scene.bounds.y) + 80;
|
|
31
|
-
|
|
32
|
-
const filePath = path.resolve(ioPath, 'svg', d + '.svg');
|
|
33
|
-
await page.setViewport({ width: wd, height: ht });
|
|
34
|
-
await page.goto('file://' + filePath);
|
|
35
|
-
await page.screenshot({ path: `../../io/svg_PNGs/${d}.png` });
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
await browser.close();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
async function directoryExists(dirPath) {
|
|
42
|
-
try {
|
|
43
|
-
await fs.access(dirPath);
|
|
44
|
-
return true;
|
|
45
|
-
} catch {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async function checkDirectory(dirPath) {
|
|
51
|
-
if (!(await directoryExists(dirPath))) {
|
|
52
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
generatePNGs();
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
//const puppeteer = require('puppeteer');
|
|
2
|
-
import puppeteer from 'puppeteer';
|
|
3
|
-
import fs from 'fs/promises'
|
|
4
|
-
//const fs = require('fs').promises;
|
|
5
|
-
|
|
6
|
-
const rendererType = "webgl";
|
|
7
|
-
|
|
8
|
-
async function main() {
|
|
9
|
-
const browser = await puppeteer.launch({ headless: "new" }); //false to debug
|
|
10
|
-
const page = await browser.newPage();
|
|
11
|
-
|
|
12
|
-
const json = await fs.readFile("../demos/static.json", 'utf8');
|
|
13
|
-
let demos = JSON.parse(json);
|
|
14
|
-
|
|
15
|
-
await checkDirectory('webgl_PNGs/');
|
|
16
|
-
|
|
17
|
-
for (const d in demos) {
|
|
18
|
-
if (demos[d].draft) continue;
|
|
19
|
-
if (d === "Isotype") continue;
|
|
20
|
-
console.log(d)
|
|
21
|
-
|
|
22
|
-
await page.goto('http://localhost:8020/io/index.html?executedBy='+ rendererType + '#' + d, { waitUntil: 'networkidle0' });
|
|
23
|
-
|
|
24
|
-
await page.waitForFunction((v) => window.demo == v, {}, d);
|
|
25
|
-
const scene = await page.evaluate(() => window.scene);
|
|
26
|
-
|
|
27
|
-
const canvas = await page.$('#canvasElement');
|
|
28
|
-
|
|
29
|
-
// saving canvas screenshot as png
|
|
30
|
-
let wd = parseInt(scene.bounds.width + scene.bounds.left) + 50,
|
|
31
|
-
ht = parseInt(scene.bounds.height + scene.bounds.top) + 80;
|
|
32
|
-
|
|
33
|
-
// take screenshot of specific area
|
|
34
|
-
const buffer = await canvas.screenshot({
|
|
35
|
-
clip: {
|
|
36
|
-
x: 0,
|
|
37
|
-
y: 0,
|
|
38
|
-
width: wd,
|
|
39
|
-
height: ht
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
await fs.writeFile(`webgl_PNGs/${d}.png`, buffer);
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
await browser.close();
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
async function directoryExists(dirPath) {
|
|
53
|
-
try {
|
|
54
|
-
await fs.access(dirPath);
|
|
55
|
-
return true;
|
|
56
|
-
} catch {
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async function checkDirectory(dirPath) {
|
|
62
|
-
if (!(await directoryExists(dirPath))) {
|
|
63
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
main();
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
//const puppeteer = require('puppeteer');
|
|
2
|
-
import puppeteer from 'puppeteer';
|
|
3
|
-
import fs from 'fs/promises'
|
|
4
|
-
//const fs = require('fs').promises;
|
|
5
|
-
|
|
6
|
-
const svgs = {}, scenes = {};
|
|
7
|
-
const rendererType = "svg";
|
|
8
|
-
|
|
9
|
-
async function main() {
|
|
10
|
-
const browser = await puppeteer.launch({ headless: "new" }); //set headless to false to debug, to "new" otherwise
|
|
11
|
-
const page = await browser.newPage();
|
|
12
|
-
|
|
13
|
-
const json = await fs.readFile("../../demos/static.json", 'utf8');
|
|
14
|
-
let demos = JSON.parse(json);
|
|
15
|
-
//let skip = ["IciclePlot", "Treemap", "TreemapBarChart", "Sunburst"];
|
|
16
|
-
|
|
17
|
-
for (const d in demos) {
|
|
18
|
-
if (demos[d].draft) continue;
|
|
19
|
-
if (d === "Isotype") continue;
|
|
20
|
-
//if (skip.includes(d)) continue;
|
|
21
|
-
console.log(d);
|
|
22
|
-
|
|
23
|
-
await page.goto('http://localhost:8020/tests/demo-tests/renderDemos.html?executedBy='+ rendererType + '#' + d, { waitUntil: 'networkidle0' });
|
|
24
|
-
|
|
25
|
-
await page.waitForFunction((v) => window.demo == v, {}, d);
|
|
26
|
-
|
|
27
|
-
const scene = await page.evaluate(() => window.scene);
|
|
28
|
-
scenes[d] = scene;
|
|
29
|
-
|
|
30
|
-
const svg = await page.$('#svgElement'); // selector for the element
|
|
31
|
-
const text = await page.evaluate(s => s.outerHTML, svg);
|
|
32
|
-
svgs[d] = text;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
//console.log(window.serializationTest);
|
|
36
|
-
|
|
37
|
-
await browser.close();
|
|
38
|
-
|
|
39
|
-
writeScenes();
|
|
40
|
-
writeSVGs();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async function writeScenes() {
|
|
44
|
-
await checkDirectory('../../io/scene/');
|
|
45
|
-
//await checkDirectory('annotation/');
|
|
46
|
-
for (let d in scenes) {
|
|
47
|
-
let scene = scenes[d];
|
|
48
|
-
//let annotation = {ID: scene.id, type: "scene", children: []};
|
|
49
|
-
// for (let c of scene.children)
|
|
50
|
-
// annotate(c, annotation.children);
|
|
51
|
-
fs.writeFile('../../io/scene/' + d + '.msc', JSON.stringify(scene));
|
|
52
|
-
//fs.writeFile('annotation/' + d + '.json', JSON.stringify(annotation));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async function writeSVGs() {
|
|
57
|
-
await checkDirectory('../../io/svg/');
|
|
58
|
-
for (let d in svgs) {
|
|
59
|
-
let scene = scenes[d];
|
|
60
|
-
let wd = parseInt(scene.bounds.width)/2 + parseInt(scene.bounds.x) + 50,
|
|
61
|
-
ht = parseInt(scene.bounds.height)/2 + parseInt(scene.bounds.y) + 80;
|
|
62
|
-
const sizeInfo = `width="${wd}" height="${ht}" `;
|
|
63
|
-
const content = svgs[d].replace('xmlns:xlink', sizeInfo + 'xmlns:xlink');
|
|
64
|
-
fs.writeFile('../../io/svg/' + d + '.svg', content);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async function directoryExists(dirPath) {
|
|
69
|
-
try {
|
|
70
|
-
await fs.access(dirPath);
|
|
71
|
-
return true;
|
|
72
|
-
} catch {
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
async function checkDirectory(dirPath) {
|
|
78
|
-
if (!(await directoryExists(dirPath))) {
|
|
79
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// function annotate(node, result) {
|
|
84
|
-
// let n = {ID: node.id, type: node.type};
|
|
85
|
-
// switch (node.type) {
|
|
86
|
-
// case "collection":
|
|
87
|
-
// n.layout = node.layout? node.layout : {type: "none"};
|
|
88
|
-
// break;
|
|
89
|
-
// default:
|
|
90
|
-
// break;
|
|
91
|
-
// }
|
|
92
|
-
// result.push(n);
|
|
93
|
-
// if (node.children && node.children.length > 0) {
|
|
94
|
-
// n.children = [];
|
|
95
|
-
// for (let c of node.children)
|
|
96
|
-
// annotate(c, n.children);
|
|
97
|
-
// }
|
|
98
|
-
// }
|
|
99
|
-
|
|
100
|
-
main();
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
const puppeteer = require('puppeteer');
|
|
2
|
-
const fs = require('fs').promises;
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
async function main() {
|
|
6
|
-
const browser = await puppeteer.launch({ headless: "new" }); //"new"
|
|
7
|
-
const page = await browser.newPage();
|
|
8
|
-
const json = await fs.readFile("../demos/static.json", 'utf8');
|
|
9
|
-
let demos = JSON.parse(json);
|
|
10
|
-
|
|
11
|
-
//demos = { 'CyclePlot': 21 };
|
|
12
|
-
|
|
13
|
-
let marks = {};
|
|
14
|
-
for (const d in demos) {
|
|
15
|
-
if (demos[d].draft) continue;
|
|
16
|
-
if (d === "Isotype") continue;
|
|
17
|
-
const s = await fs.readFile("scene/" + d + ".msc", 'utf8');
|
|
18
|
-
let scene = JSON.parse(s);
|
|
19
|
-
|
|
20
|
-
const filePath = path.resolve(__dirname, 'svg', d + '.svg');
|
|
21
|
-
await page.goto('file://' + filePath);
|
|
22
|
-
await buildMarkHash(scene, page, marks, d);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
await browser.close();
|
|
26
|
-
|
|
27
|
-
let data = [["d", "type", "attrs"].join("\t") + "\n"];
|
|
28
|
-
for (let k in marks) {
|
|
29
|
-
data.push(marks[k].d + "\t" + marks[k].type + "\t" + JSON.stringify(marks[k].attrs) + "\n");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
await checkDirectory('pathElements/');
|
|
33
|
-
fs.writeFile('pathElements/pathMarks.tsv', data, (err) => {
|
|
34
|
-
if (err) throw err;
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async function buildMarkHash(scene, page, marks, demo) {
|
|
39
|
-
for (let c of scene.children)
|
|
40
|
-
await getMarks(c, marks, page, demo);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
async function getMarks(c, marks, page, demo) {
|
|
44
|
-
let shapes = ['path', 'line', 'arc', 'pie', 'ring', 'polygon', 'area', 'link'];
|
|
45
|
-
if (c.children && c.type !== "axis" && c.type !== "gridlines" && c.type !== "legend") {
|
|
46
|
-
for (let child of c.children)
|
|
47
|
-
await getMarks(child, marks, page, demo);
|
|
48
|
-
} else if (shapes.indexOf(c.type) >= 0) {
|
|
49
|
-
let element = await page.$('#' + c.id);
|
|
50
|
-
let v = await page.evaluate((el, attributeName) => el.getAttribute(attributeName), element, 'd');
|
|
51
|
-
let attrs = getMarkAttrs(c);
|
|
52
|
-
marks[demo+"-"+c.id] = { "type": c.type, "d": v, "attrs": attrs };
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function getMarkAttrs(m) {
|
|
57
|
-
switch (m.type) {
|
|
58
|
-
case "arc":
|
|
59
|
-
return {"cx": m.args.x, 'cy': m.args.y, "innerRadius": m.args.innerRadius, "outerRadius": m.args.outerRadius, "startAngle": m.args.startAngle, "endAngle": m.args.endAngle};
|
|
60
|
-
case "pie":
|
|
61
|
-
return {"cx": m.args.x, 'cy': m.args.y, "radius": m.args.outerRadius, "startAngle": m.args.startAngle, "endAngle": m.args.endAngle};
|
|
62
|
-
case "ring":
|
|
63
|
-
return {"cx": m.args.x, 'cy': m.args.y, "innerRadius": m.args.innerRadius, "outerRadius": m.args.outerRadius};
|
|
64
|
-
case "polygon":
|
|
65
|
-
return {"cx": m.args.x, 'cy': m.args.y, "radius": m.args.radius, "numPts": m.vertices.length};
|
|
66
|
-
case "link":
|
|
67
|
-
return {"mode": m.mode, "sourceAnchor": m.args.sourceAnchor, "targetAnchor": m.args.targetAnchor, "sourceOffset": m.args.sourceOffset, "targetOffset": m.args.targetOffset};
|
|
68
|
-
case "area":
|
|
69
|
-
case "line":
|
|
70
|
-
case "path":
|
|
71
|
-
default:
|
|
72
|
-
return {"numPts": m.vertices.length};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
async function directoryExists(dirPath) {
|
|
77
|
-
try {
|
|
78
|
-
await fs.access(dirPath);
|
|
79
|
-
return true;
|
|
80
|
-
} catch {
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
async function checkDirectory(dirPath) {
|
|
86
|
-
if (!(await directoryExists(dirPath))) {
|
|
87
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
main();
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
//const fs = require('fs').promises;
|
|
2
|
-
//const PNG = require('pngjs').PNG;
|
|
3
|
-
//const pixelmatch = require('pixelmatch');
|
|
4
|
-
//const process = require('process');
|
|
5
|
-
import fs from 'fs/promises';
|
|
6
|
-
import { PNG } from 'pngjs';
|
|
7
|
-
import pixelmatch from 'pixelmatch';
|
|
8
|
-
|
|
9
|
-
const executedBy = process.argv[2];
|
|
10
|
-
|
|
11
|
-
try {
|
|
12
|
-
checkFormat(executedBy); // This will throw an error if no argument is provided or if the argument is not 'webgl' or 'svg'.
|
|
13
|
-
} catch (error) {
|
|
14
|
-
console.error(error.message);
|
|
15
|
-
process.exit(1);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
comparePNGs();
|
|
19
|
-
|
|
20
|
-
async function comparePNGs() {
|
|
21
|
-
const json = await fs.readFile("../../demos/static.json", 'utf8');
|
|
22
|
-
let demos = JSON.parse(json);
|
|
23
|
-
let diff_count = 0, failed = [];
|
|
24
|
-
//let skip = ["IciclePlot", "Treemap", "TreemapBarChart", "Sunburst"];
|
|
25
|
-
|
|
26
|
-
for (const d in demos) {
|
|
27
|
-
if (demos[d].draft || d == "Isotype") continue;
|
|
28
|
-
//if (skip.includes(d)) continue;
|
|
29
|
-
console.log("testing", d);
|
|
30
|
-
const data1 = await fs.readFile("../../io/demoScreenshots/" + executedBy + '/' + d + ".png");
|
|
31
|
-
const data2 = await fs.readFile("../../io/" + executedBy + "_PNGs/" + d + ".png");
|
|
32
|
-
const img1 = PNG.sync.read(data1);
|
|
33
|
-
const img2 = PNG.sync.read(data2);
|
|
34
|
-
|
|
35
|
-
const { width, height } = img1;
|
|
36
|
-
const diff = new PNG({ width, height });
|
|
37
|
-
|
|
38
|
-
// Compare the images
|
|
39
|
-
const numDiffPixels = pixelmatch(
|
|
40
|
-
img1.data, img2.data, diff.data, width, height,
|
|
41
|
-
{ threshold: 0.1 }
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
if (numDiffPixels !== 0) {
|
|
45
|
-
console.log(d, "different");
|
|
46
|
-
diff_count += 1;
|
|
47
|
-
failed.push(d);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
console.log("Total mismatches: ", diff_count, failed);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function checkFormat(format) {
|
|
55
|
-
if (!format) {
|
|
56
|
-
throw new Error("No argument provided. You must provide 'webgl' or 'svg' as the argument.");
|
|
57
|
-
} else if (format !== "webgl" && format !== "svg") {
|
|
58
|
-
throw new Error("Invalid format. Argument format must be 'webgl' or 'svg'.");
|
|
59
|
-
}
|
|
60
|
-
// If the format is valid, continue with your logic
|
|
61
|
-
console.log(`Format '${format}' is valid.`);
|
|
62
|
-
}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="utf-8" />
|
|
6
|
-
<title>msc</title>
|
|
7
|
-
<script src="../../lib/pixi.min.js"></script>
|
|
8
|
-
<script src="https://d3js.org/d3.v7.min.js"></script>
|
|
9
|
-
<script src="../../dist/mascot-min.js"></script>
|
|
10
|
-
<script src="../../lib/acorn.js"></script>
|
|
11
|
-
<style>
|
|
12
|
-
html {
|
|
13
|
-
margin: 0px;
|
|
14
|
-
padding: 0px;
|
|
15
|
-
height: 100%;
|
|
16
|
-
font-family: Arial;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
body {
|
|
20
|
-
height: 100vh;
|
|
21
|
-
width: 100%;
|
|
22
|
-
margin: 0px;
|
|
23
|
-
padding: 0px;
|
|
24
|
-
background: #f2f2f2;
|
|
25
|
-
overflow-x: hidden;
|
|
26
|
-
overflow-y: hidden;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
#svgElement {
|
|
30
|
-
width: 1600px;
|
|
31
|
-
height: 1000px;
|
|
32
|
-
margin: 0;
|
|
33
|
-
padding: 0;
|
|
34
|
-
position: absolute;
|
|
35
|
-
top: 0;
|
|
36
|
-
left: 0;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
#canvasElement {
|
|
40
|
-
width: 1600;
|
|
41
|
-
height: 1000;
|
|
42
|
-
margin: 0;
|
|
43
|
-
padding: 0;
|
|
44
|
-
position: absolute;
|
|
45
|
-
top: 0;
|
|
46
|
-
left: 0;
|
|
47
|
-
}
|
|
48
|
-
</style>
|
|
49
|
-
</head>
|
|
50
|
-
|
|
51
|
-
<body>
|
|
52
|
-
<canvas id="canvasElement"></canvas>
|
|
53
|
-
<svg id="svgElement" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
|
|
54
|
-
<script>
|
|
55
|
-
function loadScript(s, demo, renderer, dest, flatten) {
|
|
56
|
-
let script = s;
|
|
57
|
-
// eslint-disable-next-line no-undef
|
|
58
|
-
let parsed = acorn.parse(script, { ecmaVersion: "latest" });
|
|
59
|
-
let blocks = parsed.body.map((d) => script.substring(d.start, d.end));
|
|
60
|
-
|
|
61
|
-
//find lines with renderer and remove them
|
|
62
|
-
blocks = blocks.filter((l) => l.indexOf("render") < 0);
|
|
63
|
-
//add renderer lines
|
|
64
|
-
let sceneName = blocks
|
|
65
|
-
.filter((l) => l.indexOf("msc.scene(") > 0)[0]
|
|
66
|
-
.split("=")[0]
|
|
67
|
-
.replace("let", " ")
|
|
68
|
-
.trim();
|
|
69
|
-
|
|
70
|
-
let newScript =
|
|
71
|
-
blocks.join("\n") + "\n" +
|
|
72
|
-
"let renderer = msc.renderer('" + renderer + "','" + dest + "');\n" +
|
|
73
|
-
"renderer.clear();\n" +
|
|
74
|
-
(flatten ? "renderer.render(" + sceneName + ", {flatten: true});\n" : "renderer.render(" + sceneName + ");\n") +
|
|
75
|
-
// "let json = msc.serialize(" + sceneName + ");\n" +
|
|
76
|
-
// "let obj = msc.deserialize(json);\n" +
|
|
77
|
-
// "let equal = msc.isEqual(" + sceneName + ", obj);\n" +
|
|
78
|
-
// "return [" + sceneName + ", equal]";
|
|
79
|
-
"return msc.serialize(" + sceneName + ");";
|
|
80
|
-
|
|
81
|
-
newScript = makeAsync(newScript);
|
|
82
|
-
//window.serializationTest = {};
|
|
83
|
-
let scn = eval(newScript);
|
|
84
|
-
scn.then(r => {
|
|
85
|
-
// window.scene = r[0];
|
|
86
|
-
// window.serializationTest[demo] = r[1];
|
|
87
|
-
window.scene = r;
|
|
88
|
-
window.demo = demo;
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function makeAsync(s) {
|
|
93
|
-
// let c =
|
|
94
|
-
// "try {\n" +
|
|
95
|
-
// s +
|
|
96
|
-
// "\n} catch (err) {showError(err.name ? err.name + ': ' + err.message : undefined, 0, 0, 0, err);}";
|
|
97
|
-
return "(async () => {" + s + "})();";
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// eslint-disable-next-line no-unused-vars
|
|
101
|
-
// rendererType: "webgl" or "svg"
|
|
102
|
-
// rendererElemID: "canvasElement" or "svgElement"
|
|
103
|
-
function refresh() {
|
|
104
|
-
const params = new URLSearchParams(window.location.search);
|
|
105
|
-
const executedBy = params.get('executedBy');
|
|
106
|
-
if (executedBy == 'webgl') {
|
|
107
|
-
refreshAux('webgl', 'canvasElement')
|
|
108
|
-
} else {
|
|
109
|
-
refreshAux('svg', 'svgElement')
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function refreshAux(rendererType, rendererElemID) {
|
|
114
|
-
let demo = window.location.hash.replace("#", "");
|
|
115
|
-
if (demo && demo != "") {
|
|
116
|
-
console.log(demo)
|
|
117
|
-
var oReq = new XMLHttpRequest();
|
|
118
|
-
oReq.addEventListener("load", function () {
|
|
119
|
-
loadScript(this.responseText, demo, rendererType, rendererElemID);
|
|
120
|
-
});
|
|
121
|
-
oReq.open("GET", "../../demos/static/" + demo[0].toLowerCase() + demo.substring(1) + ".js");
|
|
122
|
-
oReq.send();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
window.scene = {};
|
|
127
|
-
window.onhashchange = refresh;
|
|
128
|
-
window.onload = refresh;
|
|
129
|
-
</script>
|
|
130
|
-
</body>
|
|
131
|
-
|
|
132
|
-
</html>
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import puppeteer from 'puppeteer';
|
|
2
|
-
import fs from 'fs/promises'
|
|
3
|
-
|
|
4
|
-
const scenes = {};
|
|
5
|
-
const rendererType = "svg";
|
|
6
|
-
|
|
7
|
-
async function main() {
|
|
8
|
-
const browser = await puppeteer.launch({ headless: "new" }); //set headless to false to debug, to "new" otherwise
|
|
9
|
-
const page = await browser.newPage();
|
|
10
|
-
|
|
11
|
-
const json = await fs.readFile("../../demos/static.json", 'utf8');
|
|
12
|
-
let demos = JSON.parse(json);
|
|
13
|
-
//let skip = ["IciclePlot", "Treemap", "TreemapBarChart", "Sunburst"];
|
|
14
|
-
let failed = [];
|
|
15
|
-
|
|
16
|
-
for (const d in demos) {
|
|
17
|
-
if (demos[d].draft) continue;
|
|
18
|
-
if (d === "Isotype") continue;
|
|
19
|
-
//if (skip.includes(d)) continue;
|
|
20
|
-
console.log(d);
|
|
21
|
-
|
|
22
|
-
await page.goto('http://localhost:8020/tests/demo-tests/serializeDemos.html?executedBy=' + rendererType + '#' + d, { waitUntil: 'networkidle0' });
|
|
23
|
-
|
|
24
|
-
await page.waitForFunction((v) => window.demo == v, {}, d);
|
|
25
|
-
|
|
26
|
-
const result = await page.evaluate(() => window.serializationTest);
|
|
27
|
-
scenes[d] = result;
|
|
28
|
-
if (!result)
|
|
29
|
-
failed.push(d);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
await browser.close();
|
|
33
|
-
console.log(failed.length, "failed: ", failed);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
main();
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
|
|
4
|
-
<head>
|
|
5
|
-
<meta charset="utf-8" />
|
|
6
|
-
<title>msc</title>
|
|
7
|
-
<script src="../../lib/pixi.min.js"></script>
|
|
8
|
-
<script src="https://d3js.org/d3.v7.min.js"></script>
|
|
9
|
-
<script src="../../dist/mascot-min.js"></script>
|
|
10
|
-
<script src="../../lib/acorn.js"></script>
|
|
11
|
-
<style>
|
|
12
|
-
html {
|
|
13
|
-
margin: 0px;
|
|
14
|
-
padding: 0px;
|
|
15
|
-
height: 100%;
|
|
16
|
-
font-family: Arial;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
body {
|
|
20
|
-
height: 100vh;
|
|
21
|
-
width: 100%;
|
|
22
|
-
margin: 0px;
|
|
23
|
-
padding: 0px;
|
|
24
|
-
background: #f2f2f2;
|
|
25
|
-
overflow-x: hidden;
|
|
26
|
-
overflow-y: hidden;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
#svgElement {
|
|
30
|
-
width: 1600px;
|
|
31
|
-
height: 1000px;
|
|
32
|
-
margin: 0;
|
|
33
|
-
padding: 0;
|
|
34
|
-
position: absolute;
|
|
35
|
-
top: 0;
|
|
36
|
-
left: 0;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
#canvasElement {
|
|
40
|
-
width: 1600;
|
|
41
|
-
height: 1000;
|
|
42
|
-
margin: 0;
|
|
43
|
-
padding: 0;
|
|
44
|
-
position: absolute;
|
|
45
|
-
top: 0;
|
|
46
|
-
left: 0;
|
|
47
|
-
}
|
|
48
|
-
</style>
|
|
49
|
-
</head>
|
|
50
|
-
|
|
51
|
-
<body>
|
|
52
|
-
<canvas id="canvasElement"></canvas>
|
|
53
|
-
<svg id="svgElement" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>
|
|
54
|
-
<script>
|
|
55
|
-
function loadScript(s, demo, renderer, dest, flatten) {
|
|
56
|
-
let script = s;
|
|
57
|
-
// eslint-disable-next-line no-undef
|
|
58
|
-
let parsed = acorn.parse(script, { ecmaVersion: "latest" });
|
|
59
|
-
let blocks = parsed.body.map((d) => script.substring(d.start, d.end));
|
|
60
|
-
|
|
61
|
-
//find lines with renderer and remove them
|
|
62
|
-
blocks = blocks.filter((l) => l.indexOf("render") < 0);
|
|
63
|
-
//add renderer lines
|
|
64
|
-
let sceneName = blocks
|
|
65
|
-
.filter((l) => l.indexOf("msc.scene(") > 0)[0]
|
|
66
|
-
.split("=")[0]
|
|
67
|
-
.replace("let", " ")
|
|
68
|
-
.trim();
|
|
69
|
-
|
|
70
|
-
let newScript =
|
|
71
|
-
blocks.join("\n") + "\n" +
|
|
72
|
-
"let renderer = msc.renderer('" + renderer + "','" + dest + "');\n" +
|
|
73
|
-
"renderer.clear();\n" +
|
|
74
|
-
(flatten ? "renderer.render(" + sceneName + ", {flatten: true});\n" : "renderer.render(" + sceneName + ");\n") +
|
|
75
|
-
"\nlet json = msc.serialize(" + sceneName + ");" +
|
|
76
|
-
"\nlet loadedScn = msc.deserialize(json);" +
|
|
77
|
-
"\n return msc.isEqual(" + sceneName + ", loadedScn);"
|
|
78
|
-
// "let json = msc.serialize(" + sceneName + ");\n" +
|
|
79
|
-
// "let obj = msc.deserialize(json);\n" +
|
|
80
|
-
// "let equal = msc.isEqual(" + sceneName + ", obj);\n" +
|
|
81
|
-
// "return [" + sceneName + ", equal]";
|
|
82
|
-
//"return msc.serialize(" + sceneName + ");";
|
|
83
|
-
|
|
84
|
-
newScript = makeAsync(newScript);
|
|
85
|
-
//window.serializationTest = {};
|
|
86
|
-
let scn = eval(newScript);
|
|
87
|
-
scn.then(r => {
|
|
88
|
-
// window.scene = r[0];
|
|
89
|
-
// window.serializationTest[demo] = r[1];
|
|
90
|
-
window.serializationTest = r;
|
|
91
|
-
window.demo = demo;
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function makeAsync(s) {
|
|
96
|
-
// let c =
|
|
97
|
-
// "try {\n" +
|
|
98
|
-
// s +
|
|
99
|
-
// "\n} catch (err) {showError(err.name ? err.name + ': ' + err.message : undefined, 0, 0, 0, err);}";
|
|
100
|
-
return "(async () => {" + s + "})();";
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// eslint-disable-next-line no-unused-vars
|
|
104
|
-
// rendererType: "webgl" or "svg"
|
|
105
|
-
// rendererElemID: "canvasElement" or "svgElement"
|
|
106
|
-
function refresh() {
|
|
107
|
-
const params = new URLSearchParams(window.location.search);
|
|
108
|
-
const executedBy = params.get('executedBy');
|
|
109
|
-
if (executedBy == 'webgl') {
|
|
110
|
-
refreshAux('webgl', 'canvasElement')
|
|
111
|
-
} else {
|
|
112
|
-
refreshAux('svg', 'svgElement')
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function refreshAux(rendererType, rendererElemID) {
|
|
117
|
-
let demo = window.location.hash.replace("#", "");
|
|
118
|
-
if (demo && demo != "") {
|
|
119
|
-
console.log(demo)
|
|
120
|
-
var oReq = new XMLHttpRequest();
|
|
121
|
-
oReq.addEventListener("load", function () {
|
|
122
|
-
loadScript(this.responseText, demo, rendererType, rendererElemID);
|
|
123
|
-
});
|
|
124
|
-
oReq.open("GET", "../../demos/static/" + demo[0].toLowerCase() + demo.substring(1) + ".js");
|
|
125
|
-
oReq.send();
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
window.onhashchange = refresh;
|
|
130
|
-
window.onload = refresh;
|
|
131
|
-
</script>
|
|
132
|
-
</body>
|
|
133
|
-
|
|
134
|
-
</html>
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
## Run Tests
|
|
2
|
-
Mascot uses [Jasmine](https://jasmine.github.io/setup/nodejs.html) for unit testing using Node.js. For tests on the demos, check out the `demo-tests` folder. Before running the tests, make sure to build the project with `npm run build`.
|
|
3
|
-
|
|
4
|
-
All the unit tests are in the `unit-tests` folder. To run the tests, do `npm run start` first, then `npm test`.
|