UNPKG

@visactor/vgrammar-core

Version:

VGrammar is a visual grammar library

367 lines (298 loc) 15.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.configureScale = exports.parseScaleConfig = exports.parseScaleDomainRange = exports.createScale = void 0; const vutils_1 = require("@visactor/vutils"), vscale_1 = require("@visactor/vscale"), util_1 = require("./util"), vgrammar_util_1 = require("@visactor/vgrammar-util"); function createScale(type) { switch (type) { case "band": return new vscale_1.BandScale; case "linear": return new vscale_1.LinearScale; case "log": return new vscale_1.LogScale; case "ordinal": return new vscale_1.OrdinalScale; case "point": return new vscale_1.PointScale; case "pow": return new vscale_1.PowScale; case "quantile": return new vscale_1.QuantileScale; case "quantize": return new vscale_1.QuantizeScale; case "sqrt": return new vscale_1.SqrtScale; case "symlog": return new vscale_1.SymlogScale; case "threshold": return new vscale_1.ThresholdScale; case "time": return new vscale_1.TimeScale; case "utc": return new vscale_1.TimeScale(!0); case "identity": return new vscale_1.IdentityScale; } return new vscale_1.LinearScale; } function isScaleDataType(spec) { return !(0, vutils_1.isNil)(null == spec ? void 0 : spec.data); } function parseScaleDataType(spec, view) { var _a; if ((0, vutils_1.isString)(spec.data)) { const data = view.getGrammarById(spec.data); return data ? [ data ] : []; } return "data" === (null === (_a = spec.data) || void 0 === _a ? void 0 : _a.grammarType) ? [ spec.data ] : []; } function isMultiScaleDataType(spec) { return !(0, vutils_1.isNil)(null == spec ? void 0 : spec.datas); } function parseMultiScaleDataType(spec, view) { if (spec && spec.datas && spec.datas.length) { const res = []; return spec.datas.forEach((data => { const gramarBase = parseScaleDataType(data, view); gramarBase.length && res.push(gramarBase[0]); })), res; } return []; } function isScaleCoordinateType(spec) { return !(0, vutils_1.isNil)(null == spec ? void 0 : spec.coordinate); } function parseScaleCoordinateType(spec, view) { var _a; if ((0, vutils_1.isString)(spec.coordinate)) { const coordinate = view.getCoordinateById(spec.coordinate); return coordinate ? [ coordinate ] : []; } return "coordinate" === (null === (_a = spec.coordinate) || void 0 === _a ? void 0 : _a.grammarType) ? [ spec.coordinate ] : []; } function parseLinearScale(spec, view) { let dependencies = []; return dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.nice, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.niceMin, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.niceMax, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.min, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.max, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.zero, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.roundRange, view)), dependencies; } function parsePowScale(spec, view) { return parseLinearScale(spec, view).concat((0, util_1.parseFunctionType)(spec.exponent, view)); } function parseSymlogScale(spec, view) { return parseLinearScale(spec, view).concat((0, util_1.parseFunctionType)(spec.constant, view)); } function parseLogScale(spec, view) { let dependencies = []; return dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.nice, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.min, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.max, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.zero, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.roundRange, view)), dependencies; } function parseQuantizeScale(spec, view) { let dependencies = []; return dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.nice, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.niceMin, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.niceMax, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.min, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.max, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.zero, view)), dependencies; } function parseOrdinalScale(spec, view) { return []; } function parseBaseBandScale(spec, view) { let dependencies = []; return dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.round, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.padding, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.paddingInner, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.paddingOuter, view)), dependencies = dependencies.concat((0, util_1.parseFunctionType)(spec.align, view)), dependencies; } function parseBandScale(spec, view) { return parseBaseBandScale(spec, view).concat((0, util_1.parseFunctionType)(spec.paddingInner, view)); } function parsePointScale(spec, view) { return parseBaseBandScale(spec, view); } function parseScaleDomainRange(domain, view) { return isScaleDataType(domain) ? parseScaleDataType(domain, view) : isMultiScaleDataType(domain) ? parseMultiScaleDataType(domain, view) : isScaleCoordinateType(domain) ? parseScaleCoordinateType(domain, view) : (0, util_1.parseFunctionType)(domain, view); } function parseScaleConfig(type, config, view) { if ((0, vutils_1.isNil)(config)) return []; const deps = (0, util_1.parseFunctionType)(config.unknown, view); switch (type) { case "linear": case "sqrt": return deps.concat(parseLinearScale(config, view)); case "ordinal": return deps.concat(parseOrdinalScale(config, view)); case "band": return deps.concat(parseBandScale(config, view)); case "point": return deps.concat(parsePointScale(config, view)); case "pow": return deps.concat(parsePowScale(config, view)); case "log": case "time": case "utc": return deps.concat(parseLogScale(config, view)); case "symlog": return deps.concat(parseSymlogScale(config, view)); case "quantize": return deps.concat(parseQuantizeScale(config, view)); } return deps; } function configureScaleNice(spec, scale, parameters) { const nice = (0, util_1.invokeFunctionType)(spec.nice, parameters, scale); !0 === nice ? scale.nice() : (0, vutils_1.isValidNumber)(nice) && scale.nice(nice); } function configureScaleNiceMinMax(spec, scale, parameters) { const niceMax = (0, util_1.invokeFunctionType)(spec.niceMax, parameters, scale); !0 === niceMax ? scale.niceMax() : (0, vutils_1.isValidNumber)(niceMax) && scale.niceMax(niceMax); const niceMin = (0, util_1.invokeFunctionType)(spec.niceMin, parameters, scale); !0 === niceMin ? scale.niceMin() : (0, vutils_1.isValidNumber)(niceMin) && scale.niceMin(niceMin); } function configureScaleDomain(spec, scale, parameters) { const min = (0, util_1.invokeFunctionType)(spec.min, parameters, scale), max = (0, util_1.invokeFunctionType)(spec.max, parameters, scale), zero = (0, util_1.invokeFunctionType)(spec.zero, parameters, scale), hasValidMin = (0, vutils_1.isValidNumber)(min), hasValidmax = (0, vutils_1.isValidNumber)(max), prevDomain = scale.domain(); if (2 === prevDomain.length && (hasValidMin || hasValidmax || zero)) { let newMin = Math.min(prevDomain[0], prevDomain[prevDomain.length - 1]), newMax = Math.max(prevDomain[0], prevDomain[prevDomain.length - 1]); zero && newMin > 0 ? newMin = 0 : hasValidMin && (newMin = Math.min(newMin, min)), zero && newMax < 0 ? newMax = 0 : hasValidmax && (newMax = Math.max(newMax, max)), scale.domain([ newMin, newMax ], !0); } } function configureContinuousScale(spec, scale, parameters) { var _a; (0, util_1.invokeFunctionType)(spec.roundRange, parameters, scale) && scale.rangeRound(scale.range(), !0); const {interpolate: interpolate, clamp: clamp} = null !== (_a = (0, util_1.invokeFunctionType)(spec.config, parameters, scale)) && void 0 !== _a ? _a : {}; interpolate && scale.interpolate(interpolate, !0), (0, vutils_1.isNil)(clamp) || ((0, vutils_1.isFunction)(clamp) ? scale.clamp(!0, clamp, !0) : scale.clamp(clamp, void 0, !0)); const tickCount = (0, util_1.invokeFunctionType)(spec.tickCount, parameters, scale); tickCount && scale.tickData(tickCount); } function configureLinearScale(spec, scale, parameters) { configureScaleNice(spec, scale, parameters), configureScaleNiceMinMax(spec, scale, parameters), configureScaleDomain(spec, scale, parameters), configureContinuousScale(spec, scale, parameters); } function configurePowScale(spec, scale, parameters) { configureLinearScale(spec, scale, parameters); const exponent = (0, util_1.invokeFunctionType)(spec.exponent, parameters, scale); exponent > 0 && scale.exponent(exponent); } function configureLogScale(spec, scale, parameters) { configureScaleNice(spec, scale, parameters), configureScaleDomain(spec, scale, parameters); const base = (0, util_1.invokeFunctionType)(spec.base, parameters, scale); base > 0 && scale.base(base), configureContinuousScale(spec, scale, parameters); } function configureSqrtScale(spec, scale, parameters) { configureLinearScale(spec, scale, parameters); } function configureTimeScale(spec, scale, parameters) { configureScaleNice(spec, scale, parameters), configureScaleDomain(spec, scale, parameters), configureContinuousScale(spec, scale, parameters); } function configureSymlogScale(spec, scale, parameters) { configureLinearScale(spec, scale, parameters); const constant = (0, util_1.invokeFunctionType)(spec.constant, parameters, scale); (0, vutils_1.isValidNumber)(constant) && scale.constant(constant); } function configureQuantizeScale(spec, scale, parameters) { configureScaleNice(spec, scale, parameters), configureScaleNiceMinMax(spec, scale, parameters), configureScaleDomain(spec, scale, parameters); } function configureBaseBandScale(spec, scale, parameters) { spec.round && scale.round((0, util_1.invokeFunctionType)(spec.round, parameters, scale), !0), spec.padding && scale.padding((0, util_1.invokeFunctionType)(spec.padding, parameters, scale), !0), spec.paddingInner && scale.paddingInner((0, util_1.invokeFunctionType)(spec.paddingInner, parameters, scale), !0), spec.paddingOuter && scale.paddingOuter((0, util_1.invokeFunctionType)(spec.paddingOuter, parameters, scale), !0), spec.align && scale.align((0, util_1.invokeFunctionType)(spec.align, parameters, scale), !0); } function configureBandScale(spec, scale, parameters) { return configureBaseBandScale(spec, scale, parameters); } function configurePointScale(spec, scale, parameters) { return configureBaseBandScale(spec, scale, parameters); } function parseFieldData(spec, parameters) { const field = spec.field, refData = (0, util_1.getGrammarOutput)(spec.data, parameters), fieldData = []; if ((0, vutils_1.isArray)(field)) field.forEach((entry => { const getter = (0, vgrammar_util_1.field)(entry); refData && refData.forEach((datum => { fieldData.push(getter(datum)); })); })); else { const getter = (0, vgrammar_util_1.field)(field); refData && refData.forEach((datum => { fieldData.push(getter(datum)); })); } return fieldData; } function parseMultiFieldData(spec, parameters) { let fieldData = []; return spec.datas.forEach((entry => { fieldData = fieldData.concat(parseFieldData(entry, parameters)); })), fieldData; } function parseScaleDataTypeValue(fieldData, scale, sort, filterNumber) { return sort && fieldData.sort(sort), (0, vscale_1.isContinuous)(scale.type) ? (filterNumber && fieldData.filter((entry => (0, vutils_1.isNumber)(entry))), [ (0, vutils_1.minInArray)(fieldData), (0, vutils_1.maxInArray)(fieldData) ]) : fieldData; } function configureScale(spec, scale, parameters) { if (isScaleDataType(spec.domain) ? scale.domain(parseScaleDataTypeValue(parseFieldData(spec.domain, parameters), scale, spec.domain.sort, !0), !0) : isMultiScaleDataType(spec.domain) ? scale.domain(parseScaleDataTypeValue(parseMultiFieldData(spec.domain, parameters), scale, spec.domain.sort, !0), !0) : scale.domain((0, util_1.invokeFunctionType)(spec.domain, parameters, scale), !0), "identity" !== spec.type) if (isScaleDataType(spec.range)) scale.range(parseScaleDataTypeValue(parseFieldData(spec.range, parameters), scale), !0); else if (isMultiScaleDataType(spec.range)) scale.range(parseScaleDataTypeValue(parseMultiFieldData(spec.range, parameters), scale), !0); else if (isScaleCoordinateType(spec.range)) { const coord = (0, util_1.getGrammarOutput)(spec.range.coordinate, parameters); !(0, vscale_1.isDiscretizing)(scale.type) && coord && scale.range(coord.getRangeByDimension(spec.range.dimension, spec.range.isSubshaft, spec.range.reversed)); } else scale.range((0, util_1.invokeFunctionType)(spec.range, parameters, scale), !0); switch ((0, vutils_1.isNil)(spec.unknown) || scale.unknown((0, util_1.invokeFunctionType)(spec.unknown, parameters, scale)), spec.type) { case "linear": configureLinearScale(spec, scale, parameters), scale.rescale(); break; case "band": configureBandScale(spec, scale, parameters), scale.rescale(); break; case "point": configurePointScale(spec, scale, parameters), scale.rescale(); break; case "pow": configurePowScale(spec, scale, parameters), scale.rescale(); break; case "log": configureLogScale(spec, scale, parameters), scale.rescale(); break; case "sqrt": configureSqrtScale(spec, scale, parameters), scale.rescale(); break; case "symlog": configureSymlogScale(spec, scale, parameters), scale.rescale(); break; case "time": case "utc": configureTimeScale(spec, scale, parameters), scale.rescale(); break; case "quantize": configureQuantizeScale(spec, scale, parameters), scale.rescale(); break; case "quantile": scale.rescale(); } } exports.createScale = createScale, exports.parseScaleDomainRange = parseScaleDomainRange, exports.parseScaleConfig = parseScaleConfig, exports.configureScale = configureScale; //# sourceMappingURL=scale.js.map