UNPKG

pd-fileutils

Version:

A set of utilities for Pure Data files : parser, image generator.

151 lines (134 loc) 356 kB
/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./browser.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./browser.js": /*!********************!*\ !*** ./browser.js ***! \********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("var svgRendering = __webpack_require__(/*! ./lib/svg-rendering */ \"./lib/svg-rendering.js\")\n\n// Set default css style for rendering\nsvgRendering.defaults.style = __webpack_require__(/*! ./lib/svg-default-style.css */ \"./lib/svg-default-style.css\")\n\nexports.parse = __webpack_require__(/*! pd-fileutils.parser */ \"./node_modules/pd-fileutils.parser/index.js\").parse\nexports.renderSvg = svgRendering.render\nexports.renderPd = __webpack_require__(/*! ./lib/pd-rendering */ \"./lib/pd-rendering.js\").render\nexports.Patch = __webpack_require__(/*! ./lib/Patch */ \"./lib/Patch.js\")\nwindow.pdfu = exports\n\n\n//# sourceURL=webpack:///./browser.js?"); /***/ }), /***/ "./lib/Patch.js": /*!**********************!*\ !*** ./lib/Patch.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("/*\n * Copyright (c) 2012-2015 Sébastien Piquemal <sebpiq@gmail.com>\n *\n * BSD Simplified License.\n * For information on usage and redistribution, and for a DISCLAIMER OF ALL\n * WARRANTIES, see the file, \"LICENSE.txt,\" in this distribution.\n *\n * See https://github.com/sebpiq/pd-fileutils for documentation\n *\n */\n\nvar _ = __webpack_require__(/*! underscore */ \"./node_modules/underscore/underscore.js\")\n\nvar Patch = module.exports = function(obj) { _.extend(this, obj) }\n\n\n_.extend(Patch.prototype, {\n\n getNode: function(id) {\n return _.find(this.nodes, function(node) { return node.id === id }) || null\n },\n\n guessPortlets: function() {\n var self = this\n _.each(this.nodes, function(node) {\n node.outlets = _.reduce(self.connections, function(memo, conn) {\n if (conn.source.id === node.id) {\n return Math.max(memo, conn.source.port)\n } else return memo\n }, -1) + 1\n node.inlets = _.reduce(self.connections, function(memo, conn) {\n if (conn.sink.id === node.id) {\n return Math.max(memo, conn.sink.port)\n } else return memo\n }, -1) + 1\n })\n },\n\n getSinks: function(node) {\n var conns = _.filter(this.connections, function(conn) { return conn.source.id === node.id })\n , sinkIds = _.uniq(_.map(conns, function(conn) { return conn.sink.id }))\n , self = this\n return _.map(sinkIds, function(sinkId) { return self.getNode(sinkId) })\n },\n\n getSources: function(node) {\n var conns = _.filter(this.connections, function(conn) { return conn.sink.id === node.id })\n , sourceIds = _.uniq(_.map(conns, function(conn) { return conn.source.id }))\n , self = this\n return _.map(sourceIds, function(sourceId) { return self.getNode(sourceId) })\n },\n\n addNode: function(node) {\n if (node.id === undefined) node.id = this.nextId()\n else if (this.getNode(node.id) !== null) return\n this.nodes.push(node)\n },\n\n nextId: function() {\n if (this.nodes.length) {\n return Math.max.apply(Math, _.pluck(this.nodes, 'id')) + 1\n } else return 0\n }\n\n})\n\n\n//# sourceURL=webpack:///./lib/Patch.js?"); /***/ }), /***/ "./lib/pd-rendering.js": /*!*****************************!*\ !*** ./lib/pd-rendering.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("/*\n * Copyright (c) 2012-2015 Sébastien Piquemal <sebpiq@gmail.com>\n *\n * BSD Simplified License.\n * For information on usage and redistribution, and for a DISCLAIMER OF ALL\n * WARRANTIES, see the file, \"LICENSE.txt,\" in this distribution.\n *\n * See https://github.com/sebpiq/pd-fileutils for documentation\n *\n */\n \nvar mustache = __webpack_require__(/*! mustache */ \"./node_modules/mustache/mustache.js\")\n , _ = __webpack_require__(/*! underscore */ \"./node_modules/underscore/underscore.js\")\n\nexports.render = function(patch) {\n\n // Render the graph canvas\n var rendered = ''\n , layout = _.clone(patch.layout || {})\n _.defaults(layout, {x: 0, y: 0, width: 500, height: 500})\n rendered += mustache.render(canvasTpl, {args: patch.args, layout: layout}) + ';\\n'\n\n // Render all nodes\n _.forEach(patch.nodes.sort(function(n1, n2){return n1.id - n2.id}), function(node) {\n var layout = _.clone(node.layout || {})\n _.defaults(layout, {x: 0, y: 0})\n rendered += mustache.render(objTpl, {args: node.args, layout: layout, proto: node.proto}) + ';\\n'\n })\n\n // Render all connections\n _.forEach(patch.connections, function(conn) {\n rendered += mustache.render(connectTpl, conn) + ';\\n'\n })\n\n return rendered\n}\n\nvar canvasTpl = '#N canvas {{{layout.x}}} {{{layout.y}}} {{{layout.width}}} {{{layout.height}}} {{{args.0}}}{{#layout.openOnLoad}} {{{.}}}{{/layout.openOnLoad}}'\n , connectTpl = '#X connect {{{source.id}}} {{{source.port}}} {{{sink.id}}} {{{sink.port}}}'\n\nvar floatAtomTpl = '#X floatatom {{{layout.x}}} {{{layout.y}}} {{{layout.width}}} {{{args.0}}} {{{args.1}}} {{{layout.labelPos}}} {{{layout.label}}} {{{args.2}}} {{{args.3}}}'\n , symbolAtomTpl = '#X symbolatom {{{layout.x}}} {{{layout.y}}} {{{layout.width}}} {{{args.0}}} {{{args.1}}} {{{layout.labelPos}}} {{{layout.label}}} {{{args.2}}} {{{args.3}}}'\n , bngTpl = '#X obj {{{layout.x}}} {{{layout.y}}} bng {{{layout.size}}} {{{layout.hold}}} {{{layout.interrupt}}} {{{args.0}}} {{{args.1}}} {{{args.2}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.fgColor}}} {{{layout.labelColor}}}'\n , nbxTpl = '#X obj {{{layout.x}}} {{{layout.y}}} nbx {{{layout.size}}} {{{layout.height}}} {{{args.0}}} {{{args.1}}} {{{layout.log}}} {{{args.2}}} {{{args.3}}} {{{args.4}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.fgColor}}} {{{layout.labelColor}}} {{{layout.logHeight}}}'\n , vslTpl = '#X obj {{{layout.x}}} {{{layout.y}}} vsl {{{layout.width}}} {{{layout.height}}} {{{args.0}}} {{{args.1}}} {{{layout.log}}} {{{args.2}}} {{{args.3}}} {{{args.4}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.fgColor}}} {{{layout.labelColor}}} {{{args.5}}} {{{layout.steadyOnClick}}}'\n , hslTpl = '#X obj {{{layout.x}}} {{{layout.y}}} hsl {{{layout.width}}} {{{layout.height}}} {{{args.0}}} {{{args.1}}} {{{layout.log}}} {{{args.2}}} {{{args.3}}} {{{args.4}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.fgColor}}} {{{layout.labelColor}}} {{{args.5}}} {{{layout.steadyOnClick}}}'\n , vradioTpl = '#X obj {{{layout.x}}} {{{layout.y}}} vradio {{{layout.size}}} {{{args.0}}} {{{args.1}}} {{{args.2}}} {{{args.3}}} {{{args.4}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.fgColor}}} {{{layout.labelColor}}} {{{args.5}}}'\n , hradioTpl = '#X obj {{{layout.x}}} {{{layout.y}}} hradio {{{layout.size}}} {{{args.0}}} {{{args.1}}} {{{args.2}}} {{{args.3}}} {{{args.4}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.fgColor}}} {{{layout.labelColor}}} {{{args.5}}}'\n , vuTpl = '#X obj {{{layout.x}}} {{{layout.y}}} vu {{{layout.width}}} {{{layout.height}}} {{{args.0}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.labelColor}}} {{{layout.log}}} {{{args.1}}}'\n , cnvTpl = '#X obj {{{layout.x}}} {{{layout.y}}} cnv {{{layout.size}}} {{{layout.width}}} {{{layout.height}}} {{{args.0}}} {{{args.1}}} {{{layout.label}}} {{{layout.labelX}}} {{{layout.labelY}}} {{{layout.labelFont}}} {{{layout.labelFontSize}}} {{{layout.bgColor}}} {{{layout.labelColor}}} {{{args.2}}}'\n , objTpl = '#X obj {{{layout.x}}} {{{layout.y}}} {{{proto}}}{{#args}} {{.}}{{/args}}'\n\n\n//# sourceURL=webpack:///./lib/pd-rendering.js?"); /***/ }), /***/ "./lib/svg-default-style.css": /*!***********************************!*\ !*** ./lib/svg-default-style.css ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("\n var result = __webpack_require__(/*! !../node_modules/css-loader/dist/cjs.js!./svg-default-style.css */ \"./node_modules/css-loader/dist/cjs.js!./lib/svg-default-style.css\");\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n \n\n//# sourceURL=webpack:///./lib/svg-default-style.css?"); /***/ }), /***/ "./lib/svg-rendering.js": /*!******************************!*\ !*** ./lib/svg-rendering.js ***! \******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("/*\n * Copyright (c) 2012-2015 Sébastien Piquemal <sebpiq@gmail.com>\n *\n * BSD Simplified License.\n * For information on usage and redistribution, and for a DISCLAIMER OF ALL\n * WARRANTIES, see the file, \"LICENSE.txt,\" in this distribution.\n *\n * See https://github.com/sebpiq/pd-fileutils for documentation\n *\n */\n\nvar _ = __webpack_require__(/*! underscore */ \"./node_modules/underscore/underscore.js\")\n , d3 = Object.assign({}, __webpack_require__(/*! d3-selection */ \"./node_modules/d3-selection/src/index.js\"), __webpack_require__(/*! d3-shape */ \"./node_modules/d3-shape/src/index.js\"))\n , Patch = __webpack_require__(/*! ./Patch */ \"./lib/Patch.js\")\n\nexports.defaults = {\n portletWidth: 5,\n portletHeight: 3.5,\n objMinWidth: 25,\n objMinHeight: 20,\n ratio: 1.2,\n padding: 10,\n glyphWidth: 8,\n glyphHeight: 9,\n textPadding: 6,\n svgFile: true,\n style: null,\n}\n\nexports.render = function(patch, opts) {\n opts = opts || {}\n _.defaults(opts, exports.defaults)\n\n d3.select('svg').remove()\n var svgContainer = d3.select('body').append('div')\n , svg = svgContainer.append('svg')\n .attr('xmlns', 'http://www.w3.org/2000/svg')\n .attr('version', '1.1')\n , root = svg.append('g')\n , connections, nodes\n\n if (opts.style) {\n svg.append('style').text(opts.style)\n }\n\n // Creating all renderers\n patch = new Patch(patch)\n patch.guessPortlets()\n patch.nodes = _.map(patch.nodes, function(node) {\n var proto = node.proto\n if (proto === 'msg') return new MsgRenderer(node, opts)\n else if (proto === 'text') return new TextRenderer(node, opts)\n else if (proto === 'floatatom') return new FloatAtomRenderer(node, opts)\n else if (proto === 'symbolatom') return new SymbolAtomRenderer(node, opts)\n else if (proto === 'bng') return new BngRenderer(node, opts)\n else if (proto === 'tgl') return new TglRenderer(node, opts)\n else if (proto === 'nbx') return new NbxRenderer(node, opts)\n else if (proto === 'hsl') return new HslRenderer(node, opts)\n else if (proto === 'vsl') return new VslRenderer(node, opts)\n else if (proto === 'hradio') return new HRadioRenderer(node, opts)\n else if (proto === 'vradio') return new VRadioRenderer(node, opts)\n else if (proto === 'vu') return new VuRenderer(node, opts)\n else return new ObjectRenderer(node, opts)\n })\n\n // Render the nodes\n nodes = root.selectAll('g.node')\n .data(patch.nodes)\n .enter()\n .append('g')\n .attr('transform', function(renderer) {\n return 'translate(' + renderer.getX() + ' ' + renderer.getY() + ')'\n })\n .attr('class', 'node')\n .attr('id', function(node) { return node.id })\n .each(function(renderer, i) { renderer.render(d3.select(this)) })\n\n // Render the connections\n connections = root.selectAll('line.connection')\n .data(patch.connections)\n .enter()\n .append('line')\n .attr('class', 'connection')\n .attr('style', 'stroke:black;stroke-width:2px;')\n .each(function(conn) {\n var sourceRenderer = patch.getNode(conn.source.id)\n , sinkRenderer = patch.getNode(conn.sink.id)\n\n d3.select(this)\n .attr('x1', function(conn) {\n return sourceRenderer.getOutletX(conn.source.port) + opts.portletWidth/2\n })\n .attr('y1', function(conn) {\n return sourceRenderer.getOutletY(conn.source.port) + opts.portletHeight\n })\n .attr('x2', function(conn) {\n return sinkRenderer.getInletX(conn.sink.port) + opts.portletWidth/2 \n })\n .attr('y2', function(conn) {\n return sinkRenderer.getInletY(conn.sink.port)\n })\n })\n\n // Calculate width / height of the SVG\n var allX1 = [], allY1 = [], allX2 = [], allY2 = []\n , topLeft = {}, bottomRight = {}\n _.forEach(patch.nodes, function(n) {\n allX1.push(n.getX())\n allY1.push(n.getY())\n allX2.push(n.getX() + n.getW())\n allY2.push(n.getY() + n.getH())\n })\n topLeft.x = _.min(allX1)\n topLeft.y = _.min(allY1)\n bottomRight.x = _.max(allX2)\n bottomRight.y = _.max(allY2)\n svg.attr('width', bottomRight.x - topLeft.x + opts.padding * 2)\n svg.attr('height', bottomRight.y - topLeft.y + opts.padding * 2)\n root.attr('transform', 'translate('\n + (-topLeft.x + opts.padding) + ' '\n + (-topLeft.y + opts.padding) + ')'\n )\n\n // Finally rendering to a string\n var rendered = svgContainer.node().innerHTML\n if (opts.svgFile) {\n rendered = '<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" '\n + '\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">' + rendered\n } else {\n svgContainer.remove()\n }\n return rendered\n\n}\n\n//==================== Node renderers ====================//\n\n// Simple helper to memoize some method calls\nvar memoized = function(obj, methodName) {\n var originalMethod = obj[methodName]\n , cache = undefined\n\n if (originalMethod.length > 0)\n throw new Error('This memoization is valid only for methods with 0 arguments')\n\n obj[methodName] = function() {\n cache = originalMethod.apply(obj, arguments)\n obj[methodName] = function() { return cache }\n return cache\n }\n}\n\nvar NodeRenderer = function(node, opts) {\n this.opts = opts\n this.node = node\n this.id = node.id\n memoized(this, 'getX')\n memoized(this, 'getY')\n}\n\n_.extend(NodeRenderer.prototype, {\n\n // Returns node X in the canvas\n getX: function() { return this.node.layout.x * this.opts.ratio },\n\n // Returns node Y in the canvas\n getY: function() { return this.node.layout.y * this.opts.ratio },\n\n // Returns outlet's absolute X in the canvas\n getOutletX: function(outlet) {\n return this.getOutletRelX(outlet) + this.getX()\n },\n\n // Returns intlet's absolute X in the canvas\n getInletX: function(inlet) {\n return this.getInletRelX(inlet) + this.getX()\n },\n\n // Returns outlet's Y in the canvas\n getOutletY: function(outlet) {\n return this.getOutletRelY(outlet) + this.getY()\n },\n\n // Returns inlet's Y in the canvas\n getInletY: function(inlet) {\n return this.getInletRelY(inlet) + this.getY()\n },\n\n // ---- Methods to implement ---- //\n // Do the actual rendering in svg group `g`.\n render: function(g) { throw new Error('Implement me') },\n\n // Returns the width of the bounding box of the node\n getW: function() { throw new Error('Implement me') },\n\n // Returns the height of the bounding box of the node\n getH: function() { throw new Error('Implement me') },\n\n // Returns outlet X relatively to the node\n getOutletRelX: function(outlet) { throw new Error('Implement me') },\n\n // Returns inlet X relatively to the node\n getInletRelX: function(inlet) { throw new Error('Implement me') },\n\n // Returns outlet Y relatively to the node\n getOutletRelY: function(outlet) { throw new Error('Implement me') },\n\n // Returns inlet Y relatively to the node\n getInletRelY: function(inlet) { throw new Error('Implement me') },\n\n})\n\n\nvar ObjectRenderer = function() {\n NodeRenderer.prototype.constructor.apply(this, arguments)\n memoized(this, 'getW')\n memoized(this, 'getH')\n}\n\n_.extend(ObjectRenderer.prototype, NodeRenderer.prototype, {\n\n render: function(g) {\n this.renderBox(g)\n this.renderText(g)\n this.renderOutlets(g)\n this.renderInlets(g)\n },\n\n renderBox: function(g) {\n g.append('rect')\n .attr('class', 'box')\n .attr('width', this.getW())\n .attr('height', this.getH())\n .attr('style', 'stroke:black;fill:white;')\n },\n\n renderText: function(g) {\n g.append('text')\n .attr('class', 'proto')\n .text(this.getText())\n .attr('dy', this.getTextY())\n .attr('dx', this.opts.textPadding)\n },\n\n renderInlets: function(g) { this._genericRenderPortlets('inlet', g) },\n renderOutlets: function(g) { this._genericRenderPortlets('outlet', g) },\n _genericRenderPortlets: function(portletType, g) {\n var portletTypeCap = portletType.substr(0, 1).toUpperCase() + portletType.substr(1)\n , self = this\n g.selectAll('rect.' + portletType)\n .data(_.range(this.node[portletType+'s']))\n .enter()\n .append('rect')\n .classed(portletType, true)\n .classed('portlet', true)\n .attr('width', this.opts.portletWidth)\n .attr('height', this.opts.portletHeight)\n .attr('x', function(i) { return self['get' + portletTypeCap + 'RelX'](i) })\n .attr('y', function(i) { return self['get' + portletTypeCap + 'RelY'](i) })\n },\n\n // Returns object height\n getH: function() { return this.opts.objMinHeight },\n\n // Returns object width\n getW: function() {\n var maxPortlet = Math.max(this.node.inlets, this.node.outlets)\n , textLength = this.getText().length * this.opts.glyphWidth + this.opts.textPadding * 2\n return Math.max((maxPortlet-1) * this.opts.objMinWidth, this.opts.objMinWidth, textLength)\n },\n\n // Returns text to display on the object \n getText: function() { return this.node.proto + ' ' + this.node.args.join(' ') },\n\n // Returns text Y relatively to the object \n getTextY: function() { return this.getH()/2 + this.opts.glyphHeight/2 }, \n\n // ---- Implement virtual methods ---- //\n getOutletRelX: function(outlet) {\n return this._genericPortletRelX('outlets', outlet)\n },\n\n getInletRelX: function(inlet) {\n return this._genericPortletRelX('inlets', inlet)\n },\n\n getOutletRelY: function(outlet) {\n return this.getH() - this.opts.portletHeight\n },\n\n getInletRelY: function(inlet) { return 0 },\n\n _genericPortletRelX: function(inOrOutlets, portlet) {\n var width = this.getW()\n , n = this.node[inOrOutlets]\n if (portlet === 0) return 0;\n else if (portlet === n-1) return width - this.opts.portletWidth\n else {\n // Space between portlets\n var a = (width - n*this.opts.portletWidth) / (n-1)\n return portlet * (this.opts.portletWidth + a)\n }\n }\n\n})\n\n\nvar MsgRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(MsgRenderer.prototype, ObjectRenderer.prototype, {\n\n renderBox: function(g) {\n\n var r = this.getH() * 0.75\n , teta = Math.asin(this.getH() / (2 * r)) \n , arcPath = d3.arc()({ \n innerRadius: r,\n outerRadius: r,\n startAngle: -Math.PI / 2 - teta,\n endAngle: -Math.PI / 2 + teta\n })\n , linePath = d3.line()([\n [this.getW(), 0], [0, 0],\n [0, this.getH()], [this.getW(), this.getH()]\n ])\n\n g.append('svg:path')\n .attr('d', linePath)\n .attr('style', 'stroke:black;fill:white;')\n\n g.append('svg:path')\n .attr('d', arcPath)\n .attr('transform', 'translate(' + (this.getW() + r * Math.cos(teta)) + ' ' + this.getH()/2 + ')')\n .attr('style', 'stroke:black;fill:white;')\n },\n\n getText: function() { return this.node.args.join(' ') }\n\n})\n\n\nvar AtomBoxRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(AtomBoxRenderer.prototype, ObjectRenderer.prototype, {\n\n renderBox: function(g) {\n\n var r = this.getH() * 0.4\n , arcPath = d3.arc()({ \n innerRadius: r,\n outerRadius: r,\n startAngle: 0,\n endAngle: Math.PI / 2\n })\n , linePath = d3.line()([\n [this.getW() - r, 0], [0, 0], [0, this.getH()],\n [this.getW(), this.getH()], [this.getW(), r]\n ])\n\n g.append('svg:path')\n .attr('d', linePath)\n .attr('style', 'stroke:black;fill:white;')\n\n g.append('svg:path')\n .attr('d', arcPath)\n .attr('transform', 'translate(' + (this.getW() - r) + ' ' + r + ')')\n .attr('style', 'stroke:black;fill:white;')\n }\n\n})\n\nvar FloatAtomRenderer = function() {\n AtomBoxRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(FloatAtomRenderer.prototype, AtomBoxRenderer.prototype, {\n\n getText: function() { return '0' }\n\n})\n\n\nvar SymbolAtomRenderer = function() {\n AtomBoxRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(SymbolAtomRenderer.prototype, AtomBoxRenderer.prototype, {\n\n getText: function() { return 'symbol' }\n\n})\n\n\n\nvar BngRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(BngRenderer.prototype, ObjectRenderer.prototype, {\n\n render: function(g) {\n g.append('rect')\n .attr('class', 'box')\n .attr('width', this.getW())\n .attr('height', this.getH())\n .attr('style', 'stroke:black;fill:white;')\n\n g.append('circle')\n .attr('cx', this.getW()/2)\n .attr('cy', this.getH()/2)\n .attr('r', this.getW()/3)\n .attr('style', 'stroke:black;fill:white;')\n\n this.renderOutlets(g)\n this.renderInlets(g)\n },\n\n getW: function() { return 20 },\n getH: function() { return 20 }\n\n})\n\n\nvar TglRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(TglRenderer.prototype, ObjectRenderer.prototype, {\n\n render: function(g) {\n var crossPath = d3.symbol()\n .size(this.getW() * this.getH() / 3.5)\n .type(d3.symbolCross)([1])\n\n g.append('rect')\n .attr('class', 'box')\n .attr('width', this.getW())\n .attr('height', this.getH())\n .attr('style', 'stroke:black;fill:white;')\n\n g.append('svg:path')\n .attr('d', crossPath)\n .attr('transform', 'rotate(' + 45 + ' ' + this.getW()/2 + ' ' + this.getH()/2\n + ') translate(' + this.getW()/2 + ' ' + this.getH()/2 + ')')\n .attr('style', 'stroke:black;fill:white;')\n\n this.renderOutlets(g)\n this.renderInlets(g)\n },\n\n getW: function() { return 20 },\n getH: function() { return 20 }\n\n})\n\n\nvar NbxRenderer = function() {\n AtomBoxRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(NbxRenderer.prototype, AtomBoxRenderer.prototype, {\n\n renderBox: function(g) {\n AtomBoxRenderer.prototype.renderBox.apply(this, arguments)\n var trianglePath = d3.line()([ [0, 0], [this.getW()/6, this.getH()/2], [0, this.getH()] ])\n g.append('svg:path')\n .attr('d', trianglePath)\n .attr('style', 'stroke:black;fill:white;')\n },\n\n getText: function() { return '0' }\n\n})\n\n\nvar HslRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(HslRenderer.prototype, ObjectRenderer.prototype, {\n\n renderBox: function(g) {\n ObjectRenderer.prototype.renderBox.apply(this, arguments)\n var cursorPath = d3.line()([ [5, 0], [10, 0],\n [10, this.getH()], [5, this.getH()], [5, 0] ])\n g.append('svg:path')\n .attr('d', cursorPath)\n .attr('style', 'stroke:black;fill:black;')\n },\n\n getText: function() { return '' },\n getW: function() { return 200 },\n getH: function() { return 20 }\n\n})\n\n\nvar VslRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(VslRenderer.prototype, ObjectRenderer.prototype, {\n\n renderBox: function(g) {\n ObjectRenderer.prototype.renderBox.apply(this, arguments)\n var cursorPath = d3.line()([ [0, 5], [0, 10],\n [this.getW(), 10], [this.getW(), 5], [0, 5] ])\n g.append('svg:path')\n .attr('d', cursorPath)\n .attr('style', 'stroke:black;fill:black;')\n },\n\n getText: function() { return '' },\n getW: function() { return 20 },\n getH: function() { return 200 }\n\n})\n\n\nvar HRadioRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(HRadioRenderer.prototype, ObjectRenderer.prototype, {\n\n renderBox: function(g) {\n var nBoxes = this.getNBoxes(), i\n , enabledSize = this.getBoxSize() / 1.5\n for (i = 0; i < nBoxes; i++) {\n g.append('rect')\n .attr('width', this.getBoxSize())\n .attr('height', this.getBoxSize())\n .attr('transform', 'translate(' + i * this.getBoxSize() + ' ' + 0 + ')')\n .attr('style', 'stroke:black;fill:white;')\n }\n g.append('rect')\n .attr('width', enabledSize)\n .attr('height', enabledSize)\n .attr('transform', 'translate(' + (this.getBoxSize() - enabledSize) / 2\n + ' ' + (this.getBoxSize() - enabledSize) / 2 + ')')\n .attr('style', 'stroke:black;fill:black;')\n },\n\n getW: function() { return this.getBoxSize() * this.getNBoxes() },\n getH: function() { return this.getBoxSize() },\n getBoxSize: function() { return 20 },\n getNBoxes: function() { return this.node.args[2] },\n getText: function() { return '' }\n\n})\n\n\nvar VRadioRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(VRadioRenderer.prototype, ObjectRenderer.prototype, {\n\n renderBox: function(g) {\n var nBoxes = this.getNBoxes(), i\n , enabledSize = this.getBoxSize() / 1.5\n for (i = 0; i < nBoxes; i++) {\n g.append('rect')\n .attr('width', this.getBoxSize())\n .attr('height', this.getBoxSize())\n .attr('transform', 'translate(' + 0 + ' ' + i * this.getBoxSize() + ')')\n .attr('style', 'stroke:black;fill:white;')\n }\n g.append('rect')\n .attr('width', enabledSize)\n .attr('height', enabledSize)\n .attr('transform', 'translate(' + (this.getBoxSize() - enabledSize) / 2\n + ' ' + (this.getBoxSize() - enabledSize) / 2 + ')')\n .attr('style', 'stroke:black;fill:black;')\n },\n\n getW: function() { return this.getBoxSize() },\n getH: function() { return this.getBoxSize() * this.getNBoxes() },\n getBoxSize: function() { return 20 },\n getNBoxes: function() { return this.node.args[2] },\n getText: function() { return '' }\n\n})\n\n\nvar VuRenderer = function() {\n ObjectRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(VuRenderer.prototype, ObjectRenderer.prototype, {\n\n renderBox: function(g) {\n g.append('rect')\n .attr('class', 'box')\n .attr('width', this.getW())\n .attr('height', this.getH())\n .attr('style', 'stroke:black;fill:grey;')\n },\n\n getText: function() { return '' },\n getW: function() { return 20 },\n getH: function() { return 200 }\n\n})\n\n\nvar TextRenderer = function() {\n NodeRenderer.prototype.constructor.apply(this, arguments)\n}\n\n_.extend(TextRenderer.prototype, NodeRenderer.prototype, {\n\n render: function(g) {\n g.append('text')\n .attr('class', 'comment')\n .text(this.node.args[0])\n .attr('dy', this.getH()/2 + this.opts.glyphHeight/2)\n },\n getW: function() { return this.node.args[0].length * this.opts.glyphWidth + this.opts.textPadding * 2 },\n getH: function() { return this.opts.objMinHeight }\n\n})\n\n\n//# sourceURL=webpack:///./lib/svg-rendering.js?"); /***/ }), /***/ "./node_modules/css-loader/dist/cjs.js!./lib/svg-default-style.css": /*!*************************************************************************!*\ !*** ./node_modules/css-loader/dist/cjs.js!./lib/svg-default-style.css ***! \*************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { eval("exports = module.exports = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.i, \"@font-face {\\n font-family: 'source_code_proregular';\\n src: url(data:application/x-font-woff;charset=utf-8;base64,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