#svg #svg-parser #vector-graphics #parser-generator #interpret #pest-parser #content

bin+lib svg_file_parser

基于 Rust 的 SVG 解析器,用于解析可缩放矢量图形(SVG)文件

1 个不稳定版本

0.1.0 2023 年 11 月 20 日

#718 in 图像

MIT 许可证

20KB
276

SVG 文件解析器

简要描述

  • 基于 Rust 的 SVG 解析器,旨在解析可缩放矢量图形(SVG)文件。
  • 能够提取结构信息,如 SVG 元素、属性和文本内容。
  • 使用 Pest 解析器生成器解析 SVG 语法。
  • 输出 SVG 内容的结构表示,包括元素、属性和文本。
  • 适用于处理 SVG 文件的 Rust 开发者,为进一步操作或分析 SVG 数据提供基础。

命令行界面

  • 帮助

显示帮助信息

cargo run -- help
  • 解析

解析 SVG 文件并输出文件内容。

cargo run -- parse -i input.svg -o src/output.txt

如果您未指定输出文件,文件内容将被写入您的命令行界面。

cargo run -- parse -i input.svg

语法

svg_file = { svg_open ~ svg_content ~ svg_close }
svg_open = { "<svg" ~ attribute* ~ ">" ~ NEWLINE }
svg_content = { ((element | text_content ) ~ NEWLINE)* }
svg_close = { "</svg>" }

element = { circle | rect | line | ellipse }

circle = { "<circle" ~ attribute+ ~ "/>" }
rect = { "<rect" ~ attribute+ ~ "/>" }
line = { "<line" ~ attribute+ ~ "/>" }
ellipse = { "<ellipse" ~ attribute+ ~ "/>" }

attribute = { attribute_name ~ "=" ~ "\"" ~ attribute_value ~ "\"" }
attribute_name = { ASCII_ALPHA ~ ASCII_ALPHANUMERIC* }
attribute_value = { ASCII_ALPHANUMERIC* }
text_content = { (PUNCTUATION | ASCII_ALPHANUMERIC)+ ~ (PUNCTUATION | ASCII_ALPHANUMERIC)*}
WHITESPACE = _{ " " }
  • svg_file: 代表完整的 SVG 文件,由一个开标签(svg_open)、内容(svg_content)和一个闭标签(svg_close)组成。
  • svg_open: 定义 SVG 元素的开标签,允许有属性并以换行符结尾。
  • svg_content: 描述 SVG 文件的内容,可以是 SVG 元素(element)或文本内容(text_content)的序列。每行以换行符结尾。
  • svg_close: 指定 SVG 元素的闭标签。
  • element: 代表不同的 SVG 元素,包括圆形、矩形、直线和椭圆。
  • circle, rect, line, ellipse: 使用各自的属性定义特定的 SVG 元素,包含在开标签和闭标签中。
  • attribute: 代表 SVG 元素内的键值对,具有名称(attribute_name)和值(attribute_value)。
  • attribute_name: 指定属性的名称,以字母字符开头,后跟字母数字字符。
  • attribute_value: 代表属性的值,由字母数字字符组成。
  • text_content: 描述 SVG 文件内的文本内容,允许混合标点和字母数字字符。
  • WHITESPACE: 代表可选的空白。

示例

<svg>
    <circle cx="10" cy="10" r="5" />
    <rect x="20" y="20" width="10" height="10" />
    Some text content
</svg>
Result:
[
Svg(
        [],
    ),
    Circle(
        [
            (
                "cx",
                "10",
            ),
            (
                "cy",
                "10",
            ),
            (
                "r",
                "5",
            ),
        ],
    ),
    Rect(
        [
            (
                "x",
                "20",
            ),
            (
                "y",
                "20",
            ),
            (
                "width",
                "10",
            ),
            (
                "height",
                "10",
            ),
        ],
    ),
    Text(
        "Some text content",
    ),
]

依赖项

~4MB
~78K SLoC