mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-18 20:47:54 +00:00
1 line
112 KiB
JSON
1 line
112 KiB
JSON
{"ast":null,"code":"/*!\r\n * wordcloud2.js\r\n * http://timdream.org/wordcloud2.js/\r\n *\r\n * Copyright 2011 - 2019 Tim Guan-tin Chien and contributors.\r\n * Released under the MIT license\r\n */\n\n'use strict';\n\n// setImmediate\nif (!window.setImmediate) {\n window.setImmediate = function setupSetImmediate() {\n return window.msSetImmediate || window.webkitSetImmediate || window.mozSetImmediate || window.oSetImmediate || function setupSetZeroTimeout() {\n if (!window.postMessage || !window.addEventListener) {\n return null;\n }\n var callbacks = [undefined];\n var message = 'zero-timeout-message';\n\n // Like setTimeout, but only takes a function argument. There's\n // no time argument (always zero) and no arguments (you have to\n // use a closure).\n var setZeroTimeout = function setZeroTimeout(callback) {\n var id = callbacks.length;\n callbacks.push(callback);\n window.postMessage(message + id.toString(36), '*');\n return id;\n };\n window.addEventListener('message', function setZeroTimeoutMessage(evt) {\n // Skipping checking event source, retarded IE confused this window\n // object with another in the presence of iframe\n if (typeof evt.data !== 'string' || evt.data.substr(0, message.length) !== message /* ||\r\n evt.source !== window */) {\n return;\n }\n evt.stopImmediatePropagation();\n var id = parseInt(evt.data.substr(message.length), 36);\n if (!callbacks[id]) {\n return;\n }\n callbacks[id]();\n callbacks[id] = undefined;\n }, true);\n\n /* specify clearImmediate() here since we need the scope */\n window.clearImmediate = function clearZeroTimeout(id) {\n if (!callbacks[id]) {\n return;\n }\n callbacks[id] = undefined;\n };\n return setZeroTimeout;\n }() ||\n // fallback\n function setImmediateFallback(fn) {\n window.setTimeout(fn, 0);\n };\n }();\n}\nif (!window.clearImmediate) {\n window.clearImmediate = function setupClearImmediate() {\n return window.msClearImmediate || window.webkitClearImmediate || window.mozClearImmediate || window.oClearImmediate ||\n // \"clearZeroTimeout\" is implement on the previous block ||\n // fallback\n function clearImmediateFallback(timer) {\n window.clearTimeout(timer);\n };\n }();\n}\n(function (global) {\n // Check if WordCloud can run on this browser\n var isSupported = function isSupported() {\n var canvas = document.createElement('canvas');\n if (!canvas || !canvas.getContext) {\n return false;\n }\n var ctx = canvas.getContext('2d');\n if (!ctx) {\n return false;\n }\n if (!ctx.getImageData) {\n return false;\n }\n if (!ctx.fillText) {\n return false;\n }\n if (!Array.prototype.some) {\n return false;\n }\n if (!Array.prototype.push) {\n return false;\n }\n return true;\n }();\n\n // Find out if the browser impose minium font size by\n // drawing small texts on a canvas and measure it's width.\n var minFontSize = function getMinFontSize() {\n if (!isSupported) {\n return;\n }\n var ctx = document.createElement('canvas').getContext('2d');\n\n // start from 20\n var size = 20;\n\n // two sizes to measure\n var hanWidth, mWidth;\n while (size) {\n ctx.font = size.toString(10) + 'px sans-serif';\n if (ctx.measureText('\\uFF37').width === hanWidth && ctx.measureText('m').width === mWidth) {\n return size + 1;\n }\n hanWidth = ctx.measureText('\\uFF37').width;\n mWidth = ctx.measureText('m').width;\n size--;\n }\n return 0;\n }();\n\n // Based on http://jsfromhell.com/array/shuffle\n var shuffleArray = function shuffleArray(arr) {\n for (var j, x, i = arr.length; i;) {\n j = Math.floor(Math.random() * i);\n x = arr[--i];\n arr[i] = arr[j];\n arr[j] = x;\n }\n return arr;\n };\n var WordCloud = function WordCloud(elements, options) {\n if (!isSupported) {\n return;\n }\n if (!Array.isArray(elements)) {\n elements = [elements];\n }\n elements.forEach(function (el, i) {\n if (typeof el === 'string') {\n elements[i] = document.getElementById(el);\n if (!elements[i]) {\n throw new Error('The element id specified is not found.');\n }\n } else if (!el.tagName && !el.appendChild) {\n throw new Error('You must pass valid HTML elements, or ID of the element.');\n }\n });\n\n /* Default values to be overwritten by options object */\n var settings = {\n list: [],\n fontFamily: '\"Trebuchet MS\", \"Heiti TC\", \"微軟正黑體\", ' + '\"Arial Unicode MS\", \"Droid Fallback Sans\", sans-serif',\n fontWeight: 'normal',\n color: 'random-dark',\n minSize: 0,\n // 0 to disable\n weightFactor: 1,\n clearCanvas: true,\n backgroundColor: '#fff',\n // opaque white = rgba(255, 255, 255, 1)\n\n gridSize: 8,\n drawOutOfBound: false,\n shrinkToFit: false,\n origin: null,\n drawMask: false,\n maskColor: 'rgba(255,0,0,0.3)',\n maskGapWidth: 0.3,\n wait: 0,\n abortThreshold: 0,\n // disabled\n abort: function noop() {},\n minRotation: -Math.PI / 2,\n maxRotation: Math.PI / 2,\n rotationSteps: 0,\n shuffle: true,\n rotateRatio: 0.1,\n shape: 'circle',\n ellipticity: 0.65,\n classes: null,\n hover: null,\n click: null\n };\n if (options) {\n for (var key in options) {\n if (key in settings) {\n settings[key] = options[key];\n }\n }\n }\n\n /* Convert weightFactor into a function */\n if (typeof settings.weightFactor !== 'function') {\n var factor = settings.weightFactor;\n settings.weightFactor = function weightFactor(pt) {\n return pt * factor; // in px\n };\n }\n\n /* Convert shape into a function */\n if (typeof settings.shape !== 'function') {\n switch (settings.shape) {\n case 'circle':\n /* falls through */\n default:\n // 'circle' is the default and a shortcut in the code loop.\n settings.shape = 'circle';\n break;\n case 'cardioid':\n settings.shape = function shapeCardioid(theta) {\n return 1 - Math.sin(theta);\n };\n break;\n\n /*\r\n To work out an X-gon, one has to calculate \"m\",\r\n where 1/(cos(2*PI/X)+m*sin(2*PI/X)) = 1/(cos(0)+m*sin(0))\r\n http://www.wolframalpha.com/input/?i=1%2F%28cos%282*PI%2FX%29%2Bm*sin%28\r\n 2*PI%2FX%29%29+%3D+1%2F%28cos%280%29%2Bm*sin%280%29%29\r\n Copy the solution into polar equation r = 1/(cos(t') + m*sin(t'))\r\n where t' equals to mod(t, 2PI/X)\r\n */\n\n case 'diamond':\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\n // %28t%2C+PI%2F2%29%29%2Bsin%28mod+%28t%2C+PI%2F2%29%29%29%2C+t+%3D\n // +0+..+2*PI\n settings.shape = function shapeSquare(theta) {\n var thetaPrime = theta % (2 * Math.PI / 4);\n return 1 / (Math.cos(thetaPrime) + Math.sin(thetaPrime));\n };\n break;\n case 'square':\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+min(1%2Fabs(cos(t\n // )),1%2Fabs(sin(t)))),+t+%3D+0+..+2*PI\n settings.shape = function shapeSquare(theta) {\n return Math.min(1 / Math.abs(Math.cos(theta)), 1 / Math.abs(Math.sin(theta)));\n };\n break;\n case 'triangle-forward':\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\n // %28t%2C+2*PI%2F3%29%29%2Bsqrt%283%29sin%28mod+%28t%2C+2*PI%2F3%29\n // %29%29%2C+t+%3D+0+..+2*PI\n settings.shape = function shapeTriangle(theta) {\n var thetaPrime = theta % (2 * Math.PI / 3);\n return 1 / (Math.cos(thetaPrime) + Math.sqrt(3) * Math.sin(thetaPrime));\n };\n break;\n case 'triangle':\n case 'triangle-upright':\n settings.shape = function shapeTriangle(theta) {\n var thetaPrime = (theta + Math.PI * 3 / 2) % (2 * Math.PI / 3);\n return 1 / (Math.cos(thetaPrime) + Math.sqrt(3) * Math.sin(thetaPrime));\n };\n break;\n case 'pentagon':\n settings.shape = function shapePentagon(theta) {\n var thetaPrime = (theta + 0.955) % (2 * Math.PI / 5);\n return 1 / (Math.cos(thetaPrime) + 0.726543 * Math.sin(thetaPrime));\n };\n break;\n case 'star':\n settings.shape = function shapeStar(theta) {\n var thetaPrime = (theta + 0.955) % (2 * Math.PI / 10);\n if ((theta + 0.955) % (2 * Math.PI / 5) - 2 * Math.PI / 10 >= 0) {\n return 1 / (Math.cos(2 * Math.PI / 10 - thetaPrime) + 3.07768 * Math.sin(2 * Math.PI / 10 - thetaPrime));\n } else {\n return 1 / (Math.cos(thetaPrime) + 3.07768 * Math.sin(thetaPrime));\n }\n };\n break;\n }\n }\n\n /* Make sure gridSize is a whole number and is not smaller than 4px */\n settings.gridSize = Math.max(Math.floor(settings.gridSize), 4);\n\n /* shorthand */\n var g = settings.gridSize;\n var maskRectWidth = g - settings.maskGapWidth;\n\n /* normalize rotation settings */\n var rotationRange = Math.abs(settings.maxRotation - settings.minRotation);\n var rotationSteps = Math.abs(Math.floor(settings.rotationSteps));\n var minRotation = Math.min(settings.maxRotation, settings.minRotation);\n\n /* information/object available to all functions, set when start() */\n var grid,\n // 2d array containing filling information\n ngx, ngy,\n // width and height of the grid\n center,\n // position of the center of the cloud\n maxRadius;\n\n /* timestamp for measuring each putWord() action */\n var escapeTime;\n\n /* function for getting the color of the text */\n var getTextColor;\n function randomHslColor(min, max) {\n return 'hsl(' + (Math.random() * 360).toFixed() + ',' + (Math.random() * 30 + 70).toFixed() + '%,' + (Math.random() * (max - min) + min).toFixed() + '%)';\n }\n switch (settings.color) {\n case 'random-dark':\n getTextColor = function getRandomDarkColor() {\n return randomHslColor(10, 50);\n };\n break;\n case 'random-light':\n getTextColor = function getRandomLightColor() {\n return randomHslColor(50, 90);\n };\n break;\n default:\n if (typeof settings.color === 'function') {\n getTextColor = settings.color;\n }\n break;\n }\n\n /* function for getting the font-weight of the text */\n var getTextFontWeight;\n if (typeof settings.fontWeight === 'function') {\n getTextFontWeight = settings.fontWeight;\n }\n\n /* function for getting the classes of the text */\n var getTextClasses = null;\n if (typeof settings.classes === 'function') {\n getTextClasses = settings.classes;\n }\n\n /* Interactive */\n var interactive = false;\n var infoGrid = [];\n var hovered;\n var getInfoGridFromMouseTouchEvent = function getInfoGridFromMouseTouchEvent(evt) {\n var canvas = evt.currentTarget;\n var rect = canvas.getBoundingClientRect();\n var clientX;\n var clientY;\n /** Detect if touches are available */\n if (evt.touches) {\n clientX = evt.touches[0].clientX;\n clientY = evt.touches[0].clientY;\n } else {\n clientX = evt.clientX;\n clientY = evt.clientY;\n }\n var eventX = clientX - rect.left;\n var eventY = clientY - rect.top;\n var x = Math.floor(eventX * (canvas.width / rect.width || 1) / g);\n var y = Math.floor(eventY * (canvas.height / rect.height || 1) / g);\n return infoGrid[x][y];\n };\n var wordcloudhover = function wordcloudhover(evt) {\n var info = getInfoGridFromMouseTouchEvent(evt);\n if (hovered === info) {\n return;\n }\n hovered = info;\n if (!info) {\n settings.hover(undefined, undefined, evt);\n return;\n }\n settings.hover(info.item, info.dimension, evt);\n };\n var wordcloudclick = function wordcloudclick(evt) {\n var info = getInfoGridFromMouseTouchEvent(evt);\n if (!info) {\n return;\n }\n settings.click(info.item, info.dimension, evt);\n evt.preventDefault();\n };\n\n /* Get points on the grid for a given radius away from the center */\n var pointsAtRadius = [];\n var getPointsAtRadius = function getPointsAtRadius(radius) {\n if (pointsAtRadius[radius]) {\n return pointsAtRadius[radius];\n }\n\n // Look for these number of points on each radius\n var T = radius * 8;\n\n // Getting all the points at this radius\n var t = T;\n var points = [];\n if (radius === 0) {\n points.push([center[0], center[1], 0]);\n }\n while (t--) {\n // distort the radius to put the cloud in shape\n var rx = 1;\n if (settings.shape !== 'circle') {\n rx = settings.shape(t / T * 2 * Math.PI); // 0 to 1\n }\n\n // Push [x, y, t] t is used solely for getTextColor()\n points.push([center[0] + radius * rx * Math.cos(-t / T * 2 * Math.PI), center[1] + radius * rx * Math.sin(-t / T * 2 * Math.PI) * settings.ellipticity, t / T * 2 * Math.PI]);\n }\n pointsAtRadius[radius] = points;\n return points;\n };\n\n /* Return true if we had spent too much time */\n var exceedTime = function exceedTime() {\n return settings.abortThreshold > 0 && new Date().getTime() - escapeTime > settings.abortThreshold;\n };\n\n /* Get the deg of rotation according to settings, and luck. */\n var getRotateDeg = function getRotateDeg() {\n if (settings.rotateRatio === 0) {\n return 0;\n }\n if (Math.random() > settings.rotateRatio) {\n return 0;\n }\n if (rotationRange === 0) {\n return minRotation;\n }\n if (rotationSteps > 0) {\n // Min rotation + zero or more steps * span of one step\n return minRotation + Math.floor(Math.random() * rotationSteps) * rotationRange / (rotationSteps - 1);\n } else {\n return minRotation + Math.random() * rotationRange;\n }\n };\n var getTextInfo = function getTextInfo(word, weight, rotateDeg) {\n // calculate the acutal font size\n // fontSize === 0 means weightFactor function wants the text skipped,\n // and size < minSize means we cannot draw the text.\n var debug = false;\n var fontSize = settings.weightFactor(weight);\n if (fontSize <= settings.minSize) {\n return false;\n }\n\n // Scale factor here is to make sure fillText is not limited by\n // the minium font size set by browser.\n // It will always be 1 or 2n.\n var mu = 1;\n if (fontSize < minFontSize) {\n mu = function calculateScaleFactor() {\n var mu = 2;\n while (mu * fontSize < minFontSize) {\n mu += 2;\n }\n return mu;\n }();\n }\n\n // Get fontWeight that will be used to set fctx.font\n var fontWeight;\n if (getTextFontWeight) {\n fontWeight = getTextFontWeight(word, weight, fontSize);\n } else {\n fontWeight = settings.fontWeight;\n }\n var fcanvas = document.createElement('canvas');\n var fctx = fcanvas.getContext('2d', {\n willReadFrequently: true\n });\n fctx.font = fontWeight + ' ' + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n\n // Estimate the dimension of the text with measureText().\n var fw = fctx.measureText(word).width / mu;\n var fh = Math.max(fontSize * mu, fctx.measureText('m').width, fctx.measureText('\\uFF37').width) / mu;\n\n // Create a boundary box that is larger than our estimates,\n // so text don't get cut of (it sill might)\n var boxWidth = fw + fh * 2;\n var boxHeight = fh * 3;\n var fgw = Math.ceil(boxWidth / g);\n var fgh = Math.ceil(boxHeight / g);\n boxWidth = fgw * g;\n boxHeight = fgh * g;\n\n // Calculate the proper offsets to make the text centered at\n // the preferred position.\n\n // This is simply half of the width.\n var fillTextOffsetX = -fw / 2;\n // Instead of moving the box to the exact middle of the preferred\n // position, for Y-offset we move 0.4 instead, so Latin alphabets look\n // vertical centered.\n var fillTextOffsetY = -fh * 0.4;\n\n // Calculate the actual dimension of the canvas, considering the rotation.\n var cgh = Math.ceil((boxWidth * Math.abs(Math.sin(rotateDeg)) + boxHeight * Math.abs(Math.cos(rotateDeg))) / g);\n var cgw = Math.ceil((boxWidth * Math.abs(Math.cos(rotateDeg)) + boxHeight * Math.abs(Math.sin(rotateDeg))) / g);\n var width = cgw * g;\n var height = cgh * g;\n fcanvas.setAttribute('width', width);\n fcanvas.setAttribute('height', height);\n if (debug) {\n // Attach fcanvas to the DOM\n document.body.appendChild(fcanvas);\n // Save it's state so that we could restore and draw the grid correctly.\n fctx.save();\n }\n\n // Scale the canvas with |mu|.\n fctx.scale(1 / mu, 1 / mu);\n fctx.translate(width * mu / 2, height * mu / 2);\n fctx.rotate(-rotateDeg);\n\n // Once the width/height is set, ctx info will be reset.\n // Set it again here.\n fctx.font = fontWeight + ' ' + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n\n // Fill the text into the fcanvas.\n // XXX: We cannot because textBaseline = 'top' here because\n // Firefox and Chrome uses different default line-height for canvas.\n // Please read https://bugzil.la/737852#c6.\n // Here, we use textBaseline = 'middle' and draw the text at exactly\n // 0.5 * fontSize lower.\n fctx.fillStyle = '#000';\n fctx.textBaseline = 'middle';\n fctx.fillText(word, fillTextOffsetX * mu, (fillTextOffsetY + fontSize * 0.5) * mu);\n\n // Get the pixels of the text\n var imageData = fctx.getImageData(0, 0, width, height).data;\n if (exceedTime()) {\n return false;\n }\n if (debug) {\n // Draw the box of the original estimation\n fctx.strokeRect(fillTextOffsetX * mu, fillTextOffsetY, fw * mu, fh * mu);\n fctx.restore();\n }\n\n // Read the pixels and save the information to the occupied array\n var occupied = [];\n var gx = cgw;\n var gy, x, y;\n var bounds = [cgh / 2, cgw / 2, cgh / 2, cgw / 2];\n while (gx--) {\n gy = cgh;\n while (gy--) {\n y = g;\n /* eslint no-labels: [\"error\", { \"allowLoop\": true }] */\n singleGridLoop: while (y--) {\n x = g;\n while (x--) {\n if (imageData[((gy * g + y) * width + (gx * g + x)) * 4 + 3]) {\n occupied.push([gx, gy]);\n if (gx < bounds[3]) {\n bounds[3] = gx;\n }\n if (gx > bounds[1]) {\n bounds[1] = gx;\n }\n if (gy < bounds[0]) {\n bounds[0] = gy;\n }\n if (gy > bounds[2]) {\n bounds[2] = gy;\n }\n if (debug) {\n fctx.fillStyle = 'rgba(255, 0, 0, 0.5)';\n fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5);\n }\n break singleGridLoop;\n }\n }\n }\n if (debug) {\n fctx.fillStyle = 'rgba(0, 0, 255, 0.5)';\n fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5);\n }\n }\n }\n if (debug) {\n fctx.fillStyle = 'rgba(0, 255, 0, 0.5)';\n fctx.fillRect(bounds[3] * g, bounds[0] * g, (bounds[1] - bounds[3] + 1) * g, (bounds[2] - bounds[0] + 1) * g);\n }\n\n // Return information needed to create the text on the real canvas\n return {\n mu: mu,\n occupied: occupied,\n bounds: bounds,\n gw: cgw,\n gh: cgh,\n fillTextOffsetX: fillTextOffsetX,\n fillTextOffsetY: fillTextOffsetY,\n fillTextWidth: fw,\n fillTextHeight: fh,\n fontSize: fontSize\n };\n };\n\n /* Determine if there is room available in the given dimension */\n var canFitText = function canFitText(gx, gy, gw, gh, occupied) {\n // Go through the occupied points,\n // return false if the space is not available.\n var i = occupied.length;\n while (i--) {\n var px = gx + occupied[i][0];\n var py = gy + occupied[i][1];\n if (px >= ngx || py >= ngy || px < 0 || py < 0) {\n if (!settings.drawOutOfBound) {\n return false;\n }\n continue;\n }\n if (!grid[px][py]) {\n return false;\n }\n }\n return true;\n };\n\n /* Actually draw the text on the grid */\n var drawText = function drawText(gx, gy, info, word, weight, distance, theta, rotateDeg, attributes) {\n var fontSize = info.fontSize;\n var color;\n if (getTextColor) {\n color = getTextColor(word, weight, fontSize, distance, theta);\n } else {\n color = settings.color;\n }\n\n // get fontWeight that will be used to set ctx.font and font style rule\n var fontWeight;\n if (getTextFontWeight) {\n fontWeight = getTextFontWeight(word, weight, fontSize);\n } else {\n fontWeight = settings.fontWeight;\n }\n var classes;\n if (getTextClasses) {\n classes = getTextClasses(word, weight, fontSize);\n } else {\n classes = settings.classes;\n }\n elements.forEach(function (el) {\n if (el.getContext) {\n var ctx = el.getContext('2d');\n var mu = info.mu;\n\n // Save the current state before messing it\n ctx.save();\n ctx.scale(1 / mu, 1 / mu);\n ctx.font = fontWeight + ' ' + (fontSize * mu).toString(10) + 'px ' + settings.fontFamily;\n ctx.fillStyle = color;\n\n // Translate the canvas position to the origin coordinate of where\n // the text should be put.\n ctx.translate((gx + info.gw / 2) * g * mu, (gy + info.gh / 2) * g * mu);\n if (rotateDeg !== 0) {\n ctx.rotate(-rotateDeg);\n }\n\n // Finally, fill the text.\n\n // XXX: We cannot because textBaseline = 'top' here because\n // Firefox and Chrome uses different default line-height for canvas.\n // Please read https://bugzil.la/737852#c6.\n // Here, we use textBaseline = 'middle' and draw the text at exactly\n // 0.5 * fontSize lower.\n ctx.textBaseline = 'middle';\n ctx.fillText(word, info.fillTextOffsetX * mu, (info.fillTextOffsetY + fontSize * 0.5) * mu);\n\n // The below box is always matches how <span>s are positioned\n /* ctx.strokeRect(info.fillTextOffsetX, info.fillTextOffsetY,\r\n info.fillTextWidth, info.fillTextHeight) */\n\n // Restore the state.\n ctx.restore();\n } else {\n // drawText on DIV element\n var span = document.createElement('span');\n var transformRule = '';\n transformRule = 'rotate(' + -rotateDeg / Math.PI * 180 + 'deg) ';\n if (info.mu !== 1) {\n transformRule += 'translateX(-' + info.fillTextWidth / 4 + 'px) ' + 'scale(' + 1 / info.mu + ')';\n }\n var styleRules = {\n position: 'absolute',\n display: 'block',\n font: fontWeight + ' ' + fontSize * info.mu + 'px ' + settings.fontFamily,\n left: (gx + info.gw / 2) * g + info.fillTextOffsetX + 'px',\n top: (gy + info.gh / 2) * g + info.fillTextOffsetY + 'px',\n width: info.fillTextWidth + 'px',\n height: info.fillTextHeight + 'px',\n lineHeight: fontSize + 'px',\n whiteSpace: 'nowrap',\n transform: transformRule,\n webkitTransform: transformRule,\n msTransform: transformRule,\n transformOrigin: '50% 40%',\n webkitTransformOrigin: '50% 40%',\n msTransformOrigin: '50% 40%'\n };\n if (color) {\n styleRules.color = color;\n }\n span.textContent = word;\n for (var cssProp in styleRules) {\n span.style[cssProp] = styleRules[cssProp];\n }\n if (attributes) {\n for (var attribute in attributes) {\n span.setAttribute(attribute, attributes[attribute]);\n }\n }\n if (classes) {\n span.className += classes;\n }\n el.appendChild(span);\n }\n });\n };\n\n /* Help function to updateGrid */\n var fillGridAt = function fillGridAt(x, y, drawMask, dimension, item) {\n if (x >= ngx || y >= ngy || x < 0 || y < 0) {\n return;\n }\n grid[x][y] = false;\n if (drawMask) {\n var ctx = elements[0].getContext('2d');\n ctx.fillRect(x * g, y * g, maskRectWidth, maskRectWidth);\n }\n if (interactive) {\n infoGrid[x][y] = {\n item: item,\n dimension: dimension\n };\n }\n };\n\n /* Update the filling information of the given space with occupied points.\r\n Draw the mask on the canvas if necessary. */\n var updateGrid = function updateGrid(gx, gy, gw, gh, info, item) {\n var occupied = info.occupied;\n var drawMask = settings.drawMask;\n var ctx;\n if (drawMask) {\n ctx = elements[0].getContext('2d');\n ctx.save();\n ctx.fillStyle = settings.maskColor;\n }\n var dimension;\n if (interactive) {\n var bounds = info.bounds;\n dimension = {\n x: (gx + bounds[3]) * g,\n y: (gy + bounds[0]) * g,\n w: (bounds[1] - bounds[3] + 1) * g,\n h: (bounds[2] - bounds[0] + 1) * g\n };\n }\n var i = occupied.length;\n while (i--) {\n var px = gx + occupied[i][0];\n var py = gy + occupied[i][1];\n if (px >= ngx || py >= ngy || px < 0 || py < 0) {\n continue;\n }\n fillGridAt(px, py, drawMask, dimension, item);\n }\n if (drawMask) {\n ctx.restore();\n }\n };\n\n /* putWord() processes each item on the list,\r\n calculate it's size and determine it's position, and actually\r\n put it on the canvas. */\n var putWord = function putWord(item) {\n var word, weight, attributes;\n if (Array.isArray(item)) {\n word = item[0];\n weight = item[1];\n } else {\n word = item.word;\n weight = item.weight;\n attributes = item.attributes;\n }\n var rotateDeg = getRotateDeg();\n\n // get info needed to put the text onto the canvas\n var info = getTextInfo(word, weight, rotateDeg);\n\n // not getting the info means we shouldn't be drawing this one.\n if (!info) {\n return false;\n }\n if (exceedTime()) {\n return false;\n }\n\n // If drawOutOfBound is set to false,\n // skip the loop if we have already know the bounding box of\n // word is larger than the canvas.\n if (!settings.drawOutOfBound && !settings.shrinkToFit) {\n var bounds = info.bounds;\n if (bounds[1] - bounds[3] + 1 > ngx || bounds[2] - bounds[0] + 1 > ngy) {\n return false;\n }\n }\n\n // Determine the position to put the text by\n // start looking for the nearest points\n var r = maxRadius + 1;\n var tryToPutWordAtPoint = function (gxy) {\n var gx = Math.floor(gxy[0] - info.gw / 2);\n var gy = Math.floor(gxy[1] - info.gh / 2);\n var gw = info.gw;\n var gh = info.gh;\n\n // If we cannot fit the text at this position, return false\n // and go to the next position.\n if (!canFitText(gx, gy, gw, gh, info.occupied)) {\n return false;\n }\n\n // Actually put the text on the canvas\n drawText(gx, gy, info, word, weight, maxRadius - r, gxy[2], rotateDeg, attributes);\n\n // Mark the spaces on the grid as filled\n updateGrid(gx, gy, gw, gh, info, item);\n\n // Return true so some() will stop and also return true.\n return true;\n };\n while (r--) {\n var points = getPointsAtRadius(maxRadius - r);\n if (settings.shuffle) {\n points = [].concat(points);\n shuffleArray(points);\n }\n\n // Try to fit the words by looking at each point.\n // array.some() will stop and return true\n // when putWordAtPoint() returns true.\n // If all the points returns false, array.some() returns false.\n var drawn = points.some(tryToPutWordAtPoint);\n if (drawn) {\n // leave putWord() and return true\n return true;\n }\n }\n if (settings.shrinkToFit) {\n if (Array.isArray(item)) {\n item[1] = item[1] * 3 / 4;\n } else {\n item.weight = item.weight * 3 / 4;\n }\n return putWord(item);\n }\n // we tried all distances but text won't fit, return false\n return false;\n };\n\n /* Send DOM event to all elements. Will stop sending event and return\r\n if the previous one is canceled (for cancelable events). */\n var sendEvent = function sendEvent(type, cancelable, details) {\n if (cancelable) {\n return !elements.some(function (el) {\n var event = new CustomEvent(type, {\n detail: details || {}\n });\n return !el.dispatchEvent(event);\n }, this);\n } else {\n elements.forEach(function (el) {\n var event = new CustomEvent(type, {\n detail: details || {}\n });\n el.dispatchEvent(event);\n }, this);\n }\n };\n\n /* Start drawing on a canvas */\n var start = function start() {\n // For dimensions, clearCanvas etc.,\n // we only care about the first element.\n var canvas = elements[0];\n if (canvas.getContext) {\n ngx = Math.ceil(canvas.width / g);\n ngy = Math.ceil(canvas.height / g);\n } else {\n var rect = canvas.getBoundingClientRect();\n ngx = Math.ceil(rect.width / g);\n ngy = Math.ceil(rect.height / g);\n }\n\n // Sending a wordcloudstart event which cause the previous loop to stop.\n // Do nothing if the event is canceled.\n if (!sendEvent('wordcloudstart', true)) {\n return;\n }\n\n // Determine the center of the word cloud\n center = settings.origin ? [settings.origin[0] / g, settings.origin[1] / g] : [ngx / 2, ngy / 2];\n\n // Maxium radius to look for space\n maxRadius = Math.floor(Math.sqrt(ngx * ngx + ngy * ngy));\n\n /* Clear the canvas only if the clearCanvas is set,\r\n if not, update the grid to the current canvas state */\n grid = [];\n var gx, gy, i;\n if (!canvas.getContext || settings.clearCanvas) {\n elements.forEach(function (el) {\n if (el.getContext) {\n var ctx = el.getContext('2d');\n ctx.fillStyle = settings.backgroundColor;\n ctx.clearRect(0, 0, ngx * (g + 1), ngy * (g + 1));\n ctx.fillRect(0, 0, ngx * (g + 1), ngy * (g + 1));\n } else {\n el.textContent = '';\n el.style.backgroundColor = settings.backgroundColor;\n el.style.position = 'relative';\n }\n });\n\n /* fill the grid with empty state */\n gx = ngx;\n while (gx--) {\n grid[gx] = [];\n gy = ngy;\n while (gy--) {\n grid[gx][gy] = true;\n }\n }\n } else {\n /* Determine bgPixel by creating\r\n another canvas and fill the specified background color. */\n var bctx = document.createElement('canvas').getContext('2d');\n bctx.fillStyle = settings.backgroundColor;\n bctx.fillRect(0, 0, 1, 1);\n var bgPixel = bctx.getImageData(0, 0, 1, 1).data;\n\n /* Read back the pixels of the canvas we got to tell which part of the\r\n canvas is empty.\r\n (no clearCanvas only works with a canvas, not divs) */\n var imageData = canvas.getContext('2d').getImageData(0, 0, ngx * g, ngy * g).data;\n gx = ngx;\n var x, y;\n while (gx--) {\n grid[gx] = [];\n gy = ngy;\n while (gy--) {\n y = g;\n /* eslint no-labels: [\"error\", { \"allowLoop\": true }] */\n singleGridLoop: while (y--) {\n x = g;\n while (x--) {\n i = 4;\n while (i--) {\n if (imageData[((gy * g + y) * ngx * g + (gx * g + x)) * 4 + i] !== bgPixel[i]) {\n grid[gx][gy] = false;\n break singleGridLoop;\n }\n }\n }\n }\n if (grid[gx][gy] !== false) {\n grid[gx][gy] = true;\n }\n }\n }\n imageData = bctx = bgPixel = undefined;\n }\n\n // fill the infoGrid with empty state if we need it\n if (settings.hover || settings.click) {\n interactive = true;\n\n /* fill the grid with empty state */\n gx = ngx + 1;\n while (gx--) {\n infoGrid[gx] = [];\n }\n if (settings.hover) {\n canvas.addEventListener('mousemove', wordcloudhover);\n }\n if (settings.click) {\n canvas.addEventListener('click', wordcloudclick);\n canvas.style.webkitTapHighlightColor = 'rgba(0, 0, 0, 0)';\n }\n canvas.addEventListener('wordcloudstart', function stopInteraction() {\n canvas.removeEventListener('wordcloudstart', stopInteraction);\n canvas.removeEventListener('mousemove', wordcloudhover);\n canvas.removeEventListener('click', wordcloudclick);\n hovered = undefined;\n });\n }\n i = 0;\n var loopingFunction, stoppingFunction;\n if (settings.wait !== 0) {\n loopingFunction = window.setTimeout;\n stoppingFunction = window.clearTimeout;\n } else {\n loopingFunction = window.setImmediate;\n stoppingFunction = window.clearImmediate;\n }\n var addEventListener = function addEventListener(type, listener) {\n elements.forEach(function (el) {\n el.addEventListener(type, listener);\n }, this);\n };\n var removeEventListener = function removeEventListener(type, listener) {\n elements.forEach(function (el) {\n el.removeEventListener(type, listener);\n }, this);\n };\n var anotherWordCloudStart = function anotherWordCloudStart() {\n removeEventListener('wordcloudstart', anotherWordCloudStart);\n stoppingFunction(timer);\n };\n addEventListener('wordcloudstart', anotherWordCloudStart);\n var timer = loopingFunction(function loop() {\n if (i >= settings.list.length) {\n stoppingFunction(timer);\n sendEvent('wordcloudstop', false);\n removeEventListener('wordcloudstart', anotherWordCloudStart);\n return;\n }\n escapeTime = new Date().getTime();\n var drawn = putWord(settings.list[i]);\n var canceled = !sendEvent('wordclouddrawn', true, {\n item: settings.list[i],\n drawn: drawn\n });\n if (exceedTime() || canceled) {\n stoppingFunction(timer);\n settings.abort();\n sendEvent('wordcloudabort', false);\n sendEvent('wordcloudstop', false);\n removeEventListener('wordcloudstart', anotherWordCloudStart);\n return;\n }\n i++;\n timer = loopingFunction(loop, settings.wait);\n }, settings.wait);\n };\n\n // All set, start the drawing\n start();\n };\n WordCloud.isSupported = isSupported;\n WordCloud.minFontSize = minFontSize;\n\n // Expose the library as an AMD module\n if (typeof define === 'function' && define.amd) {\n // eslint-disable-line no-undef\n global.WordCloud = WordCloud;\n define('wordcloud', [], function () {\n return WordCloud;\n }); // eslint-disable-line no-undef\n } else if (typeof module !== 'undefined' && module.exports) {\n // eslint-disable-line no-undef\n module.exports = WordCloud; // eslint-disable-line no-undef\n } else {\n global.WordCloud = WordCloud;\n }\n})(this); // jshint ignore:line","map":{"version":3,"names":["window","setImmediate","setupSetImmediate","msSetImmediate","webkitSetImmediate","mozSetImmediate","oSetImmediate","setupSetZeroTimeout","postMessage","addEventListener","callbacks","undefined","message","setZeroTimeout","callback","id","length","push","toString","setZeroTimeoutMessage","evt","data","substr","stopImmediatePropagation","parseInt","clearImmediate","clearZeroTimeout","setImmediateFallback","fn","setTimeout","setupClearImmediate","msClearImmediate","webkitClearImmediate","mozClearImmediate","oClearImmediate","clearImmediateFallback","timer","clearTimeout","global","isSupported","canvas","document","createElement","getContext","ctx","getImageData","fillText","Array","prototype","some","minFontSize","getMinFontSize","size","hanWidth","mWidth","font","measureText","width","shuffleArray","arr","j","x","i","Math","floor","random","WordCloud","elements","options","isArray","forEach","el","getElementById","Error","tagName","appendChild","settings","list","fontFamily","fontWeight","color","minSize","weightFactor","clearCanvas","backgroundColor","gridSize","drawOutOfBound","shrinkToFit","origin","drawMask","maskColor","maskGapWidth","wait","abortThreshold","abort","noop","minRotation","PI","maxRotation","rotationSteps","shuffle","rotateRatio","shape","ellipticity","classes","hover","click","key","factor","pt","shapeCardioid","theta","sin","shapeSquare","thetaPrime","cos","min","abs","shapeTriangle","sqrt","shapePentagon","shapeStar","max","g","maskRectWidth","rotationRange","grid","ngx","ngy","center","maxRadius","escapeTime","getTextColor","randomHslColor","toFixed","getRandomDarkColor","getRandomLightColor","getTextFontWeight","getTextClasses","interactive","infoGrid","hovered","getInfoGridFromMouseTouchEvent","currentTarget","rect","getBoundingClientRect","clientX","clientY","touches","eventX","left","eventY","top","y","height","wordcloudhover","info","item","dimension","wordcloudclick","preventDefault","pointsAtRadius","getPointsAtRadius","radius","T","t","points","rx","exceedTime","Date","getTime","getRotateDeg","getTextInfo","word","weight","rotateDeg","debug","fontSize","mu","calculateScaleFactor","fcanvas","fctx","willReadFrequently","fw","fh","boxWidth","boxHeight","fgw","ceil","fgh","fillTextOffsetX","fillTextOffsetY","cgh","cgw","setAttribute","body","save","scale","translate","rotate","fillStyle","textBaseline","imageData","strokeRect","restore","occupied","gx","gy","bounds","singleGridLoop","fillRect","gw","gh","fillTextWidth","fillTextHeight","canFitText","px","py","drawText","distance","attributes","span","transformRule","styleRules","position","display","lineHeight","whiteSpace","transform","webkitTransform","msTransform","transformOrigin","webkitTransformOrigin","msTransformOrigin","textContent","cssProp","style","attribute","className","fillGridAt","updateGrid","w","h","putWord","r","tryToPutWordAtPoint","gxy","concat","drawn","sendEvent","type","cancelable","details","event","CustomEvent","detail","dispatchEvent","start","clearRect","bctx","bgPixel","webkitTapHighlightColor","stopInteraction","removeEventListener","loopingFunction","stoppingFunction","listener","anotherWordCloudStart","loop","canceled","define","amd","module","exports"],"sources":["C:/Users/eudes.inacio/GabineteDigital/gabinete-digital-fo/src/plugin/wordcloud2.js"],"sourcesContent":["/*!\r\n * wordcloud2.js\r\n * http://timdream.org/wordcloud2.js/\r\n *\r\n * Copyright 2011 - 2019 Tim Guan-tin Chien and contributors.\r\n * Released under the MIT license\r\n */\r\n\r\n'use strict'\r\n\r\n// setImmediate\r\nif (!window.setImmediate) {\r\n window.setImmediate = (function setupSetImmediate () {\r\n return window.msSetImmediate ||\r\n window.webkitSetImmediate ||\r\n window.mozSetImmediate ||\r\n window.oSetImmediate ||\r\n (function setupSetZeroTimeout () {\r\n if (!window.postMessage || !window.addEventListener) {\r\n return null\r\n }\r\n\r\n var callbacks = [undefined]\r\n var message = 'zero-timeout-message'\r\n\r\n // Like setTimeout, but only takes a function argument. There's\r\n // no time argument (always zero) and no arguments (you have to\r\n // use a closure).\r\n var setZeroTimeout = function setZeroTimeout (callback) {\r\n var id = callbacks.length\r\n callbacks.push(callback)\r\n window.postMessage(message + id.toString(36), '*')\r\n\r\n return id\r\n }\r\n\r\n window.addEventListener('message', function setZeroTimeoutMessage (evt) {\r\n // Skipping checking event source, retarded IE confused this window\r\n // object with another in the presence of iframe\r\n if (typeof evt.data !== 'string' ||\r\n evt.data.substr(0, message.length) !== message/* ||\r\n evt.source !== window */) {\r\n return\r\n }\r\n\r\n evt.stopImmediatePropagation()\r\n\r\n var id = parseInt(evt.data.substr(message.length), 36)\r\n if (!callbacks[id]) {\r\n return\r\n }\r\n\r\n callbacks[id]()\r\n callbacks[id] = undefined\r\n }, true)\r\n\r\n /* specify clearImmediate() here since we need the scope */\r\n window.clearImmediate = function clearZeroTimeout (id) {\r\n if (!callbacks[id]) {\r\n return\r\n }\r\n\r\n callbacks[id] = undefined\r\n }\r\n\r\n return setZeroTimeout\r\n })() ||\r\n // fallback\r\n function setImmediateFallback (fn) {\r\n window.setTimeout(fn, 0)\r\n }\r\n })()\r\n}\r\n\r\nif (!window.clearImmediate) {\r\n window.clearImmediate = (function setupClearImmediate () {\r\n return window.msClearImmediate ||\r\n window.webkitClearImmediate ||\r\n window.mozClearImmediate ||\r\n window.oClearImmediate ||\r\n // \"clearZeroTimeout\" is implement on the previous block ||\r\n // fallback\r\n function clearImmediateFallback (timer) {\r\n window.clearTimeout(timer)\r\n }\r\n })()\r\n}\r\n\r\n(function (global) {\r\n // Check if WordCloud can run on this browser\r\n var isSupported = (function isSupported () {\r\n var canvas = document.createElement('canvas')\r\n if (!canvas || !canvas.getContext) {\r\n return false\r\n }\r\n\r\n var ctx = canvas.getContext('2d')\r\n if (!ctx) {\r\n return false\r\n }\r\n if (!ctx.getImageData) {\r\n return false\r\n }\r\n if (!ctx.fillText) {\r\n return false\r\n }\r\n\r\n if (!Array.prototype.some) {\r\n return false\r\n }\r\n if (!Array.prototype.push) {\r\n return false\r\n }\r\n\r\n return true\r\n }())\r\n\r\n // Find out if the browser impose minium font size by\r\n // drawing small texts on a canvas and measure it's width.\r\n var minFontSize = (function getMinFontSize () {\r\n if (!isSupported) {\r\n return\r\n }\r\n\r\n var ctx = document.createElement('canvas').getContext('2d')\r\n\r\n // start from 20\r\n var size = 20\r\n\r\n // two sizes to measure\r\n var hanWidth, mWidth\r\n\r\n while (size) {\r\n ctx.font = size.toString(10) + 'px sans-serif'\r\n if ((ctx.measureText('\\uFF37').width === hanWidth) &&\r\n (ctx.measureText('m').width) === mWidth) {\r\n return (size + 1)\r\n }\r\n\r\n hanWidth = ctx.measureText('\\uFF37').width\r\n mWidth = ctx.measureText('m').width\r\n\r\n size--\r\n }\r\n\r\n return 0\r\n })()\r\n\r\n // Based on http://jsfromhell.com/array/shuffle\r\n var shuffleArray = function shuffleArray (arr) {\r\n for (var j, x, i = arr.length; i;) {\r\n j = Math.floor(Math.random() * i)\r\n x = arr[--i]\r\n arr[i] = arr[j]\r\n arr[j] = x\r\n }\r\n return arr\r\n }\r\n\r\n var WordCloud = function WordCloud (elements, options) {\r\n if (!isSupported) {\r\n return\r\n }\r\n\r\n if (!Array.isArray(elements)) {\r\n elements = [elements]\r\n }\r\n\r\n elements.forEach(function (el, i) {\r\n if (typeof el === 'string') {\r\n elements[i] = document.getElementById(el)\r\n if (!elements[i]) {\r\n throw new Error('The element id specified is not found.')\r\n }\r\n } else if (!el.tagName && !el.appendChild) {\r\n throw new Error('You must pass valid HTML elements, or ID of the element.')\r\n }\r\n })\r\n\r\n /* Default values to be overwritten by options object */\r\n var settings = {\r\n list: [],\r\n fontFamily: '\"Trebuchet MS\", \"Heiti TC\", \"微軟正黑體\", ' +\r\n '\"Arial Unicode MS\", \"Droid Fallback Sans\", sans-serif',\r\n fontWeight: 'normal',\r\n color: 'random-dark',\r\n minSize: 0, // 0 to disable\r\n weightFactor: 1,\r\n clearCanvas: true,\r\n backgroundColor: '#fff', // opaque white = rgba(255, 255, 255, 1)\r\n\r\n gridSize: 8,\r\n drawOutOfBound: false,\r\n shrinkToFit: false,\r\n origin: null,\r\n\r\n drawMask: false,\r\n maskColor: 'rgba(255,0,0,0.3)',\r\n maskGapWidth: 0.3,\r\n\r\n wait: 0,\r\n abortThreshold: 0, // disabled\r\n abort: function noop () {},\r\n\r\n minRotation: -Math.PI / 2,\r\n maxRotation: Math.PI / 2,\r\n rotationSteps: 0,\r\n\r\n shuffle: true,\r\n rotateRatio: 0.1,\r\n\r\n shape: 'circle',\r\n ellipticity: 0.65,\r\n\r\n classes: null,\r\n\r\n hover: null,\r\n click: null\r\n }\r\n\r\n if (options) {\r\n for (var key in options) {\r\n if (key in settings) {\r\n settings[key] = options[key]\r\n }\r\n }\r\n }\r\n\r\n /* Convert weightFactor into a function */\r\n if (typeof settings.weightFactor !== 'function') {\r\n var factor = settings.weightFactor\r\n settings.weightFactor = function weightFactor (pt) {\r\n return pt * factor // in px\r\n }\r\n }\r\n\r\n /* Convert shape into a function */\r\n if (typeof settings.shape !== 'function') {\r\n switch (settings.shape) {\r\n case 'circle':\r\n /* falls through */\r\n default:\r\n // 'circle' is the default and a shortcut in the code loop.\r\n settings.shape = 'circle'\r\n break\r\n\r\n case 'cardioid':\r\n settings.shape = function shapeCardioid (theta) {\r\n return 1 - Math.sin(theta)\r\n }\r\n break\r\n\r\n /*\r\n To work out an X-gon, one has to calculate \"m\",\r\n where 1/(cos(2*PI/X)+m*sin(2*PI/X)) = 1/(cos(0)+m*sin(0))\r\n http://www.wolframalpha.com/input/?i=1%2F%28cos%282*PI%2FX%29%2Bm*sin%28\r\n 2*PI%2FX%29%29+%3D+1%2F%28cos%280%29%2Bm*sin%280%29%29\r\n Copy the solution into polar equation r = 1/(cos(t') + m*sin(t'))\r\n where t' equals to mod(t, 2PI/X)\r\n */\r\n\r\n case 'diamond':\r\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\r\n // %28t%2C+PI%2F2%29%29%2Bsin%28mod+%28t%2C+PI%2F2%29%29%29%2C+t+%3D\r\n // +0+..+2*PI\r\n settings.shape = function shapeSquare (theta) {\r\n var thetaPrime = theta % (2 * Math.PI / 4)\r\n return 1 / (Math.cos(thetaPrime) + Math.sin(thetaPrime))\r\n }\r\n break\r\n\r\n case 'square':\r\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+min(1%2Fabs(cos(t\r\n // )),1%2Fabs(sin(t)))),+t+%3D+0+..+2*PI\r\n settings.shape = function shapeSquare (theta) {\r\n return Math.min(\r\n 1 / Math.abs(Math.cos(theta)),\r\n 1 / Math.abs(Math.sin(theta))\r\n )\r\n }\r\n break\r\n\r\n case 'triangle-forward':\r\n // http://www.wolframalpha.com/input/?i=plot+r+%3D+1%2F%28cos%28mod+\r\n // %28t%2C+2*PI%2F3%29%29%2Bsqrt%283%29sin%28mod+%28t%2C+2*PI%2F3%29\r\n // %29%29%2C+t+%3D+0+..+2*PI\r\n settings.shape = function shapeTriangle (theta) {\r\n var thetaPrime = theta % (2 * Math.PI / 3)\r\n return 1 / (Math.cos(thetaPrime) +\r\n Math.sqrt(3) * Math.sin(thetaPrime))\r\n }\r\n break\r\n\r\n case 'triangle':\r\n case 'triangle-upright':\r\n settings.shape = function shapeTriangle (theta) {\r\n var thetaPrime = (theta + Math.PI * 3 / 2) % (2 * Math.PI / 3)\r\n return 1 / (Math.cos(thetaPrime) +\r\n Math.sqrt(3) * Math.sin(thetaPrime))\r\n }\r\n break\r\n\r\n case 'pentagon':\r\n settings.shape = function shapePentagon (theta) {\r\n var thetaPrime = (theta + 0.955) % (2 * Math.PI / 5)\r\n return 1 / (Math.cos(thetaPrime) +\r\n 0.726543 * Math.sin(thetaPrime))\r\n }\r\n break\r\n\r\n case 'star':\r\n settings.shape = function shapeStar (theta) {\r\n var thetaPrime = (theta + 0.955) % (2 * Math.PI / 10)\r\n if ((theta + 0.955) % (2 * Math.PI / 5) - (2 * Math.PI / 10) >= 0) {\r\n return 1 / (Math.cos((2 * Math.PI / 10) - thetaPrime) +\r\n 3.07768 * Math.sin((2 * Math.PI / 10) - thetaPrime))\r\n } else {\r\n return 1 / (Math.cos(thetaPrime) +\r\n 3.07768 * Math.sin(thetaPrime))\r\n }\r\n }\r\n break\r\n }\r\n }\r\n\r\n /* Make sure gridSize is a whole number and is not smaller than 4px */\r\n settings.gridSize = Math.max(Math.floor(settings.gridSize), 4)\r\n\r\n /* shorthand */\r\n var g = settings.gridSize\r\n var maskRectWidth = g - settings.maskGapWidth\r\n\r\n /* normalize rotation settings */\r\n var rotationRange = Math.abs(settings.maxRotation - settings.minRotation)\r\n var rotationSteps = Math.abs(Math.floor(settings.rotationSteps))\r\n var minRotation = Math.min(settings.maxRotation, settings.minRotation)\r\n\r\n /* information/object available to all functions, set when start() */\r\n var grid, // 2d array containing filling information\r\n ngx, ngy, // width and height of the grid\r\n center, // position of the center of the cloud\r\n maxRadius\r\n\r\n /* timestamp for measuring each putWord() action */\r\n var escapeTime\r\n\r\n /* function for getting the color of the text */\r\n var getTextColor\r\n function randomHslColor (min, max) {\r\n return 'hsl(' +\r\n (Math.random() * 360).toFixed() + ',' +\r\n (Math.random() * 30 + 70).toFixed() + '%,' +\r\n (Math.random() * (max - min) + min).toFixed() + '%)'\r\n }\r\n switch (settings.color) {\r\n case 'random-dark':\r\n getTextColor = function getRandomDarkColor () {\r\n return randomHslColor(10, 50)\r\n }\r\n break\r\n\r\n case 'random-light':\r\n getTextColor = function getRandomLightColor () {\r\n return randomHslColor(50, 90)\r\n }\r\n break\r\n\r\n default:\r\n if (typeof settings.color === 'function') {\r\n getTextColor = settings.color\r\n }\r\n break\r\n }\r\n\r\n /* function for getting the font-weight of the text */\r\n var getTextFontWeight\r\n if (typeof settings.fontWeight === 'function') {\r\n getTextFontWeight = settings.fontWeight\r\n }\r\n\r\n /* function for getting the classes of the text */\r\n var getTextClasses = null\r\n if (typeof settings.classes === 'function') {\r\n getTextClasses = settings.classes\r\n }\r\n\r\n /* Interactive */\r\n var interactive = false\r\n var infoGrid = []\r\n var hovered\r\n\r\n var getInfoGridFromMouseTouchEvent =\r\n function getInfoGridFromMouseTouchEvent (evt) {\r\n var canvas = evt.currentTarget\r\n var rect = canvas.getBoundingClientRect()\r\n var clientX\r\n var clientY\r\n /** Detect if touches are available */\r\n if (evt.touches) {\r\n clientX = evt.touches[0].clientX\r\n clientY = evt.touches[0].clientY\r\n } else {\r\n clientX = evt.clientX\r\n clientY = evt.clientY\r\n }\r\n var eventX = clientX - rect.left\r\n var eventY = clientY - rect.top\r\n\r\n var x = Math.floor(eventX * ((canvas.width / rect.width) || 1) / g)\r\n var y = Math.floor(eventY * ((canvas.height / rect.height) || 1) / g)\r\n\r\n return infoGrid[x][y]\r\n }\r\n\r\n var wordcloudhover = function wordcloudhover (evt) {\r\n var info = getInfoGridFromMouseTouchEvent(evt)\r\n\r\n if (hovered === info) {\r\n return\r\n }\r\n\r\n hovered = info\r\n if (!info) {\r\n settings.hover(undefined, undefined, evt)\r\n\r\n return\r\n }\r\n\r\n settings.hover(info.item, info.dimension, evt)\r\n }\r\n\r\n var wordcloudclick = function wordcloudclick (evt) {\r\n var info = getInfoGridFromMouseTouchEvent(evt)\r\n if (!info) {\r\n return\r\n }\r\n\r\n settings.click(info.item, info.dimension, evt)\r\n evt.preventDefault()\r\n }\r\n\r\n /* Get points on the grid for a given radius away from the center */\r\n var pointsAtRadius = []\r\n var getPointsAtRadius = function getPointsAtRadius (radius) {\r\n if (pointsAtRadius[radius]) {\r\n return pointsAtRadius[radius]\r\n }\r\n\r\n // Look for these number of points on each radius\r\n var T = radius * 8\r\n\r\n // Getting all the points at this radius\r\n var t = T\r\n var points = []\r\n\r\n if (radius === 0) {\r\n points.push([center[0], center[1], 0])\r\n }\r\n\r\n while (t--) {\r\n // distort the radius to put the cloud in shape\r\n var rx = 1\r\n if (settings.shape !== 'circle') {\r\n rx = settings.shape(t / T * 2 * Math.PI) // 0 to 1\r\n }\r\n\r\n // Push [x, y, t] t is used solely for getTextColor()\r\n points.push([\r\n center[0] + radius * rx * Math.cos(-t / T * 2 * Math.PI),\r\n center[1] + radius * rx * Math.sin(-t / T * 2 * Math.PI) *\r\n settings.ellipticity,\r\n t / T * 2 * Math.PI])\r\n }\r\n\r\n pointsAtRadius[radius] = points\r\n return points\r\n }\r\n\r\n /* Return true if we had spent too much time */\r\n var exceedTime = function exceedTime () {\r\n return ((settings.abortThreshold > 0) &&\r\n ((new Date()).getTime() - escapeTime > settings.abortThreshold))\r\n }\r\n\r\n /* Get the deg of rotation according to settings, and luck. */\r\n var getRotateDeg = function getRotateDeg () {\r\n if (settings.rotateRatio === 0) {\r\n return 0\r\n }\r\n\r\n if (Math.random() > settings.rotateRatio) {\r\n return 0\r\n }\r\n\r\n if (rotationRange === 0) {\r\n return minRotation\r\n }\r\n\r\n if (rotationSteps > 0) {\r\n // Min rotation + zero or more steps * span of one step\r\n return minRotation +\r\n Math.floor(Math.random() * rotationSteps) *\r\n rotationRange / (rotationSteps - 1)\r\n } else {\r\n return minRotation + Math.random() * rotationRange\r\n }\r\n }\r\n\r\n var getTextInfo = function getTextInfo (word, weight, rotateDeg) {\r\n // calculate the acutal font size\r\n // fontSize === 0 means weightFactor function wants the text skipped,\r\n // and size < minSize means we cannot draw the text.\r\n var debug = false\r\n var fontSize = settings.weightFactor(weight)\r\n if (fontSize <= settings.minSize) {\r\n return false\r\n }\r\n\r\n // Scale factor here is to make sure fillText is not limited by\r\n // the minium font size set by browser.\r\n // It will always be 1 or 2n.\r\n var mu = 1\r\n if (fontSize < minFontSize) {\r\n mu = (function calculateScaleFactor () {\r\n var mu = 2\r\n while (mu * fontSize < minFontSize) {\r\n mu += 2\r\n }\r\n return mu\r\n })()\r\n }\r\n\r\n // Get fontWeight that will be used to set fctx.font\r\n var fontWeight\r\n if (getTextFontWeight) {\r\n fontWeight = getTextFontWeight(word, weight, fontSize)\r\n } else {\r\n fontWeight = settings.fontWeight\r\n }\r\n\r\n var fcanvas = document.createElement('canvas')\r\n var fctx = fcanvas.getContext('2d', { willReadFrequently: true })\r\n\r\n fctx.font = fontWeight + ' ' +\r\n (fontSize * mu).toString(10) + 'px ' + settings.fontFamily\r\n\r\n // Estimate the dimension of the text with measureText().\r\n var fw = fctx.measureText(word).width / mu\r\n var fh = Math.max(fontSize * mu,\r\n fctx.measureText('m').width,\r\n fctx.measureText('\\uFF37').width\r\n ) / mu\r\n\r\n // Create a boundary box that is larger than our estimates,\r\n // so text don't get cut of (it sill might)\r\n var boxWidth = fw + fh * 2\r\n var boxHeight = fh * 3\r\n var fgw = Math.ceil(boxWidth / g)\r\n var fgh = Math.ceil(boxHeight / g)\r\n boxWidth = fgw * g\r\n boxHeight = fgh * g\r\n\r\n // Calculate the proper offsets to make the text centered at\r\n // the preferred position.\r\n\r\n // This is simply half of the width.\r\n var fillTextOffsetX = -fw / 2\r\n // Instead of moving the box to the exact middle of the preferred\r\n // position, for Y-offset we move 0.4 instead, so Latin alphabets look\r\n // vertical centered.\r\n var fillTextOffsetY = -fh * 0.4\r\n\r\n // Calculate the actual dimension of the canvas, considering the rotation.\r\n var cgh = Math.ceil((boxWidth * Math.abs(Math.sin(rotateDeg)) +\r\n boxHeight * Math.abs(Math.cos(rotateDeg))) / g)\r\n var cgw = Math.ceil((boxWidth * Math.abs(Math.cos(rotateDeg)) +\r\n boxHeight * Math.abs(Math.sin(rotateDeg))) / g)\r\n var width = cgw * g\r\n var height = cgh * g\r\n\r\n fcanvas.setAttribute('width', width)\r\n fcanvas.setAttribute('height', height)\r\n\r\n if (debug) {\r\n // Attach fcanvas to the DOM\r\n document.body.appendChild(fcanvas)\r\n // Save it's state so that we could restore and draw the grid correctly.\r\n fctx.save()\r\n }\r\n\r\n // Scale the canvas with |mu|.\r\n fctx.scale(1 / mu, 1 / mu)\r\n fctx.translate(width * mu / 2, height * mu / 2)\r\n fctx.rotate(-rotateDeg)\r\n\r\n // Once the width/height is set, ctx info will be reset.\r\n // Set it again here.\r\n fctx.font = fontWeight + ' ' +\r\n (fontSize * mu).toString(10) + 'px ' + settings.fontFamily\r\n\r\n // Fill the text into the fcanvas.\r\n // XXX: We cannot because textBaseline = 'top' here because\r\n // Firefox and Chrome uses different default line-height for canvas.\r\n // Please read https://bugzil.la/737852#c6.\r\n // Here, we use textBaseline = 'middle' and draw the text at exactly\r\n // 0.5 * fontSize lower.\r\n fctx.fillStyle = '#000'\r\n fctx.textBaseline = 'middle'\r\n fctx.fillText(\r\n word, fillTextOffsetX * mu,\r\n (fillTextOffsetY + fontSize * 0.5) * mu\r\n )\r\n\r\n // Get the pixels of the text\r\n var imageData = fctx.getImageData(0, 0, width, height).data\r\n\r\n if (exceedTime()) {\r\n return false\r\n }\r\n\r\n if (debug) {\r\n // Draw the box of the original estimation\r\n fctx.strokeRect(\r\n fillTextOffsetX * mu,\r\n fillTextOffsetY, fw * mu, fh * mu\r\n )\r\n fctx.restore()\r\n }\r\n\r\n // Read the pixels and save the information to the occupied array\r\n var occupied = []\r\n var gx = cgw\r\n var gy, x, y\r\n var bounds = [cgh / 2, cgw / 2, cgh / 2, cgw / 2]\r\n while (gx--) {\r\n gy = cgh\r\n while (gy--) {\r\n y = g\r\n /* eslint no-labels: [\"error\", { \"allowLoop\": true }] */\r\n singleGridLoop: while (y--) {\r\n x = g\r\n while (x--) {\r\n if (imageData[((gy * g + y) * width +\r\n (gx * g + x)) * 4 + 3]) {\r\n occupied.push([gx, gy])\r\n\r\n if (gx < bounds[3]) {\r\n bounds[3] = gx\r\n }\r\n if (gx > bounds[1]) {\r\n bounds[1] = gx\r\n }\r\n if (gy < bounds[0]) {\r\n bounds[0] = gy\r\n }\r\n if (gy > bounds[2]) {\r\n bounds[2] = gy\r\n }\r\n\r\n if (debug) {\r\n fctx.fillStyle = 'rgba(255, 0, 0, 0.5)'\r\n fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5)\r\n }\r\n break singleGridLoop\r\n }\r\n }\r\n }\r\n if (debug) {\r\n fctx.fillStyle = 'rgba(0, 0, 255, 0.5)'\r\n fctx.fillRect(gx * g, gy * g, g - 0.5, g - 0.5)\r\n }\r\n }\r\n }\r\n\r\n if (debug) {\r\n fctx.fillStyle = 'rgba(0, 255, 0, 0.5)'\r\n fctx.fillRect(\r\n bounds[3] * g,\r\n bounds[0] * g,\r\n (bounds[1] - bounds[3] + 1) * g,\r\n (bounds[2] - bounds[0] + 1) * g\r\n )\r\n }\r\n\r\n // Return information needed to create the text on the real canvas\r\n return {\r\n mu: mu,\r\n occupied: occupied,\r\n bounds: bounds,\r\n gw: cgw,\r\n gh: cgh,\r\n fillTextOffsetX: fillTextOffsetX,\r\n fillTextOffsetY: fillTextOffsetY,\r\n fillTextWidth: fw,\r\n fillTextHeight: fh,\r\n fontSize: fontSize\r\n }\r\n }\r\n\r\n /* Determine if there is room available in the given dimension */\r\n var canFitText = function canFitText (gx, gy, gw, gh, occupied) {\r\n // Go through the occupied points,\r\n // return false if the space is not available.\r\n var i = occupied.length\r\n while (i--) {\r\n var px = gx + occupied[i][0]\r\n var py = gy + occupied[i][1]\r\n\r\n if (px >= ngx || py >= ngy || px < 0 || py < 0) {\r\n if (!settings.drawOutOfBound) {\r\n return false\r\n }\r\n continue\r\n }\r\n\r\n if (!grid[px][py]) {\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n /* Actually draw the text on the grid */\r\n var drawText = function drawText (gx, gy, info, word, weight, distance, theta, rotateDeg, attributes) {\r\n var fontSize = info.fontSize\r\n var color\r\n if (getTextColor) {\r\n color = getTextColor(word, weight, fontSize, distance, theta)\r\n } else {\r\n color = settings.color\r\n }\r\n\r\n // get fontWeight that will be used to set ctx.font and font style rule\r\n var fontWeight\r\n if (getTextFontWeight) {\r\n fontWeight = getTextFontWeight(word, weight, fontSize)\r\n } else {\r\n fontWeight = settings.fontWeight\r\n }\r\n\r\n var classes\r\n if (getTextClasses) {\r\n classes = getTextClasses(word, weight, fontSize)\r\n } else {\r\n classes = settings.classes\r\n }\r\n\r\n elements.forEach(function (el) {\r\n if (el.getContext) {\r\n var ctx = el.getContext('2d')\r\n var mu = info.mu\r\n\r\n // Save the current state before messing it\r\n ctx.save()\r\n ctx.scale(1 / mu, 1 / mu)\r\n\r\n ctx.font = fontWeight + ' ' +\r\n (fontSize * mu).toString(10) + 'px ' + settings.fontFamily\r\n ctx.fillStyle = color\r\n\r\n // Translate the canvas position to the origin coordinate of where\r\n // the text should be put.\r\n ctx.translate(\r\n (gx + info.gw / 2) * g * mu,\r\n (gy + info.gh / 2) * g * mu\r\n )\r\n\r\n if (rotateDeg !== 0) {\r\n ctx.rotate(-rotateDeg)\r\n }\r\n\r\n // Finally, fill the text.\r\n\r\n // XXX: We cannot because textBaseline = 'top' here because\r\n // Firefox and Chrome uses different default line-height for canvas.\r\n // Please read https://bugzil.la/737852#c6.\r\n // Here, we use textBaseline = 'middle' and draw the text at exactly\r\n // 0.5 * fontSize lower.\r\n ctx.textBaseline = 'middle'\r\n ctx.fillText(\r\n word, info.fillTextOffsetX * mu,\r\n (info.fillTextOffsetY + fontSize * 0.5) * mu\r\n )\r\n\r\n // The below box is always matches how <span>s are positioned\r\n /* ctx.strokeRect(info.fillTextOffsetX, info.fillTextOffsetY,\r\n info.fillTextWidth, info.fillTextHeight) */\r\n\r\n // Restore the state.\r\n ctx.restore()\r\n } else {\r\n // drawText on DIV element\r\n var span = document.createElement('span')\r\n var transformRule = ''\r\n transformRule = 'rotate(' + (-rotateDeg / Math.PI * 180) + 'deg) '\r\n if (info.mu !== 1) {\r\n transformRule +=\r\n 'translateX(-' + (info.fillTextWidth / 4) + 'px) ' +\r\n 'scale(' + (1 / info.mu) + ')'\r\n }\r\n var styleRules = {\r\n position: 'absolute',\r\n display: 'block',\r\n font: fontWeight + ' ' +\r\n (fontSize * info.mu) + 'px ' + settings.fontFamily,\r\n left: ((gx + info.gw / 2) * g + info.fillTextOffsetX) + 'px',\r\n top: ((gy + info.gh / 2) * g + info.fillTextOffsetY) + 'px',\r\n width: info.fillTextWidth + 'px',\r\n height: info.fillTextHeight + 'px',\r\n lineHeight: fontSize + 'px',\r\n whiteSpace: 'nowrap',\r\n transform: transformRule,\r\n webkitTransform: transformRule,\r\n msTransform: transformRule,\r\n transformOrigin: '50% 40%',\r\n webkitTransformOrigin: '50% 40%',\r\n msTransformOrigin: '50% 40%'\r\n }\r\n if (color) {\r\n styleRules.color = color\r\n }\r\n span.textContent = word\r\n for (var cssProp in styleRules) {\r\n span.style[cssProp] = styleRules[cssProp]\r\n }\r\n if (attributes) {\r\n for (var attribute in attributes) {\r\n span.setAttribute(attribute, attributes[attribute])\r\n }\r\n }\r\n if (classes) {\r\n span.className += classes\r\n }\r\n el.appendChild(span)\r\n }\r\n })\r\n }\r\n\r\n /* Help function to updateGrid */\r\n var fillGridAt = function fillGridAt (x, y, drawMask, dimension, item) {\r\n if (x >= ngx || y >= ngy || x < 0 || y < 0) {\r\n return\r\n }\r\n\r\n grid[x][y] = false\r\n\r\n if (drawMask) {\r\n var ctx = elements[0].getContext('2d')\r\n ctx.fillRect(x * g, y * g, maskRectWidth, maskRectWidth)\r\n }\r\n\r\n if (interactive) {\r\n infoGrid[x][y] = { item: item, dimension: dimension }\r\n }\r\n }\r\n\r\n /* Update the filling information of the given space with occupied points.\r\n Draw the mask on the canvas if necessary. */\r\n var updateGrid = function updateGrid (gx, gy, gw, gh, info, item) {\r\n var occupied = info.occupied\r\n var drawMask = settings.drawMask\r\n var ctx\r\n if (drawMask) {\r\n ctx = elements[0].getContext('2d')\r\n ctx.save()\r\n ctx.fillStyle = settings.maskColor\r\n }\r\n\r\n var dimension\r\n if (interactive) {\r\n var bounds = info.bounds\r\n dimension = {\r\n x: (gx + bounds[3]) * g,\r\n y: (gy + bounds[0]) * g,\r\n w: (bounds[1] - bounds[3] + 1) * g,\r\n h: (bounds[2] - bounds[0] + 1) * g\r\n }\r\n }\r\n\r\n var i = occupied.length\r\n while (i--) {\r\n var px = gx + occupied[i][0]\r\n var py = gy + occupied[i][1]\r\n\r\n if (px >= ngx || py >= ngy || px < 0 || py < 0) {\r\n continue\r\n }\r\n\r\n fillGridAt(px, py, drawMask, dimension, item)\r\n }\r\n\r\n if (drawMask) {\r\n ctx.restore()\r\n }\r\n }\r\n\r\n /* putWord() processes each item on the list,\r\n calculate it's size and determine it's position, and actually\r\n put it on the canvas. */\r\n var putWord = function putWord (item) {\r\n var word, weight, attributes\r\n if (Array.isArray(item)) {\r\n word = item[0]\r\n weight = item[1]\r\n } else {\r\n word = item.word\r\n weight = item.weight\r\n attributes = item.attributes\r\n }\r\n var rotateDeg = getRotateDeg()\r\n\r\n // get info needed to put the text onto the canvas\r\n var info = getTextInfo(word, weight, rotateDeg)\r\n\r\n // not getting the info means we shouldn't be drawing this one.\r\n if (!info) {\r\n return false\r\n }\r\n\r\n if (exceedTime()) {\r\n return false\r\n }\r\n\r\n // If drawOutOfBound is set to false,\r\n // skip the loop if we have already know the bounding box of\r\n // word is larger than the canvas.\r\n if (!settings.drawOutOfBound && !settings.shrinkToFit) {\r\n var bounds = info.bounds;\r\n if ((bounds[1] - bounds[3] + 1) > ngx ||\r\n (bounds[2] - bounds[0] + 1) > ngy) {\r\n return false\r\n }\r\n }\r\n\r\n // Determine the position to put the text by\r\n // start looking for the nearest points\r\n var r = maxRadius + 1\r\n\r\n var tryToPutWordAtPoint = function (gxy) {\r\n var gx = Math.floor(gxy[0] - info.gw / 2)\r\n var gy = Math.floor(gxy[1] - info.gh / 2)\r\n var gw = info.gw\r\n var gh = info.gh\r\n\r\n // If we cannot fit the text at this position, return false\r\n // and go to the next position.\r\n if (!canFitText(gx, gy, gw, gh, info.occupied)) {\r\n return false\r\n }\r\n\r\n // Actually put the text on the canvas\r\n drawText(gx, gy, info, word, weight,\r\n (maxRadius - r), gxy[2], rotateDeg, attributes)\r\n\r\n // Mark the spaces on the grid as filled\r\n updateGrid(gx, gy, gw, gh, info, item)\r\n\r\n // Return true so some() will stop and also return true.\r\n return true\r\n }\r\n\r\n while (r--) {\r\n var points = getPointsAtRadius(maxRadius - r)\r\n\r\n if (settings.shuffle) {\r\n points = [].concat(points)\r\n shuffleArray(points)\r\n }\r\n\r\n // Try to fit the words by looking at each point.\r\n // array.some() will stop and return true\r\n // when putWordAtPoint() returns true.\r\n // If all the points returns false, array.some() returns false.\r\n var drawn = points.some(tryToPutWordAtPoint)\r\n\r\n if (drawn) {\r\n // leave putWord() and return true\r\n return true\r\n }\r\n }\r\n if (settings.shrinkToFit) {\r\n if (Array.isArray(item)) {\r\n item[1] = item[1] * 3 / 4\r\n } else {\r\n item.weight = item.weight * 3 / 4\r\n }\r\n return putWord(item)\r\n }\r\n // we tried all distances but text won't fit, return false\r\n return false\r\n }\r\n\r\n /* Send DOM event to all elements. Will stop sending event and return\r\n if the previous one is canceled (for cancelable events). */\r\n var sendEvent = function sendEvent (type, cancelable, details) {\r\n if (cancelable) {\r\n return !elements.some(function (el) {\r\n var event = new CustomEvent(type, {\r\n detail: details || {}\r\n })\r\n return !el.dispatchEvent(event)\r\n }, this)\r\n } else {\r\n elements.forEach(function (el) {\r\n var event = new CustomEvent(type, {\r\n detail: details || {}\r\n })\r\n el.dispatchEvent(event)\r\n }, this)\r\n }\r\n }\r\n\r\n /* Start drawing on a canvas */\r\n var start = function start () {\r\n // For dimensions, clearCanvas etc.,\r\n // we only care about the first element.\r\n var canvas = elements[0]\r\n\r\n if (canvas.getContext) {\r\n ngx = Math.ceil(canvas.width / g)\r\n ngy = Math.ceil(canvas.height / g)\r\n } else {\r\n var rect = canvas.getBoundingClientRect()\r\n ngx = Math.ceil(rect.width / g)\r\n ngy = Math.ceil(rect.height / g)\r\n }\r\n\r\n // Sending a wordcloudstart event which cause the previous loop to stop.\r\n // Do nothing if the event is canceled.\r\n if (!sendEvent('wordcloudstart', true)) {\r\n return\r\n }\r\n\r\n // Determine the center of the word cloud\r\n center = (settings.origin)\r\n ? [settings.origin[0] / g, settings.origin[1] / g]\r\n : [ngx / 2, ngy / 2]\r\n\r\n // Maxium radius to look for space\r\n maxRadius = Math.floor(Math.sqrt(ngx * ngx + ngy * ngy))\r\n\r\n /* Clear the canvas only if the clearCanvas is set,\r\n if not, update the grid to the current canvas state */\r\n grid = []\r\n\r\n var gx, gy, i\r\n if (!canvas.getContext || settings.clearCanvas) {\r\n elements.forEach(function (el) {\r\n if (el.getContext) {\r\n var ctx = el.getContext('2d')\r\n ctx.fillStyle = settings.backgroundColor\r\n ctx.clearRect(0, 0, ngx * (g + 1), ngy * (g + 1))\r\n ctx.fillRect(0, 0, ngx * (g + 1), ngy * (g + 1))\r\n } else {\r\n el.textContent = ''\r\n el.style.backgroundColor = settings.backgroundColor\r\n el.style.position = 'relative'\r\n }\r\n })\r\n\r\n /* fill the grid with empty state */\r\n gx = ngx\r\n while (gx--) {\r\n grid[gx] = []\r\n gy = ngy\r\n while (gy--) {\r\n grid[gx][gy] = true\r\n }\r\n }\r\n } else {\r\n /* Determine bgPixel by creating\r\n another canvas and fill the specified background color. */\r\n var bctx = document.createElement('canvas').getContext('2d')\r\n\r\n bctx.fillStyle = settings.backgroundColor\r\n bctx.fillRect(0, 0, 1, 1)\r\n var bgPixel = bctx.getImageData(0, 0, 1, 1).data\r\n\r\n /* Read back the pixels of the canvas we got to tell which part of the\r\n canvas is empty.\r\n (no clearCanvas only works with a canvas, not divs) */\r\n var imageData =\r\n canvas.getContext('2d').getImageData(0, 0, ngx * g, ngy * g).data\r\n\r\n gx = ngx\r\n var x, y\r\n while (gx--) {\r\n grid[gx] = []\r\n gy = ngy\r\n while (gy--) {\r\n y = g\r\n /* eslint no-labels: [\"error\", { \"allowLoop\": true }] */\r\n singleGridLoop: while (y--) {\r\n x = g\r\n while (x--) {\r\n i = 4\r\n while (i--) {\r\n if (imageData[((gy * g + y) * ngx * g +\r\n (gx * g + x)) * 4 + i] !== bgPixel[i]) {\r\n grid[gx][gy] = false\r\n break singleGridLoop\r\n }\r\n }\r\n }\r\n }\r\n if (grid[gx][gy] !== false) {\r\n grid[gx][gy] = true\r\n }\r\n }\r\n }\r\n\r\n imageData = bctx = bgPixel = undefined\r\n }\r\n\r\n // fill the infoGrid with empty state if we need it\r\n if (settings.hover || settings.click) {\r\n interactive = true\r\n\r\n /* fill the grid with empty state */\r\n gx = ngx + 1\r\n while (gx--) {\r\n infoGrid[gx] = []\r\n }\r\n\r\n if (settings.hover) {\r\n canvas.addEventListener('mousemove', wordcloudhover)\r\n }\r\n\r\n if (settings.click) {\r\n canvas.addEventListener('click', wordcloudclick)\r\n canvas.style.webkitTapHighlightColor = 'rgba(0, 0, 0, 0)'\r\n }\r\n\r\n canvas.addEventListener('wordcloudstart', function stopInteraction () {\r\n canvas.removeEventListener('wordcloudstart', stopInteraction)\r\n\r\n canvas.removeEventListener('mousemove', wordcloudhover)\r\n canvas.removeEventListener('click', wordcloudclick)\r\n hovered = undefined\r\n })\r\n }\r\n\r\n i = 0\r\n var loopingFunction, stoppingFunction\r\n if (settings.wait !== 0) {\r\n loopingFunction = window.setTimeout\r\n stoppingFunction = window.clearTimeout\r\n } else {\r\n loopingFunction = window.setImmediate\r\n stoppingFunction = window.clearImmediate\r\n }\r\n\r\n var addEventListener = function addEventListener (type, listener) {\r\n elements.forEach(function (el) {\r\n el.addEventListener(type, listener)\r\n }, this)\r\n }\r\n\r\n var removeEventListener = function removeEventListener (type, listener) {\r\n elements.forEach(function (el) {\r\n el.removeEventListener(type, listener)\r\n }, this)\r\n }\r\n\r\n var anotherWordCloudStart = function anotherWordCloudStart () {\r\n removeEventListener('wordcloudstart', anotherWordCloudStart)\r\n stoppingFunction(timer)\r\n }\r\n\r\n addEventListener('wordcloudstart', anotherWordCloudStart)\r\n\r\n var timer = loopingFunction(function loop () {\r\n if (i >= settings.list.length) {\r\n stoppingFunction(timer)\r\n sendEvent('wordcloudstop', false)\r\n removeEventListener('wordcloudstart', anotherWordCloudStart)\r\n\r\n return\r\n }\r\n escapeTime = (new Date()).getTime()\r\n var drawn = putWord(settings.list[i])\r\n var canceled = !sendEvent('wordclouddrawn', true, {\r\n item: settings.list[i],\r\n drawn: drawn\r\n })\r\n if (exceedTime() || canceled) {\r\n stoppingFunction(timer)\r\n settings.abort()\r\n sendEvent('wordcloudabort', false)\r\n sendEvent('wordcloudstop', false)\r\n removeEventListener('wordcloudstart', anotherWordCloudStart)\r\n return\r\n }\r\n i++\r\n timer = loopingFunction(loop, settings.wait)\r\n }, settings.wait)\r\n }\r\n\r\n // All set, start the drawing\r\n start()\r\n }\r\n\r\n WordCloud.isSupported = isSupported\r\n WordCloud.minFontSize = minFontSize\r\n\r\n // Expose the library as an AMD module\r\n if (typeof define === 'function' && define.amd) { // eslint-disable-line no-undef\r\n global.WordCloud = WordCloud\r\n define('wordcloud', [], function () { return WordCloud }) // eslint-disable-line no-undef\r\n } else if (typeof module !== 'undefined' && module.exports) { // eslint-disable-line no-undef\r\n module.exports = WordCloud // eslint-disable-line no-undef\r\n } else {\r\n global.WordCloud = WordCloud\r\n }\r\n})(this) // jshint ignore:line"],"mappings":"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"},"metadata":{},"sourceType":"script"} |