{"version":3,"file":"index.mjs","names":["kGrammar: {[key: string]: RegExp[]}","components: string[][]","component: string[]","tokens: string[][]","x: number","y: number","relations: Point[]","result: SvgItem | undefined","values: string[]","result: SvgControlPoint[]","previous: SvgItem | null","toStr","outputPath: SvgItem[]","outputPath: SvgItem[]","i"],"sources":["../path-parser.ts","../svg.ts","../get-sub-path-bounds.ts","../reverse-path.ts","../optimize-path.ts","../change-path-origin.ts"],"sourcesContent":["const kCommandTypeRegex = /^[\\t\\n\\f\\r ]*([MLHVZCSQTAmlhvzcsqta])[\\t\\n\\f\\r ]*/;\nconst kFlagRegex = /^[01]/;\nconst kNumberRegex = /^[+-]?(([0-9]*\\.[0-9]+)|([0-9]+\\.)|([0-9]+))([eE][+-]?[0-9]+)?/;\nconst kCoordinateRegex = kNumberRegex;\nconst kCommaWsp = /^(([\\t\\n\\f\\r ]+,?[\\t\\n\\f\\r ]*)|(,[\\t\\n\\f\\r ]*))/;\n\nconst kGrammar: {[key: string]: RegExp[]}  = {\n    M: [kCoordinateRegex, kCoordinateRegex],\n    L: [kCoordinateRegex, kCoordinateRegex],\n    H: [kCoordinateRegex],\n    V: [kCoordinateRegex],\n    Z: [],\n    C: [kCoordinateRegex, kCoordinateRegex, kCoordinateRegex, kCoordinateRegex, kCoordinateRegex, kCoordinateRegex],\n    S: [kCoordinateRegex, kCoordinateRegex, kCoordinateRegex, kCoordinateRegex],\n    Q: [kCoordinateRegex, kCoordinateRegex, kCoordinateRegex, kCoordinateRegex],\n    T: [kCoordinateRegex, kCoordinateRegex],\n    A: [kNumberRegex, kNumberRegex, kCoordinateRegex, kFlagRegex, kFlagRegex, kCoordinateRegex, kCoordinateRegex],\n};\n\nexport class PathParser {\n\n    static components(type: string, path: string, cursor: number): [number, string[][]]\n    {\n        const expectedRegexList = kGrammar[type.toUpperCase()];\n\n        const components: string[][] = [];\n        while (cursor <= path.length) {\n            const component: string[] = [type];\n            for (const regex of expectedRegexList) {\n                const match = path.slice(cursor).match(regex);\n\n                if (match !== null) {\n                    component.push(match[0]);\n                    cursor += match[0].length;\n                    const ws = path.slice(cursor).match(kCommaWsp);\n                    if (ws !== null) {\n                        cursor += ws[0].length;\n                    }\n                } else if (component.length === 1 && components.length >= 1) {\n                    return [cursor, components];\n                } else {\n                    throw new Error('malformed path (first error at ' + cursor + ')');\n                }\n            }\n            components.push(component);\n            if (expectedRegexList.length === 0) {\n                return [cursor, components];\n            }\n            if (type === 'm') {\n                type = 'l';\n            }\n            if (type === 'M') {\n                type = 'L';\n            }\n        }\n        throw new Error('malformed path (first error at ' + cursor + ')');\n    }\n\n    public static parse(path: string): string[][] {\n        let cursor = 0;\n        let tokens: string[][] = [];\n        while (cursor < path.length) {\n            const match = path.slice(cursor).match(kCommandTypeRegex);\n            if (match !== null) {\n                const command = match[1];\n                if(cursor === 0 && command.toLowerCase() !== 'm') {\n                    throw new Error('malformed path (first error at ' + cursor + ')');\n                }\n                cursor += match[0].length;\n                const componentList = PathParser.components(command, path, cursor);\n                cursor = componentList[0];\n                tokens = [...tokens, ...componentList[1]];\n            } else {\n                throw new Error('malformed path (first error at ' + cursor + ')');\n            }\n        }\n        return tokens;\n    }\n}\n","import { PathParser } from './path-parser';\n\nexport function formatNumber(v: number, d: number, minify = false): string {\n    let result = v.toFixed(d)\n        .replace(/^(-?[0-9]*\\.([0-9]*[1-9])?)0*$/, '$1')\n        .replace(/\\.$/, '');\n    if (minify) {\n        result = result.replace(/^(-?)0\\./, '$1.');\n    }\n    return result;\n}\n\nexport class Point {\n    constructor(\n        public x: number,\n        public y: number\n    ){}\n }\n\nexport class SvgPoint extends Point {\n    itemReference: SvgItem = new DummySvgItem();\n    movable = true;\n    constructor(\n        x: number,\n        y: number,\n        movable = true\n    ){\n        super(x, y);\n        this.movable = movable;\n    }\n }\nexport class SvgControlPoint extends SvgPoint {\n    subIndex = 0;\n    constructor(\n        point: Point,\n        public relations: Point[],\n        movable = true\n    ){\n        super(point.x, point.y, movable);\n    }\n }\n\nexport abstract class SvgItem {\n\n    constructor(values: number[], relative: boolean) {\n        this.values = values;\n        this.relative = relative;\n    }\n    relative: boolean;\n    values: number[];\n    previousPoint: Point = new Point(0, 0);\n    absolutePoints: SvgPoint[] = [];\n    absoluteControlPoints: SvgControlPoint[] = [];\n\n    public static Make(rawItem: string[]): SvgItem {\n        let result: SvgItem | undefined = undefined;\n        const relative = rawItem[0].toUpperCase() !== rawItem[0];\n        const values = rawItem.slice(1).map( it => parseFloat(it) );\n        switch (rawItem[0].toUpperCase()) {\n            case MoveTo.key: result = new MoveTo(values, relative); break;\n            case LineTo.key: result = new LineTo(values, relative); break;\n            case HorizontalLineTo.key: result = new HorizontalLineTo(values, relative); break;\n            case VerticalLineTo.key: result = new VerticalLineTo(values, relative); break;\n            case ClosePath.key: result = new ClosePath(values, relative); break;\n            case CurveTo.key: result = new CurveTo(values, relative); break;\n            case SmoothCurveTo.key: result = new SmoothCurveTo(values, relative); break;\n            case QuadraticBezierCurveTo.key: result = new QuadraticBezierCurveTo(values, relative); break;\n            case SmoothQuadraticBezierCurveTo.key: result = new SmoothQuadraticBezierCurveTo(values, relative); break;\n            case EllipticalArcTo.key: result = new EllipticalArcTo(values, relative); break;\n        }\n        if(!result) {\n            throw 'Invalid SVG item';\n        }\n        return result;\n    }\n\n    public static MakeFrom(origin: SvgItem, previous: SvgItem, newType: string) {\n        const target = origin.targetLocation();\n        const x = target.x.toString();\n        const y = target.y.toString();\n        let values: string[] = [];\n        const absoluteType = newType.toUpperCase();\n        switch (absoluteType) {\n            case MoveTo.key: values = [MoveTo.key, x, y]; break;\n            case LineTo.key: values = [LineTo.key, x, y]; break;\n            case HorizontalLineTo.key: values = [HorizontalLineTo.key, x]; break;\n            case VerticalLineTo.key: values = [VerticalLineTo.key, y]; break;\n            case ClosePath.key: values = [ClosePath.key]; break;\n            case CurveTo.key: values = [CurveTo.key, '0', '0', '0', '0', x, y]; break;\n            case SmoothCurveTo.key: values = [SmoothCurveTo.key, '0', '0', x, y]; break;\n            case QuadraticBezierCurveTo.key: values = [QuadraticBezierCurveTo.key, '0', '0', x, y]; break;\n            case SmoothQuadraticBezierCurveTo.key: values = [SmoothQuadraticBezierCurveTo.key, x, y]; break;\n            case EllipticalArcTo.key: values = [EllipticalArcTo.key, '1' , '1', '0', '0', '0', x, y]; break;\n        }\n        const result = SvgItem.Make(values);\n\n        const controlPoints = origin.absoluteControlPoints;\n\n        result.previousPoint = previous.targetLocation();\n        result.absolutePoints = [target];\n        result.resetControlPoints(previous);\n\n        if ((origin instanceof CurveTo || origin instanceof SmoothCurveTo)\n        && (result instanceof CurveTo || result instanceof SmoothCurveTo)) {\n            if (result instanceof CurveTo) {\n                result.values[0] = controlPoints[0].x;\n                result.values[1] = controlPoints[0].y;\n                result.values[2] = controlPoints[1].x;\n                result.values[3] = controlPoints[1].y;\n            }\n            if (result instanceof SmoothCurveTo) {\n                result.values[0] = controlPoints[1].x;\n                result.values[1] = controlPoints[1].y;\n            }\n        }\n\n        if ((origin instanceof QuadraticBezierCurveTo || origin instanceof SmoothQuadraticBezierCurveTo)\n        && (result instanceof QuadraticBezierCurveTo)) {\n            result.values[0] = controlPoints[0].x;\n            result.values[1] = controlPoints[0].y;\n        }\n\n        if (newType !== absoluteType) {\n            result.setRelative(true);\n        }\n        return result;\n    }\n\n    protected refreshAbsolutePoints(origin: Point, previous: SvgItem | null) {\n        this.previousPoint = previous ? previous.targetLocation() : new Point(0, 0);\n        this.absolutePoints = [];\n        let current = previous ? previous.targetLocation() : new Point(0, 0);\n        if (!this.relative) {\n            current = new Point(0, 0);\n        }\n        for (let i = 0 ; i < this.values.length - 1 ; i += 2) {\n            this.absolutePoints.push(\n                new SvgPoint(current.x + this.values[i], current.y + this.values[i + 1])\n            );\n        }\n    }\n\n    public setRelative(newRelative: boolean) {\n        if (this.relative !== newRelative) {\n            this.relative = false;\n            if (newRelative) {\n                this.translate(-this.previousPoint.x, -this.previousPoint.y);\n                this.relative = true;\n            } else {\n                this.translate(this.previousPoint.x, this.previousPoint.y);\n            }\n        }\n    }\n\n    protected refreshAbsoluteControlPoints(origin: Point, previous: SvgItem | null) {\n        this.absoluteControlPoints = [];\n    }\n\n    public resetControlPoints(previousTarget: SvgItem) {\n        // Does nothing by default\n    }\n\n    public refresh(origin: Point, previous: SvgItem | null) {\n        this.refreshAbsolutePoints(origin, previous);\n        this.refreshAbsoluteControlPoints(origin, previous);\n        this.absolutePoints.forEach(it => it.itemReference = this );\n        this.absoluteControlPoints.forEach(it => it.itemReference = this);\n    }\n\n    public translate(x: number, y: number, force = false) {\n        if (!this.relative || force) {\n            this.values.forEach( (val, idx) => {\n                this.values[idx] = val + (idx % 2 === 0 ? x : y);\n            });\n        }\n    }\n\n    public scale(kx: number, ky: number) {\n        this.values.forEach( (val, idx) => {\n            this.values[idx] = val * (idx % 2 === 0 ? kx : ky);\n        });\n    }\n\n    public rotate(ox: number, oy: number, degrees: number, force = false) {\n        const rad = degrees * Math.PI / 180;\n        const cos = Math.cos(rad);\n        const sin = Math.sin(rad);\n        for(let i = 0 ; i < this.values.length ; i += 2) {\n            const px = this.values[i];\n            const py = this.values[i + 1];\n            const x = this.relative && !force ? 0 : ox;\n            const y = this.relative && !force ? 0 : oy;\n            const qx = x + (px - x) * cos - (py - y) * sin;\n            const qy = y + (px - x) * sin + (py - y) * cos;\n            this.values[i] = qx;\n            this.values[i + 1] = qy;\n        }\n    }\n\n    public targetLocation(): SvgPoint {\n        const l = this.absolutePoints.length;\n        return this.absolutePoints[l - 1];\n    }\n\n    public setTargetLocation(pts: Point) {\n        const loc = this.targetLocation();\n        const dx = pts.x - loc.x;\n        const dy = pts.y - loc.y;\n        const l = this.values.length;\n        this.values[l - 2] += dx;\n        this.values[l - 1] += dy;\n    }\n\n    public setControlLocation(idx: number, pts: Point) {\n        const loc = this.absolutePoints[idx];\n        const dx = pts.x - loc.x;\n        const dy = pts.y - loc.y;\n        this.values[2 * idx] += dx;\n        this.values[2 * idx + 1] += dy;\n    }\n\n    public controlLocations(): SvgControlPoint[] {\n        return this.absoluteControlPoints;\n    }\n\n    public getType(ignoreIsRelative = false): string {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        let typeKey = (this.constructor as any).key as string;\n        if (this.relative && !ignoreIsRelative) {\n            typeKey = typeKey.toLowerCase();\n        }\n        return typeKey;\n    }\n\n    public asStandaloneString(): string {\n        return ['M',\n            this.previousPoint.x,\n            this.previousPoint.y,\n            this.getType(),\n            ...this.values\n        ].join(' ');\n    }\n\n    public asString(decimals = 4, minify = false, trailingItems: SvgItem[] = []): string {\n        const strValues = [this.values, ...trailingItems.map(it => it.values)]\n            .reduce((acc, val) => acc.concat(val), [])\n            .map(it => formatNumber(it, decimals, minify));\n        return [this.getType(), ...strValues].join(' ');\n    }\n}\n\nclass DummySvgItem extends SvgItem {\n    constructor() {\n        super([], false);\n    }\n}\nclass MoveTo extends SvgItem {\n    static readonly key = 'M';\n}\nclass LineTo extends SvgItem {\n    static readonly key = 'L';\n}\nclass CurveTo extends SvgItem {\n    static readonly key = 'C';\n    protected override refreshAbsoluteControlPoints(origin: Point, previousTarget: SvgItem | null) {\n        if(!previousTarget) {\n            throw 'Invalid path';\n        }\n        this.absoluteControlPoints = [\n            new SvgControlPoint(this.absolutePoints[0], [previousTarget.targetLocation()]),\n            new SvgControlPoint(this.absolutePoints[1], [this.targetLocation()])\n        ];\n    }\n    public override resetControlPoints(previousTarget: SvgItem) {\n        const a = previousTarget.targetLocation();\n        const b = this.targetLocation();\n        const d = this.relative ? a : new Point(0, 0);\n        this.values[0] = 2 * a.x / 3 + b.x / 3 - d.x;\n        this.values[1] = 2 * a.y / 3 + b.y / 3 - d.y;\n        this.values[2] = a.x / 3 + 2 * b.x / 3 - d.x;\n        this.values[3] = a.y / 3 + 2 * b.y / 3 - d.y;\n    }\n}\nclass SmoothCurveTo extends SvgItem {\n    static readonly key = 'S';\n    protected override refreshAbsoluteControlPoints(origin: Point, previousTarget: SvgItem | null) {\n        this.absoluteControlPoints = [];\n        if ((previousTarget instanceof CurveTo || previousTarget instanceof SmoothCurveTo)) {\n            const prevLoc = previousTarget.targetLocation();\n            const prevControl = previousTarget.absoluteControlPoints[1];\n            const pts = new Point(2 * prevLoc.x - prevControl.x, 2 * prevLoc.y - prevControl.y);\n            this.absoluteControlPoints.push(\n                new SvgControlPoint(pts, [prevLoc], false)\n            );\n        } else {\n            const current = previousTarget ? previousTarget.targetLocation() : new Point(0, 0);\n            const pts = new Point(current.x, current.y);\n            this.absoluteControlPoints.push(\n                new SvgControlPoint(pts, [], false)\n            );\n        }\n        this.absoluteControlPoints.push(\n            new SvgControlPoint(this.absolutePoints[0], [this.targetLocation()]),\n        );\n    }\n    public override asStandaloneString(): string {\n        return [\n            'M',\n            this.previousPoint.x,\n            this.previousPoint.y,\n            'C',\n            this.absoluteControlPoints[0].x,\n            this.absoluteControlPoints[0].y,\n            this.absoluteControlPoints[1].x,\n            this.absoluteControlPoints[1].y,\n            this.absolutePoints[1].x,\n            this.absolutePoints[1].y\n        ].join(' ');\n    }\n    public override resetControlPoints(previousTarget: SvgItem) {\n        const a = previousTarget.targetLocation();\n        const b = this.targetLocation();\n        const d = this.relative ? a : new Point(0, 0);\n        this.values[0] = a.x / 3 + 2 * b.x / 3 - d.x;\n        this.values[1] = a.y / 3 + 2 * b.y / 3 - d.y;\n    }\n    public override setControlLocation(idx: number, pts: Point) {\n        const loc = this.absoluteControlPoints[1];\n        const dx = pts.x - loc.x;\n        const dy = pts.y - loc.y;\n        this.values[0] += dx;\n        this.values[1] += dy;\n    }\n}\nclass QuadraticBezierCurveTo extends SvgItem {\n    static readonly key = 'Q';\n    protected override refreshAbsoluteControlPoints(origin: Point, previousTarget: SvgItem | null) {\n        if(!previousTarget) {\n            throw 'Invalid path';\n        }\n        this.absoluteControlPoints = [\n            new SvgControlPoint(this.absolutePoints[0], [previousTarget.targetLocation(), this.targetLocation()])\n        ];\n    }\n    public override resetControlPoints(previousTarget: SvgItem) {\n        const a = previousTarget.targetLocation();\n        const b = this.targetLocation();\n        const d = this.relative ? a : new Point(0, 0);\n        this.values[0] = a.x / 2 + b.x / 2 - d.x;\n        this.values[1] = a.y / 2 + b.y / 2 - d.y;\n    }\n}\nclass SmoothQuadraticBezierCurveTo extends SvgItem {\n    static readonly key = 'T';\n    protected override refreshAbsoluteControlPoints(origin: Point, previousTarget: SvgItem | null) {\n        if (!(previousTarget instanceof QuadraticBezierCurveTo || previousTarget instanceof SmoothQuadraticBezierCurveTo)) {\n            const previous = previousTarget ? previousTarget.targetLocation() : new Point(0, 0);\n            const pts = new Point(previous.x, previous.y);\n            this.absoluteControlPoints = [\n                new SvgControlPoint(pts, [], false)\n            ];\n        } else {\n            const prevLoc = previousTarget.targetLocation();\n            const prevControl = previousTarget.absoluteControlPoints[0];\n            const pts = new Point(2 * prevLoc.x - prevControl.x, 2 * prevLoc.y - prevControl.y);\n            this.absoluteControlPoints = [\n                new SvgControlPoint(pts, [prevLoc, this.targetLocation()], false)\n            ];\n        }\n    }\n    public override asStandaloneString(): string {\n        return [\n            'M',\n            this.previousPoint.x,\n            this.previousPoint.y,\n            'Q',\n            this.absoluteControlPoints[0].x,\n            this.absoluteControlPoints[0].y,\n            this.absolutePoints[0].x,\n            this.absolutePoints[0].y\n        ].join(' ');\n    }\n}\n\nclass ClosePath extends SvgItem {\n    static readonly key = 'Z';\n    protected override refreshAbsolutePoints(origin: Point, previous: SvgItem | null) {\n        this.previousPoint = previous ? previous.targetLocation() : new Point(0, 0);\n        this.absolutePoints = [new SvgPoint(origin.x, origin.y, false)];\n    }\n\n}\nclass HorizontalLineTo extends SvgItem {\n    static readonly key = 'H';\n    public override rotate(ox:number, oy: number, angle: number, force = false) {\n        if (angle == 180) {\n            this.values[0] = -this.values[0];\n        }\n    }\n    protected override refreshAbsolutePoints(origin: Point, previous: SvgItem | null) {\n        this.previousPoint = previous ? previous.targetLocation() : new Point(0, 0);\n        if (this.relative) {\n            this.absolutePoints = [new SvgPoint(this.values[0] + this.previousPoint.x, this.previousPoint.y)];\n        } else {\n            this.absolutePoints = [new SvgPoint(this.values[0], this.previousPoint.y)];\n        }\n    }\n    public override setTargetLocation(pts: Point) {\n        const loc = this.targetLocation();\n        const dx = pts.x - loc.x;\n        this.values[0] += dx;\n    }\n}\nclass VerticalLineTo extends SvgItem {\n    static readonly key = 'V';\n    public override rotate(ox:number, oy: number, angle: number, force = false) {\n        if (angle == 180) {\n            this.values[0] = -this.values[0];\n        }\n    }\n    public override translate(x: number, y: number, force = false) {\n        if (!this.relative) {\n            this.values[0] += y;\n        }\n    }\n    public override scale(kx: number, ky: number) {\n        this.values[0] *= ky;\n    }\n    protected override refreshAbsolutePoints(origin: Point, previous: SvgItem | null) {\n        this.previousPoint = previous ? previous.targetLocation() : new Point(0, 0);\n        if (this.relative) {\n            this.absolutePoints = [new SvgPoint(this.previousPoint.x, this.values[0] + this.previousPoint.y)];\n        } else {\n            this.absolutePoints = [new SvgPoint(this.previousPoint.x, this.values[0])];\n        }\n    }\n    public override setTargetLocation(pts: Point) {\n        const loc = this.targetLocation();\n        const dy = pts.y - loc.y;\n        this.values[0] += dy;\n    }\n}\nclass EllipticalArcTo extends SvgItem {\n    static readonly key = 'A';\n    public override translate(x: number, y: number, force = false) {\n        if (!this.relative) {\n            this.values[5] += x;\n            this.values[6] += y;\n        }\n    }\n    public override rotate(ox: number, oy: number, degrees: number, force = false) {\n        this.values[2] = (this.values[2] + degrees) % 360;\n        const rad = degrees * Math.PI / 180;\n        const cos = Math.cos(rad);\n        const sin = Math.sin(rad);\n        const px = this.values[5];\n        const py = this.values[6];\n        const x = this.relative && !force ? 0 : ox;\n        const y = this.relative && !force ? 0 : oy;\n        const qx = (px - x) * cos - (py - y) * sin + x;\n        const qy = (px - x) * sin + (py - y) * cos + y;\n        this.values[5] = qx;\n        this.values[6] = qy;\n    }\n    public override scale(kx: number, ky: number) {\n        const a = this.values[0];\n        const b = this.values[1];\n        const angle = Math.PI * this.values[2] / 180.0;\n        const cos = Math.cos(angle);\n        const sin = Math.sin(angle);\n        const A = b * b * ky * ky * cos * cos + a * a * ky * ky * sin * sin;\n        const B = 2 * kx * ky * cos * sin * (b * b  - a * a );\n        const C = a * a * kx * kx * cos * cos + b * b * kx * kx * sin * sin;\n        const F = -(a * a * b * b * kx * kx * ky * ky);\n        const det = B * B - 4 * A * C;\n        const val1 = Math.sqrt((A - C) * (A - C) + B * B);\n\n        // New rotation:\n        this.values[2] = B !== 0 ? Math.atan((C - A - val1) / B) * 180 / Math.PI : (A < C ? 0 : 90);\n\n        // New radius-x, radius-y\n        if(det !== 0) {\n            this.values[0] = -Math.sqrt(2 * det * F * ((A + C) + val1)) / det;\n            this.values[1] = -Math.sqrt(2 * det * F * ((A + C) - val1)) / det;\n        }\n\n        // New target\n        this.values[5] *= kx;\n        this.values[6] *= ky;\n\n        // New sweep flag\n        this.values[4] = kx * ky >= 0 ? this.values[4] : 1 - this.values[4];\n    }\n    protected override refreshAbsolutePoints(origin: Point, previous: SvgItem | null) {\n        this.previousPoint = previous ? previous.targetLocation() : new Point(0, 0);\n        if (this.relative) {\n            this.absolutePoints = [new SvgPoint(this.values[5] + this.previousPoint.x, this.values[6] + this.previousPoint.y)];\n        } else {\n            this.absolutePoints = [new SvgPoint(this.values[5], this.values[6])];\n        }\n    }\n\n    public override asString(decimals = 4, minify = false, trailingItems: SvgItem[] = []): string {\n        if (!minify) {\n            return super.asString(decimals, minify, trailingItems);\n        } else {\n            const strValues = [this.values, ...trailingItems.map(it => it.values)]\n                .map(it => it.map(it2 => formatNumber(it2, decimals, minify)))\n                .map(v => `${v[0]} ${v[1]} ${v[2]} ${v[3]}${v[4]}${v[5]} ${v[6]}`);\n            return [this.getType(), ...strValues].join(' ');\n        }\n    }\n}\n\n\nexport class SvgPath {\n    path: SvgItem[];\n\n    constructor(path: string) {\n        const rawPath = PathParser.parse(path);\n        this.path = rawPath.map( it => SvgItem.Make(it) );\n        this.refreshAbsolutePositions();\n    }\n\n    translate(dx: number, dy: number): SvgPath {\n        this.path.forEach( (it, idx) => {\n            it.translate(dx, dy, idx === 0);\n        });\n        this.refreshAbsolutePositions();\n        return this;\n    }\n\n    scale(kx: number, ky: number): SvgPath {\n        this.path.forEach( (it) => {\n            it.scale(kx, ky);\n        });\n        this.refreshAbsolutePositions();\n        return this;\n    }\n\n    rotate(ox: number, oy: number, degrees: number): SvgPath {\n        degrees %= 360;\n        if (degrees == 0) {\n            return this;\n        }\n\n        this.path.forEach( (it, idx) => {\n            const lastInstanceOf = it.constructor;\n            if (degrees !== 180) {\n                if (it instanceof HorizontalLineTo || it instanceof VerticalLineTo) {\n                    const newType = it.relative ? LineTo.key.toLowerCase() : LineTo.key;\n                    it = this.changeType(it, newType) || it;\n                }\n            }\n\n            it.rotate(ox, oy, degrees, idx === 0);\n\n            if (degrees === 90 || degrees === 270) {\n                if (lastInstanceOf === HorizontalLineTo) {\n                    this.refreshAbsolutePositions();\n\n                    const newType = it.relative ? VerticalLineTo.key.toLowerCase() : VerticalLineTo.key;\n                    this.changeType(it, newType);\n                } else if (lastInstanceOf === VerticalLineTo) {\n                    this.refreshAbsolutePositions();\n\n                    const newType = it.relative ? HorizontalLineTo.key.toLowerCase() : HorizontalLineTo.key;\n                    this.changeType(it, newType);\n                }\n            }\n        });\n        this.refreshAbsolutePositions();\n        return this;\n    }\n\n    setRelative(newRelative: boolean) {\n        this.path.forEach( (it) => {\n            it.setRelative(newRelative);\n        });\n        this.refreshAbsolutePositions();\n        return this;\n    }\n\n    delete(item: SvgItem) {\n        const idx = this.path.indexOf(item);\n        if (idx !== -1) {\n            this.path.splice(idx, 1);\n            this.refreshAbsolutePositions();\n        }\n        return this;\n    }\n\n    insert(item: SvgItem, after?: SvgItem) {\n        const idx = after ? this.path.indexOf(after) : -1;\n        if (idx !== -1) {\n            this.path.splice(idx + 1, 0, item);\n        } else {\n            this.path.push(item);\n        }\n        this.refreshAbsolutePositions();\n    }\n\n    changeType(item: SvgItem, newType: string): SvgItem | null {\n        const idx = this.path.indexOf(item);\n        if (idx > 0) {\n            const previous = this.path[idx - 1];\n            this.path[idx] = SvgItem.MakeFrom(item, previous, newType);\n            this.refreshAbsolutePositions();\n            return this.path[idx];\n        }\n        return null;\n    }\n\n    asString(decimals = 4, minify = false): string {\n        return this.path\n        .reduce((acc: {type?: string, item: SvgItem, trailing: SvgItem[]}[], it: SvgItem) => {\n            // Group together the items that can be merged (M 0 0 L 1 1 => M 0 0 1 1)\n            const type = it.getType();\n            if (minify && acc.length > 0) {\n                const last = acc[acc.length - 1];\n                if (last.type === type) {\n                    last.trailing.push(it);\n                    return acc;\n                }\n            }\n            acc.push({\n                type: type === 'm' ? 'l' : (type === 'M' ? 'L' : type),\n                item: it,\n                trailing: []\n            });\n            return acc;\n        }, [])\n        .map(it => {\n            const str = it.item.asString(decimals, minify, it.trailing);\n            if (minify) {\n                return str\n                    .replace(/^([a-z]) /i, '$1')\n                    .replace(/ -/g, '-')\n                    .replace(/(\\.[0-9]+) (?=\\.)/g, '$1');\n            } else {\n                return str;\n            }\n        }).join(minify ? '' : ' ');\n    }\n\n    targetLocations(): SvgPoint[] {\n        return this.path.map((it) => it.targetLocation() );\n    }\n\n    controlLocations(): SvgControlPoint[] {\n        let result: SvgControlPoint[] = [];\n        for (let i = 1 ; i < this.path.length ; ++i) {\n            const controls = this.path[i].controlLocations();\n            controls.forEach((it, idx) => {\n                it.subIndex = idx;\n            });\n            result = [...result, ...controls];\n        }\n        return result;\n    }\n\n\n    setLocation(ptReference: SvgPoint, to: Point) {\n        if (ptReference instanceof SvgControlPoint) {\n            ptReference.itemReference.setControlLocation(ptReference.subIndex, to);\n        } else {\n            ptReference.itemReference.setTargetLocation(to);\n        }\n        this.refreshAbsolutePositions();\n    }\n\n\n    refreshAbsolutePositions() {\n        let previous: SvgItem | null = null;\n        let origin = new Point(0, 0);\n        for (const item of this.path) {\n            item.refresh(origin, previous);\n\n            if (item instanceof MoveTo || item instanceof ClosePath) {\n                origin = item.targetLocation();\n            }\n            previous = item;\n        }\n    }\n}\n","import { SvgPath } from \"./svg\";\n\nconst findPreviousMoveTo = (svg: SvgPath, index: number) => {\n  let i = index;\n  while (i > 0 && svg.path[i].getType(true) !== 'M') {\n    i--;\n  }\n  return i;\n};\nconst findNextMoveTo = (svg: SvgPath, index: number) => {\n  let i = index + 1;\n  while (i < svg.path.length && svg.path[i].getType(true) !== 'M') {\n    i++;\n  }\n  return i;\n};\nexport const getSubPathBounds = (svg: SvgPath, index?: number) => {\n  const start = index === undefined ? 0 : findPreviousMoveTo(svg, index);\n  const end = index === undefined ? svg.path.length : findNextMoveTo(svg, index);\n  return { start, end };\n};\n","import { Point, SvgPath, SvgItem } from \"./svg\";\nimport { optimizePath } from \"./optimize-path\";\nimport { getSubPathBounds } from \"./get-sub-path-bounds\";\n\nconst toStr = (pt: Point): [string, string] => {\n  return [String(pt.x), String(pt.y)];\n};\n\n\nexport const reversePath = (svg: SvgPath, subpathOfItem?: number)=> {\n  const {start, end} = getSubPathBounds(svg, subpathOfItem);\n\n  if((end - start) <= 1) {\n    return;\n  }\n\n  const isBeforeRelative = end < svg.path.length && svg.path[end].relative;\n  if(isBeforeRelative) {\n    svg.path[end].setRelative(false);\n  }\n\n  const subPath = svg.path.slice(start, end);\n  const outputPath: SvgItem[] = [];\n  const reversedPath = [...subPath].reverse().slice(0, -1);\n\n  const startPoint = reversedPath[0].targetLocation();\n  outputPath.push(SvgItem.Make(['M', ...toStr(startPoint)]));\n  let previousType = '';\n  let isClosed = false;\n\n  for(const component of reversedPath) {\n    const pt = toStr(component.previousPoint);\n    const ctrl = component.absolutePoints.map(toStr);\n    const type = component.getType(true);\n    switch(type) {\n      case 'M' :\n      case 'Z' :\n        if(isClosed) {\n          outputPath.push(SvgItem.Make(['Z']));\n        }\n        isClosed = type === 'Z';\n        if(outputPath[outputPath.length - 1].getType(true) === 'M') {\n          outputPath[outputPath.length - 1] = SvgItem.Make(['M',  ...pt]);\n        } else {\n          outputPath.push(SvgItem.Make(['M',  ...pt]));\n        }\n        break;\n      case 'L' :\n        outputPath.push(SvgItem.Make(['L', ...pt]));\n        break;\n      case 'H' :\n        outputPath.push(SvgItem.Make(['H', pt[0]]));\n        break;\n      case 'V' :\n        outputPath.push(SvgItem.Make(['V', pt[1]]));\n        break;\n      case 'C' :\n        outputPath.push(SvgItem.Make(['C', ...ctrl[1], ...ctrl[0], ...pt]));\n        break;\n      case 'S' : {\n        const a = toStr(component.controlLocations()[0]);\n        if(previousType !== 'S') {\n          outputPath.push(SvgItem.Make(['C', ...ctrl[0], ...a, ...pt])); \n        } else {\n          outputPath.push(SvgItem.Make(['S', ...a, ...pt]));\n        }\n        break;\n      }\n      case 'Q' :\n        outputPath.push(SvgItem.Make(['Q', ...ctrl[0], ...pt]));\n        break;\n      case 'T' : {\n        if(previousType !== 'T') {\n          const a = toStr(component.controlLocations()[0]);\n          outputPath.push(SvgItem.Make(['Q', ...a, ...pt]));\n        } else {\n          outputPath.push(SvgItem.Make(['T', ...pt]));\n        }\n        break;\n      }\n      case 'A' :\n        outputPath.push(SvgItem.Make(['A', ...(component.values.slice(0, 4).map(String)), String(1-component.values[4]) , ...pt]));\n        break;\n    }\n    previousType = type;\n  }\n  if(isClosed) {\n    outputPath.push(SvgItem.Make(['Z']));\n  }\n  svg.path = [\n    ...svg.path.slice(0, start),\n    ...outputPath,\n    ...svg.path.slice(end),\n  ];\n  svg.refreshAbsolutePositions();\n  if(isBeforeRelative) {\n    svg.path[start + outputPath.length].setRelative(true);\n  }\n\n  optimizePath(svg, {\n    removeUselessCommands: true,\n    useShorthands: true\n  });\n};","import { Point, SvgPath, SvgItem } from \"./svg\";\nimport { reversePath } from \"./reverse-path\";\n\nconst toStr = (pt: Point) => {\n  return [String(pt.x), String(pt.y)];\n};\n\nconst optimizeRelativeAbsolute = (svg: SvgPath) => {\n  let length = svg.asString(4, true).length;\n  const o = new Point(0,0);\n  for(let i=0 ; i<svg.path.length; ++i) {\n    const previous = i>0 ? svg.path[i-1] : null;\n    const comp = svg.path[i];\n    if(comp.getType(true) === 'Z') {\n      continue;\n    }\n    comp.setRelative(!comp.relative);\n    const newLength = svg.asString(4, true).length;\n    if(newLength < length) {\n      length = newLength;\n      comp.refresh(o, previous);\n    } else {\n      comp.setRelative(!comp.relative);\n    }\n  }\n}\n\nexport const optimizePath = (svg: SvgPath, {\n  removeUselessCommands = false,\n  removeOrphanDots = false,\n  useShorthands = false,\n  useHorizontalAndVerticalLines = false,\n  useRelativeAbsolute = false,\n  useReverse = false,\n  useClosePath = false,\n}: {\n  removeUselessCommands?: boolean;\n  removeOrphanDots? : boolean; // Can have an impact on stroked paths\n  useShorthands?: boolean;\n  useHorizontalAndVerticalLines?: boolean;\n  useRelativeAbsolute?: boolean;\n  useReverse?: boolean;\n  useClosePath?: boolean;\n}) => {\n  const path = svg.path;\n  const o = new Point(0,0);\n  let initialPt = new Point(0,0);\n  for(let i=1 ; i<path.length ; ++i) {\n\n    const c0 = path[i-1];\n    const c1 = path[i];\n    const c0type = c0.getType(true);\n    const c1type = c1.getType(true);\n\n    if(c0type === 'M') {\n      initialPt = c0.targetLocation();\n    }\n\n    if(removeUselessCommands) {\n      if(c0type === 'M' && c1type === 'M') {\n        c1.setRelative(false);\n        path.splice(i-1, 1);\n        i--;\n        continue;\n      }\n      if( c0type === 'Z' && c1type === 'Z') {\n        path.splice(i, 1);\n        i--;\n        continue;\n      }\n      if(c0type === 'Z' && c1type === 'M') {\n        const tg = c0.targetLocation();\n        if(tg.x === c1.absolutePoints[0].x && tg.y === c1.absolutePoints[0].y) {\n          path.splice(i, 1);\n          i--;\n          continue;\n        }\n      }\n      if(c1type === 'L' || c1type === 'V' || c1type === 'H') {\n        const tg = c1.targetLocation();\n        if(tg.x === c1.previousPoint.x && tg.y === c1.previousPoint.y) {\n          path.splice(i, 1);\n          i--;\n          continue;\n        }\n      }\n    }\n    if(removeOrphanDots) {\n      if( c0type === 'M' && c1type === 'Z') {\n        path.splice(i, 1);\n        i--;\n        continue;\n      }\n    }\n    if(useHorizontalAndVerticalLines) {\n      if(c1type === 'L') {\n        const tg = c1.targetLocation();\n        if(tg.x === c1.previousPoint.x) {\n          path[i] = SvgItem.MakeFrom(c1, c0, 'V');\n          continue;\n        }\n        if(tg.y === c1.previousPoint.y) {\n          path[i] = SvgItem.MakeFrom(c1, c0, 'H');\n          continue;\n        }\n      }\n    }\n    if(useShorthands) {\n      if((c0type === 'Q' || c0type === 'T') && c1type === 'Q') {\n        const pt = toStr(path[i].targetLocation());\n        const candidate = SvgItem.Make(['T', ...pt]);\n        candidate.refresh(o, c0);\n        const ctrl = candidate.controlLocations();\n        if(ctrl[0].x === c1.absolutePoints[0].x && ctrl[0].y === c1.absolutePoints[0].y) {\n          path[i] = candidate;\n        }\n      }\n      if((c0type === 'C' || c0type === 'S') && c1type === 'C') {\n        const pt = toStr(path[i].targetLocation());\n        const ctrl = toStr(path[i].absolutePoints[1]);\n        const candidate = SvgItem.Make(['S', ...ctrl, ...pt]);\n        candidate.refresh(o, c0);\n        const ctrl2 = candidate.controlLocations();\n        if(ctrl2[0].x === c1.absolutePoints[0].x && ctrl2[0].y === c1.absolutePoints[0].y) {\n          path[i] = candidate;\n        }\n      }\n      if((c0type !== 'C' && c0type !== 'S') && c1type === 'C') {\n        if(c1.previousPoint.x === c1.absolutePoints[0].x && c1.previousPoint.y === c1.absolutePoints[0].y) {\n          const pt = toStr(c1.targetLocation());\n          const ctrl = toStr(c1.absolutePoints[1]);\n          path[i] = SvgItem.Make(['S', ...ctrl, ...pt]);\n          path[i].refresh(o, c0);\n        }\n      }\n\n    }\n    if(useClosePath) {\n      if(c1type === 'L' || c1type === 'H' || c1type === 'V') {\n        const target = c1.targetLocation();\n        if(initialPt.x === target.x && initialPt.y === target.y) {\n          path[i] = SvgItem.Make(['Z']);\n          path[i].refresh(initialPt, c0);\n        }\n      }\n    }\n  }\n\n  if(removeUselessCommands || removeOrphanDots) {\n    if(path.length>0 && path[path.length - 1].getType(true) === 'M') {\n      path.splice(path.length - 1, 1);\n    }\n\n    // With removeUselessCommands, links to previous items may become dirty:\n    svg.refreshAbsolutePositions();\n  }\n\n  if(useRelativeAbsolute) {\n    optimizeRelativeAbsolute(svg);\n  }\n\n  if(useReverse) {\n    const length = svg.asString(4, true).length;\n    const nonReversed = svg.path;\n    reversePath(svg);\n    if(useRelativeAbsolute) {\n      optimizeRelativeAbsolute(svg);\n    }\n    const afterLength = svg.asString(4, true).length;\n    if(afterLength >= length) {\n      svg.path = nonReversed;\n    }\n  }\n}","import { SvgPath, SvgItem } from \"./svg\";\nimport { optimizePath } from \"./optimize-path\";\nimport { getSubPathBounds } from \"./get-sub-path-bounds\";\n\nexport const changePathOrigin = (svg: SvgPath, newOriginIndex: number, subpath?: boolean)=> {\n  if(svg.path.length <= newOriginIndex || newOriginIndex === 0) {\n    return;\n  }\n\n  const {start, end} = getSubPathBounds(svg, subpath ? newOriginIndex : undefined);\n  const l = end - start;\n\n  const isBeforeRelative = end < svg.path.length && svg.path[end].relative;\n  if(isBeforeRelative) {\n    svg.path[end].setRelative(false);\n  }\n  \n  const newFirstItem = svg.path[newOriginIndex];\n  const newLastItem = svg.path[newOriginIndex - 1];\n  switch(newFirstItem.getType().toUpperCase()) {\n    // Shorthands must be converted to be used as origin\n    case 'S': svg.changeType(newFirstItem, newFirstItem.relative ? 'c' : 'C'); break;\n    case 'T': svg.changeType(newFirstItem, newFirstItem.relative ? 'q' : 'Q'); break;\n  }\n  for(let i=newOriginIndex ; i<end ; ++i) {\n    // Z that comes after new origin must be converted to L, up to the first M\n    const item = svg.path[i]; \n    const type = item.getType().toUpperCase();\n    if(type === 'Z') {\n      svg.changeType(item, 'L');\n    }\n    if(type === 'M') {\n      break;\n    }\n  }\n\n  const outputPath: SvgItem[] = [];\n  const subPath = svg.path.slice(start, end);\n  const firstItem = subPath[0];\n  const lastItem = subPath[l-1];\n\n  for(let i=0 ; i<l ; ++i) {\n    if(i===0) {\n      const newOrigin = newLastItem.targetLocation();\n      outputPath.push(SvgItem.Make(['M', String(newOrigin.x), String(newOrigin.y)]));\n    }\n    if(newOriginIndex+i===start + l) {\n      // We may be able to remove the initial M if last item has the same target\n      const tg1 = firstItem.targetLocation();\n      const tg2 = lastItem.targetLocation();\n      if(tg1.x === tg2.x && tg1.y === tg2.y) {\n        const followingM = subPath.findIndex((i, idx) => idx > 0 && i.getType().toUpperCase() === 'M');\n        const firstZ = subPath.findIndex(i => i.getType().toUpperCase() === 'Z');\n        if(firstZ === -1 || (followingM !== -1 && firstZ > followingM)) {\n          // We can remove inital M if there is no Z in the following subpath\n          continue;\n        }\n      }\n    }\n    outputPath.push(subPath[(newOriginIndex - start + i)%l]);\n\n  }\n\n  svg.path = [\n    ...svg.path.slice(0, start),\n    ...outputPath,\n    ...svg.path.slice(end),\n  ];\n  svg.refreshAbsolutePositions();\n  if(isBeforeRelative) {\n    svg.path[start + outputPath.length].setRelative(true);\n  }\n  optimizePath(svg, {\n    removeUselessCommands: true,\n    useShorthands: true,\n    useClosePath: true,\n  });\n};"],"mappings":"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"}