{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/plots/word-cloud/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { Chart, Types } from '@antv/g2';\r\nimport { isArray, isFunction, isString } from '@antv/util';\r\nimport { Params } from '../../core/adaptor';\r\nimport { Datum } from '../../types';\r\nimport { getContainerSize, LEVEL, log } from '../../utils';\r\nimport { normalPadding } from '../../utils/padding';\r\nimport { functor, wordCloud } from '../../utils/transform/word-cloud';\r\nimport { Tag, Word, WordCloudOptions, WordStyle } from './types';\r\n\r\n/**\r\n * 用 DataSet 转换词云图数据\r\n * @param params\r\n */\r\nexport function transform(params: Params): Tag[] {\r\n const { options: rawOptions, chart } = params;\r\n const { width, height, padding: chartPadding, appendPadding, ele } = chart as Chart;\r\n const {\r\n data,\r\n imageMask,\r\n wordField,\r\n weightField,\r\n colorField,\r\n wordStyle,\r\n timeInterval,\r\n random,\r\n spiral,\r\n autoFit = true,\r\n placementStrategy,\r\n } = rawOptions;\r\n if (!data || !data.length) {\r\n return [];\r\n }\r\n const { fontFamily, fontWeight, padding, fontSize } = wordStyle;\r\n const arr = getSingleKeyValues(data, weightField);\r\n const range = [min(arr), max(arr)] as [number, number];\r\n\r\n // 变换出 text 和 value 字段\r\n const words = data.map(\r\n (datum: Datum): Word => ({\r\n text: datum[wordField],\r\n value: datum[weightField],\r\n color: datum[colorField],\r\n datum, // 存一下原始数据\r\n })\r\n );\r\n\r\n const options = {\r\n imageMask: imageMask as HTMLImageElement,\r\n font: fontFamily,\r\n fontSize: getFontSizeMapping(fontSize, range),\r\n fontWeight: fontWeight,\r\n // 图表宽高减去 padding 之后的宽高\r\n size: getSize({\r\n width,\r\n height,\r\n padding: chartPadding,\r\n appendPadding,\r\n autoFit,\r\n container: ele,\r\n }),\r\n padding: padding,\r\n timeInterval,\r\n random,\r\n spiral,\r\n rotate: getRotate(rawOptions),\r\n };\r\n\r\n // 自定义布局函数\r\n if (isFunction(placementStrategy)) {\r\n const result = words.map((word: Word, index: number, words: Word[]) => ({\r\n ...word,\r\n hasText: !!word.text,\r\n font: functor(options.font)(word, index, words),\r\n weight: functor(options.fontWeight)(word, index, words),\r\n rotate: functor(options.rotate)(word, index, words),\r\n size: functor(options.fontSize)(word, index, words),\r\n style: 'normal',\r\n ...placementStrategy.call(chart, word, index, words),\r\n }));\r\n\r\n // 添加两个参照数据,分别表示左上角和右下角\r\n result.push({\r\n text: '',\r\n value: 0,\r\n x: 0,\r\n y: 0,\r\n opacity: 0,\r\n });\r\n result.push({\r\n text: '',\r\n value: 0,\r\n x: options.size[0],\r\n y: options.size[1],\r\n opacity: 0,\r\n });\r\n\r\n return result;\r\n }\r\n\r\n // 数据准备在外部做,wordCloud 单纯就是做布局\r\n return wordCloud(words, options);\r\n}\r\n\r\n/**\r\n * 获取最终的实际绘图尺寸:[width, height]\r\n * @param chart\r\n */\r\nexport function getSize(options: {\r\n width: number;\r\n height: number;\r\n padding: Types.ViewPadding;\r\n appendPadding: Types.ViewAppendPadding;\r\n autoFit: boolean;\r\n container: HTMLElement;\r\n}): [number, number] {\r\n let { width, height } = options;\r\n const { container, autoFit, padding, appendPadding } = options;\r\n\r\n // 由于词云图每个词语的坐标都是先通过 DataSet 根据图表宽高计算出来的,\r\n // 也就是说,如果一开始提供给 DataSet 的宽高信息和最终显示的宽高不相同,\r\n // 那么就会出现布局错乱的情况,所以这里处理的目的就是让一开始提供给 DataSet 的\r\n // 宽高信息与最终显示的宽高信息相同,避免显示错乱。\r\n if (autoFit) {\r\n const containerSize = getContainerSize(container);\r\n width = containerSize.width;\r\n height = containerSize.height;\r\n }\r\n\r\n // 宽高不能为 0,否则会造成死循环\r\n width = width || 400;\r\n height = height || 400;\r\n\r\n const [top, right, bottom, left] = resolvePadding({ padding, appendPadding });\r\n const result = [width - (left + right), height - (top + bottom)];\r\n\r\n return result as [number, number];\r\n}\r\n\r\n/**\r\n * 根据图表的 padding 和 appendPadding 计算出图表的最终 padding\r\n * @param chart\r\n */\r\nfunction resolvePadding(options: { padding: Types.ViewPadding; appendPadding: Types.ViewAppendPadding }) {\r\n const padding = normalPadding(options.padding);\r\n const appendPadding = normalPadding(options.appendPadding);\r\n const top = padding[0] + appendPadding[0];\r\n const right = padding[1] + appendPadding[1];\r\n const bottom = padding[2] + appendPadding[2];\r\n const left = padding[3] + appendPadding[3];\r\n\r\n return [top, right, bottom, left];\r\n}\r\n\r\n/**\r\n * 处理 imageMask 可能为 url 字符串的情况\r\n * @param {HTMLImageElement | string} img\r\n * @return {Promise}\r\n */\r\nexport function processImageMask(img: HTMLImageElement | string): Promise {\r\n return new Promise((res, rej) => {\r\n if (img instanceof HTMLImageElement) {\r\n res(img);\r\n return;\r\n }\r\n if (isString(img)) {\r\n const image = new Image();\r\n image.crossOrigin = 'anonymous';\r\n image.src = img;\r\n image.onload = () => {\r\n res(image);\r\n };\r\n image.onerror = () => {\r\n log(LEVEL.ERROR, false, 'image %s load failed !!!', img);\r\n rej();\r\n };\r\n return;\r\n }\r\n log(LEVEL.WARN, img === undefined, 'The type of imageMask option must be String or HTMLImageElement.');\r\n rej();\r\n });\r\n}\r\n\r\n/**\r\n * 把用户提供的 fontSize 值转换成符合 DataSet 要求的值\r\n * @param options\r\n * @param range\r\n */\r\nexport function getFontSizeMapping(fontSize: WordStyle['fontSize'], range?: [number, number]) {\r\n if (isFunction(fontSize)) {\r\n return fontSize;\r\n }\r\n if (isArray(fontSize)) {\r\n const [fMin, fMax] = fontSize;\r\n if (!range) {\r\n return () => (fMax + fMin) / 2;\r\n }\r\n const [min, max] = range;\r\n if (max === min) {\r\n return () => (fMax + fMin) / 2;\r\n }\r\n return function fontSize({ value }) {\r\n return ((fMax - fMin) / (max - min)) * (value - min) + fMin;\r\n };\r\n }\r\n return () => fontSize;\r\n}\r\n\r\nexport function getSingleKeyValues(data: Datum[], key: string) {\r\n return data\r\n .map((v) => v[key])\r\n .filter((v) => {\r\n // 过滤非 number\r\n if (typeof v === 'number' && !isNaN(v)) return true;\r\n return false;\r\n });\r\n}\r\n\r\n/**\r\n * 把用户提供的关于旋转角度的字段值转换成符合 DataSet 要求的值\r\n * @param options\r\n */\r\nfunction getRotate(options: WordCloudOptions) {\r\n const { rotation, rotationSteps } = resolveRotate(options);\r\n if (!isArray(rotation)) return rotation;\r\n const min = rotation[0];\r\n const max = rotation[1];\r\n // 等于 1 时不旋转,所以把每份大小设为 0\r\n const perSize = rotationSteps === 1 ? 0 : (max - min) / (rotationSteps - 1);\r\n return function rotate() {\r\n if (max === min) return max;\r\n return Math.floor(Math.random() * rotationSteps) * perSize;\r\n };\r\n}\r\n\r\n/**\r\n * 确保值在要求范围内\r\n * @param options\r\n */\r\nfunction resolveRotate(options: WordCloudOptions) {\r\n let { rotationSteps } = options.wordStyle;\r\n if (rotationSteps < 1) {\r\n log(LEVEL.WARN, false, 'The rotationSteps option must be greater than or equal to 1.');\r\n rotationSteps = 1;\r\n }\r\n return {\r\n rotation: options.wordStyle.rotation,\r\n rotationSteps,\r\n };\r\n}\r\n\r\n/**\r\n * 传入一个元素为数字的数组,\r\n * 返回该数组中值最小的数字。\r\n * @param numbers\r\n */\r\nfunction min(numbers: number[]) {\r\n return Math.min(...numbers);\r\n}\r\n\r\n/**\r\n * 传入一个元素为数字的数组,\r\n * 返回该数组中值最大的数字。\r\n * @param numbers\r\n */\r\nfunction max(numbers: number[]) {\r\n return Math.max(...numbers);\r\n}\r\n"]}