UNPKG

@amandaghassaei/flat-svg

Version:

A TypeScript library for converting nested SVGs into a flat list of elements, paths, or segments and applying style-based filters.

276 lines (239 loc) 6.73 kB
import { SVG_STYLE_FILL, SVG_STYLE_OPACITY, SVG_STYLE_STROKE_COLOR, SVG_STYLE_STROKE_WIDTH, LINE, RECT, POLYLINE, POLYGON, CIRCLE, ELLIPSE, PATH, SVG_STYLE_COLOR, SVG_STYLE_STROKE_DASH_ARRAY, } from './constants'; import { TextNode } from 'svg-parser'; import { Colord } from 'colord'; export interface Transform { a: number, b: number, c: number, d: number, e: number, f: number, } /** * @private */ export interface TransformParsed extends Transform { errors?: string[], warnings?: string[], } export interface Style { [SVG_STYLE_STROKE_WIDTH]?: number, [SVG_STYLE_STROKE_COLOR]?: string, [SVG_STYLE_FILL]?: string, [SVG_STYLE_OPACITY]?: number, [SVG_STYLE_COLOR]?: string, [SVG_STYLE_STROKE_DASH_ARRAY]?: number | string; } /** * @private */ export interface ComputedProperties { [SVG_STYLE_STROKE_COLOR]?: Colord, [SVG_STYLE_FILL]?: Colord, [SVG_STYLE_COLOR]?: Colord, [SVG_STYLE_STROKE_DASH_ARRAY]?: number[]; } export interface BaseProperties extends Style { id?: string, class?: string, ids?: string, } export interface LineProperties extends BaseProperties { x1: number, y1: number, x2: number, y2: number, } export interface RectProperties extends BaseProperties { x: number, y: number, width: number, height: number, } export interface PolylineProperties extends BaseProperties { points: string, } export interface PolygonProperties extends BaseProperties { points: string, } export interface CircleProperties extends BaseProperties { r: number, cx: number, cy: number, } export interface EllipseProperties extends BaseProperties { rx: number, ry: number, cx: number, cy: number, } export interface PathProperties extends BaseProperties { d: string, } /** * @private */ export type GeometryElementTagName = typeof LINE | typeof RECT | typeof POLYLINE | typeof POLYGON | typeof CIRCLE | typeof ELLIPSE | typeof PATH; /** * @private */ export type GeometryElementProperties = LineProperties | RectProperties | PolylineProperties | PolygonProperties | CircleProperties | EllipseProperties | PathProperties; export interface SegmentProperties extends BaseProperties { } export interface Properties extends Style { viewBox?: string, id?: string, class?: string, x1?: number, y1?: number, x2?: number, y2?: number, x?: string, y?: string, width?: string, height?: string, points?: string, d?: string, cx?: number, cy?: number, rx?: number, ry?: number, r?: number, transform?: string, } // Redefine ElementNode type, excluding children of type string. export type ElementNode = { type: 'element'; tagName?: string | undefined; properties?: Properties; children: Array<Node>; value?: string | undefined; metadata?: string | undefined; } export type Node = TextNode | ElementNode; export interface FlatElementBase { transform?: Transform, } export interface FlatLineElement extends FlatElementBase { tagName: typeof LINE, properties: LineProperties, } export interface FlatRectElement extends FlatElementBase { tagName: typeof RECT, properties: RectProperties, } export interface FlatPolylineElement extends FlatElementBase { tagName: typeof POLYLINE, properties: PolylineProperties, } export interface FlatPolygonElement extends FlatElementBase { tagName: typeof POLYGON, properties: PolygonProperties, } export interface FlatCircleElement extends FlatElementBase { tagName: typeof CIRCLE, properties: CircleProperties, } export interface FlatEllipseElement extends FlatElementBase { tagName: typeof ELLIPSE, properties: EllipseProperties, } export interface FlatPathElement extends FlatElementBase { tagName: typeof PATH, properties: PathProperties, } export type FlatElement = FlatLineElement | FlatRectElement | FlatPolylineElement | FlatPolygonElement | FlatCircleElement | FlatEllipseElement | FlatPathElement; export type FlatPath = { properties: PathProperties; } export type FlatLineSegment = { p1: [number, number], p2: [number, number], properties: SegmentProperties; } export type FlatBezierSegment = { p1: [number, number], p2: [number, number], controlPoints: [number, number][], properties: SegmentProperties; } export type FlatArcSegment = { p1: [number, number], p2: [number, number], rx: number, ry: number, xAxisRotation: number, largeArcFlag: boolean, sweepFlag: boolean, properties: SegmentProperties; } export type FlatSegment = FlatLineSegment | FlatBezierSegment | FlatArcSegment; export type PropertiesFilter = { key: string; value: string | number | number[] | Colord; tolerance?: number; }; type MoveToAbs = ["M", number, number]; type LineToAbs = ["L", number, number]; type HorizontalLineToAbs = ["H", number]; type VerticalLineToAbs = ["V", number]; type CurveToAbs = ["C", number, number, number, number, number, number]; type SmoothCurveToAbs = ["S", number, number, number, number]; type QuadraticBézierCurveToAbs = ["Q", number, number, number, number]; type SmoothQuadraticBézierCurveToAbs = ["T", number, number]; type EllipticalArcAbs = ["A", number, number, number, number, number, number, number]; type MoveToRel = ["m", number, number]; type LineToRel = ["l", number, number]; type HorizontalLineToRel = ["h", number]; type VerticalLineToRel = ["v", number]; type CurveToRel = ["c", number, number, number, number, number, number]; type SmoothCurveToRel = ["s", number, number, number, number]; type QuadraticBézierCurveToRel = ["q", number, number, number, number]; type SmoothQuadraticBézierCurveToRel = ["t", number, number]; type EllipticalArcRel = ["a", number, number, number, number, number, number, number]; type ClosePath = ["Z" | "z"]; type Segment = MoveToAbs | MoveToRel | LineToAbs | LineToRel | HorizontalLineToAbs | HorizontalLineToRel | VerticalLineToAbs | VerticalLineToRel | CurveToAbs | CurveToRel | SmoothCurveToAbs | SmoothCurveToRel | QuadraticBézierCurveToAbs | QuadraticBézierCurveToRel | SmoothQuadraticBézierCurveToAbs | SmoothQuadraticBézierCurveToRel | EllipticalArcAbs | EllipticalArcRel | ClosePath; /** * @private */ export type PathParser = { (path: string): PathParser; new (path: string): PathParser; from(path: string | PathParser): PathParser; abs(): PathParser; rel(): PathParser; scale(sx: number, sy?: number): PathParser; translate(x: number, y?: number): PathParser; rotate(angle: number, rx?: number, ry?: number): PathParser; skewX(degrees: number): PathParser; skewY(degrees: number): PathParser; matrix(m: number[]): PathParser; transform(str: string): PathParser; unshort(): PathParser; unarc(): PathParser; toString(): string; round(precision: number): PathParser; segments: Segment[]; __stack?: any[]; err?: string; }