UNPKG

@antv/util

Version:

> AntV 底层依赖的工具库,不建议在自己业务中使用。

69 lines (55 loc) 1.7 kB
import { finalizeSegment } from './finalize-segment'; import { paramsCount } from './params-count'; import { scanFlag } from './scan-flag'; import { scanParam } from './scan-param'; import { skipSpaces } from './skip-spaces'; import { isPathCommand } from './is-path-command'; import { isDigitStart } from './is-digit-start'; import { isArcCommand } from './is-arc-command'; import type { PathParser } from './path-parser'; /** * Scans every character in the path string to determine * where a segment starts and where it ends. */ export function scanSegment(path: PathParser) { const { max, pathValue, index } = path; const cmdCode = pathValue.charCodeAt(index); const reqParams = paramsCount[pathValue[index].toLowerCase()]; path.segmentStart = index; if (!isPathCommand(cmdCode)) { path.err = `[path-util]: Invalid path value "${pathValue[index]}" is not a path command`; return; } path.index += 1; skipSpaces(path); path.data = []; if (!reqParams) { // Z finalizeSegment(path); return; } for (;;) { for (let i = reqParams; i > 0; i -= 1) { if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path); else scanParam(path); if (path.err.length) { return; } path.data.push(path.param); skipSpaces(path); // after ',' param is mandatory if (path.index < max && pathValue.charCodeAt(path.index) === 0x2c /* , */) { path.index += 1; skipSpaces(path); } } if (path.index >= path.max) { break; } // Stop on next segment if (!isDigitStart(pathValue.charCodeAt(path.index))) { break; } } finalizeSegment(path); }