123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696 |
- import { each, isObject, isArray, createHashMap, map, assert, isString, indexOf, isStringSafe, isNumber } from 'zrender/lib/core/util.js';
- import env from 'zrender/lib/core/env.js';
- import { isNumeric, getRandomIdBase, getPrecision, round } from './number.js';
- import { warn } from './log.js';
- function interpolateNumber(p0, p1, percent) {
- return (p1 - p0) * percent + p0;
- }
- var DUMMY_COMPONENT_NAME_PREFIX = 'series\0';
- var INTERNAL_COMPONENT_ID_PREFIX = '\0_ec_\0';
- export function normalizeToArray(value) {
- return value instanceof Array ? value : value == null ? [] : [value];
- }
- export function defaultEmphasis(opt, key, subOpts) {
-
- if (opt) {
- opt[key] = opt[key] || {};
- opt.emphasis = opt.emphasis || {};
- opt.emphasis[key] = opt.emphasis[key] || {};
-
- for (var i = 0, len = subOpts.length; i < len; i++) {
- var subOptName = subOpts[i];
- if (!opt.emphasis[key].hasOwnProperty(subOptName) && opt[key].hasOwnProperty(subOptName)) {
- opt.emphasis[key][subOptName] = opt[key][subOptName];
- }
- }
- }
- }
- export var TEXT_STYLE_OPTIONS = ['fontStyle', 'fontWeight', 'fontSize', 'fontFamily', 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding'];
- export function getDataItemValue(dataItem) {
- return isObject(dataItem) && !isArray(dataItem) && !(dataItem instanceof Date) ? dataItem.value : dataItem;
- }
- export function isDataItemOption(dataItem) {
- return isObject(dataItem) && !(dataItem instanceof Array);
-
-
- }
- ;
- export function mappingToExists(existings, newCmptOptions, mode) {
- var isNormalMergeMode = mode === 'normalMerge';
- var isReplaceMergeMode = mode === 'replaceMerge';
- var isReplaceAllMode = mode === 'replaceAll';
- existings = existings || [];
- newCmptOptions = (newCmptOptions || []).slice();
- var existingIdIdxMap = createHashMap();
-
- each(newCmptOptions, function (cmptOption, index) {
- if (!isObject(cmptOption)) {
- newCmptOptions[index] = null;
- return;
- }
- if (process.env.NODE_ENV !== 'production') {
-
-
- if (cmptOption.id != null && !isValidIdOrName(cmptOption.id)) {
- warnInvalidateIdOrName(cmptOption.id);
- }
- if (cmptOption.name != null && !isValidIdOrName(cmptOption.name)) {
- warnInvalidateIdOrName(cmptOption.name);
- }
- }
- });
- var result = prepareResult(existings, existingIdIdxMap, mode);
- if (isNormalMergeMode || isReplaceMergeMode) {
- mappingById(result, existings, existingIdIdxMap, newCmptOptions);
- }
- if (isNormalMergeMode) {
- mappingByName(result, newCmptOptions);
- }
- if (isNormalMergeMode || isReplaceMergeMode) {
- mappingByIndex(result, newCmptOptions, isReplaceMergeMode);
- } else if (isReplaceAllMode) {
- mappingInReplaceAllMode(result, newCmptOptions);
- }
- makeIdAndName(result);
-
-
- return result;
- }
- function prepareResult(existings, existingIdIdxMap, mode) {
- var result = [];
- if (mode === 'replaceAll') {
- return result;
- }
-
-
- for (var index = 0; index < existings.length; index++) {
- var existing = existings[index];
-
- if (existing && existing.id != null) {
- existingIdIdxMap.set(existing.id, index);
- }
-
-
-
-
-
- result.push({
- existing: mode === 'replaceMerge' || isComponentIdInternal(existing) ? null : existing,
- newOption: null,
- keyInfo: null,
- brandNew: null
- });
- }
- return result;
- }
- function mappingById(result, existings, existingIdIdxMap, newCmptOptions) {
-
- each(newCmptOptions, function (cmptOption, index) {
- if (!cmptOption || cmptOption.id == null) {
- return;
- }
- var optionId = makeComparableKey(cmptOption.id);
- var existingIdx = existingIdIdxMap.get(optionId);
- if (existingIdx != null) {
- var resultItem = result[existingIdx];
- assert(!resultItem.newOption, 'Duplicated option on id "' + optionId + '".');
- resultItem.newOption = cmptOption;
-
-
- resultItem.existing = existings[existingIdx];
- newCmptOptions[index] = null;
- }
- });
- }
- function mappingByName(result, newCmptOptions) {
-
- each(newCmptOptions, function (cmptOption, index) {
- if (!cmptOption || cmptOption.name == null) {
- return;
- }
- for (var i = 0; i < result.length; i++) {
- var existing = result[i].existing;
- if (!result[i].newOption
-
- && existing && (existing.id == null || cmptOption.id == null) && !isComponentIdInternal(cmptOption) && !isComponentIdInternal(existing) && keyExistAndEqual('name', existing, cmptOption)) {
- result[i].newOption = cmptOption;
- newCmptOptions[index] = null;
- return;
- }
- }
- });
- }
- function mappingByIndex(result, newCmptOptions, brandNew) {
- each(newCmptOptions, function (cmptOption) {
- if (!cmptOption) {
- return;
- }
-
- var resultItem;
- var nextIdx = 0;
- while (
-
- (resultItem = result[nextIdx]
-
-
-
-
-
-
- ) && (resultItem.newOption || isComponentIdInternal(resultItem.existing) ||
-
- resultItem.existing && cmptOption.id != null && !keyExistAndEqual('id', cmptOption, resultItem.existing))) {
- nextIdx++;
- }
- if (resultItem) {
- resultItem.newOption = cmptOption;
- resultItem.brandNew = brandNew;
- } else {
- result.push({
- newOption: cmptOption,
- brandNew: brandNew,
- existing: null,
- keyInfo: null
- });
- }
- nextIdx++;
- });
- }
- function mappingInReplaceAllMode(result, newCmptOptions) {
- each(newCmptOptions, function (cmptOption) {
-
-
- result.push({
- newOption: cmptOption,
- brandNew: true,
- existing: null,
- keyInfo: null
- });
- });
- }
- function makeIdAndName(mapResult) {
-
-
-
-
-
-
-
-
-
- var idMap = createHashMap();
- each(mapResult, function (item) {
- var existing = item.existing;
- existing && idMap.set(existing.id, item);
- });
- each(mapResult, function (item) {
- var opt = item.newOption;
-
- assert(!opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, 'id duplicates: ' + (opt && opt.id));
- opt && opt.id != null && idMap.set(opt.id, item);
- !item.keyInfo && (item.keyInfo = {});
- });
-
- each(mapResult, function (item, index) {
- var existing = item.existing;
- var opt = item.newOption;
- var keyInfo = item.keyInfo;
- if (!isObject(opt)) {
- return;
- }
-
-
-
-
- keyInfo.name = opt.name != null ? makeComparableKey(opt.name) : existing ? existing.name
-
-
- : DUMMY_COMPONENT_NAME_PREFIX + index;
- if (existing) {
- keyInfo.id = makeComparableKey(existing.id);
- } else if (opt.id != null) {
- keyInfo.id = makeComparableKey(opt.id);
- } else {
-
-
-
-
-
- var idNum = 0;
- do {
- keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++;
- } while (idMap.get(keyInfo.id));
- }
- idMap.set(keyInfo.id, item);
- });
- }
- function keyExistAndEqual(attr, obj1, obj2) {
- var key1 = convertOptionIdName(obj1[attr], null);
- var key2 = convertOptionIdName(obj2[attr], null);
-
- return key1 != null && key2 != null && key1 === key2;
- }
- function makeComparableKey(val) {
- if (process.env.NODE_ENV !== 'production') {
- if (val == null) {
- throw new Error();
- }
- }
- return convertOptionIdName(val, '');
- }
- export function convertOptionIdName(idOrName, defaultValue) {
- if (idOrName == null) {
- return defaultValue;
- }
- return isString(idOrName) ? idOrName : isNumber(idOrName) || isStringSafe(idOrName) ? idOrName + '' : defaultValue;
- }
- function warnInvalidateIdOrName(idOrName) {
- if (process.env.NODE_ENV !== 'production') {
- warn('`' + idOrName + '` is invalid id or name. Must be a string or number.');
- }
- }
- function isValidIdOrName(idOrName) {
- return isStringSafe(idOrName) || isNumeric(idOrName);
- }
- export function isNameSpecified(componentModel) {
- var name = componentModel.name;
-
- return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX));
- }
- export function isComponentIdInternal(cmptOption) {
- return cmptOption && cmptOption.id != null && makeComparableKey(cmptOption.id).indexOf(INTERNAL_COMPONENT_ID_PREFIX) === 0;
- }
- export function makeInternalComponentId(idSuffix) {
- return INTERNAL_COMPONENT_ID_PREFIX + idSuffix;
- }
- export function setComponentTypeToKeyInfo(mappingResult, mainType, componentModelCtor) {
-
- each(mappingResult, function (item) {
- var newOption = item.newOption;
- if (isObject(newOption)) {
- item.keyInfo.mainType = mainType;
- item.keyInfo.subType = determineSubType(mainType, newOption, item.existing, componentModelCtor);
- }
- });
- }
- function determineSubType(mainType, newCmptOption, existComponent, componentModelCtor) {
- var subType = newCmptOption.type ? newCmptOption.type : existComponent ? existComponent.subType
-
- : componentModelCtor.determineSubType(mainType, newCmptOption);
-
- return subType;
- }
- export function compressBatches(batchA, batchB) {
- var mapA = {};
- var mapB = {};
- makeMap(batchA || [], mapA);
- makeMap(batchB || [], mapB, mapA);
- return [mapToArray(mapA), mapToArray(mapB)];
- function makeMap(sourceBatch, map, otherMap) {
- for (var i = 0, len = sourceBatch.length; i < len; i++) {
- var seriesId = convertOptionIdName(sourceBatch[i].seriesId, null);
- if (seriesId == null) {
- return;
- }
- var dataIndices = normalizeToArray(sourceBatch[i].dataIndex);
- var otherDataIndices = otherMap && otherMap[seriesId];
- for (var j = 0, lenj = dataIndices.length; j < lenj; j++) {
- var dataIndex = dataIndices[j];
- if (otherDataIndices && otherDataIndices[dataIndex]) {
- otherDataIndices[dataIndex] = null;
- } else {
- (map[seriesId] || (map[seriesId] = {}))[dataIndex] = 1;
- }
- }
- }
- }
- function mapToArray(map, isData) {
- var result = [];
- for (var i in map) {
- if (map.hasOwnProperty(i) && map[i] != null) {
- if (isData) {
- result.push(+i);
- } else {
- var dataIndices = mapToArray(map[i], true);
- dataIndices.length && result.push({
- seriesId: i,
- dataIndex: dataIndices
- });
- }
- }
- }
- return result;
- }
- }
- export function queryDataIndex(data, payload) {
- if (payload.dataIndexInside != null) {
- return payload.dataIndexInside;
- } else if (payload.dataIndex != null) {
- return isArray(payload.dataIndex) ? map(payload.dataIndex, function (value) {
- return data.indexOfRawIndex(value);
- }) : data.indexOfRawIndex(payload.dataIndex);
- } else if (payload.name != null) {
- return isArray(payload.name) ? map(payload.name, function (value) {
- return data.indexOfName(value);
- }) : data.indexOfName(payload.name);
- }
- }
- export function makeInner() {
- var key = '__ec_inner_' + innerUniqueIndex++;
- return function (hostObj) {
- return hostObj[key] || (hostObj[key] = {});
- };
- }
- var innerUniqueIndex = getRandomIdBase();
- export function parseFinder(ecModel, finderInput, opt) {
- var _a = preParseFinder(finderInput, opt),
- mainTypeSpecified = _a.mainTypeSpecified,
- queryOptionMap = _a.queryOptionMap,
- others = _a.others;
- var result = others;
- var defaultMainType = opt ? opt.defaultMainType : null;
- if (!mainTypeSpecified && defaultMainType) {
- queryOptionMap.set(defaultMainType, {});
- }
- queryOptionMap.each(function (queryOption, mainType) {
- var queryResult = queryReferringComponents(ecModel, mainType, queryOption, {
- useDefault: defaultMainType === mainType,
- enableAll: opt && opt.enableAll != null ? opt.enableAll : true,
- enableNone: opt && opt.enableNone != null ? opt.enableNone : true
- });
- result[mainType + 'Models'] = queryResult.models;
- result[mainType + 'Model'] = queryResult.models[0];
- });
- return result;
- }
- export function preParseFinder(finderInput, opt) {
- var finder;
- if (isString(finderInput)) {
- var obj = {};
- obj[finderInput + 'Index'] = 0;
- finder = obj;
- } else {
- finder = finderInput;
- }
- var queryOptionMap = createHashMap();
- var others = {};
- var mainTypeSpecified = false;
- each(finder, function (value, key) {
-
- if (key === 'dataIndex' || key === 'dataIndexInside') {
- others[key] = value;
- return;
- }
- var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || [];
- var mainType = parsedKey[1];
- var queryType = (parsedKey[2] || '').toLowerCase();
- if (!mainType || !queryType || opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) {
- return;
- }
- mainTypeSpecified = mainTypeSpecified || !!mainType;
- var queryOption = queryOptionMap.get(mainType) || queryOptionMap.set(mainType, {});
- queryOption[queryType] = value;
- });
- return {
- mainTypeSpecified: mainTypeSpecified,
- queryOptionMap: queryOptionMap,
- others: others
- };
- }
- export var SINGLE_REFERRING = {
- useDefault: true,
- enableAll: false,
- enableNone: false
- };
- export var MULTIPLE_REFERRING = {
- useDefault: false,
- enableAll: true,
- enableNone: true
- };
- export function queryReferringComponents(ecModel, mainType, userOption, opt) {
- opt = opt || SINGLE_REFERRING;
- var indexOption = userOption.index;
- var idOption = userOption.id;
- var nameOption = userOption.name;
- var result = {
- models: null,
- specified: indexOption != null || idOption != null || nameOption != null
- };
- if (!result.specified) {
-
- var firstCmpt = void 0;
- result.models = opt.useDefault && (firstCmpt = ecModel.getComponent(mainType)) ? [firstCmpt] : [];
- return result;
- }
- if (indexOption === 'none' || indexOption === false) {
- assert(opt.enableNone, '`"none"` or `false` is not a valid value on index option.');
- result.models = [];
- return result;
- }
-
-
- if (indexOption === 'all') {
- assert(opt.enableAll, '`"all"` is not a valid value on index option.');
- indexOption = idOption = nameOption = null;
- }
- result.models = ecModel.queryComponents({
- mainType: mainType,
- index: indexOption,
- id: idOption,
- name: nameOption
- });
- return result;
- }
- export function setAttribute(dom, key, value) {
- dom.setAttribute ? dom.setAttribute(key, value) : dom[key] = value;
- }
- export function getAttribute(dom, key) {
- return dom.getAttribute ? dom.getAttribute(key) : dom[key];
- }
- export function getTooltipRenderMode(renderModeOption) {
- if (renderModeOption === 'auto') {
-
- return env.domSupported ? 'html' : 'richText';
- } else {
- return renderModeOption || 'html';
- }
- }
- export function groupData(array, getKey // return key
- ) {
- var buckets = createHashMap();
- var keys = [];
- each(array, function (item) {
- var key = getKey(item);
- (buckets.get(key) || (keys.push(key), buckets.set(key, []))).push(item);
- });
- return {
- keys: keys,
- buckets: buckets
- };
- }
- export function interpolateRawValues(data, precision, sourceValue, targetValue, percent) {
- var isAutoPrecision = precision == null || precision === 'auto';
- if (targetValue == null) {
- return targetValue;
- }
- if (isNumber(targetValue)) {
- var value = interpolateNumber(sourceValue || 0, targetValue, percent);
- return round(value, isAutoPrecision ? Math.max(getPrecision(sourceValue || 0), getPrecision(targetValue)) : precision);
- } else if (isString(targetValue)) {
- return percent < 1 ? sourceValue : targetValue;
- } else {
- var interpolated = [];
- var leftArr = sourceValue;
- var rightArr = targetValue;
- var length_1 = Math.max(leftArr ? leftArr.length : 0, rightArr.length);
- for (var i = 0; i < length_1; ++i) {
- var info = data.getDimensionInfo(i);
-
- if (info && info.type === 'ordinal') {
-
- interpolated[i] = (percent < 1 && leftArr ? leftArr : rightArr)[i];
- } else {
- var leftVal = leftArr && leftArr[i] ? leftArr[i] : 0;
- var rightVal = rightArr[i];
- var value = interpolateNumber(leftVal, rightVal, percent);
- interpolated[i] = round(value, isAutoPrecision ? Math.max(getPrecision(leftVal), getPrecision(rightVal)) : precision);
- }
- }
- return interpolated;
- }
- }
|