New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@visactor/vgrammar-wordcloud

Package Overview
Dependencies
Maintainers
15
Versions
281
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@visactor/vgrammar-wordcloud - npm Package Compare versions

Comparing version 0.5.5 to 0.6.0

2

cjs/cloud-layout.js

@@ -55,3 +55,3 @@ "use strict";

this.clearCache(), this._originSize = [ ...this._size ];
const contextAndRatio = this.getContext(vrender_1.global.createCanvas({
const contextAndRatio = this.getContext(vrender_1.vglobal.createCanvas({
width: 1,

@@ -58,0 +58,0 @@ height: 1

@@ -7,3 +7,3 @@ "use strict";

const cloud_layout_1 = require("./cloud-layout"), vutils_1 = require("@visactor/vutils"), grid_layout_1 = require("./grid-layout"), fast_layout_1 = require("./fast-layout"), vgrammar_util_1 = require("@visactor/vgrammar-util"), OUTPUT = {
const cloud_layout_1 = require("./cloud-layout"), vutils_1 = require("@visactor/vutils"), grid_layout_1 = require("./grid-layout"), fast_layout_1 = require("./fast-layout"), OUTPUT = {
x: "x",

@@ -19,4 +19,6 @@ y: "y",

var _a, _b, _c, _d, _e, _f;
if (options.size && (options.size[0] <= 0 || options.size[1] <= 0)) return (0, vgrammar_util_1.error)("Wordcloud size dimensions must be greater than 0"),
[];
if (options.size && (options.size[0] <= 0 || options.size[1] <= 0)) {
return vutils_1.Logger.getInstance().info("Wordcloud size dimensions must be greater than 0"),
[];
}
const data = upstreamData, canvasSize = (null !== (_a = options.size) && void 0 !== _a ? _a : [ 500, 500 ]).slice();

@@ -23,0 +25,0 @@ canvasSize[0] = Math.floor(canvasSize[0]), canvasSize[1] = Math.floor(canvasSize[1]);

(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@visactor/vgrammar'), require('@visactor/vrender'), require('@visactor/vutils'), require('@visactor/vgrammar-util')) :
typeof define === 'function' && define.amd ? define(['exports', '@visactor/vgrammar', '@visactor/vrender', '@visactor/vutils', '@visactor/vgrammar-util'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.VGrammar = global.VGrammar || {}, global.VGrammar.Wordcloud = {}), global.VGrammar, global.VRender, global.VUtils, global.VGrammar.Util));
})(this, (function (exports, vgrammar, vrender, vutils, vgrammarUtil) { 'use strict';
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@visactor/vgrammar'), require('@visactor/vrender'), require('@visactor/vutils')) :
typeof define === 'function' && define.amd ? define(['exports', '@visactor/vgrammar', '@visactor/vrender', '@visactor/vutils'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.VGrammar = global.VGrammar || {}, global.VGrammar.Wordcloud = {}), global.VGrammar, global.VRender, global.VUtils));
})(this, (function (exports, vgrammar, vrender, vutils) { 'use strict';

@@ -115,37 +115,4 @@ const shapes = {

class BaseLayout {
static defaultOptions = {
fontFamily: '"Trebuchet MS", "Heiti TC", "微軟正黑體", ' + '"Arial Unicode MS", "Droid Fallback Sans", sans-serif',
fontWeight: 'normal',
color: 'random-dark',
fontStyle: 'normal',
minFontSize: 12,
drawOutOfBound: false,
shrink: false,
minRotation: -Math.PI / 2,
maxRotation: Math.PI / 2,
rotationSteps: 0,
rotateRatio: 0.1,
random: false,
shape: 'circle',
progressiveTime: 0,
progressiveStep: 0,
backgroundColor: '#fff'
};
options;
shape;
getTextFontWeight;
getTextFontSize;
getTextFontFamily;
getText;
getTextColor;
getTextFontStyle;
getTextRotate;
outputCallback;
escapeTime;
result;
data;
currentStepIndex;
progressiveIndex;
progressiveResult;
constructor(options) {
var _a, _b;
this.options = Object.assign({}, BaseLayout.defaultOptions, options);

@@ -158,3 +125,3 @@ if (!vutils.isFunction(this.options.shape)) {

}
this.getText = functor(this.options.text) ?? ((d) => d);
this.getText = (_a = functor(this.options.text)) !== null && _a !== void 0 ? _a : ((d) => d);
this.getTextFontWeight = functor(this.options.fontWeight);

@@ -164,3 +131,3 @@ this.getTextFontSize = functor(this.options.fontSize);

this.getTextFontFamily = functor(this.options.fontFamily);
this.outputCallback = this.options.outputCallback ?? ((res) => res);
this.outputCallback = (_b = this.options.outputCallback) !== null && _b !== void 0 ? _b : ((res) => res);
switch (this.options.color) {

@@ -183,4 +150,4 @@ case 'random-dark':

this.getTextRotate = vutils.isFunction(this.options.rotate)
? (d) => vutils.degreeToRadian(this.options.rotate(d) ?? 0)
: () => vutils.degreeToRadian(this.options.rotate ?? 0);
? (d) => { var _a; return vutils.degreeToRadian((_a = this.options.rotate(d)) !== null && _a !== void 0 ? _a : 0); }
: () => { var _a; return vutils.degreeToRadian((_a = this.options.rotate) !== null && _a !== void 0 ? _a : 0); };
}

@@ -209,4 +176,5 @@ else if (this.options.useRandomRotate) {

exceedTime() {
var _a;
if (this.options.progressiveStep > 0) {
return this.progressiveIndex >= ((this.currentStepIndex ?? 0) + 1) * this.options.progressiveStep;
return this.progressiveIndex >= (((_a = this.currentStepIndex) !== null && _a !== void 0 ? _a : 0) + 1) * this.options.progressiveStep;
}

@@ -216,4 +184,5 @@ return this.options.progressiveTime > 0 && new Date().getTime() - this.escapeTime > this.options.progressiveTime;

progressiveRun() {
var _a;
if (this.options.progressiveStep > 0) {
this.currentStepIndex = (this.currentStepIndex ?? 0) + 1;
this.currentStepIndex = ((_a = this.currentStepIndex) !== null && _a !== void 0 ? _a : 0) + 1;
}

@@ -264,2 +233,20 @@ else if (this.options.progressiveTime > 0) {

}
BaseLayout.defaultOptions = {
fontFamily: '"Trebuchet MS", "Heiti TC", "微軟正黑體", ' + '"Arial Unicode MS", "Droid Fallback Sans", sans-serif',
fontWeight: 'normal',
color: 'random-dark',
fontStyle: 'normal',
minFontSize: 12,
drawOutOfBound: false,
shrink: false,
minRotation: -Math.PI / 2,
maxRotation: Math.PI / 2,
rotationSteps: 0,
rotateRatio: 0.1,
random: false,
shape: 'circle',
progressiveTime: 0,
progressiveStep: 0,
backgroundColor: '#fff'
};

@@ -303,24 +290,14 @@ const spirals = {

class CloudLayout extends BaseLayout {
getTextPadding;
spiral;
random;
cw = (1 << 11) >> 5;
ch = 1 << 11;
_size = [256, 256];
_originSize;
_isBoardExpandCompleted = false;
_placeStatus = 0;
_tTemp = null;
_dtTemp = null;
_dy = 0;
contextAndRatio;
_board;
_bounds;
cacheMap = new Map();
static defaultOptions = {
enlarge: false,
minFontSize: 2
};
constructor(options) {
var _a;
super(Object.assign({}, CloudLayout.defaultOptions, options));
this.cw = (1 << 11) >> 5;
this.ch = 1 << 11;
this._size = [256, 256];
this._isBoardExpandCompleted = false;
this._placeStatus = 0;
this._tTemp = null;
this._dtTemp = null;
this._dy = 0;
this.cacheMap = new Map();
if (this.options.minFontSize <= CloudLayout.defaultOptions.minFontSize) {

@@ -330,3 +307,3 @@ this.options.minFontSize = CloudLayout.defaultOptions.minFontSize;

this.spiral = vutils.isString(this.options.spiral)
? spirals[this.options.spiral] ?? spirals.archimedean
? (_a = spirals[this.options.spiral]) !== null && _a !== void 0 ? _a : spirals.archimedean
: this.options.spiral;

@@ -403,3 +380,3 @@ this.random = this.options.random ? Math.random : () => 1;

this._originSize = [...this._size];
const contextAndRatio = this.getContext(vrender.global.createCanvas({ width: 1, height: 1 }));
const contextAndRatio = this.getContext(vrender.vglobal.createCanvas({ width: 1, height: 1 }));
this.contextAndRatio = contextAndRatio;

@@ -699,2 +676,6 @@ this._board = new Array((this._size[0] >> 5) * this._size[1]).fill(0);

}
CloudLayout.defaultOptions = {
enlarge: false,
minFontSize: 2
};
function cloudSprite(contextAndRatio, d, data, di, cw, ch) {

@@ -880,29 +861,26 @@ if (d.sprite) {

const yt = h - je;
return {
...tag,
width: tag.width - xl - xr,
height: tag.height - yb - yt,
x0: tag.x0 + xl,
x1: tag.x1 - xr,
y0: tag.y0 + yb,
y1: tag.y1 - yt,
x: tag.x + xl / 2 - xr / 2,
sprite: _sprite
};
return Object.assign(Object.assign({}, tag), { width: tag.width - xl - xr, height: tag.height - yb - yt, x0: tag.x0 + xl, x1: tag.x1 - xr, y0: tag.y0 + yb, y1: tag.y1 - yt, x: tag.x + xl / 2 - xr / 2, sprite: _sprite });
}
class GridLayout extends BaseLayout {
static defaultOptions = {
gridSize: 8,
ellipticity: 1
};
gridSize;
center;
pointsAtRadius;
ngx;
ngy;
grid;
maxRadius;
constructor(options) {
super(Object.assign({}, GridLayout.defaultOptions, options));
this.fillGridAt = (x, y) => {
if (x >= this.ngx || y >= this.ngy || x < 0 || y < 0) {
return;
}
this.grid[x][y] = false;
};
this.updateGrid = (gx, gy, gw, gh, info) => {
const occupied = info.occupied;
let i = occupied.length;
while (i--) {
const px = gx + occupied[i][0];
const py = gy + occupied[i][1];
if (px >= this.ngx || py >= this.ngy || px < 0 || py < 0) {
continue;
}
this.fillGridAt(px, py);
}
};
this.gridSize = Math.max(Math.floor(this.options.gridSize), 4);

@@ -932,2 +910,3 @@ }

getTextInfo(item, shrinkRatio = 1) {
var _a;
const sizeShrinkRatio = this.options.clip ? 1 : shrinkRatio;

@@ -944,3 +923,3 @@ const fontSize = Math.max(Math.floor(this.getTextFontSize(item) * sizeShrinkRatio), this.options.minFontSize);

const fontStyle = this.getTextFontStyle(item);
const angle = this.getTextRotate ? this.getTextRotate(item) ?? 0 : 0;
const angle = this.getTextRotate ? (_a = this.getTextRotate(item)) !== null && _a !== void 0 ? _a : 0 : 0;
const fontFamily = this.getTextFontFamily(item);

@@ -1029,20 +1008,2 @@ const fcanvas = document.createElement('canvas');

}
fillGridAt = (x, y) => {
if (x >= this.ngx || y >= this.ngy || x < 0 || y < 0) {
return;
}
this.grid[x][y] = false;
};
updateGrid = (gx, gy, gw, gh, info) => {
const occupied = info.occupied;
let i = occupied.length;
while (i--) {
const px = gx + occupied[i][0];
const py = gy + occupied[i][1];
if (px >= this.ngx || py >= this.ngy || px < 0 || py < 0) {
continue;
}
this.fillGridAt(px, py);
}
};
canFitText(gx, gy, gw, gh, occupied) {

@@ -1213,13 +1174,8 @@ let i = occupied.length;

}
GridLayout.defaultOptions = {
gridSize: 8,
ellipticity: 1
};
class FastLayout extends BaseLayout {
random;
center;
aspectRatio;
maxRadius;
width;
height;
static defaultOptions = {
enlarge: false
};
constructor(options) {

@@ -1291,3 +1247,3 @@ super(Object.assign({}, FastLayout.defaultOptions, options));

layout(data, config) {
if (!data?.length) {
if (!(data === null || data === void 0 ? void 0 : data.length)) {
return [];

@@ -1316,2 +1272,5 @@ }

}
FastLayout.defaultOptions = {
enlarge: false
};
function isOverlap(a, b) {

@@ -1335,8 +1294,10 @@ if (a.left + a.width < b.left || a.top + a.height < b.top || a.left > b.left + b.width || a.top > b.top + b.height) {

const transform = (options, upstreamData) => {
var _a, _b, _c, _d, _e, _f;
if (options.size && (options.size[0] <= 0 || options.size[1] <= 0)) {
vgrammarUtil.error('Wordcloud size dimensions must be greater than 0');
const logger = vutils.Logger.getInstance();
logger.info('Wordcloud size dimensions must be greater than 0');
return [];
}
const data = upstreamData;
const canvasSize = (options.size ?? [500, 500]).slice();
const canvasSize = ((_a = options.size) !== null && _a !== void 0 ? _a : [500, 500]).slice();
canvasSize[0] = Math.floor(canvasSize[0]);

@@ -1349,8 +1310,8 @@ canvasSize[1] = Math.floor(canvasSize[1]);

const text = field(options.text);
const spiral = options.spiral ?? 'archimedean';
const spiral = (_b = options.spiral) !== null && _b !== void 0 ? _b : 'archimedean';
const padding = options.padding ? field(options.padding) : 1;
const shape = options.shape ?? 'square';
const shrink = options.shrink ?? false;
const enlarge = options.enlarge ?? false;
const clip = options.clip ?? false;
const shape = (_c = options.shape) !== null && _c !== void 0 ? _c : 'square';
const shrink = (_d = options.shrink) !== null && _d !== void 0 ? _d : false;
const enlarge = (_e = options.enlarge) !== null && _e !== void 0 ? _e : false;
const clip = (_f = options.clip) !== null && _f !== void 0 ? _f : false;
const minFontSize = options.minFontSize;

@@ -1468,3 +1429,3 @@ const randomVisible = options.randomVisible;

const r = maxSize / 2;
const out = _StereographicProjection(canvasSize[0], canvasSize[1], r, { x: r, y: r, z: depth_3d ?? r }, w);
const out = _StereographicProjection(canvasSize[0], canvasSize[1], r, { x: r, y: r, z: depth_3d !== null && depth_3d !== void 0 ? depth_3d : r }, w);
t[as.x] = out.x;

@@ -1471,0 +1432,0 @@ t[as.y] = out.y;

@@ -1,1 +0,1 @@

!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("@visactor/vgrammar"),require("@visactor/vrender"),require("@visactor/vutils"),require("@visactor/vgrammar-util")):"function"==typeof define&&define.amd?define(["exports","@visactor/vgrammar","@visactor/vrender","@visactor/vutils","@visactor/vgrammar-util"],i):i(((t="undefined"!=typeof globalThis?globalThis:t||self).VGrammar=t.VGrammar||{},t.VGrammar.Wordcloud={}),t.VGrammar,t.VRender,t.VUtils,t.VGrammar.Util)}(this,(function(t,i,e,s,n){"use strict";const o={triangleForward:function(){return function(t){const i=t%(2*Math.PI/3);return 1/(Math.cos(i)+Math.sqrt(3)*Math.sin(i))}},triangleUpright:h,triangle:h,diamond:function(){return function(t){const i=t%(2*Math.PI/4);return 1/(Math.cos(i)+Math.sin(i))}},square:function(){return function(t){return Math.min(1/Math.abs(Math.cos(t)),1/Math.abs(Math.sin(t)))}},star:function(){return function(t){const i=(t+.955)%(2*Math.PI/10);return(t+.955)%(2*Math.PI/5)-2*Math.PI/10>=0?1/(Math.cos(2*Math.PI/10-i)+3.07768*Math.sin(2*Math.PI/10-i)):1/(Math.cos(i)+3.07768*Math.sin(i))}},cardioid:function(){return function(t){return 1-Math.sin(t)}},circle:function(){return function(){return 1}},pentagon:function(){return function(t){const i=(t+.955)%(2*Math.PI/5);return 1/(Math.cos(i)+.726543*Math.sin(i))}}};function h(){return function(t){const i=(t+3*Math.PI/2)%(2*Math.PI/3);return 1/(Math.cos(i)+Math.sqrt(3)*Math.sin(i))}}function r(t,i){const e=i[0],s=i[1];let n=1;const o=[i[0]>>1,i[1]>>1];switch(t){case"cardioid":o[1]=~~(s/2.7*.6),n=Math.floor(Math.min(e/2.3,s/2.6));break;case"triangleForward":n=s/Math.sqrt(.75)>e?Math.floor(e/2):Math.floor(s/(2*Math.sqrt(.75)));break;case"triangle":case"triangleUpright":o[1]=~~(s/1.5),n=Math.floor(Math.min(s/1.5,e/2));break;default:n=Math.floor(Math.min(e/2,s/2))}return{maxRadius:n,center:o}}const a=(t,i)=>"hsl("+(360*Math.random()).toFixed()+","+(30*Math.random()+70).toFixed()+"%,"+(Math.random()*(i-t)+t).toFixed()+"%)";function l(t){return s.isFunction(t)?t:function(){return t}}class u{static defaultOptions={fontFamily:'"Trebuchet MS", "Heiti TC", "微軟正黑體", "Arial Unicode MS", "Droid Fallback Sans", sans-serif',fontWeight:"normal",color:"random-dark",fontStyle:"normal",minFontSize:12,drawOutOfBound:!1,shrink:!1,minRotation:-Math.PI/2,maxRotation:Math.PI/2,rotationSteps:0,rotateRatio:.1,random:!1,shape:"circle",progressiveTime:0,progressiveStep:0,backgroundColor:"#fff"};options;shape;getTextFontWeight;getTextFontSize;getTextFontFamily;getText;getTextColor;getTextFontStyle;getTextRotate;outputCallback;escapeTime;result;data;currentStepIndex;progressiveIndex;progressiveResult;constructor(t){var i;switch(this.options=Object.assign({},u.defaultOptions,t),s.isFunction(this.options.shape)?this.shape=this.options.shape:this.shape=(i=this.options.shape,o[i]?o[i]():o.circle()),this.getText=l(this.options.text)??(t=>t),this.getTextFontWeight=l(this.options.fontWeight),this.getTextFontSize=l(this.options.fontSize),this.getTextFontStyle=l(this.options.fontStyle),this.getTextFontFamily=l(this.options.fontFamily),this.outputCallback=this.options.outputCallback??(t=>t),this.options.color){case"random-dark":this.getTextColor=()=>a(10,50);break;case"random-light":this.getTextColor=()=>a(50,90);break;default:this.getTextColor=l(this.options.color)}if(s.isNil(this.options.rotate)){if(this.options.useRandomRotate){const t=Math.abs(this.options.maxRotation-this.options.minRotation),i=Math.abs(Math.floor(this.options.rotationSteps)),e=Math.min(this.options.maxRotation,this.options.minRotation);this.getTextRotate=()=>0===this.options.rotateRatio||Math.random()>this.options.rotateRatio?0:0===t?e:i>0?e+Math.floor(Math.random()*i)*t/(i-1):e+Math.random()*t}}else this.getTextRotate=s.isFunction(this.options.rotate)?t=>s.degreeToRadian(this.options.rotate(t)??0):()=>s.degreeToRadian(this.options.rotate??0)}exceedTime(){return this.options.progressiveStep>0?this.progressiveIndex>=((this.currentStepIndex??0)+1)*this.options.progressiveStep:this.options.progressiveTime>0&&(new Date).getTime()-this.escapeTime>this.options.progressiveTime}progressiveRun(){if(this.options.progressiveStep>0?this.currentStepIndex=(this.currentStepIndex??0)+1:this.options.progressiveTime>0&&(this.escapeTime=Date.now()),this.data&&this.progressiveIndex&&this.progressiveIndex<this.data.length){this.progressiveResult=[];const t=this.data.length;let i=this.progressiveIndex;for(;i<t&&(this.layoutWord(i),i++,this.progressiveIndex=i,!this.exceedTime()););return this.progressiveResult}return this.result}initProgressive(){this.options.progressiveStep>0?this.currentStepIndex=0:this.options.progressiveTime>0&&(this.escapeTime=Date.now()),this.progressiveResult=[]}output(){return this.result?this.outputCallback(this.result):null}progressiveOutput(){return this.progressiveResult?this.outputCallback(this.progressiveResult):null}unfinished(){return this.data&&this.data.length&&!s.isNil(this.progressiveIndex)&&this.progressiveIndex<this.data.length}release(){this.data=null,this.result=null,this.progressiveIndex=null,this.progressiveResult=null}}const d={archimedean:function(t){const i=t[0]/t[1];return t=>[i*(t*=.1)*Math.cos(t),t*Math.sin(t)]},rectangular:function(t){const i=4*t[0]/t[1];let e=0,s=0;return t=>{const n=t<0?-1:1;switch(Math.sqrt(1+4*n*t)-n&3){case 0:e+=i;break;case 1:s+=4;break;case 2:e-=i;break;default:s-=4}return[e,s]}}};const g=6e4;class c extends u{getTextPadding;spiral;random;cw=64;ch=2048;_size=[256,256];_originSize;_isBoardExpandCompleted=!1;_placeStatus=0;_tTemp=null;_dtTemp=null;_dy=0;contextAndRatio;_board;_bounds;cacheMap=new Map;static defaultOptions={enlarge:!1,minFontSize:2};constructor(t){super(Object.assign({},c.defaultOptions,t)),this.options.minFontSize<=c.defaultOptions.minFontSize&&(this.options.minFontSize=c.defaultOptions.minFontSize),this.spiral=s.isString(this.options.spiral)?d[this.options.spiral]??d.archimedean:this.options.spiral,this.random=this.options.random?Math.random:()=>1,this.getTextPadding=l(this.options.padding)}zoomRatio(){return this._originSize[0]/this._size[0]}dy(){return this._dy}layoutWord(t){const i=this.data[t];if(""===(""+i.text).trim())return!0;const{maxRadius:e,center:s}=r(this.options.shape,this._size);if(i.x=s[0],i.y=s[1],function(t,i,e,s,n,o){if(i.sprite)return;const h=t.context,r=t.ratio;h.setTransform(r,0,0,r,0,0),h.clearRect(0,0,(n<<5)/r,o/r);let a=0,l=0,u=0;const d=e.length;let g,c,p,f,x;--s;for(;++s<d;){if(i=e[s],h.save(),h.font=i.fontStyle+" "+i.fontWeight+" "+~~((i.fontSize+1)/r)+"px "+i.fontFamily,g=h.measureText(i.text+"m").width*r,p=i.fontSize<<1,i.angle){const t=Math.sin(i.angle),e=Math.cos(i.angle),s=g*e,n=g*t,o=p*e,h=p*t;g=Math.max(Math.abs(s+h),Math.abs(s-h))+31>>5<<5,p=~~Math.max(Math.abs(n+o),Math.abs(n-o))}else g=g+31>>5<<5;if(p>u&&(u=p),a+g>=n<<5&&(a=0,l+=u,u=0),l+p>=o)break;h.translate((a+(g>>1))/r,(l+(p>>1))/r),i.angle&&h.rotate(i.angle),h.fillText(i.text,0,0),i.padding&&(h.lineWidth=2*i.padding,h.strokeText(i.text,0,0)),h.restore(),i.width=g,i.height=p,i.xoff=a,i.yoff=l,i.x1=g>>1,i.y1=p>>1,i.x0=-i.x1,i.y0=-i.y1,i.hasText=!0,a+=g}const m=h.getImageData(0,0,(n<<5)/r,o/r).data,y=[];for(;--s>=0;){if(!(i=e[s]).hasText)continue;for(g=i.width,c=g>>5,p=i.y1-i.y0,f=0;f<p*c;f++)y[f]=0;if(a=i.xoff,null==a)return;l=i.yoff;let t=0,o=-1;for(x=0;x<p;x++){for(f=0;f<g;f++){const i=c*x+(f>>5),e=m[(l+x)*(n<<5)+(a+f)<<2]?1<<31-f%32:0;y[i]|=e,t|=e}t?o=x:(i.y0++,p--,x--,l++)}i.y1=i.y0+o,i.sprite=y.slice(0,(i.y1-i.y0)*c)}}(this.contextAndRatio,i,this.data,t,this.cw,this.ch),this._placeStatus=0,i.hasText&&this.place(this._board,i,this._bounds,e))return this.result.push(i),this._bounds?function(t,i){const e=t[0],s=t[1];i.x+i.x0<e.x&&(e.x=i.x+i.x0);i.y+i.y0<e.y&&(e.y=i.y+i.y0);i.x+i.x1>s.x&&(s.x=i.x+i.x1);i.y+i.y1>s.y&&(s.y=i.y+i.y1)}(this._bounds,i):this._bounds=[{x:i.x+i.x0,y:i.y+i.y0},{x:i.x+i.x1,y:i.y+i.y1}],i.x-=this._size[0]>>1,i.y-=this._size[1]>>1,this._tTemp=null,this._dtTemp=null,!0;if(this.updateBoardExpandStatus(i.fontSize),i.hasText&&this.shouldShrinkContinue()){if(1===this._placeStatus){const t=i.fontSize*this._originSize[0]/this.options.minFontSize,e=Math.max(i.width,i.height);if(e<=t)this.expandBoard(this._board,e/this._size[0]);else{if(!this.options.clip)return!0;this.expandBoard(this._board,t/this._size[0])}}else this._placeStatus,this.expandBoard(this._board);return this.updateBoardExpandStatus(i.fontSize),!1}return this._tTemp=null,this._dtTemp=null,!0}layout(t,i){this.initProgressive(),this.result=[],this._size=[i.width,i.height],this.clearCache(),this._originSize=[...this._size];const s=this.getContext(e.global.createCanvas({width:1,height:1}));this.contextAndRatio=s,this._board=new Array((this._size[0]>>5)*this._size[1]).fill(0),this._bounds=null;const n=t.length;let o=0;this.result=[];const h=t.map((t=>({text:this.getText(t),fontFamily:this.getTextFontFamily(t),fontStyle:this.getTextFontStyle(t),fontWeight:this.getTextFontWeight(t),angle:this.getTextRotate(t),fontSize:~~this.getTextFontSize(t),padding:this.getTextPadding(t),xoff:0,yoff:0,x1:0,y1:0,x0:0,y0:0,hasText:!1,sprite:null,datum:t,x:0,y:0,width:0,height:0}))).sort((function(t,i){return i.fontSize-t.fontSize}));this.data=h;let r=0;for(;o<n;){if(this.layoutWord(o)||r>=2?(o++,r=0):r++,this.progressiveIndex=o,this.exceedTime())break}if(!this.options.clip&&this.options.enlarge&&this._bounds&&this.shrinkBoard(this._bounds),this._bounds&&["cardioid","triangle","triangle-upright"].includes(this.options.shape)){const t=(this._bounds[0].y+this._bounds[1].y)/2;this._dy=-(t-this._size[1]/2)}return this.result}formatTagItem(t){const i=this._size,e=this.zoomRatio(),s=this.dy(),n=i[0]>>1,o=i[1]>>1,h=t.length,r=[];let a,l;for(let i=0;i<h;++i)a=t[i],l={},l.datum=a.datum,l.x=(a.x+n)*e,l.y=(a.y+o+s)*e,l.fontFamily=a.fontFamily,l.fontSize=a.fontSize*e,l.fontStyle=a.fontStyle,l.fontWeight=a.fontWeight,l.angle=a.angle,r.push(l);return r}output(){return this.outputCallback?this.outputCallback(this.formatTagItem(this.result)):this.formatTagItem(this.result)}progressiveOutput(){return this.outputCallback?this.outputCallback(this.formatTagItem(this.progressiveResult)):this.formatTagItem(this.progressiveResult)}updateBoardExpandStatus(t){this._isBoardExpandCompleted=t*(this._originSize[0]/this._size[0])<this.options.minFontSize}shouldShrinkContinue(){return!this.options.clip&&this.options.shrink&&!this._isBoardExpandCompleted}shrinkBoard(t){const i=t[0],e=t[1];if(e.x>=this._size[0]||e.y>=this._size[1])return;const s=Math.min(i.x,this._size[0]-e.x),n=Math.min(i.y,this._size[1]-e.y),o=2*Math.min(s/this._size[0],n/this._size[1]);this._size=this._size.map((t=>t*(1-o)))}expandBoard(t,i){const e=this._size[0]*(i||1.1)-this._size[0]>>5;let s=2*e>2?e:2;s%2!=0&&s++;let n=Math.ceil(this._size[1]*(s<<5)/this._size[0]);n%2!=0&&n++;const o=this._size[0],h=this._size[1],r=new Array(s).fill(0),a=new Array(n/2*(s+(o>>5))).fill(0);this.insertZerosToArray(t,h*(o>>5),a.length+s/2);for(let i=h-1;i>0;i--)this.insertZerosToArray(t,i*(o>>5),r.length);this.insertZerosToArray(t,0,a.length+s/2),this._size=[o+(s<<5),h+n]}insertZerosToArray(t,i,e){const s=Math.floor(e/g),n=e%g;for(let e=0;e<s;e++)t.splice(i+e*g,0,...new Array(g).fill(0));t.splice(i+s*g,0,...new Array(n).fill(0))}getContext(t){t.width=1,t.height=1;const i=t.getContext("2d").getImageData(0,0,1,1),e=Math.sqrt(i.data.length>>2);t.width=(this.cw<<5)/e,t.height=this.ch/e;const s=t.getContext("2d");return s.fillStyle=s.strokeStyle="red",s.textAlign="center",{context:s,ratio:e,canvas:t}}place(t,i,e,s){let n=!1;if(this.shouldShrinkContinue()&&(i.width>this._size[0]||i.height>this._size[1]))return this._placeStatus=1,!1;const o=this.random()<.5?1:-1;if(!this.shouldShrinkContinue()&&this.isSizeLargerThanMax(i,o))return null;const h=i.x,r=i.y,a=Math.sqrt(this._size[0]*this._size[0]+this._size[1]*this._size[1]),l=this.spiral(this._size);let u,d,g,c,y=-o;for(this._tTemp=null,this._dtTemp=null;u=l(y+=o);){d=u[0],g=u[1];const l=Math.sqrt(d**2+g**2);let z=Math.atan(g/d);d<0?z+=Math.PI:g<0&&(z=2*Math.PI+z);const T=this.shape(z);if(Math.min(Math.abs(d),Math.abs(g))>=a)break;if(l>=s)n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);else{if(i.x=h+~~(l*T*Math.cos(-z)),i.y=r+~~(l*T*Math.sin(-z)),c=i,this.options.clip)if(this.shouldShrinkContinue()){if(x(c,this._size)){n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);continue}}else{if(f(c,this._size)){n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);continue}x(c,this._size)&&(c=m(c,this._size))}else if(x(c,this._size)){n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);continue}if(n=!0,!(e&&(M=c,S=e,!(M.x+M.x1>S[0].x&&M.x+M.x0<S[1].x&&M.y+M.y1>S[0].y&&M.y+M.y0<S[1].y))||e&&p(c,t,this._size))){const e=c.sprite,s=c.width>>5,n=this._size[0]>>5,o=c.x-(s<<4),h=127&o,r=32-h,a=c.y1-c.y0;let l,u=(c.y+c.y0)*n+(o>>5);for(let i=0;i<a;i++){l=0;for(let n=0;n<=s;n++)t[u+n]|=l<<r|(n<s?(l=e[i*s+n])>>>h:0);u+=n}return i.sprite=null,c.sprite=null,!0}}}var M,S;return null!==this._tTemp&&(this._placeStatus=3),!this.shouldShrinkContinue()&&this.setCache(c,o),!1}clearCache(){this.cacheMap.clear()}setCache(t,i){const e=`${t.angle}-${i}`,s=t.x1-t.x0,n=t.y1-t.y0;if(!this.cacheMap.has(e))return void this.cacheMap.set(e,{width:s,height:n});const{width:o,height:h}=this.cacheMap.get(e);(s<o&&n<h||s<=o&&n<h)&&this.cacheMap.set(e,{width:s,height:n})}isSizeLargerThanMax(t,i){const e=`${t.angle}-${i}`;if(!this.cacheMap.has(e))return!1;const{width:s,height:n}=this.cacheMap.get(e),o=t.x1-t.x0,h=t.y1-t.y0;return o>=s&&h>=n}}function p(t,i,e){const s=e[0]>>5,n=t.sprite,o=t.width>>5,h=t.x-(o<<4),r=127&h,a=32-r,l=t.y1-t.y0;let u,d=(t.y+t.y0)*s+(h>>5);for(let t=0;t<l;t++){u=0;for(let e=0;e<=o;e++)if((u<<a|(e<o?(u=n[t*o+e])>>>r:0))&i[d+e])return!0;d+=s}return!1}const f=(t,i)=>t.x+t.x0>i[0]||t.y+t.y0>i[0]||t.x+t.x1<0||t.y+t.y1<0,x=(t,i)=>t.x+t.x0<0||t.y+t.y0<0||t.x+t.x1>i[0]||t.y+t.y1>i[1];function m(t,i){const e=t.sprite,s=t.y1-t.y0,n=t.width>>5;let o=0;const h=[],r=Math.max(-(t.y0+t.y),0),a=Math.min(s+(i[1]-(t.y1+t.y)),s),l=Math.max(-(t.x0+t.x),0)>>5,u=Math.min(n+(i[0]-(t.x1+t.x)>>5)+1,n);for(let t=0;t<s;t++){for(let i=0;i<n;i++)t<r||a<=t||i<l||u<=i||h.push(e[o+i]);o+=n}const d=l<<5,g=n-u<<5,c=r,p=s-a;return{...t,width:t.width-d-g,height:t.height-c-p,x0:t.x0+d,x1:t.x1-g,y0:t.y0+c,y1:t.y1-p,x:t.x+d/2-g/2,sprite:h}}class y extends u{static defaultOptions={gridSize:8,ellipticity:1};gridSize;center;pointsAtRadius;ngx;ngy;grid;maxRadius;constructor(t){super(Object.assign({},y.defaultOptions,t)),this.gridSize=Math.max(Math.floor(this.options.gridSize),4)}getPointsAtRadius(t){if(this.pointsAtRadius[t])return this.pointsAtRadius[t];const i=8*t;let e=i;const s=[];for(0===t&&s.push([this.center[0],this.center[1],0]);e--;){const n=this.shape(e/i*2*Math.PI);s.push([this.center[0]+t*n*Math.cos(-e/i*2*Math.PI),this.center[1]+t*n*Math.sin(-e/i*2*Math.PI)*this.options.ellipticity,e/i*2*Math.PI])}return this.pointsAtRadius[t]=s,s}getTextInfo(t,i=1){const e=this.options.clip?1:i,s=Math.max(Math.floor(this.getTextFontSize(t)*e),this.options.minFontSize);let n=this.getText(t)+"";if(this.options.clip&&(n=n.slice(0,Math.ceil(n.length*i))),!n)return null;const o=this.getTextFontWeight(t),h=this.getTextFontStyle(t),r=this.getTextRotate?this.getTextRotate(t)??0:0,a=this.getTextFontFamily(t),l=document.createElement("canvas"),u=l.getContext("2d",{willReadFrequently:!0});u.font=h+" "+o+" "+s.toString(10)+"px "+a;const d=u.measureText(n).width,g=Math.max(s,u.measureText("m").width,u.measureText("W").width);let c=d+2*g,p=3*g;const f=Math.ceil(c/this.gridSize),x=Math.ceil(p/this.gridSize);c=f*this.gridSize,p=x*this.gridSize;const m=-d/2,y=.4*-g,M=Math.ceil((c*Math.abs(Math.sin(r))+p*Math.abs(Math.cos(r)))/this.gridSize),S=Math.ceil((c*Math.abs(Math.cos(r))+p*Math.abs(Math.sin(r)))/this.gridSize),z=S*this.gridSize,T=M*this.gridSize;l.setAttribute("width",""+z),l.setAttribute("height",""+T),u.scale(1,1),u.translate(z/2,T/2),u.rotate(-r),u.font=h+" "+o+" "+s.toString(10)+"px "+a,u.fillStyle="#000",u.textBaseline="middle",u.fillText(n,m,y);const _=u.getImageData(0,0,z,T).data;if(this.exceedTime())return null;const v=[];let b,F=S;const w=[M/2,S/2,M/2,S/2],R=(t,i,e)=>{let s=this.gridSize;for(;s--;){let n=this.gridSize;for(;n--;)if(_[4*((i*this.gridSize+s)*z+(t*this.gridSize+n))+3])return e.push([t,i]),t<w[3]&&(w[3]=t),t>w[1]&&(w[1]=t),i<w[0]&&(w[0]=i),void(i>w[2]&&(w[2]=i))}};for(;F--;)for(b=M;b--;)R(F,b,v);return{datum:t,occupied:v,bounds:w,gw:S,gh:M,fillTextOffsetX:m,fillTextOffsetY:y,fillTextWidth:d,fillTextHeight:g,fontSize:s,fontStyle:h,fontWeight:o,fontFamily:a,angle:r,text:n}}fillGridAt=(t,i)=>{t>=this.ngx||i>=this.ngy||t<0||i<0||(this.grid[t][i]=!1)};updateGrid=(t,i,e,s,n)=>{const o=n.occupied;let h=o.length;for(;h--;){const e=t+o[h][0],s=i+o[h][1];e>=this.ngx||s>=this.ngy||e<0||s<0||this.fillGridAt(e,s)}};canFitText(t,i,e,s,n){let o=n.length;for(;o--;){const e=t+n[o][0],s=i+n[o][1];if(e>=this.ngx||s>=this.ngy||e<0||s<0){if(!this.options.drawOutOfBound)return!1}else if(!this.grid[e][s])return!1}return!0}layoutWord(t,i=1){const e=this.data[t],n=this.getTextInfo(e,i);if(!n)return!1;if(this.exceedTime())return!1;if(!this.options.drawOutOfBound&&(!this.options.shrink||n.fontSize<=this.options.minFontSize)&&!this.options.clip){const t=n.bounds;if(t[1]-t[3]+1>this.ngx||t[2]-t[0]+1>this.ngy)return!1}let o=this.maxRadius+1;const h=t=>{const i=Math.floor(t[0]-n.gw/2),e=Math.floor(t[1]-n.gh/2),s=n.gw,h=n.gh;return!!this.canFitText(i,e,s,h,n.occupied)&&(n.distance=this.maxRadius-o,n.theta=t[2],this.outputText(i,e,n),this.updateGrid(i,e,s,h,n),!0)};for(;o--;){let t=this.getPointsAtRadius(this.maxRadius-o);this.options.random&&(t=[].concat(t),s.shuffleArray(t));if(t.some(h))return!0}return(this.options.clip||!!(this.options.shrink&&n.fontSize>this.options.minFontSize))&&this.layoutWord(t,.75*i)}outputText(t,i,e){const s=this.getTextColor(e),n={text:e.text,datum:e.datum,color:s,fontStyle:e.fontStyle,fontWeight:e.fontWeight,fontFamily:e.fontFamily,angle:e.angle,width:e.fillTextWidth,height:e.fillTextHeight,x:(t+e.gw/2)*this.gridSize,y:(i+e.gh/2)*this.gridSize+e.fillTextOffsetY+.5*e.fontSize,fontSize:e.fontSize};this.result.push(n),this.progressiveResult&&this.progressiveResult.push(n)}initGrid(t){let i;if(this.grid=[],t){let e=document.createElement("canvas").getContext("2d");e.fillStyle=this.options.backgroundColor,e.fillRect(0,0,1,1);let s=e.getImageData(0,0,1,1).data,n=t.getContext("2d").getImageData(0,0,this.ngx*this.gridSize,this.ngy*this.gridSize).data;const o=(t,e)=>{let o=this.gridSize;for(;o--;){let h=this.gridSize;for(;h--;)for(i=4;i--;)if(n[4*((e*this.gridSize+o)*this.ngx*this.gridSize+(t*this.gridSize+h))+i]!==s[i])return void(this.grid[t][e]=!1)}};let h=this.ngx;for(;h--;){this.grid[h]=[];let t=this.ngy;for(;t--;)o(h,t),!1!==this.grid[h][t]&&(this.grid[h][t]=!0)}n=e=s=void 0}else{let t=this.ngx;for(;t--;){this.grid[t]=[];let i=this.ngy;for(;i--;)this.grid[t][i]=!0}}}layout(t,i){this.initProgressive(),this.data=t,this.pointsAtRadius=[],this.ngx=Math.floor(i.width/this.gridSize),this.ngy=Math.floor(i.height/this.gridSize);const{center:e,maxRadius:s}=r(this.options.shape,[i.width,i.height]);this.center=i.origin?[i.origin[0]/this.gridSize,i.origin[1]/this.gridSize]:[e[0]/this.gridSize,e[1]/this.gridSize],this.maxRadius=Math.floor(s/this.gridSize),this.initGrid(i.canvas),this.result=[];let n=0;for(;n<t.length&&(this.layoutWord(n),n++,this.progressiveIndex=n,!this.exceedTime()););return this.result}}class M extends u{random;center;aspectRatio;maxRadius;width;height;static defaultOptions={enlarge:!1};constructor(t){super(Object.assign({},M.defaultOptions,t)),this.random=this.options.random?Math.random:()=>0,this.aspectRatio=1}fit(t){for(let i=0,e=this.result.length;i<e;i++)if(S(t,this.result[i]))return!1;return!0}getTextInfo(t){const i={datum:t,fontSize:this.getTextFontSize(t),fontWeight:this.getTextFontWeight(t),fontStyle:this.getTextFontStyle(t),fontFamily:this.getTextFontFamily(t),angle:this.getTextRotate(t),text:this.getText(t)+"",x:this.center[0],y:this.center[1]},s=e.getTextBounds(i);return i.width=s.width(),i.height=s.height(),i.top=this.center[1]-i.height+.21*i.height,i.left=this.center[0]-i.width/2,i}layoutWord(t){const i=this.getTextInfo(this.data[t]);let e=2*Math.PI,s=0,n=i.left,o=i.top;const h=i.width,r=i.height;let a=1,l=this.fit(i);for(;!l&&s<this.maxRadius;)s+=.5,a=this.shape(s/this.maxRadius*2*Math.PI),e+=.5*(this.options.random?this.random()>.5?1:-1:t%2==0?1:-1),n=this.center[0]-h/2+s*a*Math.cos(e)*this.aspectRatio,o=this.center[1]-r/2+s*a*Math.sin(e),i.left=n,i.top=o,i.x=n+h/2,i.y=o+r/2,l=this.fit(i);return!!l&&(!!(this.options.clip||i.left>=0&&i.left+i.width<=this.width&&i.top>=0&&i.top+i.height<=this.height)&&(this.result.push(i),!0))}layout(t,i){if(!t?.length)return[];this.initProgressive(),this.result=[],this.maxRadius=Math.sqrt(i.width*i.width+i.height*i.height)/2,this.center=[i.width/2,i.height/2],this.width=i.width,this.height=i.height,this.data=t.sort(((t,i)=>this.getTextFontSize(i)-this.getTextFontSize(t)));let e=0;for(;e<t.length&&(this.layoutWord(e),e++,this.progressiveIndex=e,!this.exceedTime()););return this.result}}function S(t,i){return!(t.left+t.width<i.left||t.top+t.height<i.top||t.left>i.left+i.width||t.top>i.top+i.height)}const z={x:"x",y:"y",z:"z",fontFamily:"fontFamily",fontSize:"fontSize",fontStyle:"fontStyle",fontWeight:"fontWeight",angle:"angle"},T=(t,i)=>{if(t.size&&(t.size[0]<=0||t.size[1]<=0))return n.error("Wordcloud size dimensions must be greater than 0"),[];const e=i,o=(t.size??[500,500]).slice();o[0]=Math.floor(o[0]),o[1]=Math.floor(o[1]);const h=t.fontFamily?_(t.fontFamily):"sans-serif",r=t.fontStyle?_(t.fontStyle):"normal",a=t.fontWeight?_(t.fontWeight):"normal",l=t.rotate?_(t.rotate):0,u=_(t.text),d=t.spiral??"archimedean",g=t.padding?_(t.padding):1,p=t.shape??"square",f=t.shrink??!1,x=t.enlarge??!1,m=t.clip??!1,S=t.minFontSize,T=t.randomVisible,v=t.as||z,R=t.depth_3d,I=t.postProjection;let k=t.fontSize?_(t.fontSize):14;const C=t.fontSizeRange;if(C&&!s.isNumber(k)){const t=k,i=b(F(t,e),C);k=e=>i(t(e))}let P=c;"fast"===t.layoutType?P=M:"grid"===t.layoutType&&(P=y);const W=new P({text:u,padding:g,spiral:d,shape:p,rotate:l,fontFamily:h,fontStyle:r,fontWeight:a,fontSize:k,shrink:f,clip:m,enlarge:x,minFontSize:S,random:T,progressiveStep:t.progressiveStep,progressiveTime:t.progressiveTime,outputCallback:t=>{const i=[];let e,s;for(let n=0,h=t.length;n<h;n++)s=t[n],e=s.datum,e[v.x]=s.x,e[v.y]=s.y,e[v.fontFamily]=s.fontFamily,e[v.fontSize]=s.fontSize,e[v.fontStyle]=s.fontStyle,e[v.fontWeight]=s.fontWeight,e[v.angle]=s.angle,"StereographicProjection"===I&&w(o,s,e,v,R),i.push(e);return i}});return W.layout(e,{width:o[0],height:o[1]}),t.progressiveStep>0||t.progressiveTime>0?{progressive:W}:W.output()},_=t=>s.isString(t)||s.isNumber(t)||s.isFunction(t)?t:i=>i[t.field],v=t=>t<0?-Math.sqrt(-t):Math.sqrt(t),b=(t,i)=>{if(t[0]===t[1])return t=>i[0];const e=v(t[0]),s=v(t[1]),n=Math.min(e,s),o=Math.max(e,s);return t=>(v(t)-n)/(o-n)*(i[1]-i[0])+i[0]},F=(t,i)=>{let e=1/0,n=-1/0;const o=i.length;let h;for(let r=0;r<o;++r)h=s.toNumber(t(i[r])),h<e&&(e=h),h>n&&(n=h);return 1===i.length&&e===n&&(e-=1e4),[e,n]};function w(t,i,e,s,n){const o=Math.max(t[0],t[1])/2,h=function(t,i,e,s,n){const{x:o,y:h}=n,r=o/t*Math.PI*2;let a=Math.PI-h/i*Math.PI;a+=(a<Math.PI/2?1:-1)*Math.pow(Math.min(a-Math.PI/2,1),2)/5;const l=e*Math.sin(a)*Math.cos(r)+s.x,u=e*Math.cos(a)+s.y,d=e*Math.sin(a)*Math.sin(r)+s.z;return{x:l,y:u,z:d}}(t[0],t[1],o,{x:o,y:o,z:n??o},i);e[s.x]=h.x,e[s.y]=h.y,e[s.z]=h.z}t.registerWordCloudTransforms=()=>{i.registerTransform("wordcloud",{transform:T,markPhase:"beforeJoin"},!0)}}));
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports,require("@visactor/vgrammar"),require("@visactor/vrender"),require("@visactor/vutils")):"function"==typeof define&&define.amd?define(["exports","@visactor/vgrammar","@visactor/vrender","@visactor/vutils"],i):i(((t="undefined"!=typeof globalThis?globalThis:t||self).VGrammar=t.VGrammar||{},t.VGrammar.Wordcloud={}),t.VGrammar,t.VRender,t.VUtils)}(this,(function(t,i,e,s){"use strict";const n={triangleForward:function(){return function(t){const i=t%(2*Math.PI/3);return 1/(Math.cos(i)+Math.sqrt(3)*Math.sin(i))}},triangleUpright:o,triangle:o,diamond:function(){return function(t){const i=t%(2*Math.PI/4);return 1/(Math.cos(i)+Math.sin(i))}},square:function(){return function(t){return Math.min(1/Math.abs(Math.cos(t)),1/Math.abs(Math.sin(t)))}},star:function(){return function(t){const i=(t+.955)%(2*Math.PI/10);return(t+.955)%(2*Math.PI/5)-2*Math.PI/10>=0?1/(Math.cos(2*Math.PI/10-i)+3.07768*Math.sin(2*Math.PI/10-i)):1/(Math.cos(i)+3.07768*Math.sin(i))}},cardioid:function(){return function(t){return 1-Math.sin(t)}},circle:function(){return function(){return 1}},pentagon:function(){return function(t){const i=(t+.955)%(2*Math.PI/5);return 1/(Math.cos(i)+.726543*Math.sin(i))}}};function o(){return function(t){const i=(t+3*Math.PI/2)%(2*Math.PI/3);return 1/(Math.cos(i)+Math.sqrt(3)*Math.sin(i))}}function h(t,i){const e=i[0],s=i[1];let n=1;const o=[i[0]>>1,i[1]>>1];switch(t){case"cardioid":o[1]=~~(s/2.7*.6),n=Math.floor(Math.min(e/2.3,s/2.6));break;case"triangleForward":n=s/Math.sqrt(.75)>e?Math.floor(e/2):Math.floor(s/(2*Math.sqrt(.75)));break;case"triangle":case"triangleUpright":o[1]=~~(s/1.5),n=Math.floor(Math.min(s/1.5,e/2));break;default:n=Math.floor(Math.min(e/2,s/2))}return{maxRadius:n,center:o}}const r=(t,i)=>"hsl("+(360*Math.random()).toFixed()+","+(30*Math.random()+70).toFixed()+"%,"+(Math.random()*(i-t)+t).toFixed()+"%)";function a(t){return s.isFunction(t)?t:function(){return t}}class l{constructor(t){var i,e,o;switch(this.options=Object.assign({},l.defaultOptions,t),s.isFunction(this.options.shape)?this.shape=this.options.shape:this.shape=(o=this.options.shape,n[o]?n[o]():n.circle()),this.getText=null!==(i=a(this.options.text))&&void 0!==i?i:t=>t,this.getTextFontWeight=a(this.options.fontWeight),this.getTextFontSize=a(this.options.fontSize),this.getTextFontStyle=a(this.options.fontStyle),this.getTextFontFamily=a(this.options.fontFamily),this.outputCallback=null!==(e=this.options.outputCallback)&&void 0!==e?e:t=>t,this.options.color){case"random-dark":this.getTextColor=()=>r(10,50);break;case"random-light":this.getTextColor=()=>r(50,90);break;default:this.getTextColor=a(this.options.color)}if(s.isNil(this.options.rotate)){if(this.options.useRandomRotate){const t=Math.abs(this.options.maxRotation-this.options.minRotation),i=Math.abs(Math.floor(this.options.rotationSteps)),e=Math.min(this.options.maxRotation,this.options.minRotation);this.getTextRotate=()=>0===this.options.rotateRatio||Math.random()>this.options.rotateRatio?0:0===t?e:i>0?e+Math.floor(Math.random()*i)*t/(i-1):e+Math.random()*t}}else this.getTextRotate=s.isFunction(this.options.rotate)?t=>{var i;return s.degreeToRadian(null!==(i=this.options.rotate(t))&&void 0!==i?i:0)}:()=>{var t;return s.degreeToRadian(null!==(t=this.options.rotate)&&void 0!==t?t:0)}}exceedTime(){var t;return this.options.progressiveStep>0?this.progressiveIndex>=((null!==(t=this.currentStepIndex)&&void 0!==t?t:0)+1)*this.options.progressiveStep:this.options.progressiveTime>0&&(new Date).getTime()-this.escapeTime>this.options.progressiveTime}progressiveRun(){var t;if(this.options.progressiveStep>0?this.currentStepIndex=(null!==(t=this.currentStepIndex)&&void 0!==t?t:0)+1:this.options.progressiveTime>0&&(this.escapeTime=Date.now()),this.data&&this.progressiveIndex&&this.progressiveIndex<this.data.length){this.progressiveResult=[];const t=this.data.length;let i=this.progressiveIndex;for(;i<t&&(this.layoutWord(i),i++,this.progressiveIndex=i,!this.exceedTime()););return this.progressiveResult}return this.result}initProgressive(){this.options.progressiveStep>0?this.currentStepIndex=0:this.options.progressiveTime>0&&(this.escapeTime=Date.now()),this.progressiveResult=[]}output(){return this.result?this.outputCallback(this.result):null}progressiveOutput(){return this.progressiveResult?this.outputCallback(this.progressiveResult):null}unfinished(){return this.data&&this.data.length&&!s.isNil(this.progressiveIndex)&&this.progressiveIndex<this.data.length}release(){this.data=null,this.result=null,this.progressiveIndex=null,this.progressiveResult=null}}l.defaultOptions={fontFamily:'"Trebuchet MS", "Heiti TC", "微軟正黑體", "Arial Unicode MS", "Droid Fallback Sans", sans-serif',fontWeight:"normal",color:"random-dark",fontStyle:"normal",minFontSize:12,drawOutOfBound:!1,shrink:!1,minRotation:-Math.PI/2,maxRotation:Math.PI/2,rotationSteps:0,rotateRatio:.1,random:!1,shape:"circle",progressiveTime:0,progressiveStep:0,backgroundColor:"#fff"};const u={archimedean:function(t){const i=t[0]/t[1];return t=>[i*(t*=.1)*Math.cos(t),t*Math.sin(t)]},rectangular:function(t){const i=4*t[0]/t[1];let e=0,s=0;return t=>{const n=t<0?-1:1;switch(Math.sqrt(1+4*n*t)-n&3){case 0:e+=i;break;case 1:s+=4;break;case 2:e-=i;break;default:s-=4}return[e,s]}}};const d=6e4;class c extends l{constructor(t){var i;super(Object.assign({},c.defaultOptions,t)),this.cw=64,this.ch=2048,this._size=[256,256],this._isBoardExpandCompleted=!1,this._placeStatus=0,this._tTemp=null,this._dtTemp=null,this._dy=0,this.cacheMap=new Map,this.options.minFontSize<=c.defaultOptions.minFontSize&&(this.options.minFontSize=c.defaultOptions.minFontSize),this.spiral=s.isString(this.options.spiral)?null!==(i=u[this.options.spiral])&&void 0!==i?i:u.archimedean:this.options.spiral,this.random=this.options.random?Math.random:()=>1,this.getTextPadding=a(this.options.padding)}zoomRatio(){return this._originSize[0]/this._size[0]}dy(){return this._dy}layoutWord(t){const i=this.data[t];if(""===(""+i.text).trim())return!0;const{maxRadius:e,center:s}=h(this.options.shape,this._size);if(i.x=s[0],i.y=s[1],function(t,i,e,s,n,o){if(i.sprite)return;const h=t.context,r=t.ratio;h.setTransform(r,0,0,r,0,0),h.clearRect(0,0,(n<<5)/r,o/r);let a=0,l=0,u=0;const d=e.length;let c,g,f,p,x;--s;for(;++s<d;){if(i=e[s],h.save(),h.font=i.fontStyle+" "+i.fontWeight+" "+~~((i.fontSize+1)/r)+"px "+i.fontFamily,c=h.measureText(i.text+"m").width*r,f=i.fontSize<<1,i.angle){const t=Math.sin(i.angle),e=Math.cos(i.angle),s=c*e,n=c*t,o=f*e,h=f*t;c=Math.max(Math.abs(s+h),Math.abs(s-h))+31>>5<<5,f=~~Math.max(Math.abs(n+o),Math.abs(n-o))}else c=c+31>>5<<5;if(f>u&&(u=f),a+c>=n<<5&&(a=0,l+=u,u=0),l+f>=o)break;h.translate((a+(c>>1))/r,(l+(f>>1))/r),i.angle&&h.rotate(i.angle),h.fillText(i.text,0,0),i.padding&&(h.lineWidth=2*i.padding,h.strokeText(i.text,0,0)),h.restore(),i.width=c,i.height=f,i.xoff=a,i.yoff=l,i.x1=c>>1,i.y1=f>>1,i.x0=-i.x1,i.y0=-i.y1,i.hasText=!0,a+=c}const m=h.getImageData(0,0,(n<<5)/r,o/r).data,y=[];for(;--s>=0;){if(!(i=e[s]).hasText)continue;for(c=i.width,g=c>>5,f=i.y1-i.y0,p=0;p<f*g;p++)y[p]=0;if(a=i.xoff,null==a)return;l=i.yoff;let t=0,o=-1;for(x=0;x<f;x++){for(p=0;p<c;p++){const i=g*x+(p>>5),e=m[(l+x)*(n<<5)+(a+p)<<2]?1<<31-p%32:0;y[i]|=e,t|=e}t?o=x:(i.y0++,f--,x--,l++)}i.y1=i.y0+o,i.sprite=y.slice(0,(i.y1-i.y0)*g)}}(this.contextAndRatio,i,this.data,t,this.cw,this.ch),this._placeStatus=0,i.hasText&&this.place(this._board,i,this._bounds,e))return this.result.push(i),this._bounds?function(t,i){const e=t[0],s=t[1];i.x+i.x0<e.x&&(e.x=i.x+i.x0);i.y+i.y0<e.y&&(e.y=i.y+i.y0);i.x+i.x1>s.x&&(s.x=i.x+i.x1);i.y+i.y1>s.y&&(s.y=i.y+i.y1)}(this._bounds,i):this._bounds=[{x:i.x+i.x0,y:i.y+i.y0},{x:i.x+i.x1,y:i.y+i.y1}],i.x-=this._size[0]>>1,i.y-=this._size[1]>>1,this._tTemp=null,this._dtTemp=null,!0;if(this.updateBoardExpandStatus(i.fontSize),i.hasText&&this.shouldShrinkContinue()){if(1===this._placeStatus){const t=i.fontSize*this._originSize[0]/this.options.minFontSize,e=Math.max(i.width,i.height);if(e<=t)this.expandBoard(this._board,e/this._size[0]);else{if(!this.options.clip)return!0;this.expandBoard(this._board,t/this._size[0])}}else this._placeStatus,this.expandBoard(this._board);return this.updateBoardExpandStatus(i.fontSize),!1}return this._tTemp=null,this._dtTemp=null,!0}layout(t,i){this.initProgressive(),this.result=[],this._size=[i.width,i.height],this.clearCache(),this._originSize=[...this._size];const s=this.getContext(e.vglobal.createCanvas({width:1,height:1}));this.contextAndRatio=s,this._board=new Array((this._size[0]>>5)*this._size[1]).fill(0),this._bounds=null;const n=t.length;let o=0;this.result=[];const h=t.map((t=>({text:this.getText(t),fontFamily:this.getTextFontFamily(t),fontStyle:this.getTextFontStyle(t),fontWeight:this.getTextFontWeight(t),angle:this.getTextRotate(t),fontSize:~~this.getTextFontSize(t),padding:this.getTextPadding(t),xoff:0,yoff:0,x1:0,y1:0,x0:0,y0:0,hasText:!1,sprite:null,datum:t,x:0,y:0,width:0,height:0}))).sort((function(t,i){return i.fontSize-t.fontSize}));this.data=h;let r=0;for(;o<n;){if(this.layoutWord(o)||r>=2?(o++,r=0):r++,this.progressiveIndex=o,this.exceedTime())break}if(!this.options.clip&&this.options.enlarge&&this._bounds&&this.shrinkBoard(this._bounds),this._bounds&&["cardioid","triangle","triangle-upright"].includes(this.options.shape)){const t=(this._bounds[0].y+this._bounds[1].y)/2;this._dy=-(t-this._size[1]/2)}return this.result}formatTagItem(t){const i=this._size,e=this.zoomRatio(),s=this.dy(),n=i[0]>>1,o=i[1]>>1,h=t.length,r=[];let a,l;for(let i=0;i<h;++i)a=t[i],l={},l.datum=a.datum,l.x=(a.x+n)*e,l.y=(a.y+o+s)*e,l.fontFamily=a.fontFamily,l.fontSize=a.fontSize*e,l.fontStyle=a.fontStyle,l.fontWeight=a.fontWeight,l.angle=a.angle,r.push(l);return r}output(){return this.outputCallback?this.outputCallback(this.formatTagItem(this.result)):this.formatTagItem(this.result)}progressiveOutput(){return this.outputCallback?this.outputCallback(this.formatTagItem(this.progressiveResult)):this.formatTagItem(this.progressiveResult)}updateBoardExpandStatus(t){this._isBoardExpandCompleted=t*(this._originSize[0]/this._size[0])<this.options.minFontSize}shouldShrinkContinue(){return!this.options.clip&&this.options.shrink&&!this._isBoardExpandCompleted}shrinkBoard(t){const i=t[0],e=t[1];if(e.x>=this._size[0]||e.y>=this._size[1])return;const s=Math.min(i.x,this._size[0]-e.x),n=Math.min(i.y,this._size[1]-e.y),o=2*Math.min(s/this._size[0],n/this._size[1]);this._size=this._size.map((t=>t*(1-o)))}expandBoard(t,i){const e=this._size[0]*(i||1.1)-this._size[0]>>5;let s=2*e>2?e:2;s%2!=0&&s++;let n=Math.ceil(this._size[1]*(s<<5)/this._size[0]);n%2!=0&&n++;const o=this._size[0],h=this._size[1],r=new Array(s).fill(0),a=new Array(n/2*(s+(o>>5))).fill(0);this.insertZerosToArray(t,h*(o>>5),a.length+s/2);for(let i=h-1;i>0;i--)this.insertZerosToArray(t,i*(o>>5),r.length);this.insertZerosToArray(t,0,a.length+s/2),this._size=[o+(s<<5),h+n]}insertZerosToArray(t,i,e){const s=Math.floor(e/d),n=e%d;for(let e=0;e<s;e++)t.splice(i+e*d,0,...new Array(d).fill(0));t.splice(i+s*d,0,...new Array(n).fill(0))}getContext(t){t.width=1,t.height=1;const i=t.getContext("2d").getImageData(0,0,1,1),e=Math.sqrt(i.data.length>>2);t.width=(this.cw<<5)/e,t.height=this.ch/e;const s=t.getContext("2d");return s.fillStyle=s.strokeStyle="red",s.textAlign="center",{context:s,ratio:e,canvas:t}}place(t,i,e,s){let n=!1;if(this.shouldShrinkContinue()&&(i.width>this._size[0]||i.height>this._size[1]))return this._placeStatus=1,!1;const o=this.random()<.5?1:-1;if(!this.shouldShrinkContinue()&&this.isSizeLargerThanMax(i,o))return null;const h=i.x,r=i.y,a=Math.sqrt(this._size[0]*this._size[0]+this._size[1]*this._size[1]),l=this.spiral(this._size);let u,d,c,m,y=-o;for(this._tTemp=null,this._dtTemp=null;u=l(y+=o);){d=u[0],c=u[1];const l=Math.sqrt(d**2+c**2);let z=Math.atan(c/d);d<0?z+=Math.PI:c<0&&(z=2*Math.PI+z);const T=this.shape(z);if(Math.min(Math.abs(d),Math.abs(c))>=a)break;if(l>=s)n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);else{if(i.x=h+~~(l*T*Math.cos(-z)),i.y=r+~~(l*T*Math.sin(-z)),m=i,this.options.clip)if(this.shouldShrinkContinue()){if(p(m,this._size)){n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);continue}}else{if(f(m,this._size)){n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);continue}p(m,this._size)&&(m=x(m,this._size))}else if(p(m,this._size)){n&&null===this._tTemp&&(this._tTemp=y,this._dtTemp=o);continue}if(n=!0,!(e&&(M=m,S=e,!(M.x+M.x1>S[0].x&&M.x+M.x0<S[1].x&&M.y+M.y1>S[0].y&&M.y+M.y0<S[1].y))||e&&g(m,t,this._size))){const e=m.sprite,s=m.width>>5,n=this._size[0]>>5,o=m.x-(s<<4),h=127&o,r=32-h,a=m.y1-m.y0;let l,u=(m.y+m.y0)*n+(o>>5);for(let i=0;i<a;i++){l=0;for(let n=0;n<=s;n++)t[u+n]|=l<<r|(n<s?(l=e[i*s+n])>>>h:0);u+=n}return i.sprite=null,m.sprite=null,!0}}}var M,S;return null!==this._tTemp&&(this._placeStatus=3),!this.shouldShrinkContinue()&&this.setCache(m,o),!1}clearCache(){this.cacheMap.clear()}setCache(t,i){const e=`${t.angle}-${i}`,s=t.x1-t.x0,n=t.y1-t.y0;if(!this.cacheMap.has(e))return void this.cacheMap.set(e,{width:s,height:n});const{width:o,height:h}=this.cacheMap.get(e);(s<o&&n<h||s<=o&&n<h)&&this.cacheMap.set(e,{width:s,height:n})}isSizeLargerThanMax(t,i){const e=`${t.angle}-${i}`;if(!this.cacheMap.has(e))return!1;const{width:s,height:n}=this.cacheMap.get(e),o=t.x1-t.x0,h=t.y1-t.y0;return o>=s&&h>=n}}function g(t,i,e){const s=e[0]>>5,n=t.sprite,o=t.width>>5,h=t.x-(o<<4),r=127&h,a=32-r,l=t.y1-t.y0;let u,d=(t.y+t.y0)*s+(h>>5);for(let t=0;t<l;t++){u=0;for(let e=0;e<=o;e++)if((u<<a|(e<o?(u=n[t*o+e])>>>r:0))&i[d+e])return!0;d+=s}return!1}c.defaultOptions={enlarge:!1,minFontSize:2};const f=(t,i)=>t.x+t.x0>i[0]||t.y+t.y0>i[0]||t.x+t.x1<0||t.y+t.y1<0,p=(t,i)=>t.x+t.x0<0||t.y+t.y0<0||t.x+t.x1>i[0]||t.y+t.y1>i[1];function x(t,i){const e=t.sprite,s=t.y1-t.y0,n=t.width>>5;let o=0;const h=[],r=Math.max(-(t.y0+t.y),0),a=Math.min(s+(i[1]-(t.y1+t.y)),s),l=Math.max(-(t.x0+t.x),0)>>5,u=Math.min(n+(i[0]-(t.x1+t.x)>>5)+1,n);for(let t=0;t<s;t++){for(let i=0;i<n;i++)t<r||a<=t||i<l||u<=i||h.push(e[o+i]);o+=n}const d=l<<5,c=n-u<<5,g=r,f=s-a;return Object.assign(Object.assign({},t),{width:t.width-d-c,height:t.height-g-f,x0:t.x0+d,x1:t.x1-c,y0:t.y0+g,y1:t.y1-f,x:t.x+d/2-c/2,sprite:h})}class m extends l{constructor(t){super(Object.assign({},m.defaultOptions,t)),this.fillGridAt=(t,i)=>{t>=this.ngx||i>=this.ngy||t<0||i<0||(this.grid[t][i]=!1)},this.updateGrid=(t,i,e,s,n)=>{const o=n.occupied;let h=o.length;for(;h--;){const e=t+o[h][0],s=i+o[h][1];e>=this.ngx||s>=this.ngy||e<0||s<0||this.fillGridAt(e,s)}},this.gridSize=Math.max(Math.floor(this.options.gridSize),4)}getPointsAtRadius(t){if(this.pointsAtRadius[t])return this.pointsAtRadius[t];const i=8*t;let e=i;const s=[];for(0===t&&s.push([this.center[0],this.center[1],0]);e--;){const n=this.shape(e/i*2*Math.PI);s.push([this.center[0]+t*n*Math.cos(-e/i*2*Math.PI),this.center[1]+t*n*Math.sin(-e/i*2*Math.PI)*this.options.ellipticity,e/i*2*Math.PI])}return this.pointsAtRadius[t]=s,s}getTextInfo(t,i=1){var e;const s=this.options.clip?1:i,n=Math.max(Math.floor(this.getTextFontSize(t)*s),this.options.minFontSize);let o=this.getText(t)+"";if(this.options.clip&&(o=o.slice(0,Math.ceil(o.length*i))),!o)return null;const h=this.getTextFontWeight(t),r=this.getTextFontStyle(t),a=this.getTextRotate&&null!==(e=this.getTextRotate(t))&&void 0!==e?e:0,l=this.getTextFontFamily(t),u=document.createElement("canvas"),d=u.getContext("2d",{willReadFrequently:!0});d.font=r+" "+h+" "+n.toString(10)+"px "+l;const c=d.measureText(o).width,g=Math.max(n,d.measureText("m").width,d.measureText("W").width);let f=c+2*g,p=3*g;const x=Math.ceil(f/this.gridSize),m=Math.ceil(p/this.gridSize);f=x*this.gridSize,p=m*this.gridSize;const y=-c/2,M=.4*-g,S=Math.ceil((f*Math.abs(Math.sin(a))+p*Math.abs(Math.cos(a)))/this.gridSize),z=Math.ceil((f*Math.abs(Math.cos(a))+p*Math.abs(Math.sin(a)))/this.gridSize),T=z*this.gridSize,_=S*this.gridSize;u.setAttribute("width",""+T),u.setAttribute("height",""+_),d.scale(1,1),d.translate(T/2,_/2),d.rotate(-a),d.font=r+" "+h+" "+n.toString(10)+"px "+l,d.fillStyle="#000",d.textBaseline="middle",d.fillText(o,y,M);const v=d.getImageData(0,0,T,_).data;if(this.exceedTime())return null;const b=[];let w,F=z;const R=[S/2,z/2,S/2,z/2],I=(t,i,e)=>{let s=this.gridSize;for(;s--;){let n=this.gridSize;for(;n--;)if(v[4*((i*this.gridSize+s)*T+(t*this.gridSize+n))+3])return e.push([t,i]),t<R[3]&&(R[3]=t),t>R[1]&&(R[1]=t),i<R[0]&&(R[0]=i),void(i>R[2]&&(R[2]=i))}};for(;F--;)for(w=S;w--;)I(F,w,b);return{datum:t,occupied:b,bounds:R,gw:z,gh:S,fillTextOffsetX:y,fillTextOffsetY:M,fillTextWidth:c,fillTextHeight:g,fontSize:n,fontStyle:r,fontWeight:h,fontFamily:l,angle:a,text:o}}canFitText(t,i,e,s,n){let o=n.length;for(;o--;){const e=t+n[o][0],s=i+n[o][1];if(e>=this.ngx||s>=this.ngy||e<0||s<0){if(!this.options.drawOutOfBound)return!1}else if(!this.grid[e][s])return!1}return!0}layoutWord(t,i=1){const e=this.data[t],n=this.getTextInfo(e,i);if(!n)return!1;if(this.exceedTime())return!1;if(!this.options.drawOutOfBound&&(!this.options.shrink||n.fontSize<=this.options.minFontSize)&&!this.options.clip){const t=n.bounds;if(t[1]-t[3]+1>this.ngx||t[2]-t[0]+1>this.ngy)return!1}let o=this.maxRadius+1;const h=t=>{const i=Math.floor(t[0]-n.gw/2),e=Math.floor(t[1]-n.gh/2),s=n.gw,h=n.gh;return!!this.canFitText(i,e,s,h,n.occupied)&&(n.distance=this.maxRadius-o,n.theta=t[2],this.outputText(i,e,n),this.updateGrid(i,e,s,h,n),!0)};for(;o--;){let t=this.getPointsAtRadius(this.maxRadius-o);this.options.random&&(t=[].concat(t),s.shuffleArray(t));if(t.some(h))return!0}return(this.options.clip||!!(this.options.shrink&&n.fontSize>this.options.minFontSize))&&this.layoutWord(t,.75*i)}outputText(t,i,e){const s=this.getTextColor(e),n={text:e.text,datum:e.datum,color:s,fontStyle:e.fontStyle,fontWeight:e.fontWeight,fontFamily:e.fontFamily,angle:e.angle,width:e.fillTextWidth,height:e.fillTextHeight,x:(t+e.gw/2)*this.gridSize,y:(i+e.gh/2)*this.gridSize+e.fillTextOffsetY+.5*e.fontSize,fontSize:e.fontSize};this.result.push(n),this.progressiveResult&&this.progressiveResult.push(n)}initGrid(t){let i;if(this.grid=[],t){let e=document.createElement("canvas").getContext("2d");e.fillStyle=this.options.backgroundColor,e.fillRect(0,0,1,1);let s=e.getImageData(0,0,1,1).data,n=t.getContext("2d").getImageData(0,0,this.ngx*this.gridSize,this.ngy*this.gridSize).data;const o=(t,e)=>{let o=this.gridSize;for(;o--;){let h=this.gridSize;for(;h--;)for(i=4;i--;)if(n[4*((e*this.gridSize+o)*this.ngx*this.gridSize+(t*this.gridSize+h))+i]!==s[i])return void(this.grid[t][e]=!1)}};let h=this.ngx;for(;h--;){this.grid[h]=[];let t=this.ngy;for(;t--;)o(h,t),!1!==this.grid[h][t]&&(this.grid[h][t]=!0)}n=e=s=void 0}else{let t=this.ngx;for(;t--;){this.grid[t]=[];let i=this.ngy;for(;i--;)this.grid[t][i]=!0}}}layout(t,i){this.initProgressive(),this.data=t,this.pointsAtRadius=[],this.ngx=Math.floor(i.width/this.gridSize),this.ngy=Math.floor(i.height/this.gridSize);const{center:e,maxRadius:s}=h(this.options.shape,[i.width,i.height]);this.center=i.origin?[i.origin[0]/this.gridSize,i.origin[1]/this.gridSize]:[e[0]/this.gridSize,e[1]/this.gridSize],this.maxRadius=Math.floor(s/this.gridSize),this.initGrid(i.canvas),this.result=[];let n=0;for(;n<t.length&&(this.layoutWord(n),n++,this.progressiveIndex=n,!this.exceedTime()););return this.result}}m.defaultOptions={gridSize:8,ellipticity:1};class y extends l{constructor(t){super(Object.assign({},y.defaultOptions,t)),this.random=this.options.random?Math.random:()=>0,this.aspectRatio=1}fit(t){for(let i=0,e=this.result.length;i<e;i++)if(M(t,this.result[i]))return!1;return!0}getTextInfo(t){const i={datum:t,fontSize:this.getTextFontSize(t),fontWeight:this.getTextFontWeight(t),fontStyle:this.getTextFontStyle(t),fontFamily:this.getTextFontFamily(t),angle:this.getTextRotate(t),text:this.getText(t)+"",x:this.center[0],y:this.center[1]},s=e.getTextBounds(i);return i.width=s.width(),i.height=s.height(),i.top=this.center[1]-i.height+.21*i.height,i.left=this.center[0]-i.width/2,i}layoutWord(t){const i=this.getTextInfo(this.data[t]);let e=2*Math.PI,s=0,n=i.left,o=i.top;const h=i.width,r=i.height;let a=1,l=this.fit(i);for(;!l&&s<this.maxRadius;)s+=.5,a=this.shape(s/this.maxRadius*2*Math.PI),e+=.5*(this.options.random?this.random()>.5?1:-1:t%2==0?1:-1),n=this.center[0]-h/2+s*a*Math.cos(e)*this.aspectRatio,o=this.center[1]-r/2+s*a*Math.sin(e),i.left=n,i.top=o,i.x=n+h/2,i.y=o+r/2,l=this.fit(i);return!!l&&(!!(this.options.clip||i.left>=0&&i.left+i.width<=this.width&&i.top>=0&&i.top+i.height<=this.height)&&(this.result.push(i),!0))}layout(t,i){if(!(null==t?void 0:t.length))return[];this.initProgressive(),this.result=[],this.maxRadius=Math.sqrt(i.width*i.width+i.height*i.height)/2,this.center=[i.width/2,i.height/2],this.width=i.width,this.height=i.height,this.data=t.sort(((t,i)=>this.getTextFontSize(i)-this.getTextFontSize(t)));let e=0;for(;e<t.length&&(this.layoutWord(e),e++,this.progressiveIndex=e,!this.exceedTime()););return this.result}}function M(t,i){return!(t.left+t.width<i.left||t.top+t.height<i.top||t.left>i.left+i.width||t.top>i.top+i.height)}y.defaultOptions={enlarge:!1};const S={x:"x",y:"y",z:"z",fontFamily:"fontFamily",fontSize:"fontSize",fontStyle:"fontStyle",fontWeight:"fontWeight",angle:"angle"},z=(t,i)=>{var e,n,o,h,r,a;if(t.size&&(t.size[0]<=0||t.size[1]<=0)){return s.Logger.getInstance().info("Wordcloud size dimensions must be greater than 0"),[]}const l=i,u=(null!==(e=t.size)&&void 0!==e?e:[500,500]).slice();u[0]=Math.floor(u[0]),u[1]=Math.floor(u[1]);const d=t.fontFamily?T(t.fontFamily):"sans-serif",g=t.fontStyle?T(t.fontStyle):"normal",f=t.fontWeight?T(t.fontWeight):"normal",p=t.rotate?T(t.rotate):0,x=T(t.text),M=null!==(n=t.spiral)&&void 0!==n?n:"archimedean",z=t.padding?T(t.padding):1,_=null!==(o=t.shape)&&void 0!==o?o:"square",F=null!==(h=t.shrink)&&void 0!==h&&h,R=null!==(r=t.enlarge)&&void 0!==r&&r,I=null!==(a=t.clip)&&void 0!==a&&a,k=t.minFontSize,C=t.randomVisible,P=t.as||S,W=t.depth_3d,O=t.postProjection;let A=t.fontSize?T(t.fontSize):14;const q=t.fontSizeRange;if(q&&!s.isNumber(A)){const t=A,i=v(b(t,l),q);A=e=>i(t(e))}let B=c;"fast"===t.layoutType?B=y:"grid"===t.layoutType&&(B=m);const G=new B({text:x,padding:z,spiral:M,shape:_,rotate:p,fontFamily:d,fontStyle:g,fontWeight:f,fontSize:A,shrink:F,clip:I,enlarge:R,minFontSize:k,random:C,progressiveStep:t.progressiveStep,progressiveTime:t.progressiveTime,outputCallback:t=>{const i=[];let e,s;for(let n=0,o=t.length;n<o;n++)s=t[n],e=s.datum,e[P.x]=s.x,e[P.y]=s.y,e[P.fontFamily]=s.fontFamily,e[P.fontSize]=s.fontSize,e[P.fontStyle]=s.fontStyle,e[P.fontWeight]=s.fontWeight,e[P.angle]=s.angle,"StereographicProjection"===O&&w(u,s,e,P,W),i.push(e);return i}});return G.layout(l,{width:u[0],height:u[1]}),t.progressiveStep>0||t.progressiveTime>0?{progressive:G}:G.output()},T=t=>s.isString(t)||s.isNumber(t)||s.isFunction(t)?t:i=>i[t.field],_=t=>t<0?-Math.sqrt(-t):Math.sqrt(t),v=(t,i)=>{if(t[0]===t[1])return t=>i[0];const e=_(t[0]),s=_(t[1]),n=Math.min(e,s),o=Math.max(e,s);return t=>(_(t)-n)/(o-n)*(i[1]-i[0])+i[0]},b=(t,i)=>{let e=1/0,n=-1/0;const o=i.length;let h;for(let r=0;r<o;++r)h=s.toNumber(t(i[r])),h<e&&(e=h),h>n&&(n=h);return 1===i.length&&e===n&&(e-=1e4),[e,n]};function w(t,i,e,s,n){const o=Math.max(t[0],t[1])/2,h=function(t,i,e,s,n){const{x:o,y:h}=n,r=o/t*Math.PI*2;let a=Math.PI-h/i*Math.PI;a+=(a<Math.PI/2?1:-1)*Math.pow(Math.min(a-Math.PI/2,1),2)/5;const l=e*Math.sin(a)*Math.cos(r)+s.x,u=e*Math.cos(a)+s.y,d=e*Math.sin(a)*Math.sin(r)+s.z;return{x:l,y:u,z:d}}(t[0],t[1],o,{x:o,y:o,z:null!=n?n:o},i);e[s.x]=h.x,e[s.y]=h.y,e[s.z]=h.z}t.registerWordCloudTransforms=()=>{i.registerTransform("wordcloud",{transform:z,markPhase:"beforeJoin"},!0)}}));

@@ -1,2 +0,2 @@

import { global } from "@visactor/vrender";
import { vglobal } from "@visactor/vrender";

@@ -60,3 +60,3 @@ import { isString } from "@visactor/vutils";

this.clearCache(), this._originSize = [ ...this._size ];
const contextAndRatio = this.getContext(global.createCanvas({
const contextAndRatio = this.getContext(vglobal.createCanvas({
width: 1,

@@ -63,0 +63,0 @@ height: 1

import { CloudLayout } from "./cloud-layout";
import { isFunction, isNumber, isString, toNumber } from "@visactor/vutils";
import { isFunction, isNumber, isString, toNumber, Logger } from "@visactor/vutils";

@@ -9,4 +9,2 @@ import { GridLayout } from "./grid-layout";

import { error } from "@visactor/vgrammar-util";
const OUTPUT = {

@@ -25,4 +23,6 @@ x: "x",

var _a, _b, _c, _d, _e, _f;
if (options.size && (options.size[0] <= 0 || options.size[1] <= 0)) return error("Wordcloud size dimensions must be greater than 0"),
[];
if (options.size && (options.size[0] <= 0 || options.size[1] <= 0)) {
return Logger.getInstance().info("Wordcloud size dimensions must be greater than 0"),
[];
}
const data = upstreamData, canvasSize = (null !== (_a = options.size) && void 0 !== _a ? _a : [ 500, 500 ]).slice();

@@ -29,0 +29,0 @@ canvasSize[0] = Math.floor(canvasSize[0]), canvasSize[1] = Math.floor(canvasSize[1]);

{
"name": "@visactor/vgrammar-wordcloud",
"version": "0.5.5",
"version": "0.6.0",
"description": "WordCloud layout transform for VGrammar",

@@ -27,6 +27,6 @@ "keywords": [

"dependencies": {
"@visactor/vrender": "~0.13.10",
"@visactor/vgrammar": "0.5.5",
"@visactor/vgrammar-util": "0.5.5",
"@visactor/vutils": "~0.13.3"
"@visactor/vgrammar": "0.6.0",
"@visactor/vgrammar-util": "0.6.0",
"@visactor/vrender": "~0.14.2",
"@visactor/vutils": "~0.15.5"
},

@@ -33,0 +33,0 @@ "devDependencies": {

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc