12 releases

0.1.4 Sep 6, 2024
0.1.3 Aug 28, 2024
0.1.1 Jul 1, 2024
0.1.0 Jan 16, 2024
0.0.7 Nov 11, 2023

#306 in Images

MIT license

115KB
2.5K SLoC

svg-path-cst

Crates.io docs.rs Tests License

Concrete Syntax Tree parser for SVG v1.1 paths.

Install

cargo add svg-path-cst

Usage

use svg_path_cst::{
    svg_path_cst,
    SVGPathCSTNode,
    SVGPathSegment,
    SVGPathCommand,
    WSP,
    Sign,
    SyntaxError,
};

let cst: Result<Vec<SVGPathCSTNode>, SyntaxError> = svg_path_cst(b"m0 0 L1,-1");

let expected_cst: Vec<SVGPathCSTNode> = vec![
    SVGPathCSTNode::Segment(SVGPathSegment{
        command: &SVGPathCommand::MovetoLower,
        args: vec![0.0, 0.0],
        start: 0,
        end: 4,
        chained: false,
        chain_start: 0,
        chain_end: 4,
        cst: vec![
            SVGPathCSTNode::Command(&SVGPathCommand::MovetoLower),
            SVGPathCSTNode::Number{
                raw_number: "0".to_string(),
                value: 0.0,
                start: 1,
                end: 2,
            },
            SVGPathCSTNode::Whitespace{
                wsp: &WSP::Space,
                start: 2,
                end: 3,
            },
            SVGPathCSTNode::Number{
                raw_number: "0".to_string(),
                value: 0.0,
                start: 3,
                end: 4,
            },
        ],
    }),
    SVGPathCSTNode::Whitespace{
        wsp: &WSP::Space,
        start: 4,
        end: 5,
    },
    SVGPathCSTNode::Segment(SVGPathSegment{
        command: &SVGPathCommand::LinetoUpper,
        args: vec![1.0, -1.0],
        start: 5,
        end: 10,
        chained: false,
        chain_start: 5,
        chain_end: 10,
        cst: vec![
            SVGPathCSTNode::Command(&SVGPathCommand::LinetoUpper),
            SVGPathCSTNode::Number{
                raw_number: "1".to_string(),
                value: 1.0,
                start: 6,
                end: 7,
            },
            SVGPathCSTNode::Comma{ start: 7 },
            SVGPathCSTNode::Sign{ sign: &Sign::Minus, start: 8 },
            SVGPathCSTNode::Number{
                raw_number: "1".to_string(),
                value: 1.0,
                start: 9,
                end: 10,
            },
        ],
    }),
];

assert_eq!(cst, Ok(expected_cst));

Compatibility

This crate is compatible with SVG v1.1 paths, as defined in the W3C SVG 1.1 and no_std environments.

Features

tracing

Add tracing support. See the tracing example to learn how to use it.

strict

Enable strict mode. The differences between strict and non-strict modes are:

  • With empty input (b""), non-strict mode returns an empty vector, while strict mode returns a SyntaxError::UnexpectedEnding error.
  • With the input b"none", non-strict mode returns a SVGPathCSTNode::None node, while strict mode returns a SyntaxError::ExpectedMovetoCommand error. The "none" input is defined by the SVG specification.
  • With input containing only whitespaces, non-strict mode returns an empty vector, while strict mode returns a SyntaxError::ExpectedMovetoCommand error.

Dependencies

~0.4–1MB
~19K SLoC