diff --git a/.eslintrc.js b/.eslintrc.js index f5287f112dd4118753be29261a1020fe80681185..60a973486da137fe5b25d826bcf6942044c47bce 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,7 @@ module.exports = { - 'extends': 'airbnb' + 'extends': 'airbnb', + 'rules': { + 'no-plusplus': 'off', + 'no-mixed-operators': 'off', + } }; \ No newline at end of file diff --git a/bin/temporary_action.js b/bin/temporary_action.js index fea63c802a7f871cb089d13e041a04d0bf4e7b8d..4c11ffa04921386f696f99c7e82fff416fbaf1fd 100644 --- a/bin/temporary_action.js +++ b/bin/temporary_action.js @@ -9,7 +9,18 @@ for (const category of categories) { if (algorithm.startsWith('.')) continue; const filepath = path.resolve(__dirname, '..', 'algorithm', category, algorithm, 'code.js'); const code = fs.readFileSync(filepath, 'utf-8'); - const newCode = code.replace(/([a-z])_([a-z])/g, (m, m1, m2) => m1 + m2.toUpperCase()); + const tracers = [ + 'Array1DTracer', + 'Array2DTracer', + 'ChartTracer', + 'GraphTracer', + 'LogTracer', + 'Randomize', + 'Tracer', + ]; + const used = tracers.filter(tracer => code.includes(tracer)); + const importLine = `import { ${used.join(', ')} } from 'algorithm-visualizer';\n\n`; + const newCode = importLine + code; fs.writeFileSync(filepath, newCode, 'utf-8'); } } \ No newline at end of file diff --git a/src/frontend/core/datas/GraphData.js b/src/frontend/core/datas/GraphData.js index 435e78dd919de3f1ca8e9dd89cd0fcf64cb30abc..2a1fa4f4e528fe11bc46af98cb135faddcd44c7b 100644 --- a/src/frontend/core/datas/GraphData.js +++ b/src/frontend/core/datas/GraphData.js @@ -1,4 +1,5 @@ import { Data } from '/core/datas'; +import { GraphTracer } from '/core/tracers'; import { distance } from '/common/util'; import { tracerManager } from '/core'; @@ -25,7 +26,7 @@ class GraphData extends Data { this.logData = null; } - set(array2d = [], layout = GraphData.LAYOUT.CIRCLE, root = 0) { + set(array2d = [], layout = GraphTracer.LAYOUT.CIRCLE, root = 0) { const { directed, weighted } = this.options; const { baseWidth, baseHeight, padding } = this.dimensions; this.graph = new Graph([], [], directed); @@ -53,16 +54,16 @@ class GraphData extends Data { const height = bottom - top; const rect = { left, top, right, bottom, width, height }; switch (layout) { - case GraphData.LAYOUT.CIRCLE: + case GraphTracer.LAYOUT.CIRCLE: this.graph.layoutCircle(rect); break; - case GraphData.LAYOUT.TREE: + case GraphTracer.LAYOUT.TREE: this.graph.layoutTree(rect, root); break; - case GraphData.LAYOUT.RANDOM: + case GraphTracer.LAYOUT.RANDOM: this.graph.layoutRandom(rect); break; - case GraphData.LAYOUT.NONE: + case GraphTracer.LAYOUT.NONE: default: break; } @@ -209,12 +210,4 @@ class Graph { } } -GraphData.LAYOUT = { - CIRCLE: 'circle', - TREE: 'tree', - RANDOM: 'random', - NONE: 'none', - // FORCE_DIRECTED: 'force_directed', -}; - export default GraphData; \ No newline at end of file diff --git a/src/frontend/core/tracerManager.jsx b/src/frontend/core/tracerManager.jsx index 7d7e7e2ccddd24cc552270334bc5875b68479fce..767ca53ef3517f7433cdd5ba657de8cbe068f6e3 100644 --- a/src/frontend/core/tracerManager.jsx +++ b/src/frontend/core/tracerManager.jsx @@ -2,13 +2,17 @@ import React from 'react'; import { Randomize, Seed } from '/core'; import * as Tracers from '/core/tracers'; import { Tracer } from '/core/tracers'; -import * as Datas from '/core/datas'; import { Array1DData, Array2DData, ChartData, Data, GraphData, LogData } from '/core/datas'; import { Array1DRenderer, Array2DRenderer, ChartRenderer, GraphRenderer, LogRenderer, Renderer } from '/core/renderers'; -Object.assign(window, Tracers); -Object.assign(window, Datas); -Object.assign(window, { Randomize }); +Object.assign(window, { + modules: { + 'algorithm-visualizer': { + ...Tracers, + Randomize, + }, + } +}); class TracerManager { constructor() { @@ -162,12 +166,18 @@ class TracerManager { } } + sandboxEval(code){ + const require = moduleName => window.modules[moduleName]; // fake require + eval(code); + } + execute(callback) { try { const lines = this.code.split('\n').map((line, i) => line.replace(/(.+\. *wait *)(\( *\))/g, `$1(${i})`)); const seed = new Seed(); Tracer.seed = seed; - eval(Babel.transform(lines.join('\n'), { presets: ['es2015'] }).code); + const { code } = Babel.transform(lines.join('\n'), { presets: ['es2015'] }); + this.sandboxEval(code); this.reset(seed); if (callback) callback(); } catch (error) { diff --git a/src/frontend/core/tracers/GraphTracer.js b/src/frontend/core/tracers/GraphTracer.js index 200147cfd6c71188774764b1fd40e3614fc69037..feda89223aee6a4ae48eabfe34cdf59bc1cfd96c 100644 --- a/src/frontend/core/tracers/GraphTracer.js +++ b/src/frontend/core/tracers/GraphTracer.js @@ -12,4 +12,12 @@ class GraphTracer extends Tracer { } } +GraphTracer.LAYOUT = { + CIRCLE: 'circle', + TREE: 'tree', + RANDOM: 'random', + NONE: 'none', + // FORCE_DIRECTED: 'force_directed', +}; + export default GraphTracer; \ No newline at end of file