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.

278 lines (277 loc) 8.86 kB
import { SVG_STYLE_FILL, SVG_STYLE_FILL_OPACITY, SVG_STYLE_OPACITY, SVG_STYLE_STROKE_COLOR, SVG_STYLE_STROKE_OPACITY, SVG_STYLE_STROKE_WIDTH, LINE, RECT, POLYLINE, POLYGON, CIRCLE, ELLIPSE, PATH, SVG_STYLE_COLOR, SVG_STYLE_STROKE_DASH_ARRAY, FLAT_SVG_STRAY_VERTEX_MOVETO_ONLY, FLAT_SVG_STRAY_VERTEX_POLYLINE_SINGLE_POINT, FLAT_SVG_STRAY_VERTEX_POLYGON_SINGLE_POINT } 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_STROKE_OPACITY]?: number; [SVG_STYLE_FILL]?: string; [SVG_STYLE_FILL_OPACITY]?: number; [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; } 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; }; /** * Source of a stray vertex — which kind of degenerate SVG element produced it. */ export type FlatSVGStrayVertexSource = typeof FLAT_SVG_STRAY_VERTEX_MOVETO_ONLY | typeof FLAT_SVG_STRAY_VERTEX_POLYLINE_SINGLE_POINT | typeof FLAT_SVG_STRAY_VERTEX_POLYGON_SINGLE_POINT; /** * An isolated point in the SVG that produced no geometry because its source * element collapsed to a single point (e.g. circle with r=0, path with only * moveto commands). Position is in viewBox coordinates. */ export interface FlatSVGStrayVertex { position: { x: number; y: number; }; source: FlatSVGStrayVertexSource; } /** * An element that has a clip-path applied (from its own clip-path attribute * or inherited from any ancestor). */ export interface FlatSVGClippedElement { element: FlatElement; clipPathId: string; } /** * Aggregated diagnostic output from FlatSVG.analyze(). * All fields are JSON-serializable — no class instances. */ export interface FlatSVGAnalysis { viewBox: number[]; units: string; counts: { elements: number; paths: number; segments: number; invisible: number; fillOnly: number; clipped: number; zeroLengthSegments: number; strayVertices: number; defs: number; }; strokeColors: { [color: string]: number; }; fillColors: { [color: string]: number; }; invisibleElements: FlatElement[]; fillOnly: FlatElement[]; clipped: FlatSVGClippedElement[]; zeroLengthSegments: FlatSegment[]; strayVertices: FlatSVGStrayVertex[]; errors: string[]; warnings: string[]; } 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; }; export {};